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");
115 return STT_CONFIG_ERROR_INVALID_PARAMETER;
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!!");
123 return STT_CONFIG_ERROR_OPERATION_FAILED;
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");
134 iter = g_slist_next(iter);
138 if (0 != strcmp(engine_id, engine_info->uuid)) {
139 iter = g_slist_next(iter);
143 if (NULL == engine_info->default_lang) {
144 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Default language of the engine info is NULL");
145 return STT_CONFIG_ERROR_INVALID_LANGUAGE;
148 *language = strdup(engine_info->default_lang);
150 if (NULL != *language) {
151 SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", *language);
152 return STT_CONFIG_ERROR_NONE;
156 return STT_CONFIG_ERROR_OPERATION_FAILED;
159 Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
161 SLOG(LOG_DEBUG, stt_tag(), "===== Config changed callback event");
164 struct inotify_event event;
165 memset(&event, '\0', sizeof(struct inotify_event));
167 length = read(g_fd_noti, &event, sizeof(struct inotify_event));
169 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Empty Inotify event");
170 SLOG(LOG_DEBUG, stt_tag(), "=====");
171 SLOG(LOG_DEBUG, stt_tag(), " ");
172 return ECORE_CALLBACK_PASS_ON;
175 if (IN_MODIFY == event.mask) {
177 char* setting = NULL;
184 stt_config_client_s* temp_client = NULL;
186 if (0 != stt_parser_find_config_changed(&engine, &setting, &auto_lang, &lang, &silence, &credential))
187 return ECORE_CALLBACK_PASS_ON;
190 if (NULL != engine || NULL != setting) {
192 if (NULL != engine) {
193 if (NULL != g_config_info->engine_id) free(g_config_info->engine_id);
194 g_config_info->engine_id = strdup(engine);
197 if (NULL != setting) {
198 if (NULL != g_config_info->setting) free(g_config_info->setting);
199 g_config_info->setting = strdup(setting);
203 if (NULL != g_config_info->language) free(g_config_info->language);
204 g_config_info->language = strdup(lang);
207 if (-1 != silence) g_config_info->silence_detection = silence;
209 if (-1 != credential) g_config_info->credential = credential;
211 /* Call all callbacks of client*/
212 iter = g_slist_nth(g_config_client_list, 0);
214 while (NULL != iter) {
215 temp_client = iter->data;
217 if (NULL != temp_client) {
218 if (NULL != temp_client->engine_cb) {
219 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
220 g_config_info->silence_detection, g_config_info->credential, temp_client->user_data);
224 iter = g_slist_next(iter);
228 if (-1 != auto_lang) {
229 g_config_info->auto_lang = auto_lang;
232 /* Only language changed */
233 if (NULL == engine && NULL != lang) {
234 char* before_lang = NULL;
235 before_lang = strdup(g_config_info->language);
238 if (NULL != g_config_info->language) free(g_config_info->language);
239 g_config_info->language = strdup(lang);
242 /* Call all callbacks of client*/
243 iter = g_slist_nth(g_config_client_list, 0);
245 while (NULL != iter) {
246 temp_client = iter->data;
248 if (NULL != temp_client) {
249 if (NULL != temp_client->lang_cb) {
250 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
254 iter = g_slist_next(iter);
257 if (NULL != before_lang) {
263 /* silence detection changed */
264 g_config_info->silence_detection = silence;
266 /* Call all callbacks of client*/
267 iter = g_slist_nth(g_config_client_list, 0);
269 while (NULL != iter) {
270 temp_client = iter->data;
272 if (NULL != temp_client) {
273 if (NULL != temp_client->bool_cb) {
274 temp_client->bool_cb(STT_CONFIG_TYPE_OPTION_SILENCE_DETECTION, silence, temp_client->user_data);
278 iter = g_slist_next(iter);
282 if (NULL != engine) free(engine);
283 if (NULL != setting) free(setting);
284 if (NULL != lang) free(lang);
286 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Undefined event");
289 SLOG(LOG_DEBUG, stt_tag(), "=====");
290 SLOG(LOG_DEBUG, stt_tag(), " ");
292 return ECORE_CALLBACK_PASS_ON;
295 int __stt_config_mgr_register_config_event()
297 /* get file notification handler */
303 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail get inotify fd");
308 wd = inotify_add_watch(fd, STT_CONFIG, IN_MODIFY);
311 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);
312 if (NULL == g_fd_handler_noti) {
313 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get handler_noti");
320 int __stt_config_mgr_unregister_config_event()
322 /* delete inotify variable */
323 ecore_main_fd_handler_del(g_fd_handler_noti);
324 inotify_rm_watch(g_fd_noti, g_wd_noti);
330 int __stt_config_set_auto_language()
333 char candidate_lang[6] = {'\0', };
335 value = vconf_get_str(VCONFKEY_LANGSET);
337 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Fail to get display language");
341 strncpy(candidate_lang, value, 5);
344 /* Check current config info */
345 if (NULL == g_config_info) {
346 SLOG(LOG_ERROR, stt_tag(), "Current config info is NULL");
347 return STT_CONFIG_ERROR_OPERATION_FAILED;
350 /* Check current language */
351 if (NULL == g_config_info->language) {
352 SLOG(LOG_ERROR, stt_tag(), "Current config language is NULL");
353 return STT_CONFIG_ERROR_OPERATION_FAILED;
356 if (0 == strncmp(g_config_info->language, candidate_lang, 5)) {
357 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. STT language(%s) is same with display lang", g_config_info->language);
360 SLOG(LOG_DEBUG, stt_tag(), "[Config] Display language : %s", candidate_lang);
363 if (true == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, candidate_lang)) {
364 char* before_lang = NULL;
365 if (0 != stt_parser_set_language(candidate_lang)) {
366 SLOG(LOG_ERROR, stt_tag(), "Fail to save default language");
370 before_lang = strdup(g_config_info->language);
372 free(g_config_info->language);
373 g_config_info->language = strdup(candidate_lang);
375 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. Set default language(%s)", g_config_info->language);
377 /* Call all callbacks of client*/
379 stt_config_client_s* temp_client = NULL;
381 iter = g_slist_nth(g_config_client_list, 0);
383 while (NULL != iter) {
384 temp_client = iter->data;
386 if (NULL != temp_client) {
387 if (NULL != temp_client->lang_cb) {
388 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
392 iter = g_slist_next(iter);
395 if (NULL != before_lang) {
399 /* Candidate language is not valid */
400 char* tmp_language = NULL;
401 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
402 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
406 if (NULL == tmp_language) {
407 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Selected language is NULL");
411 if (0 != stt_parser_set_language(tmp_language)) {
413 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save config");
417 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto but display lang is not supported. Default language change(%s)", tmp_language);
419 /* Call all callbacks of client*/
421 stt_config_client_s* temp_client = NULL;
423 iter = g_slist_nth(g_config_client_list, 0);
425 while (NULL != iter) {
426 temp_client = iter->data;
428 if (NULL != temp_client) {
429 if (NULL != temp_client->lang_cb) {
430 temp_client->lang_cb(g_config_info->language, tmp_language, temp_client->user_data);
434 iter = g_slist_next(iter);
437 free(g_config_info->language);
438 g_config_info->language = strdup(tmp_language);
447 void __stt_config_language_changed_cb(keynode_t *key, void *data)
449 if (true == g_config_info->auto_lang) {
450 /* Get voice input vconf key */
451 __stt_config_set_auto_language();
457 void __stt_config_release_client(int uid)
460 stt_config_client_s* temp_client = NULL;
462 if (0 < g_slist_length(g_config_client_list)) {
464 iter = g_slist_nth(g_config_client_list, 0);
466 while (NULL != iter) {
467 temp_client = iter->data;
469 if (NULL != temp_client) {
470 if (uid == temp_client->uid) {
471 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
478 iter = g_slist_next(iter);
482 if (0 < g_slist_length(g_config_client_list)) {
483 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
488 void __stt_config_release_engine()
491 stt_engine_info_s *engine_info = NULL;
493 if (0 < g_slist_length(g_engine_list)) {
495 /* Get a first item */
496 iter = g_slist_nth(g_engine_list, 0);
498 while (NULL != iter) {
499 engine_info = iter->data;
501 if (NULL != engine_info) {
502 g_engine_list = g_slist_remove(g_engine_list, engine_info);
504 stt_parser_free_engine_info(engine_info);
507 iter = g_slist_nth(g_engine_list, 0);
513 int __stt_config_mgr_check_engine_is_valid(const char* engine_id)
515 if (NULL == engine_id) {
516 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
517 return STT_CONFIG_ERROR_INVALID_PARAMETER;
521 stt_engine_info_s *engine_info = NULL;
523 if (0 >= g_slist_length(g_engine_list)) {
524 SLOG(LOG_ERROR, stt_tag(), "There is no engine!!");
525 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
528 /* Get a first item */
529 iter = g_slist_nth(g_engine_list, 0);
531 while (NULL != iter) {
532 engine_info = iter->data;
534 if (NULL == engine_info) {
535 SLOG(LOG_ERROR, stt_tag(), "engine info is NULL");
536 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
539 if (0 == strcmp(engine_id, engine_info->uuid)) {
540 SLOG(LOG_DEBUG, stt_tag(), "Default engine is valid : %s", engine_id);
541 return STT_CONFIG_ERROR_NONE;
544 iter = g_slist_next(iter);
547 /* Change default engine */
548 iter = g_slist_nth(g_engine_list, 0);
550 SLOG(LOG_ERROR, stt_tag(), "Operation failed - false engine");
551 return STT_CONFIG_ERROR_OPERATION_FAILED;
554 engine_info = iter->data;
555 if (NULL == engine_info) {
556 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
557 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
560 if (NULL != g_config_info->engine_id) {
561 free(g_config_info->engine_id);
562 g_config_info->engine_id = NULL;
564 if (NULL != g_config_info->setting) {
565 free(g_config_info->setting);
566 g_config_info->setting = NULL;
569 if (NULL != engine_info->uuid) {
570 g_config_info->engine_id = strdup(engine_info->uuid);
573 if (NULL != engine_info->setting) {
574 g_config_info->setting = strdup(engine_info->setting);
578 GSList *iter_lang = NULL;
580 bool is_valid_lang = false;
582 if (0 >= g_slist_length(engine_info->languages)) {
583 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Empty supported language");
584 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
587 /* Get a first item */
588 iter_lang = g_slist_nth(engine_info->languages, 0);
590 while (NULL != iter_lang) {
591 /*Get handle data from list*/
592 lang = iter_lang->data;
594 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
596 if (0 == strcmp(lang, g_config_info->language)) {
597 /* language is valid */
598 is_valid_lang = true;
604 iter_lang = g_slist_next(iter_lang);
607 if (false == is_valid_lang) {
608 iter_lang = g_slist_nth(engine_info->languages, 0);
609 if (NULL != iter_lang) {
610 lang = iter_lang->data;
612 if (NULL != g_config_info->language)
613 free(g_config_info->language);
614 g_config_info->language = strdup(lang);
620 if (false == engine_info->support_silence_detection) {
621 if (true == g_config_info->silence_detection)
622 g_config_info->silence_detection = false;
625 SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
626 SLOG(LOG_DEBUG, stt_tag(), " Engine : %s", g_config_info->engine_id);
627 SLOG(LOG_DEBUG, stt_tag(), " Setting : %s", g_config_info->setting);
628 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
629 SLOG(LOG_DEBUG, stt_tag(), " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
630 SLOG(LOG_DEBUG, stt_tag(), " Credential : %s", g_config_info->credential ? "true" : "false");
632 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
633 g_config_info->silence_detection, g_config_info->credential)) {
634 SLOG(LOG_ERROR, stt_tag(), "Fail to save config");
635 return STT_CONFIG_ERROR_OPERATION_FAILED;
638 return STT_CONFIG_ERROR_NONE;
641 static void __get_engine_list(const char* directory)
644 struct dirent *dirp = NULL;
646 if (NULL == directory) {
647 SLOG(LOG_ERROR, stt_tag(), "[Directory ERROR] Directory is NULL");
650 SLOG(LOG_DEBUG, stt_tag(), "[Directory DEBUG] Directory: %s", directory);
653 dp = opendir(directory);
659 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
662 stt_engine_info_s* info;
663 char* filepath = NULL;
666 filesize = strlen(directory) + strlen(dirp->d_name) + 5;
667 filepath = (char*)calloc(filesize, sizeof(char));
669 if (NULL != filepath) {
670 snprintf(filepath, filesize, "%s/%s", directory, dirp->d_name);
672 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Memory not enough!!");
676 SLOG(LOG_DEBUG, stt_tag(), "[File DEBUG] File path: %s", filepath);
678 if (0 == stt_parser_get_engine_info(filepath, &info)) {
679 g_engine_list = g_slist_append(g_engine_list, info);
682 if (NULL != filepath) {
687 } while (NULL != dirp);
691 SLOG(LOG_WARN, stt_tag(), "[Config WARNING] Fail to open directory");
697 int stt_config_mgr_initialize(int uid)
701 stt_config_client_s* temp_client = NULL;
703 if (0 < g_slist_length(g_config_client_list)) {
705 iter = g_slist_nth(g_config_client_list, 0);
707 while (NULL != iter) {
708 get_uid = iter->data;
710 if (uid == *get_uid) {
711 SLOG(LOG_WARN, stt_tag(), "[CONFIG] uid(%d) has already registered", uid);
715 iter = g_slist_next(iter);
718 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
719 if (NULL == temp_client) {
720 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
721 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
723 temp_client->uid = uid;
724 temp_client->bool_cb = NULL;
725 temp_client->engine_cb = NULL;
726 temp_client->lang_cb = NULL;
727 temp_client->user_data = NULL;
730 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
732 SLOG(LOG_WARN, stt_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
733 return STT_CONFIG_ERROR_NONE;
736 /* Make directories */
737 if (0 != access(STT_CONFIG_BASE, F_OK)) {
738 if (0 != mkdir(STT_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
739 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to make directory : %s", STT_CONFIG_BASE);
740 __stt_config_release_client(uid);
741 return STT_CONFIG_ERROR_OPERATION_FAILED;
743 SLOG(LOG_DEBUG, stt_tag(), "Success to make directory : %s", STT_CONFIG_BASE);
747 if (0 != access(STT_HOME, F_OK)) {
748 if (0 != mkdir(STT_HOME, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
749 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to make directory : %s", STT_HOME);
750 __stt_config_release_client(uid);
751 return STT_CONFIG_ERROR_OPERATION_FAILED;
753 SLOG(LOG_DEBUG, stt_tag(), "Success to make directory : %s", STT_HOME);
757 if (0 != access(STT_DOWNLOAD_BASE, F_OK)) {
758 if (0 != mkdir(STT_DOWNLOAD_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
759 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to make directory : %s", STT_DOWNLOAD_BASE);
760 __stt_config_release_client(uid);
761 return STT_CONFIG_ERROR_OPERATION_FAILED;
763 SLOG(LOG_DEBUG, stt_tag(), "Success to make directory : %s", STT_DOWNLOAD_BASE);
767 if (0 != access(STT_DOWNLOAD_ENGINE_INFO, F_OK)) {
768 if (0 != mkdir(STT_DOWNLOAD_ENGINE_INFO, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
769 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to make directory : %s", STT_DOWNLOAD_ENGINE_INFO);
770 __stt_config_release_client(uid);
771 return STT_CONFIG_ERROR_OPERATION_FAILED;
773 SLOG(LOG_DEBUG, stt_tag(), "Success to make directory : %s", STT_DOWNLOAD_ENGINE_INFO);
778 /* Get file name from default engine directory */
779 g_engine_list = NULL;
781 SLOG(LOG_WARN, stt_tag(), "[CONFIG] default engine info(%s)", STT_DEFAULT_ENGINE_INFO);
783 SLOG(LOG_DEBUG, stt_tag(), "[CONFIG] Get default engine list");
784 __get_engine_list(STT_DEFAULT_ENGINE_INFO);
785 SLOG(LOG_DEBUG, stt_tag(), "[CONFIG] Get download engine list");
786 __get_engine_list(STT_DOWNLOAD_ENGINE_INFO);
788 __stt_config_mgr_print_engine_info();
790 if (0 != stt_parser_load_config(&g_config_info)) {
791 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to parse configure information");
792 __stt_config_release_client(uid);
793 __stt_config_release_engine();
794 return STT_CONFIG_ERROR_OPERATION_FAILED;
797 /* Check whether engine id is valid */
798 if (0 != __stt_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
799 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get default engine");
800 __stt_config_release_client(uid);
801 __stt_config_release_engine();
802 stt_parser_unload_config(g_config_info);
803 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
806 if (true == g_config_info->auto_lang) {
807 /* Check language with display language */
808 __stt_config_set_auto_language();
810 if (false == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language)) {
811 /* Default language is not valid */
813 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
814 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
815 __stt_config_release_client(uid);
816 __stt_config_release_engine();
817 stt_parser_unload_config(g_config_info);
818 return STT_CONFIG_ERROR_OPERATION_FAILED;
821 if (NULL != tmp_language) {
822 if (NULL != g_config_info->language) {
823 free(g_config_info->language);
824 g_config_info->language = strdup(tmp_language);
832 /* print stt-service config */
833 SLOG(LOG_DEBUG, stt_tag(), "== STT service config ==");
834 SLOG(LOG_DEBUG, stt_tag(), " engine : %s", g_config_info->engine_id);
835 SLOG(LOG_DEBUG, stt_tag(), " setting : %s", g_config_info->setting);
836 SLOG(LOG_DEBUG, stt_tag(), " auto language : %s", g_config_info->auto_lang ? "on" : "off");
837 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
838 SLOG(LOG_DEBUG, stt_tag(), " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
839 SLOG(LOG_DEBUG, stt_tag(), " credential : %s", g_config_info->credential ? "true" : "false");
840 SLOG(LOG_DEBUG, stt_tag(), "===================");
842 if (0 != __stt_config_mgr_register_config_event()) {
843 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to register config event");
844 __stt_config_release_client(uid);
845 __stt_config_release_engine();
846 stt_parser_unload_config(g_config_info);
847 return STT_CONFIG_ERROR_OPERATION_FAILED;
850 /* Register to detect display language change */
851 vconf_notify_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb, NULL);
853 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
854 if (NULL == temp_client) {
855 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
856 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
858 temp_client->uid = uid;
859 temp_client->bool_cb = NULL;
860 temp_client->engine_cb = NULL;
861 temp_client->lang_cb = NULL;
862 temp_client->user_data = NULL;
865 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
867 return STT_CONFIG_ERROR_NONE;
870 int stt_config_mgr_finalize(int uid)
873 stt_config_client_s* temp_client = NULL;
875 if (0 < g_slist_length(g_config_client_list)) {
877 iter = g_slist_nth(g_config_client_list, 0);
879 while (NULL != iter) {
880 temp_client = iter->data;
882 if (NULL != temp_client) {
883 if (uid == temp_client->uid) {
884 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
891 iter = g_slist_next(iter);
895 if (0 < g_slist_length(g_config_client_list)) {
896 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
897 return STT_CONFIG_ERROR_NONE;
900 stt_engine_info_s *engine_info = NULL;
902 if (0 < g_slist_length(g_engine_list)) {
904 /* Get a first item */
905 iter = g_slist_nth(g_engine_list, 0);
907 while (NULL != iter) {
908 engine_info = iter->data;
910 if (NULL != engine_info) {
911 g_engine_list = g_slist_remove(g_engine_list, engine_info);
913 stt_parser_free_engine_info(engine_info);
916 iter = g_slist_nth(g_engine_list, 0);
920 vconf_ignore_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb);
922 __stt_config_mgr_unregister_config_event();
924 if (NULL != g_config_info) {
925 stt_parser_unload_config(g_config_info);
926 g_config_info = NULL;
929 return STT_CONFIG_ERROR_NONE;
932 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)
935 stt_config_client_s* temp_client = NULL;
937 /* Call all callbacks of client*/
938 iter = g_slist_nth(g_config_client_list, 0);
940 while (NULL != iter) {
941 temp_client = iter->data;
943 if (NULL != temp_client) {
944 if (uid == temp_client->uid) {
945 temp_client->engine_cb = engine_cb;
946 temp_client->lang_cb = lang_cb;
947 temp_client->bool_cb = bool_cb;
948 temp_client->user_data = user_data;
952 iter = g_slist_next(iter);
955 return STT_CONFIG_ERROR_NONE;
958 int stt_config_mgr_unset_callback(int uid)
961 stt_config_client_s* temp_client = NULL;
963 /* Call all callbacks of client*/
964 iter = g_slist_nth(g_config_client_list, 0);
966 while (NULL != iter) {
967 temp_client = iter->data;
969 if (NULL != temp_client) {
970 if (uid == temp_client->uid) {
971 temp_client->engine_cb = NULL;
972 temp_client->lang_cb = NULL;
973 temp_client->bool_cb = NULL;
974 temp_client->user_data = NULL;
978 iter = g_slist_next(iter);
981 return STT_CONFIG_ERROR_NONE;
984 int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void* user_data)
986 if (0 >= g_slist_length(g_config_client_list)) {
987 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
988 return STT_CONFIG_ERROR_INVALID_STATE;
991 if (NULL == callback) {
992 return STT_CONFIG_ERROR_INVALID_PARAMETER;
996 stt_engine_info_s *engine_info = NULL;
998 if (0 >= g_slist_length(g_engine_list)) {
999 SLOG(LOG_WARN, stt_tag(), "[ERROR] Engine list is NULL");
1000 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1003 /* Get a first item */
1004 iter = g_slist_nth(g_engine_list, 0);
1006 while (NULL != iter) {
1007 engine_info = iter->data;
1009 if (NULL == engine_info) {
1010 SLOG(LOG_ERROR, stt_tag(), " Engine info is NULL");
1011 return STT_CONFIG_ERROR_OPERATION_FAILED;
1014 if (false == callback(engine_info->uuid, engine_info->name,
1015 engine_info->setting, engine_info->support_silence_detection, user_data)) {
1019 iter = g_slist_next(iter);
1022 return STT_CONFIG_ERROR_NONE;
1025 int stt_config_mgr_get_engine(char** engine)
1027 if (0 >= g_slist_length(g_config_client_list)) {
1028 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1029 return STT_CONFIG_ERROR_INVALID_STATE;
1032 if (NULL == engine) {
1033 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1036 if (NULL != g_config_info->engine_id) {
1037 *engine = strdup(g_config_info->engine_id);
1039 SLOG(LOG_ERROR, stt_tag(), " Engine id is NULL");
1040 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1043 return STT_CONFIG_ERROR_NONE;
1046 int __stt_config_set_buxtonkey(const char* engine)
1049 struct buxton_client * bux_cli;
1050 struct buxton_layer * bux_layer;
1051 struct buxton_value * bux_val;
1053 int ret = buxton_open(&bux_cli, NULL, NULL);
1055 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
1056 return STT_CONFIG_ERROR_OPERATION_FAILED;
1058 bux_layer = buxton_create_layer("system");
1059 if (NULL == bux_layer) {
1060 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_create_layer FAIL");
1061 buxton_close(bux_cli);
1063 return STT_CONFIG_ERROR_OPERATION_FAILED;
1065 bux_val = buxton_value_create_string(engine);
1066 if (NULL == bux_val) {
1067 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_value_create_string FAIL");
1068 buxton_free_layer(bux_layer);
1069 buxton_close(bux_cli);
1072 return STT_CONFIG_ERROR_OPERATION_FAILED;
1074 SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
1077 ret = buxton_set_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, bux_val);
1079 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to set value sync, ret(%d)", ret);
1080 buxton_value_free(bux_val);
1081 buxton_free_layer(bux_layer);
1082 buxton_close(bux_cli);
1087 return STT_CONFIG_ERROR_OPERATION_FAILED;
1089 SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] buxton_set_value_sync: %s", STT_ENGINE_DB_DEFAULT);
1091 buxton_value_free(bux_val);
1092 buxton_free_layer(bux_layer);
1093 buxton_close(bux_cli);
1099 return STT_CONFIG_ERROR_NONE;
1102 int stt_config_mgr_set_engine(const char* engine)
1104 if (0 >= g_slist_length(g_config_client_list)) {
1105 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1106 return STT_CONFIG_ERROR_INVALID_STATE;
1109 if (NULL == g_config_info) {
1110 return STT_CONFIG_ERROR_OPERATION_FAILED;
1113 if (NULL == engine || NULL == g_config_info->engine_id) {
1114 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1117 /* Check current engine id with new engine id */
1118 if (0 == strcmp(g_config_info->engine_id, engine)) {
1122 SLOG(LOG_DEBUG, stt_tag(), "New engine id : %s", engine);
1124 int ret = __stt_config_set_buxtonkey(engine);
1126 SLOG(LOG_ERROR, stt_tag(), "[ERROR] set buxtonkey Failed!!!");
1130 GSList *iter = NULL;
1131 stt_engine_info_s *engine_info = NULL;
1132 bool is_valid_engine = false;
1134 /* Get a first item */
1135 iter = g_slist_nth(g_engine_list, 0);
1137 while (NULL != iter) {
1138 engine_info = iter->data;
1140 if (NULL == engine_info) {
1141 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1142 iter = g_slist_next(iter);
1146 /* Check engine id is valid */
1147 if (0 != strcmp(engine, engine_info->uuid)) {
1148 iter = g_slist_next(iter);
1152 if (NULL != g_config_info->engine_id) {
1153 free(g_config_info->engine_id);
1154 g_config_info->engine_id = NULL;
1157 g_config_info->engine_id = strdup(engine);
1159 if (NULL != g_config_info->setting) {
1160 free(g_config_info->setting);
1161 g_config_info->setting = NULL;
1164 if (NULL != engine_info->setting) {
1165 g_config_info->setting = strdup(engine_info->setting);
1167 g_config_info->setting = NULL;
1170 /* Engine is valid*/
1171 GSList *iter_lang = NULL;
1173 bool is_valid_lang = false;
1175 /* Get a first item */
1176 iter_lang = g_slist_nth(engine_info->languages, 0);
1178 while (NULL != iter_lang) {
1179 /*Get handle data from list*/
1180 lang = iter_lang->data;
1182 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1183 if (NULL != lang && NULL != g_config_info->language) {
1184 if (0 == strcmp(lang, g_config_info->language)) {
1185 /* language is valid */
1186 is_valid_lang = true;
1188 free(g_config_info->language);
1189 g_config_info->language = strdup(lang);
1196 iter_lang = g_slist_next(iter_lang);
1199 if (false == is_valid_lang) {
1200 if (NULL != g_config_info->language) {
1201 free(g_config_info->language);
1202 g_config_info->language = NULL;
1204 iter_lang = g_slist_nth(engine_info->languages, 0);
1205 if (NULL == iter_lang) {
1206 SLOG(LOG_ERROR, stt_tag(), "Fail to get default language");
1210 lang = iter_lang->data;
1212 g_config_info->language = strdup(lang);
1217 if (false == engine_info->support_silence_detection) {
1218 if (true == g_config_info->silence_detection)
1219 g_config_info->silence_detection = false;
1222 if (false == engine_info->need_credential) {
1223 if (true == g_config_info->credential)
1224 g_config_info->credential = false;
1227 is_valid_engine = true;
1231 if (true == is_valid_engine) {
1232 SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
1233 SLOG(LOG_DEBUG, stt_tag(), " Engine : %s", g_config_info->engine_id);
1234 SLOG(LOG_DEBUG, stt_tag(), " Setting : %s", g_config_info->setting);
1235 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
1236 SLOG(LOG_DEBUG, stt_tag(), " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
1237 SLOG(LOG_DEBUG, stt_tag(), " Credential : %s", g_config_info->credential ? "true" : "false");
1239 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
1240 g_config_info->silence_detection, g_config_info->credential)) {
1241 SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
1242 return STT_CONFIG_ERROR_OPERATION_FAILED;
1245 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine id is not valid");
1246 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1252 int stt_config_mgr_get_engine_agreement(const char* engine, char** agreement)
1254 if (0 >= g_slist_length(g_engine_list)) {
1255 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
1256 return STT_CONFIG_ERROR_INVALID_STATE;
1259 if (NULL == agreement) {
1260 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
1261 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1264 GSList *iter = NULL;
1265 stt_engine_info_s *engine_info = NULL;
1266 char* current_engine = NULL;
1268 if (NULL == engine) {
1269 current_engine = strdup(g_config_info->engine_id);
1270 if (NULL == current_engine) {
1271 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1272 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1275 current_engine = strdup(engine);
1276 if (NULL == current_engine) {
1277 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1278 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1282 /* Get a first item */
1283 iter = g_slist_nth(g_engine_list, 0);
1285 while (NULL != iter) {
1286 engine_info = iter->data;
1288 if (NULL == engine_info) {
1289 SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1290 if (NULL != current_engine) free(current_engine);
1291 return STT_CONFIG_ERROR_OPERATION_FAILED;
1294 if (0 != strcmp(current_engine, engine_info->uuid)) {
1295 iter = g_slist_next(iter);
1299 if (NULL != engine_info->agreement) {
1300 *agreement = strdup(engine_info->agreement);
1302 SLOG(LOG_WARN, stt_tag(), "[WARNING] engine agreement is not support");
1307 if (NULL != current_engine) free(current_engine);
1309 return STT_CONFIG_ERROR_NONE;
1312 int stt_config_mgr_get_language_list(const char* engine_id, stt_config_supported_langauge_cb callback, void* user_data)
1314 if (0 >= g_slist_length(g_config_client_list)) {
1315 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1316 return STT_CONFIG_ERROR_INVALID_STATE;
1319 if (0 >= g_slist_length(g_engine_list)) {
1320 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
1321 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1324 GSList *iter = NULL;
1325 stt_engine_info_s *engine_info = NULL;
1327 /* Get a first item */
1328 iter = g_slist_nth(g_engine_list, 0);
1330 while (NULL != iter) {
1331 engine_info = iter->data;
1333 if (NULL == engine_info) {
1334 SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1335 return STT_CONFIG_ERROR_OPERATION_FAILED;
1338 if (0 != strcmp(engine_id, engine_info->uuid)) {
1339 iter = g_slist_next(iter);
1343 GSList *iter_lang = NULL;
1346 /* Get a first item */
1347 iter_lang = g_slist_nth(engine_info->languages, 0);
1349 while (NULL != iter_lang) {
1350 /*Get handle data from list*/
1351 lang = iter_lang->data;
1354 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1355 if (false == callback(engine_info->uuid, lang, user_data))
1360 iter_lang = g_slist_next(iter_lang);
1365 return STT_CONFIG_ERROR_NONE;
1368 int stt_config_mgr_get_default_language(char** language)
1370 if (0 >= g_slist_length(g_config_client_list)) {
1371 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1372 return STT_CONFIG_ERROR_INVALID_STATE;
1375 if (NULL == language) {
1376 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1379 if (NULL != g_config_info->language) {
1380 *language = strdup(g_config_info->language);
1382 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1383 return STT_CONFIG_ERROR_OPERATION_FAILED;
1386 return STT_CONFIG_ERROR_NONE;
1389 int stt_config_mgr_set_default_language(const char* language)
1391 if (0 >= g_slist_length(g_config_client_list)) {
1392 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1393 return STT_CONFIG_ERROR_INVALID_STATE;
1396 if (NULL == language) {
1397 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1400 /* Check language is valid */
1401 if (NULL != g_config_info->language) {
1402 if (0 != stt_parser_set_language(language)) {
1403 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1404 return STT_CONFIG_ERROR_OPERATION_FAILED;
1406 free(g_config_info->language);
1407 g_config_info->language = strdup(language);
1409 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1410 return STT_CONFIG_ERROR_OPERATION_FAILED;
1413 return STT_CONFIG_ERROR_NONE;
1416 int stt_config_mgr_get_auto_language(bool* value)
1418 if (0 >= g_slist_length(g_config_client_list)) {
1419 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1420 return STT_CONFIG_ERROR_INVALID_STATE;
1423 if (NULL == value) {
1424 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1427 *value = g_config_info->auto_lang;
1429 return STT_CONFIG_ERROR_NONE;
1432 int stt_config_mgr_set_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 (g_config_info->auto_lang != value) {
1440 /* Check language is valid */
1441 if (0 != stt_parser_set_auto_lang(value)) {
1442 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1443 return STT_CONFIG_ERROR_OPERATION_FAILED;
1445 g_config_info->auto_lang = value;
1447 if (true == g_config_info->auto_lang) {
1448 __stt_config_set_auto_language();
1452 return STT_CONFIG_ERROR_NONE;
1455 int stt_config_mgr_get_silence_detection(bool* value)
1457 if (0 >= g_slist_length(g_config_client_list)) {
1458 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1459 return STT_CONFIG_ERROR_INVALID_STATE;
1463 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1465 *value = g_config_info->silence_detection;
1467 return STT_CONFIG_ERROR_NONE;
1470 int stt_config_mgr_set_silence_detection(bool value)
1472 if (0 >= g_slist_length(g_config_client_list)) {
1473 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1474 return STT_CONFIG_ERROR_INVALID_STATE;
1477 if (0 != stt_parser_set_silence_detection(value)) {
1478 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1479 return STT_CONFIG_ERROR_OPERATION_FAILED;
1482 g_config_info->silence_detection = value;
1484 return STT_CONFIG_ERROR_NONE;
1487 bool stt_config_check_default_engine_is_valid(const char* engine)
1489 if (0 >= g_slist_length(g_config_client_list)) {
1490 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1494 if (NULL == engine) {
1498 if (0 >= g_slist_length(g_engine_list))
1501 GSList *iter = NULL;
1502 stt_engine_info_s *engine_info = NULL;
1504 /* Get a first item */
1505 iter = g_slist_nth(g_engine_list, 0);
1507 while (NULL != iter) {
1508 engine_info = iter->data;
1510 if (NULL != engine_info) {
1511 if (0 == strcmp(engine, engine_info->uuid)) {
1515 iter = g_slist_next(iter);
1521 bool stt_config_check_default_language_is_valid(const char* language)
1523 if (0 >= g_slist_length(g_config_client_list)) {
1524 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1528 if (NULL == language) {
1532 if (NULL == g_config_info->engine_id) {
1533 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Default engine id is NULL");
1537 if (0 >= g_slist_length(g_engine_list))
1540 GSList *iter = NULL;
1541 stt_engine_info_s *engine_info = NULL;
1543 /* Get a first item */
1544 iter = g_slist_nth(g_engine_list, 0);
1546 while (NULL != iter) {
1547 engine_info = iter->data;
1549 if (NULL == engine_info) {
1550 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1551 iter = g_slist_next(iter);
1555 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1556 iter = g_slist_next(iter);
1560 GSList *iter_lang = NULL;
1563 /* Get a first item */
1564 iter_lang = g_slist_nth(engine_info->languages, 0);
1566 while (NULL != iter_lang) {
1567 lang = iter_lang->data;
1569 if (0 == strcmp(language, lang))
1573 iter_lang = g_slist_next(iter_lang);
1581 int __stt_config_mgr_print_engine_info()
1583 GSList *iter = NULL;
1584 stt_engine_info_s *engine_info = NULL;
1586 if (0 >= g_slist_length(g_engine_list)) {
1587 SLOG(LOG_DEBUG, stt_tag(), "-------------- engine list -----------------");
1588 SLOG(LOG_DEBUG, stt_tag(), " No Engine in engine directory");
1589 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1593 /* Get a first item */
1594 iter = g_slist_nth(g_engine_list, 0);
1596 SLOG(LOG_DEBUG, stt_tag(), "--------------- engine list -----------------");
1599 while (NULL != iter) {
1600 engine_info = iter->data;
1602 SLOG(LOG_DEBUG, stt_tag(), "[%dth]", i);
1603 SLOG(LOG_DEBUG, stt_tag(), " name : %s", engine_info->name);
1604 SLOG(LOG_DEBUG, stt_tag(), " id : %s", engine_info->uuid);
1605 SLOG(LOG_DEBUG, stt_tag(), " setting : %s", engine_info->setting);
1606 SLOG(LOG_DEBUG, stt_tag(), " agreement : %s", engine_info->agreement);
1608 SLOG(LOG_DEBUG, stt_tag(), " languages");
1609 GSList *iter_lang = NULL;
1611 if (g_slist_length(engine_info->languages) > 0) {
1612 /* Get a first item */
1613 iter_lang = g_slist_nth(engine_info->languages, 0);
1616 while (NULL != iter_lang) {
1617 /*Get handle data from list*/
1618 lang = iter_lang->data;
1620 SLOG(LOG_DEBUG, stt_tag(), " [%dth] %s", j, lang);
1623 iter_lang = g_slist_next(iter_lang);
1627 SLOG(LOG_ERROR, stt_tag(), " language is NONE");
1629 SLOG(LOG_DEBUG, stt_tag(), " silence support : %s",
1630 engine_info->support_silence_detection ? "true" : "false");
1631 iter = g_slist_next(iter);
1634 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1642 * time info functions
1644 static GSList* g_time_list = NULL;
1646 int stt_config_mgr_reset_time_info()
1648 /* Remove time info */
1649 GSList *iter = NULL;
1650 stt_result_time_info_s *data = NULL;
1652 /* Remove time info */
1653 iter = g_slist_nth(g_time_list, 0);
1654 while (NULL != iter) {
1657 g_time_list = g_slist_remove(g_time_list, data);
1659 if (NULL != data->text) {
1668 iter = g_slist_nth(g_time_list, 0);
1674 int stt_config_mgr_add_time_info(int index, int event, const char* text, long start_time, long end_time)
1677 SLOG(LOG_ERROR, stt_tag(), "Invalid paramter : text is NULL");
1681 stt_result_time_info_s *info = (stt_result_time_info_s*)calloc(1, sizeof(stt_result_time_info_s));
1683 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1684 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
1686 info->index = index;
1687 info->event = event;
1689 info->text = strdup(text);
1691 info->start_time = start_time;
1692 info->end_time = end_time;
1694 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);
1696 /* Add item to global list */
1697 g_time_list = g_slist_append(g_time_list, info);
1699 SLOG(LOG_DEBUG, stt_tag(), "[DEBUG] inside stt_config_mgr_add_time_info: g_time_list length(%d)", g_slist_length(g_time_list));
1704 int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* user_data)
1706 if (NULL == callback) {
1707 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input paramter is NULL : callback function");
1708 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1711 GSList* temp_time = NULL;
1713 ret = stt_parser_get_time_info(&temp_time);
1715 SLOG(LOG_WARN, stt_tag(), "[WARNING] Fail to get time info : %d", ret);
1716 return STT_CONFIG_ERROR_NONE;
1719 GSList *iter = NULL;
1720 stt_result_time_info_s *data = NULL;
1722 /* Get a first item */
1723 iter = g_slist_nth(temp_time, 0);
1724 while (NULL != iter) {
1727 if (false == callback(data->index, data->event, data->text,
1728 data->start_time, data->end_time, user_data)) {
1733 iter = g_slist_next(iter);
1736 /* Remove time info */
1737 iter = g_slist_nth(temp_time, 0);
1738 while (NULL != iter) {
1742 temp_time = g_slist_remove(temp_time, data);
1744 if (NULL != data->text) {
1753 iter = g_slist_nth(temp_time, 0);
1756 return STT_CONFIG_ERROR_NONE;
1759 int stt_config_mgr_save_time_info_file()
1761 if (0 == g_slist_length(g_time_list)) {
1762 SLOG(LOG_WARN, stt_tag(), "[WARNING] There is no time info to save");
1763 return STT_CONFIG_ERROR_OPERATION_FAILED;
1767 ret = stt_parser_set_time_info(g_time_list);
1769 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save time info : %d", ret);
1770 return STT_CONFIG_ERROR_OPERATION_FAILED;
1773 return STT_CONFIG_ERROR_NONE;
1776 int stt_config_mgr_remove_time_info_file()
1778 stt_parser_clear_time_info();
1780 return STT_CONFIG_ERROR_NONE;