From 4926d22dddee86592b321f3436de4248059fec74 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Tue, 7 Nov 2017 16:30:10 +0900 Subject: [PATCH 01/16] Change ecore timer to thread for connecting daemon Change-Id: I92e6f9cd5a6e4f1db86041747efc9cb3fad4120c Signed-off-by: Wonnam Jang (cherry picked from commit 7e35c08d1960335a77963ba6a299e2ef5742a22e) --- client/vc.c | 74 ++++++++++++++++++++++++++++++++++++++++------------ client/vc_dbus.c | 1 + client/vc_mgr.c | 12 ++++----- client/vc_mgr_dbus.c | 1 + 4 files changed, 64 insertions(+), 24 deletions(-) diff --git a/client/vc.c b/client/vc.c index 2afb878..c89e7f9 100644 --- a/client/vc.c +++ b/client/vc.c @@ -56,8 +56,8 @@ static bool g_backup = false; static int g_privilege_allowed = -1; static cynara *p_cynara = NULL; -Eina_Bool __vc_notify_state_changed(void *data); -Eina_Bool __vc_notify_error(void *data); +static void __vc_notify_state_changed(void *data); +static void __vc_notify_error(void *data); static int __vc_get_feature_enabled() { @@ -110,7 +110,7 @@ static int __check_privilege(const char* uid, const char * privilege) fp = fopen(label_path, "r"); if (fp != NULL) { - if (sizeof(smack_label) != fread(smack_label, 1, sizeof(smack_label), fp)) + if (strlen(smack_label) != fread(smack_label, 1, sizeof(smack_label), fp)) SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to fread"); fclose(fp); @@ -489,7 +489,7 @@ static Eina_Bool __vc_connect_daemon(void *data) SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret)); vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND); - ecore_timer_add(0, __vc_notify_error, g_vc); + ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc); SLOG(LOG_DEBUG, TAG_VCC, "@@@"); return EINA_FALSE; @@ -498,7 +498,7 @@ static Eina_Bool __vc_connect_daemon(void *data) SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT); - ecore_timer_add(0, __vc_notify_error, g_vc); + ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc); SLOG(LOG_DEBUG, TAG_VCC, "@@@"); return EINA_FALSE; @@ -542,7 +542,7 @@ static Eina_Bool __vc_connect_daemon(void *data) } vc_client_set_client_state(g_vc, VC_STATE_READY); - ecore_timer_add(0, __vc_notify_state_changed, g_vc); + ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc); vc_client_set_mgr_pid(g_vc, mgr_pid); @@ -551,6 +551,50 @@ static Eina_Bool __vc_connect_daemon(void *data) return EINA_FALSE; } +static void __start_prepare_thread(void *data, Ecore_Thread *thread) +{ + SLOG(LOG_ERROR, TAG_VCC, "@@@ Start prepare thread"); + int ret = -1, retry_count = 0; + + /* Send hello */ + while (0 != ret) { + + if (retry_count == 10) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!"); + return; + } + + ret = vc_dbus_request_hello(); + if (ret == 0) { + SLOG(LOG_DEBUG, TAG_VCC, "Success to request hello. retry count(%d)", retry_count); + break; + } else { + retry_count++; + } + } + + ret = -1; + retry_count = 0; + while (0 != ret) { + if (retry_count == 10) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon !!"); + return; + } + ret = __vc_connect_daemon(NULL); + if (ret == 0) + break; + else + retry_count++; + } + + return; +} + +static void __end_prepare_thread(void *data, Ecore_Thread *thread) +{ + SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread"); +} + int vc_prepare(void) { if (0 != __vc_get_feature_enabled()) { @@ -576,7 +620,7 @@ int vc_prepare(void) return VC_ERROR_INVALID_STATE; } - g_connect_timer = ecore_timer_add(0, __vc_connect_daemon, NULL); + ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, NULL); SLOG(LOG_DEBUG, TAG_VCC, "@@@"); @@ -651,7 +695,7 @@ int vc_unprepare(void) __vc_internal_unprepare(); vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED); - ecore_timer_add(0, __vc_notify_state_changed, g_vc); + ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc); SLOG(LOG_DEBUG, TAG_VCC, "@@@"); @@ -1522,7 +1566,7 @@ int vc_request_cancel(void) } #endif -Eina_Bool __vc_notify_error(void *data) +static void __vc_notify_error(void *data) { vc_h vc = (vc_h)data; @@ -1541,8 +1585,6 @@ Eina_Bool __vc_notify_error(void *data) } else { SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null"); } - - return EINA_FALSE; } int __vc_cb_error(int reason, int daemon_pid, char* msg) @@ -1563,22 +1605,22 @@ int __vc_cb_error(int reason, int daemon_pid, char* msg) SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset"); vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED); - __vc_notify_state_changed(g_vc); + ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc); if (0 != vc_prepare()) { SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare"); } } - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg); + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg); vc_client_set_error(g_vc, reason); - ecore_timer_add(0, __vc_notify_error, g_vc); + ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc); return 0; } -Eina_Bool __vc_notify_state_changed(void *data) +static void __vc_notify_state_changed(void *data) { vc_h vc = (vc_h)data; @@ -1600,8 +1642,6 @@ Eina_Bool __vc_notify_state_changed(void *data) } else { SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null"); } - - return EINA_FALSE; } static Eina_Bool __vc_notify_result(void *data) diff --git a/client/vc_dbus.c b/client/vc_dbus.c index 49d4510..7ab57c5 100644 --- a/client/vc_dbus.c +++ b/client/vc_dbus.c @@ -401,6 +401,7 @@ int vc_dbus_request_hello() result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, 500, &err); if (dbus_error_is_set(&err)) { + SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Dbus Error (%s)", err.message); dbus_error_free(&err); } diff --git a/client/vc_mgr.c b/client/vc_mgr.c index b8c5458..f29f08c 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -55,7 +55,7 @@ static int g_feature_enabled = -1; static bool g_err_callback_status = false; static Eina_Bool __vc_mgr_notify_state_changed(void *data); -static Eina_Bool __vc_mgr_notify_error(void *data); +static void __vc_mgr_notify_error(void *data); static Eina_Bool __vc_mgr_notify_result(void *data); static const char* __vc_mgr_get_error_code(vc_error_e err) @@ -262,7 +262,7 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data) SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret)); vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND); - ecore_timer_add(0, __vc_mgr_notify_error, g_vc_m); + ecore_main_loop_thread_safe_call_async(__vc_mgr_notify_error, (void*)g_vc_m); SLOG(LOG_DEBUG, TAG_VCM, "@@@"); return EINA_FALSE; @@ -314,7 +314,7 @@ static void __start_prepare_thread(void *data, Ecore_Thread *thread) int ret = 1, retry_count = 0; /* Send hello */ - while (ret) { + while (0 != ret) { if (retry_count == 10) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request hello !!"); @@ -332,7 +332,7 @@ static void __start_prepare_thread(void *data, Ecore_Thread *thread) ret = 1; retry_count = 0; - while (ret) { + while (0 != ret) { if (retry_count == 10) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to connect daemon !!"); return; @@ -2321,7 +2321,7 @@ int vc_mgr_get_error_message(char** err_msg) return ret; } -static Eina_Bool __vc_mgr_notify_error(void *data) +static void __vc_mgr_notify_error(void *data) { vc_h vc_m = (vc_h)data; @@ -2342,8 +2342,6 @@ static Eina_Bool __vc_mgr_notify_error(void *data) } else { SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null"); } - - return EINA_FALSE; } int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg) diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index 2cfd533..4c43f45 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -788,6 +788,7 @@ int vc_mgr_dbus_request_hello() result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, 500, &err); if (dbus_error_is_set(&err)) { + SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Dbus Error (%s)", err.message); dbus_error_free(&err); } -- 2.7.4 From f1c7ec405b09f81778bd035ace69b0ca5870a96b Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Thu, 16 Nov 2017 19:29:01 +0900 Subject: [PATCH 02/16] Fix vc engine API (get_info) Change-Id: I6c14b6134e639d0dc21ce33cbb48a886551fc500 Signed-off-by: sooyeon.kim --- include/vce.h | 8 +++++--- server/vcd_engine_agent.c | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/include/vce.h b/include/vce.h index 68f411a..eff4061 100755 --- a/include/vce.h +++ b/include/vce.h @@ -463,10 +463,12 @@ typedef int (*vce_process_haptic_event_cb)(const char* event); * @brief Called when the engine service user requests the base information of VC engine. * @since_tizen 5.0 * -* @param[in] engine_uuid The engine id -* @param[in] engine_name The engine name +* @param[out] engine_uuid The engine id +* @param[out] engine_name The engine name +* @param[out] engine_setting The setting path name +* @param[out] use_network @c true to need network @c false not to need network. */ -typedef int (*vce_get_info_cb)(char** engine_uuid, char** engine_name); +typedef int (*vce_get_info_cb)(char** engine_uuid, char** engine_name, char** engine_setting, bool* use_network); /** diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index c502151..49b9f7f 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -33,11 +33,13 @@ typedef struct { char* engine_uuid; char* engine_name; char* engine_path; + char* engine_setting_path; /* engine load info */ bool is_set; bool is_loaded; bool is_command_ready; + bool use_network; void *handle; vc_engine_callback_s* callbacks; @@ -155,7 +157,7 @@ int __internal_get_engine_info(vce_request_callback_s* callback) return VCD_ERROR_ENGINE_NOT_FOUND; } - if (0 != callback->get_info(&(g_dynamic_engine.engine_uuid), &(g_dynamic_engine.engine_name))) { + if (0 != callback->get_info(&(g_dynamic_engine.engine_uuid), &(g_dynamic_engine.engine_name), &(g_dynamic_engine.engine_setting_path), &(g_dynamic_engine.use_network))) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get engine info"); return VCD_ERROR_ENGINE_NOT_FOUND; } -- 2.7.4 From 908696a4e3c87da49edb98d17f7253a09d5000a4 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Thu, 23 Nov 2017 09:26:52 +0900 Subject: [PATCH 03/16] Remove unnecessary DB access Change-Id: Ie5080b25a9a7c5d2c9e950b958f95e322d3bdd16 Signed-off-by: Wonnam Jang --- client/vc_widget.c | 20 +++----------------- client/vc_widget_dbus.c | 14 +++++++++++--- server/vcd_dbus.c | 4 +++- server/vcd_dbus.h | 2 +- server/vcd_server.c | 3 +-- 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/client/vc_widget.c b/client/vc_widget.c index 178f360..257478f 100644 --- a/client/vc_widget.c +++ b/client/vc_widget.c @@ -1128,18 +1128,9 @@ void __vc_widget_cb_result() return; } -bool __vc_widget_cb_asr_result() +bool __vc_widget_cb_asr_result(int event, const char* asr_result) { - char* temp_text; - int event; - vc_cmd_list_h vc_cmd_list = NULL; - if (0 != vc_cmd_list_create(&vc_cmd_list)) { - SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to create command list"); - return false; - } - - vc_info_parser_get_result(&temp_text, &event, NULL, -1, vc_cmd_list, false); - SLOG(LOG_DEBUG, TAG_VCW, "Result info : result text(%s) event(%d)", temp_text, event); + SLOG(LOG_DEBUG, TAG_VCW, "Result info : result text(%s) event(%d)", asr_result, event); vc_asr_result_cb callback = NULL; void* user_data = NULL; @@ -1168,7 +1159,7 @@ bool __vc_widget_cb_asr_result() } vc_widget_client_use_callback(vc_w); - consumed = callback(event, temp_text, user_data); + consumed = callback(event, asr_result, user_data); vc_widget_client_not_use_callback(vc_w); if (true == consumed) break; @@ -1177,11 +1168,6 @@ bool __vc_widget_cb_asr_result() } } - /* Release result */ - if (NULL != temp_text) free(temp_text); - - vc_cmd_list_destroy(vc_cmd_list, true); - return consumed; } diff --git a/client/vc_widget_dbus.c b/client/vc_widget_dbus.c index a40fd93..9d5dbc0 100644 --- a/client/vc_widget_dbus.c +++ b/client/vc_widget_dbus.c @@ -33,7 +33,7 @@ extern void __vc_widget_cb_show_tooltip(int pid, bool show); extern void __vc_widget_cb_result(); -extern bool __vc_widget_cb_asr_result(); +extern bool __vc_widget_cb_asr_result(int event, const char* asr_result); extern int __vc_widget_cb_service_state(int state); @@ -168,7 +168,15 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd else if (dbus_message_is_method_call(msg, if_name, VCD_WIDGET_METHOD_ASR_RESULT)) { SLOG(LOG_DEBUG, TAG_VCW, "@@@ Get widget asr result"); int ret = 0; - if (false == __vc_widget_cb_asr_result()) + int event = -1; + char* asr_result = NULL; + + dbus_message_get_args(msg, &err, + DBUS_TYPE_INT32, &event, + DBUS_TYPE_STRING, &asr_result, + DBUS_TYPE_INVALID); + + if (false == __vc_widget_cb_asr_result(event, asr_result)) ret = 0; else ret = 1; @@ -179,7 +187,7 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd if (!dbus_connection_send(g_w_conn_listener, reply, NULL)) SLOG(LOG_ERROR, TAG_VCW, "@@ vc widget get asr result : fail to send reply"); else - SLOG(LOG_DEBUG, TAG_VCW, "@@ vc widget get asr result"); + SLOG(LOG_DEBUG, TAG_VCW, "@@ vc widget get asr result, event(%d), asr_result(%s), consumed(%d)", event, asr_result, ret); dbus_connection_flush(g_w_conn_listener); dbus_message_unref(reply); diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index f2486e4..72cad70 100755 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -311,7 +311,7 @@ int vcdc_send_result(int pid, int manager_pid, int cmd_type) return 0; } -int vcdc_send_asr_result(int pid, int cmd_type, bool* is_consumed) +int vcdc_send_asr_result(int pid, int event, const char* asr_result, int cmd_type, bool* is_consumed) { if (0 != __dbus_check()) { return VCD_ERROR_OPERATION_FAILED; @@ -335,6 +335,8 @@ int vcdc_send_asr_result(int pid, int cmd_type, bool* is_consumed) return VCD_ERROR_OUT_OF_MEMORY; } + dbus_message_append_args(msg, DBUS_TYPE_INT32, &event, DBUS_TYPE_STRING, &asr_result, DBUS_TYPE_INVALID); + DBusError err; dbus_error_init(&err); diff --git a/server/vcd_dbus.h b/server/vcd_dbus.h index ad6ebb8..d4674ec 100644 --- a/server/vcd_dbus.h +++ b/server/vcd_dbus.h @@ -44,7 +44,7 @@ int vcdc_send_set_volume(int manger_pid, float volume); int vcdc_send_result(int pid, int manager_pid, int cmd_type); -int vcdc_send_asr_result(int pid, int cmd_type, bool* is_consumed); +int vcdc_send_asr_result(int pid, int event, const char* asr_result, int cmd_type, bool* is_consumed); int vcdc_send_pre_result_to_manager(int manager_pid, int event, const char* pre_result); diff --git a/server/vcd_server.c b/server/vcd_server.c index 10cb388..58b2f37 100755 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -506,13 +506,12 @@ int vcd_send_result(vce_result_event_e event, int* result_id, int count, const c int pid = vcd_client_widget_get_foreground_pid(); if (-1 != pid) { if (NULL != all_result) { - vc_info_parser_set_result(all_result, event, msg, NULL, false); bool enable = false; vcd_client_widget_get_asr_result_enabled(pid, &enable); if (true == enable) { SLOG(LOG_DEBUG, TAG_VCD, "[Server] Send ASR result to Widget client"); bool is_consumed = false; - if (0 != vcdc_send_asr_result(pid, VC_COMMAND_TYPE_WIDGET, &is_consumed)) { + if (0 != vcdc_send_asr_result(pid, event, all_result, VC_COMMAND_TYPE_WIDGET, &is_consumed)) { SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to send asr result"); } else { SLOG(LOG_DEBUG, TAG_VCD, "[Server] ASR result is consumed(%d)", is_consumed); -- 2.7.4 From e112589ee1778b325974881fc0a614cd4cd437a4 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Wed, 29 Nov 2017 16:35:34 +0900 Subject: [PATCH 04/16] delete timer when vc widget is deinitialized Change-Id: I5bce055aedb601d08decfac3136d67e2f063dd4b Signed-off-by: Wonnam Jang (cherry picked from commit 0cbf9e60b8594da0711e89b7c21c435381da06bc) --- client/vc_widget.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/client/vc_widget.c b/client/vc_widget.c index 257478f..d6bcc47 100644 --- a/client/vc_widget.c +++ b/client/vc_widget.c @@ -35,6 +35,9 @@ static Ecore_Event_Handler* g_focus_in_handler = NULL; static Ecore_Event_Handler* g_focus_out_handler = NULL; static Ecore_Timer* g_w_start_timer = NULL; +static Ecore_Timer* g_w_notify_error_timer = NULL; +static Ecore_Timer* g_w_notify_state_timer = NULL; +static Ecore_Timer* g_w_notify_result_timer = NULL; static int g_daemon_pid = 0; @@ -189,6 +192,28 @@ static void __vc_widget_internal_unprepare(vc_h vc_w) return; } +static void __vc_widget_delete_timer() +{ + SLOG(LOG_DEBUG, TAG_VCW, "@@@ [Widget] timers are deleted"); + if (NULL != g_w_start_timer) { + ecore_timer_del(g_w_start_timer); + g_w_start_timer = NULL; + } + if (NULL != g_w_notify_error_timer) { + ecore_timer_del(g_w_notify_error_timer); + g_w_notify_error_timer = NULL; + } + if (NULL != g_w_notify_state_timer) { + ecore_timer_del(g_w_notify_state_timer); + g_w_notify_state_timer = NULL; + } + if (NULL != g_w_notify_result_timer) { + ecore_timer_del(g_w_notify_result_timer); + g_w_notify_result_timer = NULL; + } + return; +} + int vc_widget_deinitialize(vc_h vc_w) { SLOG(LOG_DEBUG, TAG_VCW, "@@@ [Widget] Deinitialize"); @@ -228,6 +253,8 @@ int vc_widget_deinitialize(vc_h vc_w) break; } + __vc_widget_delete_timer(); + SLOG(LOG_DEBUG, TAG_VCW, "Success: destroy"); if (0 == vc_widget_client_get_count()) { @@ -298,7 +325,7 @@ static Eina_Bool __vc_widget_connect_daemon(void *data) SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to initialize : %s", __vc_widget_get_error_code(ret)); vc_widget_client_set_error(vc_w, VC_ERROR_ENGINE_NOT_FOUND); - ecore_timer_add(0, __vc_widget_notify_error, vc_w); + g_w_notify_error_timer = ecore_timer_add(0, __vc_widget_notify_error, vc_w); SLOG(LOG_DEBUG, TAG_VCW, "@@@"); return EINA_FALSE; @@ -309,7 +336,7 @@ static Eina_Bool __vc_widget_connect_daemon(void *data) SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to initialize : %s", __vc_widget_get_error_code(ret)); vc_widget_client_set_error(vc_w, VC_ERROR_TIMED_OUT); - ecore_timer_add(0, __vc_widget_notify_error, vc_w); + g_w_notify_error_timer = ecore_timer_add(0, __vc_widget_notify_error, vc_w); SLOG(LOG_DEBUG, TAG_VCW, "@@@"); return EINA_FALSE; @@ -335,7 +362,7 @@ static Eina_Bool __vc_widget_connect_daemon(void *data) } vc_widget_client_set_state(vc_w, VC_STATE_READY); - ecore_timer_add(0, __vc_widget_notify_state_changed, vc_w); + g_w_notify_state_timer = ecore_timer_add(0, __vc_widget_notify_state_changed, vc_w); SLOG(LOG_DEBUG, TAG_VCW, "@@@"); @@ -395,7 +422,7 @@ int vc_widget_unprepare(vc_h vc_w) __vc_widget_internal_unprepare(vc_w); vc_widget_client_set_state(vc_w, VC_STATE_INITIALIZED); - ecore_timer_add(0, __vc_widget_notify_state_changed, vc_w); + g_w_notify_state_timer = ecore_timer_add(0, __vc_widget_notify_state_changed, vc_w); SLOG(LOG_DEBUG, TAG_VCW, "@@@"); @@ -932,7 +959,7 @@ int __vc_widget_cb_error(int reason, int daemon_pid, char* msg) SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Error reason(%d), msg(%s)", reason, msg); vc_widget_client_set_error(vc_w, reason); - ecore_timer_add(0, __vc_widget_notify_error, vc_w); + g_w_notify_error_timer = ecore_timer_add(0, __vc_widget_notify_error, vc_w); } } @@ -1123,7 +1150,7 @@ static Eina_Bool __vc_widget_notify_result(void *data) void __vc_widget_cb_result() { - ecore_timer_add(0, __vc_widget_notify_result, NULL); + g_w_notify_result_timer = ecore_timer_add(0, __vc_widget_notify_result, NULL); return; } -- 2.7.4 From 7833b656b6dd2c226b87c207b4e5bcd5238005a2 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Wed, 29 Nov 2017 21:20:01 +0900 Subject: [PATCH 05/16] check null before use when dbus close connection Change-Id: I00e45405980dfcd1572afa428f5937688a0aee94 Signed-off-by: Wonnam Jang --- client/vc_dbus.c | 18 ++++++++++-------- client/vc_mgr_dbus.c | 18 ++++++++++-------- client/vc_widget_dbus.c | 18 ++++++++++-------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/client/vc_dbus.c b/client/vc_dbus.c index 7ab57c5..2bfeb78 100644 --- a/client/vc_dbus.c +++ b/client/vc_dbus.c @@ -313,17 +313,19 @@ int vc_dbus_close_connection() g_fd_handler = NULL; } - int pid = getpid(); + if (NULL != g_conn_listener) { + int pid = getpid(); - char service_name[64]; - memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_CLIENT_SERVICE_NAME, pid); + char service_name[64]; + memset(service_name, '\0', 64); + snprintf(service_name, 64, "%s%d", VC_CLIENT_SERVICE_NAME, pid); - dbus_bus_release_name(g_conn_listener, service_name, &err); + dbus_bus_release_name(g_conn_listener, service_name, &err); - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Dbus Error (%s)", err.message); - dbus_error_free(&err); + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Dbus Error (%s)", err.message); + dbus_error_free(&err); + } } __vc_dbus_connection_free(); diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index 4c43f45..d08e9e9 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -712,17 +712,19 @@ int vc_mgr_dbus_close_connection() g_m_fd_handler = NULL; } - int pid = getpid(); + if (NULL != g_m_conn_listener) { + int pid = getpid(); - char service_name[64]; - memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, pid); + char service_name[64]; + memset(service_name, '\0', 64); + snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, pid); - dbus_bus_release_name(g_m_conn_listener, service_name, &err); + dbus_bus_release_name(g_m_conn_listener, service_name, &err); - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Dbus Error (%s)", err.message); - dbus_error_free(&err); + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Dbus Error (%s)", err.message); + dbus_error_free(&err); + } } __vc_mgr_dbus_connection_free(); diff --git a/client/vc_widget_dbus.c b/client/vc_widget_dbus.c index 9d5dbc0..59d7a60 100644 --- a/client/vc_widget_dbus.c +++ b/client/vc_widget_dbus.c @@ -397,17 +397,19 @@ int vc_widget_dbus_close_connection() g_w_fd_handler = NULL; } - int pid = getpid(); + if (NULL != g_w_conn_listener) { + int pid = getpid(); - char service_name[64]; - memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid); + char service_name[64]; + memset(service_name, '\0', 64); + snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid); - dbus_bus_release_name(g_w_conn_listener, service_name, &err); + dbus_bus_release_name(g_w_conn_listener, service_name, &err); - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Dbus Error (%s)", err.message); - dbus_error_free(&err); + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Dbus Error (%s)", err.message); + dbus_error_free(&err); + } } __vc_mgr_dbus_connection_free(); -- 2.7.4 From 3b6b6e389632fc9e2096c4b6935bc5d866aea717 Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Thu, 30 Nov 2017 15:36:23 +0900 Subject: [PATCH 06/16] Call hide tooltip every recording cancel Change-Id: I1a0c3ff7b94642e99dfbb410874159a58a6708ae Signed-off-by: Suyeon Hwang --- server/vcd_server.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/server/vcd_server.c b/server/vcd_server.c index 58b2f37..6e973f3 100755 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -1632,6 +1632,17 @@ int vcd_server_mgr_cancel() if (VCD_STATE_READY == state) { SLOG(LOG_DEBUG, TAG_VCD, "[Server] Current state is READY"); vcd_recorder_stop(); + + if (false == vcd_client_manager_get_exclusive()) { + if (1 == vcd_config_get_command_type_enabled(VC_COMMAND_TYPE_WIDGET)) { + int pid = vcd_client_widget_get_foreground_pid(); + if (-1 != pid) { + SLOG(LOG_DEBUG, TAG_VCD, "[Server] Request tooltip hide"); + ecore_timer_add(0, __vcd_request_show_tooltip, (void*)false); + } + } + } + vcdc_send_service_state(VCD_STATE_READY); return VCD_ERROR_NONE; } -- 2.7.4 From 36a22e32e3973a437a80f2ca82690bc3dbae0592 Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Tue, 5 Dec 2017 18:08:02 +0900 Subject: [PATCH 07/16] Add a new parameter for checking whether result is consumed Change-Id: Ie821ca2c330aa325455dc4304b08021069b6f374 Signed-off-by: sooyeon.kim --- include/vce.h | 3 ++- server/vcd_server.c | 9 ++++++++- server/vcd_server.h | 2 +- server/vce.c | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/include/vce.h b/include/vce.h index eff4061..a921cd1 100755 --- a/include/vce.h +++ b/include/vce.h @@ -644,6 +644,7 @@ int vce_main(int argc, char** argv, vce_request_callback_s *callback); * @param[in] non_fixed_result Non-fixed command result text * @param[in] nlu_result NLU result text * @param[in] msg Engine message (e.g. #VC_RESULT_MESSAGE_NONE, #VC_RESULT_MESSAGE_ERROR_TOO_LOUD) +* @param[out] user_info A user info (e.g. If ASR result is consumed, the value is 0x01. If not, the value is 0x00.) * @param[in] user_data The user data passed from set callback function * * @pre The vce_main() function should be invoked before this function is called. @@ -651,7 +652,7 @@ int vce_main(int argc, char** argv, vce_request_callback_s *callback); * * @see vce_stop_cb() */ -int vce_send_result(vce_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, void *user_data); +int vce_send_result(vce_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, int* user_info, void *user_data); /** * @brief Sends the ASR result to the engine service user. diff --git a/server/vcd_server.c b/server/vcd_server.c index 6e973f3..2908e9f 100755 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -452,7 +452,7 @@ static void* __recorder_stop(void *data) return NULL; } -int vcd_send_result(vce_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, void *user_data) +int vcd_send_result(vce_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, int* user_info, void *user_data) { int ret = 0; @@ -511,11 +511,18 @@ int vcd_send_result(vce_result_event_e event, int* result_id, int count, const c if (true == enable) { SLOG(LOG_DEBUG, TAG_VCD, "[Server] Send ASR result to Widget client"); bool is_consumed = false; + if (NULL != user_info) { + *user_info = 0x00; + } if (0 != vcdc_send_asr_result(pid, event, all_result, VC_COMMAND_TYPE_WIDGET, &is_consumed)) { SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to send asr result"); } else { SLOG(LOG_DEBUG, TAG_VCD, "[Server] ASR result is consumed(%d)", is_consumed); if (true == is_consumed) { + if (NULL != user_info) { + *user_info = 0x01; + SLOG(LOG_DEBUG, TAG_VCD, "[Server] Send whether ASR result is consumed or not (%d)", *user_info); + } vcdc_send_show_tooltip(pid, false); if (-1 != vcd_client_manager_get_pid()) { /* Manager client is available */ diff --git a/server/vcd_server.h b/server/vcd_server.h index d317a3e..b328a7e 100644 --- a/server/vcd_server.h +++ b/server/vcd_server.h @@ -129,7 +129,7 @@ int vcd_server_set_language(const char* language); /* * For engine service */ -int vcd_send_result(vce_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, void *user_data); +int vcd_send_result(vce_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, int* user_info, void *user_data); int vcd_send_asr_result(vce_asr_result_event_e event, const char* asr_result, void *user_data); diff --git a/server/vce.c b/server/vce.c index 25f1f46..b7fb585 100755 --- a/server/vce.c +++ b/server/vce.c @@ -58,7 +58,7 @@ int vce_main(int argc, char** argv, vce_request_callback_s *callback) return 0; } -int vce_send_result(vce_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, void *user_data) +int vce_send_result(vce_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, int* user_info, void *user_data) { int ret = VCE_ERROR_NONE; @@ -66,7 +66,7 @@ int vce_send_result(vce_result_event_e event, int* result_id, int count, const c SLOG(LOG_ERROR, TAG_VCD, "[INFO] Input parameter is NULL. (no result)"); } - ret = vcd_send_result(event, result_id, count, all_result, non_fixed_result, nlu_result, msg, user_data); + ret = vcd_send_result(event, result_id, count, all_result, non_fixed_result, nlu_result, msg, user_info, user_data); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to send result"); } else { -- 2.7.4 From d4b827584ee1189456efc43d1239cf0988d0480d Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Mon, 8 Jan 2018 18:28:04 +0900 Subject: [PATCH 08/16] Add priority for Widget command Change-Id: I6b2e21db43366c7b821524f79c7869fc5d133e51 Signed-off-by: Suyeon Hwang --- common/vc_cmd_db.c | 2 +- common/vc_command.h | 7 ++-- server/vcd_client_data.c | 2 +- server/vcd_server.c | 96 ++++++++++++++++++++++++++---------------------- 4 files changed, 58 insertions(+), 49 deletions(-) diff --git a/common/vc_cmd_db.c b/common/vc_cmd_db.c index 5b1face..d55a171 100644 --- a/common/vc_cmd_db.c +++ b/common/vc_cmd_db.c @@ -1200,8 +1200,8 @@ static vc_cmd_s* __vc_db_command_copy(vc_cmd_s* src_cmd) if (VC_COMMAND_TYPE_SYSTEM == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM; else if (VC_COMMAND_TYPE_EXCLUSIVE == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_EXCLUSIVE; + else if (VC_COMMAND_TYPE_WIDGET == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_WIDGET; else if (VC_COMMAND_TYPE_FOREGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_FOREGROUND; - else if (VC_COMMAND_TYPE_WIDGET == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_FOREGROUND; else if (VC_COMMAND_TYPE_SYSTEM_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM_BACKGROUND; else if (VC_COMMAND_TYPE_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_BACKGROUND; diff --git a/common/vc_command.h b/common/vc_command.h index b4eadab..b772774 100644 --- a/common/vc_command.h +++ b/common/vc_command.h @@ -77,9 +77,10 @@ typedef enum { typedef enum { VC_COMMAND_PRIORITY_SYSTEM = 1, VC_COMMAND_PRIORITY_EXCLUSIVE = 2, - VC_COMMAND_PRIORITY_FOREGROUND = 3, - VC_COMMAND_PRIORITY_SYSTEM_BACKGROUND = 4, - VC_COMMAND_PRIORITY_BACKGROUND = 5 + VC_COMMAND_PRIORITY_WIDGET = 3, + VC_COMMAND_PRIORITY_FOREGROUND = 4, + VC_COMMAND_PRIORITY_SYSTEM_BACKGROUND = 5, + VC_COMMAND_PRIORITY_BACKGROUND = 6 } vc_cmd_priority_e; int vc_cmd_set_id(vc_cmd_h vc_command, int id); diff --git a/server/vcd_client_data.c b/server/vcd_client_data.c index ff3e686..bbf0fa5 100644 --- a/server/vcd_client_data.c +++ b/server/vcd_client_data.c @@ -580,8 +580,8 @@ static vc_cmd_s* __command_copy(vc_cmd_s* src_cmd) if (VC_COMMAND_TYPE_SYSTEM == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM; else if (VC_COMMAND_TYPE_EXCLUSIVE == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_EXCLUSIVE; + else if (VC_COMMAND_TYPE_WIDGET == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_WIDGET; else if (VC_COMMAND_TYPE_FOREGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_FOREGROUND; - else if (VC_COMMAND_TYPE_WIDGET == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_FOREGROUND; else if (VC_COMMAND_TYPE_SYSTEM_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM_BACKGROUND; else if (VC_COMMAND_TYPE_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_BACKGROUND; diff --git a/server/vcd_server.c b/server/vcd_server.c index 2908e9f..9897853 100755 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -466,7 +466,7 @@ int vcd_send_result(vce_result_event_e event, int* result_id, int count, const c vc_info_parser_unset_result(vcd_client_manager_get_exclusive()); vcd_client_manager_set_result_text(all_result); - SLOG(LOG_INFO, TAG_VCD, "[Server] Event(%d), Text(%s) Nonfixed(%s) Msg(%s) Result count(%d)", + SLOG(LOG_INFO, TAG_VCD, "[Server] Event(%d), Text(%s) Nonfixed(%s) Msg(%s) Result count(%d)", event, all_result, non_fixed_result, msg, count); if (VCD_RECOGNITION_MODE_RESTART_AFTER_REJECT == vcd_client_get_recognition_mode()) { @@ -502,48 +502,6 @@ int vcd_send_result(vce_result_event_e event, int* result_id, int count, const c } } #if 1 - - int pid = vcd_client_widget_get_foreground_pid(); - if (-1 != pid) { - if (NULL != all_result) { - bool enable = false; - vcd_client_widget_get_asr_result_enabled(pid, &enable); - if (true == enable) { - SLOG(LOG_DEBUG, TAG_VCD, "[Server] Send ASR result to Widget client"); - bool is_consumed = false; - if (NULL != user_info) { - *user_info = 0x00; - } - if (0 != vcdc_send_asr_result(pid, event, all_result, VC_COMMAND_TYPE_WIDGET, &is_consumed)) { - SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to send asr result"); - } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Server] ASR result is consumed(%d)", is_consumed); - if (true == is_consumed) { - if (NULL != user_info) { - *user_info = 0x01; - SLOG(LOG_DEBUG, TAG_VCD, "[Server] Send whether ASR result is consumed or not (%d)", *user_info); - } - vcdc_send_show_tooltip(pid, false); - if (-1 != vcd_client_manager_get_pid()) { - /* Manager client is available */ - vc_info_parser_unset_result(false); - vc_info_parser_set_result(all_result, VC_RESULT_EVENT_RESULT_SUCCESS, msg, NULL, false); - if (0 != vcdc_send_result_to_manager(vcd_client_manager_get_pid(), VC_RESULT_TYPE_NOTIFICATION)) { - SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to send result"); - } - } - - vcd_client_manager_set_exclusive(false); - - vcd_config_set_service_state(VCD_STATE_READY); - vcdc_send_service_state(VCD_STATE_READY); - return VCD_ERROR_NONE; - } - } - } - } - } - /* if nlu_result is exist, Add command handle(is_action) into result list */ /* Normal result */ SLOG(LOG_DEBUG, TAG_VCD, "[Server] @ Get engine result @"); @@ -560,7 +518,7 @@ int vcd_send_result(vce_result_event_e event, int* result_id, int count, const c } /* priority filter */ - /* system > exclusive > foreground = widget > system_background > background */ + /* system > exclusive > widget > foreground > system_background > background */ int i = 0; int* filtered_id = (int*)calloc(count, sizeof(int)); if (!filtered_id) { @@ -593,6 +551,56 @@ int vcd_send_result(vce_result_event_e event, int* result_id, int count, const c } } + // ASR consume + if (top_priority >= VC_COMMAND_PRIORITY_WIDGET) { + int pid = vcd_client_widget_get_foreground_pid(); + if (-1 != pid) { + if (NULL != all_result) { + vc_info_parser_set_result(all_result, event, msg, NULL, false); + bool enable = false; + vcd_client_widget_get_asr_result_enabled(pid, &enable); + if (true == enable) { + SLOG(LOG_DEBUG, TAG_VCD, "[Server] Send ASR result to Widget client"); + bool is_consumed = false; + if (NULL != user_info) { + *user_info = 0x00; + } + if (0 != vcdc_send_asr_result(pid, event, all_result, VC_COMMAND_TYPE_WIDGET, &is_consumed)) { + SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to send asr result"); + } else { + SLOG(LOG_DEBUG, TAG_VCD, "[Server] ASR result is consumed(%d)", is_consumed); + if (true == is_consumed) { + if (NULL != user_info) { + *user_info = 0x01; + SLOG(LOG_DEBUG, TAG_VCD, "[Server] Send whether ASR result is consumed or not (%d)", *user_info); + } + vcdc_send_show_tooltip(pid, false); + if (-1 != vcd_client_manager_get_pid()) { + /* Manager client is available */ + vc_info_parser_unset_result(false); + vc_info_parser_set_result(all_result, VC_RESULT_EVENT_RESULT_SUCCESS, msg, NULL, false); + if (0 != vcdc_send_result_to_manager(vcd_client_manager_get_pid(), VC_RESULT_TYPE_NOTIFICATION)) { + SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to send result"); + } + } + + vcd_client_manager_set_exclusive(false); + + vcd_config_set_service_state(VCD_STATE_READY); + vcdc_send_service_state(VCD_STATE_READY); + vc_cmd_list_destroy(vc_cmd_list, true); + if (NULL != filtered_id) { + free(filtered_id); + filtered_id = NULL; + } + return VCD_ERROR_NONE; + } + } + } + } + } + } + int is_action = 0; for (i = 0; i < filtered_count; i++) { SLOG(LOG_INFO, TAG_VCD, "[Server] [%d] Filtered Result id(%d)", i, filtered_id[i]); -- 2.7.4 From 673b0f065e3f5bf6a992b195996bdaa016e0256d Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Fri, 15 Dec 2017 15:23:53 +0900 Subject: [PATCH 09/16] Fix the size of app id Change-Id: If001031ea058f1c45aec7cfeae58bb37549b18d3 Signed-off-by: sooyeon.kim (cherry picked from commit ca3743e7a7348edd31d85e16ae70bd6f51c0708b) --- client/vc.c | 4 ++-- client/vc_mgr.c | 4 ++-- client/vc_widget.c | 4 ++-- server/vcd_client_data.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/vc.c b/client/vc.c index c89e7f9..87ffa77 100644 --- a/client/vc.c +++ b/client/vc.c @@ -512,8 +512,8 @@ static Eina_Bool __vc_connect_daemon(void *data) g_focus_in_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, __focus_changed_cb, NULL); g_focus_out_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, __focus_changed_cb, NULL); - char appid[255] = {'\0',}; - aul_app_get_appid_bypid(getpid(), appid, sizeof(appid)); + char appid[1024] = {'\0',}; + aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1); int status = aul_app_get_status(appid); if (STATUS_FOCUS == status) { diff --git a/client/vc_mgr.c b/client/vc_mgr.c index f29f08c..72e324f 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -2843,8 +2843,8 @@ static bool __vc_mgr_check_demandable_client(int pid) return false; } - char appid[128] = {'\0', }; - aul_app_get_appid_bypid(pid, appid, sizeof(appid)); + char appid[1024] = {'\0', }; + aul_app_get_appid_bypid(pid, appid, sizeof(appid) - 1); if (0 >= strlen(appid)) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No appid"); diff --git a/client/vc_widget.c b/client/vc_widget.c index d6bcc47..4b4486f 100644 --- a/client/vc_widget.c +++ b/client/vc_widget.c @@ -349,8 +349,8 @@ static Eina_Bool __vc_widget_connect_daemon(void *data) if (NULL == g_focus_out_handler) g_focus_out_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, __focus_changed_cb, NULL); - char appid[255] = {'\0',}; - aul_app_get_appid_bypid(getpid(), appid, sizeof(appid)); + char appid[1024] = {'\0',}; + aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1); int status = aul_app_get_status(appid); if (status == STATUS_FOCUS) { diff --git a/server/vcd_client_data.c b/server/vcd_client_data.c index bbf0fa5..56b95b6 100644 --- a/server/vcd_client_data.c +++ b/server/vcd_client_data.c @@ -164,8 +164,8 @@ bool vcd_client_manager_check_demandable_client(int pid) } /* Check demandable appid */ - char appid[128] = {0, }; - aul_app_get_appid_bypid(pid, appid, sizeof(appid)); + char appid[1024] = {0, }; + aul_app_get_appid_bypid(pid, appid, sizeof(appid) - 1); if (0 < strlen(appid)) { SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] %s(%d) requests start", appid, pid); -- 2.7.4 From b7d9fb5ce30b2f1c5460a866bcac1f2936ff73c4 Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Fri, 22 Dec 2017 20:55:42 +0900 Subject: [PATCH 10/16] Add state check logic in vc_get_result Change-Id: I0dd52a857b2238116d3a2595926203e36201f15b Signed-off-by: Suyeon Hwang (cherry picked from commit 234291924f4c92e43863101be4065b57d5d75d3f) --- client/vc.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/client/vc.c b/client/vc.c index c89e7f9..d9a5337 100644 --- a/client/vc.c +++ b/client/vc.c @@ -1703,6 +1703,20 @@ int vc_get_result(vc_result_cb callback, void* user_data) SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result"); + vc_state_e state; + if (0 != vc_client_get_client_state(g_vc, &state)) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available"); + SLOG(LOG_DEBUG, TAG_VCC, "@@@"); + return VC_ERROR_INVALID_STATE; + } + + /* check state */ + if (state != VC_STATE_READY) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); + SLOG(LOG_DEBUG, TAG_VCC, "@@@"); + return VC_ERROR_INVALID_STATE; + } + if (NULL == callback) { SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL"); return VC_ERROR_INVALID_PARAMETER; -- 2.7.4 From cdd20db5453cc129bf3e8a84a05c405a7965de4c Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Tue, 9 Jan 2018 11:46:31 +0900 Subject: [PATCH 11/16] Change set_private_data to be async Change-Id: Ic94ddae4949d77f91a5fe9c0de227129790b0019 Signed-off-by: Suyeon Hwang --- client/vc_mgr_dbus.c | 45 ++++++++++----------------------------------- server/vcd_dbus.c | 47 ++++++++++++----------------------------------- server/vcd_engine_agent.c | 4 ++-- 3 files changed, 24 insertions(+), 72 deletions(-) diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index d08e9e9..fd96dc3 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -288,7 +288,7 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd char* key = NULL; char* data = NULL; - dbus_message_get_args(msg, &err, + dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &pid, DBUS_TYPE_STRING, &key, DBUS_TYPE_STRING, &data, @@ -1438,44 +1438,19 @@ int vc_mgr_dbus_request_set_private_data(int pid, const char* key, const char* d DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID); - DBusError err; - dbus_error_init(&err); - - DBusMessage* result_msg; - int result = VC_ERROR_OPERATION_FAILED; - - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); - dbus_message_unref(msg); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Dbus Error (%s)", err.message); - dbus_error_free(&err); - } - - if (NULL != result_msg) { - dbus_message_get_args(result_msg, &err, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_INVALID); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "@@ Get arguments error (%s)", err.message); - dbus_error_free(&err); - result = VC_ERROR_OPERATION_FAILED; - } - dbus_message_unref(result_msg); + dbus_message_set_no_reply(msg, TRUE); - if (0 == result) { - SLOG(LOG_DEBUG, TAG_VCM, "@@ vc set private data : result = %d", result); - } else { - SLOG(LOG_ERROR, TAG_VCM, "@@ vc set private data : result = %d", result); - } + /* send the message and flush the connection */ + if (1 != dbus_connection_send(g_m_conn_sender, msg, NULL)) { + SLOG(LOG_ERROR, TAG_VCM, "[Dbus ERROR] Fail to send private data"); } else { - SLOG(LOG_DEBUG, TAG_VCM, "@@ Result Message is NULL"); - vc_mgr_dbus_reconnect(); - result = VC_ERROR_TIMED_OUT; + SLOG(LOG_ERROR, TAG_VCM, "[Dbus] Success to send private data"); + dbus_connection_flush(g_m_conn_sender); } - return result; + dbus_message_unref(msg); + + return VC_ERROR_NONE; } int vc_mgr_dbus_request_get_private_data(int pid, const char* key, char** data) diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index 72cad70..21ed6d7 100755 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -247,7 +247,7 @@ int vcdc_send_set_volume(int manger_pid, float volume) SLOG(LOG_DEBUG, TAG_VCD, "@@ Send set volume : pid(%d), volume(%f)", manger_pid, volume); g_volume_count = 0; } - + dbus_connection_flush(g_conn_sender); g_volume_count++; @@ -820,47 +820,24 @@ int vcdc_send_request_set_private_data(int pid, const char* key, const char* dat } dbus_message_append_args(msg, - DBUS_TYPE_INT32, &pid, + DBUS_TYPE_INT32, &pid, DBUS_TYPE_STRING, &key, DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID); - DBusError err; - dbus_error_init(&err); - - DBusMessage* result_msg; - int result = -1; - - result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); - dbus_message_unref(msg); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] %s", err.message); - if (NULL != err.name) { - if (!strcmp(err.name, DBUS_ERROR_SERVICE_UNKNOWN)) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Unknown service. Client is not available"); - dbus_error_free(&err); - return 0; - } - } - dbus_error_free(&err); - } - - if (NULL != result_msg) { - dbus_message_get_args(result_msg, &err, DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus] Get arguments error (%s)", err.message); - dbus_error_free(&err); - result = VCD_ERROR_OPERATION_FAILED; - } + dbus_message_set_no_reply(msg, TRUE); - dbus_message_unref(result_msg); + if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { + SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send request set private data"); + return VCD_ERROR_OPERATION_FAILED; } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result message is NULL. Client is not available"); + SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send request set private data"); + dbus_connection_flush(g_conn_sender); } - return result; + dbus_message_unref(msg); + + return VCD_ERROR_NONE; } int vcdc_send_request_get_private_data(int pid, const char* key, char** data) @@ -877,7 +854,7 @@ int vcdc_send_request_get_private_data(int pid, const char* key, char** data) } dbus_message_append_args(msg, - DBUS_TYPE_INT32, &pid, + DBUS_TYPE_INT32, &pid, DBUS_TYPE_STRING, &key, DBUS_TYPE_INVALID); diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 49b9f7f..1f4c585 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -734,7 +734,7 @@ int vcd_engine_agent_get_audio_type(char** audio_type) int vcd_engine_agent_set_private_data(const char* key, const char* data) { - SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request set private data"); + SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request set private data, key(%s), data(%s)", key, data); vcdc_send_request_set_private_data(vcd_client_manager_get_pid(), key, data); return VCD_ERROR_NONE; @@ -742,7 +742,7 @@ int vcd_engine_agent_set_private_data(const char* key, const char* data) int vcd_engine_agent_get_private_data(const char* key, char** data) { - SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request get private data"); + SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request get private data, key(%s)", key); vcdc_send_request_get_private_data(vcd_client_manager_get_pid(), key, data); return VCD_ERROR_NONE; -- 2.7.4 From 61b276d9bcce9758cbae68ad60e96b4997540a9f Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Tue, 9 Jan 2018 11:53:03 +0900 Subject: [PATCH 12/16] Fix memory leaks of set_private_data Change-Id: Ief58b5b30a825033b5e714652c3edd460f9748a4 Signed-off-by: Suyeon Hwang --- client/vc_mgr_dbus.c | 2 ++ server/vcd_dbus.c | 1 + 2 files changed, 3 insertions(+) diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index fd96dc3..26124cd 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -1443,6 +1443,8 @@ int vc_mgr_dbus_request_set_private_data(int pid, const char* key, const char* d /* send the message and flush the connection */ if (1 != dbus_connection_send(g_m_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCM, "[Dbus ERROR] Fail to send private data"); + dbus_message_unref(msg); + return VC_ERROR_OPERATION_FAILED; } else { SLOG(LOG_ERROR, TAG_VCM, "[Dbus] Success to send private data"); dbus_connection_flush(g_m_conn_sender); diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index 21ed6d7..8091d79 100755 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -829,6 +829,7 @@ int vcdc_send_request_set_private_data(int pid, const char* key, const char* dat if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send request set private data"); + dbus_message_unref(msg); return VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send request set private data"); -- 2.7.4 From c9db4e87685388b6c35e8c824f906957a3657218 Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Wed, 3 Jan 2018 16:35:21 +0900 Subject: [PATCH 13/16] Fix to check whether handle is valid in connect daemon Change-Id: If15a3be995711242abe82eb0ded86d0d1d1be659 Signed-off-by: sooyeon.kim (cherry picked from commit 45ae7486778042c430ac66c7d6275ab0358c34cd) --- client/vc.c | 100 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 54 insertions(+), 46 deletions(-) diff --git a/client/vc.c b/client/vc.c index bf61429..9d0248c 100644 --- a/client/vc.c +++ b/client/vc.c @@ -484,67 +484,75 @@ static Eina_Bool __vc_connect_daemon(void *data) if (0 != ret) SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); - ret = vc_dbus_request_initialize(g_vc->handle, &mgr_pid, &service_state, &g_daemon_pid); - if (VC_ERROR_ENGINE_NOT_FOUND == ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret)); + /* check handle */ + if (true == vc_client_is_valid(g_vc)) { + SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] g_vc is valid"); - vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND); - ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc); + ret = vc_dbus_request_initialize(g_vc->handle, &mgr_pid, &service_state, &g_daemon_pid); + if (VC_ERROR_ENGINE_NOT_FOUND == ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret)); - SLOG(LOG_DEBUG, TAG_VCC, "@@@"); - return EINA_FALSE; + vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND); + ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc); - } else if (0 != ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); + SLOG(LOG_DEBUG, TAG_VCC, "@@@"); + return EINA_FALSE; - vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT); - ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc); + } else if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); - SLOG(LOG_DEBUG, TAG_VCC, "@@@"); - return EINA_FALSE; - } else { - /* Success to connect */ - } + vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT); + ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc); - /* Set service state */ - vc_client_set_service_state(g_vc, (vc_service_state_e)service_state); + SLOG(LOG_DEBUG, TAG_VCC, "@@@"); + return EINA_FALSE; + } else { + /* Success to connect */ + } - g_focus_in_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, __focus_changed_cb, NULL); - g_focus_out_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, __focus_changed_cb, NULL); + /* Set service state */ + vc_client_set_service_state(g_vc, (vc_service_state_e)service_state); - char appid[1024] = {'\0',}; - aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1); + g_focus_in_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, __focus_changed_cb, NULL); + g_focus_out_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, __focus_changed_cb, NULL); - int status = aul_app_get_status(appid); - if (STATUS_FOCUS == status) { - SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground"); - ret = vc_dbus_set_foreground(getpid(), true); - if (0 != ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret); - } + char appid[1024] = {'\0',}; + aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1); - ret = vc_client_set_is_foreground(g_vc, true); - if (0 != ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret); - } + int status = aul_app_get_status(appid); + if (STATUS_FOCUS == status) { + SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground"); + ret = vc_dbus_set_foreground(getpid(), true); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret); + } - /* set authority valid */ - vc_auth_state_e state = VC_AUTH_STATE_NONE; - if (0 != vc_client_get_auth_state(g_vc, &state)) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); - } - if (VC_AUTH_STATE_INVALID == state) { - vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID); + ret = vc_client_set_is_foreground(g_vc, true); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret); + } - /* notify auth changed cb */ - ecore_idler_add(__notify_auth_changed_cb, NULL); + /* set authority valid */ + vc_auth_state_e state = VC_AUTH_STATE_NONE; + if (0 != vc_client_get_auth_state(g_vc, &state)) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); + } + if (VC_AUTH_STATE_INVALID == state) { + vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID); + + /* notify auth changed cb */ + ecore_idler_add(__notify_auth_changed_cb, NULL); + } } - } - vc_client_set_client_state(g_vc, VC_STATE_READY); - ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc); + vc_client_set_client_state(g_vc, VC_STATE_READY); + ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc); - vc_client_set_mgr_pid(g_vc, mgr_pid); + vc_client_set_mgr_pid(g_vc, mgr_pid); + } else { + SLOG(LOG_ERROR, TAG_VCC, "[Not ERROR] g_vc is not valid. It is destroyed."); + return EINA_FALSE; + } SLOG(LOG_DEBUG, TAG_VCC, "@@@"); -- 2.7.4 From 04db28d264c560257bba8c9e834809022f2391b5 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Fri, 5 Jan 2018 08:27:23 +0900 Subject: [PATCH 14/16] Start recording when widget finalize Change-Id: Ifd2e55fca66daa235d43cc995ecc30419f2f7652 Signed-off-by: Wonnam Jang (cherry picked from commit 9d6162c6d676bc3f674143ec7f6c979df2680423) --- server/vcd_client_data.c | 28 ++++++++++++++++++++++++++++ server/vcd_client_data.h | 5 +++++ server/vcd_server.c | 24 ++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/server/vcd_client_data.c b/server/vcd_client_data.c index 56b95b6..c18b8b2 100644 --- a/server/vcd_client_data.c +++ b/server/vcd_client_data.c @@ -39,6 +39,8 @@ static GSList* g_demandable_client = NULL; static bool g_silence_detection; static vcd_recognition_mode_e g_recognition_mode; static char* g_result_text = NULL; +static bool g_is_waiting_recording = false; +static int g_waiting_recording_pid = -1; /* Function definitions */ widget_info_s* __widget_get_element(int pid); @@ -1401,6 +1403,32 @@ int vcd_client_widget_get_asr_result_enabled(int pid, bool* enable) return 0; } +int vcd_client_widget_set_waiting_for_recording(int pid, bool waiting) +{ + + if (TRUE == waiting && pid != vcd_client_widget_get_foreground_pid()) { + SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT forground pid", pid); + return -1; + } + + g_is_waiting_recording = waiting; + g_waiting_recording_pid = pid; + SLOG(LOG_INFO, TAG_VCD, "[INFO] Success to set waiting for recording, pid(%d), waiting(%d)", pid, waiting); + return 0; +} + +int vcd_client_widget_get_waiting_for_recording(int pid, bool* waiting) +{ + if (pid != g_waiting_recording_pid) { + SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT waiting pid", pid); + return -1; + } + + *waiting = g_is_waiting_recording; + SLOG(LOG_INFO, TAG_VCD, "[INFO] Success to get waiting for recording, waiting(%d)", *waiting); + return 0; +} + void vcd_client_update_foreground_pid() { int tmp_pid = VC_RUNTIME_INFO_NO_FOREGROUND; diff --git a/server/vcd_client_data.h b/server/vcd_client_data.h index d38a8ba..ae57883 100644 --- a/server/vcd_client_data.h +++ b/server/vcd_client_data.h @@ -174,6 +174,11 @@ int vcd_client_widget_set_asr_result_enabled(int pid, bool enable); int vcd_client_widget_get_asr_result_enabled(int pid, bool* enable); +int vcd_client_widget_set_waiting_for_recording(int pid, bool waiting); + +int vcd_client_widget_get_waiting_for_recording(int pid, bool* waiting); + + #ifdef __cplusplus } #endif diff --git a/server/vcd_server.c b/server/vcd_server.c index 9897853..d6b6155 100755 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -1076,7 +1076,7 @@ void vcd_finalize() static Eina_Bool __finalize_quit_ecore_loop(void *data) { - SLOG(LOG_DEBUG, TAG_VCD, "[Server] quit ecore main loop"); + SLOG(LOG_ERROR, TAG_VCD, "[Server] quit ecore main loop"); ecore_main_loop_quit(); return EINA_FALSE; } @@ -1554,6 +1554,7 @@ int vcd_server_mgr_start(vcd_recognition_mode_e recognition_mode, bool exclusive SLOG(LOG_DEBUG, TAG_VCD, "[Server] Manager is NOT available."); return VCD_ERROR_OPERATION_FAILED; } + vcd_client_widget_set_waiting_for_recording(-1, false); SLOG(LOG_DEBUG, TAG_VCD, "[Server] set recognition mode = %d", recognition_mode); vcd_client_set_recognition_mode(recognition_mode); @@ -1566,6 +1567,7 @@ int vcd_server_mgr_start(vcd_recognition_mode_e recognition_mode, bool exclusive if (-1 != pid) { SLOG(LOG_INFO, TAG_VCD, "[Server] Request tooltip show and widget command"); ecore_timer_add(0, __vcd_request_show_tooltip, (void*)true); + vcd_client_widget_set_waiting_for_recording(pid, true); return 0; } } @@ -2193,6 +2195,14 @@ int vcd_server_widget_initialize(int pid) return VCD_ERROR_NONE; } +static void __vcd_server_widget_start_recording(void *data) +{ + if (0 != __start_internal_recognition()) { + SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to start recongition"); + } + vcd_client_widget_set_waiting_for_recording(-1, false); +} + int vcd_server_widget_finalize(int pid) { /* check if pid is valid */ @@ -2207,10 +2217,20 @@ int vcd_server_widget_finalize(int pid) } if (0 == vcd_client_get_ref_count()) { - SLOG(LOG_DEBUG, TAG_VCD, "[Server] connected client list is empty"); + SLOG(LOG_ERROR, TAG_VCD, "[Server] connected client list is empty"); ecore_timer_add(0, __finalize_quit_ecore_loop, NULL); + return 0; + } + + bool is_waiting = false; + if (0 != vcd_client_widget_get_waiting_for_recording(pid, &is_waiting)) { + SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to get waiting to recording"); } + if (true == is_waiting) { + SLOG(LOG_INFO, TAG_VCD, "[Server INFO] invoke to start recording"); + ecore_main_loop_thread_safe_call_async(__vcd_server_widget_start_recording, NULL); + } return VCD_ERROR_NONE; } -- 2.7.4 From b60ae6f73b3e8433b50bb042816d0415b25b2964 Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Tue, 14 Nov 2017 19:19:44 +0900 Subject: [PATCH 15/16] Use critical section when configuration file is reached Change-Id: I22965b387df9469f58e3702e80f1f370a407f651 Signed-off-by: Suyeon Hwang (cherry picked from commit 3f78cb87e0175fa040c6e042b1951d6efa171ed5) --- common/vc_config_mgr.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/common/vc_config_mgr.c b/common/vc_config_mgr.c index c8dc9de..77bd3a2 100755 --- a/common/vc_config_mgr.c +++ b/common/vc_config_mgr.c @@ -58,6 +58,7 @@ static Ecore_Fd_Handler* g_fd_handler_lang = NULL; static int g_fd_lang; static int g_wd_lang; +static pthread_mutex_t vc_config_mgr_mutex = PTHREAD_MUTEX_INITIALIZER; int __vc_config_mgr_print_engine_info(); @@ -483,6 +484,13 @@ int vc_config_mgr_initialize(int uid) int* get_uid; vc_config_client_s* temp_client = NULL; + if (0 != pthread_mutex_init(&vc_config_mgr_mutex, NULL)) { + SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to initialize vc_config_mgr_mutex."); + } + + SLOG(LOG_INFO, vc_config_tag(), "[WARNING] Enter critical section"); + pthread_mutex_lock(&vc_config_mgr_mutex); + if (0 < g_slist_length(g_config_client_list)) { /* Check uid */ iter = g_slist_nth(g_config_client_list, 0); @@ -492,6 +500,8 @@ int vc_config_mgr_initialize(int uid) if (uid == *get_uid) { SLOG(LOG_WARN, vc_config_tag(), "[CONFIG] uid(%d) has already registered", uid); + pthread_mutex_unlock(&vc_config_mgr_mutex); + SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section"); return 0; } @@ -501,6 +511,7 @@ int vc_config_mgr_initialize(int uid) temp_client = (vc_config_client_s*)calloc(1, sizeof(vc_config_client_s)); if (NULL == temp_client) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to allocate memory"); + pthread_mutex_unlock(&vc_config_mgr_mutex); return VC_ERROR_OUT_OF_MEMORY; } @@ -512,6 +523,8 @@ int vc_config_mgr_initialize(int uid) SLOG(LOG_WARN, vc_config_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid); __vc_config_mgr_print_client_info(); + pthread_mutex_unlock(&vc_config_mgr_mutex); + SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section"); return 0; } @@ -524,6 +537,7 @@ int vc_config_mgr_initialize(int uid) if (0 != access(VC_CONFIG_BASE, F_OK)) { if (0 != mkdir(VC_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to make directory : %s", VC_CONFIG_BASE); + pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } else { SLOG(LOG_DEBUG, vc_config_tag(), "Success to make directory : %s", VC_CONFIG_BASE); @@ -532,6 +546,7 @@ int vc_config_mgr_initialize(int uid) if (0 != access(VC_RUNTIME_INFO_ROOT, F_OK)) { if (0 != mkdir(VC_RUNTIME_INFO_ROOT, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to make directory : %s", VC_RUNTIME_INFO_ROOT); + pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } else { SLOG(LOG_DEBUG, vc_config_tag(), "Success to make directory : %s", VC_RUNTIME_INFO_ROOT); @@ -581,11 +596,13 @@ int vc_config_mgr_initialize(int uid) if (0 != vc_parser_load_config(&g_config_info)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to parse configure information"); + pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } if (0 != __vc_config_mgr_check_engine_is_valid(g_config_info->engine_id)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to get default engine"); + pthread_mutex_unlock(&vc_config_mgr_mutex); return VC_CONFIG_ERROR_ENGINE_NOT_FOUND; } @@ -598,6 +615,7 @@ int vc_config_mgr_initialize(int uid) char* tmp_language; if (0 != __vc_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to select language"); + pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } @@ -610,6 +628,7 @@ int vc_config_mgr_initialize(int uid) if (0 != vc_parser_set_language(tmp_language)) { free(tmp_language); SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to save config"); + pthread_mutex_unlock(&vc_config_mgr_mutex); return -1; } @@ -633,6 +652,7 @@ int vc_config_mgr_initialize(int uid) temp_client = (vc_config_client_s*)calloc(1, sizeof(vc_config_client_s)); if (NULL == temp_client) { SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to allocate memory"); + pthread_mutex_unlock(&vc_config_mgr_mutex); return VC_ERROR_OUT_OF_MEMORY; } @@ -645,6 +665,8 @@ int vc_config_mgr_initialize(int uid) __vc_config_mgr_print_client_info(); + pthread_mutex_unlock(&vc_config_mgr_mutex); + SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section"); return 0; } @@ -653,6 +675,9 @@ int vc_config_mgr_finalize(int uid) GSList *iter = NULL; vc_config_client_s* temp_client = NULL; + SLOG(LOG_INFO, vc_config_tag(), "[WARNING] Enter critical section"); + pthread_mutex_lock(&vc_config_mgr_mutex); + if (0 < g_slist_length(g_config_client_list)) { /* Check uid */ iter = g_slist_nth(g_config_client_list, 0); @@ -674,6 +699,12 @@ int vc_config_mgr_finalize(int uid) if (0 < g_slist_length(g_config_client_list)) { SLOG(LOG_DEBUG, vc_config_tag(), "Client count (%d)", g_slist_length(g_config_client_list)); + pthread_mutex_unlock(&vc_config_mgr_mutex); + + if (0 != pthread_mutex_destroy(&vc_config_mgr_mutex)) { + SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to destroy vc_config_mgr_mutex."); + } + return 0; } @@ -701,6 +732,13 @@ int vc_config_mgr_finalize(int uid) vc_parser_unload_config(g_config_info); + pthread_mutex_unlock(&vc_config_mgr_mutex); + SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section"); + + if (0 != pthread_mutex_destroy(&vc_config_mgr_mutex)) { + SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to destroy vc_config_mgr_mutex."); + } + SLOG(LOG_DEBUG, vc_config_tag(), "[Success] Finalize config"); return 0; @@ -944,7 +982,7 @@ int vc_config_mgr_get_language_list(vc_supported_language_cb callback, void* use /*Get handle data from list*/ lang = iter_lang->data; - SLOG(LOG_DEBUG, vc_config_tag(), " %s", lang); + SLOG(LOG_INFO, vc_config_tag(), "lang(%s)", lang); if (NULL != lang) { if (false == callback(lang, user_data)) break; -- 2.7.4 From a93a57b7a9379d81a2c33e7b44143df4fa92f28b Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Mon, 15 Jan 2018 19:29:59 +0900 Subject: [PATCH 16/16] Remove trailing whitespaces Change-Id: I52292cd036c0920210e0a9cac77901487545bf0e Signed-off-by: Jihoon Kim --- client/vc_mgr.c | 4 ++-- client/vc_mgr_client.c | 4 ++-- server/vcd_recorder.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/vc_mgr.c b/client/vc_mgr.c index 72e324f..be3cdb4 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -1999,7 +1999,7 @@ static void __vc_mgr_notify_all_result(vc_result_type_e result_type) vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command(g_vc_m)); - SLOG(LOG_INFO, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)", + SLOG(LOG_INFO, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)", result_type, temp_text, event, temp_message); vc_cmd_print_list(vc_cmd_list); @@ -2700,7 +2700,7 @@ int __vc_mgr_cb_private_data_requested(const char* key, char** data) int ret = -1; vc_mgr_client_get_private_data_requested_cb(g_vc_m, &callback, &user_data); - + if (NULL != callback) { vc_mgr_client_use_callback(g_vc_m); ret = callback(key, data, user_data); diff --git a/client/vc_mgr_client.c b/client/vc_mgr_client.c index 94be682..985f460 100644 --- a/client/vc_mgr_client.c +++ b/client/vc_mgr_client.c @@ -250,8 +250,8 @@ int vc_mgr_client_destroy(vc_h vc) free(data->err_msg); } - free(data); - free(vc); + free(data); + free(vc); data = NULL; vc = NULL; diff --git a/server/vcd_recorder.c b/server/vcd_recorder.c index aab017a..65b1816 100644 --- a/server/vcd_recorder.c +++ b/server/vcd_recorder.c @@ -939,7 +939,7 @@ int vcd_recorder_stop() break; } } - if (NULL != g_current_audio_type && + if (NULL != g_current_audio_type && (!strncmp(g_current_audio_type, VCE_AUDIO_ID_BLUETOOTH, sizeof(VCE_AUDIO_ID_BLUETOOTH)) || !strncmp(g_current_audio_type, VCE_AUDIO_ID_WIFI, sizeof(VCE_AUDIO_ID_WIFI)))) { SLOG(LOG_DEBUG, TAG_VCD, "[DEBUG] Recorder reset to NONE"); @@ -954,7 +954,7 @@ int vcd_recorder_stop() } else if (0 == strncmp(VCE_AUDIO_ID_WIFI, g_current_audio_type, strlen(VCE_AUDIO_ID_WIFI))) { #ifdef TV_MSF_WIFI_MODE UnRegisterMSFAudioCallback(); - if (NULL != g_current_audio_type && + if (NULL != g_current_audio_type && (!strncmp(g_current_audio_type, VCE_AUDIO_ID_BLUETOOTH, sizeof(VCE_AUDIO_ID_BLUETOOTH)) || !strncmp(g_current_audio_type, VCE_AUDIO_ID_WIFI, sizeof(VCE_AUDIO_ID_WIFI)))) { SLOG(LOG_DEBUG, TAG_VCD, "[DEBUG] Recorder reset to NONE"); -- 2.7.4