2 * Copyright (c) 2011-2014 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>
23 #include "stt_config_mgr.h"
25 #include "stt_config_parser.h"
30 stt_config_engine_changed_cb engine_cb;
31 stt_config_lang_changed_cb lang_cb;
32 stt_config_bool_changed_cb bool_cb;
34 } stt_config_client_s;
37 extern const char* stt_tag();
39 static GSList* g_engine_list = NULL;
41 static GSList* g_config_client_list = NULL;
43 static stt_config_s* g_config_info;
45 static Ecore_Fd_Handler* g_fd_handler_noti = NULL;
49 int __stt_config_mgr_print_engine_info();
51 bool __stt_config_mgr_check_lang_is_valid(const char* engine_id, const char* language)
53 if (NULL == engine_id || NULL == language) {
54 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input parameter is NULL");
59 stt_engine_info_s *engine_info = NULL;
61 if (0 >= g_slist_length(g_engine_list)) {
62 SLOG(LOG_ERROR, stt_tag(), "[ERROR] There is no engine!!");
66 /* Get a first item */
67 iter = g_slist_nth(g_engine_list, 0);
69 while (NULL != iter) {
70 engine_info = iter->data;
72 if (NULL == engine_info) {
73 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
77 if (0 != strcmp(engine_id, engine_info->uuid)) {
78 iter = g_slist_next(iter);
82 GSList *iter_lang = NULL;
84 if (g_slist_length(engine_info->languages) > 0) {
85 /* Get a first item */
86 iter_lang = g_slist_nth(engine_info->languages, 0);
89 while (NULL != iter_lang) {
90 /*Get handle data from list*/
91 engine_lang = iter_lang->data;
93 SLOG(LOG_DEBUG, stt_tag(), " [%dth] %s", i, engine_lang);
95 if (0 == strcmp(language, engine_lang)) {
100 iter_lang = g_slist_next(iter_lang);
110 int __stt_config_mgr_select_lang(const char* engine_id, char** language)
112 if (NULL == engine_id || NULL == language) {
113 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input parameter is NULL");
118 stt_engine_info_s *engine_info = NULL;
120 if (0 >= g_slist_length(g_engine_list)) {
121 SLOG(LOG_ERROR, stt_tag(), "[ERROR] There is no engine!!");
125 /* Get a first item */
126 iter = g_slist_nth(g_engine_list, 0);
128 while (NULL != iter) {
129 engine_info = iter->data;
131 if (NULL == engine_info) {
132 SLOG(LOG_ERROR, stt_tag(), "engine info is NULL");
136 if (0 != strcmp(engine_id, engine_info->uuid)) {
137 iter = g_slist_next(iter);
141 GSList *iter_lang = NULL;
142 char* engine_lang = NULL;
143 if (g_slist_length(engine_info->languages) > 0) {
144 /* Get a first item */
145 iter_lang = g_slist_nth(engine_info->languages, 0);
147 while (NULL != iter_lang) {
148 engine_lang = iter_lang->data;
149 if (NULL != engine_lang) {
150 /* Default language is STT_BASE_LANGUAGE */
151 if (0 == strcmp(STT_BASE_LANGUAGE, engine_lang)) {
152 *language = strdup(engine_lang);
153 SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", *language);
158 iter_lang = g_slist_next(iter_lang);
161 /* Not support STT_BASE_LANGUAGE */
162 if (NULL != engine_lang) {
163 *language = strdup(engine_lang);
164 SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", *language);
174 Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
176 SLOG(LOG_DEBUG, stt_tag(), "===== Config changed callback event");
179 struct inotify_event event;
180 memset(&event, '\0', sizeof(struct inotify_event));
182 length = read(g_fd_noti, &event, sizeof(struct inotify_event));
184 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Empty Inotify event");
185 SLOG(LOG_DEBUG, stt_tag(), "=====");
186 SLOG(LOG_DEBUG, stt_tag(), " ");
187 return ECORE_CALLBACK_PASS_ON;
190 if (IN_MODIFY == event.mask) {
192 char* setting = NULL;
198 stt_config_client_s* temp_client = NULL;
200 if (0 != stt_parser_find_config_changed(&engine, &setting, &auto_lang, &lang, &silence))
201 return ECORE_CALLBACK_PASS_ON;
204 if (NULL != engine || NULL != setting) {
206 if (NULL != engine) {
207 if (NULL != g_config_info->engine_id) free(g_config_info->engine_id);
208 g_config_info->engine_id = strdup(engine);
211 if (NULL != setting) {
212 if (NULL != g_config_info->setting) free(g_config_info->setting);
213 g_config_info->setting = strdup(setting);
217 if (NULL != g_config_info->language) free(g_config_info->language);
218 g_config_info->language = strdup(lang);
221 if (-1 != silence) g_config_info->silence_detection = silence;
223 /* Call all callbacks of client*/
224 iter = g_slist_nth(g_config_client_list, 0);
226 while (NULL != iter) {
227 temp_client = iter->data;
229 if (NULL != temp_client) {
230 if (NULL != temp_client->engine_cb) {
231 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
232 g_config_info->silence_detection, temp_client->user_data);
236 iter = g_slist_next(iter);
240 if (-1 != auto_lang) {
241 g_config_info->auto_lang = auto_lang;
244 /* Only language changed */
245 if (NULL == engine && NULL != lang) {
246 char* before_lang = NULL;
247 before_lang = strdup(g_config_info->language);
250 if (NULL != g_config_info->language) free(g_config_info->language);
251 g_config_info->language = strdup(lang);
254 /* Call all callbacks of client*/
255 iter = g_slist_nth(g_config_client_list, 0);
257 while (NULL != iter) {
258 temp_client = iter->data;
260 if (NULL != temp_client) {
261 if (NULL != temp_client->lang_cb) {
262 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
266 iter = g_slist_next(iter);
269 if (NULL != before_lang) {
275 /* silence detection changed */
276 g_config_info->silence_detection = silence;
278 /* Call all callbacks of client*/
279 iter = g_slist_nth(g_config_client_list, 0);
281 while (NULL != iter) {
282 temp_client = iter->data;
284 if (NULL != temp_client) {
285 if (NULL != temp_client->bool_cb) {
286 temp_client->bool_cb(STT_CONFIG_TYPE_OPTION_SILENCE_DETECTION, silence, temp_client->user_data);
290 iter = g_slist_next(iter);
294 if (NULL != engine) free(engine);
295 if (NULL != setting) free(setting);
296 if (NULL != lang) free(lang);
298 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Undefined event");
301 SLOG(LOG_DEBUG, stt_tag(), "=====");
302 SLOG(LOG_DEBUG, stt_tag(), " ");
304 return ECORE_CALLBACK_PASS_ON;
307 int __stt_config_mgr_register_config_event()
309 /* get file notification handler */
315 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail get inotify fd");
320 wd = inotify_add_watch(fd, STT_CONFIG, IN_MODIFY);
323 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);
324 if (NULL == g_fd_handler_noti) {
325 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get handler_noti");
332 int __stt_config_mgr_unregister_config_event()
334 /* delete inotify variable */
335 ecore_main_fd_handler_del(g_fd_handler_noti);
336 inotify_rm_watch(g_fd_noti, g_wd_noti);
342 int __stt_config_set_auto_language()
345 char candidate_lang[6] = {'\0', };
347 value = vconf_get_str(VCONFKEY_LANGSET);
349 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Fail to get display language");
353 strncpy(candidate_lang, value, 5);
356 /* Check current config info */
357 if (NULL == g_config_info) {
358 SLOG(LOG_ERROR, stt_tag(), "Current config info is NULL");
359 return STT_CONFIG_ERROR_OPERATION_FAILED;
362 /* Check current language */
363 if (NULL == g_config_info->language) {
364 SLOG(LOG_ERROR, stt_tag(), "Current config language is NULL");
365 return STT_CONFIG_ERROR_OPERATION_FAILED;
368 if (0 == strncmp(g_config_info->language, candidate_lang, 5)) {
369 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. STT language(%s) is same with display lang", g_config_info->language);
372 SLOG(LOG_DEBUG, stt_tag(), "[Config] Display language : %s", candidate_lang);
375 if (true == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, candidate_lang)) {
376 char* before_lang = NULL;
377 if (0 != stt_parser_set_language(candidate_lang)) {
378 SLOG(LOG_ERROR, stt_tag(), "Fail to save default language");
382 before_lang = strdup(g_config_info->language);
384 free(g_config_info->language);
385 g_config_info->language = strdup(candidate_lang);
387 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. Set default language(%s)", g_config_info->language);
389 /* Call all callbacks of client*/
391 stt_config_client_s* temp_client = NULL;
393 iter = g_slist_nth(g_config_client_list, 0);
395 while (NULL != iter) {
396 temp_client = iter->data;
398 if (NULL != temp_client) {
399 if (NULL != temp_client->lang_cb) {
400 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
404 iter = g_slist_next(iter);
407 if (NULL != before_lang) {
411 /* Candidate language is not valid */
412 char* tmp_language = NULL;
413 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
414 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
418 if (NULL == tmp_language) {
419 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Selected language is NULL");
423 if (0 != stt_parser_set_language(tmp_language)) {
425 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save config");
429 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto but display lang is not supported. Default language change(%s)", tmp_language);
431 /* Call all callbacks of client*/
433 stt_config_client_s* temp_client = NULL;
435 iter = g_slist_nth(g_config_client_list, 0);
437 while (NULL != iter) {
438 temp_client = iter->data;
440 if (NULL != temp_client) {
441 if (NULL != temp_client->lang_cb) {
442 temp_client->lang_cb(g_config_info->language, tmp_language, temp_client->user_data);
446 iter = g_slist_next(iter);
449 free(g_config_info->language);
450 g_config_info->language = strdup(tmp_language);
458 void __stt_config_language_changed_cb(keynode_t *key, void *data)
460 if (true == g_config_info->auto_lang) {
461 /* Get voice input vconf key */
462 __stt_config_set_auto_language();
468 void __stt_config_release_client(int uid)
471 stt_config_client_s* temp_client = NULL;
473 if (0 < g_slist_length(g_config_client_list)) {
475 iter = g_slist_nth(g_config_client_list, 0);
477 while (NULL != iter) {
478 temp_client = iter->data;
480 if (NULL != temp_client) {
481 if (uid == temp_client->uid) {
482 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
489 iter = g_slist_next(iter);
493 if (0 < g_slist_length(g_config_client_list)) {
494 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
499 void __stt_config_release_engine()
502 stt_engine_info_s *engine_info = NULL;
504 if (0 < g_slist_length(g_engine_list)) {
506 /* Get a first item */
507 iter = g_slist_nth(g_engine_list, 0);
509 while (NULL != iter) {
510 engine_info = iter->data;
512 if (NULL != engine_info) {
513 g_engine_list = g_slist_remove(g_engine_list, engine_info);
515 stt_parser_free_engine_info(engine_info);
518 iter = g_slist_nth(g_engine_list, 0);
524 int __stt_config_mgr_check_engine_is_valid(const char* engine_id)
526 if (NULL == engine_id) {
527 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
528 return STT_CONFIG_ERROR_INVALID_PARAMETER;
532 stt_engine_info_s *engine_info = NULL;
534 if (0 >= g_slist_length(g_engine_list)) {
535 SLOG(LOG_ERROR, stt_tag(), "There is no engine!!");
536 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
539 /* Get a first item */
540 iter = g_slist_nth(g_engine_list, 0);
542 while (NULL != iter) {
543 engine_info = iter->data;
545 if (NULL == engine_info) {
546 SLOG(LOG_ERROR, stt_tag(), "engine info is NULL");
547 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
550 if (0 == strcmp(engine_id, engine_info->uuid)) {
551 SLOG(LOG_DEBUG, stt_tag(), "Default engine is valid : %s", engine_id);
552 return STT_CONFIG_ERROR_NONE;
555 iter = g_slist_next(iter);
558 /* Change default engine */
559 iter = g_slist_nth(g_engine_list, 0);
560 engine_info = iter->data;
561 if (NULL == engine_info) {
562 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
563 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
566 if (NULL != g_config_info->engine_id) {
567 free(g_config_info->engine_id);
568 g_config_info->engine_id = NULL;
570 if (NULL != g_config_info->setting) {
571 free(g_config_info->setting);
572 g_config_info->setting = NULL;
575 if (NULL != engine_info->uuid) {
576 g_config_info->engine_id = strdup(engine_info->uuid);
579 if (NULL != engine_info->setting) {
580 g_config_info->setting = strdup(engine_info->setting);
584 GSList *iter_lang = NULL;
586 bool is_valid_lang = false;
588 if (0 >= g_slist_length(engine_info->languages)) {
589 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Empty supported language");
590 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
593 /* Get a first item */
594 iter_lang = g_slist_nth(engine_info->languages, 0);
596 while (NULL != iter_lang) {
597 /*Get handle data from list*/
598 lang = iter_lang->data;
600 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
602 if (0 == strcmp(lang, g_config_info->language)) {
603 /* language is valid */
604 is_valid_lang = true;
610 iter_lang = g_slist_next(iter_lang);
613 if (false == is_valid_lang) {
614 iter_lang = g_slist_nth(engine_info->languages, 0);
615 if (NULL != iter_lang) {
616 lang = iter_lang->data;
618 if (NULL != g_config_info->language)
619 free(g_config_info->language);
620 g_config_info->language = strdup(lang);
626 if (false == engine_info->support_silence_detection) {
627 if (true == g_config_info->silence_detection)
628 g_config_info->silence_detection = false;
631 SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
632 SLOG(LOG_DEBUG, stt_tag(), " Engine : %s", g_config_info->engine_id);
633 SLOG(LOG_DEBUG, stt_tag(), " Setting : %s", g_config_info->setting);
634 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
635 SLOG(LOG_DEBUG, stt_tag(), " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
637 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
638 g_config_info->silence_detection)) {
639 SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
640 return STT_CONFIG_ERROR_OPERATION_FAILED;
643 return STT_CONFIG_ERROR_NONE;
646 int stt_config_mgr_initialize(int uid)
650 stt_config_client_s* temp_client = NULL;
652 if (0 < g_slist_length(g_config_client_list)) {
654 iter = g_slist_nth(g_config_client_list, 0);
656 while (NULL != iter) {
657 get_uid = iter->data;
659 if (uid == *get_uid) {
660 SLOG(LOG_WARN, stt_tag(), "[CONFIG] uid(%d) has already registered", uid);
664 iter = g_slist_next(iter);
667 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
668 if (NULL == temp_client) {
669 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
670 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
672 temp_client->uid = uid;
673 temp_client->bool_cb = NULL;
674 temp_client->engine_cb = NULL;
675 temp_client->lang_cb = NULL;
676 temp_client->user_data = NULL;
679 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
681 SLOG(LOG_WARN, stt_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
682 return STT_CONFIG_ERROR_NONE;
685 /* Get file name from default engine directory */
689 struct dirent *dirp = NULL;
691 g_engine_list = NULL;
693 SLOG(LOG_WARN, stt_tag(), "[CONFIG] default engine info(%s)", STT_DEFAULT_ENGINE_INFO);
694 dp = opendir(STT_DEFAULT_ENGINE_INFO);
697 ret = readdir_r(dp, &entry, &dirp);
699 SLOG(LOG_ERROR, stt_tag(), "[File ERROR] Fail to read directory");
704 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
707 stt_engine_info_s* info;
711 filesize = strlen(STT_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 5;
712 filepath = (char*)calloc(filesize, sizeof(char));
714 if (NULL != filepath) {
715 snprintf(filepath, filesize, "%s/%s", STT_DEFAULT_ENGINE_INFO, dirp->d_name);
717 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Memory not enough!!");
721 if (0 == stt_parser_get_engine_info(filepath, &info)) {
722 g_engine_list = g_slist_append(g_engine_list, info);
725 if (NULL != filepath)
728 } while (NULL != dirp);
732 SLOG(LOG_WARN, stt_tag(), "[Config WARNING] Fail to open default directory");
735 __stt_config_mgr_print_engine_info();
737 if (0 != stt_parser_load_config(&g_config_info)) {
738 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to parse configure information");
739 __stt_config_release_client(uid);
740 __stt_config_release_engine();
741 return STT_CONFIG_ERROR_OPERATION_FAILED;
744 /* Check whether engine id is valid */
745 if (0 != __stt_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
746 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get default engine");
747 __stt_config_release_client(uid);
748 __stt_config_release_engine();
749 stt_parser_unload_config(g_config_info);
750 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
753 if (true == g_config_info->auto_lang) {
754 /* Check language with display language */
755 __stt_config_set_auto_language();
757 if (false == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language)) {
758 /* Default language is not valid */
760 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
761 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
762 __stt_config_release_client(uid);
763 __stt_config_release_engine();
764 stt_parser_unload_config(g_config_info);
765 return STT_CONFIG_ERROR_OPERATION_FAILED;
768 if (NULL != tmp_language) {
769 if (NULL != g_config_info->language) {
770 free(g_config_info->language);
771 g_config_info->language = strdup(tmp_language);
779 /* print daemon config */
780 SLOG(LOG_DEBUG, stt_tag(), "== Daemon config ==");
781 SLOG(LOG_DEBUG, stt_tag(), " engine : %s", g_config_info->engine_id);
782 SLOG(LOG_DEBUG, stt_tag(), " setting : %s", g_config_info->setting);
783 SLOG(LOG_DEBUG, stt_tag(), " auto language : %s", g_config_info->auto_lang ? "on" : "off");
784 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
785 SLOG(LOG_DEBUG, stt_tag(), " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
786 SLOG(LOG_DEBUG, stt_tag(), "===================");
788 if (0 != __stt_config_mgr_register_config_event()) {
789 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to register config event");
790 __stt_config_release_client(uid);
791 __stt_config_release_engine();
792 stt_parser_unload_config(g_config_info);
793 return STT_CONFIG_ERROR_OPERATION_FAILED;
796 /* Register to detect display language change */
797 vconf_notify_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb, NULL);
799 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
800 if (NULL == temp_client) {
801 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
802 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
804 temp_client->uid = uid;
805 temp_client->bool_cb = NULL;
806 temp_client->engine_cb = NULL;
807 temp_client->lang_cb = NULL;
808 temp_client->user_data = NULL;
811 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
813 return STT_CONFIG_ERROR_NONE;
816 int stt_config_mgr_finalize(int uid)
819 stt_config_client_s* temp_client = NULL;
821 if (0 < g_slist_length(g_config_client_list)) {
823 iter = g_slist_nth(g_config_client_list, 0);
825 while (NULL != iter) {
826 temp_client = iter->data;
828 if (NULL != temp_client) {
829 if (uid == temp_client->uid) {
830 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
837 iter = g_slist_next(iter);
841 if (0 < g_slist_length(g_config_client_list)) {
842 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
843 return STT_CONFIG_ERROR_NONE;
846 stt_engine_info_s *engine_info = NULL;
848 if (0 < g_slist_length(g_engine_list)) {
850 /* Get a first item */
851 iter = g_slist_nth(g_engine_list, 0);
853 while (NULL != iter) {
854 engine_info = iter->data;
856 if (NULL != engine_info) {
857 g_engine_list = g_slist_remove(g_engine_list, engine_info);
859 stt_parser_free_engine_info(engine_info);
862 iter = g_slist_nth(g_engine_list, 0);
866 vconf_ignore_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb);
868 __stt_config_mgr_unregister_config_event();
870 if (NULL != g_config_info) {
871 stt_parser_unload_config(g_config_info);
872 g_config_info = NULL;
875 return STT_CONFIG_ERROR_NONE;
878 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)
881 stt_config_client_s* temp_client = NULL;
883 /* Call all callbacks of client*/
884 iter = g_slist_nth(g_config_client_list, 0);
886 while (NULL != iter) {
887 temp_client = iter->data;
889 if (NULL != temp_client) {
890 if (uid == temp_client->uid) {
891 temp_client->engine_cb = engine_cb;
892 temp_client->lang_cb = lang_cb;
893 temp_client->bool_cb = bool_cb;
894 temp_client->user_data = user_data;
898 iter = g_slist_next(iter);
901 return STT_CONFIG_ERROR_NONE;
904 int stt_config_mgr_unset_callback(int uid)
907 stt_config_client_s* temp_client = NULL;
909 /* Call all callbacks of client*/
910 iter = g_slist_nth(g_config_client_list, 0);
912 while (NULL != iter) {
913 temp_client = iter->data;
915 if (NULL != temp_client) {
916 if (uid == temp_client->uid) {
917 temp_client->engine_cb = NULL;
918 temp_client->lang_cb = NULL;
919 temp_client->bool_cb = NULL;
920 temp_client->user_data = NULL;
924 iter = g_slist_next(iter);
927 return STT_CONFIG_ERROR_NONE;
930 int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void* user_data)
932 if (0 >= g_slist_length(g_config_client_list)) {
933 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
934 return STT_CONFIG_ERROR_INVALID_STATE;
937 if (NULL == callback) {
938 return STT_CONFIG_ERROR_INVALID_PARAMETER;
942 stt_engine_info_s *engine_info = NULL;
944 if (0 >= g_slist_length(g_engine_list)) {
945 SLOG(LOG_WARN, stt_tag(), "[ERROR] Engine list is NULL");
946 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
949 /* Get a first item */
950 iter = g_slist_nth(g_engine_list, 0);
952 while (NULL != iter) {
953 engine_info = iter->data;
955 if (NULL == engine_info) {
956 SLOG(LOG_ERROR, stt_tag(), " Engine info is NULL");
957 return STT_CONFIG_ERROR_OPERATION_FAILED;
960 if (false == callback(engine_info->uuid, engine_info->name,
961 engine_info->setting, engine_info->support_silence_detection, user_data)) {
965 iter = g_slist_next(iter);
968 return STT_CONFIG_ERROR_NONE;
971 int stt_config_mgr_get_engine(char** engine)
973 if (0 >= g_slist_length(g_config_client_list)) {
974 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
975 return STT_CONFIG_ERROR_INVALID_STATE;
978 if (NULL == engine) {
979 return STT_CONFIG_ERROR_INVALID_PARAMETER;
982 if (NULL != g_config_info->engine_id) {
983 *engine = strdup(g_config_info->engine_id);
985 SLOG(LOG_ERROR, stt_tag(), " Engine id is NULL");
986 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
989 return STT_CONFIG_ERROR_NONE;
992 int stt_config_mgr_set_engine(const char* engine)
994 if (0 >= g_slist_length(g_config_client_list)) {
995 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
996 return STT_CONFIG_ERROR_INVALID_STATE;
999 if (NULL == g_config_info) {
1000 return STT_CONFIG_ERROR_OPERATION_FAILED;
1003 if (NULL == engine || NULL == g_config_info->engine_id) {
1004 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1007 /* Check current engine id with new engine id */
1008 if (0 == strcmp(g_config_info->engine_id, engine)) {
1012 SLOG(LOG_DEBUG, stt_tag(), "New engine id : %s", engine);
1014 GSList *iter = NULL;
1015 stt_engine_info_s *engine_info = NULL;
1016 bool is_valid_engine = false;
1018 /* Get a first item */
1019 iter = g_slist_nth(g_engine_list, 0);
1021 while (NULL != iter) {
1022 engine_info = iter->data;
1024 if (NULL == engine_info) {
1025 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1026 iter = g_slist_next(iter);
1030 /* Check engine id is valid */
1031 if (0 != strcmp(engine, engine_info->uuid)) {
1032 iter = g_slist_next(iter);
1036 if (NULL != g_config_info->engine_id)
1037 free(g_config_info->engine_id);
1039 g_config_info->engine_id = strdup(engine);
1041 if (NULL != g_config_info->setting) {
1042 free(g_config_info->setting);
1045 if (NULL != engine_info->setting) {
1046 g_config_info->setting = strdup(engine_info->setting);
1048 g_config_info->setting = NULL;
1051 /* Engine is valid*/
1052 GSList *iter_lang = NULL;
1054 bool is_valid_lang = false;
1056 /* Get a first item */
1057 iter_lang = g_slist_nth(engine_info->languages, 0);
1059 while (NULL != iter_lang) {
1060 /*Get handle data from list*/
1061 lang = iter_lang->data;
1063 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1064 if (NULL != lang && NULL != g_config_info->language) {
1065 if (0 == strcmp(lang, g_config_info->language)) {
1066 /* language is valid */
1067 is_valid_lang = true;
1069 free(g_config_info->language);
1070 g_config_info->language = strdup(lang);
1077 iter_lang = g_slist_next(iter_lang);
1080 if (false == is_valid_lang) {
1081 if (NULL != g_config_info->language) {
1082 free(g_config_info->language);
1084 iter_lang = g_slist_nth(engine_info->languages, 0);
1085 lang = iter_lang->data;
1087 g_config_info->language = strdup(lang);
1092 if (false == engine_info->support_silence_detection) {
1093 if (true == g_config_info->silence_detection)
1094 g_config_info->silence_detection = false;
1097 is_valid_engine = true;
1101 if (true == is_valid_engine) {
1102 SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
1103 SLOG(LOG_DEBUG, stt_tag(), " Engine : %s", g_config_info->engine_id);
1104 SLOG(LOG_DEBUG, stt_tag(), " Setting : %s", g_config_info->setting);
1105 SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
1106 SLOG(LOG_DEBUG, stt_tag(), " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
1108 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
1109 g_config_info->silence_detection)) {
1110 SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
1111 return STT_CONFIG_ERROR_OPERATION_FAILED;
1114 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine id is not valid");
1115 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1121 int stt_config_mgr_get_engine_agreement(const char* engine, char** agreement)
1123 if (0 >= g_slist_length(g_engine_list)) {
1124 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
1125 return STT_CONFIG_ERROR_INVALID_STATE;
1128 if (NULL == agreement) {
1129 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
1130 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1133 GSList *iter = NULL;
1134 stt_engine_info_s *engine_info = NULL;
1135 char* current_engine = NULL;
1137 if (NULL == engine) {
1138 current_engine = strdup(g_config_info->engine_id);
1139 if (NULL == current_engine) {
1140 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1141 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1144 current_engine = strdup(engine);
1145 if (NULL == current_engine) {
1146 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1147 return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1151 /* Get a first item */
1152 iter = g_slist_nth(g_engine_list, 0);
1154 while (NULL != iter) {
1155 engine_info = iter->data;
1157 if (NULL == engine_info) {
1158 SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1159 if (NULL != current_engine) free(current_engine);
1160 return STT_CONFIG_ERROR_OPERATION_FAILED;
1163 if (0 != strcmp(current_engine, engine_info->uuid)) {
1164 iter = g_slist_next(iter);
1168 if (NULL != engine_info->agreement) {
1169 *agreement = strdup(engine_info->agreement);
1171 SLOG(LOG_WARN, stt_tag(), "[WARNING] engine agreement is not support");
1176 if (NULL != current_engine) free(current_engine);
1178 return STT_CONFIG_ERROR_NONE;
1181 int stt_config_mgr_get_language_list(const char* engine_id, stt_config_supported_langauge_cb callback, void* user_data)
1183 if (0 >= g_slist_length(g_config_client_list)) {
1184 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1185 return STT_CONFIG_ERROR_INVALID_STATE;
1188 if (0 >= g_slist_length(g_engine_list)) {
1189 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
1190 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1193 GSList *iter = NULL;
1194 stt_engine_info_s *engine_info = NULL;
1196 /* Get a first item */
1197 iter = g_slist_nth(g_engine_list, 0);
1199 while (NULL != iter) {
1200 engine_info = iter->data;
1202 if (NULL == engine_info) {
1203 SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1204 return STT_CONFIG_ERROR_OPERATION_FAILED;
1207 if (0 != strcmp(engine_id, engine_info->uuid)) {
1208 iter = g_slist_next(iter);
1212 GSList *iter_lang = NULL;
1215 /* Get a first item */
1216 iter_lang = g_slist_nth(engine_info->languages, 0);
1218 while (NULL != iter_lang) {
1219 /*Get handle data from list*/
1220 lang = iter_lang->data;
1222 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1224 if (false == callback(engine_info->uuid, lang, user_data))
1229 iter_lang = g_slist_next(iter_lang);
1234 return STT_CONFIG_ERROR_NONE;
1237 int stt_config_mgr_get_default_language(char** language)
1239 if (0 >= g_slist_length(g_config_client_list)) {
1240 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1241 return STT_CONFIG_ERROR_INVALID_STATE;
1244 if (NULL == language) {
1245 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1248 if (NULL != g_config_info->language) {
1249 *language = strdup(g_config_info->language);
1251 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1252 return STT_CONFIG_ERROR_OPERATION_FAILED;
1255 return STT_CONFIG_ERROR_NONE;
1258 int stt_config_mgr_set_default_language(const char* language)
1260 if (0 >= g_slist_length(g_config_client_list)) {
1261 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1262 return STT_CONFIG_ERROR_INVALID_STATE;
1265 if (NULL == language) {
1266 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1269 /* Check language is valid */
1270 if (NULL != g_config_info->language) {
1271 if (0 != stt_parser_set_language(language)) {
1272 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1273 return STT_CONFIG_ERROR_OPERATION_FAILED;
1275 free(g_config_info->language);
1276 g_config_info->language = strdup(language);
1278 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1279 return STT_CONFIG_ERROR_OPERATION_FAILED;
1282 return STT_CONFIG_ERROR_NONE;
1285 int stt_config_mgr_get_auto_language(bool* value)
1287 if (0 >= g_slist_length(g_config_client_list)) {
1288 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1289 return STT_CONFIG_ERROR_INVALID_STATE;
1292 if (NULL == value) {
1293 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1296 *value = g_config_info->auto_lang;
1298 return STT_CONFIG_ERROR_NONE;
1301 int stt_config_mgr_set_auto_language(bool value)
1303 if (0 >= g_slist_length(g_config_client_list)) {
1304 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1305 return STT_CONFIG_ERROR_INVALID_STATE;
1308 if (g_config_info->auto_lang != value) {
1309 /* Check language is valid */
1310 if (0 != stt_parser_set_auto_lang(value)) {
1311 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1312 return STT_CONFIG_ERROR_OPERATION_FAILED;
1314 g_config_info->auto_lang = value;
1316 if (true == g_config_info->auto_lang) {
1317 __stt_config_set_auto_language();
1321 return STT_CONFIG_ERROR_NONE;
1324 int stt_config_mgr_get_silence_detection(bool* value)
1326 if (0 >= g_slist_length(g_config_client_list)) {
1327 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1328 return STT_CONFIG_ERROR_INVALID_STATE;
1332 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1334 *value = g_config_info->silence_detection;
1336 return STT_CONFIG_ERROR_NONE;
1339 int stt_config_mgr_set_silence_detection(bool value)
1341 if (0 >= g_slist_length(g_config_client_list)) {
1342 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1343 return STT_CONFIG_ERROR_INVALID_STATE;
1346 if (0 != stt_parser_set_silence_detection(value)) {
1347 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1348 return STT_CONFIG_ERROR_OPERATION_FAILED;
1351 g_config_info->silence_detection = value;
1353 return STT_CONFIG_ERROR_NONE;
1356 bool stt_config_check_default_engine_is_valid(const char* engine)
1358 if (0 >= g_slist_length(g_config_client_list)) {
1359 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1363 if (NULL == engine) {
1367 if (0 >= g_slist_length(g_engine_list))
1370 GSList *iter = NULL;
1371 stt_engine_info_s *engine_info = NULL;
1373 /* Get a first item */
1374 iter = g_slist_nth(g_engine_list, 0);
1376 while (NULL != iter) {
1377 engine_info = iter->data;
1379 if (NULL != engine_info) {
1380 if (0 == strcmp(engine, engine_info->uuid)) {
1384 iter = g_slist_next(iter);
1390 bool stt_config_check_default_language_is_valid(const char* language)
1392 if (0 >= g_slist_length(g_config_client_list)) {
1393 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1397 if (NULL == language) {
1401 if (NULL == g_config_info->engine_id) {
1402 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Default engine id is NULL");
1406 if (0 >= g_slist_length(g_engine_list))
1409 GSList *iter = NULL;
1410 stt_engine_info_s *engine_info = NULL;
1412 /* Get a first item */
1413 iter = g_slist_nth(g_engine_list, 0);
1415 while (NULL != iter) {
1416 engine_info = iter->data;
1418 if (NULL == engine_info) {
1419 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1420 iter = g_slist_next(iter);
1424 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1425 iter = g_slist_next(iter);
1429 GSList *iter_lang = NULL;
1432 /* Get a first item */
1433 iter_lang = g_slist_nth(engine_info->languages, 0);
1435 while (NULL != iter_lang) {
1436 lang = iter_lang->data;
1438 if (0 == strcmp(language, lang))
1442 iter_lang = g_slist_next(iter_lang);
1450 int __stt_config_mgr_print_engine_info()
1452 GSList *iter = NULL;
1453 stt_engine_info_s *engine_info = NULL;
1455 if (0 >= g_slist_length(g_engine_list)) {
1456 SLOG(LOG_DEBUG, stt_tag(), "-------------- engine list -----------------");
1457 SLOG(LOG_DEBUG, stt_tag(), " No Engine in engine directory");
1458 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1462 /* Get a first item */
1463 iter = g_slist_nth(g_engine_list, 0);
1465 SLOG(LOG_DEBUG, stt_tag(), "--------------- engine list -----------------");
1468 while (NULL != iter) {
1469 engine_info = iter->data;
1471 SLOG(LOG_DEBUG, stt_tag(), "[%dth]", i);
1472 SLOG(LOG_DEBUG, stt_tag(), " name : %s", engine_info->name);
1473 SLOG(LOG_DEBUG, stt_tag(), " id : %s", engine_info->uuid);
1474 SLOG(LOG_DEBUG, stt_tag(), " setting : %s", engine_info->setting);
1475 SLOG(LOG_DEBUG, stt_tag(), " agreement : %s", engine_info->agreement);
1477 SLOG(LOG_DEBUG, stt_tag(), " languages");
1478 GSList *iter_lang = NULL;
1480 if (g_slist_length(engine_info->languages) > 0) {
1481 /* Get a first item */
1482 iter_lang = g_slist_nth(engine_info->languages, 0);
1485 while (NULL != iter_lang) {
1486 /*Get handle data from list*/
1487 lang = iter_lang->data;
1489 SLOG(LOG_DEBUG, stt_tag(), " [%dth] %s", j, lang);
1492 iter_lang = g_slist_next(iter_lang);
1496 SLOG(LOG_ERROR, stt_tag(), " language is NONE");
1498 SLOG(LOG_DEBUG, stt_tag(), " silence support : %s",
1499 engine_info->support_silence_detection ? "true" : "false");
1500 iter = g_slist_next(iter);
1503 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1511 * time info functions
1513 static GSList* g_time_list = NULL;
1515 int stt_config_mgr_reset_time_info()
1517 /* Remove time info */
1518 GSList *iter = NULL;
1519 stt_result_time_info_s *data = NULL;
1521 /* Remove time info */
1522 iter = g_slist_nth(g_time_list, 0);
1523 while (NULL != iter) {
1526 g_time_list = g_slist_remove(g_time_list, data);
1528 if (NULL != data->text) {
1537 iter = g_slist_nth(g_time_list, 0);
1543 int stt_config_mgr_add_time_info(int index, int event, const char* text, long start_time, long end_time)
1546 SLOG(LOG_ERROR, stt_tag(), "Invalid paramter : text is NULL");
1550 stt_result_time_info_s *info = (stt_result_time_info_s*)calloc(1, sizeof(stt_result_time_info_s));
1552 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1553 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
1555 info->index = index;
1556 info->event = event;
1558 info->text = strdup(text);
1560 info->start_time = start_time;
1561 info->end_time = end_time;
1563 /* Add item to global list */
1564 g_time_list = g_slist_append(g_time_list, info);
1569 int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* user_data)
1571 if (NULL == callback) {
1572 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input paramter is NULL : callback function");
1573 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1576 GSList* temp_time = NULL;
1578 ret = stt_parser_get_time_info(&temp_time);
1580 SLOG(LOG_WARN, stt_tag(), "[WARNING] Fail to get time info : %d", ret);
1581 return STT_CONFIG_ERROR_OPERATION_FAILED;
1584 GSList *iter = NULL;
1585 stt_result_time_info_s *data = NULL;
1587 /* Get a first item */
1588 iter = g_slist_nth(temp_time, 0);
1589 while (NULL != iter) {
1592 if (false == callback(data->index, data->event, data->text,
1593 data->start_time, data->end_time, user_data)) {
1598 iter = g_slist_next(iter);
1601 /* Remove time info */
1602 iter = g_slist_nth(temp_time, 0);
1603 while (NULL != iter) {
1607 temp_time = g_slist_remove(temp_time, data);
1609 if (NULL != data->text) {
1618 iter = g_slist_nth(temp_time, 0);
1621 return STT_CONFIG_ERROR_NONE;
1624 int stt_config_mgr_save_time_info_file()
1626 if (0 == g_slist_length(g_time_list)) {
1627 SLOG(LOG_WARN, stt_tag(), "[WARNING] There is no time info to save");
1628 return STT_CONFIG_ERROR_OPERATION_FAILED;
1632 ret = stt_parser_set_time_info(g_time_list);
1634 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save time info : %d", ret);
1635 return STT_CONFIG_ERROR_OPERATION_FAILED;
1638 return STT_CONFIG_ERROR_NONE;
1641 int stt_config_mgr_remove_time_info_file()
1643 stt_parser_clear_time_info();
1645 return STT_CONFIG_ERROR_NONE;