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(unsigned 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(unsigned int uid)
701 stt_config_client_s* new_client = NULL;
703 if (0 < g_slist_length(g_config_client_list)) {
705 GSList *iter = g_slist_nth(g_config_client_list, 0);
707 while (NULL != iter) {
708 stt_config_client_s* client = (stt_config_client_s*)iter->data;
710 if (NULL != client && uid == client->uid) {
711 SLOG(LOG_WARN, TAG_STTCONFIG, "[CONFIG] uid(%u) has already registered", uid);
712 return STT_CONFIG_ERROR_NONE;
715 iter = g_slist_next(iter);
718 new_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
719 if (NULL == new_client) {
720 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory");
721 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
723 new_client->uid = uid;
724 new_client->bool_cb = NULL;
725 new_client->engine_cb = NULL;
726 new_client->lang_cb = NULL;
727 new_client->user_data = NULL;
730 g_config_client_list = g_slist_append(g_config_client_list, new_client);
732 SLOG(LOG_WARN, TAG_STTCONFIG, "[CONFIG] Add uid(%u) 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, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "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, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "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, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "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, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "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, TAG_STTCONFIG, "[CONFIG] default engine info(%s)", STT_DEFAULT_ENGINE_INFO);
783 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[CONFIG] Get default engine list");
784 __get_engine_list(STT_DEFAULT_ENGINE_INFO);
785 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "[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, TAG_STTCONFIG, "== STT service config ==");
834 SLOG(LOG_DEBUG, TAG_STTCONFIG, " engine : %s", g_config_info->engine_id);
835 SLOG(LOG_DEBUG, TAG_STTCONFIG, " setting : %s", g_config_info->setting);
836 SLOG(LOG_DEBUG, TAG_STTCONFIG, " auto language : %s", g_config_info->auto_lang ? "on" : "off");
837 SLOG(LOG_DEBUG, TAG_STTCONFIG, " language : %s", g_config_info->language);
838 SLOG(LOG_DEBUG, TAG_STTCONFIG, " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
839 SLOG(LOG_DEBUG, TAG_STTCONFIG, " credential : %s", g_config_info->credential ? "true" : "false");
840 SLOG(LOG_DEBUG, TAG_STTCONFIG, "===================");
842 if (0 != __stt_config_mgr_register_config_event()) {
843 SLOG(LOG_ERROR, TAG_STTCONFIG, "[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 new_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
854 if (NULL == new_client) {
855 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE
856 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
858 new_client->uid = uid;
859 new_client->bool_cb = NULL;
860 new_client->engine_cb = NULL;
861 new_client->lang_cb = NULL;
862 new_client->user_data = NULL;
865 g_config_client_list = g_slist_append(g_config_client_list, new_client);
867 return STT_CONFIG_ERROR_NONE;
870 int stt_config_mgr_finalize(unsigned 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, TAG_STTCONFIG, "Client count (%d)", g_slist_length(g_config_client_list)); //LCOV_EXCL_LINE
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(unsigned 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;
959 int stt_config_mgr_unset_callback(unsigned int uid)
962 stt_config_client_s* temp_client = NULL;
964 /* Call all callbacks of client*/
965 iter = g_slist_nth(g_config_client_list, 0);
967 while (NULL != iter) {
968 temp_client = iter->data;
970 if (NULL != temp_client) {
971 if (uid == temp_client->uid) {
972 temp_client->engine_cb = NULL;
973 temp_client->lang_cb = NULL;
974 temp_client->bool_cb = NULL;
975 temp_client->user_data = NULL;
979 iter = g_slist_next(iter);
982 return STT_CONFIG_ERROR_NONE;
986 int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void* user_data)
988 if (0 >= g_slist_length(g_config_client_list)) {
989 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
990 return STT_CONFIG_ERROR_INVALID_STATE;
993 if (NULL == callback) {
994 return STT_CONFIG_ERROR_INVALID_PARAMETER;
998 stt_engine_info_s *engine_info = NULL;
1000 if (0 >= g_slist_length(g_engine_list)) {
1001 SLOG(LOG_WARN, TAG_STTCONFIG, "[ERROR] Engine list is NULL");
1002 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1005 /* Get a first item */
1006 iter = g_slist_nth(g_engine_list, 0);
1008 while (NULL != iter) {
1009 engine_info = iter->data;
1011 if (NULL == engine_info) {
1012 SLOG(LOG_ERROR, TAG_STTCONFIG, " Engine info is NULL");
1013 return STT_CONFIG_ERROR_OPERATION_FAILED;
1016 if (false == callback(engine_info->uuid, engine_info->name,
1017 engine_info->setting, engine_info->support_silence_detection, user_data)) {
1021 iter = g_slist_next(iter);
1024 return STT_CONFIG_ERROR_NONE;
1027 int stt_config_mgr_get_engine(char** engine)
1029 if (0 >= g_slist_length(g_config_client_list)) {
1030 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized"); //LCOV_EXCL_LINE
1031 return STT_CONFIG_ERROR_INVALID_STATE;
1034 if (NULL == engine) {
1035 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1038 if (NULL != g_config_info->engine_id) {
1039 *engine = strdup(g_config_info->engine_id);
1041 SLOG(LOG_ERROR, TAG_STTCONFIG, " Engine id is NULL"); //LCOV_EXCL_LINE
1043 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1046 return STT_CONFIG_ERROR_NONE;
1050 int __stt_config_set_buxtonkey(const char* engine)
1053 struct buxton_client * bux_cli;
1054 struct buxton_layer * bux_layer;
1055 struct buxton_value * bux_val;
1057 int ret = buxton_open(&bux_cli, NULL, NULL);
1059 SLOG(LOG_ERROR, TAG_STTCONFIG, "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
1060 return STT_CONFIG_ERROR_OPERATION_FAILED;
1062 bux_layer = buxton_create_layer("system");
1063 if (NULL == bux_layer) {
1064 SLOG(LOG_ERROR, TAG_STTCONFIG, "[DBUS-BUXTON2] buxton_create_layer FAIL");
1065 buxton_close(bux_cli);
1067 return STT_CONFIG_ERROR_OPERATION_FAILED;
1069 bux_val = buxton_value_create_string(engine);
1070 if (NULL == bux_val) {
1071 SLOG(LOG_ERROR, TAG_STTCONFIG, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
1072 buxton_free_layer(bux_layer);
1073 buxton_close(bux_cli);
1076 return STT_CONFIG_ERROR_OPERATION_FAILED;
1078 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
1081 ret = buxton_set_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, bux_val);
1083 SLOG(LOG_ERROR, TAG_STTCONFIG, "[DBUS-BUXTON2] Fail to set value sync, ret(%d)", ret);
1084 buxton_value_free(bux_val);
1085 buxton_free_layer(bux_layer);
1086 buxton_close(bux_cli);
1091 return STT_CONFIG_ERROR_OPERATION_FAILED;
1093 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[DBUS-BUXTON2] buxton_set_value_sync: %s", STT_ENGINE_DB_DEFAULT);
1095 buxton_value_free(bux_val);
1096 buxton_free_layer(bux_layer);
1097 buxton_close(bux_cli);
1103 return STT_CONFIG_ERROR_NONE;
1106 int stt_config_mgr_set_engine(const char* engine)
1108 if (0 >= g_slist_length(g_config_client_list)) {
1109 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1110 return STT_CONFIG_ERROR_INVALID_STATE;
1113 if (NULL == g_config_info) {
1114 return STT_CONFIG_ERROR_OPERATION_FAILED;
1117 if (NULL == engine || NULL == g_config_info->engine_id) {
1118 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1121 /* Check current engine id with new engine id */
1122 if (0 == strcmp(g_config_info->engine_id, engine)) {
1126 SLOG(LOG_DEBUG, TAG_STTCONFIG, "New engine id : %s", engine);
1128 int ret = __stt_config_set_buxtonkey(engine);
1130 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] set buxtonkey Failed!!!");
1134 GSList *iter = NULL;
1135 stt_engine_info_s *engine_info = NULL;
1136 bool is_valid_engine = false;
1138 /* Get a first item */
1139 iter = g_slist_nth(g_engine_list, 0);
1141 while (NULL != iter) {
1142 engine_info = iter->data;
1144 if (NULL == engine_info) {
1145 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Engine info is NULL");
1146 iter = g_slist_next(iter);
1150 /* Check engine id is valid */
1151 if (0 != strcmp(engine, engine_info->uuid)) {
1152 iter = g_slist_next(iter);
1156 if (NULL != g_config_info->engine_id) {
1157 free(g_config_info->engine_id);
1158 g_config_info->engine_id = NULL;
1161 g_config_info->engine_id = strdup(engine);
1163 if (NULL != g_config_info->setting) {
1164 free(g_config_info->setting);
1165 g_config_info->setting = NULL;
1168 if (NULL != engine_info->setting) {
1169 g_config_info->setting = strdup(engine_info->setting);
1171 g_config_info->setting = NULL;
1174 /* Engine is valid*/
1175 GSList *iter_lang = NULL;
1177 bool is_valid_lang = false;
1179 /* Get a first item */
1180 iter_lang = g_slist_nth(engine_info->languages, 0);
1182 while (NULL != iter_lang) {
1183 /*Get handle data from list*/
1184 lang = iter_lang->data;
1186 SLOG(LOG_DEBUG, TAG_STTCONFIG, " %s", lang);
1187 if (NULL != lang && NULL != g_config_info->language) {
1188 if (0 == strcmp(lang, g_config_info->language)) {
1189 /* language is valid */
1190 is_valid_lang = true;
1192 free(g_config_info->language);
1193 g_config_info->language = strdup(lang);
1200 iter_lang = g_slist_next(iter_lang);
1203 if (false == is_valid_lang) {
1204 if (NULL != g_config_info->language) {
1205 free(g_config_info->language);
1206 g_config_info->language = NULL;
1208 iter_lang = g_slist_nth(engine_info->languages, 0);
1209 if (NULL == iter_lang) {
1210 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to get default language");
1214 lang = iter_lang->data;
1216 g_config_info->language = strdup(lang);
1221 if (false == engine_info->support_silence_detection) {
1222 if (true == g_config_info->silence_detection)
1223 g_config_info->silence_detection = false;
1226 if (false == engine_info->need_credential) {
1227 if (true == g_config_info->credential)
1228 g_config_info->credential = false;
1231 is_valid_engine = true;
1235 if (true == is_valid_engine) {
1236 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[Config] Engine changed");
1237 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Engine : %s", g_config_info->engine_id);
1238 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Setting : %s", g_config_info->setting);
1239 SLOG(LOG_DEBUG, TAG_STTCONFIG, " language : %s", g_config_info->language);
1240 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
1241 SLOG(LOG_DEBUG, TAG_STTCONFIG, " Credential : %s", g_config_info->credential ? "true" : "false");
1243 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
1244 g_config_info->silence_detection, g_config_info->credential)) {
1245 SLOG(LOG_ERROR, TAG_STTCONFIG, " Fail to save config");
1246 return STT_CONFIG_ERROR_OPERATION_FAILED;
1249 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Engine id is not valid");
1250 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1256 int stt_config_mgr_get_engine_agreement(const char* engine, char** agreement)
1258 if (0 >= g_slist_length(g_engine_list)) {
1259 SLOG(LOG_ERROR, TAG_STTCONFIG, "There is no engine");
1260 return STT_CONFIG_ERROR_INVALID_STATE;
1263 if (NULL == agreement) {
1264 SLOG(LOG_ERROR, TAG_STTCONFIG, "Input parameter is NULL");
1265 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1268 GSList *iter = NULL;
1269 stt_engine_info_s *engine_info = NULL;
1270 char* current_engine = NULL;
1272 if (NULL == engine) {
1273 current_engine = strdup(g_config_info->engine_id);
1274 if (NULL == current_engine) {
1275 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory");
1276 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1279 current_engine = strdup(engine);
1280 if (NULL == current_engine) {
1281 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory");
1282 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1286 /* Get a first item */
1287 iter = g_slist_nth(g_engine_list, 0);
1289 while (NULL != iter) {
1290 engine_info = iter->data;
1292 if (NULL == engine_info) {
1293 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] engine info is NULL");
1294 if (NULL != current_engine) free(current_engine);
1295 return STT_CONFIG_ERROR_OPERATION_FAILED;
1298 if (0 != strcmp(current_engine, engine_info->uuid)) {
1299 iter = g_slist_next(iter);
1303 if (NULL != engine_info->agreement) {
1304 *agreement = strdup(engine_info->agreement);
1306 SLOG(LOG_WARN, TAG_STTCONFIG, "[WARNING] engine agreement is not support");
1311 if (NULL != current_engine) free(current_engine);
1313 return STT_CONFIG_ERROR_NONE;
1317 int stt_config_mgr_get_language_list(const char* engine_id, stt_config_supported_langauge_cb callback, void* user_data)
1319 if (0 >= g_slist_length(g_config_client_list)) {
1320 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized"); //LCOV_EXCL_LINE
1321 return STT_CONFIG_ERROR_INVALID_STATE;
1324 if (0 >= g_slist_length(g_engine_list)) {
1325 SLOG(LOG_ERROR, TAG_STTCONFIG, "There is no engine"); //LCOV_EXCL_LINE
1326 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1329 GSList *iter = NULL;
1330 stt_engine_info_s *engine_info = NULL;
1332 /* Get a first item */
1333 iter = g_slist_nth(g_engine_list, 0);
1335 while (NULL != iter) {
1336 engine_info = iter->data;
1338 if (NULL == engine_info) {
1339 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] engine info is NULL"); //LCOV_EXCL_LINE
1340 return STT_CONFIG_ERROR_OPERATION_FAILED;
1343 if (0 != strcmp(engine_id, engine_info->uuid)) {
1344 iter = g_slist_next(iter);
1348 GSList *iter_lang = NULL;
1351 /* Get a first item */
1352 iter_lang = g_slist_nth(engine_info->languages, 0);
1354 while (NULL != iter_lang) {
1355 /*Get handle data from list*/
1356 lang = iter_lang->data;
1359 SLOG(LOG_DEBUG, TAG_STTCONFIG, " %s", lang);
1360 if (false == callback(engine_info->uuid, lang, user_data))
1365 iter_lang = g_slist_next(iter_lang);
1370 return STT_CONFIG_ERROR_NONE;
1373 int stt_config_mgr_get_default_language(char** language)
1375 if (0 >= g_slist_length(g_config_client_list)) {
1376 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized"); //LCOV_EXCL_LINE
1377 return STT_CONFIG_ERROR_INVALID_STATE;
1380 if (NULL == language) {
1381 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1384 if (NULL != g_config_info->language) {
1385 *language = strdup(g_config_info->language);
1387 SLOG(LOG_ERROR, TAG_STTCONFIG, " language is NULL"); //LCOV_EXCL_LINE
1388 return STT_CONFIG_ERROR_OPERATION_FAILED;
1391 return STT_CONFIG_ERROR_NONE;
1395 int stt_config_mgr_set_default_language(const char* language)
1397 if (0 >= g_slist_length(g_config_client_list)) {
1398 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1399 return STT_CONFIG_ERROR_INVALID_STATE;
1402 if (NULL == language) {
1403 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1406 /* Check language is valid */
1407 if (NULL != g_config_info->language) {
1408 if (0 != stt_parser_set_language(language)) {
1409 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to save engine id");
1410 return STT_CONFIG_ERROR_OPERATION_FAILED;
1412 free(g_config_info->language);
1413 g_config_info->language = strdup(language);
1415 SLOG(LOG_ERROR, TAG_STTCONFIG, " language is NULL");
1416 return STT_CONFIG_ERROR_OPERATION_FAILED;
1419 return STT_CONFIG_ERROR_NONE;
1422 int stt_config_mgr_get_auto_language(bool* value)
1424 if (0 >= g_slist_length(g_config_client_list)) {
1425 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1426 return STT_CONFIG_ERROR_INVALID_STATE;
1429 if (NULL == value) {
1430 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1433 *value = g_config_info->auto_lang;
1435 return STT_CONFIG_ERROR_NONE;
1438 int stt_config_mgr_set_auto_language(bool value)
1440 if (0 >= g_slist_length(g_config_client_list)) {
1441 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1442 return STT_CONFIG_ERROR_INVALID_STATE;
1445 if (g_config_info->auto_lang != value) {
1446 /* Check language is valid */
1447 if (0 != stt_parser_set_auto_lang(value)) {
1448 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to save engine id");
1449 return STT_CONFIG_ERROR_OPERATION_FAILED;
1451 g_config_info->auto_lang = value;
1453 if (true == g_config_info->auto_lang) {
1454 __stt_config_set_auto_language();
1458 return STT_CONFIG_ERROR_NONE;
1461 int stt_config_mgr_get_silence_detection(bool* value)
1463 if (0 >= g_slist_length(g_config_client_list)) {
1464 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1465 return STT_CONFIG_ERROR_INVALID_STATE;
1469 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1471 *value = g_config_info->silence_detection;
1473 return STT_CONFIG_ERROR_NONE;
1476 int stt_config_mgr_set_silence_detection(bool value)
1478 if (0 >= g_slist_length(g_config_client_list)) {
1479 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1480 return STT_CONFIG_ERROR_INVALID_STATE;
1483 if (0 != stt_parser_set_silence_detection(value)) {
1484 SLOG(LOG_ERROR, TAG_STTCONFIG, "Fail to save engine id");
1485 return STT_CONFIG_ERROR_OPERATION_FAILED;
1488 g_config_info->silence_detection = value;
1490 return STT_CONFIG_ERROR_NONE;
1493 bool stt_config_check_default_engine_is_valid(const char* engine)
1495 if (0 >= g_slist_length(g_config_client_list)) {
1496 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1500 if (NULL == engine) {
1504 if (0 >= g_slist_length(g_engine_list))
1507 GSList *iter = NULL;
1508 stt_engine_info_s *engine_info = NULL;
1510 /* Get a first item */
1511 iter = g_slist_nth(g_engine_list, 0);
1513 while (NULL != iter) {
1514 engine_info = iter->data;
1516 if (NULL != engine_info && NULL != engine_info->uuid) {
1517 if (0 == strcmp(engine, engine_info->uuid)) {
1521 iter = g_slist_next(iter);
1527 bool stt_config_check_default_language_is_valid(const char* language)
1529 if (0 >= g_slist_length(g_config_client_list)) {
1530 SLOG(LOG_ERROR, TAG_STTCONFIG, "Not initialized");
1534 if (NULL == language) {
1538 if (NULL == g_config_info->engine_id) {
1539 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Default engine id is NULL");
1543 if (0 >= g_slist_length(g_engine_list))
1546 GSList *iter = NULL;
1547 stt_engine_info_s *engine_info = NULL;
1549 /* Get a first item */
1550 iter = g_slist_nth(g_engine_list, 0);
1552 while (NULL != iter) {
1553 engine_info = iter->data;
1555 if (NULL == engine_info) {
1556 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Engine info is NULL");
1557 iter = g_slist_next(iter);
1561 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1562 iter = g_slist_next(iter);
1566 GSList *iter_lang = NULL;
1569 /* Get a first item */
1570 iter_lang = g_slist_nth(engine_info->languages, 0);
1572 while (NULL != iter_lang) {
1573 lang = iter_lang->data;
1575 if (0 == strcmp(language, lang))
1579 iter_lang = g_slist_next(iter_lang);
1588 int __stt_config_mgr_print_engine_info()
1590 GSList *iter = NULL;
1591 stt_engine_info_s *engine_info = NULL;
1593 if (0 >= g_slist_length(g_engine_list)) {
1594 SLOG(LOG_DEBUG, TAG_STTCONFIG, "-------------- engine list -----------------"); //LCOV_EXCL_LINE
1595 SLOG(LOG_DEBUG, TAG_STTCONFIG, " No Engine in engine directory"); //LCOV_EXCL_LINE
1596 SLOG(LOG_DEBUG, TAG_STTCONFIG, "--------------------------------------------"); //LCOV_EXCL_LINE
1600 /* Get a first item */
1601 iter = g_slist_nth(g_engine_list, 0);
1603 SLOG(LOG_DEBUG, TAG_STTCONFIG, "--------------- engine list -----------------");
1606 while (NULL != iter) {
1607 engine_info = iter->data;
1609 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[%dth]", i);
1610 SLOG(LOG_DEBUG, TAG_STTCONFIG, " name : %s", engine_info->name);
1611 SLOG(LOG_DEBUG, TAG_STTCONFIG, " id : %s", engine_info->uuid);
1612 SLOG(LOG_DEBUG, TAG_STTCONFIG, " setting : %s", engine_info->setting);
1613 SLOG(LOG_DEBUG, TAG_STTCONFIG, " agreement : %s", engine_info->agreement);
1615 SLOG(LOG_DEBUG, TAG_STTCONFIG, " languages");
1616 GSList *iter_lang = NULL;
1618 if (g_slist_length(engine_info->languages) > 0) {
1619 /* Get a first item */
1620 iter_lang = g_slist_nth(engine_info->languages, 0);
1623 while (NULL != iter_lang) {
1624 /*Get handle data from list*/
1625 lang = iter_lang->data;
1627 SLOG(LOG_DEBUG, TAG_STTCONFIG, " [%dth] %s", j, lang);
1630 iter_lang = g_slist_next(iter_lang);
1634 SLOG(LOG_ERROR, TAG_STTCONFIG, " language is NONE"); //LCOV_EXCL_LINE
1636 SLOG(LOG_DEBUG, TAG_STTCONFIG, " silence support : %s",
1637 engine_info->support_silence_detection ? "true" : "false");
1638 iter = g_slist_next(iter);
1641 SLOG(LOG_DEBUG, TAG_STTCONFIG, "--------------------------------------------");
1649 * time info functions
1651 static GSList* g_time_list = NULL;
1654 int stt_config_mgr_reset_time_info()
1656 /* Remove time info */
1657 GSList *iter = NULL;
1658 stt_result_time_info_s *data = NULL;
1660 /* Remove time info */
1661 iter = g_slist_nth(g_time_list, 0);
1662 while (NULL != iter) {
1665 g_time_list = g_slist_remove(g_time_list, data);
1667 if (NULL != data->text) {
1676 iter = g_slist_nth(g_time_list, 0);
1682 int stt_config_mgr_add_time_info(int index, int event, const char* text, long start_time, long end_time)
1685 SLOG(LOG_ERROR, TAG_STTCONFIG, "Invalid parameter : text is NULL");
1689 stt_result_time_info_s *info = (stt_result_time_info_s*)calloc(1, sizeof(stt_result_time_info_s));
1691 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to allocate memory");
1692 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
1694 info->index = index;
1695 info->event = event;
1697 info->text = strdup(text);
1699 info->start_time = start_time;
1700 info->end_time = end_time;
1702 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);
1704 /* Add item to global list */
1705 g_time_list = g_slist_append(g_time_list, info);
1707 SLOG(LOG_DEBUG, TAG_STTCONFIG, "[DEBUG] inside stt_config_mgr_add_time_info: g_time_list length(%d)", g_slist_length(g_time_list));
1713 int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* user_data)
1715 if (NULL == callback) {
1716 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Input parameter is NULL : callback function"); //LCOV_EXCL_LINE
1717 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1720 GSList* temp_time = NULL;
1722 ret = stt_parser_get_time_info(&temp_time);
1724 SLOG(LOG_WARN, TAG_STTCONFIG, "[WARNING] Fail to get time info : %d", ret); //LCOV_EXCL_LINE
1725 return STT_CONFIG_ERROR_NONE;
1728 GSList *iter = NULL;
1729 stt_result_time_info_s *data = NULL;
1731 /* Get a first item */
1732 iter = g_slist_nth(temp_time, 0);
1733 while (NULL != iter) {
1736 if (false == callback(data->index, data->event, data->text,
1737 data->start_time, data->end_time, user_data)) {
1742 iter = g_slist_next(iter);
1745 /* Remove time info */
1746 iter = g_slist_nth(temp_time, 0);
1747 while (NULL != iter) {
1751 temp_time = g_slist_remove(temp_time, data);
1753 if (NULL != data->text) {
1762 iter = g_slist_nth(temp_time, 0);
1765 return STT_CONFIG_ERROR_NONE;
1769 int stt_config_mgr_save_time_info_file()
1771 if (0 == g_slist_length(g_time_list)) {
1772 SLOG(LOG_WARN, TAG_STTCONFIG, "[WARNING] There is no time info to save");
1773 return STT_CONFIG_ERROR_OPERATION_FAILED;
1777 ret = stt_parser_set_time_info(g_time_list);
1779 SLOG(LOG_ERROR, TAG_STTCONFIG, "[ERROR] Fail to save time info : %d", ret);
1780 return STT_CONFIG_ERROR_OPERATION_FAILED;
1783 return STT_CONFIG_ERROR_NONE;
1786 int stt_config_mgr_remove_time_info_file()
1788 stt_parser_clear_time_info();
1790 return STT_CONFIG_ERROR_NONE;