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"
27 #define VCONFKEY_VOICE_INPUT_LANGUAGE "db/voice_input/language"
31 stt_config_engine_changed_cb engine_cb;
32 stt_config_lang_changed_cb lang_cb;
33 stt_config_bool_changed_cb bool_cb;
38 extern const char* stt_tag();
40 static GSList* g_engine_list = NULL;
42 static GSList* g_config_client_list = NULL;
44 static stt_config_s* g_config_info;
46 static Ecore_Fd_Handler* g_fd_handler_noti = NULL;
50 int __stt_config_mgr_print_engine_info();
52 bool __stt_config_mgr_check_lang_is_valid(const char* engine_id, const char* language)
54 if (NULL == engine_id || NULL == language) {
55 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input parameter is NULL");
60 stt_engine_info_s *engine_info = NULL;
62 if (0 >= g_slist_length(g_engine_list)) {
63 SLOG(LOG_ERROR, stt_tag(), "[ERROR] There is no engine!!");
67 /* Get a first item */
68 iter = g_slist_nth(g_engine_list, 0);
70 while (NULL != iter) {
71 engine_info = iter->data;
73 if (NULL == engine_info) {
74 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
78 if (0 != strcmp(engine_id, engine_info->uuid)) {
79 iter = g_slist_next(iter);
83 GSList *iter_lang = NULL;
85 if (g_slist_length(engine_info->languages) > 0) {
86 /* Get a first item */
87 iter_lang = g_slist_nth(engine_info->languages, 0);
90 while (NULL != iter_lang) {
91 /*Get handle data from list*/
92 engine_lang = iter_lang->data;
94 SECURE_SLOG(LOG_DEBUG, stt_tag(), " [%dth] %s", i, engine_lang);
96 if (0 == strcmp(language, engine_lang)) {
101 iter_lang = g_slist_next(iter_lang);
111 int __stt_config_mgr_select_lang(const char* engine_id, char** language)
113 if (NULL == engine_id || NULL == language) {
114 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input parameter is NULL");
119 stt_engine_info_s *engine_info = NULL;
121 if (0 >= g_slist_length(g_engine_list)) {
122 SLOG(LOG_ERROR, stt_tag(), "[ERROR] There is no engine!!");
126 /* Get a first item */
127 iter = g_slist_nth(g_engine_list, 0);
129 while (NULL != iter) {
130 engine_info = iter->data;
132 if (NULL == engine_info) {
133 SLOG(LOG_ERROR, stt_tag(), "engine info is NULL");
137 if (0 != strcmp(engine_id, engine_info->uuid)) {
138 iter = g_slist_next(iter);
142 GSList *iter_lang = NULL;
143 char* engine_lang = NULL;
144 if (g_slist_length(engine_info->languages) > 0) {
145 /* Get a first item */
146 iter_lang = g_slist_nth(engine_info->languages, 0);
148 while (NULL != iter_lang) {
149 engine_lang = iter_lang->data;
150 if (NULL != engine_lang) {
151 /* Default language is STT_BASE_LANGUAGE */
152 if (0 == strcmp(STT_BASE_LANGUAGE, engine_lang)) {
153 *language = strdup(engine_lang);
154 SECURE_SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", *language);
159 iter_lang = g_slist_next(iter_lang);
162 /* Not support STT_BASE_LANGUAGE */
163 if (NULL != engine_lang) {
164 *language = strdup(engine_lang);
165 SECURE_SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", *language);
175 Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
177 SLOG(LOG_DEBUG, stt_tag(), "===== Config changed callback event");
180 struct inotify_event event;
181 memset(&event, '\0', sizeof(struct inotify_event));
183 length = read(g_fd_noti, &event, sizeof(struct inotify_event));
185 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Empty Inotify event");
186 SLOG(LOG_DEBUG, stt_tag(), "=====");
187 SLOG(LOG_DEBUG, stt_tag(), " ");
188 return ECORE_CALLBACK_PASS_ON;
191 if (IN_MODIFY == event.mask) {
193 char* setting = NULL;
199 stt_config_client_s* temp_client = NULL;
201 if (0 != stt_parser_find_config_changed(&engine, &setting, &auto_lang, &lang, &silence))
202 return ECORE_CALLBACK_PASS_ON;
205 if (NULL != engine || NULL != setting) {
207 if (NULL != engine) {
208 if (NULL != g_config_info->engine_id) free(g_config_info->engine_id);
209 g_config_info->engine_id = strdup(engine);
212 if (NULL != setting) {
213 if (NULL != g_config_info->setting) free(g_config_info->setting);
214 g_config_info->setting = strdup(setting);
218 if (NULL != g_config_info->language) free(g_config_info->language);
219 g_config_info->language = strdup(lang);
222 if (-1 != silence) g_config_info->silence_detection = silence;
224 /* Call all callbacks of client*/
225 iter = g_slist_nth(g_config_client_list, 0);
227 while (NULL != iter) {
228 temp_client = iter->data;
230 if (NULL != temp_client) {
231 if (NULL != temp_client->engine_cb) {
232 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
233 g_config_info->silence_detection, temp_client->user_data);
237 iter = g_slist_next(iter);
241 if (-1 != auto_lang) {
242 g_config_info->auto_lang = auto_lang;
245 /* Only language changed */
246 if (NULL == engine && NULL != lang) {
247 char* before_lang = NULL;
248 before_lang = strdup(g_config_info->language);
251 if (NULL != g_config_info->language) free(g_config_info->language);
252 g_config_info->language = strdup(lang);
255 /* Call all callbacks of client*/
256 iter = g_slist_nth(g_config_client_list, 0);
258 while (NULL != iter) {
259 temp_client = iter->data;
261 if (NULL != temp_client) {
262 if (NULL != temp_client->lang_cb) {
263 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
267 iter = g_slist_next(iter);
270 if (NULL != before_lang) {
276 /* silence detection changed */
277 g_config_info->silence_detection = silence;
279 /* Call all callbacks of client*/
280 iter = g_slist_nth(g_config_client_list, 0);
282 while (NULL != iter) {
283 temp_client = iter->data;
285 if (NULL != temp_client) {
286 if (NULL != temp_client->bool_cb) {
287 temp_client->bool_cb(STT_CONFIG_TYPE_OPTION_SILENCE_DETECTION, silence, temp_client->user_data);
291 iter = g_slist_next(iter);
295 if (NULL != engine) free(engine);
296 if (NULL != setting) free(setting);
297 if (NULL != lang) free(lang);
299 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Undefined event");
302 SLOG(LOG_DEBUG, stt_tag(), "=====");
303 SLOG(LOG_DEBUG, stt_tag(), " ");
305 return ECORE_CALLBACK_PASS_ON;
308 int __stt_config_mgr_register_config_event()
310 /* get file notification handler */
316 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail get inotify fd");
321 wd = inotify_add_watch(fd, STT_CONFIG, IN_MODIFY);
324 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);
325 if (NULL == g_fd_handler_noti) {
326 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get handler_noti");
333 int __stt_config_mgr_unregister_config_event()
335 /* delete inotify variable */
336 ecore_main_fd_handler_del(g_fd_handler_noti);
337 inotify_rm_watch(g_fd_noti, g_wd_noti);
343 int __stt_config_set_auto_language()
346 value = vconf_get_str(VCONFKEY_VOICE_INPUT_LANGUAGE);
348 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Fail to get voice input language");
352 char candidate_lang[6] = {'\0', };
354 /* Check auto is on or not */
355 if (0 == strncmp(value, "auto", 4)) {
358 value = vconf_get_str(VCONFKEY_LANGSET);
360 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Fail to get display language");
364 strncpy(candidate_lang, value, 5);
367 /* Check current language */
368 if (0 == strncmp(g_config_info->language, candidate_lang, 5)) {
369 SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. STT language(%s) is same with display lang", g_config_info->language);
372 SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Config] Display language : %s", candidate_lang);
375 strncpy(candidate_lang, value, 5);
376 SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Config] Voice input language is NOT auto. Voice input language : %s", candidate_lang);
381 if (true == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, candidate_lang)) {
382 /* stt default language change */
383 if (NULL == g_config_info->language) {
384 SLOG(LOG_ERROR, stt_tag(), "Current config language is NULL");
388 char* before_lang = NULL;
389 if (0 != stt_parser_set_language(candidate_lang)) {
390 SLOG(LOG_ERROR, stt_tag(), "Fail to save default language");
394 before_lang = strdup(g_config_info->language);
396 free(g_config_info->language);
397 g_config_info->language = strdup(candidate_lang);
399 SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. Set default language(%s)", g_config_info->language);
401 /* Call all callbacks of client*/
403 stt_config_client_s* temp_client = NULL;
405 iter = g_slist_nth(g_config_client_list, 0);
407 while (NULL != iter) {
408 temp_client = iter->data;
410 if (NULL != temp_client) {
411 if (NULL != temp_client->lang_cb) {
412 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
416 iter = g_slist_next(iter);
419 if (NULL != before_lang) {
423 /* Candidate language is not valid */
424 char* tmp_language = NULL;
425 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
426 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
430 if (NULL == tmp_language) {
431 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Selected language is NULL");
435 if (0 != stt_parser_set_language(tmp_language)) {
437 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save config");
441 SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto but display lang is not supported. Default language change(%s)", tmp_language);
443 /* Call all callbacks of client*/
445 stt_config_client_s* temp_client = NULL;
447 iter = g_slist_nth(g_config_client_list, 0);
449 while (NULL != iter) {
450 temp_client = iter->data;
452 if (NULL != temp_client) {
453 if (NULL != temp_client->lang_cb) {
454 temp_client->lang_cb(g_config_info->language, tmp_language, temp_client->user_data);
458 iter = g_slist_next(iter);
461 if (NULL != g_config_info->language) {
462 free(g_config_info->language);
463 g_config_info->language = strdup(tmp_language);
472 void __stt_config_language_changed_cb(keynode_t *key, void *data)
474 if (true == g_config_info->auto_lang) {
475 /* Get voice input vconf key */
476 __stt_config_set_auto_language();
482 int stt_config_mgr_initialize(int uid)
486 stt_config_client_s* temp_client = NULL;
488 if (0 < g_slist_length(g_config_client_list)) {
490 iter = g_slist_nth(g_config_client_list, 0);
492 while (NULL != iter) {
493 get_uid = iter->data;
495 if (uid == *get_uid) {
496 SECURE_SLOG(LOG_WARN, stt_tag(), "[CONFIG] uid(%d) has already registered", uid);
500 iter = g_slist_next(iter);
503 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
504 temp_client->uid = uid;
505 temp_client->bool_cb = NULL;
506 temp_client->engine_cb = NULL;
507 temp_client->lang_cb = NULL;
508 temp_client->user_data = NULL;
511 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
513 SECURE_SLOG(LOG_WARN, stt_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
514 return STT_CONFIG_ERROR_NONE;
517 /* Get file name from default engine directory */
521 struct dirent *dirp = NULL;
523 g_engine_list = NULL;
525 dp = opendir(STT_DEFAULT_ENGINE_INFO);
528 ret = readdir_r(dp, &entry, &dirp);
530 SLOG(LOG_ERROR, stt_tag(), "[File ERROR] Fail to read directory");
535 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
538 stt_engine_info_s* info;
542 filesize = strlen(STT_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 5;
543 filepath = (char*)calloc(filesize, sizeof(char));
545 if (NULL != filepath) {
546 snprintf(filepath, filesize, "%s/%s", STT_DEFAULT_ENGINE_INFO, dirp->d_name);
548 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Memory not enough!!");
552 if (0 == stt_parser_get_engine_info(filepath, &info)) {
553 g_engine_list = g_slist_append(g_engine_list, info);
556 if (NULL != filepath)
559 } while (NULL != dirp);
563 SLOG(LOG_WARN, stt_tag(), "[Config WARNING] Fail to open default directory");
566 __stt_config_mgr_print_engine_info();
568 if (0 != stt_parser_load_config(&g_config_info)) {
569 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to parse configure information");
573 if (true == g_config_info->auto_lang) {
574 /* Check language with display language */
575 __stt_config_set_auto_language();
577 if (false == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language)) {
578 /* Default language is not valid */
580 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
581 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
585 if (NULL != tmp_language) {
586 if (NULL != g_config_info->language) {
587 free(g_config_info->language);
588 g_config_info->language = strdup(tmp_language);
596 /* print daemon config */
597 SLOG(LOG_DEBUG, stt_tag(), "== Daemon config ==");
598 SECURE_SLOG(LOG_DEBUG, stt_tag(), " engine : %s", g_config_info->engine_id);
599 SECURE_SLOG(LOG_DEBUG, stt_tag(), " setting : %s", g_config_info->setting);
600 SECURE_SLOG(LOG_DEBUG, stt_tag(), " auto language : %s", g_config_info->auto_lang ? "on" : "off");
601 SECURE_SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
602 SECURE_SLOG(LOG_DEBUG, stt_tag(), " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
603 SLOG(LOG_DEBUG, stt_tag(), "===================");
605 if (0 != __stt_config_mgr_register_config_event()) {
606 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to register config event");
607 return STT_CONFIG_ERROR_OPERATION_FAILED;
610 /* Register to detect display language change */
611 vconf_notify_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb, NULL);
612 vconf_notify_key_changed(VCONFKEY_VOICE_INPUT_LANGUAGE, __stt_config_language_changed_cb, NULL);
614 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
615 temp_client->uid = uid;
616 temp_client->bool_cb = NULL;
617 temp_client->engine_cb = NULL;
618 temp_client->lang_cb = NULL;
619 temp_client->user_data = NULL;
622 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
624 return STT_CONFIG_ERROR_NONE;
627 int stt_config_mgr_finalize(int uid)
630 stt_config_client_s* temp_client = NULL;
632 if (0 < g_slist_length(g_config_client_list)) {
634 iter = g_slist_nth(g_config_client_list, 0);
636 while (NULL != iter) {
637 temp_client = iter->data;
639 if (NULL != temp_client) {
640 if (uid == temp_client->uid) {
641 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
648 iter = g_slist_next(iter);
652 if (0 < g_slist_length(g_config_client_list)) {
653 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
654 return STT_CONFIG_ERROR_NONE;
657 stt_engine_info_s *engine_info = NULL;
659 if (0 < g_slist_length(g_engine_list)) {
661 /* Get a first item */
662 iter = g_slist_nth(g_engine_list, 0);
664 while (NULL != iter) {
665 engine_info = iter->data;
667 if (NULL != engine_info) {
668 g_engine_list = g_slist_remove(g_engine_list, engine_info);
670 stt_parser_free_engine_info(engine_info);
673 iter = g_slist_nth(g_engine_list, 0);
677 vconf_ignore_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb);
678 vconf_ignore_key_changed(VCONFKEY_VOICE_INPUT_LANGUAGE, __stt_config_language_changed_cb);
680 __stt_config_mgr_unregister_config_event();
682 if (NULL != g_config_info) {
683 stt_parser_unload_config(g_config_info);
684 g_config_info = NULL;
687 return STT_CONFIG_ERROR_NONE;
690 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)
693 stt_config_client_s* temp_client = NULL;
695 /* Call all callbacks of client*/
696 iter = g_slist_nth(g_config_client_list, 0);
698 while (NULL != iter) {
699 temp_client = iter->data;
701 if (NULL != temp_client) {
702 if (uid == temp_client->uid) {
703 temp_client->engine_cb = engine_cb;
704 temp_client->lang_cb = lang_cb;
705 temp_client->bool_cb = bool_cb;
706 temp_client->user_data = user_data;
710 iter = g_slist_next(iter);
713 return STT_CONFIG_ERROR_NONE;
716 int stt_config_mgr_unset_callback(int uid)
719 stt_config_client_s* temp_client = NULL;
721 /* Call all callbacks of client*/
722 iter = g_slist_nth(g_config_client_list, 0);
724 while (NULL != iter) {
725 temp_client = iter->data;
727 if (NULL != temp_client) {
728 if (uid == temp_client->uid) {
729 temp_client->engine_cb = NULL;
730 temp_client->lang_cb = NULL;
731 temp_client->bool_cb = NULL;
732 temp_client->user_data = NULL;
736 iter = g_slist_next(iter);
739 return STT_CONFIG_ERROR_NONE;
742 int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void* user_data)
744 if (0 >= g_slist_length(g_config_client_list)) {
745 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
746 return STT_CONFIG_ERROR_INVALID_STATE;
749 if (NULL == callback) {
750 return STT_CONFIG_ERROR_INVALID_PARAMETER;
754 stt_engine_info_s *engine_info = NULL;
756 if (0 >= g_slist_length(g_engine_list)) {
757 SLOG(LOG_WARN, stt_tag(), "[ERROR] Engine list is NULL");
758 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
761 /* Get a first item */
762 iter = g_slist_nth(g_engine_list, 0);
764 while (NULL != iter) {
765 engine_info = iter->data;
767 if (NULL == engine_info) {
768 SLOG(LOG_ERROR, stt_tag(), " Engine info is NULL");
769 return STT_CONFIG_ERROR_OPERATION_FAILED;
772 if (false == callback(engine_info->uuid, engine_info->name,
773 engine_info->setting, engine_info->support_silence_detection, user_data)) {
777 iter = g_slist_next(iter);
780 return STT_CONFIG_ERROR_NONE;
783 int stt_config_mgr_get_engine(char** engine)
785 if (0 >= g_slist_length(g_config_client_list)) {
786 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
787 return STT_CONFIG_ERROR_INVALID_STATE;
790 if (NULL == engine) {
791 return STT_CONFIG_ERROR_INVALID_PARAMETER;
794 if (NULL != g_config_info->engine_id) {
795 *engine = strdup(g_config_info->engine_id);
797 SLOG(LOG_ERROR, stt_tag(), " Engine id is NULL");
798 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
801 return STT_CONFIG_ERROR_NONE;
804 int stt_config_mgr_set_engine(const char* engine)
806 if (0 >= g_slist_length(g_config_client_list)) {
807 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
808 return STT_CONFIG_ERROR_INVALID_STATE;
811 if (NULL == g_config_info) {
812 return STT_CONFIG_ERROR_OPERATION_FAILED;
815 if (NULL == engine || NULL == g_config_info->engine_id) {
816 return STT_CONFIG_ERROR_INVALID_PARAMETER;
819 /* Check current engine id with new engine id */
820 if (0 == strcmp(g_config_info->engine_id, engine)) {
824 SECURE_SLOG(LOG_DEBUG, stt_tag(), "New engine id : %s", engine);
827 stt_engine_info_s *engine_info = NULL;
828 bool is_valid_engine = false;
830 /* Get a first item */
831 iter = g_slist_nth(g_engine_list, 0);
833 while (NULL != iter) {
834 engine_info = iter->data;
836 if (NULL == engine_info) {
837 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
838 iter = g_slist_next(iter);
842 /* Check engine id is valid */
843 if (0 != strcmp(engine, engine_info->uuid)) {
844 iter = g_slist_next(iter);
848 if (NULL != g_config_info->engine_id)
849 free(g_config_info->engine_id);
851 g_config_info->engine_id = strdup(engine);
853 if (NULL != g_config_info->setting) {
854 free(g_config_info->setting);
857 if (NULL != engine_info->setting) {
858 g_config_info->setting = strdup(engine_info->setting);
860 g_config_info->setting = NULL;
864 GSList *iter_lang = NULL;
866 bool is_valid_lang = false;
868 /* Get a first item */
869 iter_lang = g_slist_nth(engine_info->languages, 0);
871 while (NULL != iter_lang) {
872 /*Get handle data from list*/
873 lang = iter_lang->data;
875 SECURE_SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
877 if (0 == strcmp(lang, g_config_info->language)) {
878 /* language is valid */
879 is_valid_lang = true;
881 if (NULL != g_config_info->language) {
882 free(g_config_info->language);
884 g_config_info->language = strdup(lang);
891 iter_lang = g_slist_next(iter_lang);
894 if (false == is_valid_lang) {
895 if (NULL != g_config_info->language) {
896 free(g_config_info->language);
898 iter_lang = g_slist_nth(engine_info->languages, 0);
899 lang = iter_lang->data;
901 g_config_info->language = strdup(lang);
906 if (false == engine_info->support_silence_detection) {
907 if (true == g_config_info->silence_detection)
908 g_config_info->silence_detection = false;
911 is_valid_engine = true;
915 if (true == is_valid_engine) {
916 SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
917 SECURE_SLOG(LOG_DEBUG, stt_tag(), " Engine : %s", g_config_info->engine_id);
918 SECURE_SLOG(LOG_DEBUG, stt_tag(), " Setting : %s", g_config_info->setting);
919 SECURE_SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
920 SECURE_SLOG(LOG_DEBUG, stt_tag(), " Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
922 if ( 0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
923 g_config_info->silence_detection)) {
924 SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
925 return STT_CONFIG_ERROR_OPERATION_FAILED;
928 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine id is not valid");
929 return STT_CONFIG_ERROR_INVALID_PARAMETER;
935 int stt_config_mgr_get_engine_agreement(const char* engine, char** agreement)
937 if (0 >= g_slist_length(g_engine_list)) {
938 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
939 return STT_CONFIG_ERROR_INVALID_STATE;
942 if (NULL == agreement) {
943 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
944 return STT_CONFIG_ERROR_INVALID_PARAMETER;
948 stt_engine_info_s *engine_info = NULL;
949 char* current_engine = NULL;
951 if (NULL == engine) {
952 current_engine = strdup(g_config_info->engine_id);
954 current_engine = strdup(engine);
957 /* Get a first item */
958 iter = g_slist_nth(g_engine_list, 0);
960 while (NULL != iter) {
961 engine_info = iter->data;
963 if (NULL == engine_info) {
964 SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
965 if (NULL != current_engine) free(current_engine);
966 return STT_CONFIG_ERROR_OPERATION_FAILED;
969 if (0 != strcmp(current_engine, engine_info->uuid)) {
970 iter = g_slist_next(iter);
974 if (NULL != engine_info->agreement) {
975 *agreement = strdup(engine_info->agreement);
977 SLOG(LOG_WARN, stt_tag(), "[WARNING] engine agreement is not support");
982 if (NULL != current_engine) free(current_engine);
984 return STT_CONFIG_ERROR_NONE;
987 int stt_config_mgr_get_language_list(const char* engine_id, stt_config_supported_langauge_cb callback, void* user_data)
989 if (0 >= g_slist_length(g_config_client_list)) {
990 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
991 return STT_CONFIG_ERROR_INVALID_STATE;
994 if (0 >= g_slist_length(g_engine_list)) {
995 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
996 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1000 stt_engine_info_s *engine_info = NULL;
1002 /* Get a first item */
1003 iter = g_slist_nth(g_engine_list, 0);
1005 while (NULL != iter) {
1006 engine_info = iter->data;
1008 if (NULL == engine_info) {
1009 SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1010 return STT_CONFIG_ERROR_OPERATION_FAILED;
1013 if (0 != strcmp(engine_id, engine_info->uuid)) {
1014 iter = g_slist_next(iter);
1018 GSList *iter_lang = NULL;
1021 /* Get a first item */
1022 iter_lang = g_slist_nth(engine_info->languages, 0);
1024 while (NULL != iter_lang) {
1025 /*Get handle data from list*/
1026 lang = iter_lang->data;
1028 SECURE_SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1030 if (false == callback(engine_info->uuid, lang, user_data))
1035 iter_lang = g_slist_next(iter_lang);
1040 return STT_CONFIG_ERROR_NONE;
1043 int stt_config_mgr_get_default_language(char** language)
1045 if (0 >= g_slist_length(g_config_client_list)) {
1046 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1047 return STT_CONFIG_ERROR_INVALID_STATE;
1050 if (NULL == language) {
1051 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1054 if (NULL != g_config_info->language) {
1055 *language = strdup(g_config_info->language);
1057 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1058 return STT_CONFIG_ERROR_OPERATION_FAILED;
1061 return STT_CONFIG_ERROR_NONE;
1064 int stt_config_mgr_set_default_language(const char* language)
1066 if (0 >= g_slist_length(g_config_client_list)) {
1067 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1068 return STT_CONFIG_ERROR_INVALID_STATE;
1071 if (NULL == language) {
1072 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1075 /* Check language is valid */
1076 if (NULL != g_config_info->language) {
1077 if (0 != stt_parser_set_language(language)) {
1078 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1079 return STT_CONFIG_ERROR_OPERATION_FAILED;
1081 free(g_config_info->language);
1082 g_config_info->language = strdup(language);
1084 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1085 return STT_CONFIG_ERROR_OPERATION_FAILED;
1088 return STT_CONFIG_ERROR_NONE;
1091 int stt_config_mgr_get_auto_language(bool* value)
1093 if (0 >= g_slist_length(g_config_client_list)) {
1094 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1095 return STT_CONFIG_ERROR_INVALID_STATE;
1098 if (NULL == value) {
1099 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1102 *value = g_config_info->auto_lang;
1104 return STT_CONFIG_ERROR_NONE;
1107 int stt_config_mgr_set_auto_language(bool value)
1109 if (0 >= g_slist_length(g_config_client_list)) {
1110 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1111 return STT_CONFIG_ERROR_INVALID_STATE;
1114 if (g_config_info->auto_lang != value) {
1115 /* Check language is valid */
1116 if (0 != stt_parser_set_auto_lang(value)) {
1117 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1118 return STT_CONFIG_ERROR_OPERATION_FAILED;
1120 g_config_info->auto_lang = value;
1122 if (true == g_config_info->auto_lang) {
1123 __stt_config_set_auto_language();
1127 return STT_CONFIG_ERROR_NONE;
1130 int stt_config_mgr_get_silence_detection(bool* value)
1132 if (0 >= g_slist_length(g_config_client_list)) {
1133 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1134 return STT_CONFIG_ERROR_INVALID_STATE;
1138 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1140 *value = g_config_info->silence_detection;
1142 return STT_CONFIG_ERROR_NONE;
1145 int stt_config_mgr_set_silence_detection(bool value)
1147 if (0 >= g_slist_length(g_config_client_list)) {
1148 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1149 return STT_CONFIG_ERROR_INVALID_STATE;
1152 if (0 != stt_parser_set_silence_detection(value)) {
1153 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1154 return STT_CONFIG_ERROR_OPERATION_FAILED;
1157 g_config_info->silence_detection = value;
1159 return STT_CONFIG_ERROR_NONE;
1162 bool stt_config_check_default_engine_is_valid(const char* engine)
1164 if (0 >= g_slist_length(g_config_client_list)) {
1165 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1169 if (NULL == engine) {
1173 if (0 >= g_slist_length(g_engine_list))
1176 GSList *iter = NULL;
1177 stt_engine_info_s *engine_info = NULL;
1179 /* Get a first item */
1180 iter = g_slist_nth(g_engine_list, 0);
1182 while (NULL != iter) {
1183 engine_info = iter->data;
1185 if (NULL != engine_info) {
1186 if (0 == strcmp(engine, engine_info->uuid)) {
1190 iter = g_slist_next(iter);
1196 bool stt_config_check_default_language_is_valid(const char* language)
1198 if (0 >= g_slist_length(g_config_client_list)) {
1199 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1203 if (NULL == language) {
1207 if (NULL == g_config_info->engine_id) {
1208 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Default engine id is NULL");
1212 if (0 >= g_slist_length(g_engine_list))
1215 GSList *iter = NULL;
1216 stt_engine_info_s *engine_info = NULL;
1218 /* Get a first item */
1219 iter = g_slist_nth(g_engine_list, 0);
1221 while (NULL != iter) {
1222 engine_info = iter->data;
1224 if (NULL == engine_info) {
1225 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1226 iter = g_slist_next(iter);
1230 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1231 iter = g_slist_next(iter);
1235 GSList *iter_lang = NULL;
1238 /* Get a first item */
1239 iter_lang = g_slist_nth(engine_info->languages, 0);
1241 while (NULL != iter_lang) {
1242 lang = iter_lang->data;
1244 if (0 == strcmp(language, lang))
1248 iter_lang = g_slist_next(iter_lang);
1256 int __stt_config_mgr_print_engine_info()
1258 GSList *iter = NULL;
1259 stt_engine_info_s *engine_info = NULL;
1261 if (0 >= g_slist_length(g_engine_list)) {
1262 SLOG(LOG_DEBUG, stt_tag(), "-------------- engine list -----------------");
1263 SLOG(LOG_DEBUG, stt_tag(), " No Engine in engine directory");
1264 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1268 /* Get a first item */
1269 iter = g_slist_nth(g_engine_list, 0);
1271 SLOG(LOG_DEBUG, stt_tag(), "--------------- engine list -----------------");
1274 while (NULL != iter) {
1275 engine_info = iter->data;
1277 SECURE_SLOG(LOG_DEBUG, stt_tag(), "[%dth]", i);
1278 SECURE_SLOG(LOG_DEBUG, stt_tag(), " name : %s", engine_info->name);
1279 SECURE_SLOG(LOG_DEBUG, stt_tag(), " id : %s", engine_info->uuid);
1280 SECURE_SLOG(LOG_DEBUG, stt_tag(), " setting : %s", engine_info->setting);
1281 SECURE_SLOG(LOG_DEBUG, stt_tag(), " agreement : %s", engine_info->agreement);
1283 SLOG(LOG_DEBUG, stt_tag(), " languages");
1284 GSList *iter_lang = NULL;
1286 if (g_slist_length(engine_info->languages) > 0) {
1287 /* Get a first item */
1288 iter_lang = g_slist_nth(engine_info->languages, 0);
1291 while (NULL != iter_lang) {
1292 /*Get handle data from list*/
1293 lang = iter_lang->data;
1295 SECURE_SLOG(LOG_DEBUG, stt_tag(), " [%dth] %s", j, lang);
1298 iter_lang = g_slist_next(iter_lang);
1302 SLOG(LOG_ERROR, stt_tag(), " language is NONE");
1304 SECURE_SLOG(LOG_DEBUG, stt_tag(), " silence support : %s",
1305 engine_info->support_silence_detection ? "true" : "false");
1306 iter = g_slist_next(iter);
1309 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1317 * time info functions
1319 static GSList* g_time_list = NULL;
1321 int stt_config_mgr_reset_time_info()
1323 /* Remove time info */
1324 GSList *iter = NULL;
1325 stt_result_time_info_s *data = NULL;
1327 /* Remove time info */
1328 iter = g_slist_nth(g_time_list, 0);
1329 while (NULL != iter) {
1332 g_time_list = g_slist_remove(g_time_list, data);
1334 if (NULL == data->text) free(data->text);
1339 iter = g_slist_nth(g_time_list, 0);
1345 int stt_config_mgr_add_time_info(int index, int event, const char* text, long start_time, long end_time)
1348 SLOG(LOG_ERROR, stt_tag(), "Invalid paramter : text is NULL");
1352 stt_result_time_info_s *info = (stt_result_time_info_s*)calloc(1, sizeof(stt_result_time_info_s));
1354 info->index = index;
1355 info->event = event;
1357 info->text = strdup(text);
1359 info->start_time = start_time;
1360 info->end_time = end_time;
1362 /* Add item to global list */
1363 g_time_list = g_slist_append(g_time_list, info);
1368 int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* user_data)
1370 if (NULL == callback) {
1371 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input paramter is NULL : callback function");
1372 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1375 GSList* temp_time = NULL;
1377 ret = stt_parser_get_time_info(&temp_time);
1379 SLOG(LOG_WARN, stt_tag(), "[WARNING] Fail to get time info : %d", ret);
1380 return STT_CONFIG_ERROR_OPERATION_FAILED;
1383 GSList *iter = NULL;
1384 stt_result_time_info_s *data = NULL;
1386 /* Get a first item */
1387 iter = g_slist_nth(temp_time, 0);
1388 while (NULL != iter) {
1391 if (false == callback(data->index, data->event, data->text,
1392 data->start_time, data->end_time, user_data)) {
1397 iter = g_slist_next(iter);
1400 /* Remove time info */
1401 iter = g_slist_nth(temp_time, 0);
1402 while (NULL != iter) {
1406 temp_time = g_slist_remove(temp_time, data);
1408 if (NULL == data->text) free(data->text);
1413 iter = g_slist_nth(temp_time, 0);
1416 return STT_CONFIG_ERROR_NONE;
1419 int stt_config_mgr_save_time_info_file()
1421 if (0 == g_slist_length(g_time_list)) {
1422 SLOG(LOG_WARN, stt_tag(), "[WARNING] There is no time info to save");
1423 return STT_CONFIG_ERROR_OPERATION_FAILED;
1427 ret = stt_parser_set_time_info(g_time_list);
1429 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save time info : %d", ret);
1430 return STT_CONFIG_ERROR_OPERATION_FAILED;
1433 return STT_CONFIG_ERROR_NONE;
1436 int stt_config_mgr_remove_time_info_file()
1438 stt_parser_clear_time_info();
1440 return STT_CONFIG_ERROR_NONE;