diff options
author | Geoff Gustafson <geoff@linux.intel.com> | 2017-10-13 08:07:15 -0700 |
---|---|---|
committer | Jimmy Huang <jimmy.huang@linux.intel.com> | 2017-10-19 13:59:35 -0700 |
commit | e6c97523c082b5d1db6a56b3fdcb3b10a81e6a34 (patch) | |
tree | 52650f0a4322324582389b6ad10e27888d67e58f | |
parent | 5ac6830cefbca30fee3104adbc3baf164e696580 (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.c | 3 | ||||
-rw-r--r-- | src/zjs_event.c | 14 | ||||
-rw-r--r-- | src/zjs_event.h | 30 | ||||
-rw-r--r-- | src/zjs_net.c | 6 | ||||
-rw-r--r-- | src/zjs_web_sockets.c | 27 |
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 { |