static Ecore_Event_Handler* g_focus_out_handler = NULL;
static Ecore_Timer* g_w_start_timer = NULL;
-static Ecore_Timer* g_w_notify_error_timer = NULL;
static Ecore_Timer* g_w_notify_state_timer = NULL;
static Ecore_Timer* g_w_notify_result_timer = NULL;
static int g_feature_enabled = -1;
static Eina_Bool __vc_widget_notify_state_changed(void *data);
-static Eina_Bool __vc_widget_notify_error(void *data);
+static void __vc_widget_notify_error(void *data);
static int __vc_widget_get_feature_enabled()
{
ecore_timer_del(g_w_start_timer);
g_w_start_timer = NULL;
}
- if (NULL != g_w_notify_error_timer) {
- ecore_timer_del(g_w_notify_error_timer);
- g_w_notify_error_timer = NULL;
- }
if (NULL != g_w_notify_state_timer) {
ecore_timer_del(g_w_notify_state_timer);
g_w_notify_state_timer = NULL;
{
vc_h vc_w = (vc_h)data;
- /* Send hello */
- if (0 != vc_widget_dbus_request_hello()) {
- return EINA_TRUE;
- }
-
- SLOG(LOG_DEBUG, TAG_VCW, "@@@ [Widget] Connect daemon");
-
vc_widget_s* widget = widget_get(vc_w);
if (NULL != widget) {
widget->conn_timer = NULL;
SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to initialize : %s", __vc_widget_get_error_code(ret));
vc_widget_client_set_error(vc_w, VC_ERROR_ENGINE_NOT_FOUND);
- g_w_notify_error_timer = ecore_timer_add(0, __vc_widget_notify_error, vc_w);
+ ecore_main_loop_thread_safe_call_async(__vc_widget_notify_error, vc_w);
SLOG(LOG_DEBUG, TAG_VCW, "@@@");
return EINA_FALSE;
SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to initialize : %s", __vc_widget_get_error_code(ret));
vc_widget_client_set_error(vc_w, VC_ERROR_TIMED_OUT);
- g_w_notify_error_timer = ecore_timer_add(0, __vc_widget_notify_error, vc_w);
+ ecore_main_loop_thread_safe_call_async(__vc_widget_notify_error, vc_w);
SLOG(LOG_DEBUG, TAG_VCW, "@@@");
return EINA_FALSE;
vc_widget_client_set_service_state(vc_w, (vc_service_state_e)service_state);
+ SLOG(LOG_INFO, TAG_VCW, "@@@ [Widget] Connect daemon");
+
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)
}
vc_widget_client_set_state(vc_w, VC_STATE_READY);
- g_w_notify_state_timer = ecore_timer_add(0, __vc_widget_notify_state_changed, vc_w);
+
+ vc_state_changed_cb changed_callback = NULL;
+ void* 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(vc_w, ¤t_state, &before_state);
+
+ if (NULL != changed_callback) {
+ vc_widget_client_use_callback(vc_w);
+ changed_callback(before_state, current_state, user_data);
+ 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");
+ }
SLOG(LOG_DEBUG, TAG_VCW, "@@@");
return EINA_FALSE;
}
-int vc_widget_prepare(vc_h vc_w)
+static void __start_prepare_thread(void *data, Ecore_Thread *thread)
{
- SLOG(LOG_DEBUG, TAG_VCW, "@@@ [Widget] Prepare");
+ SLOG(LOG_INFO, TAG_VCW, "@@@ Start prepare thread");
+ int ret = -1, retry_count = 0;
+ vc_h vc_w = (vc_h)data;
- if (0 != __vc_widget_get_feature_enabled()) {
- SLOG(LOG_INFO, TAG_VCW, "@@@ [Widget] not supported");
- return VC_ERROR_NONE;
+ /* Send hello */
+ while (0 != ret) {
+ if (retry_count == 30) {
+ SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to request hello !!");
+ return;
+ }
+
+ ret = vc_widget_dbus_request_hello();
+ if (ret == 0) {
+ SLOG(LOG_DEBUG, TAG_VCW, "Success to request hello. retry count(%d)", retry_count);
+ break;
+ } else {
+ retry_count++;
+ }
+ }
+
+ ret = -1;
+ retry_count = 0;
+ while (0 != ret) {
+ if (retry_count == 10) {
+ SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Fail to connect daemon !!");
+ return;
+ }
+ ret = __vc_widget_connect_daemon((void*)vc_w);
+ if (ret == 0)
+ break;
+ else
+ retry_count++;
}
+ return;
+}
+
+static void __end_prepare_thread(void *data, Ecore_Thread *thread)
+{
+ SLOG(LOG_DEBUG, TAG_VCW, "@@@ End prepare thread");
+}
+
+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(vc_w, &state)) {
SLOG(LOG_ERROR, TAG_VCW, "[ERROR] A handle is not available");
return VC_ERROR_INVALID_STATE;
}
- widget->conn_timer = ecore_timer_add(0, __vc_widget_connect_daemon, (void*)vc_w);
+ ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, (void*)vc_w);
SLOG(LOG_DEBUG, TAG_VCW, "@@@");
return 0;
}
-static Eina_Bool __vc_widget_notify_error(void *data)
+static void __vc_widget_notify_error(void *data)
{
vc_h vc_w = (vc_h)data;
vc_error_cb callback = NULL;
int reason;
if (NULL == vc_w) {
SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Input parameter is NULL");
- return VC_ERROR_INVALID_PARAMETER;
+ return;
}
vc_widget_client_get_error_cb(vc_w, &callback, &user_data);
SLOG(LOG_WARN, TAG_VCW, "[WARNING] Error callback is null");
}
- return EINA_FALSE;
+ return;
}
int __vc_widget_cb_error(int reason, int daemon_pid, char* msg)
SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
vc_widget_client_set_error(vc_w, reason);
- g_w_notify_error_timer = ecore_timer_add(0, __vc_widget_notify_error, vc_w);
+ ecore_main_loop_thread_safe_call_async(__vc_widget_notify_error, vc_w);
}
}