Fix to get the maximum text size from the engine meta data
[platform/core/uifw/tts.git] / client / tts.c
1 /*
2 *  Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
3 *  Licensed under the Apache License, Version 2.0 (the "License");
4 *  you may not use this file except in compliance with the License.
5 *  You may obtain a copy of the License at
6 *  http://www.apache.org/licenses/LICENSE-2.0
7 *  Unless required by applicable law or agreed to in writing, software
8 *  distributed under the License is distributed on an "AS IS" BASIS,
9 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 *  See the License for the specific language governing permissions and
11 *  limitations under the License.
12 */
13
14 #include <app_manager.h>
15 #include <dirent.h>
16 #include <Ecore.h>
17 #include <iconv.h>
18 #include <sys/stat.h>
19 #include <sys/types.h>
20 #include <sys/wait.h>
21 #include <system_info.h>
22 #include <vconf.h>
23
24 #include "tts.h"
25 #include "tts_client.h"
26 #include "tts_config_mgr.h"
27 #include "tts_dbus.h"
28 #include "tts_main.h"
29
30
31 static bool g_screen_reader;
32
33 static int g_feature_enabled = -1;
34
35 static bool g_err_callback_status = false;
36
37 static int g_max_text_size = -1;
38
39 /* Function definition */
40 static Eina_Bool __tts_notify_state_changed(void *data);
41 static Eina_Bool __tts_notify_error(void *data);
42
43 const char* tts_tag()
44 {
45         return "ttsc";
46 }
47
48 static int __tts_get_feature_enabled()
49 {
50         if (0 == g_feature_enabled) {
51                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
52                 return TTS_ERROR_NOT_SUPPORTED;
53         } else if (-1 == g_feature_enabled) {
54                 bool tts_supported = false;
55                 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
56                         if (false == tts_supported) {
57                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
58                                 g_feature_enabled = 0;
59                                 return TTS_ERROR_NOT_SUPPORTED;
60                         }
61
62                         g_feature_enabled = 1;
63                 } else {
64                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get feature value");
65                         return TTS_ERROR_NOT_SUPPORTED;
66                 }
67         }
68
69         return 0;
70 }
71
72 static const char* __tts_get_error_code(tts_error_e err)
73 {
74         switch (err) {
75         case TTS_ERROR_NONE:                    return "TTS_ERROR_NONE";
76         case TTS_ERROR_OUT_OF_MEMORY:           return "TTS_ERROR_OUT_OF_MEMORY";
77         case TTS_ERROR_IO_ERROR:                return "TTS_ERROR_IO_ERROR";
78         case TTS_ERROR_INVALID_PARAMETER:       return "TTS_ERROR_INVALID_PARAMETER";
79         case TTS_ERROR_OUT_OF_NETWORK:          return "TTS_ERROR_OUT_OF_NETWORK";
80         case TTS_ERROR_TIMED_OUT:               return "TTS_ERROR_TIMED_OUT";
81         case TTS_ERROR_PERMISSION_DENIED:       return "TTS_ERROR_PERMISSION_DENIED";
82         case TTS_ERROR_NOT_SUPPORTED:           return "TTS_ERROR_NOT_SUPPORTED";
83         case TTS_ERROR_INVALID_STATE:           return "TTS_ERROR_INVALID_STATE";
84         case TTS_ERROR_INVALID_VOICE:           return "TTS_ERROR_INVALID_VOICE";
85         case TTS_ERROR_ENGINE_NOT_FOUND:        return "TTS_ERROR_ENGINE_NOT_FOUND";
86         case TTS_ERROR_OPERATION_FAILED:        return "TTS_ERROR_OPERATION_FAILED";
87         case TTS_ERROR_AUDIO_POLICY_BLOCKED:    return "TTS_ERROR_AUDIO_POLICY_BLOCKED";
88         case TTS_ERROR_NOT_SUPPORTED_FEATURE:   return "TTS_ERROR_NOT_SUPPORTED_FEATURE";
89         case TTS_ERROR_SERVICE_RESET:           return "TTS_ERROR_SERVICE_RESET";
90         default:
91                 return "Invalid error code";
92         }
93         return NULL;
94 }
95
96 static int __tts_convert_config_error_code(tts_config_error_e code)
97 {
98         if (code == TTS_CONFIG_ERROR_NONE)                      return TTS_ERROR_NONE;
99         if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY)             return TTS_ERROR_OUT_OF_MEMORY;
100         if (code == TTS_CONFIG_ERROR_IO_ERROR)                  return TTS_ERROR_IO_ERROR;
101         if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER)         return TTS_ERROR_INVALID_PARAMETER;
102         if (code == TTS_CONFIG_ERROR_INVALID_STATE)             return TTS_ERROR_INVALID_STATE;
103         if (code == TTS_CONFIG_ERROR_INVALID_VOICE)             return TTS_ERROR_INVALID_VOICE;
104         if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND)          return TTS_ERROR_ENGINE_NOT_FOUND;
105         if (code == TTS_CONFIG_ERROR_OPERATION_FAILED)          return TTS_ERROR_OPERATION_FAILED;
106         if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE)     return TTS_ERROR_NOT_SUPPORTED_FEATURE;
107
108         return code;
109 }
110
111 void __tts_config_voice_changed_cb(const char* before_lang, int before_voice_type, const char* language, int voice_type, bool auto_voice, void* user_data)
112 {
113         SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
114                 before_lang, before_voice_type, language, voice_type);
115
116         GList* client_list = NULL;
117         client_list = tts_client_get_client_list();
118
119         GList *iter = NULL;
120         tts_client_s *data = NULL;
121
122         if (g_list_length(client_list) > 0) {
123                 /* Get a first item */
124                 iter = g_list_first(client_list);
125
126                 while (NULL != iter) {
127                         data = iter->data;
128                         if (NULL != data->default_voice_changed_cb) {
129                                 SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
130                                 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type, 
131                                         language, voice_type, data->default_voice_changed_user_data);
132                         }
133
134                         /* Next item */
135                         iter = g_list_next(iter);
136                 }
137         }
138
139         return;
140 }
141
142 static Eina_Bool __reconnect_by_engine_changed(void* data)
143 {
144         tts_h tts = (tts_h)data;
145
146         tts_client_s* client = tts_client_get(tts);
147         if (NULL == client) {
148                 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
149                 return EINA_FALSE;
150         }
151
152         if (TTS_STATE_READY != client->current_state) {
153                 usleep(10000);
154                 return EINA_TRUE;
155         }
156
157         int ret = tts_unprepare(tts);
158         if (0 != ret) {
159                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
160         }
161         ret = tts_prepare(tts);
162         if (0 != ret) {
163                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
164         }
165
166         return EINA_FALSE;
167 }
168
169 void _tts_config_engine_changed_cb(const char* engine_id, const char* setting, const char* language, int voice_type, bool auto_voice, bool need_credential, void* user_data)
170 {
171         tts_h tts = (tts_h)user_data;
172
173         tts_client_s* client = tts_client_get(tts);
174         if (NULL == client) {
175                 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
176                 return;
177         }
178
179         if (NULL != engine_id)  SLOG(LOG_DEBUG, TAG_TTSC, "Engine id(%s)", engine_id);
180         if (NULL != setting)    SLOG(LOG_DEBUG, TAG_TTSC, "Engine setting(%s)", setting);
181         if (NULL != language)   SLOG(LOG_DEBUG, TAG_TTSC, "Language(%s)", language);
182         SLOG(LOG_DEBUG, TAG_TTSC, "Voice type(%d), Auto voice(%s), Credential(%s)", voice_type, auto_voice ? "on" : "off", need_credential ? "need" : "no need");
183
184         /* When the default engine is changed, please unload the old engine and load the new one. */
185         int ret = -1;
186
187         if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_PAUSED == client->current_state) {
188                 ret = tts_stop(tts);
189                 if (0 != ret) {
190                         SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] TTS client stopping...");
191                 }
192
193                 ecore_idler_add(__reconnect_by_engine_changed, (void*)tts);
194         } else if (TTS_STATE_READY == client->current_state) {
195                 ret = tts_unprepare(tts);
196                 if (0 != ret) {
197                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare for setting a new engine... (%d)", ret);
198                 }
199                 ret = tts_prepare(tts);
200                 if (0 != ret) {
201                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
202                 }
203         }
204
205         /* call callback function */
206         if (NULL != client->engine_changed_cb) {
207                 client->engine_changed_cb(tts, engine_id, language, voice_type, need_credential, client->engine_changed_user_data);
208         } else {
209                 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function for changed engine");
210         }
211         return;
212 }
213
214 int tts_create(tts_h* tts)
215 {
216         if (0 != __tts_get_feature_enabled()) {
217                 return TTS_ERROR_NOT_SUPPORTED;
218         }
219
220         SLOG(LOG_INFO, TAG_TTSC, "===== Create TTS");
221
222         /* check param */
223         if (NULL == tts) {
224                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
225                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
226                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
227                 return TTS_ERROR_INVALID_PARAMETER;
228         }
229
230         if (0 == tts_client_get_size()) {
231                 if (0 != tts_dbus_open_connection()) {
232                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
233                         return TTS_ERROR_OPERATION_FAILED;
234                 }
235         }
236
237         if (0 != tts_client_new(tts)) {
238                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
239                 return TTS_ERROR_OUT_OF_MEMORY;
240         }
241
242         tts_client_s* client = tts_client_get(*tts);
243         if (NULL == client) {
244                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
245                 return TTS_ERROR_OPERATION_FAILED;
246         }
247
248         int ret = tts_config_mgr_initialize(client->uid);
249         if (0 != ret) {
250                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
251                 tts_client_destroy(*tts);
252                 return __tts_convert_config_error_code(ret);
253         }
254
255         ret = tts_config_mgr_set_callback(client->uid, _tts_config_engine_changed_cb, __tts_config_voice_changed_cb, NULL, NULL, client->tts);
256         if (0 != ret) {
257                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
258                 tts_client_destroy(*tts);
259                 return __tts_convert_config_error_code(ret);
260         }
261
262         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
263         SLOG(LOG_DEBUG, TAG_TTSC, " ");
264
265         return TTS_ERROR_NONE;
266 }
267
268 int tts_destroy(tts_h tts)
269 {
270         if (0 != __tts_get_feature_enabled()) {
271                 return TTS_ERROR_NOT_SUPPORTED;
272         }
273
274         SLOG(LOG_INFO, TAG_TTSC, "===== Destroy TTS");
275
276         if (NULL == tts) {
277                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
278                 return TTS_ERROR_INVALID_PARAMETER;
279         }
280
281         tts_client_s* client = tts_client_get(tts);
282
283         /* check handle */
284         if (NULL == client) {
285                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
286                 return TTS_ERROR_INVALID_PARAMETER;
287         }
288
289         /* check used callback */
290         if (0 != tts_client_get_use_callback(client)) {
291                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
292                 return TTS_ERROR_OPERATION_FAILED;
293         }
294
295         tts_config_mgr_finalize(client->uid);
296
297         int ret = -1;
298         int count = 0;
299         int screen_reader = -1;
300
301         /* check state */
302         switch (client->current_state) {
303         case TTS_STATE_PAUSED:
304         case TTS_STATE_PLAYING:
305         case TTS_STATE_READY:
306                 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
307                 if (0 != ret) {
308                         SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get screen reader");
309                 } else {
310                         SLOG(LOG_INFO, tts_tag(), "[INFO] Success to get screen reader(%d), g_screen_reader(%s), client->mode(%d)", screen_reader, (true == g_screen_reader) ? "True" : "False", client->mode);
311                         g_screen_reader = (bool)screen_reader;
312                 }
313                 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
314                         do {
315                                 ret = tts_dbus_request_finalize(client->uid);
316                                 if (0 != ret) {
317                                         if (TTS_ERROR_TIMED_OUT != ret) {
318                                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
319                                                 break;
320                                         } else {
321                                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
322                                                 usleep(10000);
323                                                 count++;
324                                                 if (TTS_RETRY_COUNT == count) {
325                                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
326                                                         break;
327                                                 }
328                                         }
329                                 }
330                         } while (0 != ret);
331                 } else {
332                         SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
333                 }
334
335                 client->before_state = client->current_state;
336                 client->current_state = TTS_STATE_CREATED;
337
338         case TTS_STATE_CREATED:
339                 if (NULL != client->conn_timer) {
340                         SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
341                         ecore_timer_del(client->conn_timer);
342                         client->conn_timer = NULL;
343                 }
344                 /* Free resources */
345                 tts_client_destroy(tts);
346                 break;
347
348         default:
349                 break;
350         }
351
352         if (0 == tts_client_get_size()) {
353                 if (0 != tts_dbus_close_connection()) {
354                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
355                 }
356         }
357
358         tts = NULL;
359
360         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
361         SLOG(LOG_DEBUG, TAG_TTSC, " ");
362
363         return TTS_ERROR_NONE;
364 }
365
366 void __tts_screen_reader_changed_cb(bool value)
367 {
368         g_screen_reader = value;
369 }
370
371 int tts_set_mode(tts_h tts, tts_mode_e mode)
372 {
373         if (0 != __tts_get_feature_enabled()) {
374                 return TTS_ERROR_NOT_SUPPORTED;
375         }
376
377         SLOG(LOG_INFO, TAG_TTSC, "===== Set TTS mode(%d)", mode);
378
379         tts_client_s* client = tts_client_get(tts);
380
381         /* check handle */
382         if (NULL == client) {
383                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
384                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
385                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
386                 return TTS_ERROR_INVALID_PARAMETER;
387         }
388
389         /* check state */
390         if (client->current_state != TTS_STATE_CREATED) {
391                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
392                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
393                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
394                 return TTS_ERROR_INVALID_STATE;
395         }
396
397         if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
398                 client->mode = mode;
399         } else {
400                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
401                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
402                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
403                 return TTS_ERROR_INVALID_PARAMETER;
404         }
405
406         if (TTS_MODE_SCREEN_READER == mode) {
407                 int ret;
408                 int screen_reader;
409                 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
410                 if (0 != ret) {
411                         SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
412                         return TTS_ERROR_OPERATION_FAILED;
413                 }
414                 g_screen_reader = (bool)screen_reader;
415                 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
416         } else {
417                 tts_config_unset_screen_reader_callback(client->uid);
418         }
419
420         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
421         SLOG(LOG_DEBUG, TAG_TTSC, " ");
422
423         return TTS_ERROR_NONE;
424 }
425
426 int tts_get_mode(tts_h tts, tts_mode_e* mode)
427 {
428         if (0 != __tts_get_feature_enabled()) {
429                 return TTS_ERROR_NOT_SUPPORTED;
430         }
431
432         SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
433
434         tts_client_s* client = tts_client_get(tts);
435
436         /* check handle */
437         if (NULL == client) {
438                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
439                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
440                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
441                 return TTS_ERROR_INVALID_PARAMETER;
442         }
443
444         /* check state */
445         if (client->current_state != TTS_STATE_CREATED) {
446                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
447                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
448                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
449                 return TTS_ERROR_INVALID_STATE;
450         }
451
452         if (NULL == mode) {
453                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
454                 return TTS_ERROR_INVALID_PARAMETER;
455         }
456
457         *mode = client->mode;
458
459         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
460         SLOG(LOG_DEBUG, TAG_TTSC, " ");
461
462         return TTS_ERROR_NONE;
463 }
464
465 int tts_set_credential(tts_h tts, const char* credential)
466 {
467         if (0 != __tts_get_feature_enabled()) {
468                 return TTS_ERROR_NOT_SUPPORTED;
469         }
470
471         if (NULL == tts || NULL == credential) {
472                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
473                 return TTS_ERROR_INVALID_PARAMETER;
474         }
475
476         tts_client_s* client = tts_client_get(tts);
477
478         if (NULL == client) {
479                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
480                 return TTS_ERROR_INVALID_PARAMETER;
481         }
482
483         if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
484                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
485                 return TTS_ERROR_INVALID_STATE;
486         }
487
488         if (NULL != client->credential) {
489                 free(client->credential);
490                 client->credential = NULL;
491         }
492         client->credential = strdup(credential);
493
494         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
495         SLOG(LOG_DEBUG, TAG_TTSC, " ");
496
497         return TTS_ERROR_NONE;
498 }
499
500 int tts_set_server_tts(tts_h tts, const char* credential)
501 {
502         if (0 != __tts_get_feature_enabled()) {
503                 return TTS_ERROR_NOT_SUPPORTED;
504         }
505
506         if (NULL == tts) {
507                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
508                 return TTS_ERROR_INVALID_PARAMETER;
509         }
510
511         tts_client_s* client = tts_client_get(tts);
512
513         if (NULL == client) {
514                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
515                 return TTS_ERROR_INVALID_PARAMETER;
516         }
517
518         if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
519                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
520                 return TTS_ERROR_INVALID_STATE;
521         }
522
523         if (NULL != client->credential) {
524                 free(client->credential);
525                 client->credential = NULL;
526         }
527
528         client->internal = true;
529
530         char* key = NULL;
531         if (NULL != credential) {
532                 key = strdup("EnableServerTTS");
533                 client->credential = strdup(credential);
534                 if (NULL == client->credential) {
535                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
536                         return TTS_ERROR_OUT_OF_MEMORY;
537                 }
538         } else {
539                 key = strdup("DisableServerTTS");
540         }
541
542         if (NULL == key) {
543                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
544                 return TTS_ERROR_OUT_OF_MEMORY;
545         }
546
547         int pid = getpid();
548         char* appid = NULL;
549         int ret = app_manager_get_app_id(pid, &appid);
550         if (0 != ret) {
551                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
552                 free(key);
553                 key = NULL;
554                 return TTS_ERROR_OPERATION_FAILED;
555         }
556
557         ret = tts_set_private_data(tts, key, appid);
558         if (0 != ret) {
559                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set private data, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
560                 free(key);
561                 key = NULL;
562                 return ret;
563         }
564
565         free(appid);
566         appid = NULL;
567         free(key);
568         key = NULL;
569
570         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
571         SLOG(LOG_DEBUG, TAG_TTSC, " ");
572
573         return TTS_ERROR_NONE;
574 }
575
576 static Eina_Bool __tts_connect_daemon(void *data)
577 {
578         tts_h tts = (tts_h)data;
579         tts_client_s* client = tts_client_get(tts);
580
581         /* check handle */
582         if (NULL == client) {
583                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
584                 return EINA_FALSE;
585         }
586
587         /* Send hello */
588         if (0 != tts_dbus_request_hello(client->uid)) {
589                 return EINA_TRUE;
590         }
591
592         SLOG(LOG_INFO, TAG_TTSC, "===== Connect daemon");
593
594         /* do request initialize */
595         int ret = -1;
596         bool credential_needed = false;
597
598         ret = tts_dbus_request_initialize(client->uid, &credential_needed);
599
600         if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
601                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
602
603                 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
604                 client->utt_id = -1;
605
606                 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
607                 client->conn_timer = NULL;
608                 return EINA_FALSE;
609
610         } else if (TTS_ERROR_NONE != ret) {
611                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
612                 return EINA_TRUE;
613
614         } else {
615                 /* success to connect tts-daemon */
616                 client->credential_needed = credential_needed;
617                 SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need");
618         }
619
620         client->conn_timer = NULL;
621
622         client = tts_client_get(tts);
623         /* check handle */
624         if (NULL == client) {
625                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
626                 return EINA_FALSE;
627         }
628
629         client->before_state = client->current_state;
630         client->current_state = TTS_STATE_READY;
631
632         if (NULL != client->state_changed_cb) {
633                 tts_client_use_callback(client);
634                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
635                 tts_client_not_use_callback(client);
636         } else {
637                 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
638         }
639
640         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
641         SLOG(LOG_DEBUG, TAG_TTSC, " ");
642
643         return EINA_FALSE;
644 }
645
646 int tts_prepare(tts_h tts)
647 {
648         if (0 != __tts_get_feature_enabled()) {
649                 return TTS_ERROR_NOT_SUPPORTED;
650         }
651
652         SLOG(LOG_INFO, TAG_TTSC, "===== Prepare TTS");
653
654         tts_client_s* client = tts_client_get(tts);
655
656         /* check handle */
657         if (NULL == client) {
658                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
659                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
660                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
661                 return TTS_ERROR_INVALID_PARAMETER;
662         }
663
664         /* check state */
665         if (client->current_state != TTS_STATE_CREATED) {
666                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
667                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
668                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
669                 return TTS_ERROR_INVALID_STATE;
670         }
671
672         client->conn_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
673
674         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
675         SLOG(LOG_DEBUG, TAG_TTSC, " ");
676
677         return TTS_ERROR_NONE;
678 }
679
680 int tts_unprepare(tts_h tts)
681 {
682         if (0 != __tts_get_feature_enabled()) {
683                 return TTS_ERROR_NOT_SUPPORTED;
684         }
685
686         SLOG(LOG_INFO, TAG_TTSC, "===== Unprepare TTS");
687
688         tts_client_s* client = tts_client_get(tts);
689
690         /* check handle */
691         if (NULL == client) {
692                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
693                 return TTS_ERROR_INVALID_PARAMETER;
694         }
695
696         /* check state */
697         if (client->current_state != TTS_STATE_READY) {
698                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
699                 return TTS_ERROR_INVALID_STATE;
700         }
701
702         int ret = -1;
703         int count = 0;
704         int screen_reader = -1;
705
706         ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
707         if (0 != ret) {
708                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get screen reader");
709         } else {
710                 SLOG(LOG_INFO, tts_tag(), "[INFO] Success to get screen reader(%d), g_screen_reader(%s), client->mode(%d)", screen_reader, (true == g_screen_reader) ? "True" : "False", client->mode);
711                 g_screen_reader = (bool)screen_reader;
712         }
713
714         if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
715                 do {
716                         ret = tts_dbus_request_finalize(client->uid);
717                         if (0 != ret) {
718                                 if (TTS_ERROR_TIMED_OUT != ret) {
719                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
720                                         break;
721                                 } else {
722                                         SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
723                                         usleep(10000);
724                                         count++;
725                                         if (TTS_RETRY_COUNT == count) {
726                                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
727                                                 break;
728                                         }
729                                 }
730                         }
731                 } while (0 != ret);
732         } else {
733                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
734         }
735
736         client->before_state = client->current_state;
737         client->current_state = TTS_STATE_CREATED;
738
739         if (NULL != client->state_changed_cb) {
740                 tts_client_use_callback(client);
741                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
742                 tts_client_not_use_callback(client);
743                 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
744         }
745
746         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
747         SLOG(LOG_DEBUG, TAG_TTSC, " ");
748
749         return TTS_ERROR_NONE;
750 }
751
752 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
753 {
754         tts_h tts = (tts_h)user_data;
755
756         tts_client_s* client = tts_client_get(tts);
757         if (NULL == client) {
758                 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
759                 return false;
760         }
761
762         /* call callback function */
763         if (NULL != client->supported_voice_cb) {
764                 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
765         } else {
766                 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
767         }
768
769         return false;
770 }
771
772 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
773 {
774         if (0 != __tts_get_feature_enabled()) {
775                 return TTS_ERROR_NOT_SUPPORTED;
776         }
777
778         SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
779
780         if (NULL == tts || NULL == callback) {
781                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
782                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
783                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
784                 return TTS_ERROR_INVALID_PARAMETER;
785         }
786
787         tts_client_s* client = tts_client_get(tts);
788
789         /* check handle */
790         if (NULL == client) {
791                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
792                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
793                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
794                 return TTS_ERROR_INVALID_PARAMETER;
795         }
796
797         int ret = 0;
798         char* current_engine = NULL;
799         ret = tts_config_mgr_get_engine(&current_engine);
800         if (0 != ret) {
801                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
802                 return __tts_convert_config_error_code(ret);
803         }
804
805         client->supported_voice_cb = callback;
806         client->supported_voice_user_data = user_data;
807
808         ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
809
810         if (NULL != current_engine) {
811                 free(current_engine);
812                 current_engine = NULL;
813         }
814
815         client->supported_voice_cb = NULL;
816         client->supported_voice_user_data = NULL;
817
818         if (0 != ret) {
819                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
820                 ret = TTS_ERROR_OPERATION_FAILED;
821         }
822
823         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
824         SLOG(LOG_DEBUG, TAG_TTSC, " ");
825
826         return ret;
827 }
828
829 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
830 {
831         if (0 != __tts_get_feature_enabled()) {
832                 return TTS_ERROR_NOT_SUPPORTED;
833         }
834
835         SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
836
837         if (NULL == tts) {
838                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
839                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
840                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
841                 return TTS_ERROR_INVALID_PARAMETER;
842
843         }
844         tts_client_s* client = tts_client_get(tts);
845
846         if (NULL == client) {
847                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
848                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
849                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
850                 return TTS_ERROR_INVALID_PARAMETER;
851         }
852
853         /* Request call remote method */
854         int ret = 0;
855         ret = tts_config_mgr_get_voice(lang, vctype);
856         if (0 != ret) {
857                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
858                 return __tts_convert_config_error_code(ret);
859         } else {
860                 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
861         }
862
863         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
864         SLOG(LOG_DEBUG, TAG_TTSC, " ");
865
866         return ret;
867 }
868
869 int tts_get_max_text_size(tts_h tts, unsigned int* size)
870 {
871         if (0 != __tts_get_feature_enabled()) {
872                 return TTS_ERROR_NOT_SUPPORTED;
873         }
874
875         if (NULL == tts || NULL == size) {
876                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
877                 return TTS_ERROR_INVALID_PARAMETER;
878         }
879
880         tts_client_s* client = tts_client_get(tts);
881
882         if (NULL == client) {
883                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
884                 return TTS_ERROR_INVALID_PARAMETER;
885         }
886
887         if (TTS_STATE_READY != client->current_state) {
888                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
889                 return TTS_ERROR_INVALID_STATE;
890         }
891
892 //      *size = TTS_MAX_TEXT_SIZE;
893         if (0 != tts_config_mgr_get_max_text_size(size)) {
894                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
895                 return TTS_ERROR_INVALID_PARAMETER;
896         }
897
898         g_max_text_size = (int)*size;
899
900         SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
901         return TTS_ERROR_NONE;
902 }
903
904 int tts_get_state(tts_h tts, tts_state_e* state)
905 {
906         if (0 != __tts_get_feature_enabled()) {
907                 return TTS_ERROR_NOT_SUPPORTED;
908         }
909
910         if (NULL == tts || NULL == state) {
911                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
912                 return TTS_ERROR_INVALID_PARAMETER;
913         }
914
915         tts_client_s* client = tts_client_get(tts);
916
917         if (NULL == client) {
918                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
919                 return TTS_ERROR_INVALID_PARAMETER;
920         }
921
922         *state = client->current_state;
923
924         switch (*state) {
925         case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'");        break;
926         case TTS_STATE_READY:   SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'");          break;
927         case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'");        break;
928         case TTS_STATE_PAUSED:  SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'");         break;
929         default:                SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value");             break;
930         }
931
932         return TTS_ERROR_NONE;
933 }
934
935 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
936 {
937         if (0 != __tts_get_feature_enabled()) {
938                 return TTS_ERROR_NOT_SUPPORTED;
939         }
940
941         if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
942                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
943                 return TTS_ERROR_INVALID_PARAMETER;
944         }
945
946         tts_client_s* client = tts_client_get(tts);
947
948         if (NULL == client) {
949                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
950                 return TTS_ERROR_INVALID_PARAMETER;
951         }
952
953         *min = TTS_SPEED_MIN;
954         *normal = TTS_SPEED_NORMAL;
955         *max = TTS_SPEED_MAX;
956
957         return TTS_ERROR_NONE;
958 }
959
960 int tts_get_error_message(tts_h tts, char** err_msg)
961 {
962         if (0 != __tts_get_feature_enabled()) {
963                 return TTS_ERROR_NOT_SUPPORTED;
964         }
965
966         if (NULL == tts || NULL == err_msg) {
967                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
968                 return TTS_ERROR_INVALID_PARAMETER;
969         }
970
971         tts_client_s* client = tts_client_get(tts);
972
973         if (NULL == client) {
974                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
975                 return TTS_ERROR_INVALID_PARAMETER;
976         }
977
978         if (NULL != client->err_msg) {
979                 *err_msg = strdup(client->err_msg);
980                 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (%s)", *err_msg);
981         } else {
982                 *err_msg = NULL;
983                 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (NULL)");
984         }
985
986         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
987         SLOG(LOG_DEBUG, TAG_TTSC, " ");
988
989         return TTS_ERROR_NONE;
990 }
991
992 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
993 {
994         SLOG(LOG_INFO, TAG_TTSC, "[DEBUG] Add text: text(%s), language(%s), type(%d)", (NULL == text) ? "NULL" : text, (NULL == language) ? "NULL" : language, voice_type);
995
996         if (0 != __tts_get_feature_enabled()) {
997                 return TTS_ERROR_NOT_SUPPORTED;
998         }
999
1000         if (speed < 0) {
1001                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Speed should not be negative(%d)", speed);
1002                 return TTS_ERROR_INVALID_PARAMETER;
1003         }
1004
1005         if (voice_type < 0) {
1006                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Voice type should not be negative(%d)", voice_type);
1007                 return TTS_ERROR_INVALID_PARAMETER;
1008         }
1009
1010         SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
1011
1012         if (NULL == tts || NULL == utt_id) {
1013                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1014                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1015                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1016                 return TTS_ERROR_INVALID_PARAMETER;
1017         }
1018
1019         tts_client_s* client = tts_client_get(tts);
1020
1021         if (NULL == client) {
1022                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1023                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1024                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1025                 return TTS_ERROR_INVALID_PARAMETER;
1026         }
1027
1028         if (TTS_STATE_CREATED == client->current_state) {
1029                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1030                 return TTS_ERROR_INVALID_STATE;
1031         }
1032
1033         if (-1 == g_max_text_size) {
1034                 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] g_max_text_size is %d", g_max_text_size);
1035                 if (0 != tts_config_mgr_get_max_text_size((unsigned int*)&g_max_text_size)) {
1036                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
1037                         return TTS_ERROR_INVALID_PARAMETER;
1038                 }
1039         }
1040
1041         if (0 == g_max_text_size) {
1042                 if (strlen(text) <= 0) {
1043                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid. (max text size is unlimited.)");
1044                         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1045                         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1046                         return TTS_ERROR_INVALID_PARAMETER;
1047                 }
1048         } else {
1049                 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] g_max_text_size is %d", g_max_text_size);
1050                 if (g_max_text_size < strlen(text) || strlen(text) <= 0) {
1051                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid.");
1052                         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1053                         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1054                         return TTS_ERROR_INVALID_PARAMETER;
1055                 }
1056         }
1057
1058         if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
1059                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
1060                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1061                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1062                 return TTS_ERROR_INVALID_PARAMETER;
1063         }
1064
1065         if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1066                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1067                 return TTS_ERROR_INVALID_STATE;
1068         }
1069
1070         if (true == client->credential_needed && NULL == client->credential) {
1071                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1072                 return TTS_ERROR_PERMISSION_DENIED;
1073         }
1074
1075         /* check valid utf8 */
1076         bool valid = false;
1077
1078         DBusError err;
1079         dbus_error_init(&err);
1080
1081         valid = dbus_validate_utf8(text, &err);
1082         if (dbus_error_is_set(&err)) {
1083                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Dbus Error(%s), text(%s)", err.message, text);
1084                 dbus_error_free(&err);
1085                 return TTS_ERROR_INVALID_PARAMETER;
1086         }
1087
1088         if (valid != true) {
1089                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", text);
1090                 return TTS_ERROR_INVALID_PARAMETER;
1091         }
1092         SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - text is '%s'", text);
1093
1094         /* change default language value */
1095         char* temp = NULL;
1096
1097         if (NULL == language)
1098                 temp = strdup("default");
1099         else
1100                 temp = strdup(language);
1101
1102         client->current_utt_id++;
1103         if (client->current_utt_id == 10000) {
1104                 client->current_utt_id = 1;
1105         }
1106
1107         /* do request */
1108         int ret = -1;
1109         int count = 0;
1110         while (0 != ret) {
1111                 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id, client->credential);
1112                 if (0 != ret) {
1113                         if (TTS_ERROR_TIMED_OUT != ret) {
1114                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1115                                 break;
1116                         } else {
1117                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
1118                                 usleep(10000);
1119                                 count++;
1120                                 if (TTS_RETRY_MIN_COUNT == count) {
1121                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1122                                         break;
1123                                 }
1124                         }
1125                 } else {
1126                         *utt_id = client->current_utt_id;
1127                 }
1128         }
1129
1130         if (NULL != temp) {
1131                 free(temp);
1132                 temp = NULL;
1133         }
1134
1135         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1136         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1137
1138         return ret;
1139 }
1140
1141 static void __tts_play_async(void *data)
1142 {
1143         tts_h tts = (tts_h)data;
1144         tts_client_s* client = tts_client_get(tts);
1145
1146         /* check handle */
1147         if (NULL == client) {
1148                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1149                 return;
1150         }
1151
1152         int ret = -1;
1153         int count = 0;
1154         while (0 != ret) {
1155                 ret = tts_dbus_request_play(client->uid, client->credential);
1156                 if (0 != ret) {
1157                         if (TTS_ERROR_TIMED_OUT != ret) {
1158                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1159                                 break;
1160                         } else {
1161                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1162                                 usleep(10000);
1163                                 count++;
1164                                 if (TTS_RETRY_COUNT == count) {
1165                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1166                                         break;
1167                                 }
1168                         }
1169                 }
1170         }
1171
1172         if (0 != ret) {
1173                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", __tts_get_error_code(ret));
1174
1175                 client->reason = ret;
1176                 client->utt_id = -1;
1177
1178                 ecore_timer_add(0, __tts_notify_error, client->tts);
1179                 return;
1180         }
1181
1182         client->before_state = client->current_state;
1183         client->current_state = TTS_STATE_PLAYING;
1184
1185         if (NULL != client->state_changed_cb) {
1186                 tts_client_use_callback(client);
1187                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1188                 tts_client_not_use_callback(client);
1189                 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1190         }
1191
1192         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1193         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1194
1195         return;
1196 }
1197
1198 int tts_play_async(tts_h tts)
1199 {
1200         if (0 != __tts_get_feature_enabled()) {
1201                 return TTS_ERROR_NOT_SUPPORTED;
1202         }
1203
1204         SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
1205
1206         if (NULL == tts) {
1207                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1208                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1209                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1210                 return TTS_ERROR_INVALID_PARAMETER;
1211         }
1212
1213         tts_client_s* client = tts_client_get(tts);
1214
1215         if (NULL == client) {
1216                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1217                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1218                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1219                 return TTS_ERROR_INVALID_PARAMETER;
1220         }
1221
1222         if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1223                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1224                 return TTS_ERROR_INVALID_STATE;
1225         }
1226
1227         if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1228                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1229                 return TTS_ERROR_INVALID_STATE;
1230         }
1231
1232         if (true == client->credential_needed && NULL == client->credential) {
1233                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1234                 return TTS_ERROR_PERMISSION_DENIED;
1235         }
1236
1237         ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
1238
1239         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1240         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1241
1242         return TTS_ERROR_NONE;
1243 }
1244
1245 int tts_play(tts_h tts)
1246 {
1247         if (0 != __tts_get_feature_enabled()) {
1248                 return TTS_ERROR_NOT_SUPPORTED;
1249         }
1250
1251         SLOG(LOG_INFO, TAG_TTSC, "===== Play tts");
1252
1253         if (NULL == tts) {
1254                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1255                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1256                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1257                 return TTS_ERROR_INVALID_PARAMETER;
1258         }
1259
1260         tts_client_s* client = tts_client_get(tts);
1261
1262         if (NULL == client) {
1263                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1264                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1265                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1266                 return TTS_ERROR_INVALID_PARAMETER;
1267         }
1268
1269         if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1270                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1271                 return TTS_ERROR_INVALID_STATE;
1272         }
1273
1274         if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1275                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1276                 return TTS_ERROR_INVALID_STATE;
1277         }
1278
1279         if (true == client->credential_needed && NULL == client->credential) {
1280                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1281                 return TTS_ERROR_PERMISSION_DENIED;
1282         }
1283
1284         int ret = -1;
1285         int count = 0;
1286         while (0 != ret) {
1287                 ret = tts_dbus_request_play(client->uid, client->credential);
1288                 if (0 != ret) {
1289                         if (TTS_ERROR_TIMED_OUT != ret) {
1290                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1291                                 return ret;
1292                         } else {
1293                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1294                                 usleep(10000);
1295                                 count++;
1296                                 if (TTS_RETRY_COUNT == count) {
1297                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1298                                         return ret;
1299                                 }
1300                         }
1301                 }
1302         }
1303
1304         client->before_state = client->current_state;
1305         client->current_state = TTS_STATE_PLAYING;
1306
1307         if (NULL != client->state_changed_cb) {
1308                 tts_client_use_callback(client);
1309                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1310                 tts_client_not_use_callback(client);
1311                 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1312         }
1313
1314         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1315         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1316
1317         return TTS_ERROR_NONE;
1318 }
1319
1320 static void __tts_stop_async(void *data)
1321 {
1322         tts_h tts = (tts_h)data;
1323         tts_client_s* client = tts_client_get(tts);
1324
1325         /* check handle */
1326         if (NULL == client) {
1327                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1328                 return;
1329         }
1330
1331         int ret = -1;
1332         int count = 0;
1333         while (0 != ret) {
1334                 ret = tts_dbus_request_stop(client->uid);
1335                 if (0 != ret) {
1336                         if (TTS_ERROR_TIMED_OUT != ret) {
1337                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1338                                 break;
1339                         } else {
1340                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1341                                 usleep(10000);
1342                                 count++;
1343                                 if (TTS_RETRY_COUNT == count) {
1344                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1345                                         break;
1346                                 }
1347                         }
1348                 }
1349         }
1350
1351         if (0 != ret) {
1352                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", __tts_get_error_code(ret));
1353
1354                 client->reason = ret;
1355                 client->utt_id = -1;
1356
1357                 ecore_timer_add(0, __tts_notify_error, client->tts);
1358                 return;
1359         }
1360
1361         client->before_state = client->current_state;
1362         client->current_state = TTS_STATE_READY;
1363
1364         if (NULL != client->state_changed_cb) {
1365                 tts_client_use_callback(client);
1366                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1367                 tts_client_not_use_callback(client);
1368                 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1369         }
1370
1371         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1372         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1373
1374         return;
1375 }
1376
1377 int tts_stop_aync(tts_h tts)
1378 {
1379         if (0 != __tts_get_feature_enabled()) {
1380                 return TTS_ERROR_NOT_SUPPORTED;
1381         }
1382
1383         SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1384
1385         if (NULL == tts) {
1386                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1387                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1388                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1389                 return TTS_ERROR_INVALID_PARAMETER;
1390         }
1391
1392         tts_client_s* client = tts_client_get(tts);
1393
1394         if (NULL == client) {
1395                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1396                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1397                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1398                 return TTS_ERROR_INVALID_PARAMETER;
1399         }
1400
1401         if (TTS_STATE_CREATED == client->current_state) {
1402                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1403                 return TTS_ERROR_INVALID_STATE;
1404         }
1405
1406         if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1407                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1408                 return TTS_ERROR_INVALID_STATE;
1409         }
1410
1411         ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
1412
1413         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1414         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1415
1416         return TTS_ERROR_NONE;
1417 }
1418
1419 int tts_stop(tts_h tts)
1420 {
1421         if (0 != __tts_get_feature_enabled()) {
1422                 return TTS_ERROR_NOT_SUPPORTED;
1423         }
1424
1425         SLOG(LOG_INFO, TAG_TTSC, "===== Stop tts");
1426
1427         if (NULL == tts) {
1428                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1429                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1430                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1431                 return TTS_ERROR_INVALID_PARAMETER;
1432         }
1433
1434         tts_client_s* client = tts_client_get(tts);
1435
1436         if (NULL == client) {
1437                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1438                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1439                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1440                 return TTS_ERROR_INVALID_PARAMETER;
1441         }
1442
1443         if (TTS_STATE_CREATED == client->current_state) {
1444                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1445                 return TTS_ERROR_INVALID_STATE;
1446         }
1447
1448         if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1449                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1450                 return TTS_ERROR_INVALID_STATE;
1451         }
1452
1453         int ret = -1;
1454         int count = 0;
1455         while (0 != ret) {
1456                 ret = tts_dbus_request_stop(client->uid);
1457                 if (0 != ret) {
1458                         if (TTS_ERROR_TIMED_OUT != ret) {
1459                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1460                                 return ret;
1461                         } else {
1462                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1463                                 usleep(10000);
1464                                 count++;
1465                                 if (TTS_RETRY_COUNT == count) {
1466                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1467                                         return ret;
1468                                 }
1469                         }
1470                 }
1471         }
1472
1473         client->before_state = client->current_state;
1474         client->current_state = TTS_STATE_READY;
1475
1476         if (NULL != client->state_changed_cb) {
1477                 tts_client_use_callback(client);
1478                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1479                 tts_client_not_use_callback(client);
1480                 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1481         }
1482
1483         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1484         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1485
1486         return TTS_ERROR_NONE;
1487 }
1488
1489 static void __tts_pause_async(void *data)
1490 {
1491         tts_h tts = (tts_h)data;
1492         tts_client_s* client = tts_client_get(tts);
1493
1494         /* check handle */
1495         if (NULL == client) {
1496                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1497                 return;
1498         }
1499
1500         int ret = -1;
1501         int count = 0;
1502         while (0 != ret) {
1503                 ret = tts_dbus_request_pause(client->uid);
1504                 if (0 != ret) {
1505                         if (TTS_ERROR_TIMED_OUT != ret) {
1506                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1507                                 break;
1508                         } else {
1509                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1510                                 usleep(10000);
1511                                 count++;
1512                                 if (TTS_RETRY_COUNT == count) {
1513                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1514                                         break;
1515                                 }
1516                         }
1517                 }
1518         }
1519
1520         if (0 != ret) {
1521                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", __tts_get_error_code(ret));
1522
1523                 client->reason = ret;
1524                 client->utt_id = -1;
1525
1526                 ecore_timer_add(0, __tts_notify_error, client->tts);
1527                 return;
1528         }
1529
1530         client->before_state = client->current_state;
1531         client->current_state = TTS_STATE_PAUSED;
1532
1533         if (NULL != client->state_changed_cb) {
1534                 tts_client_use_callback(client);
1535                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1536                 tts_client_not_use_callback(client);
1537                 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1538         }
1539
1540         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1541         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1542
1543         return;
1544 }
1545
1546 int tts_pause_async(tts_h tts)
1547 {
1548         if (0 != __tts_get_feature_enabled()) {
1549                 return TTS_ERROR_NOT_SUPPORTED;
1550         }
1551
1552         SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1553
1554         if (NULL == tts) {
1555                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1556                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1557                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1558                 return TTS_ERROR_INVALID_PARAMETER;
1559         }
1560
1561         tts_client_s* client = tts_client_get(tts);
1562
1563         if (NULL == client) {
1564                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1565                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1566                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1567                 return TTS_ERROR_INVALID_PARAMETER;
1568         }
1569
1570         if (TTS_STATE_PLAYING != client->current_state) {
1571                 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1572                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1573                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1574                 return TTS_ERROR_INVALID_STATE;
1575         }
1576
1577         if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1578                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1579                 return TTS_ERROR_INVALID_STATE;
1580         }
1581
1582         ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
1583
1584         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1585         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1586
1587         return TTS_ERROR_NONE;
1588 }
1589
1590 int tts_pause(tts_h tts)
1591 {
1592         if (0 != __tts_get_feature_enabled()) {
1593                 return TTS_ERROR_NOT_SUPPORTED;
1594         }
1595
1596         SLOG(LOG_INFO, TAG_TTSC, "===== Pause tts");
1597
1598         if (NULL == tts) {
1599                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1600                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1601                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1602                 return TTS_ERROR_INVALID_PARAMETER;
1603         }
1604
1605         tts_client_s* client = tts_client_get(tts);
1606
1607         if (NULL == client) {
1608                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1609                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1610                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1611                 return TTS_ERROR_INVALID_PARAMETER;
1612         }
1613
1614         if (TTS_STATE_PLAYING != client->current_state) {
1615                 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1616                 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1617                 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1618                 return TTS_ERROR_INVALID_STATE;
1619         }
1620
1621         if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1622                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1623                 return TTS_ERROR_INVALID_STATE;
1624         }
1625
1626         int ret = -1;
1627         int count = 0;
1628         while (0 != ret) {
1629                 ret = tts_dbus_request_pause(client->uid);
1630                 if (0 != ret) {
1631                         if (TTS_ERROR_TIMED_OUT != ret) {
1632                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1633                                 return ret;
1634                         } else {
1635                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1636                                 usleep(10000);
1637                                 count++;
1638                                 if (TTS_RETRY_COUNT == count) {
1639                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1640                                         return ret;
1641                                 }
1642                         }
1643                 }
1644         }
1645
1646         client->before_state = client->current_state;
1647         client->current_state = TTS_STATE_PAUSED;
1648
1649         if (NULL != client->state_changed_cb) {
1650                 tts_client_use_callback(client);
1651                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1652                 tts_client_not_use_callback(client);
1653                 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1654         }
1655
1656         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1657         SLOG(LOG_DEBUG, TAG_TTSC, " ");
1658
1659         return TTS_ERROR_NONE;
1660 }
1661
1662 int tts_set_private_data(tts_h tts, const char* key, const char* data)
1663 {
1664         if (0 != __tts_get_feature_enabled()) {
1665                 return TTS_ERROR_NOT_SUPPORTED;
1666         }
1667
1668         SLOG(LOG_INFO, TAG_TTSC, "===== Set private data, key(%s), data(%s)", key, data);
1669
1670         if (NULL == tts) {
1671                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle isnull");
1672                 return TTS_ERROR_INVALID_PARAMETER;
1673         }
1674
1675         if (NULL == key || NULL == data) {
1676                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1677                 return TTS_ERROR_INVALID_PARAMETER;
1678         }
1679
1680         tts_client_s* client = tts_client_get(tts);
1681
1682         if (NULL == client) {
1683                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1684                 return TTS_ERROR_INVALID_PARAMETER;
1685         }
1686
1687         if (TTS_STATE_READY != client->current_state) {
1688                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1689                 return TTS_ERROR_INVALID_STATE;
1690         }
1691
1692         if (true != client->internal && (0 == strcmp(key, "EnableServerTTS") || 0 == strcmp(key, "DisableServerTTS"))) {
1693                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] This is not an internal app");
1694                 return TTS_ERROR_INVALID_PARAMETER;
1695         }
1696
1697         int ret = -1;
1698         int count = 0;
1699         while (0 != ret) {
1700                 ret = tts_dbus_request_set_private_data(client->uid, key, data);
1701                 if (0 != ret) {
1702                         if (TTS_ERROR_TIMED_OUT != ret) {
1703                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1704                                 return ret;
1705                         } else {
1706                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1707                                 usleep(10000);
1708                                 count++;
1709                                 if (TTS_RETRY_COUNT == count) {
1710                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1711                                         return ret;
1712                                 }
1713                         }
1714                 }
1715         }
1716
1717         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1718         SLOG(LOG_DEBUG, TAG_TTSC, "");
1719
1720         return 0;
1721 }
1722
1723 int tts_get_private_data(tts_h tts, const char* key, char** data)
1724 {
1725         if (0 != __tts_get_feature_enabled()) {
1726                 return TTS_ERROR_NOT_SUPPORTED;
1727         }
1728
1729         SLOG(LOG_INFO, TAG_TTSC, "===== Get private data, key(%s)", key);
1730
1731         if (NULL == tts) {
1732                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1733                 return TTS_ERROR_INVALID_PARAMETER;
1734         }
1735
1736         if (NULL == key || NULL == data) {
1737                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1738                 return TTS_ERROR_INVALID_PARAMETER;
1739         }
1740
1741         tts_client_s* client = tts_client_get(tts);
1742
1743         if (NULL == client) {
1744                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1745                 return TTS_ERROR_INVALID_PARAMETER;
1746         }
1747
1748         if (TTS_STATE_READY != client->current_state) {
1749                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1750                 return TTS_ERROR_INVALID_STATE;
1751         }
1752
1753         int ret = -1;
1754         int count = 0;
1755         while (0 != ret) {
1756                 ret = tts_dbus_request_get_private_data(client->uid, key, data);
1757                 if (0 != ret) {
1758                         if (TTS_ERROR_TIMED_OUT != ret) {
1759                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1760                                 return ret;
1761                         } else {
1762                                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1763                                 usleep(10000);
1764                                 count++;
1765                                 if (TTS_RETRY_COUNT == count) {
1766                                         SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1767                                         return ret;
1768                                 }
1769                         }
1770                 }
1771         }
1772
1773         if (0 == strncmp(*data, "NULL", strlen(*data))) {
1774                 free(*data);
1775                 *data = NULL;
1776         }
1777
1778         SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1779         SLOG(LOG_DEBUG, TAG_TTSC, "");
1780
1781         return 0;
1782 }
1783
1784 static Eina_Bool __tts_notify_error(void *data)
1785 {
1786         tts_h tts = (tts_h)data;
1787
1788         tts_client_s* client = tts_client_get(tts);
1789
1790         /* check handle */
1791         if (NULL == client) {
1792                 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
1793                 return EINA_FALSE;
1794         }
1795
1796         SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
1797
1798         if (NULL != client->error_cb) {
1799                 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
1800                 tts_client_use_callback(client);
1801                 g_err_callback_status = true;
1802                 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
1803                 g_err_callback_status = false;
1804                 tts_client_not_use_callback(client);
1805         } else {
1806                 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1807         }
1808
1809         return EINA_FALSE;
1810 }
1811
1812 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg)
1813 {
1814         if (-1 == uid) {
1815                 GList* client_list = NULL;
1816                 client_list = tts_client_get_client_list();
1817
1818                 GList *iter = NULL;
1819                 tts_client_s *data = NULL;
1820
1821                 if (g_list_length(client_list) > 0) {
1822                         /* Get a first item */
1823                         iter = g_list_first(client_list);
1824
1825                         while (NULL != iter) {
1826                                 data = iter->data;
1827
1828                                 data->utt_id = utt_id;
1829                                 data->reason = reason;
1830                                 if (NULL != data->err_msg) {
1831                                         free(data->err_msg);
1832                                         data->err_msg = NULL;
1833                                 }
1834                                 if (NULL != err_msg)
1835                                         data->err_msg = strdup(err_msg);
1836
1837                                 /* call callback function */
1838                                 if (NULL != data->error_cb) {
1839                                         ecore_timer_add(0, __tts_notify_error, data->tts);
1840                                 } else {
1841                                         SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1842                                 }
1843
1844                                 if (TTS_ERROR_SERVICE_RESET == reason) {
1845                                         SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
1846
1847                                         data->current_state = TTS_STATE_CREATED;
1848                                         if (0 != tts_prepare(data->tts)) {
1849                                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
1850                                         }
1851                                 }
1852
1853                                 /* Next item */
1854                                 iter = g_list_next(iter);
1855                         }
1856                 }
1857         } else {
1858                 tts_client_s* client = tts_client_get_by_uid(uid);
1859
1860                 if (NULL == client) {
1861                         SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1862                         return TTS_ERROR_INVALID_PARAMETER;
1863                 }
1864
1865                 client->utt_id = utt_id;
1866                 client->reason = reason;
1867                 if (NULL != client->err_msg) {
1868                         free(client->err_msg);
1869                         client->err_msg = NULL;
1870                 }
1871                 if (NULL != err_msg)
1872                         client->err_msg = strdup(err_msg);
1873
1874                 /* call callback function */
1875                 if (NULL != client->error_cb) {
1876                         ecore_timer_add(0, __tts_notify_error, client->tts);
1877                 } else {
1878                         SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1879                 }
1880
1881                 if (TTS_ERROR_SERVICE_RESET == reason) {
1882                         SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
1883
1884                         client->current_state = TTS_STATE_CREATED;
1885                         if (0 != tts_prepare(client->tts)) {
1886                                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
1887                         }
1888                 }
1889         }
1890
1891         return 0;
1892 }
1893
1894 static Eina_Bool __tts_notify_state_changed(void *data)
1895 {
1896         tts_h tts = (tts_h)data;
1897
1898         tts_client_s* client = tts_client_get(tts);
1899
1900         /* check handle */
1901         if (NULL == client) {
1902                 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
1903                 return EINA_FALSE;
1904         }
1905
1906         if (NULL != client->state_changed_cb) {
1907                 tts_client_use_callback(client);
1908                 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1909                 tts_client_not_use_callback(client);
1910                 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
1911         } else {
1912                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1913         }
1914
1915         return EINA_FALSE;
1916 }
1917
1918 int __tts_cb_set_state(int uid, int state)
1919 {
1920         tts_client_s* client = tts_client_get_by_uid(uid);
1921         if (NULL == client) {
1922                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
1923                 return -1;
1924         }
1925
1926         tts_state_e state_from_daemon = (tts_state_e)state;
1927
1928         if (client->current_state == state_from_daemon) {
1929                 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
1930                 return 0;
1931         }
1932
1933         if (NULL != client->state_changed_cb) {
1934                 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
1935         } else {
1936                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1937         }
1938
1939         client->before_state = client->current_state;
1940         client->current_state = state_from_daemon;
1941
1942         return 0;
1943 }
1944
1945 int __tts_cb_utt_started(int uid, int utt_id)
1946 {
1947         tts_client_s* client = tts_client_get_by_uid(uid);
1948
1949         if (NULL == client) {
1950                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1951                 return TTS_ERROR_INVALID_PARAMETER;
1952         }
1953
1954         SLOG(LOG_INFO, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
1955
1956         client->utt_id = utt_id;
1957
1958         /* call callback function */
1959         if (NULL != client->utt_started_cb) {
1960                 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
1961                 tts_client_use_callback(client);
1962                 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
1963                 tts_client_not_use_callback(client);
1964         } else {
1965                 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1966         }
1967
1968         return 0;
1969 }
1970
1971 int __tts_cb_utt_completed(int uid, int utt_id)
1972 {
1973         tts_client_s* client = tts_client_get_by_uid(uid);
1974
1975         if (NULL == client) {
1976                 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1977                 return TTS_ERROR_INVALID_PARAMETER;
1978         }
1979
1980         SLOG(LOG_INFO, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
1981
1982         client->utt_id = utt_id;
1983
1984         /* call callback function */
1985         if (NULL != client->utt_completeted_cb) {
1986                 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
1987                 tts_client_use_callback(client);
1988                 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
1989                 tts_client_not_use_callback(client);
1990         } else {
1991                 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1992         }
1993
1994         return 0;
1995 }
1996
1997 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1998 {
1999         if (0 != __tts_get_feature_enabled()) {
2000                 return TTS_ERROR_NOT_SUPPORTED;
2001         }
2002
2003         if (NULL == tts || NULL == callback) {
2004                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
2005                 return TTS_ERROR_INVALID_PARAMETER;
2006         }
2007
2008         tts_client_s* client = tts_client_get(tts);
2009
2010         if (NULL == client) {
2011                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
2012                 return TTS_ERROR_INVALID_PARAMETER;
2013         }
2014
2015         if (TTS_STATE_CREATED != client->current_state) {
2016                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
2017                 return TTS_ERROR_INVALID_STATE;
2018         }
2019
2020         client->state_changed_cb = callback;
2021         client->state_changed_user_data = user_data;
2022
2023         SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set state changed cb");
2024
2025         return 0;
2026 }
2027
2028 int tts_unset_state_changed_cb(tts_h tts)
2029 {
2030         if (0 != __tts_get_feature_enabled()) {
2031                 return TTS_ERROR_NOT_SUPPORTED;
2032         }
2033
2034         if (NULL == tts) {
2035                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
2036                 return TTS_ERROR_INVALID_PARAMETER;
2037         }
2038
2039         tts_client_s* client = tts_client_get(tts);
2040
2041         if (NULL == client) {
2042                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
2043                 return TTS_ERROR_INVALID_PARAMETER;
2044         }
2045
2046         if (TTS_STATE_CREATED != client->current_state) {
2047                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
2048                 return TTS_ERROR_INVALID_STATE;
2049         }
2050
2051         client->state_changed_cb = NULL;
2052         client->state_changed_user_data = NULL;
2053
2054         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
2055
2056         return 0;
2057 }
2058
2059 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
2060 {
2061         if (0 != __tts_get_feature_enabled()) {
2062                 return TTS_ERROR_NOT_SUPPORTED;
2063         }
2064
2065         if (NULL == tts || NULL == callback) {
2066                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
2067                 return TTS_ERROR_INVALID_PARAMETER;
2068         }
2069
2070         tts_client_s* client = tts_client_get(tts);
2071
2072         if (NULL == client) {
2073                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
2074                 return TTS_ERROR_INVALID_PARAMETER;
2075         }
2076
2077         if (TTS_STATE_CREATED != client->current_state) {
2078                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
2079                 return TTS_ERROR_INVALID_STATE;
2080         }
2081
2082         client->utt_started_cb = callback;
2083         client->utt_started_user_data = user_data;
2084
2085         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
2086
2087         return 0;
2088 }
2089
2090 int tts_unset_utterance_started_cb(tts_h tts)
2091 {
2092         if (0 != __tts_get_feature_enabled()) {
2093                 return TTS_ERROR_NOT_SUPPORTED;
2094         }
2095
2096         if (NULL == tts) {
2097                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
2098                 return TTS_ERROR_INVALID_PARAMETER;
2099         }
2100
2101         tts_client_s* client = tts_client_get(tts);
2102
2103         if (NULL == client) {
2104                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
2105                 return TTS_ERROR_INVALID_PARAMETER;
2106         }
2107
2108         if (TTS_STATE_CREATED != client->current_state) {
2109                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
2110                 return TTS_ERROR_INVALID_STATE;
2111         }
2112
2113         client->utt_started_cb = NULL;
2114         client->utt_started_user_data = NULL;
2115
2116         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
2117
2118         return 0;
2119 }
2120
2121 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
2122 {
2123         if (0 != __tts_get_feature_enabled()) {
2124                 return TTS_ERROR_NOT_SUPPORTED;
2125         }
2126
2127         if (NULL == tts || NULL == callback) {
2128                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
2129                 return TTS_ERROR_INVALID_PARAMETER;
2130         }
2131
2132         tts_client_s* client = tts_client_get(tts);
2133
2134         if (NULL == client) {
2135                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
2136                 return TTS_ERROR_INVALID_PARAMETER;
2137         }
2138
2139         if (TTS_STATE_CREATED != client->current_state) {
2140                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
2141                 return TTS_ERROR_INVALID_STATE;
2142         }
2143
2144         client->utt_completeted_cb = callback;
2145         client->utt_completed_user_data = user_data;
2146
2147         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
2148
2149         return 0;
2150 }
2151
2152 int tts_unset_utterance_completed_cb(tts_h tts)
2153 {
2154         if (0 != __tts_get_feature_enabled()) {
2155                 return TTS_ERROR_NOT_SUPPORTED;
2156         }
2157
2158         if (NULL == tts) {
2159                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
2160                 return TTS_ERROR_INVALID_PARAMETER;
2161         }
2162
2163         tts_client_s* client = tts_client_get(tts);
2164
2165         if (NULL == client) {
2166                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
2167                 return TTS_ERROR_INVALID_PARAMETER;
2168         }
2169
2170         if (TTS_STATE_CREATED != client->current_state) {
2171                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
2172                 return TTS_ERROR_INVALID_STATE;
2173         }
2174
2175         client->utt_completeted_cb = NULL;
2176         client->utt_completed_user_data = NULL;
2177
2178         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
2179         return 0;
2180 }
2181
2182 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
2183 {
2184         if (0 != __tts_get_feature_enabled()) {
2185                 return TTS_ERROR_NOT_SUPPORTED;
2186         }
2187
2188         if (NULL == tts || NULL == callback) {
2189                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
2190                 return TTS_ERROR_INVALID_PARAMETER;
2191         }
2192
2193         tts_client_s* client = tts_client_get(tts);
2194
2195         if (NULL == client) {
2196                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
2197                 return TTS_ERROR_INVALID_PARAMETER;
2198         }
2199
2200         if (TTS_STATE_CREATED != client->current_state) {
2201                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
2202                 return TTS_ERROR_INVALID_STATE;
2203         }
2204
2205         client->error_cb = callback;
2206         client->error_user_data = user_data;
2207
2208         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
2209
2210         return 0;
2211 }
2212
2213 int tts_unset_error_cb(tts_h tts)
2214 {
2215         if (0 != __tts_get_feature_enabled()) {
2216                 return TTS_ERROR_NOT_SUPPORTED;
2217         }
2218
2219         if (NULL == tts) {
2220                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
2221                 return TTS_ERROR_INVALID_PARAMETER;
2222         }
2223
2224         tts_client_s* client = tts_client_get(tts);
2225
2226         if (NULL == client) {
2227                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
2228                 return TTS_ERROR_INVALID_PARAMETER;
2229         }
2230
2231         if (TTS_STATE_CREATED != client->current_state) {
2232                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
2233                 return TTS_ERROR_INVALID_STATE;
2234         }
2235
2236         client->error_cb = NULL;
2237         client->error_user_data = NULL;
2238
2239         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
2240
2241         return 0;
2242 }
2243
2244 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
2245 {
2246         if (0 != __tts_get_feature_enabled()) {
2247                 return TTS_ERROR_NOT_SUPPORTED;
2248         }
2249
2250         if (NULL == tts || NULL == callback) {
2251                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
2252                 return TTS_ERROR_INVALID_PARAMETER;
2253         }
2254
2255         tts_client_s* client = tts_client_get(tts);
2256
2257         if (NULL == client) {
2258                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
2259                 return TTS_ERROR_INVALID_PARAMETER;
2260         }
2261
2262         if (TTS_STATE_CREATED != client->current_state) {
2263                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
2264                 return TTS_ERROR_INVALID_STATE;
2265         }
2266
2267         client->default_voice_changed_cb = callback;
2268         client->default_voice_changed_user_data = user_data;
2269
2270         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
2271
2272         return 0;
2273 }
2274
2275 int tts_unset_default_voice_changed_cb(tts_h tts)
2276 {
2277         if (0 != __tts_get_feature_enabled()) {
2278                 return TTS_ERROR_NOT_SUPPORTED;
2279         }
2280
2281         if (NULL == tts) {
2282                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
2283                 return TTS_ERROR_INVALID_PARAMETER;
2284         }
2285
2286         tts_client_s* client = tts_client_get(tts);
2287
2288         if (NULL == client) {
2289                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
2290                 return TTS_ERROR_INVALID_PARAMETER;
2291         }
2292
2293         if (TTS_STATE_CREATED != client->current_state) {
2294                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
2295                 return TTS_ERROR_INVALID_STATE;
2296         }
2297
2298         client->default_voice_changed_cb = NULL;
2299         client->default_voice_changed_user_data = NULL;
2300
2301         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");
2302
2303         return 0;
2304 }
2305
2306 int tts_set_engine_changed_cb(tts_h tts, tts_engine_changed_cb callback, void* user_data)
2307 {
2308         if (0 != __tts_get_feature_enabled()) {
2309                 return TTS_ERROR_NOT_SUPPORTED;
2310         }
2311
2312         if (NULL == tts || NULL == callback) {
2313                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Input parameter is null");
2314                 return TTS_ERROR_INVALID_PARAMETER;
2315         }
2316
2317         tts_client_s* client = tts_client_get(tts);
2318
2319         if (NULL == client) {
2320                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : A handle is not valid");
2321                 return TTS_ERROR_INVALID_PARAMETER;
2322         }
2323
2324         if (TTS_STATE_CREATED != client->current_state) {
2325                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Current state is not 'Created'.");
2326                 return TTS_ERROR_INVALID_STATE;
2327         }
2328
2329         client->engine_changed_cb = callback;
2330         client->engine_changed_user_data = user_data;
2331
2332         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set engine changed cb");
2333
2334         return 0;
2335 }
2336
2337 int tts_unset_engine_changed_cb(tts_h tts)
2338 {
2339         if (0 != __tts_get_feature_enabled()) {
2340                 return TTS_ERROR_NOT_SUPPORTED;
2341         }
2342
2343         if (NULL == tts) {
2344                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Input parameter is null");
2345                 return TTS_ERROR_INVALID_PARAMETER;
2346         }
2347
2348         tts_client_s* client = tts_client_get(tts);
2349
2350         if (NULL == client) {
2351                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : A handle is not valid");
2352                 return TTS_ERROR_INVALID_PARAMETER;
2353         }
2354
2355         if (TTS_STATE_CREATED != client->current_state) {
2356                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Current state is not 'Created'.");
2357                 return TTS_ERROR_INVALID_STATE;
2358         }
2359
2360         client->engine_changed_cb = NULL;
2361         client->engine_changed_user_data = NULL;
2362
2363         SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset engine changed cb");
2364
2365         return 0;
2366 }
2367