Add functions to set credential
[platform/core/uifw/stt.git] / common / stt_config_mgr.c
1 /*
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.
12 */
13
14 #include <dirent.h>
15 #include <dlfcn.h>
16 #include <dlog.h>
17 #include <Ecore.h>
18 #include <glib.h>
19 #include <unistd.h>
20 #include <sys/inotify.h>
21 #include <vconf.h>
22
23 #include "stt_config_mgr.h"
24 #include "stt_defs.h"
25 #include "stt_config_parser.h"
26
27
28 typedef struct {
29         int     uid;
30         stt_config_engine_changed_cb    engine_cb;
31         stt_config_lang_changed_cb      lang_cb;
32         stt_config_bool_changed_cb      bool_cb;
33         void*   user_data;
34 } stt_config_client_s;
35
36
37 extern const char* stt_tag();
38
39 static GSList* g_engine_list = NULL;
40
41 static GSList* g_config_client_list = NULL;
42
43 static stt_config_s* g_config_info;
44
45 static Ecore_Fd_Handler* g_fd_handler_noti = NULL;
46 static int g_fd_noti;
47 static int g_wd_noti;
48
49 int __stt_config_mgr_print_engine_info();
50
51 bool __stt_config_mgr_check_lang_is_valid(const char* engine_id, const char* language)
52 {
53         if (NULL == engine_id || NULL == language) {
54                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input parameter is NULL");
55                 return false;
56         }
57
58         GSList *iter = NULL;
59         stt_engine_info_s *engine_info = NULL;
60
61         if (0 >= g_slist_length(g_engine_list)) {
62                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] There is no engine!!");
63                 return false;
64         }
65
66         /* Get a first item */
67         iter = g_slist_nth(g_engine_list, 0);
68
69         while (NULL != iter) {
70                 engine_info = iter->data;
71
72                 if (NULL == engine_info) {
73                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
74                         return false;
75                 }
76
77                 if (0 != strcmp(engine_id, engine_info->uuid)) {
78                         iter = g_slist_next(iter);
79                         continue;
80                 }
81
82                 GSList *iter_lang = NULL;
83                 char* engine_lang;
84                 if (g_slist_length(engine_info->languages) > 0) {
85                         /* Get a first item */
86                         iter_lang = g_slist_nth(engine_info->languages, 0);
87
88                         int i = 1;
89                         while (NULL != iter_lang) {
90                                 /*Get handle data from list*/
91                                 engine_lang = iter_lang->data;
92
93                                 SLOG(LOG_DEBUG, stt_tag(), "  [%dth] %s", i, engine_lang);
94
95                                 if (0 == strcmp(language, engine_lang)) {
96                                         return true;
97                                 }
98
99                                 /*Get next item*/
100                                 iter_lang = g_slist_next(iter_lang);
101                                 i++;
102                         }
103                 }
104                 break;
105         }
106
107         return false;
108 }
109
110 int __stt_config_mgr_select_lang(const char* engine_id, char** language)
111 {
112         if (NULL == engine_id || NULL == language) {
113                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input parameter is NULL");
114                 return false;
115         }
116
117         GSList *iter = NULL;
118         stt_engine_info_s *engine_info = NULL;
119
120         if (0 >= g_slist_length(g_engine_list)) {
121                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] There is no engine!!");
122                 return false;
123         }
124
125         /* Get a first item */
126         iter = g_slist_nth(g_engine_list, 0);
127
128         while (NULL != iter) {
129                 engine_info = iter->data;
130
131                 if (NULL == engine_info) {
132                         SLOG(LOG_ERROR, stt_tag(), "engine info is NULL");
133                         return false;
134                 }
135
136                 if (0 != strcmp(engine_id, engine_info->uuid)) {
137                         iter = g_slist_next(iter);
138                         continue;
139                 }
140
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);
146
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);
154                                                 return 0;
155                                         }
156                                 }
157
158                                 iter_lang = g_slist_next(iter_lang);
159                         }
160
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);
165                                 return 0;
166                         }
167                 }
168                 break;
169         }
170
171         return -1;
172 }
173
174 Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
175 {
176         SLOG(LOG_DEBUG, stt_tag(), "===== Config changed callback event");
177
178         int length;
179         struct inotify_event event;
180         memset(&event, '\0', sizeof(struct inotify_event));
181
182         length = read(g_fd_noti, &event, sizeof(struct inotify_event));
183         if (0 > length) {
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;
188         }
189
190         if (IN_MODIFY == event.mask) {
191                 char* engine = NULL;
192                 char* setting = NULL;
193                 char* lang = NULL;
194                 int auto_lang = -1;
195                 int silence = -1;
196                 int credential = -1;
197
198                 GSList *iter = NULL;
199                 stt_config_client_s* temp_client = NULL;
200
201                 if (0 != stt_parser_find_config_changed(&engine, &setting, &auto_lang, &lang, &silence, &credential))
202                         return ECORE_CALLBACK_PASS_ON;
203
204                 /* Engine changed */
205                 if (NULL != engine || NULL != setting) {
206                         /* engine changed */
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);
210                         }
211
212                         if (NULL != setting) {
213                                 if (NULL != g_config_info->setting)     free(g_config_info->setting);
214                                 g_config_info->setting = strdup(setting);
215                         }
216
217                         if (NULL != lang) {
218                                 if (NULL != g_config_info->language)    free(g_config_info->language);
219                                 g_config_info->language = strdup(lang);
220                         }
221
222                         if (-1 != silence)      g_config_info->silence_detection = silence;
223
224                         if (-1 != credential)   g_config_info->credential = credential;
225
226                         /* Call all callbacks of client*/
227                         iter = g_slist_nth(g_config_client_list, 0);
228
229                         while (NULL != iter) {
230                                 temp_client = iter->data;
231
232                                 if (NULL != temp_client) {
233                                         if (NULL != temp_client->engine_cb) {
234                                                 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
235                                                         g_config_info->silence_detection, g_config_info->credential, temp_client->user_data);
236                                         }
237                                 }
238
239                                 iter = g_slist_next(iter);
240                         }
241                 }
242
243                 if (-1 != auto_lang) {
244                         g_config_info->auto_lang = auto_lang;
245                 }
246
247                 /* Only language changed */
248                 if (NULL == engine && NULL != lang) {
249                         char* before_lang = NULL;
250                         before_lang = strdup(g_config_info->language);
251
252                         if (NULL != lang) {
253                                 if (NULL != g_config_info->language)    free(g_config_info->language);
254                                 g_config_info->language = strdup(lang);
255                         }
256
257                         /* Call all callbacks of client*/
258                         iter = g_slist_nth(g_config_client_list, 0);
259
260                         while (NULL != iter) {
261                                 temp_client = iter->data;
262
263                                 if (NULL != temp_client) {
264                                         if (NULL != temp_client->lang_cb) {
265                                                 temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
266                                         }
267                                 }
268
269                                 iter = g_slist_next(iter);
270                         }
271
272                         if (NULL != before_lang) {
273                                 free(before_lang);
274                         }
275                 }
276
277                 if (-1 != silence) {
278                         /* silence detection changed */
279                         g_config_info->silence_detection = silence;
280
281                         /* Call all callbacks of client*/
282                         iter = g_slist_nth(g_config_client_list, 0);
283
284                         while (NULL != iter) {
285                                 temp_client = iter->data;
286
287                                 if (NULL != temp_client) {
288                                         if (NULL != temp_client->bool_cb) {
289                                                 temp_client->bool_cb(STT_CONFIG_TYPE_OPTION_SILENCE_DETECTION, silence, temp_client->user_data);
290                                         }
291                                 }
292
293                                 iter = g_slist_next(iter);
294                         }
295                 }
296
297                 if (NULL != engine)     free(engine);
298                 if (NULL != setting)    free(setting);
299                 if (NULL != lang)       free(lang);
300         } else {
301                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Undefined event");
302         }
303
304         SLOG(LOG_DEBUG, stt_tag(), "=====");
305         SLOG(LOG_DEBUG, stt_tag(), " ");
306
307         return ECORE_CALLBACK_PASS_ON;
308 }
309
310 int __stt_config_mgr_register_config_event()
311 {
312         /* get file notification handler */
313         int fd;
314         int wd;
315
316         fd = inotify_init();
317         if (fd < 0) {
318                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail get inotify fd");
319                 return -1;
320         }
321         g_fd_noti = fd;
322
323         wd = inotify_add_watch(fd, STT_CONFIG, IN_MODIFY);
324         g_wd_noti = wd;
325
326         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);
327         if (NULL == g_fd_handler_noti) {
328                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get handler_noti");
329                 return -1;
330         }
331
332         return 0;
333 }
334
335 int __stt_config_mgr_unregister_config_event()
336 {
337         /* delete inotify variable */
338         ecore_main_fd_handler_del(g_fd_handler_noti);
339         inotify_rm_watch(g_fd_noti, g_wd_noti);
340         close(g_fd_noti);
341
342         return 0;
343 }
344
345 int __stt_config_set_auto_language()
346 {
347         char* value = NULL;
348         char candidate_lang[6] = {'\0', };
349
350         value = vconf_get_str(VCONFKEY_LANGSET);
351         if (NULL == value) {
352                 SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Fail to get display language");
353                 return -1;
354         }
355
356         strncpy(candidate_lang, value, 5);
357         free(value);
358
359         /* Check current config info */
360         if (NULL == g_config_info) {
361                 SLOG(LOG_ERROR, stt_tag(), "Current config info is NULL");
362                 return STT_CONFIG_ERROR_OPERATION_FAILED;
363         }
364         
365         /* Check current language */
366         if (NULL == g_config_info->language) {
367                 SLOG(LOG_ERROR, stt_tag(), "Current config language is NULL");
368                 return STT_CONFIG_ERROR_OPERATION_FAILED;
369         }
370
371         if (0 == strncmp(g_config_info->language, candidate_lang, 5)) {
372                 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. STT language(%s) is same with display lang", g_config_info->language);
373                 return 0;
374         } else {
375                 SLOG(LOG_DEBUG, stt_tag(), "[Config] Display language : %s", candidate_lang);
376         }
377
378         if (true == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, candidate_lang)) {
379                 char* before_lang = NULL;
380                 if (0 != stt_parser_set_language(candidate_lang)) {
381                         SLOG(LOG_ERROR, stt_tag(), "Fail to save default language");
382                         return -1;
383                 }
384
385                 before_lang = strdup(g_config_info->language);
386
387                 free(g_config_info->language);
388                 g_config_info->language = strdup(candidate_lang);
389
390                 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. Set default language(%s)", g_config_info->language);
391
392                 /* Call all callbacks of client*/
393                 GSList *iter = NULL;
394                 stt_config_client_s* temp_client = NULL;
395
396                 iter = g_slist_nth(g_config_client_list, 0);
397
398                 while (NULL != iter) {
399                         temp_client = iter->data;
400
401                         if (NULL != temp_client) {
402                                 if (NULL != temp_client->lang_cb) {
403                                         temp_client->lang_cb(before_lang, g_config_info->language, temp_client->user_data);
404                                 }
405                         }
406
407                         iter = g_slist_next(iter);
408                 }
409
410                 if (NULL != before_lang) {
411                         free(before_lang);
412                 }
413         } else {
414                 /* Candidate language is not valid */
415                 char* tmp_language = NULL;
416                 if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
417                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
418                         return -1;
419                 }
420
421                 if (NULL == tmp_language) {
422                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Selected language is NULL");
423                         return -1;
424                 }
425
426                 if (0 != stt_parser_set_language(tmp_language)) {
427                         free(tmp_language);
428                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save config");
429                         return -1;
430                 }
431
432                 SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto but display lang is not supported. Default language change(%s)", tmp_language);
433
434                 /* Call all callbacks of client*/
435                 GSList *iter = NULL;
436                 stt_config_client_s* temp_client = NULL;
437
438                 iter = g_slist_nth(g_config_client_list, 0);
439
440                 while (NULL != iter) {
441                         temp_client = iter->data;
442
443                         if (NULL != temp_client) {
444                                 if (NULL != temp_client->lang_cb) {
445                                         temp_client->lang_cb(g_config_info->language, tmp_language, temp_client->user_data);
446                                 }
447                         }
448
449                         iter = g_slist_next(iter);
450                 }
451
452                 free(g_config_info->language);
453                 g_config_info->language = strdup(tmp_language);
454
455                 free(tmp_language);
456         }
457
458         return 0;
459 }
460
461 void __stt_config_language_changed_cb(keynode_t *key, void *data)
462 {
463         if (true == g_config_info->auto_lang) {
464                 /* Get voice input vconf key */
465                 __stt_config_set_auto_language();
466         }
467
468         return;
469 }
470
471 void __stt_config_release_client(int uid)
472 {
473         GSList *iter = NULL;
474         stt_config_client_s* temp_client = NULL;
475
476         if (0 < g_slist_length(g_config_client_list)) {
477                 /* Check uid */
478                 iter = g_slist_nth(g_config_client_list, 0);
479
480                 while (NULL != iter) {
481                         temp_client = iter->data;
482
483                         if (NULL != temp_client) {
484                                 if (uid == temp_client->uid) {
485                                         g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
486                                         free(temp_client);
487                                         temp_client = NULL;
488                                         break;
489                                 }
490                         }
491
492                         iter = g_slist_next(iter);
493                 }
494         }
495
496         if (0 < g_slist_length(g_config_client_list)) {
497                 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
498         }
499         return;
500 }
501
502 void __stt_config_release_engine()
503 {
504         GSList *iter = NULL;
505         stt_engine_info_s *engine_info = NULL;
506
507         if (0 < g_slist_length(g_engine_list)) {
508
509                 /* Get a first item */
510                 iter = g_slist_nth(g_engine_list, 0);
511
512                 while (NULL != iter) {
513                         engine_info = iter->data;
514
515                         if (NULL != engine_info) {
516                                 g_engine_list = g_slist_remove(g_engine_list, engine_info);
517
518                                 stt_parser_free_engine_info(engine_info);
519                         }
520
521                         iter = g_slist_nth(g_engine_list, 0);
522                 }
523         }
524         return;
525 }
526
527 int __stt_config_mgr_check_engine_is_valid(const char* engine_id)
528 {
529         if (NULL == engine_id) {
530                 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
531                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
532         }
533
534         GSList *iter = NULL;
535         stt_engine_info_s *engine_info = NULL;
536
537         if (0 >= g_slist_length(g_engine_list)) {
538                 SLOG(LOG_ERROR, stt_tag(), "There is no engine!!");
539                 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
540         }
541
542         /* Get a first item */
543         iter = g_slist_nth(g_engine_list, 0);
544
545         while (NULL != iter) {
546                 engine_info = iter->data;
547
548                 if (NULL == engine_info) {
549                         SLOG(LOG_ERROR, stt_tag(), "engine info is NULL");
550                         return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
551                 }
552
553                 if (0 == strcmp(engine_id, engine_info->uuid)) {
554                         SLOG(LOG_DEBUG, stt_tag(), "Default engine is valid : %s", engine_id);
555                         return STT_CONFIG_ERROR_NONE;
556                 }
557
558                 iter = g_slist_next(iter);
559         }
560
561         /* Change default engine */
562         iter = g_slist_nth(g_engine_list, 0);
563         engine_info = iter->data;
564         if (NULL == engine_info) {
565                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
566                 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
567         }
568
569         if (NULL != g_config_info->engine_id) {
570                 free(g_config_info->engine_id);
571                 g_config_info->engine_id = NULL;
572         }
573         if (NULL != g_config_info->setting) {
574                 free(g_config_info->setting);
575                 g_config_info->setting = NULL;
576         }
577
578         if (NULL != engine_info->uuid) {
579                 g_config_info->engine_id = strdup(engine_info->uuid);
580         }
581
582         if (NULL != engine_info->setting) {
583                 g_config_info->setting = strdup(engine_info->setting);
584         }
585
586         /* Engine is valid*/
587         GSList *iter_lang = NULL;
588         char* lang;
589         bool is_valid_lang = false;
590
591         if (0 >= g_slist_length(engine_info->languages)) {
592                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Empty supported language");
593                 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
594         }
595
596         /* Get a first item */
597         iter_lang = g_slist_nth(engine_info->languages, 0);
598
599         while (NULL != iter_lang) {
600                 /*Get handle data from list*/
601                 lang = iter_lang->data;
602
603                 SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
604                 if (NULL != lang) {
605                         if (0 == strcmp(lang, g_config_info->language)) {
606                                 /* language is valid */
607                                 is_valid_lang = true;
608                                 break;
609                         }
610                 }
611
612                 /*Get next item*/
613                 iter_lang = g_slist_next(iter_lang);
614         }
615
616         if (false == is_valid_lang) {
617                 iter_lang = g_slist_nth(engine_info->languages, 0);
618                 if (NULL != iter_lang) {
619                         lang = iter_lang->data;
620                         if (NULL != lang) {
621                                 if (NULL != g_config_info->language)
622                                         free(g_config_info->language);
623                                 g_config_info->language = strdup(lang);
624                         }
625                 }
626         }
627
628         /* Check options */
629         if (false == engine_info->support_silence_detection) {
630                 if (true == g_config_info->silence_detection)
631                         g_config_info->silence_detection = false;
632         }
633
634         SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
635         SLOG(LOG_DEBUG, stt_tag(), "  Engine : %s", g_config_info->engine_id);
636         SLOG(LOG_DEBUG, stt_tag(), "  Setting : %s", g_config_info->setting);
637         SLOG(LOG_DEBUG, stt_tag(), "  language : %s", g_config_info->language);
638         SLOG(LOG_DEBUG, stt_tag(), "  Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
639         SLOG(LOG_DEBUG, stt_tag(), "  Credential : %s", g_config_info->credential ? "true" : "false");
640
641         if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
642                 g_config_info->silence_detection, g_config_info->credential)) {
643                         SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
644                         return STT_CONFIG_ERROR_OPERATION_FAILED;
645         }
646
647         return STT_CONFIG_ERROR_NONE;
648 }
649
650 int stt_config_mgr_initialize(int uid)
651 {
652         GSList *iter = NULL;
653         int* get_uid;
654         stt_config_client_s* temp_client = NULL;
655
656         if (0 < g_slist_length(g_config_client_list)) {
657                 /* Check uid */
658                 iter = g_slist_nth(g_config_client_list, 0);
659
660                 while (NULL != iter) {
661                         get_uid = iter->data;
662
663                         if (uid == *get_uid) {
664                                 SLOG(LOG_WARN, stt_tag(), "[CONFIG] uid(%d) has already registered", uid);
665                                 return 0;
666                         }
667
668                         iter = g_slist_next(iter);
669                 }
670
671                 temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
672                 if (NULL == temp_client) {
673                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
674                         return STT_CONFIG_ERROR_OUT_OF_MEMORY;
675                 }
676                 temp_client->uid = uid;
677                 temp_client->bool_cb = NULL;
678                 temp_client->engine_cb = NULL;
679                 temp_client->lang_cb = NULL;
680                 temp_client->user_data = NULL;
681
682                 /* Add uid */
683                 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
684
685                 SLOG(LOG_WARN, stt_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
686                 return STT_CONFIG_ERROR_NONE;
687         }
688
689         /* Get file name from default engine directory */
690         DIR *dp = NULL;
691         int ret = -1;
692         struct dirent entry;
693         struct dirent *dirp = NULL;
694
695         g_engine_list = NULL;
696
697         SLOG(LOG_WARN, stt_tag(), "[CONFIG] default engine info(%s)", STT_DEFAULT_ENGINE_INFO);
698         dp  = opendir(STT_DEFAULT_ENGINE_INFO);
699         if (NULL != dp) {
700                 do {
701                         ret = readdir_r(dp, &entry, &dirp);
702                         if (0 != ret) {
703                                 SLOG(LOG_ERROR, stt_tag(), "[File ERROR] Fail to read directory");
704                                 break;
705                         }
706
707                         if (NULL != dirp) {
708                                 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
709                                         continue;
710
711                                 stt_engine_info_s* info;
712                                 char* filepath;
713                                 int filesize;
714
715                                 filesize = strlen(STT_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 5;
716                                 filepath = (char*)calloc(filesize, sizeof(char));
717
718                                 if (NULL != filepath) {
719                                         snprintf(filepath, filesize, "%s/%s", STT_DEFAULT_ENGINE_INFO, dirp->d_name);
720                                 } else {
721                                         SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Memory not enough!!");
722                                         continue;
723                                 }
724
725                                 if (0 == stt_parser_get_engine_info(filepath, &info)) {
726                                         g_engine_list = g_slist_append(g_engine_list, info);
727                                 }
728
729                                 if (NULL != filepath)
730                                         free(filepath);
731                         }
732                 } while (NULL != dirp);
733
734                 closedir(dp);
735         } else {
736                 SLOG(LOG_WARN, stt_tag(), "[Config WARNING] Fail to open default directory");
737         }
738
739         __stt_config_mgr_print_engine_info();
740
741         if (0 != stt_parser_load_config(&g_config_info)) {
742                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to parse configure information");
743                 __stt_config_release_client(uid);
744                 __stt_config_release_engine();
745                 return STT_CONFIG_ERROR_OPERATION_FAILED;
746         }
747
748         /* Check whether engine id is valid */
749         if (0 != __stt_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
750                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to get default engine");
751                 __stt_config_release_client(uid);
752                 __stt_config_release_engine();
753                 stt_parser_unload_config(g_config_info);
754                 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
755         }
756
757         if (true == g_config_info->auto_lang) {
758                 /* Check language with display language */
759                 __stt_config_set_auto_language();
760         } else {
761                 if (false == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language)) {
762                         /* Default language is not valid */
763                         char* tmp_language;
764                         if (0 != __stt_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
765                                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to select language");
766                                 __stt_config_release_client(uid);
767                                 __stt_config_release_engine();
768                                 stt_parser_unload_config(g_config_info);
769                                 return STT_CONFIG_ERROR_OPERATION_FAILED;
770                         }
771
772                         if (NULL != tmp_language) {
773                                 if (NULL != g_config_info->language) {
774                                         free(g_config_info->language);
775                                         g_config_info->language = strdup(tmp_language);
776                                 }
777
778                                 free(tmp_language);
779                         }
780                 }
781         }
782
783         /* print daemon config */
784         SLOG(LOG_DEBUG, stt_tag(), "== Daemon config ==");
785         SLOG(LOG_DEBUG, stt_tag(), " engine : %s", g_config_info->engine_id);
786         SLOG(LOG_DEBUG, stt_tag(), " setting : %s", g_config_info->setting);
787         SLOG(LOG_DEBUG, stt_tag(), " auto language : %s", g_config_info->auto_lang ? "on" : "off");
788         SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
789         SLOG(LOG_DEBUG, stt_tag(), " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
790         SLOG(LOG_DEBUG, stt_tag(), " credential : %s", g_config_info->credential ? "true" : "false");
791         SLOG(LOG_DEBUG, stt_tag(), "===================");
792
793         if (0 != __stt_config_mgr_register_config_event()) {
794                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to register config event");
795                 __stt_config_release_client(uid);
796                 __stt_config_release_engine();
797                 stt_parser_unload_config(g_config_info);
798                 return STT_CONFIG_ERROR_OPERATION_FAILED;
799         }
800
801         /* Register to detect display language change */
802         vconf_notify_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb, NULL);
803
804         temp_client = (stt_config_client_s*)calloc(1, sizeof(stt_config_client_s));
805         if (NULL == temp_client) {
806                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
807                 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
808         }
809         temp_client->uid = uid;
810         temp_client->bool_cb = NULL;
811         temp_client->engine_cb = NULL;
812         temp_client->lang_cb = NULL;
813         temp_client->user_data = NULL;
814
815         /* Add uid */
816         g_config_client_list = g_slist_append(g_config_client_list, temp_client);
817
818         return STT_CONFIG_ERROR_NONE;
819 }
820
821 int stt_config_mgr_finalize(int uid)
822 {
823         GSList *iter = NULL;
824         stt_config_client_s* temp_client = NULL;
825
826         if (0 < g_slist_length(g_config_client_list)) {
827                 /* Check uid */
828                 iter = g_slist_nth(g_config_client_list, 0);
829
830                 while (NULL != iter) {
831                         temp_client = iter->data;
832
833                         if (NULL != temp_client) {
834                                 if (uid == temp_client->uid) {
835                                         g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
836                                         free(temp_client);
837                                         temp_client = NULL;
838                                         break;
839                                 }
840                         }
841
842                         iter = g_slist_next(iter);
843                 }
844         }
845
846         if (0 < g_slist_length(g_config_client_list)) {
847                 SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
848                 return STT_CONFIG_ERROR_NONE;
849         }
850
851         stt_engine_info_s *engine_info = NULL;
852
853         if (0 < g_slist_length(g_engine_list)) {
854
855                 /* Get a first item */
856                 iter = g_slist_nth(g_engine_list, 0);
857
858                 while (NULL != iter) {
859                         engine_info = iter->data;
860
861                         if (NULL != engine_info) {
862                                 g_engine_list = g_slist_remove(g_engine_list, engine_info);
863
864                                 stt_parser_free_engine_info(engine_info);
865                         }
866
867                         iter = g_slist_nth(g_engine_list, 0);
868                 }
869         }
870
871         vconf_ignore_key_changed(VCONFKEY_LANGSET, __stt_config_language_changed_cb);
872
873         __stt_config_mgr_unregister_config_event();
874
875         if (NULL != g_config_info) {
876                 stt_parser_unload_config(g_config_info);
877                 g_config_info = NULL;
878         }
879
880         return STT_CONFIG_ERROR_NONE;
881 }
882
883 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)
884 {
885         GSList *iter = NULL;
886         stt_config_client_s* temp_client = NULL;
887
888         /* Call all callbacks of client*/
889         iter = g_slist_nth(g_config_client_list, 0);
890
891         while (NULL != iter) {
892                 temp_client = iter->data;
893
894                 if (NULL != temp_client) {
895                         if (uid == temp_client->uid) {
896                                 temp_client->engine_cb = engine_cb;
897                                 temp_client->lang_cb = lang_cb;
898                                 temp_client->bool_cb = bool_cb;
899                                 temp_client->user_data = user_data;
900                         }
901                 }
902
903                 iter = g_slist_next(iter);
904         }
905
906         return STT_CONFIG_ERROR_NONE;
907 }
908
909 int stt_config_mgr_unset_callback(int uid)
910 {
911         GSList *iter = NULL;
912         stt_config_client_s* temp_client = NULL;
913
914         /* Call all callbacks of client*/
915         iter = g_slist_nth(g_config_client_list, 0);
916
917         while (NULL != iter) {
918                 temp_client = iter->data;
919
920                 if (NULL != temp_client) {
921                         if (uid == temp_client->uid) {
922                                 temp_client->engine_cb = NULL;
923                                 temp_client->lang_cb = NULL;
924                                 temp_client->bool_cb = NULL;
925                                 temp_client->user_data = NULL;
926                         }
927                 }
928
929                 iter = g_slist_next(iter);
930         }
931
932         return STT_CONFIG_ERROR_NONE;
933 }
934
935 int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void* user_data)
936 {
937         if (0 >= g_slist_length(g_config_client_list)) {
938                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
939                 return STT_CONFIG_ERROR_INVALID_STATE;
940         }
941
942         if (NULL == callback) {
943                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
944         }
945
946         GSList *iter = NULL;
947         stt_engine_info_s *engine_info = NULL;
948
949         if (0 >= g_slist_length(g_engine_list)) {
950                 SLOG(LOG_WARN, stt_tag(), "[ERROR] Engine list is NULL");
951                 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
952         }
953
954         /* Get a first item */
955         iter = g_slist_nth(g_engine_list, 0);
956
957         while (NULL != iter) {
958                 engine_info = iter->data;
959
960                 if (NULL == engine_info) {
961                         SLOG(LOG_ERROR, stt_tag(), " Engine info is NULL");
962                         return STT_CONFIG_ERROR_OPERATION_FAILED;
963                 }
964
965                 if (false == callback(engine_info->uuid, engine_info->name, 
966                         engine_info->setting, engine_info->support_silence_detection, user_data)) {
967                         break;
968                 }
969
970                 iter = g_slist_next(iter);
971         }
972
973         return STT_CONFIG_ERROR_NONE;
974 }
975
976 int stt_config_mgr_get_engine(char** engine)
977 {
978         if (0 >= g_slist_length(g_config_client_list)) {
979                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
980                 return STT_CONFIG_ERROR_INVALID_STATE;
981         }
982
983         if (NULL == engine) {
984                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
985         }
986
987         if (NULL != g_config_info->engine_id) {
988                 *engine = strdup(g_config_info->engine_id);
989         } else {
990                 SLOG(LOG_ERROR, stt_tag(), " Engine id is NULL");
991                 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
992         }
993
994         return STT_CONFIG_ERROR_NONE;
995 }
996
997 int stt_config_mgr_set_engine(const char* engine)
998 {
999         if (0 >= g_slist_length(g_config_client_list)) {
1000                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1001                 return STT_CONFIG_ERROR_INVALID_STATE;
1002         }
1003
1004         if (NULL == g_config_info) {
1005                 return STT_CONFIG_ERROR_OPERATION_FAILED;
1006         }
1007
1008         if (NULL == engine || NULL == g_config_info->engine_id) {
1009                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1010         }
1011
1012         /* Check current engine id with new engine id */
1013         if (0 == strcmp(g_config_info->engine_id, engine)) {
1014                 return 0;
1015         }
1016
1017         SLOG(LOG_DEBUG, stt_tag(), "New engine id : %s", engine);
1018
1019         GSList *iter = NULL;
1020         stt_engine_info_s *engine_info = NULL;
1021         bool is_valid_engine = false;
1022
1023         /* Get a first item */
1024         iter = g_slist_nth(g_engine_list, 0);
1025
1026         while (NULL != iter) {
1027                 engine_info = iter->data;
1028
1029                 if (NULL == engine_info) {
1030                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1031                         iter = g_slist_next(iter);
1032                         continue;
1033                 }
1034
1035                 /* Check engine id is valid */
1036                 if (0 != strcmp(engine, engine_info->uuid)) {
1037                         iter = g_slist_next(iter);
1038                         continue;
1039                 }
1040
1041                 if (NULL != g_config_info->engine_id)
1042                         free(g_config_info->engine_id);
1043
1044                 g_config_info->engine_id = strdup(engine);
1045
1046                 if (NULL != g_config_info->setting) {
1047                         free(g_config_info->setting);
1048                 }
1049
1050                 if (NULL != engine_info->setting) {
1051                         g_config_info->setting = strdup(engine_info->setting);
1052                 } else {
1053                         g_config_info->setting = NULL;
1054                 }
1055
1056                 /* Engine is valid*/
1057                 GSList *iter_lang = NULL;
1058                 char* lang;
1059                 bool is_valid_lang = false;
1060
1061                 /* Get a first item */
1062                 iter_lang = g_slist_nth(engine_info->languages, 0);
1063
1064                 while (NULL != iter_lang) {
1065                         /*Get handle data from list*/
1066                         lang = iter_lang->data;
1067
1068                         SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1069                         if (NULL != lang && NULL != g_config_info->language) {
1070                                 if (0 == strcmp(lang, g_config_info->language)) {       
1071                                         /* language is valid */
1072                                         is_valid_lang = true;
1073
1074                                         free(g_config_info->language);
1075                                         g_config_info->language = strdup(lang);
1076
1077                                         break;
1078                                 }
1079                         }
1080
1081                         /*Get next item*/
1082                         iter_lang = g_slist_next(iter_lang);
1083                 }
1084
1085                 if (false == is_valid_lang) {
1086                         if (NULL != g_config_info->language) {
1087                                 free(g_config_info->language);
1088
1089                                 iter_lang = g_slist_nth(engine_info->languages, 0);
1090                                 lang = iter_lang->data;
1091
1092                                 g_config_info->language = strdup(lang);
1093                         }
1094                 }
1095
1096                 /* Check options */
1097                 if (false == engine_info->support_silence_detection) {
1098                         if (true == g_config_info->silence_detection)
1099                                 g_config_info->silence_detection = false;
1100                 }
1101
1102                 if (false == engine_info->need_credential) {
1103                         if (true == g_config_info->credential)
1104                                 g_config_info->credential = false;
1105                 }
1106
1107                 is_valid_engine = true;
1108                 break;
1109         }
1110
1111         if (true == is_valid_engine) {
1112                 SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
1113                 SLOG(LOG_DEBUG, stt_tag(), "  Engine : %s", g_config_info->engine_id);
1114                 SLOG(LOG_DEBUG, stt_tag(), "  Setting : %s", g_config_info->setting);
1115                 SLOG(LOG_DEBUG, stt_tag(), "  language : %s", g_config_info->language);
1116                 SLOG(LOG_DEBUG, stt_tag(), "  Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
1117                 SLOG(LOG_DEBUG, stt_tag(), "  Credential : %s", g_config_info->credential ? "true" : "false");
1118
1119                 if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
1120                         g_config_info->silence_detection, g_config_info->credential)) {
1121                                 SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
1122                                 return STT_CONFIG_ERROR_OPERATION_FAILED;
1123                 }
1124         } else {
1125                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine id is not valid");
1126                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1127         }
1128
1129         return 0;
1130 }
1131
1132 int stt_config_mgr_get_engine_agreement(const char* engine, char** agreement)
1133 {
1134         if (0 >= g_slist_length(g_engine_list)) {
1135                 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
1136                 return STT_CONFIG_ERROR_INVALID_STATE;
1137         }
1138
1139         if (NULL == agreement) {
1140                 SLOG(LOG_ERROR, stt_tag(), "Input parameter is NULL");
1141                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1142         }
1143
1144         GSList *iter = NULL;
1145         stt_engine_info_s *engine_info = NULL;
1146         char* current_engine = NULL;
1147
1148         if (NULL == engine) {
1149                 current_engine = strdup(g_config_info->engine_id);
1150                 if (NULL == current_engine) {
1151                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1152                         return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1153                 }
1154         } else {
1155                 current_engine = strdup(engine);
1156                 if (NULL == current_engine) {
1157                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1158                         return STT_CONFIG_ERROR_OUT_OF_MEMORY;;
1159                 }
1160         }
1161
1162         /* Get a first item */
1163         iter = g_slist_nth(g_engine_list, 0);
1164
1165         while (NULL != iter) {
1166                 engine_info = iter->data;
1167
1168                 if (NULL == engine_info) {
1169                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1170                         if (NULL != current_engine)     free(current_engine);
1171                         return STT_CONFIG_ERROR_OPERATION_FAILED;
1172                 }
1173
1174                 if (0 != strcmp(current_engine, engine_info->uuid)) {
1175                         iter = g_slist_next(iter);
1176                         continue;
1177                 }
1178
1179                 if (NULL != engine_info->agreement) {
1180                         *agreement = strdup(engine_info->agreement);
1181                 } else {
1182                         SLOG(LOG_WARN, stt_tag(), "[WARNING] engine agreement is not support");
1183                 }
1184                 break;
1185         }
1186
1187         if (NULL != current_engine)     free(current_engine);
1188
1189         return STT_CONFIG_ERROR_NONE;
1190 }
1191
1192 int stt_config_mgr_get_language_list(const char* engine_id, stt_config_supported_langauge_cb callback, void* user_data)
1193 {
1194         if (0 >= g_slist_length(g_config_client_list)) {
1195                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1196                 return STT_CONFIG_ERROR_INVALID_STATE;
1197         }
1198
1199         if (0 >= g_slist_length(g_engine_list)) {
1200                 SLOG(LOG_ERROR, stt_tag(), "There is no engine");
1201                 return STT_CONFIG_ERROR_ENGINE_NOT_FOUND;
1202         }
1203
1204         GSList *iter = NULL;
1205         stt_engine_info_s *engine_info = NULL;
1206
1207         /* Get a first item */
1208         iter = g_slist_nth(g_engine_list, 0);
1209
1210         while (NULL != iter) {
1211                 engine_info = iter->data;
1212
1213                 if (NULL == engine_info) {
1214                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] engine info is NULL");
1215                         return STT_CONFIG_ERROR_OPERATION_FAILED;
1216                 }
1217
1218                 if (0 != strcmp(engine_id, engine_info->uuid)) {
1219                         iter = g_slist_next(iter);
1220                         continue;
1221                 }
1222
1223                 GSList *iter_lang = NULL;
1224                 char* lang;
1225
1226                 /* Get a first item */
1227                 iter_lang = g_slist_nth(engine_info->languages, 0);
1228
1229                 while (NULL != iter_lang) {
1230                         /*Get handle data from list*/
1231                         lang = iter_lang->data;
1232
1233                         SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
1234                         if (NULL != lang) {
1235                                 if (false == callback(engine_info->uuid, lang, user_data))
1236                                         break;
1237                         }
1238
1239                         /*Get next item*/
1240                         iter_lang = g_slist_next(iter_lang);
1241                 }
1242                 break;
1243         }
1244
1245         return STT_CONFIG_ERROR_NONE;
1246 }
1247
1248 int stt_config_mgr_get_default_language(char** language)
1249 {
1250         if (0 >= g_slist_length(g_config_client_list)) {
1251                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1252                 return STT_CONFIG_ERROR_INVALID_STATE;
1253         }
1254
1255         if (NULL == language) {
1256                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1257         }
1258
1259         if (NULL != g_config_info->language) {
1260                 *language = strdup(g_config_info->language);
1261         } else {
1262                 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1263                 return STT_CONFIG_ERROR_OPERATION_FAILED;
1264         }
1265
1266         return STT_CONFIG_ERROR_NONE;
1267 }
1268
1269 int stt_config_mgr_set_default_language(const char* language)
1270 {
1271         if (0 >= g_slist_length(g_config_client_list)) {
1272                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1273                 return STT_CONFIG_ERROR_INVALID_STATE;
1274         }
1275
1276         if (NULL == language) {
1277                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1278         }
1279
1280         /* Check language is valid */
1281         if (NULL != g_config_info->language) {
1282                 if (0 != stt_parser_set_language(language)) {
1283                         SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1284                         return STT_CONFIG_ERROR_OPERATION_FAILED;
1285                 }
1286                 free(g_config_info->language);
1287                 g_config_info->language = strdup(language);
1288         } else {
1289                 SLOG(LOG_ERROR, stt_tag(), " language is NULL");
1290                 return STT_CONFIG_ERROR_OPERATION_FAILED;
1291         }
1292
1293         return STT_CONFIG_ERROR_NONE;
1294 }
1295
1296 int stt_config_mgr_get_auto_language(bool* value)
1297 {
1298         if (0 >= g_slist_length(g_config_client_list)) {
1299                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1300                 return STT_CONFIG_ERROR_INVALID_STATE;
1301         }
1302
1303         if (NULL == value) {
1304                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1305         }
1306
1307         *value = g_config_info->auto_lang;
1308
1309         return STT_CONFIG_ERROR_NONE;
1310 }
1311
1312 int stt_config_mgr_set_auto_language(bool value)
1313 {
1314         if (0 >= g_slist_length(g_config_client_list)) {
1315                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1316                 return STT_CONFIG_ERROR_INVALID_STATE;
1317         }
1318
1319         if (g_config_info->auto_lang != value) {
1320                 /* Check language is valid */
1321                 if (0 != stt_parser_set_auto_lang(value)) {
1322                         SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1323                         return STT_CONFIG_ERROR_OPERATION_FAILED;
1324                 }
1325                 g_config_info->auto_lang = value;
1326
1327                 if (true == g_config_info->auto_lang) {
1328                         __stt_config_set_auto_language();
1329                 }
1330         }
1331
1332         return STT_CONFIG_ERROR_NONE;
1333 }
1334
1335 int stt_config_mgr_get_silence_detection(bool* value)
1336 {
1337         if (0 >= g_slist_length(g_config_client_list)) {
1338                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1339                 return STT_CONFIG_ERROR_INVALID_STATE;
1340         }
1341
1342         if (NULL == value)
1343                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1344
1345         *value = g_config_info->silence_detection;
1346
1347         return STT_CONFIG_ERROR_NONE;
1348 }
1349
1350 int stt_config_mgr_set_silence_detection(bool value)
1351 {
1352         if (0 >= g_slist_length(g_config_client_list)) {
1353                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1354                 return STT_CONFIG_ERROR_INVALID_STATE;
1355         }
1356
1357         if (0 != stt_parser_set_silence_detection(value)) {
1358                 SLOG(LOG_ERROR, stt_tag(), "Fail to save engine id");
1359                 return STT_CONFIG_ERROR_OPERATION_FAILED;
1360         }
1361
1362         g_config_info->silence_detection = value;
1363
1364         return STT_CONFIG_ERROR_NONE;
1365 }
1366
1367 bool stt_config_check_default_engine_is_valid(const char* engine)
1368 {
1369         if (0 >= g_slist_length(g_config_client_list)) {
1370                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1371                 return false;
1372         }
1373
1374         if (NULL == engine) {
1375                 return false;
1376         }
1377
1378         if (0 >= g_slist_length(g_engine_list))
1379                 return false;
1380
1381         GSList *iter = NULL;
1382         stt_engine_info_s *engine_info = NULL;
1383
1384         /* Get a first item */
1385         iter = g_slist_nth(g_engine_list, 0);
1386
1387         while (NULL != iter) {
1388                 engine_info = iter->data;
1389
1390                 if (NULL != engine_info) {
1391                         if (0 == strcmp(engine, engine_info->uuid)) {
1392                                 return true;
1393                         }
1394                 }
1395                 iter = g_slist_next(iter);
1396         }
1397
1398         return false;
1399 }
1400
1401 bool stt_config_check_default_language_is_valid(const char* language)
1402 {
1403         if (0 >= g_slist_length(g_config_client_list)) {
1404                 SLOG(LOG_ERROR, stt_tag(), "Not initialized");
1405                 return false;
1406         }
1407
1408         if (NULL == language) {
1409                 return false;
1410         }
1411
1412         if (NULL == g_config_info->engine_id) {
1413                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Default engine id is NULL");
1414                 return false;
1415         }
1416
1417         if (0 >= g_slist_length(g_engine_list))
1418                 return false;
1419
1420         GSList *iter = NULL;
1421         stt_engine_info_s *engine_info = NULL;
1422
1423         /* Get a first item */
1424         iter = g_slist_nth(g_engine_list, 0);
1425
1426         while (NULL != iter) {
1427                 engine_info = iter->data;
1428
1429                 if (NULL == engine_info) {
1430                         SLOG(LOG_ERROR, stt_tag(), "[ERROR] Engine info is NULL");
1431                         iter = g_slist_next(iter);
1432                         continue;
1433                 }
1434
1435                 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1436                         iter = g_slist_next(iter);
1437                         continue;
1438                 }
1439
1440                 GSList *iter_lang = NULL;
1441                 char* lang;
1442
1443                 /* Get a first item */
1444                 iter_lang = g_slist_nth(engine_info->languages, 0);
1445
1446                 while (NULL != iter_lang) {
1447                         lang = iter_lang->data;
1448
1449                         if (0 == strcmp(language, lang))
1450                                 return true;
1451
1452                         /*Get next item*/
1453                         iter_lang = g_slist_next(iter_lang);
1454                 }
1455                 break;
1456         }
1457
1458         return false;
1459 }
1460
1461 int __stt_config_mgr_print_engine_info()
1462 {
1463         GSList *iter = NULL;
1464         stt_engine_info_s *engine_info = NULL;
1465
1466         if (0 >= g_slist_length(g_engine_list)) {
1467                 SLOG(LOG_DEBUG, stt_tag(), "-------------- engine list -----------------");
1468                 SLOG(LOG_DEBUG, stt_tag(), "  No Engine in engine directory");
1469                 SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1470                 return 0;
1471         }
1472
1473         /* Get a first item */
1474         iter = g_slist_nth(g_engine_list, 0);
1475
1476         SLOG(LOG_DEBUG, stt_tag(), "--------------- engine list -----------------");
1477
1478         int i = 1;
1479         while (NULL != iter) {
1480                 engine_info = iter->data;
1481
1482                 SLOG(LOG_DEBUG, stt_tag(), "[%dth]", i);
1483                 SLOG(LOG_DEBUG, stt_tag(), " name : %s", engine_info->name);
1484                 SLOG(LOG_DEBUG, stt_tag(), " id   : %s", engine_info->uuid);
1485                 SLOG(LOG_DEBUG, stt_tag(), " setting : %s", engine_info->setting);
1486                 SLOG(LOG_DEBUG, stt_tag(), " agreement : %s", engine_info->agreement);
1487
1488                 SLOG(LOG_DEBUG, stt_tag(), " languages");
1489                 GSList *iter_lang = NULL;
1490                 char* lang;
1491                 if (g_slist_length(engine_info->languages) > 0) {
1492                         /* Get a first item */
1493                         iter_lang = g_slist_nth(engine_info->languages, 0);
1494
1495                         int j = 1;
1496                         while (NULL != iter_lang) {
1497                                 /*Get handle data from list*/
1498                                 lang = iter_lang->data;
1499
1500                                 SLOG(LOG_DEBUG, stt_tag(), "  [%dth] %s", j, lang);
1501
1502                                 /*Get next item*/
1503                                 iter_lang = g_slist_next(iter_lang);
1504                                 j++;
1505                         }
1506                 } else {
1507                         SLOG(LOG_ERROR, stt_tag(), "  language is NONE");
1508                 }
1509                 SLOG(LOG_DEBUG, stt_tag(), " silence support : %s", 
1510                         engine_info->support_silence_detection ? "true" : "false");
1511                 iter = g_slist_next(iter);
1512                 i++;
1513         }
1514         SLOG(LOG_DEBUG, stt_tag(), "--------------------------------------------");
1515
1516         return 0;
1517 }
1518
1519
1520
1521 /**
1522 * time info functions
1523 */
1524 static GSList* g_time_list = NULL;
1525
1526 int stt_config_mgr_reset_time_info()
1527 {
1528         /* Remove time info */
1529         GSList *iter = NULL;
1530         stt_result_time_info_s *data = NULL;
1531
1532         /* Remove time info */
1533         iter = g_slist_nth(g_time_list, 0);
1534         while (NULL != iter) {
1535                 data = iter->data;
1536
1537                 g_time_list = g_slist_remove(g_time_list, data);
1538                 if (NULL != data) {
1539                         if (NULL != data->text) {
1540                                 free(data->text);
1541                                 data->text = NULL;
1542                         }
1543                         free(data);
1544                         data = NULL;
1545                 }
1546
1547                 /*Get next item*/
1548                 iter = g_slist_nth(g_time_list, 0);
1549         }
1550
1551         return 0;
1552 }
1553
1554 int stt_config_mgr_add_time_info(int index, int event, const char* text, long start_time, long end_time)
1555 {
1556         if (NULL == text) {
1557                 SLOG(LOG_ERROR, stt_tag(), "Invalid paramter : text is NULL");
1558                 return -1;
1559         }
1560
1561         stt_result_time_info_s *info = (stt_result_time_info_s*)calloc(1, sizeof(stt_result_time_info_s));
1562         if (NULL == info) {
1563                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
1564                 return STT_CONFIG_ERROR_OUT_OF_MEMORY;
1565         }
1566         info->index = index;
1567         info->event = event;
1568         if (NULL != text) {
1569                 info->text = strdup(text);
1570         }
1571         info->start_time = start_time;
1572         info->end_time = end_time;
1573
1574         /* Add item to global list */
1575         g_time_list = g_slist_append(g_time_list, info);
1576
1577         return 0;
1578 }
1579
1580 int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* user_data)
1581 {
1582         if (NULL == callback) {
1583                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Input paramter is NULL : callback function");
1584                 return STT_CONFIG_ERROR_INVALID_PARAMETER;
1585         }
1586
1587         GSList* temp_time = NULL;
1588         int ret;
1589         ret = stt_parser_get_time_info(&temp_time);
1590         if (0 != ret) {
1591                 SLOG(LOG_WARN, stt_tag(), "[WARNING] Fail to get time info : %d", ret);
1592                 return STT_CONFIG_ERROR_OPERATION_FAILED;
1593         }
1594
1595         GSList *iter = NULL;
1596         stt_result_time_info_s *data = NULL;
1597
1598         /* Get a first item */
1599         iter = g_slist_nth(temp_time, 0);
1600         while (NULL != iter) {
1601                 data = iter->data;
1602
1603                 if (false == callback(data->index, data->event, data->text, 
1604                         data->start_time, data->end_time, user_data)) {
1605                         break;
1606                 }
1607
1608                 /*Get next item*/
1609                 iter = g_slist_next(iter);
1610         }
1611
1612         /* Remove time info */
1613         iter = g_slist_nth(temp_time, 0);
1614         while (NULL != iter) {
1615                 data = iter->data;
1616
1617                 if (NULL != data) {
1618                         temp_time = g_slist_remove(temp_time, data);
1619
1620                         if (NULL != data->text) {
1621                                 free(data->text);
1622                                 data->text = NULL;
1623                         }
1624                         free(data);
1625                         data = NULL;
1626                 }
1627
1628                 /*Get next item*/
1629                 iter = g_slist_nth(temp_time, 0);
1630         }
1631
1632         return STT_CONFIG_ERROR_NONE;
1633 }
1634
1635 int stt_config_mgr_save_time_info_file()
1636 {
1637         if (0 == g_slist_length(g_time_list)) {
1638                 SLOG(LOG_WARN, stt_tag(), "[WARNING] There is no time info to save");
1639                 return STT_CONFIG_ERROR_OPERATION_FAILED;
1640         }
1641
1642         int ret = 0;
1643         ret = stt_parser_set_time_info(g_time_list);
1644         if (0 != ret) {
1645                 SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to save time info : %d", ret);
1646                 return STT_CONFIG_ERROR_OPERATION_FAILED;
1647         }
1648
1649         return STT_CONFIG_ERROR_NONE;
1650 }
1651
1652 int stt_config_mgr_remove_time_info_file()
1653 {
1654         stt_parser_clear_time_info();
1655
1656         return STT_CONFIG_ERROR_NONE;
1657 }