Enhancement for widget client internal multi handle 90/109990/1
authorKwangyoun Kim <ky85.kim@samsung.com>
Mon, 26 Dec 2016 04:51:43 +0000 (13:51 +0900)
committerWonnam Jang <wn.jang@samsung.com>
Thu, 12 Jan 2017 10:47:51 +0000 (02:47 -0800)
Change-Id: I5aaf4cee1d8a4d2cd48bbe8a9966a6c965cba620
Signed-off-by: Kwangyoun Kim <ky85.kim@samsung.com>
(cherry picked from commit d99e9cfd7db9ccc0dcef3e0232999d4fa7786192)

client/vc_widget.c
client/vc_widget_client.c
client/vc_widget_client.h
include/voice_control_widget.h
server/vcd_dbus.c
server/vcd_server.c

index 6212288..3989c99 100644 (file)
 
 #define VC_WIDGET_CONFIG_HANDLE        200000
 
-static Ecore_Timer* g_w_connect_timer = NULL;
-
 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_tooltip_timer = NULL;
-
-static vc_h g_vc_w = NULL;
 
 static int g_daemon_pid = 0;
 
@@ -88,28 +83,41 @@ static void __vc_widget_lang_changed_cb(const char* before_lang, const char* cur
 
        vc_current_language_changed_cb callback;
        void* lang_user_data;
-       vc_widget_client_get_current_lang_changed_cb(g_vc_w, &callback, &lang_user_data);
 
-       if (NULL != callback) {
-               vc_widget_client_use_callback(g_vc_w);
-               callback(before_lang, current_lang, lang_user_data);
-               vc_widget_client_not_use_callback(g_vc_w);
-               SLOG(LOG_DEBUG, TAG_VCW, "Language changed callback is called");
-       } else {
-               SLOG(LOG_WARN, TAG_VCW, "[WARNING] Language changed callback is null");
-       }
+       GSList* client_list = vc_widget_client_get_client_list();
 
+       vc_widget_s *widget_data = NULL;
+       vc_h vc_w = NULL;
+
+       int count = g_slist_length(client_list);
+       int i;
+       for (i = 0; i < count; i++) {
+               widget_data = g_slist_nth_data(client_list, i);
+               if (NULL != widget_data) {
+                       vc_w = widget_data->vc;
+
+                       vc_widget_client_get_current_lang_changed_cb(vc_w, &callback, &lang_user_data);
+
+                       if (NULL != callback) {
+                               vc_widget_client_use_callback(vc_w);
+                               callback(before_lang, current_lang, lang_user_data);
+                               vc_widget_client_not_use_callback(vc_w);
+                               SLOG(LOG_DEBUG, TAG_VCW, "Language changed callback is called");
+                       } else {
+                               SLOG(LOG_WARN, TAG_VCW, "[WARNING] Language changed callback is null");
+                       }
+               }
+       }
        return;
 }
 
-int vc_widget_initialize()
+int vc_widget_initialize(vc_h* vc_w)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Initialize");
 
-       /* check handle */
-       if (true == vc_widget_client_is_valid(g_vc_w)) {
-               SLOG(LOG_ERROR, TAG_VCW, "[WARNING] Already initialized");
-               return VC_ERROR_NONE;
+       if (NULL == vc_w) {
+               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Input parameter is NULL");
+               return VC_ERROR_INVALID_PARAMETER;
        }
 
        if (0 == vc_widget_client_get_count()) {
@@ -117,41 +125,41 @@ int vc_widget_initialize()
                        SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to open connection");
                        return VC_ERROR_OPERATION_FAILED;
                }
-       } else {
-               SLOG(LOG_WARN, TAG_VCW, "[WARN] Already initialized");
-               return VC_ERROR_NONE;
        }
 
-       if (0 != vc_widget_client_create(&g_vc_w)) {
+       if (0 != vc_widget_client_create(vc_w)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to create client!!!!!");
                return VC_ERROR_OUT_OF_MEMORY;
        }
 
-       int ret = vc_config_mgr_initialize(g_vc_w->handle + VC_WIDGET_CONFIG_HANDLE);
+       /* TODO - each handle? */
+       int ret = vc_config_mgr_initialize((*vc_w)->handle);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to init config manager : %s",
                         __vc_widget_get_error_code(__vc_widget_convert_config_error_code(ret)));
-               vc_widget_client_destroy(g_vc_w);
+               vc_widget_client_destroy((*vc_w));
                return __vc_widget_convert_config_error_code(ret);
        }
 
-       ret = vc_config_mgr_set_lang_cb(g_vc_w->handle + VC_WIDGET_CONFIG_HANDLE, __vc_widget_lang_changed_cb);
+       ret = vc_config_mgr_set_lang_cb((*vc_w)->handle, __vc_widget_lang_changed_cb);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to set config changed : %d", ret);
-               vc_config_mgr_finalize(g_vc_w->handle + VC_WIDGET_CONFIG_HANDLE);
-               vc_widget_client_destroy(g_vc_w);
+               vc_config_mgr_finalize((*vc_w)->handle);
+               vc_widget_client_destroy((*vc_w));
                return __vc_widget_convert_config_error_code(ret);
        }
 
-       ret = vc_db_initialize();
-       if (0 != ret) {
-               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to initialize DB : %d", ret);
-               vc_config_mgr_finalize(g_vc_w->handle + VC_WIDGET_CONFIG_HANDLE);
-               vc_widget_client_destroy(g_vc_w);
-               return ret;
+       if (1 == vc_widget_client_get_count()) {
+               ret = vc_db_initialize();
+               if (0 != ret) {
+                       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to initialize DB : %d", ret);
+                       vc_config_mgr_finalize((*vc_w)->handle);
+                       vc_widget_client_destroy((*vc_w));
+                       return ret;
+               }
        }
 
-       SLOG(LOG_DEBUG, TAG_VCW, "[Success] pid(%d)", g_vc_w->handle);
+       SLOG(LOG_DEBUG, TAG_VCW, "[Success] uid(%d)", (*vc_w)->handle);
 
        SLOG(LOG_DEBUG, TAG_VCW, "=====");
        SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -159,9 +167,9 @@ int vc_widget_initialize()
        return VC_ERROR_NONE;
 }
 
-static void __vc_widget_internal_unprepare()
+static void __vc_widget_internal_unprepare(vc_h vc_w)
 {
-       int ret = vc_widget_dbus_request_finalize(g_vc_w->handle);
+       int ret = vc_widget_dbus_request_finalize(getpid());
        if (0 != ret) {
                SLOG(LOG_WARN, TAG_VCW, "[ERROR] Fail to request finalize : %s", __vc_widget_get_error_code(ret));
        }
@@ -182,11 +190,11 @@ static void __vc_widget_internal_unprepare()
        return;
 }
 
-int vc_widget_deinitialize()
+int vc_widget_deinitialize(vc_h vc_w)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Deinitialize");
 
-       if (false == vc_widget_client_is_valid(g_vc_w)) {
+       if (false == vc_widget_client_is_valid(vc_w)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] NOT initialized");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -194,26 +202,29 @@ int vc_widget_deinitialize()
        }
 
        vc_state_e state;
-       vc_widget_client_get_state(g_vc_w, &state);
+       vc_widget_client_get_state(vc_w, &state);
+       vc_widget_s* widget = widget_get(vc_w);
 
        /* check state */
        switch (state) {
        case VC_STATE_READY:
-               __vc_widget_internal_unprepare();
+               if (1 == vc_widget_client_get_count()) {
+                       __vc_widget_internal_unprepare(vc_w);
+               }
                /* no break. need to next step*/
        case VC_STATE_INITIALIZED:
-               if (NULL != g_w_connect_timer) {
+               if (NULL != widget->conn_timer) {
                        SLOG(LOG_DEBUG, TAG_VCW, "Connect Timer is deleted");
-                       ecore_timer_del(g_w_connect_timer);
-                       g_w_connect_timer = NULL;
+                       ecore_timer_del(widget->conn_timer);
+                       widget->conn_timer = NULL;
                }
 
-               vc_config_mgr_unset_lang_cb(g_vc_w->handle + VC_WIDGET_CONFIG_HANDLE);
-               vc_config_mgr_finalize(g_vc_w->handle + VC_WIDGET_CONFIG_HANDLE);
+               vc_config_mgr_unset_lang_cb(vc_w->handle);
+               vc_config_mgr_finalize(vc_w->handle);
 
                /* Free resources */
-               vc_widget_client_destroy(g_vc_w);
-               g_vc_w = NULL;
+               vc_widget_client_destroy(vc_w);
+               vc_w = NULL;
                break;
        case VC_STATE_NONE:
                break;
@@ -221,13 +232,15 @@ int vc_widget_deinitialize()
 
        SLOG(LOG_DEBUG, TAG_VCW, "Success: destroy");
 
-       int ret = vc_db_finalize();
-       if (0 != ret) {
-               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to finalize DB, ret(%d)", ret);
-       }
+       if (0 == vc_widget_client_get_count()) {
+               int ret = vc_db_finalize();
+               if (0 != ret) {
+                       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to finalize DB, ret(%d)", ret);
+               }
 
-       if (0 != vc_widget_dbus_close_connection()) {
-               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to close connection");
+               if (0 != vc_widget_dbus_close_connection()) {
+                       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to close connection");
+               }
        }
 
        SLOG(LOG_DEBUG, TAG_VCW, "=====");
@@ -265,6 +278,8 @@ static Eina_Bool __focus_changed_cb(void *data, int type, void *event)
 
 static Eina_Bool __vc_widget_connect_daemon(void *data)
 {
+       vc_h vc_w = (vc_h)data;
+
        /* Send hello */
        if (0 != vc_widget_dbus_request_hello()) {
                return EINA_TRUE;
@@ -272,38 +287,43 @@ static Eina_Bool __vc_widget_connect_daemon(void *data)
 
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Connect daemon");
 
-       g_w_connect_timer = NULL;
+       vc_widget_s* widget = widget_get(vc_w);
+       widget->conn_timer = NULL;
 
        /* request initialization */
        int ret = -1;
        int service_state = 0;
-       ret = vc_widget_dbus_request_initialize(g_vc_w->handle, &service_state, &g_daemon_pid);
+       ret = vc_widget_dbus_request_initialize(getpid(), &service_state, &g_daemon_pid);
 
        if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to initialize : %s", __vc_widget_get_error_code(ret));
 
-               vc_widget_client_set_error(g_vc_w, VC_ERROR_ENGINE_NOT_FOUND);
-               ecore_timer_add(0, __vc_widget_notify_error, g_vc_w);
+               vc_widget_client_set_error(vc_w, VC_ERROR_ENGINE_NOT_FOUND);
+               ecore_timer_add(0, __vc_widget_notify_error, vc_w);
 
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, "  ");
                return EINA_FALSE;
 
+       } else if (VC_ERROR_INVALID_PARAMETER == ret) {
+               SLOG(LOG_WARN, TAG_VCW, "[WARNING] Invalid Parameter");
        } else if (VC_ERROR_NONE != ret) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to initialize : %s", __vc_widget_get_error_code(ret));
 
-               vc_widget_client_set_error(g_vc_w, VC_ERROR_TIMED_OUT);
-               ecore_timer_add(0, __vc_widget_notify_error, g_vc_w);
+               vc_widget_client_set_error(vc_w, VC_ERROR_TIMED_OUT);
+               ecore_timer_add(0, __vc_widget_notify_error, vc_w);
 
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, "  ");
                return EINA_FALSE;
        }
 
-       vc_widget_client_set_service_state(g_vc_w, (vc_service_state_e)service_state);
+       vc_widget_client_set_service_state(vc_w, (vc_service_state_e)service_state);
 
-       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);
+       if (NULL == g_focus_in_handler)
+               g_focus_in_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, __focus_changed_cb, NULL);
+       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));
@@ -317,8 +337,8 @@ static Eina_Bool __vc_widget_connect_daemon(void *data)
                }
        }
 
-       vc_widget_client_set_state(g_vc_w, VC_STATE_READY);
-       ecore_timer_add(0, __vc_widget_notify_state_changed, g_vc_w);
+       vc_widget_client_set_state(vc_w, VC_STATE_READY);
+       ecore_timer_add(0, __vc_widget_notify_state_changed, vc_w);
 
        SLOG(LOG_DEBUG, TAG_VCW, "=====");
        SLOG(LOG_DEBUG, TAG_VCW, "  ");
@@ -326,12 +346,12 @@ static Eina_Bool __vc_widget_connect_daemon(void *data)
        return EINA_FALSE;
 }
 
-int vc_widget_prepare()
+int vc_widget_prepare(vc_h vc_w)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Prepare");
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -346,7 +366,8 @@ int vc_widget_prepare()
                return VC_ERROR_INVALID_STATE;
        }
 
-       g_w_connect_timer = ecore_timer_add(0, __vc_widget_connect_daemon, NULL);
+       vc_widget_s* widget = widget_get(vc_w);
+       widget->conn_timer = ecore_timer_add(0, __vc_widget_connect_daemon, (void*)vc_w);
 
        SLOG(LOG_DEBUG, TAG_VCW, "=====");
        SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -354,12 +375,12 @@ int vc_widget_prepare()
        return VC_ERROR_NONE;
 }
 
-int vc_widget_unprepare()
+int vc_widget_unprepare(vc_h vc_w)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Unprepare");
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -374,10 +395,10 @@ int vc_widget_unprepare()
                return VC_ERROR_INVALID_STATE;
        }
 
-       __vc_widget_internal_unprepare();
+       __vc_widget_internal_unprepare(vc_w);
 
-       vc_widget_client_set_state(g_vc_w, VC_STATE_INITIALIZED);
-       ecore_timer_add(0, __vc_widget_notify_state_changed, g_vc_w);
+       vc_widget_client_set_state(vc_w, VC_STATE_INITIALIZED);
+       ecore_timer_add(0, __vc_widget_notify_state_changed, vc_w);
 
        SLOG(LOG_DEBUG, TAG_VCW, "=====");
        SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -385,12 +406,12 @@ int vc_widget_unprepare()
        return VC_ERROR_NONE;
 }
 
-int vc_widget_enable_asr_result(bool enable)
+int vc_widget_enable_asr_result(vc_h vc_w, bool enable)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Enable asr result");
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -409,7 +430,7 @@ int vc_widget_enable_asr_result(bool enable)
        int ret = -1;
 
        do {
-               ret = vc_widget_dbus_request_enable_asr_result(g_vc_w->handle, enable);
+               ret = vc_widget_dbus_request_enable_asr_result(getpid(), enable);
                if (0 != ret) {
                        if (VC_ERROR_TIMED_OUT != ret) {
                                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to enable asr result : %s", __vc_widget_get_error_code(ret));
@@ -426,13 +447,15 @@ int vc_widget_enable_asr_result(bool enable)
                }
        } while (0 != ret);
 
+       vc_widget_client_set_asr_result_enabled(vc_w, enable);
+
        SLOG(LOG_DEBUG, TAG_VCW, "=====");
        SLOG(LOG_DEBUG, TAG_VCW, " ");
 
        return ret;
 }
 
-int vc_widget_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
+int vc_widget_foreach_supported_languages(vc_h vc_w, vc_supported_language_cb callback, void* user_data)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Foreach Supported Language");
 
@@ -444,7 +467,7 @@ int vc_widget_foreach_supported_languages(vc_supported_language_cb callback, voi
        }
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -464,7 +487,7 @@ int vc_widget_foreach_supported_languages(vc_supported_language_cb callback, voi
        return VC_ERROR_NONE;
 }
 
-int vc_widget_get_current_language(char** language)
+int vc_widget_get_current_language(vc_h vc_w, char** language)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Get Current Language");
 
@@ -476,7 +499,7 @@ int vc_widget_get_current_language(char** language)
        }
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -496,7 +519,7 @@ int vc_widget_get_current_language(char** language)
        return ret;
 }
 
-int vc_widget_get_state(vc_state_e* state)
+int vc_widget_get_state(vc_h vc_w, vc_state_e* state)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Get State");
 
@@ -506,7 +529,7 @@ int vc_widget_get_state(vc_state_e* state)
        }
 
        vc_state_e temp;
-       if (0 != vc_widget_client_get_state(g_vc_w, &temp)) {
+       if (0 != vc_widget_client_get_state(vc_w, &temp)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -528,7 +551,7 @@ int vc_widget_get_state(vc_state_e* state)
        return VC_ERROR_NONE;
 }
 
-int vc_widget_get_service_state(vc_service_state_e* state)
+int vc_widget_get_service_state(vc_h vc_w, vc_service_state_e* state)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Get Service State");
 
@@ -538,7 +561,7 @@ int vc_widget_get_service_state(vc_service_state_e* state)
        }
 
        vc_state_e temp;
-       if (0 != vc_widget_client_get_state(g_vc_w, &temp)) {
+       if (0 != vc_widget_client_get_state(vc_w, &temp)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -554,7 +577,7 @@ int vc_widget_get_service_state(vc_service_state_e* state)
 
        /* get service state */
        vc_service_state_e service_state;
-       if (0 != vc_widget_client_get_service_state(g_vc_w, &service_state)) {
+       if (0 != vc_widget_client_get_service_state(vc_w, &service_state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to get service state");
                return VC_ERROR_OPERATION_FAILED;
        }
@@ -575,12 +598,12 @@ int vc_widget_get_service_state(vc_service_state_e* state)
        return VC_ERROR_NONE;
 }
 
-int vc_widget_set_foreground(bool value)
+int vc_widget_set_foreground(vc_h vc_w, bool value)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Set foreground state");
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not valid");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -608,12 +631,12 @@ int vc_widget_set_foreground(bool value)
        return VC_ERROR_NONE;
 }
 
-int vc_widget_is_format_supported(vc_cmd_format_e format, bool* support)
+int vc_widget_is_format_supported(vc_h vc_w, vc_cmd_format_e format, bool* support)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Is command type supported");
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not valid");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -712,7 +735,7 @@ int vc_widget_start(bool stop_by_silence, vc_cmd_group_h vc_group)
        } else {
                int count = 0;
                do {
-                       ret = vc_widget_dbus_request_start(g_vc_w->handle, stop_by_silence);
+                       ret = vc_widget_dbus_request_start(getpid(), stop_by_silence);
                        if (0 != ret) {
                                if (VC_ERROR_TIMED_OUT != ret) {
                                        SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to request start : %s", __vc_widget_get_error_code(ret));
@@ -798,7 +821,7 @@ int vc_widget_stop()
 
        int count = 0;
        do {
-               ret = vc_widget_dbus_request_stop(g_vc_w->handle);
+               ret = vc_widget_dbus_request_stop(getpid());
                if (0 != ret) {
                        if (VC_ERROR_TIMED_OUT != ret) {
                                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to request stop : %s", __vc_widget_get_error_code(ret));
@@ -819,12 +842,12 @@ int vc_widget_stop()
 }
 #endif
 
-int vc_widget_cancel()
+int vc_widget_cancel(vc_h vc_w)
 {
        SLOG(LOG_DEBUG, TAG_VCW, "===== [Widget] Cancel Recognition");
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
                SLOG(LOG_DEBUG, TAG_VCW, " ");
@@ -841,7 +864,7 @@ int vc_widget_cancel()
 
        /* Check service state */
        vc_service_state_e service_state = -1;
-       vc_widget_client_get_service_state(g_vc_w, &service_state);
+       vc_widget_client_get_service_state(vc_w, &service_state);
        if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
                SLOG(LOG_DEBUG, TAG_VCW, "=====");
@@ -853,7 +876,7 @@ int vc_widget_cancel()
        int ret = -1;
 
        do {
-               ret = vc_widget_dbus_request_cancel(g_vc_w->handle);
+               ret = vc_widget_dbus_request_cancel(getpid());
                if (0 != ret) {
                        if (VC_ERROR_TIMED_OUT != ret) {
                                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to request cancel : %s", __vc_widget_get_error_code(ret));
@@ -877,17 +900,18 @@ int vc_widget_cancel()
 
 static Eina_Bool __vc_widget_notify_error(void *data)
 {
+       vc_h vc_w = (vc_h)data;
        vc_error_cb callback = NULL;
        void* user_data;
        int reason;
 
-       vc_widget_client_get_error_cb(g_vc_w, &callback, &user_data);
-       vc_widget_client_get_error(g_vc_w, &reason);
+       vc_widget_client_get_error_cb(vc_w, &callback, &user_data);
+       vc_widget_client_get_error(vc_w, &reason);
 
        if (NULL != callback) {
-               vc_widget_client_use_callback(g_vc_w);
+               vc_widget_client_use_callback(vc_w);
                callback(reason, user_data);
-               vc_widget_client_not_use_callback(g_vc_w);
+               vc_widget_client_not_use_callback(vc_w);
                SLOG(LOG_DEBUG, TAG_VCW, "[Error] callback is called");
        } else {
                SLOG(LOG_WARN, TAG_VCW, "[WARNING] Error callback is null");
@@ -899,32 +923,47 @@ static Eina_Bool __vc_widget_notify_error(void *data)
 int __vc_widget_cb_error(int reason, int daemon_pid, char* msg)
 {
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
-               SLOG(LOG_ERROR, TAG_VCW, "[WARNING] Invalid client");
-               return -1;
-       }
 
-       /* check state */
-       if (state != VC_STATE_READY) {
-               SLOG(LOG_ERROR, TAG_VCW, "[WARNING] not connected client yet");
-               return -1;
-       }
+       GSList* client_list = vc_widget_client_get_client_list();
 
-       if (VC_ERROR_SERVICE_RESET == reason) {
-               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] VC daemon reset");
+       vc_widget_s *data = NULL;
+       vc_h vc_w = NULL;
 
-               vc_widget_client_set_state(g_vc_w, VC_STATE_INITIALIZED);
-               __vc_widget_notify_state_changed(g_vc_w);
+       int count = g_slist_length(client_list);
+       int i;
+       for (i = 0; i < count; i++) {
+               data = g_slist_nth_data(client_list, i);
+               if (NULL != data) {
+                       vc_w = data->vc;
 
-               if (0 != vc_widget_prepare()) {
-                       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to prepare");
-               }
-       }
+                       if (0 != vc_widget_client_get_state(vc_w, &state)) {
+                               SLOG(LOG_ERROR, TAG_VCW, "[WARNING] Invalid client");
+                               return -1;
+                       }
 
-       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
+                       /* check state */
+                       if (state != VC_STATE_READY) {
+                               SLOG(LOG_ERROR, TAG_VCW, "[WARNING] not connected client yet");
+                               return -1;
+                       }
 
-       vc_widget_client_set_error(g_vc_w, reason);
-       ecore_timer_add(0, __vc_widget_notify_error, g_vc_w);
+                       if (VC_ERROR_SERVICE_RESET == reason) {
+                               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] VC daemon reset");
+
+                               vc_widget_client_set_state(vc_w, VC_STATE_INITIALIZED);
+                               __vc_widget_notify_state_changed(vc_w);
+
+                               if (0 != vc_widget_prepare(vc_w)) {
+                                       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to prepare");
+                               }
+                       }
+
+                       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);
+               }
+       }
 
        return 0;
 }
@@ -936,51 +975,60 @@ static Eina_Bool __vc_widget_start_recording(void *data)
                g_w_start_timer = NULL;
        }
 
+       int ret;
+       ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_WIDGET);
+       if (0 != ret)
+               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_WIDGET, ret);
+
        vc_widget_send_current_command_list_cb send_command_list_cb = NULL;
        void* send_command_user_data = NULL;
        vc_cmd_list_h vc_cmd_list = NULL;
 
-       int ret = vc_widget_client_get_send_command_list_cb(g_vc_w, &send_command_list_cb, &send_command_user_data);
-       if (0 != ret) {
-               SLOG(LOG_ERROR, TAG_VCW, "[WARNING] Invalid client");
-               return -1;
-       }
-
-       if (NULL != send_command_list_cb) {
-               vc_widget_client_use_callback(g_vc_w);
-               send_command_list_cb(&vc_cmd_list, send_command_user_data);
-               vc_widget_client_not_use_callback(g_vc_w);
-               SLOG(LOG_DEBUG, TAG_VCW, "client result callback called");
-
-       } else {
-               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] User show tooltip callback is NULL");
-       }
+       GSList* client_list = vc_widget_client_get_client_list();
 
+       vc_widget_s *widget_data = NULL;
+       vc_h vc_w = NULL;
        bool widget_command = false;
 
-       if (NULL != vc_cmd_list) {
-               vc_cmd_list_s* list = NULL;
-               list = (vc_cmd_list_s*)vc_cmd_list;
-
-               ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_WIDGET);
-               if (0 != ret)
-                       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_WIDGET, ret);
-
-               ret = vc_cmd_parser_save_file(getpid(), VC_COMMAND_TYPE_WIDGET, list->list, NULL);
-               if (0 == ret) {
-                       /* widget command is valid */
-                       widget_command = true;
-                       SLOG(LOG_DEBUG, TAG_VCW, "Widget command is valid");
-               } else {
-                       ret = VC_ERROR_OPERATION_FAILED;
-                       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to save command group : %s", __vc_widget_get_error_code(ret));
+       int count = g_slist_length(client_list);
+       int i;
+       for (i = 0; i < count; i++) {
+               widget_data = g_slist_nth_data(client_list, i);
+               if (NULL != widget_data) {
+                       vc_w = widget_data->vc;
+
+                       vc_widget_client_get_send_command_list_cb(vc_w, &send_command_list_cb, &send_command_user_data);
+
+                       if (NULL != send_command_list_cb) {
+                               vc_widget_client_use_callback(vc_w);
+                               send_command_list_cb(&vc_cmd_list, send_command_user_data);
+                               vc_widget_client_not_use_callback(vc_w);
+                               SLOG(LOG_DEBUG, TAG_VCW, "client command list callback called");
+                               if (NULL != vc_cmd_list) {
+                                       vc_cmd_list_s* list = NULL;
+                                       list = (vc_cmd_list_s*)vc_cmd_list;
+                                       ret = vc_cmd_parser_save_file(getpid(), VC_COMMAND_TYPE_WIDGET, list->list, NULL);
+                                       if (0 == ret) {
+                                               /* widget command is valid */
+                                               widget_command = true;
+                                               SLOG(LOG_DEBUG, TAG_VCW, "Widget command is valid");
+                                       } else {
+                                               ret = VC_ERROR_OPERATION_FAILED;
+                                               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to save command group : %s", __vc_widget_get_error_code(ret));
+                                       }
+                               }
+                       } else {
+                               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] User show tooltip callback is NULL");
+                       }
                }
        }
 
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] command list (%d)", g_slist_length(((vc_cmd_list_s*)vc_cmd_list)->list));
+
        ret = -1;
-       int count = 0;
+       count = 0;
        while (0 != ret) {
-               ret = vc_widget_dbus_request_start_recording(g_vc_w->handle, widget_command);
+               ret = vc_widget_dbus_request_start_recording(getpid(), widget_command);
                if (0 != ret) {
                        if (VC_ERROR_TIMED_OUT != ret) {
                                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to request start recording to daemon : %s", __vc_widget_get_error_code(ret));
@@ -1002,25 +1050,36 @@ static Eina_Bool __vc_widget_start_recording(void *data)
 
 static Eina_Bool __vc_widget_notify_tooltip(void *data)
 {
-       if (NULL != g_w_tooltip_timer) {
-               ecore_timer_del(g_w_tooltip_timer);
-               g_w_tooltip_timer = NULL;
-       }
+       bool show = (bool)data;
 
        vc_widget_show_tooltip_cb callback;
        void* user_data;
-       bool show;
 
-       vc_widget_client_get_show_tooltip_cb(g_vc_w, &callback, &user_data);
-       vc_widget_client_get_show_tooltip(g_vc_w, &show);
+       GSList* client_list = vc_widget_client_get_client_list();
 
-       if (NULL != callback) {
-               vc_widget_client_use_callback(g_vc_w);
-               callback(show, user_data);
-               vc_widget_client_not_use_callback(g_vc_w);
-               SLOG(LOG_DEBUG, TAG_VCW, "client result callback called");
-       } else {
-               SLOG(LOG_WARN, TAG_VCW, "[WARNING] Show tooltip callback is NULL");
+       vc_widget_s *widget_data = NULL;
+       vc_h vc_w = NULL;
+
+       int count = g_slist_length(client_list);
+       int i;
+       for (i = 0; i < count; i++) {
+               widget_data = g_slist_nth_data(client_list, i);
+               if (NULL != widget_data) {
+                       vc_w = widget_data->vc;
+
+                       vc_widget_client_set_show_tooltip(vc_w, show);
+                       vc_widget_client_get_show_tooltip_cb(vc_w, &callback, &user_data);
+                       vc_widget_client_get_show_tooltip(vc_w, &show);
+
+                       if (NULL != callback) {
+                               vc_widget_client_use_callback(vc_w);
+                               callback(show, user_data);
+                               vc_widget_client_not_use_callback(vc_w);
+                               SLOG(LOG_DEBUG, TAG_VCW, "client show tooltip callback called");
+                       } else {
+                               SLOG(LOG_WARN, TAG_VCW, "[WARNING] Show tooltip callback is NULL");
+                       }
+               }
        }
 
        if (true == show) {
@@ -1032,15 +1091,7 @@ static Eina_Bool __vc_widget_notify_tooltip(void *data)
 
 void __vc_widget_cb_show_tooltip(int pid, bool show)
 {
-       if (0 != vc_widget_client_get_handle(pid, &g_vc_w)) {
-               SLOG(LOG_ERROR, TAG_VCW, "Handle is not valid : pid(%d)", pid);
-               return;
-       }
-
-       vc_widget_client_set_show_tooltip(g_vc_w, show);
-       g_w_tooltip_timer = ecore_timer_add(0, __vc_widget_notify_tooltip, NULL);
-
-       return;
+       ecore_timer_add(0, __vc_widget_notify_tooltip, (void*)show);
 }
 
 static Eina_Bool __vc_widget_notify_result(void *data)
@@ -1048,16 +1099,6 @@ static Eina_Bool __vc_widget_notify_result(void *data)
        char* temp_text;
        int event;
        vc_cmd_list_h vc_cmd_list = NULL;
-
-       vc_result_cb callback = NULL;
-       void* user_data = NULL;
-
-       vc_widget_client_get_result_cb(g_vc_w, &callback, &user_data);
-       if (NULL == callback) {
-               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Client result callback is NULL");
-               return EINA_FALSE;
-       }
-
        if (0 != vc_cmd_list_create(&vc_cmd_list)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to create command list");
                return EINA_FALSE;
@@ -1065,15 +1106,37 @@ static Eina_Bool __vc_widget_notify_result(void *data)
 
        vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
 
-       SLOG(LOG_INFO, TAG_VCW, "Result info : result text(%s) event(%d)", temp_text, event);
+       SLOG(LOG_DEBUG, TAG_VCW, "Result info : result text(%s) event(%d)", temp_text, event);
+
+       vc_result_cb callback = NULL;
+       void* user_data = NULL;
+
+       GSList* client_list = vc_widget_client_get_client_list();
+
+       vc_widget_s *widget_data = NULL;
+       vc_h vc_w = NULL;
+
+       int count = g_slist_length(client_list);
+       int i;
+       for (i = 0; i < count; i++) {
+               widget_data = g_slist_nth_data(client_list, i);
+               if (NULL != widget_data) {
+                       vc_w = widget_data->vc;
+                       vc_widget_client_get_result_cb(vc_w, &callback, &user_data);
+                       if (NULL == callback) {
+                               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Client result callback is NULL");
+                               return EINA_FALSE;
+                       }
 
-       vc_cmd_print_list(vc_cmd_list);
+                       vc_cmd_print_list(vc_cmd_list);
 
-       vc_widget_client_use_callback(g_vc_w);
-       callback(event, vc_cmd_list, temp_text, user_data);
-       vc_widget_client_not_use_callback(g_vc_w);
+                       vc_widget_client_use_callback(vc_w);
+                       callback(event, vc_cmd_list, temp_text, user_data);
+                       vc_widget_client_not_use_callback(vc_w);
 
-       SLOG(LOG_INFO, TAG_VCW, "Widget result callback called");
+                       SLOG(LOG_DEBUG, TAG_VCW, "Widget result callback called");
+               }
+       }
 
        /* Release result */
        if (NULL != temp_text)  free(temp_text);
@@ -1095,55 +1158,78 @@ bool __vc_widget_cb_asr_result()
        char* temp_text;
        int event;
        vc_cmd_list_h vc_cmd_list = NULL;
-
-       vc_asr_result_cb callback = NULL;
-       void* user_data = NULL;
-
-       vc_widget_client_get_asr_result_cb(g_vc_w, &callback, &user_data);
-       if (NULL == callback) {
-               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Client result callback is NULL");
-               return EINA_FALSE;
-       }
-
        if (0 != vc_cmd_list_create(&vc_cmd_list)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to create command list");
-               return EINA_FALSE;
+               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);
 
-       vc_widget_client_use_callback(g_vc_w);
-       bool ret = callback(event, temp_text, user_data);
-       vc_widget_client_not_use_callback(g_vc_w);
+       vc_asr_result_cb callback = NULL;
+       void* user_data = NULL;
+
+       GSList* client_list = vc_widget_client_get_client_list();
+
+       vc_widget_s *data = NULL;
+       vc_h vc_w = NULL;
+
+       bool consumed = false;
+       int count = g_slist_length(client_list);
+       int i;
+       for (i = 0; i < count; i++) {
+               data = g_slist_nth_data(client_list, i);
+               if (NULL != data) {
+                       vc_w = data->vc;
+                       bool enabled = false;
+                       vc_widget_client_get_asr_result_enabled(vc_w, &enabled);
+                       if (false == enabled)
+                               continue;
+
+                       vc_widget_client_get_asr_result_cb(vc_w, &callback, &user_data);
+                       if (NULL == callback) {
+                               SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Client result callback is NULL");
+                               continue;
+                       }
+
+                       vc_widget_client_use_callback(vc_w);
+                       consumed = callback(event, temp_text, user_data);
+                       vc_widget_client_not_use_callback(vc_w);
+                       if (true == consumed)
+                               break;
 
-       SLOG(LOG_DEBUG, TAG_VCW, "Widget asr result callback called");
+                       SLOG(LOG_DEBUG, TAG_VCW, "Widget asr result callback called");
+               }
+       }
 
        /* Release result */
        if (NULL != temp_text)  free(temp_text);
 
        vc_cmd_list_destroy(vc_cmd_list, true);
 
-       return ret;
+       return consumed;
 }
 
 static Eina_Bool __vc_widget_notify_state_changed(void *data)
 {
+       vc_h vc_w = (vc_h)data;
+
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
+
        vc_state_changed_cb changed_callback = NULL;
        void* user_data;
 
-       vc_widget_client_get_state_changed_cb(g_vc_w, &changed_callback, &user_data);
+       vc_widget_client_get_state_changed_cb(vc_w, &changed_callback, &user_data);
 
        vc_state_e current_state;
        vc_state_e before_state;
 
-       vc_widget_client_get_before_state(g_vc_w, &current_state, &before_state);
+       vc_widget_client_get_before_state(vc_w, &current_state, &before_state);
 
        if (NULL != changed_callback) {
-               vc_widget_client_use_callback(g_vc_w);
+               vc_widget_client_use_callback(vc_w);
                changed_callback(before_state, current_state, user_data);
-               vc_widget_client_not_use_callback(g_vc_w);
+               vc_widget_client_not_use_callback(vc_w);
                SLOG(LOG_DEBUG, TAG_VCW, "State changed callback is called");
        } else {
                SLOG(LOG_WARN, TAG_VCW, "[WARNING] State changed callback is null");
@@ -1152,13 +1238,14 @@ static Eina_Bool __vc_widget_notify_state_changed(void *data)
        return EINA_FALSE;
 }
 
-int vc_widget_set_result_cb(vc_result_cb callback, void* user_data)
+int vc_widget_set_result_cb(vc_h vc_w, vc_result_cb callback, void* user_data)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        if (NULL == callback)
                return VC_ERROR_INVALID_PARAMETER;
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                return VC_ERROR_INVALID_STATE;
        }
 
@@ -1168,15 +1255,16 @@ int vc_widget_set_result_cb(vc_result_cb callback, void* user_data)
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_result_cb(g_vc_w, callback, user_data);
+       vc_widget_client_set_result_cb(vc_w, callback, user_data);
 
        return 0;
 }
 
-int vc_widget_unset_result_cb()
+int vc_widget_unset_result_cb(vc_h vc_w)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1187,18 +1275,19 @@ int vc_widget_unset_result_cb()
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_result_cb(g_vc_w, NULL, NULL);
+       vc_widget_client_set_result_cb(vc_w, NULL, NULL);
 
        return 0;
 }
 
-int vc_widget_set_show_tooltip_cb(vc_widget_show_tooltip_cb callback, void* user_data)
+int vc_widget_set_show_tooltip_cb(vc_h vc_w, vc_widget_show_tooltip_cb callback, void* user_data)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        if (NULL == callback)
                return VC_ERROR_INVALID_PARAMETER;
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1209,15 +1298,16 @@ int vc_widget_set_show_tooltip_cb(vc_widget_show_tooltip_cb callback, void* user
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_show_tooltip_cb(g_vc_w, callback, user_data);
+       vc_widget_client_set_show_tooltip_cb(vc_w, callback, user_data);
 
        return 0;
 }
 
-int vc_widget_unset_show_tooltip_cb()
+int vc_widget_unset_show_tooltip_cb(vc_h vc_w)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1228,15 +1318,16 @@ int vc_widget_unset_show_tooltip_cb()
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_show_tooltip_cb(g_vc_w, NULL, NULL);
+       vc_widget_client_set_show_tooltip_cb(vc_w, NULL, NULL);
 
        return 0;
 }
 
-int vc_widget_set_send_current_command_list_cb(vc_widget_send_current_command_list_cb callback, void* user_data)
+int vc_widget_set_send_current_command_list_cb(vc_h vc_w, vc_widget_send_current_command_list_cb callback, void* user_data)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1247,15 +1338,16 @@ int vc_widget_set_send_current_command_list_cb(vc_widget_send_current_command_li
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_send_command_list_cb(g_vc_w, callback, user_data);
+       vc_widget_client_set_send_command_list_cb(vc_w, callback, user_data);
 
        return 0;
 }
 
-int vc_widget_unset_send_current_command_list_cb()
+int vc_widget_unset_send_current_command_list_cb(vc_h vc_w)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1266,47 +1358,62 @@ int vc_widget_unset_send_current_command_list_cb()
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_send_command_list_cb(g_vc_w, NULL, NULL);
+       vc_widget_client_set_send_command_list_cb(vc_w, NULL, NULL);
 
        return 0;
 }
 
 int __vc_widget_cb_service_state(int state)
 {
-       vc_service_state_e current_state = (vc_service_state_e)state;
-       vc_service_state_e before_state;
-       vc_widget_client_get_service_state(g_vc_w, &before_state);
+       GSList* client_list = vc_widget_client_get_client_list();
 
-       if (current_state == before_state) {
-               return 0;
-       }
+       vc_widget_s *data = NULL;
+       vc_h vc_w = NULL;
 
-       SLOG(LOG_DEBUG, TAG_VCW, "Service State changed : Before(%d) Current(%d)",
-               before_state, current_state);
+       int count = g_slist_length(client_list);
+       int i;
+       for (i = 0; i < count; i++) {
+               data = g_slist_nth_data(client_list, i);
+               if (NULL != data) {
+                       vc_w = data->vc;
 
-       /* Save service state */
-       vc_widget_client_set_service_state(g_vc_w, current_state);
+                       vc_service_state_e current_state = (vc_service_state_e)state;
+                       vc_service_state_e before_state;
+                       vc_widget_client_get_service_state(vc_w, &before_state);
 
-       vc_service_state_changed_cb callback = NULL;
-       void* service_user_data = NULL;
-       vc_widget_client_get_service_state_changed_cb(g_vc_w, &callback, &service_user_data);
+                       if (current_state == before_state) {
+                               continue;
+                       }
 
-       if (NULL != callback) {
-               vc_widget_client_use_callback(g_vc_w);
-               callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
-               vc_widget_client_not_use_callback(g_vc_w);
-               SLOG(LOG_DEBUG, TAG_VCW, "Service state changed callback is called");
-       } else {
-               SLOG(LOG_WARN, TAG_VCW, "[WARNING] Service state changed callback is null");
+                       SLOG(LOG_DEBUG, TAG_VCW, "Service State changed : Before(%d) Current(%d)",
+                               before_state, current_state);
+
+                       /* Save service state */
+                       vc_widget_client_set_service_state(vc_w, current_state);
+
+                       vc_service_state_changed_cb callback = NULL;
+                       void* service_user_data = NULL;
+                       vc_widget_client_get_service_state_changed_cb(vc_w, &callback, &service_user_data);
+
+                       if (NULL != callback) {
+                               vc_widget_client_use_callback(vc_w);
+                               callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
+                               vc_widget_client_not_use_callback(vc_w);
+                               SLOG(LOG_DEBUG, TAG_VCW, "Service state changed callback is called");
+                       } else {
+                               SLOG(LOG_WARN, TAG_VCW, "[WARNING] Service state changed callback is null");
+                       }
+               }
        }
 
        return 0;
 }
 
-int vc_widget_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
+int vc_widget_set_service_state_changed_cb(vc_h vc_w, vc_service_state_changed_cb callback, void* user_data)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1317,15 +1424,16 @@ int vc_widget_set_service_state_changed_cb(vc_service_state_changed_cb callback,
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_service_state_changed_cb(g_vc_w, callback, user_data);
+       vc_widget_client_set_service_state_changed_cb(vc_w, callback, user_data);
 
        return 0;
 }
 
-int vc_widget_unset_service_state_changed_cb()
+int vc_widget_unset_service_state_changed_cb(vc_h vc_w)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1336,18 +1444,19 @@ int vc_widget_unset_service_state_changed_cb()
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_service_state_changed_cb(g_vc_w, NULL, NULL);
+       vc_widget_client_set_service_state_changed_cb(vc_w, NULL, NULL);
 
        return 0;
 }
 
-int vc_widget_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
+int vc_widget_set_state_changed_cb(vc_h vc_w, vc_state_changed_cb callback, void* user_data)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        if (NULL == callback)
                return VC_ERROR_INVALID_PARAMETER;
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1358,15 +1467,16 @@ int vc_widget_set_state_changed_cb(vc_state_changed_cb callback, void* user_data
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_state_changed_cb(g_vc_w, callback, user_data);
+       vc_widget_client_set_state_changed_cb(vc_w, callback, user_data);
 
        return 0;
 }
 
-int vc_widget_unset_state_changed_cb()
+int vc_widget_unset_state_changed_cb(vc_h vc_w)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1377,18 +1487,19 @@ int vc_widget_unset_state_changed_cb()
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_state_changed_cb(g_vc_w, NULL, NULL);
+       vc_widget_client_set_state_changed_cb(vc_w, NULL, NULL);
 
        return 0;
 }
 
-int vc_widget_set_asr_result_cb(vc_asr_result_cb callback, void* user_data)
+int vc_widget_set_asr_result_cb(vc_h vc_w, vc_asr_result_cb callback, void* user_data)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        if (NULL == callback)
                return VC_ERROR_INVALID_PARAMETER;
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1399,15 +1510,16 @@ int vc_widget_set_asr_result_cb(vc_asr_result_cb callback, void* user_data)
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_asr_result_cb(g_vc_w, callback, user_data);
+       vc_widget_client_set_asr_result_cb(vc_w, callback, user_data);
 
        return 0;
 }
 
-int vc_widget_unset_asr_result_cb()
+int vc_widget_unset_asr_result_cb(vc_h vc_w)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1418,18 +1530,19 @@ int vc_widget_unset_asr_result_cb()
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_asr_result_cb(g_vc_w, NULL, NULL);
+       vc_widget_client_set_asr_result_cb(vc_w, NULL, NULL);
 
        return 0;
 }
 
-int vc_widget_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
+int vc_widget_set_current_language_changed_cb(vc_h vc_w, vc_current_language_changed_cb callback, void* user_data)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        if (NULL == callback)
                return VC_ERROR_INVALID_PARAMETER;
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1440,15 +1553,16 @@ int vc_widget_set_current_language_changed_cb(vc_current_language_changed_cb cal
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_current_lang_changed_cb(g_vc_w, callback, user_data);
+       vc_widget_client_set_current_lang_changed_cb(vc_w, callback, user_data);
 
        return 0;
 }
 
-int vc_widget_unset_current_language_changed_cb()
+int vc_widget_unset_current_language_changed_cb(vc_h vc_w)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1459,18 +1573,19 @@ int vc_widget_unset_current_language_changed_cb()
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_current_lang_changed_cb(g_vc_w, NULL, NULL);
+       vc_widget_client_set_current_lang_changed_cb(vc_w, NULL, NULL);
 
        return 0;
 }
 
-int vc_widget_set_error_cb(vc_error_cb callback, void* user_data)
+int vc_widget_set_error_cb(vc_h vc_w, vc_error_cb callback, void* user_data)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        if (NULL == callback)
                return VC_ERROR_INVALID_PARAMETER;
 
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1481,15 +1596,16 @@ int vc_widget_set_error_cb(vc_error_cb callback, void* user_data)
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_error_cb(g_vc_w, callback,  user_data);
+       vc_widget_client_set_error_cb(vc_w, callback,  user_data);
 
        return 0;
 }
 
-int vc_widget_unset_error_cb()
+int vc_widget_unset_error_cb(vc_h vc_w)
 {
+       SLOG(LOG_DEBUG, TAG_VCW, "[CHECK] uid (%d)", vc_w->handle);
        vc_state_e state;
-       if (0 != vc_widget_client_get_state(g_vc_w, &state)) {
+       if (0 != vc_widget_client_get_state(vc_w, &state)) {
                SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
                return VC_ERROR_INVALID_STATE;
        }
@@ -1500,7 +1616,7 @@ int vc_widget_unset_error_cb()
                return VC_ERROR_INVALID_STATE;
        }
 
-       vc_widget_client_set_error_cb(g_vc_w, NULL, NULL);
+       vc_widget_client_set_error_cb(vc_w, NULL, NULL);
 
        return 0;
 }
index d32c23d..e2415a6 100644 (file)
 #include "voice_control_command.h"
 #include "voice_control_common.h"
 
-
-typedef struct {
-       /* base info */
-       vc_h    vc;
-       int     pid;
-       int     uid;            /*<< unique id = pid + handle */
-       int     xid;            /*<< main X window id */
-
-       vc_result_cb                    result_cb;
-       void*                           result_user_data;
-       vc_asr_result_cb                asr_result_cb;
-       void*                           asr_result_user_data;
-       vc_error_cb                     error_cb;
-       void*                           error_user_data;
-       vc_service_state_changed_cb     service_state_changed_cb;
-       void*                           service_state_changed_user_data;
-       vc_state_changed_cb             state_changed_cb;
-       void*                           state_changed_user_data;
-       vc_widget_show_tooltip_cb       show_tooltip_cb;
-       void*                           show_tooltip_user_data;
-       vc_current_language_changed_cb  current_lang_changed_cb;
-       void*                           current_lang_changed_user_data;
-
-       vc_widget_send_current_command_list_cb  send_command_list_cb;
-       void*                                   send_command_list_user_data;
-
-       /* tooltip */
-       bool                    show_tooltip;
-
-       /* service state */
-       vc_service_state_e      service_state;
-
-       /* state */
-       vc_state_e      before_state;
-       vc_state_e      current_state;
-
-       /* mutex */
-       int     cb_ref_count;
-
-       /* error data */
-       int     reason;
-} vc_widget_s;
-
-
+/* Max number of handle */
+static const int g_max_handle = 999;
+/* allocated handle */
+static int g_allocated_handle = 0;
 /* widget list */
 static GSList *g_widget_list = NULL;
 
-static vc_widget_s* __widget_get(vc_h vc)
+vc_widget_s* widget_get(vc_h vc)
 {
        if (vc == NULL) {
                SLOG(LOG_WARN, TAG_VCW, "[WARNING] Input parameter is NULL");
@@ -94,6 +54,18 @@ static vc_widget_s* __widget_get(vc_h vc)
        return NULL;
 }
 
+static int __client_generate_uid(int pid)
+{
+       g_allocated_handle++;
+
+       if (g_allocated_handle > g_max_handle) {
+               g_allocated_handle = 1;
+       }
+
+       /* generate uid, handle number should be smaller than 1000 */
+       return pid * 1000 + g_allocated_handle;
+}
+
 int vc_widget_client_create(vc_h* vc)
 {
        vc_widget_s *widget = NULL;
@@ -111,7 +83,7 @@ int vc_widget_client_create(vc_h* vc)
                return VC_ERROR_OUT_OF_MEMORY;
        }
 
-       temp->handle = getpid();
+       temp->handle = __client_generate_uid(getpid());
 
        /* initialize widget data */
        widget->vc = temp;
@@ -123,6 +95,7 @@ int vc_widget_client_create(vc_h* vc)
        widget->result_user_data = NULL;
        widget->asr_result_cb = NULL;
        widget->asr_result_user_data = NULL;
+       widget->asr_result_enabled = false;
        widget->service_state_changed_cb = NULL;
        widget->service_state_changed_user_data = NULL;
        widget->state_changed_cb = NULL;
@@ -135,6 +108,8 @@ int vc_widget_client_create(vc_h* vc)
        widget->before_state = VC_STATE_INITIALIZED;
        widget->current_state = VC_STATE_INITIALIZED;
 
+       widget->conn_timer = NULL;
+
        widget->cb_ref_count = 0;
 
        g_widget_list = g_slist_append(g_widget_list, widget);
@@ -182,9 +157,14 @@ int vc_widget_client_destroy(vc_h vc)
        return -1;
 }
 
+GSList* vc_widget_client_get_client_list()
+{
+       return g_widget_list;
+}
+
 bool vc_widget_client_is_valid(vc_h vc)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget) {
@@ -240,7 +220,7 @@ int vc_widget_client_get_handle(int uid, vc_h* vc)
 /* set/get callback function */
 int vc_widget_client_set_result_cb(vc_h vc, vc_result_cb callback, void* user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -254,7 +234,7 @@ int vc_widget_client_set_result_cb(vc_h vc, vc_result_cb callback, void* user_da
 
 int vc_widget_client_get_result_cb(vc_h vc, vc_result_cb* callback, void** user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -266,9 +246,35 @@ int vc_widget_client_get_result_cb(vc_h vc, vc_result_cb* callback, void** user_
        return 0;
 }
 
+int vc_widget_client_set_asr_result_enabled(vc_h vc, bool enabled)
+{
+       vc_widget_s* widget = widget_get(vc);
+
+       /* check handle */
+       if (NULL == widget)
+               return VC_ERROR_INVALID_PARAMETER;
+
+       widget->asr_result_enabled = enabled;
+
+       return 0;
+}
+
+int vc_widget_client_get_asr_result_enabled(vc_h vc, bool* enabled)
+{
+       vc_widget_s* widget = widget_get(vc);
+
+       /* check handle */
+       if (NULL == widget)
+               return VC_ERROR_INVALID_PARAMETER;
+
+       *enabled = widget->asr_result_enabled;
+
+       return 0;
+}
+
 int vc_widget_client_set_asr_result_cb(vc_h vc, vc_asr_result_cb callback, void* user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -282,7 +288,7 @@ int vc_widget_client_set_asr_result_cb(vc_h vc, vc_asr_result_cb callback, void*
 
 int vc_widget_client_get_asr_result_cb(vc_h vc, vc_asr_result_cb* callback, void** user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -296,7 +302,7 @@ int vc_widget_client_get_asr_result_cb(vc_h vc, vc_asr_result_cb* callback, void
 
 int vc_widget_client_set_service_state_changed_cb(vc_h vc, vc_service_state_changed_cb callback, void* user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -310,7 +316,7 @@ int vc_widget_client_set_service_state_changed_cb(vc_h vc, vc_service_state_chan
 
 int vc_widget_client_get_service_state_changed_cb(vc_h vc, vc_service_state_changed_cb* callback, void** user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -324,7 +330,7 @@ int vc_widget_client_get_service_state_changed_cb(vc_h vc, vc_service_state_chan
 
 int vc_widget_client_set_state_changed_cb(vc_h vc, vc_state_changed_cb callback, void* user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -338,7 +344,7 @@ int vc_widget_client_set_state_changed_cb(vc_h vc, vc_state_changed_cb callback,
 
 int vc_widget_client_get_state_changed_cb(vc_h vc, vc_state_changed_cb* callback, void** user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -352,7 +358,7 @@ int vc_widget_client_get_state_changed_cb(vc_h vc, vc_state_changed_cb* callback
 
 int vc_widget_client_set_show_tooltip_cb(vc_h vc, vc_widget_show_tooltip_cb callback, void* user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -366,7 +372,7 @@ int vc_widget_client_set_show_tooltip_cb(vc_h vc, vc_widget_show_tooltip_cb call
 
 int vc_widget_client_get_show_tooltip_cb(vc_h vc, vc_widget_show_tooltip_cb* callback, void** user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -380,7 +386,7 @@ int vc_widget_client_get_show_tooltip_cb(vc_h vc, vc_widget_show_tooltip_cb* cal
 
 int vc_widget_client_set_current_lang_changed_cb(vc_h vc, vc_current_language_changed_cb callback, void* user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -394,7 +400,7 @@ int vc_widget_client_set_current_lang_changed_cb(vc_h vc, vc_current_language_ch
 
 int vc_widget_client_get_current_lang_changed_cb(vc_h vc, vc_current_language_changed_cb* callback, void** user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -408,7 +414,7 @@ int vc_widget_client_get_current_lang_changed_cb(vc_h vc, vc_current_language_ch
 
 int vc_widget_client_set_error_cb(vc_h vc, vc_error_cb callback, void* user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -422,7 +428,7 @@ int vc_widget_client_set_error_cb(vc_h vc, vc_error_cb callback, void* user_data
 
 int vc_widget_client_get_error_cb(vc_h vc, vc_error_cb* callback, void** user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -436,7 +442,7 @@ int vc_widget_client_get_error_cb(vc_h vc, vc_error_cb* callback, void** user_da
 
 int vc_widget_client_set_send_command_list_cb(vc_h vc, vc_widget_send_current_command_list_cb callback, void* user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -450,7 +456,7 @@ int vc_widget_client_set_send_command_list_cb(vc_h vc, vc_widget_send_current_co
 
 int vc_widget_client_get_send_command_list_cb(vc_h vc, vc_widget_send_current_command_list_cb* callback, void** user_data)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -466,7 +472,7 @@ int vc_widget_client_get_send_command_list_cb(vc_h vc, vc_widget_send_current_co
 /* set/get option */
 int vc_widget_client_set_service_state(vc_h vc, vc_service_state_e state)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -479,7 +485,7 @@ int vc_widget_client_set_service_state(vc_h vc, vc_service_state_e state)
 
 int vc_widget_client_get_service_state(vc_h vc, vc_service_state_e* state)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -493,7 +499,7 @@ int vc_widget_client_get_service_state(vc_h vc, vc_service_state_e* state)
 
 int vc_widget_client_set_state(vc_h vc, vc_state_e state)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -507,7 +513,7 @@ int vc_widget_client_set_state(vc_h vc, vc_state_e state)
 
 int vc_widget_client_get_state(vc_h vc, vc_state_e* state)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -541,7 +547,7 @@ int vc_widget_client_get_state_by_uid(int uid, vc_state_e* state)
 
 int vc_widget_client_get_before_state(vc_h vc, vc_state_e* state, vc_state_e* before_state)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -555,7 +561,7 @@ int vc_widget_client_get_before_state(vc_h vc, vc_state_e* state, vc_state_e* be
 
 int vc_widget_client_set_xid(vc_h vc, int xid)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -568,7 +574,7 @@ int vc_widget_client_set_xid(vc_h vc, int xid)
 
 int vc_widget_cilent_get_xid(vc_h vc, int* xid)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -581,7 +587,7 @@ int vc_widget_cilent_get_xid(vc_h vc, int* xid)
 
 int vc_widget_client_set_error(vc_h vc, int reason)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -594,7 +600,7 @@ int vc_widget_client_set_error(vc_h vc, int reason)
 
 int vc_widget_client_get_error(vc_h vc, int* reason)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -607,7 +613,7 @@ int vc_widget_client_get_error(vc_h vc, int* reason)
 
 int vc_widget_client_set_show_tooltip(vc_h vc, bool show)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -620,7 +626,7 @@ int vc_widget_client_set_show_tooltip(vc_h vc, bool show)
 
 int vc_widget_client_get_show_tooltip(vc_h vc, bool* show)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -638,7 +644,7 @@ int vc_widget_client_get_count()
 
 int vc_widget_client_use_callback(vc_h vc)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
@@ -650,7 +656,7 @@ int vc_widget_client_use_callback(vc_h vc)
 
 int vc_widget_client_not_use_callback(vc_h vc)
 {
-       vc_widget_s* widget = __widget_get(vc);
+       vc_widget_s* widget = widget_get(vc);
 
        /* check handle */
        if (NULL == widget)
index ca2dc90..b5c9633 100644 (file)
 extern "C" {
 #endif
 
+typedef struct {
+       /* base info */
+       vc_h    vc;
+       int     pid;
+       int     uid;            /*<< unique id = pid + handle */
+       int     xid;            /*<< main X window id */
+
+       vc_result_cb                    result_cb;
+       void*                           result_user_data;
+       vc_asr_result_cb                asr_result_cb;
+       void*                           asr_result_user_data;
+       bool                            asr_result_enabled;
+       vc_error_cb                     error_cb;
+       void*                           error_user_data;
+       vc_service_state_changed_cb     service_state_changed_cb;
+       void*                           service_state_changed_user_data;
+       vc_state_changed_cb             state_changed_cb;
+       void*                           state_changed_user_data;
+       vc_widget_show_tooltip_cb       show_tooltip_cb;
+       void*                           show_tooltip_user_data;
+       vc_current_language_changed_cb  current_lang_changed_cb;
+       void*                           current_lang_changed_user_data;
+
+       vc_widget_send_current_command_list_cb  send_command_list_cb;
+       void*                                   send_command_list_user_data;
+
+       /* tooltip */
+       bool                    show_tooltip;
+
+       /* service state */
+       vc_service_state_e      service_state;
+
+       /* state */
+       vc_state_e      before_state;
+       vc_state_e      current_state;
+
+       Ecore_Timer*    conn_timer;
+
+       /* mutex */
+       int     cb_ref_count;
+
+       /* error data */
+       int     reason;
+} vc_widget_s;
+
 /*
 * Common function
 */
@@ -39,6 +84,10 @@ bool vc_widget_client_is_valid_by_uid(int uid);
 
 int vc_widget_client_get_handle(int uid, vc_h* vc);
 
+vc_widget_s* widget_get(vc_h vc);
+
+GSList* vc_widget_client_get_client_list();
+
 /*
 * set/get callback function
 */
@@ -103,6 +152,10 @@ int vc_widget_client_set_show_tooltip(vc_h vc, bool show);
 
 int vc_widget_client_get_show_tooltip(vc_h vc, bool* show);
 
+int vc_widget_client_set_asr_result_enabled(vc_h vc, bool enabled);
+
+int vc_widget_client_get_asr_result_enabled(vc_h vc, bool* enabled);
+
 
 /* utils */
 int vc_widget_client_get_count();
index 03b6c89..510eb20 100644 (file)
@@ -23,6 +23,7 @@
 #include <voice_control_common.h>
 #include <voice_control_internal.h>
 
+typedef struct vc_s *vc_h;
 
 /**
 * @addtogroup VOICE_CONTROL_WIDGET
@@ -88,7 +89,7 @@ typedef void (*vc_widget_send_current_command_list_cb)(vc_cmd_list_h* vc_cmd_lis
 *
 * @see vc_widget_deinitialize()
 */
-int vc_widget_initialize();
+int vc_widget_initialize(vc_h* vc);
 
 /**
 * @brief Deinitialize voice control for widget.
@@ -102,7 +103,7 @@ int vc_widget_initialize();
 *
 * @see vc_widget_initialize()
 */
-int vc_widget_deinitialize();
+int vc_widget_deinitialize(vc_h vc);
 
 /**
 * @brief Connects the voice control service asynchronously.
@@ -119,7 +120,7 @@ int vc_widget_deinitialize();
 *
 * @see vc_widget_unprepare()
 */
-int vc_widget_prepare();
+int vc_widget_prepare(vc_h vc);
 
 /**
 * @brief Disconnects the voice control service.
@@ -136,7 +137,7 @@ int vc_widget_prepare();
 *
 * @see vc_widget_prepare()
 */
-int vc_widget_unprepare();
+int vc_widget_unprepare(vc_h vc);
 
 /**
 * @brief Retrieves all supported languages using callback function.
@@ -157,7 +158,7 @@ int vc_widget_unprepare();
 * @see vc_supported_language_cb()
 * @see vc_widget_get_current_language()
 */
-int vc_widget_foreach_supported_languages(vc_supported_language_cb callback, void* user_data);
+int vc_widget_foreach_supported_languages(vc_h vc, vc_supported_language_cb callback, void* user_data);
 
 /**
 * @brief Gets current language set by user.
@@ -180,7 +181,7 @@ int vc_widget_foreach_supported_languages(vc_supported_language_cb callback, voi
 *
 * @see vc_widget_foreach_supported_languages()
 */
-int vc_widget_get_current_language(char** language);
+int vc_widget_get_current_language(vc_h vc, char** language);
 
 /**
 * @brief Gets current state of voice control widget.
@@ -199,7 +200,7 @@ int vc_widget_get_current_language(char** language);
 * @see vc_widget_set_state_changed_cb()
 * @see vc_widget_unset_state_changed_cb()
 */
-int vc_widget_get_state(vc_state_e* state);
+int vc_widget_get_state(vc_h vc, vc_state_e* state);
 
 /**
 * @brief Gets current state of voice control service.
@@ -217,7 +218,7 @@ int vc_widget_get_state(vc_state_e* state);
 * @see vc_set_service_state_changed_cb()
 * @see vc_unset_service_state_changed_cb()
 */
-int vc_widget_get_service_state(vc_service_state_e* state);
+int vc_widget_get_service_state(vc_h vc, vc_service_state_e* state);
 
 /**
 * @brief Checks whether the command format is supported.
@@ -234,7 +235,7 @@ int vc_widget_get_service_state(vc_service_state_e* state);
 *
 * @pre The state should be #VC_STATE_READY.
 */
-int vc_widget_is_command_format_supported(vc_cmd_format_e format, bool* support);
+int vc_widget_is_command_format_supported(vc_h vc, vc_cmd_format_e format, bool* support);
 
 
 /**
@@ -251,7 +252,7 @@ int vc_widget_is_command_format_supported(vc_cmd_format_e format, bool* support)
 *
 * @pre The state should be #VC_STATE_READY.
 */
-int vc_widget_set_foreground(bool value);
+int vc_widget_set_foreground(vc_h vc, bool value);
 
 /**
 * @brief Cancels recognition.
@@ -272,7 +273,7 @@ int vc_widget_set_foreground(bool value);
 * @see vc_widget_stop()
 * @see vc_state_changed_cb()
 */
-int vc_widget_cancel();
+int vc_widget_cancel(vc_h vc);
 
 /**
 * @brief Registers a callback function for getting recognition result.
@@ -291,7 +292,7 @@ int vc_widget_cancel();
 * @see vc_widget_result_cb()
 * @see vc_widget_unset_result_cb()
 */
-int vc_widget_set_result_cb(vc_result_cb callback, void* user_data);
+int vc_widget_set_result_cb(vc_h vc, vc_result_cb callback, void* user_data);
 
 
 /**
@@ -307,7 +308,7 @@ int vc_widget_set_result_cb(vc_result_cb callback, void* user_data);
 *
 * @see vc_widget_set_result_cb()
 */
-int vc_widget_unset_result_cb();
+int vc_widget_unset_result_cb(vc_h vc);
 
 /**
 * @brief Registers a callback function for showing or hiding tooltip.
@@ -326,7 +327,7 @@ int vc_widget_unset_result_cb();
 * @see vc_widget_show_tooltip_cb()
 * @see vc_widget_unset_show_tooltip_cb()
 */
-int vc_widget_set_show_tooltip_cb(vc_widget_show_tooltip_cb callback, void* user_data);
+int vc_widget_set_show_tooltip_cb(vc_h vc, vc_widget_show_tooltip_cb callback, void* user_data);
 
 /**
 * @brief Unregisters the callback function.
@@ -341,7 +342,7 @@ int vc_widget_set_show_tooltip_cb(vc_widget_show_tooltip_cb callback, void* user
 *
 * @see vc_widget_set_show_tooltip_cb()
 */
-int vc_widget_unset_show_tooltip_cb();
+int vc_widget_unset_show_tooltip_cb(vc_h vc);
 
 /**
 * @brief Registers a callback function for setting current command.
@@ -360,7 +361,7 @@ int vc_widget_unset_show_tooltip_cb();
 * @see vc_widget_send_current_command_list_cb()
 * @see vc_widget_unset_send_current_command_list_cb()
 */
-int vc_widget_set_send_current_command_list_cb(vc_widget_send_current_command_list_cb callback, void* user_data);
+int vc_widget_set_send_current_command_list_cb(vc_h vc, vc_widget_send_current_command_list_cb callback, void* user_data);
 
 /**
 * @brief Unregisters the callback function.
@@ -375,7 +376,7 @@ int vc_widget_set_send_current_command_list_cb(vc_widget_send_current_command_li
 *
 * @see vc_widget_set_send_current_command_list_cb()
 */
-int vc_widget_unset_send_current_command_list_cb();
+int vc_widget_unset_send_current_command_list_cb(vc_h vc);
 
 /**
 * @brief Registers a callback function to be called when service state is changed.
@@ -394,7 +395,7 @@ int vc_widget_unset_send_current_command_list_cb();
 * @see vc_service_state_changed_cb()
 * @see vc_widget_unset_service_state_changed_cb()
 */
-int vc_widget_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data);
+int vc_widget_set_service_state_changed_cb(vc_h vc, vc_service_state_changed_cb callback, void* user_data);
 
 /**
 * @brief Unregisters the callback function.
@@ -409,7 +410,7 @@ int vc_widget_set_service_state_changed_cb(vc_service_state_changed_cb callback,
 *
 * @see vc_widget_set_service_state_changed_cb()
 */
-int vc_widget_unset_service_state_changed_cb();
+int vc_widget_unset_service_state_changed_cb(vc_h vc);
 
 /**
 * @brief Registers a callback function for getting state changed.
@@ -429,7 +430,7 @@ int vc_widget_unset_service_state_changed_cb();
 * @see vc_state_changed_cb()
 * @see vc_widget_unset_state_changed_cb()
 */
-int vc_widget_set_state_changed_cb(vc_state_changed_cb callback, void* user_data);
+int vc_widget_set_state_changed_cb(vc_h vc, vc_state_changed_cb callback, void* user_data);
 
 /**
 * @brief Unregisters the callback function.
@@ -444,7 +445,7 @@ int vc_widget_set_state_changed_cb(vc_state_changed_cb callback, void* user_data
 *
 * @see vc_widget_set_state_changed_cb()
 */
-int vc_widget_unset_state_changed_cb();
+int vc_widget_unset_state_changed_cb(vc_h vc);
 
 /**
 * @brief Registers a callback function to be called when current language is changed.
@@ -464,7 +465,7 @@ int vc_widget_unset_state_changed_cb();
 * @see vc_current_language_changed_cb()
 * @see vc_widget_unset_current_language_changed_cb()
 */
-int vc_widget_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data);
+int vc_widget_set_current_language_changed_cb(vc_h vc, vc_current_language_changed_cb callback, void* user_data);
 
 /**
 * @brief Unregisters the callback function.
@@ -479,7 +480,7 @@ int vc_widget_set_current_language_changed_cb(vc_current_language_changed_cb cal
 *
 * @see vc_widget_set_current_language_changed_cb()
 */
-int vc_widget_unset_current_language_changed_cb();
+int vc_widget_unset_current_language_changed_cb(vc_h vc);
 
 /**
 * @brief Registers a callback function for an error occurred.
@@ -499,7 +500,7 @@ int vc_widget_unset_current_language_changed_cb();
 * @see vc_error_cb()
 * @see vc_widget_unset_error_cb()
 */
-int vc_widget_set_error_cb(vc_error_cb callback, void* user_data);
+int vc_widget_set_error_cb(vc_h vc, vc_error_cb callback, void* user_data);
 
 /**
 * @brief Unregisters the callback function.
@@ -514,7 +515,7 @@ int vc_widget_set_error_cb(vc_error_cb callback, void* user_data);
 *
 * @see vc_widget_set_error_cb()
 */
-int vc_widget_unset_error_cb();
+int vc_widget_unset_error_cb(vc_h vc);
 
 /**
  * @brief Sets option for obtain ASR result as dictation via result callback.
@@ -534,7 +535,7 @@ int vc_widget_unset_error_cb();
  * @pre The state should be #VC_STATE_READY.
  *
  */
-int vc_widget_enable_asr_result(bool enable);
+int vc_widget_enable_asr_result(vc_h vc, bool enable);
 
 /**
 * @brief Registers a callback function for an asr result.
@@ -553,7 +554,7 @@ int vc_widget_enable_asr_result(bool enable);
 * @see vc_widget_enable_asr_result()
 * @see vc_widget_unset_asr_result_cb()
 */
-int vc_widget_set_asr_result_cb(vc_asr_result_cb callback, void* user_data);
+int vc_widget_set_asr_result_cb(vc_h vc, vc_asr_result_cb callback, void* user_data);
 
 /**
 * @brief Unregisters the callback function.
@@ -566,7 +567,7 @@ int vc_widget_set_asr_result_cb(vc_asr_result_cb callback, void* user_data);
 *
 * @see vc_widget_set_asr_result_cb()
 */
-int vc_widget_unset_asr_result_cb();
+int vc_widget_unset_asr_result_cb(vc_h vc);
 
 #ifdef __cplusplus
 }
index 7d0f348..55b75f8 100644 (file)
@@ -341,7 +341,7 @@ int vcdc_send_asr_result(int pid, int cmd_type, bool* is_consumed)
        DBusMessage* result_msg;
 
        int result = 0;
-       result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err);
+       result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, 5000, &err);
        dbus_message_unref(msg);
 
        if (dbus_error_is_set(&err)) {
index a452b68..4308f1e 100755 (executable)
@@ -2099,8 +2099,8 @@ int vcd_server_widget_initialize(int pid)
 
        /* check if pid is valid */
        if (true == vcd_client_widget_is_available(pid)) {
-               SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] The pid is already exist");
-               return VCD_ERROR_INVALID_PARAMETER;
+               SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] The pid is already exist");
+               return VCD_ERROR_NONE;
        }
 
        /* Add client information to client manager */