From f38527d857a2ae505ea6988d9a94642b0188d358 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Tue, 18 Feb 2020 13:37:05 +0900 Subject: [PATCH 01/16] Added no-repeat code for privilege Change-Id: Id53d6203e1c3b25d94b35c19061b25a689675a90 Signed-off-by: sungrae jo --- client/vc.c | 39 +++++++++++++++++++++++---------------- client/vc_mgr.c | 3 +++ common/vc_command.c | 5 ++++- server/vce.c | 40 ++++++++++++++++++++++++---------------- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/client/vc.c b/client/vc.c index 7ee1667..cd57765 100644 --- a/client/vc.c +++ b/client/vc.c @@ -54,6 +54,7 @@ static vc_h g_vc = NULL; static int g_daemon_pid = 0; static int g_feature_enabled = -1; +static bool g_privilege_allowed = false; static bool g_backup = false; static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -146,27 +147,33 @@ static void __check_privilege_deinitialize() static int __vc_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); - bool ret = true; - ret = __check_privilege_initialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed"); //LCOV_EXCL_LINE - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; - } + if (false == g_privilege_allowed) { + bool ret = true; + ret = __check_privilege_initialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed"); //LCOV_EXCL_LINE + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } - char uid[16]; - snprintf(uid, 16, "%d", getuid()); - ret = true; - ret = __check_privilege(uid, VC_PRIVILEGE); - __check_privilege_deinitialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied"); - pthread_mutex_unlock(&g_cynara_mutex); - return VC_ERROR_PERMISSION_DENIED; + char uid[16]; + snprintf(uid, 16, "%d", getuid()); + ret = true; + ret = __check_privilege(uid, VC_PRIVILEGE); + __check_privilege_deinitialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied"); + pthread_mutex_unlock(&g_cynara_mutex); + return VC_ERROR_PERMISSION_DENIED; + } } + g_privilege_allowed = true; pthread_mutex_unlock(&g_cynara_mutex); return VC_ERROR_NONE; } diff --git a/client/vc_mgr.c b/client/vc_mgr.c index b20079e..eb6c3b8 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -211,6 +211,9 @@ static void __check_privilege_deinitialize() static int __vc_mgr_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); if (false == g_privilege_allowed) { diff --git a/common/vc_command.c b/common/vc_command.c index 2446284..0d22bc5 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -34,7 +34,7 @@ #include "voice_control_key_defines.h" static int g_feature_enabled = -1; -static bool g_privilege_allowed = false; +static bool g_privilege_allowed = false; static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; static cynara *p_cynara = NULL; @@ -135,6 +135,9 @@ static void __check_privilege_deinitialize() static int __vc_cmd_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); if (false == g_privilege_allowed) { diff --git a/server/vce.c b/server/vce.c index e9302f3..970f521 100644 --- a/server/vce.c +++ b/server/vce.c @@ -26,6 +26,8 @@ #include "vce.h" static int g_feature_enabled = -1; +static bool g_privilege_allowed = false; + static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; static cynara *p_cynara = NULL; @@ -111,27 +113,33 @@ static void __check_privilege_deinitialize() static int __vce_check_privilege() { + if (true == g_privilege_allowed) + return VC_ERROR_NONE; + pthread_mutex_lock(&g_cynara_mutex); - bool ret = true; - ret = __check_privilege_initialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] privilege initialize is failed"); - pthread_mutex_unlock(&g_cynara_mutex); - return VCE_ERROR_PERMISSION_DENIED; - } + if (false == g_privilege_allowed) { + bool ret = true; + ret = __check_privilege_initialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] privilege initialize is failed"); + pthread_mutex_unlock(&g_cynara_mutex); + return VCE_ERROR_PERMISSION_DENIED; + } - char uid[16]; - snprintf(uid, 16, "%d", getuid()); - ret = true; - ret = __check_privilege(uid, VC_PRIVILEGE); - __check_privilege_deinitialize(); - if (false == ret) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Permission is denied"); - pthread_mutex_unlock(&g_cynara_mutex); - return VCE_ERROR_PERMISSION_DENIED; + char uid[16]; + snprintf(uid, 16, "%d", getuid()); + ret = true; + ret = __check_privilege(uid, VC_PRIVILEGE); + __check_privilege_deinitialize(); + if (false == ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Permission is denied"); + pthread_mutex_unlock(&g_cynara_mutex); + return VCE_ERROR_PERMISSION_DENIED; + } } + g_privilege_allowed = true; pthread_mutex_unlock(&g_cynara_mutex); return VCE_ERROR_NONE; } -- 2.7.4 From 375b93bf6a29ff6572cc948b0877d814c8019fc9 Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Tue, 18 Feb 2020 14:33:36 +0900 Subject: [PATCH 02/16] Add a null checker Change-Id: If9508e574b0466d0f46217a9a3cc26d552dbde0d Signed-off-by: sooyeon.kim --- common/vc_json_parser.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/vc_json_parser.c b/common/vc_json_parser.c index 65957db..d6be245 100644 --- a/common/vc_json_parser.c +++ b/common/vc_json_parser.c @@ -184,7 +184,9 @@ static int __vc_json_set_commands(JsonObject *root_obj, int type, char* invocati cmd->domain = temp; temp_text = json_object_get_string_member(object, "cmd"); - cmd->command = strdup(temp_text); + if (NULL != temp_text) + cmd->command = strdup(temp_text); + if (NULL == cmd->command) { SLOG(LOG_ERROR, vc_json_tag(), "[ERROR] Fail to allocate memory"); free(temp_type); -- 2.7.4 From 2ce48a5f8010ed55dcd963c95f00b97ed0f57ebe Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Wed, 19 Feb 2020 13:28:54 +0900 Subject: [PATCH 03/16] Using vc_cmd_destory in remove_all_foreach function. Change-Id: I51780aadfd55a5ef36626f0ac56ab2f6ccc8e93d Signed-off-by: sungrae jo --- common/vc_command.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/common/vc_command.c b/common/vc_command.c index 0d22bc5..8ff7138 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -340,24 +340,9 @@ static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data) temp = data; if (temp) { SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp); - if (temp->command) - free(temp->command); - temp->command = NULL; - if (temp->parameter) - free(temp->parameter); - temp->parameter = NULL; - if (temp->appid) - free(temp->appid); - temp->appid = NULL; - if (temp->invocation_name) - free(temp->invocation_name); - temp->invocation_name = NULL; - if (temp->fixed) - free(temp->fixed); - temp->fixed = NULL; - free(temp); - } - temp = NULL; + vc_cmd_destroy((vc_cmd_h)temp); + temp = NULL; + } return; } -- 2.7.4 From c76b16ebf05b886983371bfbaf41918aaccb4959 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Thu, 20 Feb 2020 11:07:46 +0900 Subject: [PATCH 04/16] Fixed vce option callback in vce_main Change-Id: Ica044b049d524c4e5ee1597428040e1acc81a58f Signed-off-by: sungrae jo --- include/vce.h | 2 +- server/vcd_engine_agent.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/vce.h b/include/vce.h index b73fabd..31747a0 100644 --- a/include/vce.h +++ b/include/vce.h @@ -627,7 +627,7 @@ typedef int (*vce_tts_audio_format_request_cb)(int* rate, int* channel, int* aud * @brief A structure for the VC engine functions. * @details This structure contains essential callback functions for operating VC engine. * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif - * @remarks These functions ar mandatory for operating VC engine. Therefore, all functions MUST be implemented. + * @remarks You must register all callbacks except optional callbacks for operating VC engine. */ typedef struct { int version; /**< Version */ diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 345959f..4750284 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -231,10 +231,11 @@ static int __internal_get_engine_info(vce_request_callback_s* callback) g_dynamic_engine.callbacks->process_list_event = callback->process_list_event; g_dynamic_engine.callbacks->process_haptic_event = callback->process_haptic_event; - g_dynamic_engine.callbacks->private_data_set = NULL; - g_dynamic_engine.callbacks->private_data_request = NULL; - g_dynamic_engine.callbacks->nlu_base_info_request = NULL; - g_dynamic_engine.callbacks->specific_engine_request = NULL; + g_dynamic_engine.callbacks->private_data_set = callback->private_data_set; + g_dynamic_engine.callbacks->private_data_request = callback->private_data_request; + g_dynamic_engine.callbacks->nlu_base_info_request = callback->nlu_base_info_request; + g_dynamic_engine.callbacks->specific_engine_request = callback->specific_engine_request; + g_dynamic_engine.internal_callbacks->request_tts = NULL; g_dynamic_engine.internal_callbacks->request_tts_user_data = NULL; g_dynamic_engine.internal_callbacks->cancel_tts = NULL; -- 2.7.4 From b1148e7cbafd24ae125ec6abdd39523f3463fc13 Mon Sep 17 00:00:00 2001 From: kismo Date: Tue, 28 Jan 2020 15:03:01 +0900 Subject: [PATCH 05/16] service state changed callback - before : VC_SERVICE_STATE_NONE >> VC_SERVICE_STATE_READY changed callback is not called in main thread. - after : all the time, service state changed callback is called in main thread. Change-Id: I3dffe70e463b1991ffedfff572d29d6afb876ce0 (cherry picked from commit fad6d24fdd7f6cf400fc0ade63ec349811fd830b) --- client/vc_mgr.c | 20 +------------------- server/vcd_server.c | 11 +++++++++++ 2 files changed, 12 insertions(+), 19 deletions(-) mode change 100644 => 100755 client/vc_mgr.c mode change 100644 => 100755 server/vcd_server.c diff --git a/client/vc_mgr.c b/client/vc_mgr.c old mode 100644 new mode 100755 index eb6c3b8..ed9bd15 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -457,25 +457,6 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data) /* Success to connect */ } - /* Set service state */ - vc_service_state_e previous_service_state; - vc_mgr_client_get_service_state(g_vc_m, &previous_service_state); - - vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state); - - vc_service_state_changed_cb service_changed_callback = NULL; - void* user_data = NULL; - vc_mgr_client_get_service_state_changed_cb(g_vc_m, &service_changed_callback, &user_data); - - if (NULL != service_changed_callback) { - vc_mgr_client_use_callback(g_vc_m); - service_changed_callback(previous_service_state, service_state, user_data); - vc_mgr_client_not_use_callback(g_vc_m); - SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called"); - } else { - SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null"); - } - /* Set foreground */ vc_mgr_client_set_foreground(g_vc_m, foreground, true); @@ -485,6 +466,7 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data) vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY); vc_state_changed_cb changed_callback = NULL; + void* user_data = NULL; vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data); vc_state_e current_state; diff --git a/server/vcd_server.c b/server/vcd_server.c old mode 100644 new mode 100755 index d632034..98768a1 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -1613,6 +1613,15 @@ int vcd_server_get_foreground() return pid; } +static Eina_Bool __vcd_send_service_state(void *data) +{ + vcd_config_set_service_state(VCD_STATE_READY); + vcdc_send_service_state(VCD_STATE_READY); + + SLOG(LOG_INFO, TAG_VCD, "[Server Success] success to send service status for READY"); + + return EINA_FALSE; +} /* * API for manager @@ -1636,6 +1645,8 @@ int vcd_server_mgr_initialize(int pid) if (0 != vcdc_send_manager_pid(pid)) SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to send manager pid"); + ecore_timer_add(0.05, __vcd_send_service_state, NULL); + SLOG(LOG_ERROR, TAG_VCD, "[Server Success] Manager initialize : pid(%d)", pid); return VCD_ERROR_NONE; -- 2.7.4 From 5ff971a140b3283390871cf200b29e1b4baa2bea Mon Sep 17 00:00:00 2001 From: kismo Date: Tue, 28 Jan 2020 15:17:56 +0900 Subject: [PATCH 06/16] encoding and decoding data for engine specific request Change-Id: I6e58316b36dbc3bd778e85a739c262283cbd81bb (cherry picked from commit 66512bfbecab942362a3756d01b235c7e0b0e1e5) --- client/vc_mgr_dbus.c | 17 +++++++++++++++-- server/vcd_dbus.c | 12 +++++++++++- server/vcd_dbus_server.c | 10 ++++++++-- 3 files changed, 34 insertions(+), 5 deletions(-) mode change 100644 => 100755 client/vc_mgr_dbus.c mode change 100644 => 100755 server/vcd_dbus.c mode change 100644 => 100755 server/vcd_dbus_server.c diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c old mode 100644 new mode 100755 index be34e3f..eb6d62e --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -215,7 +215,14 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &engine_app_id, DBUS_TYPE_STRING, &event, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); if (NULL != result) { - __vc_mgr_cb_specific_engine_result(engine_app_id, event, result); + gsize decodingSize=0; + gchar *gDecodedResult = (gchar *)g_base64_decode((const gchar *)result, &decodingSize); + if (gDecodedResult) + { + SLOG(LOG_WARN, TAG_VCM, "@@@ Get specific engine result --> %s", gDecodedResult); + __vc_mgr_cb_specific_engine_result(engine_app_id, event, gDecodedResult); + g_free(gDecodedResult); + } } SLOG(LOG_DEBUG, TAG_VCM, "@@@"); @@ -2233,11 +2240,13 @@ int vc_mgr_dbus_send_specific_engine_request(int pid, const char* engine_app_id, SLOG(LOG_INFO, TAG_VCM, "@@ vc send specific engine : pid(%d), engine_app_id(%s), event(%s), request(%s)", pid, engine_app_id, event, request); } + gchar *gEncodedRequest = g_base64_encode((const guchar*)request, strlen(request)); + dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_STRING, &engine_app_id, DBUS_TYPE_STRING, &event, - DBUS_TYPE_STRING, &request, + DBUS_TYPE_STRING, &gEncodedRequest, DBUS_TYPE_INVALID); dbus_message_set_no_reply(msg, TRUE); @@ -2245,6 +2254,8 @@ int vc_mgr_dbus_send_specific_engine_request(int pid, const char* engine_app_id, /* 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"); + if (gEncodedRequest) + g_free(gEncodedRequest); dbus_message_unref(msg); return VC_ERROR_OPERATION_FAILED; } else { @@ -2252,6 +2263,8 @@ int vc_mgr_dbus_send_specific_engine_request(int pid, const char* engine_app_id, dbus_connection_flush(g_m_conn_sender); } + if (gEncodedRequest) + g_free(gEncodedRequest); dbus_message_unref(msg); return 0; } diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c old mode 100644 new mode 100755 index 1ca143e..e0cd0c2 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -426,18 +426,28 @@ int vcdc_send_specific_engine_result_to_manager(int manager_pid, const char* eng return VCD_ERROR_OUT_OF_MEMORY; } - dbus_message_append_args(msg, DBUS_TYPE_STRING, &engine_app_id, DBUS_TYPE_STRING, &event, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); + gchar *gEncodedResult = g_base64_encode((const guchar*)result, strlen(result)); + + dbus_message_append_args(msg, DBUS_TYPE_STRING, &engine_app_id, DBUS_TYPE_STRING, &event, DBUS_TYPE_STRING, &gEncodedResult, DBUS_TYPE_INVALID); dbus_message_set_no_reply(msg, TRUE); if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send"); + if (gEncodedResult) + g_free(gEncodedResult); + dbus_message_unref(msg); return VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_INFO, TAG_VCD, "[Dbus] SUCCESS Send"); dbus_connection_flush(g_conn_sender); } + if (gEncodedResult) + g_free(gEncodedResult); + + dbus_message_unref(msg); + return 0; } diff --git a/server/vcd_dbus_server.c b/server/vcd_dbus_server.c old mode 100644 new mode 100755 index 46bacac..2adb89e --- a/server/vcd_dbus_server.c +++ b/server/vcd_dbus_server.c @@ -654,8 +654,14 @@ int vcd_dbus_server_mgr_send_specific_engine_request(DBusConnection* conn, DBusM dbus_error_free(&err); ret = VCD_ERROR_OPERATION_FAILED; } else { - ret = vcd_server_mgr_send_specific_engine_request(pid, engine_app_id, event, request); - SLOG(LOG_INFO, TAG_VCD, "[IN] vcd mgr specific engine request : pid(%d), engine_app_id(%s), event(%s), request(%s), ret(%d)", pid, engine_app_id, event, request, ret); + gsize decodingSize=0; + gchar *gDecodedRequest = (gchar *)g_base64_decode((const gchar *)request, &decodingSize); + if (gDecodedRequest) + { + ret = vcd_server_mgr_send_specific_engine_request(pid, engine_app_id, event, gDecodedRequest); + SLOG(LOG_INFO, TAG_VCD, "[IN] vcd mgr specific engine request : pid(%d), engine_app_id(%s), event(%s), request(%s), ret(%d)", pid, engine_app_id, event, gDecodedRequest, ret); + g_free(gDecodedRequest); + } } return 0; -- 2.7.4 From b846bfc33e9a058095865ae9722d5e2fdd2714d2 Mon Sep 17 00:00:00 2001 From: Dharanie Shankar Date: Mon, 17 Feb 2020 11:55:38 +0530 Subject: [PATCH 07/16] Memory leak fixes taken from MCD 4.0 Change refno: 3284633, 3316074, 3316388 [Model] [BinType] AP [Customer] OPEN [Issue#] [Request] PLM [Occurrence Version] [Problem] bug fix [Cause & Measure] [Checking Method] [Team] Bixby Client [Developer] Dharanie Shankar [Solution company] Samsung [Change Type] PLM Change-Id: Ia9d500d6e6030a2c2caeba8854ff96530aca4238 Signed-off-by: Dharanie Shankar (cherry picked from commit 8db9160f0cbfa62afbf8da366033f7ec41640d70) --- client/vc_mgr.c | 8 ++++++++ client/vc_mgr_data.cpp | 18 ++++++++---------- common/vc_config_parser.c | 2 ++ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/client/vc_mgr.c b/client/vc_mgr.c index eb6c3b8..855c6f9 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -4194,6 +4194,10 @@ static void __tts_feedback_thread(void* data, Ecore_Thread* thread) /* If no feedback data and EVENT_FINISH */ if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) { SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish feedback"); + if (feedback_data) { + free(feedback_data); + feedback_data = NULL; + } break; } } else { @@ -4220,6 +4224,10 @@ static void __tts_feedback_thread(void* data, Ecore_Thread* thread) /* If no feedback data and EVENT_FINISH */ if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) { SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish vc tts feedback"); + if (feedback_data) { + free(feedback_data); + feedback_data = NULL; + } break; } } diff --git a/client/vc_mgr_data.cpp b/client/vc_mgr_data.cpp index 53adae3..8301fcd 100644 --- a/client/vc_mgr_data.cpp +++ b/client/vc_mgr_data.cpp @@ -100,18 +100,16 @@ int vc_mgr_data_clear_feedback_data(vc_feedback_data_s** data) pthread_mutex_lock(&g_feedback_data_mutex); - if (!g_feedback_data.empty()) { - if (NULL != *data) { - SLOG(LOG_INFO, TAG_VCM, "[DEBUG] pid(%d), utt_id(%d), data(%p) size(%d) rate(%d)", (*data)->pid, (*data)->utt_id, (*data)->data, (*data)->data_size, (*data)->rate); - - if (NULL != (*data)->data) { - free((*data)->data); - (*data)->data = NULL; - } + if (NULL != *data) { + SLOG(LOG_INFO, TAG_VCM, "[DEBUG] pid(%d), utt_id(%d), data(%p) size(%d) rate(%d)", (*data)->pid, (*data)->utt_id, (*data)->data, (*data)->data_size, (*data)->rate); - free(*data); - *data = NULL; + if (NULL != (*data)->data) { + free((*data)->data); + (*data)->data = NULL; } + + free(*data); + *data = NULL; } pthread_mutex_unlock(&g_feedback_data_mutex); diff --git a/common/vc_config_parser.c b/common/vc_config_parser.c index e2be6d8..cf7e088 100644 --- a/common/vc_config_parser.c +++ b/common/vc_config_parser.c @@ -243,6 +243,8 @@ int vc_parser_free_engine_info(vc_engine_info_s* engine_info) if (NULL != engine_info->name) free(engine_info->name); if (NULL != engine_info->uuid) free(engine_info->uuid); + if (NULL != engine_info->default_lang) free(engine_info->default_lang); + if (NULL != engine_info->setting) free(engine_info->setting); int count = g_slist_length(engine_info->languages); -- 2.7.4 From f029a89d128d5c224129bf9b8e3417bb5c3e78fe Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Fri, 21 Feb 2020 15:09:02 +0900 Subject: [PATCH 08/16] Change public callbacks to internal callbacks for optional callbacks Change-Id: Iec3da4f0ef889d4ba48b155a1649e82fe974f717 Signed-off-by: sungrae jo --- include/vce.h | 14 +++++++++++++- include/vce_internal.h | 5 +++++ server/vcd_engine_agent.c | 32 ++++++++++++++++---------------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/include/vce.h b/include/vce.h index 31747a0..9f4d614 100644 --- a/include/vce.h +++ b/include/vce.h @@ -627,7 +627,19 @@ typedef int (*vce_tts_audio_format_request_cb)(int* rate, int* channel, int* aud * @brief A structure for the VC engine functions. * @details This structure contains essential callback functions for operating VC engine. * @since_tizen @if MOBILE 4.0 @elseif WEARABLE 5.0 @endif - * @remarks You must register all callbacks except optional callbacks for operating VC engine. + * @remarks You must register all callbacks except optional callbacks for operating VC engine.\n + * The following callbacks are optional callbacks : \n + * - vce_private_data_set_cb \n + * - vce_private_data_requested_cb \n + * - vce_nlu_base_info_requested_cb \n + * - vce_specific_engine_request_cb \n + * If you want to use the optional callbacks, you can set them using vce_set_private_data_set_cb(), vce_set_private_data_requested_cb(), vce_set_nlu_base_info_requested_cb(), and vce_set_specific_engine_request_cb() functions. + * + * @see vce_main() + * @see vce_set_private_data_set_cb() + * @see vce_set_private_data_requested_cb() + * @see vce_set_nlu_base_info_requested_cb() + * @see vce_set_specific_engine_request_cb() */ typedef struct { int version; /**< Version */ diff --git a/include/vce_internal.h b/include/vce_internal.h index 19c51f6..8c43a47 100644 --- a/include/vce_internal.h +++ b/include/vce_internal.h @@ -39,6 +39,11 @@ typedef struct { void* cancel_tts_user_data; vce_tts_audio_format_request_cb get_tts_audio_format; void* get_tts_audio_format_user_data; + + vce_private_data_set_cb private_data_set; + vce_private_data_requested_cb private_data_request; + vce_nlu_base_info_requested_cb nlu_base_info_request; + vce_specific_engine_request_cb specific_engine_request; } vce_internal_request_callback_s; /** diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 4750284..7fa8479 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -231,10 +231,10 @@ static int __internal_get_engine_info(vce_request_callback_s* callback) g_dynamic_engine.callbacks->process_list_event = callback->process_list_event; g_dynamic_engine.callbacks->process_haptic_event = callback->process_haptic_event; - g_dynamic_engine.callbacks->private_data_set = callback->private_data_set; - g_dynamic_engine.callbacks->private_data_request = callback->private_data_request; - g_dynamic_engine.callbacks->nlu_base_info_request = callback->nlu_base_info_request; - g_dynamic_engine.callbacks->specific_engine_request = callback->specific_engine_request; + g_dynamic_engine.internal_callbacks->private_data_set = NULL; + g_dynamic_engine.internal_callbacks->private_data_request = NULL; + g_dynamic_engine.internal_callbacks->nlu_base_info_request = NULL; + g_dynamic_engine.internal_callbacks->specific_engine_request = NULL; g_dynamic_engine.internal_callbacks->request_tts = NULL; g_dynamic_engine.internal_callbacks->request_tts_user_data = NULL; @@ -551,8 +551,8 @@ int vcd_engine_get_nlu_base_info(int pid, const char* key, char** value) } int ret = -1; - if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.callbacks->nlu_base_info_request) { - ret = g_dynamic_engine.callbacks->nlu_base_info_request(key, value); + if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.internal_callbacks->nlu_base_info_request) { + ret = g_dynamic_engine.internal_callbacks->nlu_base_info_request(key, value); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get nlu base info (%d)", ret); return VCD_ERROR_OPERATION_FAILED; @@ -576,8 +576,8 @@ int vcd_engine_set_private_data(int pid, const char* key, const char* data) vcd_recorder_set_pcm_path(data); int ret = -1; - if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.callbacks->private_data_set) { - ret = g_dynamic_engine.callbacks->private_data_set(key, data); + if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.internal_callbacks->private_data_set) { + ret = g_dynamic_engine.internal_callbacks->private_data_set(key, data); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set private data (%d)", ret); return VCD_ERROR_OPERATION_FAILED; @@ -603,8 +603,8 @@ int vcd_engine_get_private_data(int pid, const char* key, char** data) } int ret = -1; - if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.callbacks->private_data_request) { - ret = g_dynamic_engine.callbacks->private_data_request(key, data); + if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.internal_callbacks->private_data_request) { + ret = g_dynamic_engine.internal_callbacks->private_data_request(key, data); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get private data (%d)", ret); return VCD_ERROR_OPERATION_FAILED; @@ -625,8 +625,8 @@ int vcd_engine_send_specific_engine_request(const char* engine_app_id, const cha } int ret = -1; - if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.callbacks->specific_engine_request) { - ret = g_dynamic_engine.callbacks->specific_engine_request(engine_app_id, event, request); + if (true == g_dynamic_engine.is_loaded && NULL != g_dynamic_engine.internal_callbacks->specific_engine_request) { + ret = g_dynamic_engine.internal_callbacks->specific_engine_request(engine_app_id, event, request); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set specific engine request (%d)", ret); return VCD_ERROR_OPERATION_FAILED; @@ -946,7 +946,7 @@ int vcd_engine_agent_set_private_data_set_cb(vce_private_data_set_cb callback_fu return VCD_ERROR_OPERATION_FAILED; } - g_dynamic_engine.callbacks->private_data_set = callback_func; + g_dynamic_engine.internal_callbacks->private_data_set = callback_func; return VCD_ERROR_NONE; } @@ -963,7 +963,7 @@ int vcd_engine_agent_set_private_data_requested_cb(vce_private_data_requested_cb return VCD_ERROR_OPERATION_FAILED; } - g_dynamic_engine.callbacks->private_data_request = callback_func; + g_dynamic_engine.internal_callbacks->private_data_request = callback_func; return VCD_ERROR_NONE; } @@ -980,7 +980,7 @@ int vcd_engine_agent_set_nlu_base_info_requested_cb(vce_nlu_base_info_requested_ return VCD_ERROR_OPERATION_FAILED; } - g_dynamic_engine.callbacks->nlu_base_info_request = callback_func; + g_dynamic_engine.internal_callbacks->nlu_base_info_request = callback_func; return VCD_ERROR_NONE; } @@ -997,7 +997,7 @@ int vcd_engine_agent_set_specific_engine_request_cb(vce_specific_engine_request_ return VCD_ERROR_OPERATION_FAILED; } - g_dynamic_engine.callbacks->specific_engine_request = callback_func; + g_dynamic_engine.internal_callbacks->specific_engine_request = callback_func; return VCD_ERROR_NONE; } -- 2.7.4 From 61844e83cabd54aee557e8b411233f5a6c8ce17b Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Mon, 16 Mar 2020 12:40:01 +0900 Subject: [PATCH 09/16] Added mutex code for command Change-Id: I51b58c5310a87b5987a28a6502f0b01890e3f36d Signed-off-by: sungrae jo --- common/vc_command.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/common/vc_command.c b/common/vc_command.c index 8ff7138..e271c0b 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -33,6 +33,10 @@ #include "voice_control_common.h" #include "voice_control_key_defines.h" +static pthread_mutex_t g_cmd_mutex = PTHREAD_MUTEX_INITIALIZER; +#define CMD_MUTEX_LOCK() pthread_mutex_lock(&g_cmd_mutex) +#define CMD_MUTEX_UNLOCK() pthread_mutex_unlock(&g_cmd_mutex) + static int g_feature_enabled = -1; static bool g_privilege_allowed = false; @@ -658,8 +662,11 @@ int vc_cmd_create(vc_cmd_h* vc_command) return VC_ERROR_PERMISSION_DENIED; } + CMD_MUTEX_LOCK(); + if (NULL == vc_command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); + CMD_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } @@ -667,6 +674,7 @@ int vc_cmd_create(vc_cmd_h* vc_command) if (NULL == command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory"); + CMD_MUTEX_UNLOCK(); return VC_ERROR_OUT_OF_MEMORY; } @@ -692,6 +700,7 @@ int vc_cmd_create(vc_cmd_h* vc_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command); + CMD_MUTEX_UNLOCK(); return VC_ERROR_NONE; } @@ -704,8 +713,11 @@ int vc_cmd_destroy(vc_cmd_h vc_command) return VC_ERROR_PERMISSION_DENIED; } + CMD_MUTEX_LOCK(); + if (NULL == vc_command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); + CMD_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } @@ -718,6 +730,7 @@ int vc_cmd_destroy(vc_cmd_h vc_command) iter = g_list_find(g_cmd_list, command); if (NULL == iter) { SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid"); + CMD_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } @@ -744,6 +757,7 @@ int vc_cmd_destroy(vc_cmd_h vc_command) free(command); command = NULL; + CMD_MUTEX_UNLOCK(); return VC_ERROR_NONE; } -- 2.7.4 From d62ca0713d22a450e8c44032d0468138dfba548f Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Mon, 16 Mar 2020 16:14:47 +0900 Subject: [PATCH 10/16] Added mutex code for command list Added mutex code Fixed resource release order for list destory. Change-Id: I050ad117a32c4f051f2f669b64c0cb5890b88ee3 Signed-off-by: sungrae jo --- common/vc_command.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/common/vc_command.c b/common/vc_command.c index e271c0b..6d0b546 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -34,8 +34,11 @@ #include "voice_control_key_defines.h" static pthread_mutex_t g_cmd_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t g_cmd_list_mutex = PTHREAD_MUTEX_INITIALIZER; #define CMD_MUTEX_LOCK() pthread_mutex_lock(&g_cmd_mutex) #define CMD_MUTEX_UNLOCK() pthread_mutex_unlock(&g_cmd_mutex) +#define CMD_LIST_MUTEX_LOCK() pthread_mutex_lock(&g_cmd_list_mutex) +#define CMD_LIST_MUTEX_UNLOCK() pthread_mutex_unlock(&g_cmd_list_mutex) static int g_feature_enabled = -1; static bool g_privilege_allowed = false; @@ -181,8 +184,11 @@ int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) return VC_ERROR_PERMISSION_DENIED; } + CMD_LIST_MUTEX_LOCK(); + if (NULL == vc_cmd_list) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } @@ -190,6 +196,7 @@ int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) if (NULL == list) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory"); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_OUT_OF_MEMORY; } @@ -202,6 +209,7 @@ int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_NONE; } @@ -214,12 +222,14 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) return VC_ERROR_PERMISSION_DENIED; } + CMD_LIST_MUTEX_LOCK(); + if (NULL == vc_cmd_list) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL"); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } - vc_cmd_list_remove_all(vc_cmd_list, release_command); vc_cmd_list_s* list = NULL; list = (vc_cmd_list_s*)vc_cmd_list; @@ -230,15 +240,19 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) iter = g_list_find(g_cmdlist_list, list); if (NULL == iter) { SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_INVALID_PARAMETER; } g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter); - if (iter->data) - free(iter->data); - iter->data = NULL; - iter = NULL; + + vc_cmd_list_remove_all((vc_cmd_list_h)list, release_command); + free(list); + list = NULL; + SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy"); + + CMD_LIST_MUTEX_UNLOCK(); return VC_ERROR_NONE; } @@ -372,11 +386,14 @@ int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)" , list, release_command ? "true" : "false"); - if (true == release_command) - g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL); - g_slist_free(list->list); - list->list = NULL; - list->index = -1; + if (true == release_command) { + if (list->list) { + g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL); + g_slist_free(list->list); + list->list = NULL; + } + list->index = -1; + } SLOG(LOG_DEBUG, TAG_VCCMD, "@@@"); -- 2.7.4 From 4683eb64d72d86a6afd91863eb47398947d7ca3b Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Mon, 16 Mar 2020 16:25:22 +0900 Subject: [PATCH 11/16] Update package version to 1.60.0 Change-Id: I157ebecff7c07f7d90b8236f380f3d22c1b323c1 Signed-off-by: sungrae jo --- CMakeLists.txt | 2 +- packaging/voice-control.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c2b603d..64bd9df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ PROJECT(vc) SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_PREFIX "${PREFIX}") -SET(VERSION 0.2.10) +SET(VERSION 1.60.0) FIND_PROGRAM(UNAME NAMES uname) EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") diff --git a/packaging/voice-control.spec b/packaging/voice-control.spec index feda14c..53a52cc 100644 --- a/packaging/voice-control.spec +++ b/packaging/voice-control.spec @@ -1,6 +1,6 @@ Name: voice-control Summary: Voice control client library and daemon -Version: 0.2.10 +Version: 1.60.0 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Apache-2.0 -- 2.7.4 From 0bc330c7e7cae16c977d32082f738739977b70b9 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Thu, 19 Mar 2020 18:04:05 +0900 Subject: [PATCH 12/16] Fixed invalid parameter for set command. Change-Id: Ide1af8f90ed47c78ff3c98d4354660d83484b9d1 Signed-off-by: sungrae jo --- common/vc_command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/vc_command.c b/common/vc_command.c index 6d0b546..665f8d9 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -885,7 +885,7 @@ int vc_cmd_set_command(vc_cmd_h vc_command, const char* command) return VC_ERROR_PERMISSION_DENIED; } - if (NULL == vc_command) { + if (NULL == vc_command || NULL == command) { SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter "); return VC_ERROR_INVALID_PARAMETER; } -- 2.7.4 From 9b28d969db2fd92c8a03d54b8c5bb07bcb5f7d97 Mon Sep 17 00:00:00 2001 From: "wn.jang" Date: Thu, 19 Mar 2020 19:22:48 +0900 Subject: [PATCH 13/16] Fix vce TC fail while tct-mgr execute vce_ prefix TCs are all failed, because dbus_open_connection was already established. So, if only TC case which means that default appid is differ from current appid is, it will ignore to established dbus connection. Change-Id: I955ef8922d4bbc8ba7f74bd1572ee43383c29afc --- server/vcd_dbus.c | 23 ++++++++++++++++++----- server/vcd_engine_agent.c | 10 +++++----- server/vcd_server.c | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index e0cd0c2..1ef35c2 100755 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -58,6 +58,18 @@ static DBusMessage* __get_message(int pid, const char* method, vcd_client_type_e int vcd_dbus_reconnect() { + if (!g_conn_sender || !g_conn_listener) { + vcd_dbus_close_connection(); + + if (0 != vcd_dbus_open_connection()) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to reconnect"); + return -1; + } + + SLOG(LOG_INFO, TAG_VCD, "[DBUS] Reconnect"); + return 0; + } + bool sender_connected = dbus_connection_get_is_connected(g_conn_sender); bool listener_connected = dbus_connection_get_is_connected(g_conn_listener); SLOG(LOG_WARN, TAG_VCD, "[DBUS] Sender(%s) Listener(%s)", @@ -1374,13 +1386,14 @@ int vcd_dbus_close_connection() g_dbus_fd_handler = NULL; } - dbus_bus_release_name(g_conn_listener, VC_SERVER_SERVICE_NAME, &err); + if (NULL != g_conn_listener) { + dbus_bus_release_name(g_conn_listener, VC_SERVER_SERVICE_NAME, &err); - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_release_name() : %s", err.message); - dbus_error_free(&err); + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_release_name() : %s", err.message); + dbus_error_free(&err); + } } - __vcd_dbus_connection_free(); return 0; diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 7fa8479..04cbb6a 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -261,16 +261,16 @@ int vcd_engine_agent_load_current_engine(vce_request_callback_s* callback) return VCD_ERROR_OPERATION_FAILED; } - if (true == g_dynamic_engine.is_loaded) { - SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent] Engine has already been loaded"); - return 0; - } - if (NULL == callback) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid engine"); return VCD_ERROR_ENGINE_NOT_FOUND; } + if (true == g_dynamic_engine.is_loaded) { + SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent] Engine has already been loaded"); + return 0; + } + /* Get current engine info */ int ret = __internal_get_engine_info(callback); if (0 != ret) { diff --git a/server/vcd_server.c b/server/vcd_server.c index 98768a1..56df9a5 100755 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -16,8 +16,10 @@ #include #include +#include #include #include +#include #include "vc_cmd_db.h" #include "vc_info_parser.h" @@ -1238,6 +1240,29 @@ static int __vcd_db_clean_up() return ret; } +static bool __is_default_engine() +{ + char* engine = NULL; + engine = vconf_get_str(VCONFKEY_VC_ENGINE_DEFAULT); + if (NULL == engine) { + SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to get sting for vc engine"); + return FALSE; + } + + char appid[1024] = {'\0', }; + if (0 != aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1)) { + SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to get callee appid by pid"); + } + + SLOG(LOG_DEBUG, TAG_VCD, "[Server] VC Default Engine(%s), appId(%s)", engine, appid); + if (0 == strncmp(engine, appid, strlen(engine))) { + free(engine); + return TRUE; + } + free(engine); + return FALSE; +} + int vcd_initialize(vce_request_callback_s *callback) { int ret = 0; @@ -1285,10 +1310,12 @@ int vcd_initialize(vce_request_callback_s *callback) /* Initialize manager info */ vcd_client_manager_unset(); - /* Open dbus connection */ - if (0 != vcd_dbus_open_connection()) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to open connection"); - return VCD_ERROR_OPERATION_FAILED; + if (TRUE == __is_default_engine()) { + /* Open dbus connection */ + if (0 != vcd_dbus_open_connection()) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to open connection"); + return VCD_ERROR_OPERATION_FAILED; + } } vcd_config_set_service_state(VCD_STATE_READY); -- 2.7.4 From 2f09e42f6ae4355fc2ba76ba581628f2a4d5ee96 Mon Sep 17 00:00:00 2001 From: sungrae jo Date: Thu, 19 Mar 2020 19:45:16 +0900 Subject: [PATCH 14/16] Update package version to 1.60.1 Change-Id: Id9001d58f17c0af4a47eef8b13d2faef11977716 Signed-off-by: sungrae jo --- CMakeLists.txt | 2 +- packaging/voice-control.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64bd9df..f3e7cd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ PROJECT(vc) SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_PREFIX "${PREFIX}") -SET(VERSION 1.60.0) +SET(VERSION 1.60.1) FIND_PROGRAM(UNAME NAMES uname) EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") diff --git a/packaging/voice-control.spec b/packaging/voice-control.spec index 53a52cc..05d49c9 100644 --- a/packaging/voice-control.spec +++ b/packaging/voice-control.spec @@ -1,6 +1,6 @@ Name: voice-control Summary: Voice control client library and daemon -Version: 1.60.0 +Version: 1.60.1 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Apache-2.0 -- 2.7.4 From 62b317c193cb7eb3182b7204e24fe2407c4cf427 Mon Sep 17 00:00:00 2001 From: "wn.jang" Date: Thu, 19 Mar 2020 20:15:27 +0900 Subject: [PATCH 15/16] Update version to 1.60.2 Change-Id: Iae8beb655d84ed8ff66e8893f415a6b660dccbdd --- CMakeLists.txt | 2 +- packaging/voice-control.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f3e7cd0..7dd3653 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ PROJECT(vc) SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_PREFIX "${PREFIX}") -SET(VERSION 1.60.1) +SET(VERSION 1.60.2) FIND_PROGRAM(UNAME NAMES uname) EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") diff --git a/packaging/voice-control.spec b/packaging/voice-control.spec index 05d49c9..a196ddd 100644 --- a/packaging/voice-control.spec +++ b/packaging/voice-control.spec @@ -1,6 +1,6 @@ Name: voice-control Summary: Voice control client library and daemon -Version: 1.60.1 +Version: 1.60.2 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Apache-2.0 -- 2.7.4 From f00acb1cd81a67947c69214148ed940c7f1fc852 Mon Sep 17 00:00:00 2001 From: "wn.jang" Date: Mon, 23 Mar 2020 11:21:31 +0900 Subject: [PATCH 16/16] Ignore to finalize when dbus connection is NULL Change-Id: Ic8b2e6ac2eed8c4611fd9f5c550399e178d4bb7e (cherry picked from commit ee4d2aeee14d96235d6875768b80eb738d60f3c7) --- client/vc_widget_dbus.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/client/vc_widget_dbus.c b/client/vc_widget_dbus.c index 0ddb340..a6f2769 100644 --- a/client/vc_widget_dbus.c +++ b/client/vc_widget_dbus.c @@ -629,6 +629,18 @@ int vc_widget_dbus_request_finalize(int pid) return VC_ERROR_OPERATION_FAILED; } + if (NULL == g_w_conn_listener) { + if (g_is_connection_opened) { + SLOG(LOG_ERROR, TAG_VCW, "[ERROR] g_w_conn_listener is NULL abnormally"); + pthread_mutex_unlock(&g_w_init_mutex); + return VC_ERROR_OPERATION_FAILED; + } else { + SLOG(LOG_INFO, TAG_VCW, "[INFO] g_w_conn_listener is NULL and DBUS connection was closed"); + pthread_mutex_unlock(&g_w_init_mutex); + return VC_ERROR_NONE; + } + } + DBusError err; dbus_error_init(&err); -- 2.7.4