Implement service state changed event transfering 47/279847/2
authorSuyeon Hwang <stom.hwang@samsung.com>
Thu, 11 Aug 2022 10:35:43 +0000 (19:35 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Fri, 19 Aug 2022 07:07:01 +0000 (16:07 +0900)
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 <stom.hwang@samsung.com>
client/tts.c
client/tts_client.c
client/tts_client.h
client/tts_core.c
client/tts_core.h
client/tts_dbus.c
client/tts_tidl.c
server/ttsd_server.c

index 94c663c7e99c3f2fcac1371e79a96a27bdf41ce5..739b7c3fdb106f03c08e6a990f19acd3a60a17bf 100644 (file)
@@ -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;
index ee974f973fecb131057be90e7e26eb8621888601..4f963c9db23f9dcaf0be8e3a1bf1c81ff547111e 100644 (file)
@@ -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
index 59a74bb2b74443ccd05a4e0646271b8456c041e1..bcd19f287b896d4135162545a1320975bbdf3147 100644 (file)
@@ -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
index 7eb6d71cc5985ec147c42c1191387c196760b9e0..35c48b47ea28fe2181fb9c4283e4c1c6bd669371 100644 (file)
@@ -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) {
index 4d43eb1199c502e15718daa9ae2116b770c8f2ae..75632e81929fcd01ef007715f59a76dcfa01dde4 100644 (file)
@@ -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);
index 54c7dd977fc4034fb1bf52cdcc94cd55608b3741..d9401eeaf4c4df74dffd24ec7c3b705a072ae44e 100644 (file)
@@ -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)) {
index f7736544394d87e114d388909bfa75be96119b3f..ddafb056d79a2b2fa4b77b67eae0af3eec2d8379 100644 (file)
@@ -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, &current_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;
index dee5f0c3951ec57add85e6ef2c15b8cdf4a6dc32..c50057eebbb995055e12e79ea0366d9d7149f154 100644 (file)
@@ -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.");
        }