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.
21 #include <sys/inotify.h>
25 #include "tts_config_mgr.h"
26 #include "tts_config_parser.h"
31 tts_config_engine_changed_cb engine_cb;
32 tts_config_voice_changed_cb voice_cb;
33 tts_config_speech_rate_changed_cb speech_cb;
34 tts_config_screen_reader_changed_cb screen_cb;
35 tts_config_pitch_changed_cb pitch_cb;
37 } tts_config_client_s;
39 extern char* tts_tag();
41 static GSList* g_engine_list = NULL;
43 static GSList* g_config_client_list = NULL;
45 static tts_config_s* g_config_info = NULL;
47 static Ecore_Fd_Handler* g_config_fd_handler_noti = NULL;
48 static int g_config_fd_noti;
49 static int g_config_wd_noti;
51 /* For engine directory monitoring */
53 Ecore_Fd_Handler* dir_fd_handler;
56 } tts_engine_inotify_s;
58 static GList* g_ino_list = NULL;
60 int __tts_config_mgr_print_engine_info();
61 static int __tts_config_mgr_register_engine_config_updated_event(const char* path);
62 static int __tts_config_mgr_unregister_engine_config_updated_event();
64 int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
66 if (NULL == engine_id) {
67 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
72 tts_engine_info_s *engine_info = NULL;
74 if (0 >= g_slist_length(g_engine_list)) {
75 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
79 /* Get a first item */
80 iter = g_slist_nth(g_engine_list, 0);
82 while (NULL != iter) {
83 engine_info = iter->data;
85 if (NULL == engine_info) {
86 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
90 if (NULL != engine_info->uuid && 0 == strcmp(engine_id, engine_info->uuid)) {
91 SLOG(LOG_DEBUG, tts_tag(), "Default engine is valid : %s", engine_id);
95 iter = g_slist_next(iter);
98 /* Change default engine */
99 iter = g_slist_nth(g_engine_list, 0);
101 SLOG(LOG_ERROR, tts_tag(), "[ERROR] No engine in list");
102 return TTS_CONFIG_ERROR_OPERATION_FAILED;
105 engine_info = iter->data;
106 if (NULL == g_config_info) {
107 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Invalid engine info in list");
108 return TTS_CONFIG_ERROR_OPERATION_FAILED;
111 if (NULL != engine_info->uuid) {
112 if (NULL != g_config_info->engine_id) {
113 free(g_config_info->engine_id);
114 g_config_info->engine_id = NULL;
116 g_config_info->engine_id = strdup(engine_info->uuid);
118 if (NULL != engine_info->setting) {
119 if (NULL != g_config_info->setting) {
120 free(g_config_info->setting);
121 g_config_info->setting = NULL;
123 g_config_info->setting = strdup(engine_info->setting);
126 if (NULL == g_config_info->engine_id || NULL == g_config_info->setting) {
127 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup engine_info");
131 SLOG(LOG_DEBUG, tts_tag(), "Default engine is changed : %s", g_config_info->engine_id);
133 /* Change is default voice */
134 GSList *iter_voice = NULL;
135 tts_config_voice_s* voice = NULL;
136 bool is_valid_voice = false;
138 /* Get a first item */
139 iter_voice = g_slist_nth(engine_info->voices, 0);
141 while (NULL != iter_voice) {
142 /*Get handle data from list*/
143 voice = iter_voice->data;
146 if (NULL != voice->language && NULL != g_config_info->language) {
147 if (0 == strcmp(voice->language, g_config_info->language)) {
148 if (voice->type == g_config_info->type) {
149 /* language is valid */
150 is_valid_voice = true;
152 free(g_config_info->language);
153 g_config_info->language = NULL;
154 g_config_info->language = strdup(voice->language);
155 if (NULL == g_config_info->language) {
156 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup language");
157 return TTS_CONFIG_ERROR_OPERATION_FAILED;
159 g_config_info->type = voice->type;
161 SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
168 iter_voice = g_slist_next(iter_voice);
171 if (false == is_valid_voice) {
172 /* Select first voice as default */
173 if (NULL != g_config_info->language) {
174 free(g_config_info->language);
175 g_config_info->language = NULL;
177 iter_voice = g_slist_nth(engine_info->voices, 0);
178 if (NULL == iter_voice) {
179 SLOG(LOG_ERROR, tts_tag(), "Fail to get voice list");
180 return TTS_CONFIG_ERROR_OPERATION_FAILED;
182 voice = iter_voice->data;
184 if (NULL == voice || NULL == voice->language) {
185 SLOG(LOG_ERROR, tts_tag(), "Fail to get voice info from list");
186 return TTS_CONFIG_ERROR_OPERATION_FAILED;
189 g_config_info->language = strdup(voice->language);
190 if (NULL == g_config_info->language) {
191 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup language");
192 return TTS_CONFIG_ERROR_OPERATION_FAILED;
194 g_config_info->type = voice->type;
195 SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
199 if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting,
200 g_config_info->language, g_config_info->type)) {
201 SLOG(LOG_ERROR, tts_tag(), " Fail to save config");
202 return TTS_CONFIG_ERROR_OPERATION_FAILED;
208 bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* language, int type)
210 if (NULL == engine_id || NULL == language) {
211 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
216 tts_engine_info_s *engine_info = NULL;
218 if (0 >= g_slist_length(g_engine_list)) {
219 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
223 /* Get a first item */
224 iter = g_slist_nth(g_engine_list, 0);
226 while (NULL != iter) {
227 engine_info = iter->data;
229 if (NULL == engine_info) {
230 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
234 if (0 != strcmp(engine_id, engine_info->uuid)) {
235 iter = g_slist_next(iter);
239 GSList *iter_voice = NULL;
240 tts_config_voice_s* voice = NULL;
242 if (g_slist_length(engine_info->voices) <= 0) {
243 SLOG(LOG_ERROR, tts_tag(), "There is no voice : %s", engine_info->uuid);
244 iter = g_slist_next(iter);
248 /* Get a first item */
249 iter_voice = g_slist_nth(engine_info->voices, 0);
252 while (NULL != iter_voice) {
253 /*Get handle data from list*/
254 voice = iter_voice->data;
257 if (0 == strcmp(language, voice->language)) {
258 if (type == voice->type) {
265 iter_voice = g_slist_next(iter_voice);
275 int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* type)
277 if (NULL == engine_id || NULL == language) {
278 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
283 tts_engine_info_s *engine_info = NULL;
285 if (0 >= g_slist_length(g_engine_list)) {
286 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
290 /* Get a first item */
291 iter = g_slist_nth(g_engine_list, 0);
293 while (NULL != iter) {
294 engine_info = iter->data;
296 if (NULL == engine_info) {
297 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
301 if (0 != strcmp(engine_id, engine_info->uuid)) {
302 iter = g_slist_next(iter);
306 GSList *iter_voice = NULL;
307 tts_config_voice_s* voice = NULL;
309 if (g_slist_length(engine_info->voices) <= 0) {
310 SLOG(LOG_ERROR, tts_tag(), "There is no voice : %s", engine_info->uuid);
314 /* Get a first item */
315 iter_voice = g_slist_nth(engine_info->voices, 0);
317 while (NULL != iter_voice) {
318 voice = iter_voice->data;
320 /* Default language */
321 if (0 == strcmp(TTS_BASE_LANGUAGE, voice->language)) {
322 *language = strdup(voice->language);
325 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Selected language(%s) type(%d)", *language, *type);
329 iter_voice = g_slist_next(iter_voice);
332 /* Not support base language */
334 *language = strdup(voice->language);
337 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Selected language(%s) type(%d)", *language, *type);
346 Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
348 SLOG(LOG_DEBUG, tts_tag(), "===== Config changed callback event");
351 struct inotify_event event;
352 memset(&event, '\0', sizeof(struct inotify_event));
354 length = read(g_config_fd_noti, &event, sizeof(struct inotify_event));
356 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Empty Inotify event");
357 SLOG(LOG_DEBUG, tts_tag(), "=====");
358 SLOG(LOG_DEBUG, tts_tag(), " ");
359 return ECORE_CALLBACK_DONE;
362 if (IN_CLOSE_WRITE == event.mask) {
363 /* check config changed state */
365 char* setting = NULL;
367 bool auto_voice = g_config_info->auto_voice;
369 int speech_rate = -1;
373 tts_config_client_s* temp_client = NULL;
375 if (0 != tts_parser_find_config_changed(&engine, &setting, &auto_voice, &lang, &voice_type, &speech_rate, &pitch))
376 return ECORE_CALLBACK_PASS_ON;
379 if (NULL != engine || NULL != setting) {
380 if (NULL != engine) {
381 if (NULL != g_config_info->engine_id) {
382 free(g_config_info->engine_id);
383 g_config_info->engine_id = NULL;
386 g_config_info->engine_id = strdup(engine);
387 if (NULL == g_config_info->engine_id) {
388 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup engine_id");
389 return ECORE_CALLBACK_DONE;
392 if (NULL != setting) {
393 if (NULL != g_config_info->setting) {
394 free(g_config_info->setting);
395 g_config_info->setting = NULL;
398 g_config_info->setting = strdup(setting);
399 if (NULL == g_config_info->setting) {
400 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup setting");
401 return ECORE_CALLBACK_DONE;
405 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine change(%s)", g_config_info->engine_id);
407 /* Call all callbacks of client*/
408 iter = g_slist_nth(g_config_client_list, 0);
410 while (NULL != iter) {
411 temp_client = iter->data;
413 if (NULL != temp_client) {
414 if (NULL != temp_client->engine_cb) {
415 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine changed callback : uid(%d)", temp_client->uid);
416 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting,
417 g_config_info->language, g_config_info->type,
418 g_config_info->auto_voice, g_config_info->credential, temp_client->user_data);
422 iter = g_slist_next(iter);
426 if (auto_voice != g_config_info->auto_voice) {
427 g_config_info->auto_voice = auto_voice;
430 if (NULL != lang || -1 != voice_type) {
431 char* before_lang = NULL;
434 before_lang = strdup(g_config_info->language);
435 before_type = g_config_info->type;
438 if (NULL != g_config_info->language) {
439 free(g_config_info->language);
440 g_config_info->language = NULL;
443 g_config_info->language = strdup(lang);
444 if (NULL == g_config_info->language) {
445 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup lang");
448 if (-1 != voice_type) {
449 g_config_info->type = voice_type;
452 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Voice change(%s, %d)", g_config_info->language, g_config_info->type);
454 /* Call all callbacks of client*/
455 iter = g_slist_nth(g_config_client_list, 0);
457 while (NULL != iter) {
458 temp_client = iter->data;
460 if (NULL != temp_client) {
461 if (NULL != temp_client->voice_cb) {
462 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Voice changed callback : uid(%d)", temp_client->uid);
463 temp_client->voice_cb(before_lang, before_type,
464 g_config_info->language, g_config_info->type,
465 g_config_info->auto_voice, temp_client->user_data);
469 iter = g_slist_next(iter);
472 if (NULL != before_lang) {
478 if (-1 != speech_rate) {
479 g_config_info->speech_rate = speech_rate;
481 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Speech rate change(%d)", g_config_info->speech_rate);
483 /* Call all callbacks of client*/
484 iter = g_slist_nth(g_config_client_list, 0);
486 while (NULL != iter) {
487 temp_client = iter->data;
489 if (NULL != temp_client) {
490 if (NULL != temp_client->speech_cb) {
491 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Speech rate changed callback : uid(%d)", temp_client->uid);
492 temp_client->speech_cb(g_config_info->speech_rate, temp_client->user_data);
496 iter = g_slist_next(iter);
501 g_config_info->pitch = pitch;
503 SECURE_SLOG(LOG_DEBUG, tts_tag(), "pitch change(%d)", g_config_info->pitch);
505 /* Call all callbacks of client*/
506 iter = g_slist_nth(g_config_client_list, 0);
508 while (NULL != iter) {
509 temp_client = iter->data;
511 if (NULL != temp_client) {
512 if (NULL != temp_client->pitch_cb) {
513 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Pitch changed callback : uid(%d)", temp_client->uid);
514 temp_client->pitch_cb(g_config_info->pitch, temp_client->user_data);
518 iter = g_slist_next(iter);
522 if (NULL != engine) {
526 if (NULL != setting) {
535 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
538 SLOG(LOG_DEBUG, tts_tag(), "=====");
539 SLOG(LOG_DEBUG, tts_tag(), " ");
541 return ECORE_CALLBACK_PASS_ON;
544 int __tts_config_mgr_register_config_event()
546 /* get file notification handler */
552 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail get inotify fd");
555 g_config_fd_noti = fd;
557 wd = inotify_add_watch(fd, TTS_CONFIG, IN_CLOSE_WRITE);
558 g_config_wd_noti = wd;
560 g_config_fd_handler_noti = ecore_main_fd_handler_add(fd, ECORE_FD_READ,
561 (Ecore_Fd_Cb)tts_config_mgr_inotify_event_cb, NULL, NULL, NULL);
562 if (NULL == g_config_fd_handler_noti) {
563 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get handler_noti");
567 /* Set non-blocking mode of file */
569 value = fcntl(fd, F_GETFL, 0);
572 if (0 > fcntl(fd, F_SETFL, value)) {
573 SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to set non-block mode");
579 int __tts_config_mgr_unregister_config_event()
581 /* delete inotify variable */
582 ecore_main_fd_handler_del(g_config_fd_handler_noti);
583 inotify_rm_watch(g_config_fd_noti, g_config_wd_noti);
584 close(g_config_fd_noti);
589 int __tts_config_set_auto_language()
592 value = vconf_get_str(TTS_LANGSET_KEY);
594 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get display language");
598 char temp_lang[6] = {'\0', };
599 strncpy(temp_lang, value, 5);
603 if (true == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, temp_lang, g_config_info->type)) {
604 /* tts default voice change */
605 if (NULL == g_config_info->language) {
606 SLOG(LOG_ERROR, tts_tag(), "Current config language is NULL");
610 char* before_lang = NULL;
613 if (0 != tts_parser_set_voice(temp_lang, g_config_info->type)) {
614 SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
618 before_lang = strdup(g_config_info->language);
619 before_type = g_config_info->type;
621 free(g_config_info->language);
622 g_config_info->language = NULL;
623 g_config_info->language = strdup(temp_lang);
624 if (NULL == g_config_info->language) {
625 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup temp_lang");
629 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)",
630 g_config_info->language, g_config_info->type);
633 tts_config_client_s* temp_client = NULL;
635 /* Call all callbacks of client*/
636 iter = g_slist_nth(g_config_client_list, 0);
638 while (NULL != iter) {
639 temp_client = iter->data;
641 if (NULL != temp_client) {
642 if (NULL != temp_client->voice_cb) {
643 temp_client->voice_cb(before_lang, before_type,
644 g_config_info->language, g_config_info->type,
645 g_config_info->auto_voice, temp_client->user_data);
649 iter = g_slist_next(iter);
652 if (NULL != before_lang) {
657 /* Display language is not valid */
658 char* tmp_language = NULL;
660 if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
661 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to select language");
665 if (NULL == tmp_language) {
666 SLOG(LOG_ERROR, tts_tag(), "[ERROR] language is NULL");
670 if (0 != tts_parser_set_voice(tmp_language, tmp_type)) {
671 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
675 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)",
676 tmp_language, tmp_type);
679 tts_config_client_s* temp_client = NULL;
681 /* Call all callbacks of client*/
682 iter = g_slist_nth(g_config_client_list, 0);
684 while (NULL != iter) {
685 temp_client = iter->data;
687 if (NULL != temp_client) {
688 if (NULL != temp_client->voice_cb) {
689 temp_client->voice_cb(g_config_info->language, g_config_info->type,
690 tmp_language, tmp_type, g_config_info->auto_voice, temp_client->user_data);
694 iter = g_slist_next(iter);
697 if (NULL != g_config_info->language) {
698 free(g_config_info->language);
699 g_config_info->language = NULL;
700 g_config_info->language = strdup(tmp_language);
701 if (NULL == g_config_info->language) {
702 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup tmp_language");
707 g_config_info->type = tmp_type;
716 void __tts_config_display_language_changed_cb(keynode_t *key, void *data)
718 if (true == g_config_info->auto_voice) {
719 __tts_config_set_auto_language();
725 void __tts_config_screen_reader_changed_cb(keynode_t *key, void *data)
729 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
731 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
736 tts_config_client_s* temp_client = NULL;
738 /* Call all callbacks of client*/
739 iter = g_slist_nth(g_config_client_list, 0);
741 while (NULL != iter) {
742 temp_client = iter->data;
744 if (NULL != temp_client) {
745 if (NULL != temp_client->screen_cb) {
746 temp_client->screen_cb((bool)screen_reader);
750 iter = g_slist_next(iter);
754 int __tts_config_release_client(int uid)
757 tts_config_client_s* temp_client = NULL;
759 if (0 < g_slist_length(g_config_client_list)) {
761 iter = g_slist_nth(g_config_client_list, 0);
763 while (NULL != iter) {
764 temp_client = iter->data;
766 if (NULL != temp_client) {
767 if (uid == temp_client->uid) {
768 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
775 iter = g_slist_next(iter);
779 SLOG(LOG_DEBUG, tts_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
781 return g_slist_length(g_config_client_list);
784 void __tts_config_release_engine()
787 tts_engine_info_s *engine_info = NULL;
789 if (0 < g_slist_length(g_engine_list)) {
791 /* Get a first item */
792 iter = g_slist_nth(g_engine_list, 0);
794 while (NULL != iter) {
795 engine_info = iter->data;
797 if (NULL != engine_info) {
798 g_engine_list = g_slist_remove(g_engine_list, engine_info);
800 tts_parser_free_engine_info(engine_info);
803 iter = g_slist_nth(g_engine_list, 0);
810 int __tts_config_mgr_get_engine_info()
815 struct dirent *dirp = NULL;
817 char filepath[512] = {'\0',};
819 tts_engine_info_s* info = NULL;
821 __tts_config_release_engine();
822 g_engine_list = NULL;
823 __tts_config_mgr_unregister_engine_config_updated_event();
825 /* Copy default info directory to download directory */
826 dp = opendir(TTS_DEFAULT_ENGINE_INFO);
828 SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No default directory : %s", TTS_DEFAULT_ENGINE_INFO);
831 ret = readdir_r(dp, &entry, &dirp);
833 SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
838 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
841 filesize = strlen(TTS_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 2;
842 if (filesize >= 512) {
843 SECURE_SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
848 memset(filepath, '\0', 512);
849 snprintf(filepath, 512, "%s/%s", TTS_DEFAULT_ENGINE_INFO, dirp->d_name);
851 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Filepath(%s)", filepath);
853 char dest[512] = {'\0',};
854 snprintf(dest, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
856 if (0 != access(dest, F_OK)) {
857 if (0 != tts_parser_copy_xml(filepath, dest)) {
858 SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] Fail to copy engine info");
862 } while (NULL != dirp);
867 /* Get engine info from default engine directory */
868 dp = opendir(TTS_DOWNLOAD_ENGINE_INFO);
870 SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No downloadable directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
873 ret = readdir_r(dp, &entry, &dirp);
875 SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
880 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
883 filesize = strlen(TTS_DOWNLOAD_ENGINE_INFO) + strlen(dirp->d_name) + 2;
884 if (filesize >= 512) {
885 SECURE_SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
890 memset(filepath, '\0', 512);
891 snprintf(filepath, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
893 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Filepath(%s)", filepath);
895 if (0 == tts_parser_get_engine_info(filepath, &info)) {
896 g_engine_list = g_slist_append(g_engine_list, info);
897 if (0 != __tts_config_mgr_register_engine_config_updated_event(filepath)) {
898 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register engine config updated event");
902 } while (NULL != dirp);
907 if (0 >= g_slist_length(g_engine_list)) {
908 SLOG(LOG_ERROR, tts_tag(), "[ERROR] No engine");
915 static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
917 SLOG(LOG_DEBUG, tts_tag(), "===== Engine config updated callback event");
919 tts_engine_inotify_s *ino = (tts_engine_inotify_s *)data;
920 int dir_fd = ino->dir_fd;
923 struct inotify_event event;
924 memset(&event, '\0', sizeof(struct inotify_event));
926 length = read(dir_fd, &event, sizeof(struct inotify_event));
928 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Empty Inotify event");
929 SLOG(LOG_DEBUG, tts_tag(), "=====");
930 SLOG(LOG_DEBUG, tts_tag(), " ");
931 return ECORE_CALLBACK_DONE;
934 if (IN_CLOSE_WRITE == event.mask) {
935 int ret = __tts_config_mgr_get_engine_info();
937 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get engine info when config updated");
939 __tts_config_mgr_print_engine_info();
940 bool support = tts_config_check_default_voice_is_valid(g_config_info->language, g_config_info->type);
941 if (false == support) {
942 SLOG(LOG_DEBUG, tts_tag(), "[ERROR] Default voice is valid");
943 char* temp_lang = NULL;
945 ret = __tts_config_mgr_select_lang(g_config_info->engine_id, &temp_lang, &temp_type);
947 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get voice");
950 ret = tts_config_mgr_set_voice(temp_lang, temp_type);
952 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to set voice");
954 SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Saved default voice : lang(%s), type(%d)", g_config_info->language, g_config_info->type);
956 if (NULL != temp_lang) {
963 tts_config_client_s* temp_client = NULL;
964 /* Call all callbacks of client*/
965 iter = g_slist_nth(g_config_client_list, 0);
967 while (NULL != iter) {
968 temp_client = iter->data;
970 if (NULL != temp_client) {
971 if (NULL != temp_client->engine_cb) {
972 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine changed callback : uid(%d)", temp_client->uid);
973 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting,
974 g_config_info->language, g_config_info->type,
975 g_config_info->auto_voice, g_config_info->credential, temp_client->user_data);
979 iter = g_slist_next(iter);
982 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
985 SLOG(LOG_DEBUG, tts_tag(), "=====");
986 SLOG(LOG_DEBUG, tts_tag(), " ");
988 return ECORE_CALLBACK_PASS_ON;
991 static int __tts_config_mgr_register_engine_config_updated_event(const char* path)
994 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Path is NULL");
998 /* For engine directory monitoring */
999 tts_engine_inotify_s *ino = (tts_engine_inotify_s *)calloc(1, sizeof(tts_engine_inotify_s));
1001 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
1005 ino->dir_fd = inotify_init();
1006 if (ino->dir_fd < 0) {
1007 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to init inotify");
1014 ino->dir_wd = inotify_add_watch(ino->dir_fd, path, IN_CLOSE_WRITE);
1015 SLOG(LOG_DEBUG, tts_tag(), "Add inotify watch(%s)", path);
1016 if (ino->dir_wd < 0) {
1017 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to add watch");
1023 ino->dir_fd_handler = ecore_main_fd_handler_add(ino->dir_fd, ECORE_FD_READ, (Ecore_Fd_Cb)__tts_config_mgr_engine_config_inotify_event_callback, (void *)ino, NULL, NULL);
1024 if (NULL == ino->dir_fd_handler) {
1025 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to add fd handler");
1031 /* Set non-blocking mode of file */
1033 value = fcntl(ino->dir_fd, F_GETFL, 0);
1034 value |= O_NONBLOCK;
1036 if (0 > fcntl(ino->dir_fd, F_SETFL, value)) {
1037 SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to set non-block mode");
1040 g_ino_list = g_list_append(g_ino_list, ino);
1045 static int __tts_config_mgr_unregister_engine_config_updated_event()
1047 /* delete all inotify variable */
1048 if (0 < g_list_length(g_ino_list)) {
1050 iter = g_list_first(g_ino_list);
1052 while (NULL != iter) {
1053 tts_engine_inotify_s *tmp = iter->data;
1056 ecore_main_fd_handler_del(tmp->dir_fd_handler);
1057 inotify_rm_watch(tmp->dir_fd, tmp->dir_wd);
1064 g_ino_list = g_list_remove_link(g_ino_list, iter);
1066 iter = g_list_first(g_ino_list);
1073 int tts_config_mgr_initialize(int uid)
1075 GSList *iter = NULL;
1077 tts_config_client_s* temp_client = NULL;
1080 if (0 < g_slist_length(g_config_client_list)) {
1082 iter = g_slist_nth(g_config_client_list, 0);
1084 while (NULL != iter) {
1085 get_uid = iter->data;
1087 if (uid == *get_uid) {
1088 SECURE_SLOG(LOG_WARN, tts_tag(), "[CONFIG] uid(%d) has already registered", uid);
1092 iter = g_slist_next(iter);
1095 temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
1096 if (NULL == temp_client) {
1097 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
1098 return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
1100 temp_client->uid = uid;
1102 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
1104 SECURE_SLOG(LOG_WARN, tts_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
1107 temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
1108 if (NULL == temp_client) {
1109 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
1110 return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
1112 temp_client->uid = uid;
1114 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
1117 if (0 != access(TTS_CONFIG_BASE, F_OK)) {
1118 if (0 != mkdir(TTS_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1119 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_CONFIG_BASE);
1120 __tts_config_release_client(uid);
1121 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1123 SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_CONFIG_BASE);
1127 if (0 != access(TTS_HOME, F_OK)) {
1128 if (0 != mkdir(TTS_HOME, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1129 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_HOME);
1130 __tts_config_release_client(uid);
1131 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1133 SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_HOME);
1137 if (0 != access(TTS_DOWNLOAD_BASE, F_OK)) {
1138 if (0 != mkdir(TTS_DOWNLOAD_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1139 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_BASE);
1140 __tts_config_release_client(uid);
1141 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1143 SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_DOWNLOAD_BASE);
1147 if (0 != access(TTS_DOWNLOAD_ENGINE_INFO, F_OK)) {
1148 if (0 != mkdir(TTS_DOWNLOAD_ENGINE_INFO, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1149 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
1150 __tts_config_release_client(uid);
1151 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1153 SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
1157 if (0 != __tts_config_mgr_get_engine_info()) {
1158 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get engine info");
1159 __tts_config_release_client(uid);
1160 __tts_config_release_engine();
1161 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1164 __tts_config_mgr_print_engine_info();
1166 if (0 != tts_parser_load_config(&g_config_info)) {
1167 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse configure information");
1168 __tts_config_release_client(uid);
1169 __tts_config_release_engine();
1170 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1173 /* Check whether engine id is valid */
1174 if (0 != __tts_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
1175 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get default engine");
1176 __tts_config_release_client(uid);
1177 __tts_config_release_engine();
1178 tts_parser_unload_config(g_config_info);
1179 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1182 if (true == g_config_info->auto_voice) {
1183 /* Check language with display language */
1184 __tts_config_set_auto_language();
1186 if (false == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language, g_config_info->type)) {
1187 /* Default language is not valid */
1188 char* tmp_language = NULL;
1190 if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
1191 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to select language");
1192 __tts_config_release_client(uid);
1193 __tts_config_release_engine();
1194 tts_parser_unload_config(g_config_info);
1195 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1198 if (NULL != tmp_language) {
1199 if (NULL != g_config_info->language) {
1200 free(g_config_info->language);
1201 g_config_info->language = NULL;
1202 g_config_info->language = strdup(tmp_language);
1203 if (NULL == g_config_info->language) {
1204 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup tmp_language");
1205 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1209 g_config_info->type = tmp_type;
1212 tmp_language = NULL;
1214 if (0 != tts_parser_set_voice(g_config_info->language, g_config_info->type)) {
1215 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
1216 __tts_config_release_client(uid);
1217 __tts_config_release_engine();
1218 tts_parser_unload_config(g_config_info);
1219 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1225 /* print daemon config */
1226 SLOG(LOG_DEBUG, tts_tag(), "== TTS config ==");
1227 SECURE_SLOG(LOG_DEBUG, tts_tag(), " engine : %s", g_config_info->engine_id);
1228 SECURE_SLOG(LOG_DEBUG, tts_tag(), " setting : %s", g_config_info->setting);
1229 SECURE_SLOG(LOG_DEBUG, tts_tag(), " auto voice : %s", g_config_info->auto_voice ? "on" : "off");
1230 SECURE_SLOG(LOG_DEBUG, tts_tag(), " language : %s", g_config_info->language);
1231 SECURE_SLOG(LOG_DEBUG, tts_tag(), " voice type : %d", g_config_info->type);
1232 SECURE_SLOG(LOG_DEBUG, tts_tag(), " speech rate : %d", g_config_info->speech_rate);
1233 SECURE_SLOG(LOG_DEBUG, tts_tag(), " pitch : %d", g_config_info->pitch);
1234 SLOG(LOG_DEBUG, tts_tag(), "=================");
1236 if (0 != __tts_config_mgr_register_config_event()) {
1237 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register config event");
1238 __tts_config_release_client(uid);
1239 __tts_config_release_engine();
1240 tts_parser_unload_config(g_config_info);
1241 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1244 /* Register to detect display language change */
1245 vconf_notify_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb, NULL);
1246 vconf_notify_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb, NULL);
1248 /* For engine directory monitoring */
1249 //if (0 != __tts_config_mgr_register_engine_config_updated_event()) {
1250 // SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register engine config updated event");
1251 // __tts_config_release_client(uid);
1252 // __tts_config_release_engine();
1253 // tts_parser_unload_config(g_config_info);
1254 // __tts_config_mgr_unregister_config_event();
1255 // return TTS_CONFIG_ERROR_OPERATION_FAILED;
1261 int tts_config_mgr_finalize(int uid)
1263 if (0 < __tts_config_release_client(uid)) {
1267 tts_config_mgr_unset_callback(uid);
1269 __tts_config_release_engine();
1271 tts_parser_unload_config(g_config_info);
1273 __tts_config_mgr_unregister_engine_config_updated_event();
1275 __tts_config_mgr_unregister_config_event();
1277 vconf_ignore_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb);
1278 vconf_ignore_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb);
1283 int tts_config_mgr_set_callback(int uid,
1284 tts_config_engine_changed_cb engine_cb,
1285 tts_config_voice_changed_cb voice_cb,
1286 tts_config_speech_rate_changed_cb speech_cb,
1287 tts_config_pitch_changed_cb pitch_cb,
1290 GSList *iter = NULL;
1291 tts_config_client_s* temp_client = NULL;
1293 /* Call all callbacks of client*/
1294 iter = g_slist_nth(g_config_client_list, 0);
1296 while (NULL != iter) {
1297 temp_client = iter->data;
1299 if (NULL != temp_client) {
1300 if (uid == temp_client->uid) {
1301 temp_client->engine_cb = engine_cb;
1302 temp_client->voice_cb = voice_cb;
1303 temp_client->speech_cb = speech_cb;
1304 temp_client->pitch_cb = pitch_cb;
1305 temp_client->user_data = user_data;
1309 iter = g_slist_next(iter);
1314 int tts_config_mgr_unset_callback(int uid)
1316 GSList *iter = NULL;
1317 tts_config_client_s* temp_client = NULL;
1319 /* Call all callbacks of client*/
1320 iter = g_slist_nth(g_config_client_list, 0);
1322 while (NULL != iter) {
1323 temp_client = iter->data;
1325 if (NULL != temp_client) {
1326 if (uid == temp_client->uid) {
1327 temp_client->engine_cb = NULL;
1328 temp_client->voice_cb = NULL;
1329 temp_client->speech_cb = NULL;
1330 temp_client->pitch_cb = NULL;
1331 temp_client->user_data = NULL;
1335 iter = g_slist_next(iter);
1341 int tts_config_set_screen_reader_callback(int uid, tts_config_screen_reader_changed_cb callback)
1343 if (NULL == callback) {
1344 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
1345 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1348 GSList *iter = NULL;
1349 tts_config_client_s* temp_client = NULL;
1351 /* Call all callbacks of client*/
1352 iter = g_slist_nth(g_config_client_list, 0);
1354 while (NULL != iter) {
1355 temp_client = iter->data;
1357 if (NULL != temp_client) {
1358 if (uid == temp_client->uid) {
1359 temp_client->screen_cb = callback;
1363 iter = g_slist_next(iter);
1368 int tts_config_unset_screen_reader_callback(int uid)
1370 GSList *iter = NULL;
1371 tts_config_client_s* temp_client = NULL;
1373 /* Call all callbacks of client*/
1374 iter = g_slist_nth(g_config_client_list, 0);
1376 while (NULL != iter) {
1377 temp_client = iter->data;
1379 if (NULL != temp_client) {
1380 if (uid == temp_client->uid) {
1381 temp_client->screen_cb = NULL;
1385 iter = g_slist_next(iter);
1391 int tts_config_mgr_get_engine_list(tts_config_supported_engine_cb callback, void* user_data)
1393 if (0 >= g_slist_length(g_config_client_list)) {
1394 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1395 return TTS_CONFIG_ERROR_INVALID_STATE;
1398 GSList *iter = NULL;
1399 tts_engine_info_s *engine_info = NULL;
1401 if (0 >= g_slist_length(g_engine_list)) {
1402 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
1403 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1406 /* Get a first item */
1407 iter = g_slist_nth(g_engine_list, 0);
1409 while (NULL != iter) {
1410 engine_info = iter->data;
1412 if (NULL != engine_info) {
1413 if (false == callback(engine_info->uuid, engine_info->name, engine_info->setting, user_data)) {
1418 iter = g_slist_next(iter);
1424 int tts_config_mgr_get_engine(char** engine)
1426 if (0 >= g_slist_length(g_config_client_list)) {
1427 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1428 return TTS_CONFIG_ERROR_INVALID_STATE;
1431 if (NULL == engine) {
1432 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Input parameter is NULL");
1433 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1436 if (NULL != g_config_info->engine_id) {
1437 /* Check engine id is valid */
1438 GSList *iter = NULL;
1439 tts_engine_info_s *engine_info = NULL;
1441 if (0 >= g_slist_length(g_engine_list)) {
1442 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1443 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1446 /* Get a first item */
1447 iter = g_slist_nth(g_engine_list, 0);
1449 while (NULL != iter) {
1450 engine_info = iter->data;
1452 if (NULL != engine_info) {
1453 if (0 == strcmp(engine_info->uuid, g_config_info->engine_id)) {
1454 *engine = strdup(g_config_info->engine_id);
1458 iter = g_slist_next(iter);
1461 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Current engine id is not valid");
1463 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine id is NULL");
1466 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1469 int __tts_set_buxtonkey(const char* engine)
1472 struct buxton_client * bux_cli;
1473 struct buxton_layer * bux_layer;
1474 struct buxton_value * bux_val;
1476 int ret = buxton_open(&bux_cli, NULL, NULL);
1478 SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_open failed!! (%d)", ret);
1479 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1481 bux_layer = buxton_create_layer("system");
1482 if (NULL == bux_layer) {
1483 SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_create_layer FAIL");
1484 buxton_close(bux_cli);
1485 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1487 bux_val = buxton_value_create_string(engine);
1488 if (NULL == bux_val) {
1489 SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_value_create_string FAIL");
1490 buxton_free_layer(bux_layer);
1491 buxton_close(bux_cli);
1492 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1494 SLOG(LOG_DEBUG, tts_tag(), "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
1497 ret = buxton_set_value_sync(bux_cli, bux_layer, TTS_ENGINE_DB_DEFAULT, bux_val);
1499 SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_set_value_sync failed!! (%d)", ret);
1500 buxton_value_free(bux_val);
1501 buxton_free_layer(bux_layer);
1502 buxton_close(bux_cli);
1508 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1510 SLOG(LOG_DEBUG, tts_tag(), "[DBUS-BUXTON2] buxton_set_value_sync: %d, %s", ret, TTS_ENGINE_DB_DEFAULT);
1513 buxton_value_free(bux_val);
1514 buxton_free_layer(bux_layer);
1515 buxton_close(bux_cli);
1521 return TTS_CONFIG_ERROR_NONE;
1524 int tts_config_mgr_set_engine(const char* engine)
1526 if (0 >= g_slist_length(g_config_client_list)) {
1527 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1528 return TTS_CONFIG_ERROR_INVALID_STATE;
1532 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1534 /* Check current engine id with new engine id */
1535 if (NULL != g_config_info->engine_id) {
1536 if (0 == strcmp(g_config_info->engine_id, engine))
1540 if (0 >= g_slist_length(g_engine_list)) {
1541 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1542 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1545 SLOG(LOG_DEBUG, tts_tag(), "New engine id : %s", engine);
1547 int ret = __tts_set_buxtonkey(engine);
1549 SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] set_buxtonkey Fail!!");
1553 GSList *iter = NULL;
1554 tts_engine_info_s *engine_info = NULL;
1555 bool is_valid_engine = false;
1557 /* Get a first item */
1558 iter = g_slist_nth(g_engine_list, 0);
1560 while (NULL != iter) {
1561 engine_info = iter->data;
1563 if (NULL == engine_info) {
1564 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine info is NULL");
1565 iter = g_slist_next(iter);
1569 /* Check engine id is valid */
1570 if (0 != strcmp(engine, engine_info->uuid)) {
1571 iter = g_slist_next(iter);
1575 if (NULL != g_config_info->engine_id) {
1576 free(g_config_info->engine_id);
1577 g_config_info->engine_id = NULL;
1580 g_config_info->engine_id = strdup(engine);
1582 if (NULL != engine_info->setting) {
1583 if (NULL != g_config_info->setting) {
1584 free(g_config_info->setting);
1585 g_config_info->setting = NULL;
1587 g_config_info->setting = strdup(engine_info->setting);
1590 /* Engine is valid*/
1591 GSList *iter_voice = NULL;
1592 tts_config_voice_s* voice = NULL;
1593 bool is_valid_voice = false;
1595 /* Get a first item */
1596 iter_voice = g_slist_nth(engine_info->voices, 0);
1598 while (NULL != iter_voice) {
1599 /*Get handle data from list*/
1600 voice = iter_voice->data;
1602 if (NULL != voice) {
1603 if (NULL == voice->language)
1605 SLOG(LOG_DEBUG, tts_tag(), " lang(%s) type(%d)", voice->language, voice->type);
1607 if (0 == strcmp(voice->language, g_config_info->language)) {
1608 if (voice->type == g_config_info->type) {
1609 /* language is valid */
1610 is_valid_voice = true;
1611 g_config_info->type = voice->type;
1618 iter_voice = g_slist_next(iter_voice);
1621 if (false == is_valid_voice) {
1622 if (NULL != g_config_info->language) {
1623 free(g_config_info->language);
1624 g_config_info->language = NULL;
1626 iter_voice = g_slist_nth(engine_info->voices, 0);
1627 if (NULL != iter_voice) {
1628 voice = iter_voice->data;
1629 if (NULL != voice) {
1630 if (NULL != voice->language)
1631 g_config_info->language = strdup(voice->language);
1632 g_config_info->type = voice->type;
1638 is_valid_engine = true;
1642 if (true == is_valid_engine) {
1643 SLOG(LOG_DEBUG, tts_tag(), "[Config] Engine changed");
1644 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Engine : %s", g_config_info->engine_id);
1645 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Setting : %s", g_config_info->setting);
1646 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Language : %s", g_config_info->language);
1647 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Type : %d", g_config_info->type);
1649 if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting,
1650 g_config_info->language, g_config_info->type)) {
1651 SLOG(LOG_ERROR, tts_tag(), " Fail to save config");
1652 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1655 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine id is not valid");
1656 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1662 int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_voice_cb callback, void* user_data)
1664 if (0 >= g_slist_length(g_config_client_list)) {
1665 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1666 return TTS_CONFIG_ERROR_INVALID_STATE;
1669 if (0 >= g_slist_length(g_engine_list)) {
1670 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1671 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1674 GSList *iter = NULL;
1675 tts_engine_info_s *engine_info = NULL;
1677 /* Get a first item */
1678 iter = g_slist_nth(g_engine_list, 0);
1680 while (NULL != iter) {
1681 engine_info = iter->data;
1683 if (NULL == engine_info) {
1684 SLOG(LOG_ERROR, tts_tag(), "[ERROR] engine info is NULL");
1685 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1688 if (0 != strcmp(engine_id, engine_info->uuid)) {
1689 iter = g_slist_next(iter);
1693 GSList *iter_voice = NULL;
1694 tts_config_voice_s* voice = NULL;
1696 /* Get a first item */
1697 iter_voice = g_slist_nth(engine_info->voices, 0);
1699 while (NULL != iter_voice) {
1700 /*Get handle data from list*/
1701 voice = iter_voice->data;
1703 SLOG(LOG_DEBUG, tts_tag(), " lang(%s) type(%d)", voice->language, voice->type);
1704 if (NULL != voice->language) {
1705 if (false == callback(engine_info->uuid, voice->language, voice->type, user_data))
1710 iter_voice = g_slist_next(iter_voice);
1718 int tts_config_mgr_get_voice(char** language, int* type)
1720 if (0 >= g_slist_length(g_config_client_list)) {
1721 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1722 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1725 if (0 >= g_slist_length(g_engine_list)) {
1726 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1727 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1730 if (NULL == language || NULL == type)
1731 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1733 if (NULL != g_config_info->language) {
1734 *language = strdup(g_config_info->language);
1735 *type = g_config_info->type;
1737 SLOG(LOG_ERROR, tts_tag(), "language is NULL");
1738 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1744 int tts_config_mgr_set_voice(const char* language, int type)
1746 if (0 >= g_slist_length(g_config_client_list)) {
1747 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1748 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1751 if (NULL == language) {
1752 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Input parameter is NULL");
1753 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1756 if (0 >= g_slist_length(g_engine_list)) {
1757 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1758 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1761 /* Check language is valid */
1762 if (NULL != g_config_info->language) {
1763 if (0 != tts_parser_set_voice(language, type)) {
1764 SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
1765 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1767 free(g_config_info->language);
1768 g_config_info->language = NULL;
1769 g_config_info->language = strdup(language);
1770 if (NULL == g_config_info->language) {
1771 SLOG(LOG_ERROR, tts_tag(), "Fail to strdup language");
1772 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1774 g_config_info->type = type;
1777 SLOG(LOG_ERROR, tts_tag(), "language is NULL");
1778 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1784 int tts_config_mgr_get_auto_voice(bool* value)
1786 if (0 >= g_slist_length(g_config_client_list)) {
1787 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1788 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1792 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1794 *value = g_config_info->auto_voice;
1799 int tts_config_mgr_set_auto_voice(bool value)
1801 if (0 >= g_slist_length(g_config_client_list)) {
1802 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1803 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1806 if (g_config_info->auto_voice != value) {
1807 /* Check language is valid */
1808 if (0 != tts_parser_set_auto_voice(value)) {
1809 SLOG(LOG_ERROR, tts_tag(), "Fail to save auto voice option");
1810 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1812 g_config_info->auto_voice = value;
1814 if (true == g_config_info->auto_voice) {
1815 __tts_config_set_auto_language();
1822 int tts_config_mgr_get_speech_rate(int* value)
1824 if (0 >= g_slist_length(g_config_client_list)) {
1825 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1826 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1829 if (NULL == value) {
1830 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1833 *value = g_config_info->speech_rate;
1838 int tts_config_mgr_set_speech_rate(int value)
1840 if (0 >= g_slist_length(g_config_client_list)) {
1841 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1842 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1845 if (TTS_CONFIG_SPEED_MIN <= value && value <= TTS_CONFIG_SPEED_MAX) {
1846 SLOG(LOG_DEBUG, tts_tag(), "[Config] Set speech rate : %d", value);
1847 if (0 != tts_parser_set_speech_rate(value)) {
1848 SLOG(LOG_ERROR, tts_tag(), "Fail to save speech rate");
1849 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1852 g_config_info->speech_rate = value;
1854 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Speech rate is invalid : %d", value);
1860 int tts_config_mgr_get_pitch(int* value)
1862 if (0 >= g_slist_length(g_config_client_list)) {
1863 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1864 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1867 if (NULL == value) {
1868 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1871 GSList *iter = NULL;
1872 tts_engine_info_s *engine_info = NULL;
1874 if (0 >= g_slist_length(g_engine_list)) {
1875 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1876 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1879 /* Get a first item */
1880 iter = g_slist_nth(g_engine_list, 0);
1882 while (NULL != iter) {
1883 engine_info = iter->data;
1885 if (NULL == engine_info) {
1886 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
1887 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1890 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1891 iter = g_slist_next(iter);
1895 if (false == engine_info->pitch_support) {
1896 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1902 *value = g_config_info->pitch;
1907 int tts_config_mgr_set_pitch(int value)
1909 if (0 >= g_slist_length(g_config_client_list)) {
1910 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1914 GSList *iter = NULL;
1915 tts_engine_info_s *engine_info = NULL;
1917 if (0 >= g_slist_length(g_engine_list)) {
1918 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1919 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1922 /* Get a first item */
1923 iter = g_slist_nth(g_engine_list, 0);
1925 while (NULL != iter) {
1926 engine_info = iter->data;
1928 if (NULL == engine_info) {
1929 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
1930 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1933 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1934 iter = g_slist_next(iter);
1938 if (false == engine_info->pitch_support) {
1939 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1945 if (0 != tts_parser_set_pitch(value)) {
1946 SLOG(LOG_ERROR, tts_tag(), "Fail to save speech rate");
1947 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1950 g_config_info->pitch = value;
1955 bool tts_config_check_default_engine_is_valid(const char* engine)
1957 if (0 >= g_slist_length(g_config_client_list)) {
1958 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1965 if (0 >= g_slist_length(g_engine_list))
1968 GSList *iter = NULL;
1969 tts_engine_info_s *engine_info = NULL;
1971 /* Get a first item */
1972 iter = g_slist_nth(g_engine_list, 0);
1974 while (NULL != iter) {
1975 engine_info = iter->data;
1977 if (NULL != engine_info) {
1978 if (0 == strcmp(engine, engine_info->uuid)) {
1982 iter = g_slist_next(iter);
1988 bool tts_config_check_default_voice_is_valid(const char* language, int type)
1990 if (0 >= g_slist_length(g_config_client_list)) {
1991 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1995 if (NULL == language)
1998 if (NULL == g_config_info->engine_id) {
1999 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Default engine id is NULL");
2003 if (0 >= g_slist_length(g_engine_list))
2006 GSList *iter = NULL;
2007 tts_engine_info_s *engine_info = NULL;
2009 /* Get a first item */
2010 iter = g_slist_nth(g_engine_list, 0);
2012 while (NULL != iter) {
2013 engine_info = iter->data;
2015 if (NULL == engine_info) {
2016 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine info is NULL");
2017 iter = g_slist_next(iter);
2021 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
2022 iter = g_slist_next(iter);
2026 GSList *iter_voice = NULL;
2027 tts_config_voice_s* voice = NULL;
2029 /* Get a first item */
2030 iter_voice = g_slist_nth(engine_info->voices, 0);
2032 while (NULL != iter_voice) {
2033 voice = iter_voice->data;
2035 if (0 == strcmp(language, voice->language) && voice->type == type)
2039 iter_voice = g_slist_next(iter_voice);
2049 int __tts_config_mgr_print_engine_info()
2051 GSList *iter = NULL;
2052 tts_engine_info_s *engine_info = NULL;
2054 if (0 >= g_slist_length(g_engine_list)) {
2055 SLOG(LOG_DEBUG, tts_tag(), "-------------- engine list -----------------");
2056 SLOG(LOG_DEBUG, tts_tag(), " No Engine in engine directory");
2057 SLOG(LOG_DEBUG, tts_tag(), "--------------------------------------------");
2061 /* Get a first item */
2062 iter = g_slist_nth(g_engine_list, 0);
2064 SLOG(LOG_DEBUG, tts_tag(), "--------------- engine list -----------------");
2067 while (NULL != iter) {
2068 engine_info = iter->data;
2070 SLOG(LOG_DEBUG, tts_tag(), "[%dth]", i);
2071 SLOG(LOG_DEBUG, tts_tag(), " name : %s", engine_info->name);
2072 SLOG(LOG_DEBUG, tts_tag(), " id : %s", engine_info->uuid);
2073 SLOG(LOG_DEBUG, tts_tag(), " setting : %s", engine_info->setting);
2075 SLOG(LOG_DEBUG, tts_tag(), " Voices");
2076 GSList *iter_voice = NULL;
2077 tts_config_voice_s* voice = NULL;
2079 if (g_slist_length(engine_info->voices) > 0) {
2080 /* Get a first item */
2081 iter_voice = g_slist_nth(engine_info->voices, 0);
2084 while (NULL != iter_voice) {
2085 /*Get handle data from list*/
2086 voice = iter_voice->data;
2088 SLOG(LOG_DEBUG, tts_tag(), " [%dth] lang(%s) type(%d)", j, voice->language, voice->type);
2091 iter_voice = g_slist_next(iter_voice);
2095 SLOG(LOG_ERROR, tts_tag(), " Voice is NONE");
2097 iter = g_slist_next(iter);
2100 SLOG(LOG_DEBUG, tts_tag(), "--------------------------------------------");