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.
20 #include <sys/inotify.h>
24 #include "stt_config_mgr.h"
26 #include "stt_config_parser.h"
31 stt_config_engine_changed_cb engine_cb;
32 stt_config_lang_changed_cb lang_cb;
33 stt_config_bool_changed_cb bool_cb;
35 } stt_config_client_s;
38 extern const char* stt_tag();
40 static GSList* g_engine_list = NULL;
42 static GSList* g_config_client_list = NULL;
44 static stt_config_s* g_config_info;
46 static Ecore_Fd_Handler* g_fd_handler_noti = NULL;
50 int __stt_config_mgr_print_engine_info();
52 bool __stt_config_mgr_check_lang_is_valid(const char* engine_id, const char* language)
54 if (NULL == engine_id || NULL == language) {
55 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input parameter is NULL");
60 stt_engine_info_s *engine_info = NULL;
62 if (0 >= g_slist_length(g_engine_list)) {
63 SLOG(LOG_ERROR, stt_tag(), "[ERROR] There is no engine!!");
67 /* Get a first item */
68 iter = g_slist_nth(g_engine_list, 0);
70 while (NULL != iter) {
71 engine_info = iter->data;
73 if (NULL == engine_info) {
74 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
78 if (0 != strcmp(engine_id, engine_info->uuid)) {
79 iter = g_slist_next(iter);
83 GSList *iter_lang = NULL;
85 if (g_slist_length(engine_info->languages) > 0) {
86 /* Get a first item */
87 iter_lang = g_slist_nth(engine_info->languages, 0);
90 while (NULL != iter_lang) {
91 /*Get handle data from list*/
92 engine_lang = iter_lang->data;
94 SLOG(LOG_DEBUG, stt_tag(), " [%dth] %s", i, engine_lang);
96 if (0 == strcmp(language, engine_lang)) {
101 iter_lang = g_slist_next(iter_lang);
111 int __stt_config_mgr_select_lang(const char* engine_id, char** language)
113 if (NULL == engine_id || NULL == language) {
114 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input parameter is NULL");
119 stt_engine_info_s *engine_info = NULL;
121 if (0 >= g_slist_length(g_engine_list)) {
122 SLOG(LOG_ERROR, stt_tag(), "[ERROR] There is no engine!!");
126 /* Get a first item */
127 iter = g_slist_nth(g_engine_list, 0);
129 while (NULL != iter) {
130 engine_info = iter->data;
132 if (NULL == engine_info) {
133 SLOG(LOG_ERROR, stt_tag(), "engine info is NULL");
137 if (0 != strcmp(engine_id, engine_info->uuid)) {
138 iter = g_slist_next(iter);
142 GSList *iter_lang = NULL;
143 char* engine_lang = NULL;
144 if (g_slist_length(engine_info->languages) > 0) {
145 /* Get a first item */
146 iter_lang = g_slist_nth(engine_info->languages, 0);
148 while (NULL != iter_lang) {
149 engine_lang = iter_lang->data;
150 if (NULL != engine_lang) {
151 /* Default language is STT_BASE_LANGUAGE */
152 if (0 == strcmp(STT_BASE_LANGUAGE, engine_lang)) {
153 *language = strdup(engine_lang);
154 SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", (NULL == *language) ? "NULL" : *language);
159 iter_lang = g_slist_next(iter_lang);
162 /* Not support STT_BASE_LANGUAGE */
163 if (NULL != engine_lang) {
164 *language = strdup(engine_lang);
165 SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", (NULL == *language) ? "NULL" : *language);
175 Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
177 SLOG(LOG_DEBUG, stt_tag(), "===== Config changed callback event");
180 struct inotify_event event;
181 memset(&event, '\0', sizeof(struct inotify_event));
183 length = read(g_fd_noti, &event, sizeof(struct inotify_event));
185 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Empty Inotify event");
186 SLOG(LOG_DEBUG, stt_tag(), "=====");
187 SLOG(LOG_DEBUG, stt_tag(), " ");
188 return ECORE_CALLBACK_PASS_ON;
191 if (IN_MODIFY == event.mask) {
193 char* setting = NULL;
200 stt_config_client_s* temp_client = NULL;
202 if (0 != stt_parser_find_config_changed(&engine, &setting, &auto_lang, &lang, &silence, &credential))
203 return ECORE_CALLBACK_PASS_ON;
206 if (NULL != engine || NULL != setting) {
208 if (NULL != engine) {
209 if (NULL != g_config_info->engine_id) free(g_config_info->engine_id);
210 g_config_info->engine_id = strdup(engine);
213 if (NULL != setting) {
214 if (NULL != g_config_info->setting) free(g_config_info->setting);
215 g_config_info->setting = strdup(setting);
219 if (NULL != g_config_info->language) free(g_config_info->language);
220 g_config_info->language = strdup(lang);
223 if (-1 != silence) g_config_info->silence_detection = silence;
225 if (-1 != credential) g_config_info->credential = credential;
227 /* Call all callbacks of client*/
228 iter = g_slist_nth(g_config_client_list, 0);
230 while (NULL != iter) {
231 temp_client = iter->data;
233 if (NULL != temp_client) {
234 if (NULL != temp_client->engine_cb) {
235 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
236 g_config_info->silence_detection, g_config_info->credential, temp_client->user_data);
240 iter = g_slist_next(iter);
244 if (-1 != auto_lang) {
245 g_config_info->auto_lang = auto_lang;
248 /* Only language changed */
249 if (NULL == engine && NULL != lang) {
250 char* before_lang = NULL;
251 before_lang = strdup(g_config_info->language);
254 if (NULL != g_config_info->language) free(g_config_info->language);
255 g_config_info->language = strdup(lang);
258 /* Call all callbacks of client*/
259 iter = g_slist_nth(g_config_client_list, 0);
261 while (NULL != iter) {
262 temp_client = iter->data;
264 if (NULL != temp_client) {
265 if (NULL != temp_client->lang_cb) {
266 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
270 iter = g_slist_next(iter);
273 if (NULL != before_lang) {
279 /* silence detection changed */
280 g_config_info->silence_detection = silence;
282 /* Call all callbacks of client*/
283 iter = g_slist_nth(g_config_client_list, 0);
285 while (NULL != iter) {
286 temp_client = iter->data;
288 if (NULL != temp_client) {
289 if (NULL != temp_client->bool_cb) {
290 temp_client->bool_cb(STT_CONFIG_TYPE_OPTION_SILENCE_DETECTION, silence, temp_client->user_data);
294 iter = g_slist_next(iter);
298 if (NULL != engine) free(engine);
299 if (NULL != setting) free(setting);
300 if (NULL != lang) free(lang);
302 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Undefined event");
305 SLOG(LOG_DEBUG, stt_tag(), "=====");
306 SLOG(LOG_DEBUG, stt_tag(), " ");
308 return ECORE_CALLBACK_PASS_ON;
311 int __stt_config_mgr_register_config_event()
313 /* get file notification handler */
319 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail get inotify fd");
324 wd = inotify_add_watch(fd, STT_CONFIG, IN_MODIFY);
327 g_fd_handler_noti = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)stt_config_mgr_inotify_event_cb, NULL, NULL, NULL);
328 if (NULL == g_fd_handler_noti) {
329 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get handler_noti");
336 int __stt_config_mgr_unregister_config_event()
338 /* delete inotify variable */
339 ecore_main_fd_handler_del(g_fd_handler_noti);
340 inotify_rm_watch(g_fd_noti, g_wd_noti);
346 int __stt_config_set_auto_language()
349 char candidate_lang[6] = {'\0', };
351 value = vconf_get_str(VCONFKEY_LANGSET);
353 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Fail to get display language");
357 strncpy(candidate_lang, value, 5);
360 /* Check current config info */
361 if (NULL == g_config_info) {
362 SLOG(LOG_ERROR, stt_tag(), "Current config info is NULL");
363 return STT_CONFIG_ERROR_OPERATION_FAILED;
366 /* Check current language */
367 if (NULL == g_config_info->language) {
368 SLOG(LOG_ERROR, stt_tag(), "Current config language is NULL");
369 return STT_CONFIG_ERROR_OPERATION_FAILED;
372 if (0 == strncmp(g_config_info->language, candidate_lang, 5)) {
373 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. STT language(%s) is same with display lang", g_config_info->language);
376 SLOG(LOG_DEBUG, stt_tag(), "[Config] Display language : %s", candidate_lang);
379 if (true == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, candidate_lang)) {
380 char* before_lang = NULL;
381 if (0 != stt_parser_set_language(candidate_lang)) {
382 SLOG(LOG_ERROR, stt_tag(), "Fail to save default language");
386 before_lang = strdup(g_config_info->language);
388 free(g_config_info->language);
389 g_config_info->language = strdup(candidate_lang);
391 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. Set default language(%s)", g_config_info->language);
393 /* Call all callbacks of client*/
395 stt_config_client_s* temp_client = NULL;
397 iter = g_slist_nth(g_config_client_list, 0);
399 while (NULL != iter) {
400 temp_client = iter->data;
402 if (NULL != temp_client) {
403 if (NULL != temp_client->lang_cb) {
404 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
408 iter = g_slist_next(iter);
411 if (NULL != before_lang) {
415 /* Candidate language is not valid */
416 char* tmp_language = NULL;
417 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
418 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
422 if (NULL == tmp_language) {
423 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Selected language is NULL");
427 if (0 != stt_parser_set_language(tmp_language)) {
429 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save config");
433 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto but display lang is not supported. Default language change(%s)", tmp_language);
435 /* Call all callbacks of client*/
437 stt_config_client_s* temp_client = NULL;
439 iter = g_slist_nth(g_config_client_list, 0);
441 while (NULL != iter) {
442 temp_client = iter->data;
444 if (NULL != temp_client) {
445 if (NULL != temp_client->lang_cb) {
446 temp_client->lang_cb(g_config_info->language, tmp_language, temp_client->user_data);
450 iter = g_slist_next(iter);
453 free(g_config_info->language);
454 g_config_info->language = strdup(tmp_language);
463 void __stt_config_language_changed_cb(keynode_t *key, void *data)
465 if (true == g_config_info->auto_lang) {
466 /* Get voice input vconf key */
467 __stt_config_set_auto_language();
473 void __stt_config_release_client(int uid)
476 stt_config_client_s* temp_client = NULL;
478 if (0 < g_slist_length(g_config_client_list)) {
480 iter = g_slist_nth(g_config_client_list, 0);
482 while (NULL != iter) {
483 temp_client = iter->data;
485 if (NULL != temp_client) {
486 if (uid == temp_client->uid) {
487 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
494 iter = g_slist_next(iter);
498 if (0 < g_slist_length(g_config_client_list)) {
499 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
504 void __stt_config_release_engine()
507 stt_engine_info_s *engine_info = NULL;
509 if (0 < g_slist_length(g_engine_list)) {
511 /* Get a first item */
512 iter = g_slist_nth(g_engine_list, 0);
514 while (NULL != iter) {
515 engine_info = iter->data;
517 if (NULL != engine_info) {
518 g_engine_list = g_slist_remove(g_engine_list, engine_info);
520 stt_parser_free_engine_info(engine_info);
523 iter = g_slist_nth(g_engine_list, 0);
529 int __stt_config_mgr_check_engine_is_valid(const char* engine_id)
531 if (NULL == engine_id) {
532 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
533 return STT_CONFIG_ERROR_INVALID_PARAMETER;
537 stt_engine_info_s *engine_info = NULL;
539 if (0 >= g_slist_length(g_engine_list)) {
540 SLOG(LOG_ERROR, stt_tag(), "There is no engine!!");
541 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
544 /* Get a first item */
545 iter = g_slist_nth(g_engine_list, 0);
547 while (NULL != iter) {
548 engine_info = iter->data;
550 if (NULL == engine_info) {
551 SLOG(LOG_ERROR, stt_tag(), "engine info is NULL");
552 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
555 if (0 == strcmp(engine_id, engine_info->uuid)) {
556 SLOG(LOG_DEBUG, stt_tag(), "Default engine is valid : %s", engine_id);
557 return STT_CONFIG_ERROR_NONE;
560 iter = g_slist_next(iter);
563 /* Change default engine */
564 iter = g_slist_nth(g_engine_list, 0);
566 SLOG(LOG_ERROR, stt_tag(), "Operation failed - false engine");
567 return STT_CONFIG_ERROR_OPERATION_FAILED;
570 engine_info = iter->data;
571 if (NULL == engine_info) {
572 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
573 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
576 if (NULL != g_config_info->engine_id) {
577 free(g_config_info->engine_id);
578 g_config_info->engine_id = NULL;
580 if (NULL != g_config_info->setting) {
581 free(g_config_info->setting);
582 g_config_info->setting = NULL;
585 if (NULL != engine_info->uuid) {
586 g_config_info->engine_id = strdup(engine_info->uuid);
589 if (NULL != engine_info->setting) {
590 g_config_info->setting = strdup(engine_info->setting);
594 GSList *iter_lang = NULL;
596 bool is_valid_lang = false;
598 if (0 >= g_slist_length(engine_info->languages)) {
599 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Empty supported language");
600 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
603 /* Get a first item */
604 iter_lang = g_slist_nth(engine_info->languages, 0);
606 while (NULL != iter_lang) {
607 /*Get handle data from list*/
608 lang = iter_lang->data;
610 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
612 if (0 == strcmp(lang, g_config_info->language)) {
613 /* language is valid */
614 is_valid_lang = true;
620 iter_lang = g_slist_next(iter_lang);
623 if (false == is_valid_lang) {
624 iter_lang = g_slist_nth(engine_info->languages, 0);
625 if (NULL != iter_lang) {
626 lang = iter_lang->data;
628 if (NULL != g_config_info->language)
629 free(g_config_info->language);
630 g_config_info->language = strdup(lang);
636 if (false == engine_info->support_silence_detection) {
637 if (true == g_config_info->silence_detection)
638 g_config_info->silence_detection = false;
641 SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
642 SLOG(LOG_DEBUG, stt_tag(), " Engine : %s", g_config_info->engine_id);
643 SLOG(LOG_DEBUG, stt_tag(), " Setting : %s", g_config_info->setting);
644 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
645 SLOG(LOG_DEBUG, stt_tag(), " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
646 SLOG(LOG_DEBUG, stt_tag(), " Credential : %s", g_config_info->credential ? "true" : "false");
648 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
649 g_config_info->silence_detection, g_config_info->credential)) {
650 SLOG(LOG_ERROR, stt_tag(), "Fail to save config");
651 return STT_CONFIG_ERROR_OPERATION_FAILED;
654 return STT_CONFIG_ERROR_NONE;
657 static void __get_engine_list(const char* directory)
660 struct dirent *dirp = NULL;
662 if (NULL == directory) {
663 SLOG(LOG_ERROR, stt_tag(), "[Directory ERROR] Directory is NULL");
666 SLOG(LOG_DEBUG, stt_tag(), "[Directory DEBUG] Directory: %s", directory);
669 dp = opendir(directory);
675 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
678 stt_engine_info_s* info;
679 char* filepath = NULL;
682 filesize = strlen(directory) + strlen(dirp->d_name) + 5;
683 filepath = (char*)calloc(filesize, sizeof(char));
685 if (NULL != filepath) {
686 snprintf(filepath, filesize, "%s/%s", directory, dirp->d_name);
688 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Memory not enough!!");
692 SLOG(LOG_DEBUG, stt_tag(), "[File DEBUG] File path: %s", filepath);
694 if (0 == stt_parser_get_engine_info(filepath, &info)) {
695 g_engine_list = g_slist_append(g_engine_list, info);
698 if (NULL != filepath) {
703 } while (NULL != dirp);
707 SLOG(LOG_WARN, stt_tag(), "[Config WARNING] Fail to open directory");
713 int stt_config_mgr_initialize(int uid)
717 stt_config_client_s* temp_client = NULL;
719 if (0 < g_slist_length(g_config_client_list)) {
721 iter = g_slist_nth(g_config_client_list, 0);
723 while (NULL != iter) {
724 get_uid = iter->data;
726 if (uid == *get_uid) {
727 SLOG(LOG_WARN, stt_tag(), "[CONFIG] uid(%d) has already registered", uid);
731 iter = g_slist_next(iter);
734 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
735 if (NULL == temp_client) {
736 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
737 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
739 temp_client->uid = uid;
740 temp_client->bool_cb = NULL;
741 temp_client->engine_cb = NULL;
742 temp_client->lang_cb = NULL;
743 temp_client->user_data = NULL;
746 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
748 SLOG(LOG_WARN, stt_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
749 return STT_CONFIG_ERROR_NONE;
752 /* Make directories */
753 if (0 != access(STT_CONFIG_BASE, F_OK)) {
754 if (0 != mkdir(STT_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
755 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to make directory : %s", STT_CONFIG_BASE);
756 __stt_config_release_client(uid);
757 return STT_CONFIG_ERROR_OPERATION_FAILED;
759 SLOG(LOG_DEBUG, stt_tag(), "Success to make directory : %s", STT_CONFIG_BASE);
763 if (0 != access(STT_HOME, F_OK)) {
764 if (0 != mkdir(STT_HOME, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
765 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to make directory : %s", STT_HOME);
766 __stt_config_release_client(uid);
767 return STT_CONFIG_ERROR_OPERATION_FAILED;
769 SLOG(LOG_DEBUG, stt_tag(), "Success to make directory : %s", STT_HOME);
773 if (0 != access(STT_DOWNLOAD_BASE, F_OK)) {
774 if (0 != mkdir(STT_DOWNLOAD_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
775 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to make directory : %s", STT_DOWNLOAD_BASE);
776 __stt_config_release_client(uid);
777 return STT_CONFIG_ERROR_OPERATION_FAILED;
779 SLOG(LOG_DEBUG, stt_tag(), "Success to make directory : %s", STT_DOWNLOAD_BASE);
783 if (0 != access(STT_DOWNLOAD_ENGINE_INFO, F_OK)) {
784 if (0 != mkdir(STT_DOWNLOAD_ENGINE_INFO, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
785 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to make directory : %s", STT_DOWNLOAD_ENGINE_INFO);
786 __stt_config_release_client(uid);
787 return STT_CONFIG_ERROR_OPERATION_FAILED;
789 SLOG(LOG_DEBUG, stt_tag(), "Success to make directory : %s", STT_DOWNLOAD_ENGINE_INFO);
794 /* Get file name from default engine directory */
795 g_engine_list = NULL;
797 SLOG(LOG_WARN, stt_tag(), "[CONFIG] default engine info(%s)", STT_DEFAULT_ENGINE_INFO);
799 SLOG(LOG_DEBUG, stt_tag(), "[CONFIG] Get default engine list");
800 __get_engine_list(STT_DEFAULT_ENGINE_INFO);
801 SLOG(LOG_DEBUG, stt_tag(), "[CONFIG] Get download engine list");
802 __get_engine_list(STT_DOWNLOAD_ENGINE_INFO);
804 __stt_config_mgr_print_engine_info();
806 if (0 != stt_parser_load_config(&g_config_info)) {
807 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to parse configure information");
808 __stt_config_release_client(uid);
809 __stt_config_release_engine();
810 return STT_CONFIG_ERROR_OPERATION_FAILED;
813 /* Check whether engine id is valid */
814 if (0 != __stt_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
815 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get default engine");
816 __stt_config_release_client(uid);
817 __stt_config_release_engine();
818 stt_parser_unload_config(g_config_info);
819 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
822 if (true == g_config_info->auto_lang) {
823 /* Check language with display language */
824 __stt_config_set_auto_language();
826 if (false == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language)) {
827 /* Default language is not valid */
829 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
830 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
831 __stt_config_release_client(uid);
832 __stt_config_release_engine();
833 stt_parser_unload_config(g_config_info);
834 return STT_CONFIG_ERROR_OPERATION_FAILED;
837 if (NULL != tmp_language) {
838 if (NULL != g_config_info->language) {
839 free(g_config_info->language);
840 g_config_info->language = strdup(tmp_language);
848 /* print stt-service config */
849 SLOG(LOG_DEBUG, stt_tag(), "== STT service config ==");
850 SLOG(LOG_DEBUG, stt_tag(), " engine : %s", g_config_info->engine_id);
851 SLOG(LOG_DEBUG, stt_tag(), " setting : %s", g_config_info->setting);
852 SLOG(LOG_DEBUG, stt_tag(), " auto language : %s", g_config_info->auto_lang ? "on" : "off");
853 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
854 SLOG(LOG_DEBUG, stt_tag(), " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
855 SLOG(LOG_DEBUG, stt_tag(), " credential : %s", g_config_info->credential ? "true" : "false");
856 SLOG(LOG_DEBUG, stt_tag(), "===================");
858 if (0 != __stt_config_mgr_register_config_event()) {
859 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to register config event");
860 __stt_config_release_client(uid);
861 __stt_config_release_engine();
862 stt_parser_unload_config(g_config_info);
863 return STT_CONFIG_ERROR_OPERATION_FAILED;
866 /* Register to detect display language change */
867 vconf_notify_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb, NULL);
869 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
870 if (NULL == temp_client) {
871 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
872 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
874 temp_client->uid = uid;
875 temp_client->bool_cb = NULL;
876 temp_client->engine_cb = NULL;
877 temp_client->lang_cb = NULL;
878 temp_client->user_data = NULL;
881 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
883 return STT_CONFIG_ERROR_NONE;
886 int stt_config_mgr_finalize(int uid)
889 stt_config_client_s* temp_client = NULL;
891 if (0 < g_slist_length(g_config_client_list)) {
893 iter = g_slist_nth(g_config_client_list, 0);
895 while (NULL != iter) {
896 temp_client = iter->data;
898 if (NULL != temp_client) {
899 if (uid == temp_client->uid) {
900 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
907 iter = g_slist_next(iter);
911 if (0 < g_slist_length(g_config_client_list)) {
912 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
913 return STT_CONFIG_ERROR_NONE;
916 stt_engine_info_s *engine_info = NULL;
918 if (0 < g_slist_length(g_engine_list)) {
920 /* Get a first item */
921 iter = g_slist_nth(g_engine_list, 0);
923 while (NULL != iter) {
924 engine_info = iter->data;
926 if (NULL != engine_info) {
927 g_engine_list = g_slist_remove(g_engine_list, engine_info);
929 stt_parser_free_engine_info(engine_info);
932 iter = g_slist_nth(g_engine_list, 0);
936 vconf_ignore_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb);
938 __stt_config_mgr_unregister_config_event();
940 if (NULL != g_config_info) {
941 stt_parser_unload_config(g_config_info);
942 g_config_info = NULL;
945 return STT_CONFIG_ERROR_NONE;
948 int stt_config_mgr_set_callback(int uid, stt_config_engine_changed_cb engine_cb, stt_config_lang_changed_cb lang_cb, stt_config_bool_changed_cb bool_cb, void* user_data)
951 stt_config_client_s* temp_client = NULL;
953 /* Call all callbacks of client*/
954 iter = g_slist_nth(g_config_client_list, 0);
956 while (NULL != iter) {
957 temp_client = iter->data;
959 if (NULL != temp_client) {
960 if (uid == temp_client->uid) {
961 temp_client->engine_cb = engine_cb;
962 temp_client->lang_cb = lang_cb;
963 temp_client->bool_cb = bool_cb;
964 temp_client->user_data = user_data;
968 iter = g_slist_next(iter);
971 return STT_CONFIG_ERROR_NONE;
974 int stt_config_mgr_unset_callback(int uid)
977 stt_config_client_s* temp_client = NULL;
979 /* Call all callbacks of client*/
980 iter = g_slist_nth(g_config_client_list, 0);
982 while (NULL != iter) {
983 temp_client = iter->data;
985 if (NULL != temp_client) {
986 if (uid == temp_client->uid) {
987 temp_client->engine_cb = NULL;
988 temp_client->lang_cb = NULL;
989 temp_client->bool_cb = NULL;
990 temp_client->user_data = NULL;
994 iter = g_slist_next(iter);
997 return STT_CONFIG_ERROR_NONE;
1000 int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void* user_data)
1002 if (0 >= g_slist_length(g_config_client_list)) {
1003 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1004 return STT_CONFIG_ERROR_INVALID_STATE;
1007 if (NULL == callback) {
1008 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1011 GSList *iter = NULL;
1012 stt_engine_info_s *engine_info = NULL;
1014 if (0 >= g_slist_length(g_engine_list)) {
1015 SLOG(LOG_WARN, stt_tag(), "[ERROR] Engine list is NULL");
1016 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1019 /* Get a first item */
1020 iter = g_slist_nth(g_engine_list, 0);
1022 while (NULL != iter) {
1023 engine_info = iter->data;
1025 if (NULL == engine_info) {
1026 SLOG(LOG_ERROR, stt_tag(), " Engine info is NULL");
1027 return STT_CONFIG_ERROR_OPERATION_FAILED;
1030 if (false == callback(engine_info->uuid, engine_info->name,
1031 engine_info->setting, engine_info->support_silence_detection, user_data)) {
1035 iter = g_slist_next(iter);
1038 return STT_CONFIG_ERROR_NONE;
1041 int stt_config_mgr_get_engine(char** engine)
1043 if (0 >= g_slist_length(g_config_client_list)) {
1044 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1045 return STT_CONFIG_ERROR_INVALID_STATE;
1048 if (NULL == engine) {
1049 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1052 if (NULL != g_config_info->engine_id) {
1053 *engine = strdup(g_config_info->engine_id);
1055 SLOG(LOG_ERROR, stt_tag(), " Engine id is NULL");
1056 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1059 return STT_CONFIG_ERROR_NONE;
1062 int __stt_config_set_buxtonkey(const char* engine)
1065 struct buxton_client * bux_cli;
1066 struct buxton_layer * bux_layer;
1067 struct buxton_value * bux_val;
1069 int ret = buxton_open(&bux_cli, NULL, NULL);
1071 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
1072 return STT_CONFIG_ERROR_OPERATION_FAILED;
1074 bux_layer = buxton_create_layer("system");
1075 if (NULL == bux_layer) {
1076 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_create_layer FAIL");
1077 buxton_close(bux_cli);
1079 return STT_CONFIG_ERROR_OPERATION_FAILED;
1081 bux_val = buxton_value_create_string(engine);
1082 if (NULL == bux_val) {
1083 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_value_create_string FAIL");
1084 buxton_free_layer(bux_layer);
1085 buxton_close(bux_cli);
1088 return STT_CONFIG_ERROR_OPERATION_FAILED;
1090 SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
1093 ret = buxton_set_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, bux_val);
1095 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to set value sync, ret(%d)", ret);
1096 buxton_value_free(bux_val);
1097 buxton_free_layer(bux_layer);
1098 buxton_close(bux_cli);
1103 return STT_CONFIG_ERROR_OPERATION_FAILED;
1105 SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] buxton_set_value_sync: %s", STT_ENGINE_DB_DEFAULT);
1107 buxton_value_free(bux_val);
1108 buxton_free_layer(bux_layer);
1109 buxton_close(bux_cli);
1115 return STT_CONFIG_ERROR_NONE;
1118 int stt_config_mgr_set_engine(const char* engine)
1120 if (0 >= g_slist_length(g_config_client_list)) {
1121 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1122 return STT_CONFIG_ERROR_INVALID_STATE;
1125 if (NULL == g_config_info) {
1126 return STT_CONFIG_ERROR_OPERATION_FAILED;
1129 if (NULL == engine || NULL == g_config_info->engine_id) {
1130 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1133 /* Check current engine id with new engine id */
1134 if (0 == strcmp(g_config_info->engine_id, engine)) {
1138 SLOG(LOG_DEBUG, stt_tag(), "New engine id : %s", engine);
1140 int ret = __stt_config_set_buxtonkey(engine);
1142 SLOG(LOG_ERROR, stt_tag(), "[ERROR] set buxtonkey Failed!!!");
1146 GSList *iter = NULL;
1147 stt_engine_info_s *engine_info = NULL;
1148 bool is_valid_engine = false;
1150 /* Get a first item */
1151 iter = g_slist_nth(g_engine_list, 0);
1153 while (NULL != iter) {
1154 engine_info = iter->data;
1156 if (NULL == engine_info) {
1157 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1158 iter = g_slist_next(iter);
1162 /* Check engine id is valid */
1163 if (0 != strcmp(engine, engine_info->uuid)) {
1164 iter = g_slist_next(iter);
1168 if (NULL != g_config_info->engine_id) {
1169 free(g_config_info->engine_id);
1170 g_config_info->engine_id = NULL;
1173 g_config_info->engine_id = strdup(engine);
1175 if (NULL != g_config_info->setting) {
1176 free(g_config_info->setting);
1177 g_config_info->setting = NULL;
1180 if (NULL != engine_info->setting) {
1181 g_config_info->setting = strdup(engine_info->setting);
1183 g_config_info->setting = NULL;
1186 /* Engine is valid*/
1187 GSList *iter_lang = NULL;
1189 bool is_valid_lang = false;
1191 /* Get a first item */
1192 iter_lang = g_slist_nth(engine_info->languages, 0);
1194 while (NULL != iter_lang) {
1195 /*Get handle data from list*/
1196 lang = iter_lang->data;
1198 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1199 if (NULL != lang && NULL != g_config_info->language) {
1200 if (0 == strcmp(lang, g_config_info->language)) {
1201 /* language is valid */
1202 is_valid_lang = true;
1204 free(g_config_info->language);
1205 g_config_info->language = strdup(lang);
1212 iter_lang = g_slist_next(iter_lang);
1215 if (false == is_valid_lang) {
1216 if (NULL != g_config_info->language) {
1217 free(g_config_info->language);
1218 g_config_info->language = NULL;
1220 iter_lang = g_slist_nth(engine_info->languages, 0);
1221 if (NULL == iter_lang) {
1222 SLOG(LOG_ERROR, stt_tag(), "Fail to get default language");
1226 lang = iter_lang->data;
1228 g_config_info->language = strdup(lang);
1233 if (false == engine_info->support_silence_detection) {
1234 if (true == g_config_info->silence_detection)
1235 g_config_info->silence_detection = false;
1238 if (false == engine_info->need_credential) {
1239 if (true == g_config_info->credential)
1240 g_config_info->credential = false;
1243 is_valid_engine = true;
1247 if (true == is_valid_engine) {
1248 SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
1249 SLOG(LOG_DEBUG, stt_tag(), " Engine : %s", g_config_info->engine_id);
1250 SLOG(LOG_DEBUG, stt_tag(), " Setting : %s", g_config_info->setting);
1251 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
1252 SLOG(LOG_DEBUG, stt_tag(), " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
1253 SLOG(LOG_DEBUG, stt_tag(), " Credential : %s", g_config_info->credential ? "true" : "false");
1255 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
1256 g_config_info->silence_detection, g_config_info->credential)) {
1257 SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
1258 return STT_CONFIG_ERROR_OPERATION_FAILED;
1261 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine id is not valid");
1262 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1268 int stt_config_mgr_get_engine_agreement(const char* engine, char** agreement)
1270 if (0 >= g_slist_length(g_engine_list)) {
1271 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
1272 return STT_CONFIG_ERROR_INVALID_STATE;
1275 if (NULL == agreement) {
1276 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
1277 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1280 GSList *iter = NULL;
1281 stt_engine_info_s *engine_info = NULL;
1282 char* current_engine = NULL;
1284 if (NULL == engine) {
1285 current_engine = strdup(g_config_info->engine_id);
1286 if (NULL == current_engine) {
1287 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1288 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1291 current_engine = strdup(engine);
1292 if (NULL == current_engine) {
1293 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1294 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1298 /* Get a first item */
1299 iter = g_slist_nth(g_engine_list, 0);
1301 while (NULL != iter) {
1302 engine_info = iter->data;
1304 if (NULL == engine_info) {
1305 SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1306 if (NULL != current_engine) free(current_engine);
1307 return STT_CONFIG_ERROR_OPERATION_FAILED;
1310 if (0 != strcmp(current_engine, engine_info->uuid)) {
1311 iter = g_slist_next(iter);
1315 if (NULL != engine_info->agreement) {
1316 *agreement = strdup(engine_info->agreement);
1318 SLOG(LOG_WARN, stt_tag(), "[WARNING] engine agreement is not support");
1323 if (NULL != current_engine) free(current_engine);
1325 return STT_CONFIG_ERROR_NONE;
1328 int stt_config_mgr_get_language_list(const char* engine_id, stt_config_supported_langauge_cb callback, void* user_data)
1330 if (0 >= g_slist_length(g_config_client_list)) {
1331 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1332 return STT_CONFIG_ERROR_INVALID_STATE;
1335 if (0 >= g_slist_length(g_engine_list)) {
1336 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
1337 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1340 GSList *iter = NULL;
1341 stt_engine_info_s *engine_info = NULL;
1343 /* Get a first item */
1344 iter = g_slist_nth(g_engine_list, 0);
1346 while (NULL != iter) {
1347 engine_info = iter->data;
1349 if (NULL == engine_info) {
1350 SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1351 return STT_CONFIG_ERROR_OPERATION_FAILED;
1354 if (0 != strcmp(engine_id, engine_info->uuid)) {
1355 iter = g_slist_next(iter);
1359 GSList *iter_lang = NULL;
1362 /* Get a first item */
1363 iter_lang = g_slist_nth(engine_info->languages, 0);
1365 while (NULL != iter_lang) {
1366 /*Get handle data from list*/
1367 lang = iter_lang->data;
1370 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1371 if (false == callback(engine_info->uuid, lang, user_data))
1376 iter_lang = g_slist_next(iter_lang);
1381 return STT_CONFIG_ERROR_NONE;
1384 int stt_config_mgr_get_default_language(char** language)
1386 if (0 >= g_slist_length(g_config_client_list)) {
1387 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1388 return STT_CONFIG_ERROR_INVALID_STATE;
1391 if (NULL == language) {
1392 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1395 if (NULL != g_config_info->language) {
1396 *language = strdup(g_config_info->language);
1398 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1399 return STT_CONFIG_ERROR_OPERATION_FAILED;
1402 return STT_CONFIG_ERROR_NONE;
1405 int stt_config_mgr_set_default_language(const char* language)
1407 if (0 >= g_slist_length(g_config_client_list)) {
1408 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1409 return STT_CONFIG_ERROR_INVALID_STATE;
1412 if (NULL == language) {
1413 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1416 /* Check language is valid */
1417 if (NULL != g_config_info->language) {
1418 if (0 != stt_parser_set_language(language)) {
1419 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1420 return STT_CONFIG_ERROR_OPERATION_FAILED;
1422 free(g_config_info->language);
1423 g_config_info->language = strdup(language);
1425 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1426 return STT_CONFIG_ERROR_OPERATION_FAILED;
1429 return STT_CONFIG_ERROR_NONE;
1432 int stt_config_mgr_get_auto_language(bool* value)
1434 if (0 >= g_slist_length(g_config_client_list)) {
1435 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1436 return STT_CONFIG_ERROR_INVALID_STATE;
1439 if (NULL == value) {
1440 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1443 *value = g_config_info->auto_lang;
1445 return STT_CONFIG_ERROR_NONE;
1448 int stt_config_mgr_set_auto_language(bool value)
1450 if (0 >= g_slist_length(g_config_client_list)) {
1451 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1452 return STT_CONFIG_ERROR_INVALID_STATE;
1455 if (g_config_info->auto_lang != value) {
1456 /* Check language is valid */
1457 if (0 != stt_parser_set_auto_lang(value)) {
1458 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1459 return STT_CONFIG_ERROR_OPERATION_FAILED;
1461 g_config_info->auto_lang = value;
1463 if (true == g_config_info->auto_lang) {
1464 __stt_config_set_auto_language();
1468 return STT_CONFIG_ERROR_NONE;
1471 int stt_config_mgr_get_silence_detection(bool* value)
1473 if (0 >= g_slist_length(g_config_client_list)) {
1474 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1475 return STT_CONFIG_ERROR_INVALID_STATE;
1479 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1481 *value = g_config_info->silence_detection;
1483 return STT_CONFIG_ERROR_NONE;
1486 int stt_config_mgr_set_silence_detection(bool value)
1488 if (0 >= g_slist_length(g_config_client_list)) {
1489 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1490 return STT_CONFIG_ERROR_INVALID_STATE;
1493 if (0 != stt_parser_set_silence_detection(value)) {
1494 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1495 return STT_CONFIG_ERROR_OPERATION_FAILED;
1498 g_config_info->silence_detection = value;
1500 return STT_CONFIG_ERROR_NONE;
1503 bool stt_config_check_default_engine_is_valid(const char* engine)
1505 if (0 >= g_slist_length(g_config_client_list)) {
1506 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1510 if (NULL == engine) {
1514 if (0 >= g_slist_length(g_engine_list))
1517 GSList *iter = NULL;
1518 stt_engine_info_s *engine_info = NULL;
1520 /* Get a first item */
1521 iter = g_slist_nth(g_engine_list, 0);
1523 while (NULL != iter) {
1524 engine_info = iter->data;
1526 if (NULL != engine_info) {
1527 if (0 == strcmp(engine, engine_info->uuid)) {
1531 iter = g_slist_next(iter);
1537 bool stt_config_check_default_language_is_valid(const char* language)
1539 if (0 >= g_slist_length(g_config_client_list)) {
1540 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1544 if (NULL == language) {
1548 if (NULL == g_config_info->engine_id) {
1549 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Default engine id is NULL");
1553 if (0 >= g_slist_length(g_engine_list))
1556 GSList *iter = NULL;
1557 stt_engine_info_s *engine_info = NULL;
1559 /* Get a first item */
1560 iter = g_slist_nth(g_engine_list, 0);
1562 while (NULL != iter) {
1563 engine_info = iter->data;
1565 if (NULL == engine_info) {
1566 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1567 iter = g_slist_next(iter);
1571 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1572 iter = g_slist_next(iter);
1576 GSList *iter_lang = NULL;
1579 /* Get a first item */
1580 iter_lang = g_slist_nth(engine_info->languages, 0);
1582 while (NULL != iter_lang) {
1583 lang = iter_lang->data;
1585 if (0 == strcmp(language, lang))
1589 iter_lang = g_slist_next(iter_lang);
1597 int __stt_config_mgr_print_engine_info()
1599 GSList *iter = NULL;
1600 stt_engine_info_s *engine_info = NULL;
1602 if (0 >= g_slist_length(g_engine_list)) {
1603 SLOG(LOG_DEBUG, stt_tag(), "-------------- engine list -----------------");
1604 SLOG(LOG_DEBUG, stt_tag(), " No Engine in engine directory");
1605 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1609 /* Get a first item */
1610 iter = g_slist_nth(g_engine_list, 0);
1612 SLOG(LOG_DEBUG, stt_tag(), "--------------- engine list -----------------");
1615 while (NULL != iter) {
1616 engine_info = iter->data;
1618 SLOG(LOG_DEBUG, stt_tag(), "[%dth]", i);
1619 SLOG(LOG_DEBUG, stt_tag(), " name : %s", engine_info->name);
1620 SLOG(LOG_DEBUG, stt_tag(), " id : %s", engine_info->uuid);
1621 SLOG(LOG_DEBUG, stt_tag(), " setting : %s", engine_info->setting);
1622 SLOG(LOG_DEBUG, stt_tag(), " agreement : %s", engine_info->agreement);
1624 SLOG(LOG_DEBUG, stt_tag(), " languages");
1625 GSList *iter_lang = NULL;
1627 if (g_slist_length(engine_info->languages) > 0) {
1628 /* Get a first item */
1629 iter_lang = g_slist_nth(engine_info->languages, 0);
1632 while (NULL != iter_lang) {
1633 /*Get handle data from list*/
1634 lang = iter_lang->data;
1636 SLOG(LOG_DEBUG, stt_tag(), " [%dth] %s", j, lang);
1639 iter_lang = g_slist_next(iter_lang);
1643 SLOG(LOG_ERROR, stt_tag(), " language is NONE");
1645 SLOG(LOG_DEBUG, stt_tag(), " silence support : %s",
1646 engine_info->support_silence_detection ? "true" : "false");
1647 iter = g_slist_next(iter);
1650 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1658 * time info functions
1660 static GSList* g_time_list = NULL;
1662 int stt_config_mgr_reset_time_info()
1664 /* Remove time info */
1665 GSList *iter = NULL;
1666 stt_result_time_info_s *data = NULL;
1668 /* Remove time info */
1669 iter = g_slist_nth(g_time_list, 0);
1670 while (NULL != iter) {
1673 g_time_list = g_slist_remove(g_time_list, data);
1675 if (NULL != data->text) {
1684 iter = g_slist_nth(g_time_list, 0);
1690 int stt_config_mgr_add_time_info(int index, int event, const char* text, long start_time, long end_time)
1693 SLOG(LOG_ERROR, stt_tag(), "Invalid paramter : text is NULL");
1697 stt_result_time_info_s *info = (stt_result_time_info_s*)calloc(1, sizeof(stt_result_time_info_s));
1699 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1700 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
1702 info->index = index;
1703 info->event = event;
1705 info->text = strdup(text);
1707 info->start_time = start_time;
1708 info->end_time = end_time;
1710 SLOG(LOG_DEBUG, stt_tag(), "[DEBUG] inside stt_config_mgr_add_time_info: index(%d), text(%s), start time(%ld), end_time(%ld)", info->index, (NULL == info->text) ? "NULL" : info->text, info->start_time, info->end_time);
1712 /* Add item to global list */
1713 g_time_list = g_slist_append(g_time_list, info);
1715 SLOG(LOG_DEBUG, stt_tag(), "[DEBUG] inside stt_config_mgr_add_time_info: g_time_list length(%d)", g_slist_length(g_time_list));
1720 int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* user_data)
1722 if (NULL == callback) {
1723 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input paramter is NULL : callback function");
1724 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1727 GSList* temp_time = NULL;
1729 ret = stt_parser_get_time_info(&temp_time);
1731 SLOG(LOG_WARN, stt_tag(), "[WARNING] Fail to get time info : %d", ret);
1732 return STT_CONFIG_ERROR_NONE;
1735 GSList *iter = NULL;
1736 stt_result_time_info_s *data = NULL;
1738 /* Get a first item */
1739 iter = g_slist_nth(temp_time, 0);
1740 while (NULL != iter) {
1743 if (false == callback(data->index, data->event, data->text,
1744 data->start_time, data->end_time, user_data)) {
1749 iter = g_slist_next(iter);
1752 /* Remove time info */
1753 iter = g_slist_nth(temp_time, 0);
1754 while (NULL != iter) {
1758 temp_time = g_slist_remove(temp_time, data);
1760 if (NULL != data->text) {
1769 iter = g_slist_nth(temp_time, 0);
1772 return STT_CONFIG_ERROR_NONE;
1775 int stt_config_mgr_save_time_info_file()
1777 if (0 == g_slist_length(g_time_list)) {
1778 SLOG(LOG_WARN, stt_tag(), "[WARNING] There is no time info to save");
1779 return STT_CONFIG_ERROR_OPERATION_FAILED;
1783 ret = stt_parser_set_time_info(g_time_list);
1785 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save time info : %d", ret);
1786 return STT_CONFIG_ERROR_OPERATION_FAILED;
1789 return STT_CONFIG_ERROR_NONE;
1792 int stt_config_mgr_remove_time_info_file()
1794 stt_parser_clear_time_info();
1796 return STT_CONFIG_ERROR_NONE;