From 968b8acc58089bc87e6901dc2fecd699367d69c4 Mon Sep 17 00:00:00 2001 From: Jimmy Huang Date: Thu, 3 Nov 2016 14:35:20 -0700 Subject: [PATCH] Fixed error handling based on feedback Also fixed a bug where we still report change events after error is reported Signed-off-by: Jimmy Huang --- samples/Accelerometer.js | 5 +++-- samples/Gyroscope.js | 5 +++-- src/zjs_ipm.h | 2 +- src/zjs_sensor.c | 29 ++++++++++++++++++++++------- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/samples/Accelerometer.js b/samples/Accelerometer.js index 2890eea31..72886e2f7 100644 --- a/samples/Accelerometer.js +++ b/samples/Accelerometer.js @@ -22,8 +22,9 @@ sensor.onstatechange = function(event) { console.log("state: " + event); }; -sensor.onerrorchange = function(error) { - console.log("error: " + error); +sensor.onerror = function(event) { + console.log("error: " + event.error.name + + " - " + event.error.message); }; sensor.start(); diff --git a/samples/Gyroscope.js b/samples/Gyroscope.js index 3899662b8..e1b02e966 100644 --- a/samples/Gyroscope.js +++ b/samples/Gyroscope.js @@ -19,8 +19,9 @@ sensor.onstatechange = function(event) { console.log("state: " + event); }; -sensor.onerrorchange = function(error) { - console.log("error: " + error); +sensor.onerror = function(event) { + console.log("error: " + event.error.name + + " - " + event.error.message); }; sensor.start(); diff --git a/src/zjs_ipm.h b/src/zjs_ipm.h index af2413d12..75d5b6bed 100644 --- a/src/zjs_ipm.h +++ b/src/zjs_ipm.h @@ -38,7 +38,7 @@ enum { #define ERROR_IPM_NOT_SUPPORTED 0x0001 #define ERROR_IPM_INVALID_PARAMETER 0x0002 #define ERROR_IPM_OPERATION_FAILED 0x0003 -#define ERROR_IPM_OPERATION_DENIED 0x0004 +#define ERROR_IPM_OPERATION_NOT_ALLOWED 0x0004 // Message Types diff --git a/src/zjs_sensor.c b/src/zjs_sensor.c index 3c208a751..b5ee1d2eb 100644 --- a/src/zjs_sensor.c +++ b/src/zjs_sensor.c @@ -224,18 +224,28 @@ static void zjs_sensor_update_reading(jerry_value_t obj, } static void zjs_sensor_trigger_error(jerry_value_t obj, - const char *error_type) + const char *error_name, + const char *error_message) { zjs_sensor_set_state(obj, SENSOR_STATE_ERRORED); jerry_value_t func = zjs_get_property(obj, "onerror"); if (jerry_value_is_function(func)) { // if onerror exists, call it - jerry_value_t event = jerry_create_string(error_type); + jerry_value_t event = jerry_create_object(); + jerry_value_t error_obj = jerry_create_object(); + jerry_value_t name_val = jerry_create_string(error_name); + jerry_value_t message_val = jerry_create_string(error_message); + zjs_set_property(error_obj, "name", name_val); + zjs_set_property(error_obj, "message", message_val); + zjs_set_property(event, "error", error_obj); jerry_value_t rval = jerry_call_function(func, obj, &event, 1); if (jerry_value_has_error_flag(rval)) { PRINT("zjs_sensor_trigger_error: error calling onerrorhange\n"); } jerry_release_value(rval); + jerry_release_value(name_val); + jerry_release_value(message_val); + jerry_release_value(error_obj); jerry_release_value(event); } jerry_release_value(func); @@ -248,9 +258,12 @@ static void zjs_sensor_onchange_c_callback(void *h) PRINT("zjs_sensor_onchange_c_callback: handle not found\n"); return; } - zjs_sensor_update_reading(handle->sensor_obj, - handle->channel, - handle->reading); + + if (zjs_sensor_get_state(handle->sensor_obj) == SENSOR_STATE_ACTIVATED) { + zjs_sensor_update_reading(handle->sensor_obj, + handle->channel, + handle->reading); + } } static void zjs_sensor_signal_callbacks(sensor_handle_t *handle, @@ -327,8 +340,10 @@ static jerry_value_t zjs_sensor_start(const jerry_value_t function_obj, send.data.sensor.channel = handle->channel; int error = zjs_sensor_call_remote_function(&send); if (error != ERROR_IPM_NONE) { - if (error == ERROR_IPM_OPERATION_DENIED) { - zjs_sensor_trigger_error(this, "NotAllowedError"); + if (error == ERROR_IPM_OPERATION_NOT_ALLOWED) { + zjs_sensor_trigger_error(this, "NotAllowedError", + "permission denied"); + return ZJS_UNDEFINED; } else { // throw exception for all other errors