aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoff Gustafson <geoff@linux.intel.com>2017-10-13 08:07:15 -0700
committerJimmy Huang <jimmy.huang@linux.intel.com>2017-10-19 13:59:35 -0700
commite6c97523c082b5d1db6a56b3fdcb3b10a81e6a34 (patch)
tree52650f0a4322324582389b6ad10e27888d67e58f
parent5ac6830cefbca30fee3104adbc3baf164e696580 (diff)
[events] Add return value to zjs_pre_emit to allow cancel
Now if you return true from a zjs_pre_emit callback, the event will go forward, but if you return false it will be cancelled. Also, fix all call sites. Signed-off-by: Geoff Gustafson <geoff@linux.intel.com>
-rw-r--r--src/zjs_ble.c3
-rw-r--r--src/zjs_event.c14
-rw-r--r--src/zjs_event.h30
-rw-r--r--src/zjs_net.c6
-rw-r--r--src/zjs_web_sockets.c27
5 files changed, 46 insertions, 34 deletions
diff --git a/src/zjs_ble.c b/src/zjs_ble.c
index 644feb7..b138888 100644
--- a/src/zjs_ble.c
+++ b/src/zjs_ble.c
@@ -509,12 +509,13 @@ static void zjs_ble_blvl_ccc_cfg_changed(const struct bt_gatt_attr *attr,
}
// a zjs_pre_emit callback
-static void string_arg(void *unused, jerry_value_t argv[], u32_t *argc,
+static bool string_arg(void *unused, jerry_value_t argv[], u32_t *argc,
const char *buffer, u32_t bytes)
{
// requires: buffer contains string with bytes chars including null term
argv[0] = jerry_create_string((jerry_char_t *)buffer);
*argc = 1;
+ return true;
}
// INTERRUPT SAFE FUNCTION: No JerryScript VM, allocs, or release prints!
diff --git a/src/zjs_event.c b/src/zjs_event.c
index a35f99e..fb70bae 100644
--- a/src/zjs_event.c
+++ b/src/zjs_event.c
@@ -319,7 +319,11 @@ static void emit_event_callback(void *handle, const void *args) {
jerry_value_t *argp = argv;
u32_t argc = 0;
if (emit->pre) {
- emit->pre(user_handle, argv, &argc, emit->data, emit->length);
+ if (!emit->pre(user_handle, argv, &argc, emit->data, emit->length)) {
+ // event cancelled
+ DBG_PRINT("event cancelled\n");
+ return;
+ }
if (argc > MAX_EVENT_ARGS) {
ERR_PRINT("Must increase MAX_EVENT_ARGS!");
}
@@ -340,16 +344,14 @@ static void emit_event_callback(void *handle, const void *args) {
}
// a zjs_pre_emit callback
-void zjs_copy_arg(void *unused, jerry_value_t argv[], u32_t *argc,
+bool zjs_copy_arg(void *unused, jerry_value_t argv[], u32_t *argc,
const char *buffer, u32_t bytes)
{
// requires: buffer contains one jerry_value_t
- if (bytes != sizeof(jerry_value_t)) {
- // shouldn't get here if used correctly
- DBG_PRINT("Warning: Expected one jerry value");
- }
+ ZJS_ASSERT(bytes == sizeof(jerry_value_t), "invalid data received");
argv[0] = *(jerry_value_t *)buffer;
*argc = 1;
+ return true;
}
// a zjs_post_emit callback
diff --git a/src/zjs_event.h b/src/zjs_event.h
index 3738ec6..2b2c401 100644
--- a/src/zjs_event.h
+++ b/src/zjs_event.h
@@ -18,24 +18,28 @@
/**
* Callback prototype for before an event is emitted
*
- * The callback is responsible for setting up the arguments
- *
- * @param handle Event user handle provided to zjs_make_emitter
- * @param argv Arg array w/ max of four args to be set up
- * @param argc Pointer to arg count to be set (default 0)
- * @param buffer Data provided to zjs_defer_emit_event from which to
- * construct arguments
- * @param length Length of buffer
+ * The callback is responsible for setting up the arguments; if it returns
+ * false, the event will not fire and the post callback will not be called, so
+ * it must clean up after itself.
+ *
+ * @param handle Event user handle provided to zjs_make_emitter
+ * @param argv Arg array w/ max of four args to be set up
+ * @param argc Pointer to arg count to be set (default 0)
+ * @param buffer Data provided to zjs_defer_emit_event from which to
+ * construct arguments
+ * @param length Length of buffer
+ *
+ * @return true to confirm event, false to cancel event
*/
-typedef void (*zjs_pre_emit)(void *handle, jerry_value_t argv[], u32_t *argc,
+typedef bool (*zjs_pre_emit)(void *handle, jerry_value_t argv[], u32_t *argc,
const char *buffer, u32_t length);
/**
* Callback prototype for after an event is emitted
*
- * @param handle Event user handle provided to zjs_make_emitter
- * @param argv Arg array w/ max of four args to be cleaned up
- * @param argc Arg count
+ * @param handle Event user handle provided to zjs_make_emitter
+ * @param argv Arg array w/ max of four args to be cleaned up
+ * @param argc Arg count
*/
typedef void (*zjs_post_emit)(void *handle, jerry_value_t argv[], u32_t argc);
@@ -176,7 +180,7 @@ bool zjs_emit_event_priv(jerry_value_t obj, const char *name,
*
* A zjs_pre_emit callback.
*/
-void zjs_copy_arg(void *unused, jerry_value_t argv[], u32_t *argc,
+bool zjs_copy_arg(void *unused, jerry_value_t argv[], u32_t *argc,
const char *buffer, u32_t bytes);
/**
diff --git a/src/zjs_net.c b/src/zjs_net.c
index 31e43c8..2dd5753 100644
--- a/src/zjs_net.c
+++ b/src/zjs_net.c
@@ -381,7 +381,7 @@ static error_desc_t create_error_desc(u32_t error_id, jerry_value_t this,
}
// a zjs_pre_emit callback
-static void handle_error_arg(void *unused, jerry_value_t argv[], u32_t *argc,
+static bool handle_error_arg(void *unused, jerry_value_t argv[], u32_t *argc,
const char *buffer, u32_t bytes)
{
// requires: buffer contains a u32_t with an error constant
@@ -399,6 +399,7 @@ static void handle_error_arg(void *unused, jerry_value_t argv[], u32_t *argc,
jerry_value_clear_error_flag(&error);
argv[0] = error;
*argc = 1;
+ return true;
}
typedef struct {
@@ -1152,7 +1153,7 @@ static ZJS_DECL_FUNC(net_create_server)
}
// a zjs_pre_emit_callback
-static void connect_callback(void *h, jerry_value_t argv[], u32_t *argc,
+static bool connect_callback(void *h, jerry_value_t argv[], u32_t *argc,
const char *buffer, u32_t bytes)
{
FTRACE("h = %p, buffer = %p, bytes = %d\n", h, buffer, bytes);
@@ -1160,6 +1161,7 @@ static void connect_callback(void *h, jerry_value_t argv[], u32_t *argc,
zjs_obj_add_boolean(handle->socket, "connecting", false);
zjs_add_event_listener(handle->socket, "connect",
handle->connect_listener);
+ return true;
}
static void tcp_connected(struct net_context *context, int status,
diff --git a/src/zjs_web_sockets.c b/src/zjs_web_sockets.c
index 4abed3e..77239c2 100644
--- a/src/zjs_web_sockets.c
+++ b/src/zjs_web_sockets.c
@@ -157,7 +157,7 @@ static error_desc_t create_error_desc(u32_t error_id, jerry_value_t this,
}
// a zjs_pre_emit callback
-static void handle_error_arg(void *unused, jerry_value_t argv[], u32_t *argc,
+static bool handle_error_arg(void *unused, jerry_value_t argv[], u32_t *argc,
const char *buffer, u32_t bytes)
{
// requires: buffer contains a u32_t with an error constant
@@ -165,10 +165,7 @@ static void handle_error_arg(void *unused, jerry_value_t argv[], u32_t *argc,
// the error flag, and sets this as the first arg; the error
// value must be released later (e.g. zjs_release_args)
FTRACE("buffer = %p, bytes = %d\n", buffer, bytes);
- if (bytes != sizeof(error_desc_t)) {
- DBG_PRINT("invalid data in handle_error_arg");
- return;
- }
+ ZJS_ASSERT(bytes == sizeof(error_desc_t), "invalid data received");
error_desc_t *desc = (error_desc_t *)buffer;
const char *message = error_messages[desc->error_id];
@@ -178,6 +175,7 @@ static void handle_error_arg(void *unused, jerry_value_t argv[], u32_t *argc,
jerry_value_clear_error_flag(&error);
argv[0] = error;
*argc = 1;
+ return true;
}
static void emit_error(jerry_value_t obj, const char *format, ...)
@@ -451,13 +449,14 @@ static void consume_data(ws_connection_t *con, u16_t len)
}
// a zjs_pre_emit_callback
-static void trigger_data(void *h, jerry_value_t argv[], u32_t *argc,
+static bool trigger_data(void *h, jerry_value_t argv[], u32_t *argc,
const char *buffer, u32_t bytes)
{
// requires: buffer contains 2-byte length
FTRACE("h = %p, buffer = %p, bytes = %d\n", h, buffer, bytes);
- ws_connection_t *con = (ws_connection_t *)h;
+ ZJS_ASSERT(bytes == sizeof(u16_t), "invalid data received");
+ ws_connection_t *con = (ws_connection_t *)h;
u16_t len = *(u16_t *)buffer;
zjs_buffer_t *buf;
jerry_value_t buf_obj = zjs_buffer_create(len, &buf);
@@ -466,21 +465,25 @@ static void trigger_data(void *h, jerry_value_t argv[], u32_t *argc,
consume_data(con, len);
argv[0] = buf_obj;
*argc = 1;
+ return true;
}
+ return false;
}
// a zjs_pre_emit callback
-static void pre_close_connection(void *handle, jerry_value_t argv[],
+static bool pre_close_connection(void *handle, jerry_value_t argv[],
u32_t *argc, const char *buffer, u32_t length)
{
FTRACE("handle = %p, buffer = %p, length = %d\n", handle, buffer, length);
+ ZJS_ASSERT(bytes == sizeof(u16_t), "invalid data received");
- jerry_value_t code = jerry_create_number(*((uint16_t *)buffer));
+ jerry_value_t code = jerry_create_number(*((u16_t *)buffer));
jerry_value_t reason = jerry_create_string("socket closed");
argv[0] = code;
argv[1] = reason;
*argc = 2;
+ return true;
}
// a zjs_post_emit callback
@@ -563,7 +566,7 @@ static void process_packet(ws_connection_t *con, u8_t *data, u32_t len)
break;
case WS_PACKET_CLOSE:
zjs_defer_emit_event(con->conn, "close", packet->payload,
- sizeof(uint16_t), pre_close_connection,
+ sizeof(packet->payload), pre_close_connection,
close_connection);
break;
default:
@@ -832,8 +835,8 @@ static void tcp_received(struct net_context *context,
net_pkt_unref(pkt);
if (con && con->state == CONNECTED) {
// close the socket
- uint16_t stat = (uint16_t)status;
- zjs_defer_emit_event(con->conn, "close", &stat, sizeof(uint16_t),
+ u16_t stat = (u16_t)status;
+ zjs_defer_emit_event(con->conn, "close", &stat, sizeof(stat),
pre_close_connection, close_connection);
return;
} else {