From: Suyeon Hwang Date: Thu, 11 Aug 2022 10:35:43 +0000 (+0900) Subject: Implement service state changed event transfering X-Git-Tag: submit/tizen/20220823.092009~2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=55cbb4d088135d398afef808a947203bdd23fd85;p=platform%2Fcore%2Fuifw%2Ftts.git Implement service state changed event transfering This patch implements service state changed event. Through this patch, the client receives service state change information from server. Change-Id: Ia966b28cc76c39ba0a535e1fd98edfcf04e3ceea Signed-off-by: Suyeon Hwang --- diff --git a/client/tts.c b/client/tts.c index 94c663c7..739b7c3f 100644 --- a/client/tts.c +++ b/client/tts.c @@ -1372,7 +1372,7 @@ int tts_set_service_state_changed_cb(tts_h tts, tts_service_state_changed_cb cal tts_state_e current_state = tts_client_get_current_state(client); RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state); - // TODO: Implement business logic + tts_client_set_service_state_changed_cb(client, callback, user_data); SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set service state changed cb"); return TTS_ERROR_NONE; @@ -1388,7 +1388,7 @@ int tts_unset_service_state_changed_cb(tts_h tts) tts_state_e current_state = tts_client_get_current_state(client); RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state); - // TODO: Implement business logic + tts_client_set_service_state_changed_cb(client, NULL, NULL); SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset service state changed cb"); return TTS_ERROR_NONE; diff --git a/client/tts_client.c b/client/tts_client.c index ee974f97..4f963c9d 100644 --- a/client/tts_client.c +++ b/client/tts_client.c @@ -92,6 +92,12 @@ static inline void __set_supported_voice_cb(tts_client_s* client, tts_supported_ client->supported_voice_user_data = user_data; } +static inline void __set_service_state_changed_cb(tts_client_s* client, tts_service_state_changed_cb callback, void* user_data) +{ + client->service_state_changed_cb = callback; + client->service_state_changed_user_data = user_data; +} + int tts_client_new(tts_h* tts) { tts_client_s* client = (tts_client_s*)calloc(1, sizeof(tts_client_s)); @@ -579,6 +585,14 @@ void tts_client_set_supported_voice_cb(tts_client_s* client, tts_supported_voice __set_supported_voice_cb(client, callback, user_data); } +void tts_client_set_service_state_changed_cb(tts_client_s* client, tts_service_state_changed_cb callback, void* user_data) +{ + if (false == tts_client_is_valid_client(client)) { + return; + } + __set_service_state_changed_cb(client, callback, user_data); +} + tts_state_changed_cb tts_client_get_state_changed_cb(tts_client_s* client) { if (false == tts_client_is_valid_client(client)) { @@ -709,6 +723,22 @@ void* tts_client_get_supported_voice_user_data(tts_client_s* client) return client->supported_voice_user_data; } +tts_service_state_changed_cb tts_client_get_service_state_changed_cb(tts_client_s* client) +{ + if (false == tts_client_is_valid_client(client)) { + return NULL; + } + return client->service_state_changed_cb; +} + +void* tts_client_get_service_state_changed_user_data(tts_client_s* client) +{ + if (false == tts_client_is_valid_client(client)) { + return NULL; + } + return client->service_state_changed_user_data; +} + void tts_client_unset_all_cb(tts_client_s* client) { if (false == tts_client_is_valid_client(client)) { @@ -732,4 +762,5 @@ void tts_client_unset_all_cb(tts_client_s* client) __set_default_voice_changed_cb(client, NULL, NULL); __set_engine_changed_cb(client, NULL, NULL); __set_supported_voice_cb(client, NULL, NULL); + __set_service_state_changed_cb(client, NULL, NULL); } \ No newline at end of file diff --git a/client/tts_client.h b/client/tts_client.h index 59a74bb2..bcd19f28 100644 --- a/client/tts_client.h +++ b/client/tts_client.h @@ -52,6 +52,8 @@ typedef struct { void* screen_reader_changed_user_data; tts_supported_voice_cb supported_voice_cb; void* supported_voice_user_data; + tts_service_state_changed_cb service_state_changed_cb; + void* service_state_changed_user_data; /* mode / state */ tts_mode_e mode; @@ -138,6 +140,7 @@ void tts_client_set_default_voice_changed_cb(tts_client_s* client, tts_default_v void tts_client_set_engine_changed_cb(tts_client_s* client, tts_engine_changed_cb callback, void* user_data); void tts_client_set_screen_reader_changed_cb(tts_client_s* client, tts_screen_reader_changed_cb callback, void* user_data); void tts_client_set_supported_voice_cb(tts_client_s* client, tts_supported_voice_cb callback, void* user_data); +void tts_client_set_service_state_changed_cb(tts_client_s* client, tts_service_state_changed_cb callback, void* user_data); tts_state_changed_cb tts_client_get_state_changed_cb(tts_client_s* client); void* tts_client_get_state_changed_user_data(tts_client_s* client); @@ -163,6 +166,9 @@ void* tts_client_get_screen_reader_changed_user_data(tts_client_s* client); tts_supported_voice_cb tts_client_get_supported_voice_cb(tts_client_s* client); void* tts_client_get_supported_voice_user_data(tts_client_s* client); +tts_service_state_changed_cb tts_client_get_service_state_changed_cb(tts_client_s* client); +void* tts_client_get_service_state_changed_user_data(tts_client_s* client); + void tts_client_unset_all_cb(tts_client_s* client); #ifdef __cplusplus diff --git a/client/tts_core.c b/client/tts_core.c index 7eb6d71c..35c48b47 100644 --- a/client/tts_core.c +++ b/client/tts_core.c @@ -864,6 +864,27 @@ int tts_core_notify_screen_reader_changed(tts_client_s* client, bool value) return TTS_ERROR_NONE; } +int tts_core_notify_service_state_changed(tts_client_s* client, tts_service_state_e before_state, tts_service_state_e current_state) +{ + RETVM_IF(false == tts_client_is_valid_client(client), TTS_ERROR_INVALID_PARAMETER, "[ERROR] Client is invalid."); + + SLOG(LOG_DEBUG, TAG_TTSC, "Service state changed from (%d) to (%d).", before_state, current_state); + + tts_service_state_changed_cb callback = tts_client_get_service_state_changed_cb(client); + void* data = tts_client_get_service_state_changed_user_data(client); + + if (NULL != callback) { + SLOG(LOG_DEBUG, TAG_TTSC, "Notify service state changed"); + tts_client_use_callback(client); + callback(tts_client_get_handle(client), before_state, current_state, data); + tts_client_not_use_callback(client); + } else { + SLOG(LOG_WARN, TAG_TTSC, "No registered callback(service_state_changed)"); + } + + return TTS_ERROR_NONE; +} + bool tts_core_is_valid_text(const char* text) { if (NULL == text) { diff --git a/client/tts_core.h b/client/tts_core.h index 4d43eb11..75632e81 100644 --- a/client/tts_core.h +++ b/client/tts_core.h @@ -29,6 +29,7 @@ int tts_core_notify_error_async(tts_client_s* client, tts_error_e reason, int ut int tts_core_notify_default_voice_changed(tts_client_s* client, const char* before_lang, int before_voice_type, const char* language, int voice_type); int tts_core_notify_engine_changed(tts_client_s* client, const char* engine_id, const char* language, int voice_type, bool need_credential); int tts_core_notify_screen_reader_changed(tts_client_s* client, bool value); +int tts_core_notify_service_state_changed(tts_client_s* client, tts_service_state_e before_state, tts_service_state_e current_state); bool tts_core_is_valid_text(const char* text); bool tts_core_check_screen_reader(tts_client_s* client); diff --git a/client/tts_dbus.c b/client/tts_dbus.c index 54c7dd97..d9401eea 100644 --- a/client/tts_dbus.c +++ b/client/tts_dbus.c @@ -195,7 +195,9 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle dbus_error_free(&err); } - // TODO: implement notifier + if (0 == tts_core_notify_service_state_changed(tts_client_get_by_uid(uid), (tts_service_state_e)before_state, (tts_service_state_e)current_state)) { + SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts service state changed : uid(%u) before(%d) current(%d)", uid, before_state, current_state); + } } /* TTSD_METHOD_SET_SERVICE_STATE */ else if (dbus_message_is_signal(msg, if_name, TTSD_METHOD_ERROR)) { diff --git a/client/tts_tidl.c b/client/tts_tidl.c index f7736544..ddafb056 100644 --- a/client/tts_tidl.c +++ b/client/tts_tidl.c @@ -108,7 +108,9 @@ static void __notify_cb(void *user_data, int pid, int uid, bundle *msg) bundle_get_str(msg, TTS_BUNDLE_BEFORE_STATE, &before_state); bundle_get_str(msg, TTS_BUNDLE_CURRENT_STATE, ¤t_state); - // TODO: Implement notifier + if (before_state && current_state) { + tts_core_notify_service_state_changed(client, (tts_service_state_e)atoi(before_state), (tts_service_state_e)atoi(current_state)); + } } else if (0 == strncmp(TTSD_METHOD_ERROR, method, strlen(TTSD_METHOD_ERROR))) { char *uttid = NULL; char *reason = NULL; diff --git a/server/ttsd_server.c b/server/ttsd_server.c index dee5f0c3..c50057ee 100644 --- a/server/ttsd_server.c +++ b/server/ttsd_server.c @@ -43,12 +43,18 @@ typedef struct { int uttid; } utterance_t; +typedef struct { + ttsd_state_e before; + ttsd_state_e current; +} state_changed_args_t; + /* If current engine exist */ //static bool g_is_engine; static Ecore_Timer* g_check_client_timer = NULL; static Ecore_Timer* g_wait_timer = NULL; static Ecore_Timer* g_quit_loop_timer = NULL; +static Ecore_Timer* g_notify_state_timer = NULL; static utterance_t g_utt; @@ -549,6 +555,44 @@ static Eina_Bool __cleanup_client(void *data) return EINA_TRUE; } +static bool __notify_state_changed_event(int pid, unsigned int uid, app_tts_state_e state, void* user_data) +{ + state_changed_args_t* args = (state_changed_args_t*)user_data; + if (NULL == args) { + return false; + } + + ttsdc_ipc_send_set_service_state_message(pid, uid, args->before, args->current); + return true; +} + +static Eina_Bool __state_changed_timer_cb(void *data) +{ + if (NULL == data) { + SLOG(LOG_ERROR, tts_tag(), "[Server] Invalid data passed."); + return ECORE_CALLBACK_CANCEL; + } + + int ret = ttsd_data_foreach_clients(__notify_state_changed_event, data); + if (TTSD_ERROR_NONE != ret) { + SLOG(LOG_ERROR, tts_tag(), "[Server] Fail to notify state change."); + } + + free(data); + g_notify_state_timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void __state_changed_cb(ttsd_state_e before, ttsd_state_e current) +{ + state_changed_args_t* args = (state_changed_args_t*)calloc(1, sizeof(state_changed_args_t)); + args->before = before; + args->current = current; + + SLOG(LOG_INFO, tts_tag(), "[Server] Notify state chanaged from (%d) to (%d).", before, current); + g_notify_state_timer = ecore_timer_add(0.0, __state_changed_timer_cb, args); +} + /* * Server APIs */ @@ -561,7 +605,7 @@ int ttsd_initialize(ttse_request_callback_s *callback) SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to initialize config."); } - if (TTSD_ERROR_NONE != ttsd_state_initialize(NULL)) { + if (TTSD_ERROR_NONE != ttsd_state_initialize(__state_changed_cb)) { SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to initialize state."); }