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 static GSList* g_engine_list = NULL;
40 static GSList* g_config_client_list = NULL;
42 static stt_config_s* g_config_info;
44 static Ecore_Fd_Handler* g_fd_handler_noti = NULL;
48 int __stt_config_mgr_print_engine_info();
50 bool __stt_config_mgr_check_lang_is_valid(const char* engine_id, const char* language)
52 if (NULL == engine_id || NULL == language) {
53 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Input parameter is NULL");
58 stt_engine_info_s *engine_info = NULL;
60 if (0 >= g_slist_length(g_engine_list)) {
61 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] There is no engine!!");
65 /* Get a first item */
66 iter = g_slist_nth(g_engine_list, 0);
68 while (NULL != iter) {
69 engine_info = iter->data;
71 if (NULL == engine_info) {
72 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Engine info is NULL");
76 if (0 != strcmp(engine_id, engine_info->uuid)) {
77 iter = g_slist_next(iter);
81 GSList *iter_lang = NULL;
83 if (g_slist_length(engine_info->languages) > 0) {
84 /* Get a first item */
85 iter_lang = g_slist_nth(engine_info->languages, 0);
88 while (NULL != iter_lang) {
89 /*Get handle data from list*/
90 engine_lang = iter_lang->data;
92 SLOG(LOG_DEBUG, TAG_STTCONFIG, " [%dth] %s", i, engine_lang);
94 if (0 == strcmp(language, engine_lang)) {
99 iter_lang = g_slist_next(iter_lang);
109 int __stt_config_mgr_select_lang(const char* engine_id, char** language)
111 if (NULL == engine_id || NULL == language) {
112 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Input parameter is NULL");
113 return STT_CONFIG_ERROR_INVALID_PARAMETER;
117 stt_engine_info_s *engine_info = NULL;
119 if (0 >= g_slist_length(g_engine_list)) {
120 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] There is no engine!!");
121 return STT_CONFIG_ERROR_OPERATION_FAILED;
124 /* Get a first item */
125 iter = g_slist_nth(g_engine_list, 0);
127 while (NULL != iter) {
128 engine_info = iter->data;
130 if (NULL == engine_info) {
131 SLOG(LOG_ERROR, TAG_STTCONFIG, "engine info is NULL");
132 iter = g_slist_next(iter);
136 if (0 != strcmp(engine_id, engine_info->uuid)) {
137 iter = g_slist_next(iter);
141 if (NULL == engine_info->default_lang) {
142 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Default language of the engine info is NULL");
143 return STT_CONFIG_ERROR_INVALID_LANGUAGE;
146 *language = strdup(engine_info->default_lang);
148 if (NULL != *language) {
149 SLOG(LOG_DEBUG, TAG_STTCONFIG, "Selected language : %s", *language);
150 return STT_CONFIG_ERROR_NONE;
154 return STT_CONFIG_ERROR_OPERATION_FAILED;
157 Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
159 SLOG(LOG_DEBUG, TAG_STTCONFIG, "===== Config changed callback event");
162 struct inotify_event event;
163 memset(&event, '\0', sizeof(struct inotify_event));
165 length = read(g_fd_noti, &event, sizeof(struct inotify_event));
167 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Empty Inotify event"); //LCOV_EXCL_LINE
168 SLOG(LOG_DEBUG, TAG_STTCONFIG, "====="); //LCOV_EXCL_LINE
169 SLOG(LOG_DEBUG, TAG_STTCONFIG, " "); //LCOV_EXCL_LINE
170 return ECORE_CALLBACK_PASS_ON; //LCOV_EXCL_LINE
173 if (IN_MODIFY == event.mask) {
175 char* setting = NULL;
182 stt_config_client_s* temp_client = NULL;
184 if (0 != stt_parser_find_config_changed(&engine, &setting, &auto_lang, &lang, &silence, &credential))
185 return ECORE_CALLBACK_PASS_ON;
188 if (NULL != engine || NULL != setting) {
190 if (NULL != engine) {
191 if (NULL != g_config_info->engine_id) free(g_config_info->engine_id);
192 g_config_info->engine_id = strdup(engine);
195 if (NULL != setting) {
196 if (NULL != g_config_info->setting) free(g_config_info->setting);
197 g_config_info->setting = strdup(setting);
201 if (NULL != g_config_info->language) free(g_config_info->language);
202 g_config_info->language = strdup(lang);
205 if (-1 != silence) g_config_info->silence_detection = silence;
207 if (-1 != credential) g_config_info->credential = credential;
209 /* Call all callbacks of client*/
210 iter = g_slist_nth(g_config_client_list, 0);
212 while (NULL != iter) {
213 temp_client = iter->data;
215 if (NULL != temp_client) {
216 if (NULL != temp_client->engine_cb) {
217 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
218 g_config_info->silence_detection, g_config_info->credential, temp_client->user_data);
222 iter = g_slist_next(iter);
226 if (-1 != auto_lang) {
227 g_config_info->auto_lang = auto_lang;
230 /* Only language changed */
231 if (NULL == engine && NULL != lang) {
232 char* before_lang = NULL;
233 before_lang = strdup(g_config_info->language);
236 if (NULL != g_config_info->language) free(g_config_info->language);
237 g_config_info->language = strdup(lang);
240 /* Call all callbacks of client*/
241 iter = g_slist_nth(g_config_client_list, 0);
243 while (NULL != iter) {
244 temp_client = iter->data;
246 if (NULL != temp_client) {
247 if (NULL != temp_client->lang_cb) {
248 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
252 iter = g_slist_next(iter);
255 if (NULL != before_lang) {
261 /* silence detection changed */
262 g_config_info->silence_detection = silence;
264 /* Call all callbacks of client*/
265 iter = g_slist_nth(g_config_client_list, 0);
267 while (NULL != iter) {
268 temp_client = iter->data;
270 if (NULL != temp_client) {
271 if (NULL != temp_client->bool_cb) {
272 temp_client->bool_cb(STT_CONFIG_TYPE_OPTION_SILENCE_DETECTION, silence, temp_client->user_data);
276 iter = g_slist_next(iter);
280 if (NULL != engine) free(engine);
281 if (NULL != setting) free(setting);
282 if (NULL != lang) free(lang);
284 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Undefined event"); //LCOV_EXCL_LINE
287 SLOG(LOG_DEBUG, TAG_STTCONFIG, "=====");
288 SLOG(LOG_DEBUG, TAG_STTCONFIG, " ");
290 return ECORE_CALLBACK_PASS_ON;
293 int __stt_config_mgr_register_config_event()
295 /* get file notification handler */
301 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail get inotify fd"); //LCOV_EXCL_LINE
302 return -1; //LCOV_EXCL_LINE
306 wd = inotify_add_watch(fd, STT_CONFIG, IN_MODIFY);
309 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);
310 if (NULL == g_fd_handler_noti) {
311 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to get handler_noti"); //LCOV_EXCL_LINE
312 return -1; //LCOV_EXCL_LINE
318 int __stt_config_mgr_unregister_config_event()
320 /* delete inotify variable */
321 ecore_main_fd_handler_del(g_fd_handler_noti);
322 inotify_rm_watch(g_fd_noti, g_wd_noti);
328 int __stt_config_set_auto_language()
331 char candidate_lang[6] = {'\0', };
333 value = vconf_get_str(VCONFKEY_LANGSET);
335 SLOG(LOG_ERROR, TAG_STTCONFIG, "[Config ERROR] Fail to get display language"); //LCOV_EXCL_LINE
339 strncpy(candidate_lang, value, 5);
342 /* Check current config info */
343 if (NULL == g_config_info) {
344 SLOG(LOG_ERROR, TAG_STTCONFIG, "Current config info is NULL"); //LCOV_EXCL_LINE
345 return STT_CONFIG_ERROR_OPERATION_FAILED;
348 /* Check current language */
349 if (NULL == g_config_info->language) {
350 SLOG(LOG_ERROR, TAG_STTCONFIG, "Current config language is NULL"); //LCOV_EXCL_LINE
351 return STT_CONFIG_ERROR_OPERATION_FAILED;
354 if (0 == strncmp(g_config_info->language, candidate_lang, 5)) {
355 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[Config] Language is auto. STT language(%s) is same with display lang", g_config_info->language);
358 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[Config] Display language : %s", candidate_lang); //LCOV_EXCL_LINE
361 if (true == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, candidate_lang)) {
362 char* before_lang = NULL;
363 if (0 != stt_parser_set_language(candidate_lang)) {
364 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to save default language");
368 before_lang = strdup(g_config_info->language);
370 free(g_config_info->language);
371 g_config_info->language = strdup(candidate_lang);
373 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[Config] Language is auto. Set default language(%s)", g_config_info->language);
375 /* Call all callbacks of client*/
377 stt_config_client_s* temp_client = NULL;
379 iter = g_slist_nth(g_config_client_list, 0);
381 while (NULL != iter) {
382 temp_client = iter->data;
384 if (NULL != temp_client) {
385 if (NULL != temp_client->lang_cb) {
386 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
390 iter = g_slist_next(iter);
393 if (NULL != before_lang) {
398 /* Candidate language is not valid */
399 char* tmp_language = NULL;
400 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
401 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to select language");
405 if (NULL == tmp_language) {
406 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Selected language is NULL");
410 if (0 != stt_parser_set_language(tmp_language)) {
413 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to save config");
417 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "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, TAG_STTCONFIG, "Input parameter is NULL"); //LCOV_EXCL_LINE
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, TAG_STTCONFIG, "There is no engine!!"); //LCOV_EXCL_LINE
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, TAG_STTCONFIG, "engine info is NULL"); //LCOV_EXCL_LINE
536 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
539 if (0 == strcmp(engine_id, engine_info->uuid)) {
540 SLOG(LOG_DEBUG, TAG_STTCONFIG, "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, TAG_STTCONFIG, "Operation failed - false engine"); //LCOV_EXCL_LINE
551 return STT_CONFIG_ERROR_OPERATION_FAILED;
554 engine_info = iter->data;
555 if (NULL == engine_info) {
556 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Engine info is NULL"); //LCOV_EXCL_LINE
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, TAG_STTCONFIG, "[ERROR] Empty supported language"); //LCOV_EXCL_LINE
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, TAG_STTCONFIG, " %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;
626 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[Config] Engine changed");
627 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Engine : %s", g_config_info->engine_id);
628 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Setting : %s", g_config_info->setting);
629 SLOG(LOG_DEBUG, TAG_STTCONFIG, " language : %s", g_config_info->language);
630 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
631 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Credential : %s", g_config_info->credential ? "true" : "false");
634 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
635 g_config_info->silence_detection, g_config_info->credential)) {
636 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to save config"); //LCOV_EXCL_LINE
637 return STT_CONFIG_ERROR_OPERATION_FAILED;
640 return STT_CONFIG_ERROR_NONE;
643 static void __get_engine_list(const char* directory)
646 struct dirent *dirp = NULL;
648 if (NULL == directory) {
649 SLOG(LOG_ERROR, TAG_STTCONFIG, "[Directory ERROR] Directory is NULL"); //LCOV_EXCL_LINE
652 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[Directory DEBUG] Directory: %s", directory);
655 dp = opendir(directory);
661 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
664 stt_engine_info_s* info;
665 char* filepath = NULL;
668 filesize = strlen(directory) + strlen(dirp->d_name) + 5;
669 filepath = (char*)calloc(filesize, sizeof(char));
671 if (NULL != filepath) {
672 snprintf(filepath, filesize, "%s/%s", directory, dirp->d_name);
674 SLOG(LOG_ERROR, TAG_STTCONFIG, "[Config ERROR] Memory not enough!!"); //LCOV_EXCL_LINE
678 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[File DEBUG] File path: %s", filepath);
680 if (0 == stt_parser_get_engine_info(filepath, &info)) {
681 g_engine_list = g_slist_append(g_engine_list, info);
684 if (NULL != filepath) {
689 } while (NULL != dirp);
693 SLOG(LOG_WARN, TAG_STTCONFIG, "[Config WARNING] Fail to open directory");
699 int stt_config_mgr_initialize(int uid)
703 stt_config_client_s* temp_client = NULL;
705 if (0 < g_slist_length(g_config_client_list)) {
707 iter = g_slist_nth(g_config_client_list, 0);
709 while (NULL != iter) {
710 get_uid = iter->data;
712 if (uid == *get_uid) {
713 SLOG(LOG_WARN, TAG_STTCONFIG, "[CONFIG] uid(%d) has already registered", uid);
717 iter = g_slist_next(iter);
720 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
721 if (NULL == temp_client) {
722 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory");
723 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
725 temp_client->uid = uid;
726 temp_client->bool_cb = NULL;
727 temp_client->engine_cb = NULL;
728 temp_client->lang_cb = NULL;
729 temp_client->user_data = NULL;
732 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
734 SLOG(LOG_WARN, TAG_STTCONFIG, "[CONFIG] Add uid(%d) but config has already initialized", uid);
735 return STT_CONFIG_ERROR_NONE;
738 /* Make directories */
739 if (0 != access(STT_CONFIG_BASE, F_OK)) {
740 if (0 != mkdir(STT_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
741 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to make directory : %s", STT_CONFIG_BASE);
742 __stt_config_release_client(uid);
743 return STT_CONFIG_ERROR_OPERATION_FAILED;
745 SLOG(LOG_DEBUG, TAG_STTCONFIG, "Success to make directory : %s", STT_CONFIG_BASE);
749 if (0 != access(STT_HOME, F_OK)) {
750 if (0 != mkdir(STT_HOME, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
751 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to make directory : %s", STT_HOME);
752 __stt_config_release_client(uid);
753 return STT_CONFIG_ERROR_OPERATION_FAILED;
755 SLOG(LOG_DEBUG, TAG_STTCONFIG, "Success to make directory : %s", STT_HOME);
759 if (0 != access(STT_DOWNLOAD_BASE, F_OK)) {
760 if (0 != mkdir(STT_DOWNLOAD_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
761 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to make directory : %s", STT_DOWNLOAD_BASE);
762 __stt_config_release_client(uid);
763 return STT_CONFIG_ERROR_OPERATION_FAILED;
765 SLOG(LOG_DEBUG, TAG_STTCONFIG, "Success to make directory : %s", STT_DOWNLOAD_BASE);
769 if (0 != access(STT_DOWNLOAD_ENGINE_INFO, F_OK)) {
770 if (0 != mkdir(STT_DOWNLOAD_ENGINE_INFO, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
771 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to make directory : %s", STT_DOWNLOAD_ENGINE_INFO);
772 __stt_config_release_client(uid);
773 return STT_CONFIG_ERROR_OPERATION_FAILED;
775 SLOG(LOG_DEBUG, TAG_STTCONFIG, "Success to make directory : %s", STT_DOWNLOAD_ENGINE_INFO);
780 /* Get file name from default engine directory */
781 g_engine_list = NULL;
783 SLOG(LOG_WARN, TAG_STTCONFIG, "[CONFIG] default engine info(%s)", STT_DEFAULT_ENGINE_INFO);
785 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[CONFIG] Get default engine list");
786 __get_engine_list(STT_DEFAULT_ENGINE_INFO);
787 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[CONFIG] Get download engine list");
788 __get_engine_list(STT_DOWNLOAD_ENGINE_INFO);
790 __stt_config_mgr_print_engine_info();
792 if (0 != stt_parser_load_config(&g_config_info)) {
793 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to parse configure information");
794 __stt_config_release_client(uid);
795 __stt_config_release_engine();
796 return STT_CONFIG_ERROR_OPERATION_FAILED;
799 /* Check whether engine id is valid */
800 if (0 != __stt_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
801 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to get default engine");
802 __stt_config_release_client(uid);
803 __stt_config_release_engine();
804 stt_parser_unload_config(g_config_info);
805 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
808 if (true == g_config_info->auto_lang) {
809 /* Check language with display language */
810 __stt_config_set_auto_language();
812 if (false == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language)) {
813 /* Default language is not valid */
815 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
816 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to select language");
817 __stt_config_release_client(uid);
818 __stt_config_release_engine();
819 stt_parser_unload_config(g_config_info);
820 return STT_CONFIG_ERROR_OPERATION_FAILED;
823 if (NULL != tmp_language) {
824 if (NULL != g_config_info->language) {
825 free(g_config_info->language);
826 g_config_info->language = strdup(tmp_language);
834 /* print stt-service config */
835 SLOG(LOG_DEBUG, TAG_STTCONFIG, "== STT service config ==");
836 SLOG(LOG_DEBUG, TAG_STTCONFIG, " engine : %s", g_config_info->engine_id);
837 SLOG(LOG_DEBUG, TAG_STTCONFIG, " setting : %s", g_config_info->setting);
838 SLOG(LOG_DEBUG, TAG_STTCONFIG, " auto language : %s", g_config_info->auto_lang ? "on" : "off");
839 SLOG(LOG_DEBUG, TAG_STTCONFIG, " language : %s", g_config_info->language);
840 SLOG(LOG_DEBUG, TAG_STTCONFIG, " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
841 SLOG(LOG_DEBUG, TAG_STTCONFIG, " credential : %s", g_config_info->credential ? "true" : "false");
842 SLOG(LOG_DEBUG, TAG_STTCONFIG, "===================");
844 if (0 != __stt_config_mgr_register_config_event()) {
845 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to register config event");
846 __stt_config_release_client(uid);
847 __stt_config_release_engine();
848 stt_parser_unload_config(g_config_info);
849 return STT_CONFIG_ERROR_OPERATION_FAILED;
852 /* Register to detect display language change */
853 vconf_notify_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb, NULL);
855 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
856 if (NULL == temp_client) {
857 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE
858 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
860 temp_client->uid = uid;
861 temp_client->bool_cb = NULL;
862 temp_client->engine_cb = NULL;
863 temp_client->lang_cb = NULL;
864 temp_client->user_data = NULL;
867 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
869 return STT_CONFIG_ERROR_NONE;
872 int stt_config_mgr_finalize(int uid)
875 stt_config_client_s* temp_client = NULL;
877 if (0 < g_slist_length(g_config_client_list)) {
879 iter = g_slist_nth(g_config_client_list, 0);
881 while (NULL != iter) {
882 temp_client = iter->data;
884 if (NULL != temp_client) {
885 if (uid == temp_client->uid) {
886 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
893 iter = g_slist_next(iter);
897 if (0 < g_slist_length(g_config_client_list)) {
898 SLOG(LOG_DEBUG, TAG_STTCONFIG, "Client count (%d)", g_slist_length(g_config_client_list)); //LCOV_EXCL_LINE
899 return STT_CONFIG_ERROR_NONE;
902 stt_engine_info_s *engine_info = NULL;
904 if (0 < g_slist_length(g_engine_list)) {
906 /* Get a first item */
907 iter = g_slist_nth(g_engine_list, 0);
909 while (NULL != iter) {
910 engine_info = iter->data;
912 if (NULL != engine_info) {
913 g_engine_list = g_slist_remove(g_engine_list, engine_info);
915 stt_parser_free_engine_info(engine_info);
918 iter = g_slist_nth(g_engine_list, 0);
922 vconf_ignore_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb);
924 __stt_config_mgr_unregister_config_event();
926 if (NULL != g_config_info) {
927 stt_parser_unload_config(g_config_info);
928 g_config_info = NULL;
931 return STT_CONFIG_ERROR_NONE;
934 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)
937 stt_config_client_s* temp_client = NULL;
939 /* Call all callbacks of client*/
940 iter = g_slist_nth(g_config_client_list, 0);
942 while (NULL != iter) {
943 temp_client = iter->data;
945 if (NULL != temp_client) {
946 if (uid == temp_client->uid) {
947 temp_client->engine_cb = engine_cb;
948 temp_client->lang_cb = lang_cb;
949 temp_client->bool_cb = bool_cb;
950 temp_client->user_data = user_data;
954 iter = g_slist_next(iter);
957 return STT_CONFIG_ERROR_NONE;
961 int stt_config_mgr_unset_callback(int uid)
964 stt_config_client_s* temp_client = NULL;
966 /* Call all callbacks of client*/
967 iter = g_slist_nth(g_config_client_list, 0);
969 while (NULL != iter) {
970 temp_client = iter->data;
972 if (NULL != temp_client) {
973 if (uid == temp_client->uid) {
974 temp_client->engine_cb = NULL;
975 temp_client->lang_cb = NULL;
976 temp_client->bool_cb = NULL;
977 temp_client->user_data = NULL;
981 iter = g_slist_next(iter);
984 return STT_CONFIG_ERROR_NONE;
988 int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void* user_data)
990 if (0 >= g_slist_length(g_config_client_list)) {
991 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
992 return STT_CONFIG_ERROR_INVALID_STATE;
995 if (NULL == callback) {
996 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1000 stt_engine_info_s *engine_info = NULL;
1002 if (0 >= g_slist_length(g_engine_list)) {
1003 SLOG(LOG_WARN, TAG_STTCONFIG, "[ERROR] Engine list is NULL");
1004 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1007 /* Get a first item */
1008 iter = g_slist_nth(g_engine_list, 0);
1010 while (NULL != iter) {
1011 engine_info = iter->data;
1013 if (NULL == engine_info) {
1014 SLOG(LOG_ERROR, TAG_STTCONFIG, " Engine info is NULL");
1015 return STT_CONFIG_ERROR_OPERATION_FAILED;
1018 if (false == callback(engine_info->uuid, engine_info->name,
1019 engine_info->setting, engine_info->support_silence_detection, user_data)) {
1023 iter = g_slist_next(iter);
1026 return STT_CONFIG_ERROR_NONE;
1029 int stt_config_mgr_get_engine(char** engine)
1031 if (0 >= g_slist_length(g_config_client_list)) {
1032 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized"); //LCOV_EXCL_LINE
1033 return STT_CONFIG_ERROR_INVALID_STATE;
1036 if (NULL == engine) {
1037 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1040 if (NULL != g_config_info->engine_id) {
1041 *engine = strdup(g_config_info->engine_id);
1043 SLOG(LOG_ERROR, TAG_STTCONFIG, " Engine id is NULL"); //LCOV_EXCL_LINE
1045 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1048 return STT_CONFIG_ERROR_NONE;
1052 int __stt_config_set_buxtonkey(const char* engine)
1055 struct buxton_client * bux_cli;
1056 struct buxton_layer * bux_layer;
1057 struct buxton_value * bux_val;
1059 int ret = buxton_open(&bux_cli, NULL, NULL);
1061 SLOG(LOG_ERROR, TAG_STTCONFIG, "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
1062 return STT_CONFIG_ERROR_OPERATION_FAILED;
1064 bux_layer = buxton_create_layer("system");
1065 if (NULL == bux_layer) {
1066 SLOG(LOG_ERROR, TAG_STTCONFIG, "[DBUS-BUXTON2] buxton_create_layer FAIL");
1067 buxton_close(bux_cli);
1069 return STT_CONFIG_ERROR_OPERATION_FAILED;
1071 bux_val = buxton_value_create_string(engine);
1072 if (NULL == bux_val) {
1073 SLOG(LOG_ERROR, TAG_STTCONFIG, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
1074 buxton_free_layer(bux_layer);
1075 buxton_close(bux_cli);
1078 return STT_CONFIG_ERROR_OPERATION_FAILED;
1080 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
1083 ret = buxton_set_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, bux_val);
1085 SLOG(LOG_ERROR, TAG_STTCONFIG, "[DBUS-BUXTON2] Fail to set value sync, ret(%d)", ret);
1086 buxton_value_free(bux_val);
1087 buxton_free_layer(bux_layer);
1088 buxton_close(bux_cli);
1093 return STT_CONFIG_ERROR_OPERATION_FAILED;
1095 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[DBUS-BUXTON2] buxton_set_value_sync: %s", STT_ENGINE_DB_DEFAULT);
1097 buxton_value_free(bux_val);
1098 buxton_free_layer(bux_layer);
1099 buxton_close(bux_cli);
1105 return STT_CONFIG_ERROR_NONE;
1108 int stt_config_mgr_set_engine(const char* engine)
1110 if (0 >= g_slist_length(g_config_client_list)) {
1111 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1112 return STT_CONFIG_ERROR_INVALID_STATE;
1115 if (NULL == g_config_info) {
1116 return STT_CONFIG_ERROR_OPERATION_FAILED;
1119 if (NULL == engine || NULL == g_config_info->engine_id) {
1120 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1123 /* Check current engine id with new engine id */
1124 if (0 == strcmp(g_config_info->engine_id, engine)) {
1128 SLOG(LOG_DEBUG, TAG_STTCONFIG, "New engine id : %s", engine);
1130 int ret = __stt_config_set_buxtonkey(engine);
1132 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] set buxtonkey Failed!!!");
1136 GSList *iter = NULL;
1137 stt_engine_info_s *engine_info = NULL;
1138 bool is_valid_engine = false;
1140 /* Get a first item */
1141 iter = g_slist_nth(g_engine_list, 0);
1143 while (NULL != iter) {
1144 engine_info = iter->data;
1146 if (NULL == engine_info) {
1147 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Engine info is NULL");
1148 iter = g_slist_next(iter);
1152 /* Check engine id is valid */
1153 if (0 != strcmp(engine, engine_info->uuid)) {
1154 iter = g_slist_next(iter);
1158 if (NULL != g_config_info->engine_id) {
1159 free(g_config_info->engine_id);
1160 g_config_info->engine_id = NULL;
1163 g_config_info->engine_id = strdup(engine);
1165 if (NULL != g_config_info->setting) {
1166 free(g_config_info->setting);
1167 g_config_info->setting = NULL;
1170 if (NULL != engine_info->setting) {
1171 g_config_info->setting = strdup(engine_info->setting);
1173 g_config_info->setting = NULL;
1176 /* Engine is valid*/
1177 GSList *iter_lang = NULL;
1179 bool is_valid_lang = false;
1181 /* Get a first item */
1182 iter_lang = g_slist_nth(engine_info->languages, 0);
1184 while (NULL != iter_lang) {
1185 /*Get handle data from list*/
1186 lang = iter_lang->data;
1188 SLOG(LOG_DEBUG, TAG_STTCONFIG, " %s", lang);
1189 if (NULL != lang && NULL != g_config_info->language) {
1190 if (0 == strcmp(lang, g_config_info->language)) {
1191 /* language is valid */
1192 is_valid_lang = true;
1194 free(g_config_info->language);
1195 g_config_info->language = strdup(lang);
1202 iter_lang = g_slist_next(iter_lang);
1205 if (false == is_valid_lang) {
1206 if (NULL != g_config_info->language) {
1207 free(g_config_info->language);
1208 g_config_info->language = NULL;
1210 iter_lang = g_slist_nth(engine_info->languages, 0);
1211 if (NULL == iter_lang) {
1212 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to get default language");
1216 lang = iter_lang->data;
1218 g_config_info->language = strdup(lang);
1223 if (false == engine_info->support_silence_detection) {
1224 if (true == g_config_info->silence_detection)
1225 g_config_info->silence_detection = false;
1228 if (false == engine_info->need_credential) {
1229 if (true == g_config_info->credential)
1230 g_config_info->credential = false;
1233 is_valid_engine = true;
1237 if (true == is_valid_engine) {
1238 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[Config] Engine changed");
1239 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Engine : %s", g_config_info->engine_id);
1240 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Setting : %s", g_config_info->setting);
1241 SLOG(LOG_DEBUG, TAG_STTCONFIG, " language : %s", g_config_info->language);
1242 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
1243 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Credential : %s", g_config_info->credential ? "true" : "false");
1245 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
1246 g_config_info->silence_detection, g_config_info->credential)) {
1247 SLOG(LOG_ERROR, TAG_STTCONFIG, " Fail to save config");
1248 return STT_CONFIG_ERROR_OPERATION_FAILED;
1251 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Engine id is not valid");
1252 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1258 int stt_config_mgr_get_engine_agreement(const char* engine, char** agreement)
1260 if (0 >= g_slist_length(g_engine_list)) {
1261 SLOG(LOG_ERROR, TAG_STTCONFIG, "There is no engine");
1262 return STT_CONFIG_ERROR_INVALID_STATE;
1265 if (NULL == agreement) {
1266 SLOG(LOG_ERROR, TAG_STTCONFIG, "Input parameter is NULL");
1267 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1270 GSList *iter = NULL;
1271 stt_engine_info_s *engine_info = NULL;
1272 char* current_engine = NULL;
1274 if (NULL == engine) {
1275 current_engine = strdup(g_config_info->engine_id);
1276 if (NULL == current_engine) {
1277 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory");
1278 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1281 current_engine = strdup(engine);
1282 if (NULL == current_engine) {
1283 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory");
1284 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1288 /* Get a first item */
1289 iter = g_slist_nth(g_engine_list, 0);
1291 while (NULL != iter) {
1292 engine_info = iter->data;
1294 if (NULL == engine_info) {
1295 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] engine info is NULL");
1296 if (NULL != current_engine) free(current_engine);
1297 return STT_CONFIG_ERROR_OPERATION_FAILED;
1300 if (0 != strcmp(current_engine, engine_info->uuid)) {
1301 iter = g_slist_next(iter);
1305 if (NULL != engine_info->agreement) {
1306 *agreement = strdup(engine_info->agreement);
1308 SLOG(LOG_WARN, TAG_STTCONFIG, "[WARNING] engine agreement is not support");
1313 if (NULL != current_engine) free(current_engine);
1315 return STT_CONFIG_ERROR_NONE;
1319 int stt_config_mgr_get_language_list(const char* engine_id, stt_config_supported_langauge_cb callback, void* user_data)
1321 if (0 >= g_slist_length(g_config_client_list)) {
1322 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized"); //LCOV_EXCL_LINE
1323 return STT_CONFIG_ERROR_INVALID_STATE;
1326 if (0 >= g_slist_length(g_engine_list)) {
1327 SLOG(LOG_ERROR, TAG_STTCONFIG, "There is no engine"); //LCOV_EXCL_LINE
1328 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1331 GSList *iter = NULL;
1332 stt_engine_info_s *engine_info = NULL;
1334 /* Get a first item */
1335 iter = g_slist_nth(g_engine_list, 0);
1337 while (NULL != iter) {
1338 engine_info = iter->data;
1340 if (NULL == engine_info) {
1341 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] engine info is NULL"); //LCOV_EXCL_LINE
1342 return STT_CONFIG_ERROR_OPERATION_FAILED;
1345 if (0 != strcmp(engine_id, engine_info->uuid)) {
1346 iter = g_slist_next(iter);
1350 GSList *iter_lang = NULL;
1353 /* Get a first item */
1354 iter_lang = g_slist_nth(engine_info->languages, 0);
1356 while (NULL != iter_lang) {
1357 /*Get handle data from list*/
1358 lang = iter_lang->data;
1361 SLOG(LOG_DEBUG, TAG_STTCONFIG, " %s", lang);
1362 if (false == callback(engine_info->uuid, lang, user_data))
1367 iter_lang = g_slist_next(iter_lang);
1372 return STT_CONFIG_ERROR_NONE;
1375 int stt_config_mgr_get_default_language(char** language)
1377 if (0 >= g_slist_length(g_config_client_list)) {
1378 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized"); //LCOV_EXCL_LINE
1379 return STT_CONFIG_ERROR_INVALID_STATE;
1382 if (NULL == language) {
1383 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1386 if (NULL != g_config_info->language) {
1387 *language = strdup(g_config_info->language);
1389 SLOG(LOG_ERROR, TAG_STTCONFIG, " language is NULL"); //LCOV_EXCL_LINE
1390 return STT_CONFIG_ERROR_OPERATION_FAILED;
1393 return STT_CONFIG_ERROR_NONE;
1397 int stt_config_mgr_set_default_language(const char* language)
1399 if (0 >= g_slist_length(g_config_client_list)) {
1400 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1401 return STT_CONFIG_ERROR_INVALID_STATE;
1404 if (NULL == language) {
1405 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1408 /* Check language is valid */
1409 if (NULL != g_config_info->language) {
1410 if (0 != stt_parser_set_language(language)) {
1411 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to save engine id");
1412 return STT_CONFIG_ERROR_OPERATION_FAILED;
1414 free(g_config_info->language);
1415 g_config_info->language = strdup(language);
1417 SLOG(LOG_ERROR, TAG_STTCONFIG, " language is NULL");
1418 return STT_CONFIG_ERROR_OPERATION_FAILED;
1421 return STT_CONFIG_ERROR_NONE;
1424 int stt_config_mgr_get_auto_language(bool* value)
1426 if (0 >= g_slist_length(g_config_client_list)) {
1427 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1428 return STT_CONFIG_ERROR_INVALID_STATE;
1431 if (NULL == value) {
1432 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1435 *value = g_config_info->auto_lang;
1437 return STT_CONFIG_ERROR_NONE;
1440 int stt_config_mgr_set_auto_language(bool value)
1442 if (0 >= g_slist_length(g_config_client_list)) {
1443 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1444 return STT_CONFIG_ERROR_INVALID_STATE;
1447 if (g_config_info->auto_lang != value) {
1448 /* Check language is valid */
1449 if (0 != stt_parser_set_auto_lang(value)) {
1450 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to save engine id");
1451 return STT_CONFIG_ERROR_OPERATION_FAILED;
1453 g_config_info->auto_lang = value;
1455 if (true == g_config_info->auto_lang) {
1456 __stt_config_set_auto_language();
1460 return STT_CONFIG_ERROR_NONE;
1463 int stt_config_mgr_get_silence_detection(bool* value)
1465 if (0 >= g_slist_length(g_config_client_list)) {
1466 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1467 return STT_CONFIG_ERROR_INVALID_STATE;
1471 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1473 *value = g_config_info->silence_detection;
1475 return STT_CONFIG_ERROR_NONE;
1478 int stt_config_mgr_set_silence_detection(bool value)
1480 if (0 >= g_slist_length(g_config_client_list)) {
1481 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1482 return STT_CONFIG_ERROR_INVALID_STATE;
1485 if (0 != stt_parser_set_silence_detection(value)) {
1486 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to save engine id");
1487 return STT_CONFIG_ERROR_OPERATION_FAILED;
1490 g_config_info->silence_detection = value;
1492 return STT_CONFIG_ERROR_NONE;
1495 bool stt_config_check_default_engine_is_valid(const char* engine)
1497 if (0 >= g_slist_length(g_config_client_list)) {
1498 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1502 if (NULL == engine) {
1506 if (0 >= g_slist_length(g_engine_list))
1509 GSList *iter = NULL;
1510 stt_engine_info_s *engine_info = NULL;
1512 /* Get a first item */
1513 iter = g_slist_nth(g_engine_list, 0);
1515 while (NULL != iter) {
1516 engine_info = iter->data;
1518 if (NULL != engine_info && NULL != engine_info->uuid) {
1519 if (0 == strcmp(engine, engine_info->uuid)) {
1523 iter = g_slist_next(iter);
1529 bool stt_config_check_default_language_is_valid(const char* language)
1531 if (0 >= g_slist_length(g_config_client_list)) {
1532 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1536 if (NULL == language) {
1540 if (NULL == g_config_info->engine_id) {
1541 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Default engine id is NULL");
1545 if (0 >= g_slist_length(g_engine_list))
1548 GSList *iter = NULL;
1549 stt_engine_info_s *engine_info = NULL;
1551 /* Get a first item */
1552 iter = g_slist_nth(g_engine_list, 0);
1554 while (NULL != iter) {
1555 engine_info = iter->data;
1557 if (NULL == engine_info) {
1558 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Engine info is NULL");
1559 iter = g_slist_next(iter);
1563 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1564 iter = g_slist_next(iter);
1568 GSList *iter_lang = NULL;
1571 /* Get a first item */
1572 iter_lang = g_slist_nth(engine_info->languages, 0);
1574 while (NULL != iter_lang) {
1575 lang = iter_lang->data;
1577 if (0 == strcmp(language, lang))
1581 iter_lang = g_slist_next(iter_lang);
1590 int __stt_config_mgr_print_engine_info()
1592 GSList *iter = NULL;
1593 stt_engine_info_s *engine_info = NULL;
1595 if (0 >= g_slist_length(g_engine_list)) {
1596 SLOG(LOG_DEBUG, TAG_STTCONFIG, "-------------- engine list -----------------"); //LCOV_EXCL_LINE
1597 SLOG(LOG_DEBUG, TAG_STTCONFIG, " No Engine in engine directory"); //LCOV_EXCL_LINE
1598 SLOG(LOG_DEBUG, TAG_STTCONFIG, "--------------------------------------------"); //LCOV_EXCL_LINE
1602 /* Get a first item */
1603 iter = g_slist_nth(g_engine_list, 0);
1605 SLOG(LOG_DEBUG, TAG_STTCONFIG, "--------------- engine list -----------------");
1608 while (NULL != iter) {
1609 engine_info = iter->data;
1611 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[%dth]", i);
1612 SLOG(LOG_DEBUG, TAG_STTCONFIG, " name : %s", engine_info->name);
1613 SLOG(LOG_DEBUG, TAG_STTCONFIG, " id : %s", engine_info->uuid);
1614 SLOG(LOG_DEBUG, TAG_STTCONFIG, " setting : %s", engine_info->setting);
1615 SLOG(LOG_DEBUG, TAG_STTCONFIG, " agreement : %s", engine_info->agreement);
1617 SLOG(LOG_DEBUG, TAG_STTCONFIG, " languages");
1618 GSList *iter_lang = NULL;
1620 if (g_slist_length(engine_info->languages) > 0) {
1621 /* Get a first item */
1622 iter_lang = g_slist_nth(engine_info->languages, 0);
1625 while (NULL != iter_lang) {
1626 /*Get handle data from list*/
1627 lang = iter_lang->data;
1629 SLOG(LOG_DEBUG, TAG_STTCONFIG, " [%dth] %s", j, lang);
1632 iter_lang = g_slist_next(iter_lang);
1636 SLOG(LOG_ERROR, TAG_STTCONFIG, " language is NONE"); //LCOV_EXCL_LINE
1638 SLOG(LOG_DEBUG, TAG_STTCONFIG, " silence support : %s",
1639 engine_info->support_silence_detection ? "true" : "false");
1640 iter = g_slist_next(iter);
1643 SLOG(LOG_DEBUG, TAG_STTCONFIG, "--------------------------------------------");
1651 * time info functions
1653 static GSList* g_time_list = NULL;
1656 int stt_config_mgr_reset_time_info()
1658 /* Remove time info */
1659 GSList *iter = NULL;
1660 stt_result_time_info_s *data = NULL;
1662 /* Remove time info */
1663 iter = g_slist_nth(g_time_list, 0);
1664 while (NULL != iter) {
1667 g_time_list = g_slist_remove(g_time_list, data);
1669 if (NULL != data->text) {
1678 iter = g_slist_nth(g_time_list, 0);
1684 int stt_config_mgr_add_time_info(int index, int event, const char* text, long start_time, long end_time)
1687 SLOG(LOG_ERROR, TAG_STTCONFIG, "Invalid parameter : text is NULL");
1691 stt_result_time_info_s *info = (stt_result_time_info_s*)calloc(1, sizeof(stt_result_time_info_s));
1693 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory");
1694 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
1696 info->index = index;
1697 info->event = event;
1699 info->text = strdup(text);
1701 info->start_time = start_time;
1702 info->end_time = end_time;
1704 SECURE_SLOG(LOG_DEBUG, TAG_STTCONFIG, "[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);
1706 /* Add item to global list */
1707 g_time_list = g_slist_append(g_time_list, info);
1709 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[DEBUG] inside stt_config_mgr_add_time_info: g_time_list length(%d)", g_slist_length(g_time_list));
1715 int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* user_data)
1717 if (NULL == callback) {
1718 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Input parameter is NULL : callback function"); //LCOV_EXCL_LINE
1719 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1722 GSList* temp_time = NULL;
1724 ret = stt_parser_get_time_info(&temp_time);
1726 SLOG(LOG_WARN, TAG_STTCONFIG, "[WARNING] Fail to get time info : %d", ret); //LCOV_EXCL_LINE
1727 return STT_CONFIG_ERROR_NONE;
1730 GSList *iter = NULL;
1731 stt_result_time_info_s *data = NULL;
1733 /* Get a first item */
1734 iter = g_slist_nth(temp_time, 0);
1735 while (NULL != iter) {
1738 if (false == callback(data->index, data->event, data->text,
1739 data->start_time, data->end_time, user_data)) {
1744 iter = g_slist_next(iter);
1747 /* Remove time info */
1748 iter = g_slist_nth(temp_time, 0);
1749 while (NULL != iter) {
1753 temp_time = g_slist_remove(temp_time, data);
1755 if (NULL != data->text) {
1764 iter = g_slist_nth(temp_time, 0);
1767 return STT_CONFIG_ERROR_NONE;
1771 int stt_config_mgr_save_time_info_file()
1773 if (0 == g_slist_length(g_time_list)) {
1774 SLOG(LOG_WARN, TAG_STTCONFIG, "[WARNING] There is no time info to save");
1775 return STT_CONFIG_ERROR_OPERATION_FAILED;
1779 ret = stt_parser_set_time_info(g_time_list);
1781 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to save time info : %d", ret);
1782 return STT_CONFIG_ERROR_OPERATION_FAILED;
1785 return STT_CONFIG_ERROR_NONE;
1788 int stt_config_mgr_remove_time_info_file()
1790 stt_parser_clear_time_info();
1792 return STT_CONFIG_ERROR_NONE;