SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS synchronously");
int ret = tts_core_prepare_sync(client);
- if (0 != ret) {
+ if (TTS_ERROR_NONE != ret) {
SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] tts_core_prepare_sync failed. (%s)", tts_core_covert_error_code(ret));
return ret;
}
#include "tts_core.h"
#include "tts_ipc.h"
+
+static const int TTS_ERROR_FAIL_TO_SEND_HELLO = TIZEN_ERROR_TTS | 0xFF;
+
+
/* Static variables */
static volatile bool g_is_thread_canceled = false;
return EINA_FALSE;
}
-static Eina_Bool __prepare_sync_cb(tts_client_s* client)
+static int __prepare_sync_cb(tts_client_s* client)
{
// TODO: make function duplicated block
bool is_launched = __is_engine_launched(tts_client_get_mode(client));
if (false == is_launched) {
/* check whether engine is updating or not */
if (g_engine_update_status) {
- SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] cannot prepare due to engine update");
+ SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot prepare due to engine update.");
+ SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Client automatically tries to reprepare asynchrnously.");
__run_client_reprepare_thread();
- return EINA_FALSE;
+ return TTS_ERROR_OPERATION_FAILED;
}
}
+
// TODO: make function duplicated block
unsigned int uid = tts_client_get_uid(client);
- if (0 != tts_ipc_request_hello_sync(uid)) {
- return EINA_TRUE;
+ if (TTS_ERROR_NONE != tts_ipc_request_hello_sync(uid)) {
+ return TTS_ERROR_FAIL_TO_SEND_HELLO;
}
SLOG(LOG_INFO, TAG_TTSC, "@@@ Connect daemon");
// TODO: make function duplicated block
/* do request initialize */
- int ret = -1;
bool credential_needed = false;
-
- ret = tts_ipc_request_initialize(uid, &credential_needed);
+ int ret = tts_ipc_request_initialize(uid, &credential_needed);
if (TTS_ERROR_ENGINE_NOT_FOUND == ret || TTS_ERROR_PERMISSION_DENIED == ret) {
- SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", tts_core_covert_error_code(ret));
+ SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize. ret(%d/%s)", ret, get_error_message(ret));
tts_core_notify_error_async(client, ret, -1, NULL);
- return EINA_FALSE;
+ return ret;
} else if (TTS_ERROR_NONE != ret) {
- SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", tts_core_covert_error_code(ret));
- return EINA_TRUE;
+ SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect. ret(%d/%s)", ret, get_error_message(ret));
+ return TTS_ERROR_FAIL_TO_SEND_HELLO;
} else {
/* success to connect tts-daemon */
client->credential_needed = credential_needed;
}
// TODO: make function duplicated block
- tts_ipc_request_set_mode(uid, tts_client_get_mode(client));
-
- tts_core_notify_state_changed(client, TTS_STATE_READY);
-
SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
- return EINA_FALSE;
+ return TTS_ERROR_NONE;
}
static void __engine_changed_cb(keynode_t* key, void* data)
return TTS_ERROR_INVALID_PARAMETER;
}
- SLOG(LOG_INFO, TAG_TTSC, "[INFO] Start core_prepare_sync. tts_h(%p), tts_client(%p), uid(%u)", tts_client_get_handle(client), client, tts_client_get_uid(client));
+ unsigned int uid = tts_client_get_uid(client);
+ SLOG(LOG_INFO, TAG_TTSC, "[INFO] Start core_prepare_sync. tts_h(%p), tts_client(%p), uid(%u)", tts_client_get_handle(client), client, uid);
int cnt = 0;
while (TTS_CONNECTION_RETRY_COUNT > cnt) {
if (false == tts_core_check_screen_reader(client)) {
return TTS_ERROR_SCREEN_READER_OFF;
}
- if (EINA_FALSE == __prepare_sync_cb(client)) {
+ int ret = __prepare_sync_cb(client);
+ if (TTS_ERROR_NONE == ret) {
+ SLOG(LOG_INFO, TAG_TTSC, "[INFO] Prepare succeeds. uid(%u)", uid);
break;
}
+ if (TTS_ERROR_FAIL_TO_SEND_HELLO == ret) {
+ SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Fail to send hello. Try again. uid(%u)", uid);
+ } else {
+ SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare. uid(%u), ret(%d/%s)", uid, ret, get_error_message(ret));
+ return ret;
+ }
+
cnt++;
}
return TTS_ERROR_OPERATION_FAILED;
}
+ tts_ipc_request_set_mode(uid, tts_client_get_mode(client));
+ tts_core_notify_state_changed(client, TTS_STATE_READY);
+
SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
return TTS_ERROR_NONE;
}
int ret = RPC_PORT_ERROR_NONE;
ret = __create_notify_callback_handle(info);
if (RPC_PORT_ERROR_NONE != ret) {
- SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create callback handle. ret(%d)", ret);
+ SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create callback handle. ret(%d/%s)", ret, get_error_message(ret));
+ return TTS_ERROR_OPERATION_FAILED;
+ }
+
+ ret = rpc_port_proxy_tts_invoke_register_cb_sync(info->rpc_h, pid, info->uid, info->notify_cb_h);
+ if (RPC_PORT_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to register callback. ret(%d/%s)", ret, get_error_message(ret));
return TTS_ERROR_OPERATION_FAILED;
}
- rpc_port_proxy_tts_invoke_register_cb_sync(info->rpc_h, pid, info->uid, info->notify_cb_h);
info->register_callback_invoked = true;
return TTS_ERROR_NONE;
}
static Ecore_Timer* g_check_client_timer = NULL;
static Ecore_Timer* g_wait_timer = NULL;
-static Ecore_Timer* g_terminate_timer = NULL;
static Ecore_Timer* g_quit_loop_timer = NULL;
static utterance_t g_utt;
return true;
}
-static void __terminate_server()
+static int __terminate_server()
{
if (g_is_terminated) {
SLOG(LOG_INFO, tts_tag(), "[INFO] ttsd_terminate() is already invoked.");
- return;
+ return TTSD_ERROR_NONE;
}
- g_is_terminated = true;
+ int ret = TTSD_ERROR_NONE;
+ ret = ttsd_ipc_close_connection();
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_ipc_close_connection(). ret(%d)", ret);
+ return TTSD_ERROR_OPERATION_FAILED;
+ }
- ttsd_ipc_close_connection();
- ttsd_network_finalize();
- ttsd_finalize();
-}
+ ret = ttsd_network_finalize();
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_ipc_close_connection(). ret(%d)", ret);
+ return TTSD_ERROR_OPERATION_FAILED;
+ }
-static Eina_Bool __quit_ecore_loop(void *data)
-{
- __terminate_server();
- ecore_main_loop_quit();
+ ret = ttsd_finalize();
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_ipc_close_connection(). ret(%d)", ret);
+ return TTSD_ERROR_OPERATION_FAILED;
+ }
- return EINA_FALSE;
+ g_is_terminated = true;
+ return TTSD_ERROR_NONE;
}
-Eina_Bool ttsd_terminate_daemon(void *data)
+static Eina_Bool __quit_ecore_loop(void *data)
{
- ttsd_data_foreach_clients(__terminate_client, NULL);
-
- if (g_quit_loop_timer) {
- ecore_timer_del(g_quit_loop_timer);
- g_quit_loop_timer = NULL;
- SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore quit loop timer handle");
- }
-
__terminate_server();
+ ecore_main_loop_quit();
- g_terminate_timer = NULL;
return EINA_FALSE;
}
void __screen_reader_changed_cb(bool value)
{
-/* if (TTSD_MODE_SCREEN_READER == ttsd_get_mode() && false == value) {
- SLOG(LOG_INFO, tts_tag(), "[Server] Screen reader is OFF. Start to terminate tts daemon");
- if (g_terminate_timer) {
- ecore_timer_del(g_terminate_timer);
- g_terminate_timer = NULL;
- }
- g_terminate_timer = ecore_timer_add(1, ttsd_terminate_daemon, NULL);
- } else {
-*/
- SLOG(LOG_DEBUG, tts_tag(), "[Server] Screen reader is %s", value ? "ON" : "OFF");
-// }
+ SLOG(LOG_DEBUG, tts_tag(), "[Server] Screen reader is %s", value ? "ON" : "OFF");
return;
}
}
}
- ttsd_config_finalize();
-
- ttsd_player_release();
-
- ttsd_engine_agent_release();
-
-
if (g_wait_timer) {
ecore_timer_del(g_wait_timer);
g_wait_timer = NULL;
SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore waiting timer handle");
}
- if (g_terminate_timer) {
- ecore_timer_del(g_terminate_timer);
- g_terminate_timer = NULL;
- SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore terminating timer handle");
- }
-
if (g_check_client_timer) {
ecore_timer_del(g_check_client_timer);
g_check_client_timer = NULL;
SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore quit loop timer handle");
}
+ int ret = TTSD_ERROR_NONE;
+ ret = ttsd_config_finalize();
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_config_finalize(). ret(%d)", ret);
+ return TTSD_ERROR_OPERATION_FAILED;
+ }
+
+ ret = ttsd_player_release();
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_player_release(). ret(%d)", ret);
+ return TTSD_ERROR_OPERATION_FAILED;
+ }
+
+ ret = ttsd_engine_agent_release();
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_engine_agent_release(). ret(%d)", ret);
+ return TTSD_ERROR_OPERATION_FAILED;
+ }
+
return TTSD_ERROR_NONE;
}
int ttsd_terminate()
{
SLOG(LOG_INFO, tts_tag(), "[Server] Terminate");
+ int ret = ttsd_data_foreach_clients(__terminate_client, NULL);
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to terminate all clients. ret(%d)", ret);
+ return TTSD_ERROR_OPERATION_FAILED;
+ }
- ttsd_terminate_daemon(NULL);
+ if (g_quit_loop_timer) {
+ ecore_timer_del(g_quit_loop_timer);
+ g_quit_loop_timer = NULL;
+ SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore quit loop timer handle");
+ }
- return TTSD_ERROR_NONE;
+ return __terminate_server();
}
/*
return TTSE_ERROR_NONE;
}
- g_is_terminated = true;
- ttsd_terminate();
+ int ret = ttsd_terminate();
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_terminate(). ret(%d)", ret);
+ return TTSE_ERROR_OPERATION_FAILED;
+ }
/* Unregister vconfkey callback */
vconf_ignore_key_changed(TTS_ENGINE_DB_DEFAULT, __engine_changed_cb);
+ g_is_terminated = true;
return TTSE_ERROR_NONE;
}