2 * Copyright (c) 2012, 2013 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.
17 #include <sys/types.h>
22 #include "stt_setting.h"
23 #include "stt_setting_dbus.h"
26 static int __check_setting_stt_daemon();
28 static bool g_is_daemon_started = false;
30 static Ecore_Timer* g_setting_connect_timer = NULL;
32 static stt_setting_state_e g_state = STT_SETTING_STATE_NONE;
34 static stt_setting_initialized_cb g_initialized_cb;
36 static void* g_user_data;
40 /* API Implementation */
41 static Eina_Bool __stt_setting_initialized(void *data)
43 g_initialized_cb(g_state, g_reason, g_user_data);
48 static Eina_Bool __stt_setting_connect_daemon(void *data)
51 if (0 != stt_setting_dbus_request_hello()) {
52 if (false == g_is_daemon_started) {
53 g_is_daemon_started = true;
54 __check_setting_stt_daemon();
59 SLOG(LOG_DEBUG, TAG_STTC, "===== Connect daemon");
61 /* do request initialize */
64 ret = stt_setting_dbus_request_initialize();
66 if (STT_SETTING_ERROR_ENGINE_NOT_FOUND == ret) {
67 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Engine not found");
68 } else if (STT_SETTING_ERROR_NONE != ret) {
69 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to connection : %d", ret);
71 /* success to connect stt-daemon */
72 g_state = STT_SETTING_STATE_READY;
77 ecore_timer_add(0, __stt_setting_initialized, NULL);
79 g_setting_connect_timer = NULL;
81 SLOG(LOG_DEBUG, TAG_STTC, "=====");
82 SLOG(LOG_DEBUG, TAG_STTC, " ");
87 int stt_setting_initialize(stt_setting_initialized_cb callback, void* user_data)
89 SLOG(LOG_DEBUG, TAG_STTC, "===== Initialize STT Setting");
91 if (STT_SETTING_STATE_READY == g_state) {
92 SLOG(LOG_WARN, TAG_STTC, "[WARNING] STT Setting has already been initialized. \n");
93 SLOG(LOG_DEBUG, TAG_STTC, "=====");
94 SLOG(LOG_DEBUG, TAG_STTC, " ");
95 return STT_SETTING_ERROR_NONE;
98 if( 0 != stt_setting_dbus_open_connection() ) {
99 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection\n ");
100 SLOG(LOG_DEBUG, TAG_STTC, "=====");
101 SLOG(LOG_DEBUG, TAG_STTC, " ");
102 return STT_SETTING_ERROR_OPERATION_FAILED;
105 g_initialized_cb = callback;
106 g_user_data = user_data;
108 g_setting_connect_timer = ecore_timer_add(0, __stt_setting_connect_daemon, NULL);
110 SLOG(LOG_DEBUG, TAG_STTC, "=====");
111 SLOG(LOG_DEBUG, TAG_STTC, " ");
113 return STT_SETTING_ERROR_NONE;
116 int stt_setting_finalize ()
118 SLOG(LOG_DEBUG, TAG_STTC, "===== Finalize STT Setting");
122 if (STT_SETTING_STATE_READY == g_state) {
123 ret = stt_setting_dbus_request_finalilze();
125 SLOG(LOG_ERROR, TAG_STTC, "Fail : finialize(%d)", ret);
129 if (NULL != g_setting_connect_timer) {
130 SLOG(LOG_DEBUG, TAG_STTC, "Setting Connect Timer is deleted");
131 ecore_timer_del(g_setting_connect_timer);
134 g_is_daemon_started = false;
136 if (0 != stt_setting_dbus_close_connection()) {
137 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection");
139 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Finalize");
142 g_state = STT_SETTING_STATE_NONE;
144 SLOG(LOG_DEBUG, TAG_STTC, "=====");
145 SLOG(LOG_DEBUG, TAG_STTC, " ");
147 return STT_SETTING_ERROR_NONE;
150 int stt_setting_foreach_supported_engines(stt_setting_supported_engine_cb callback, void* user_data)
152 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach supported engines");
154 if (STT_SETTING_STATE_NONE == g_state) {
155 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Not initialized");
156 SLOG(LOG_DEBUG, TAG_STTC, "=====");
157 SLOG(LOG_DEBUG, TAG_STTC, " ");
158 return STT_SETTING_ERROR_INVALID_STATE;
161 if (NULL == callback) {
162 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Callback is NULL");
163 SLOG(LOG_DEBUG, TAG_STTC, "=====");
164 SLOG(LOG_DEBUG, TAG_STTC, " ");
165 return STT_SETTING_ERROR_INVALID_PARAMETER;
168 int ret = stt_setting_dbus_request_get_engine_list(callback, user_data);
170 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result : %d", ret);
172 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Foreach supported engines");
175 SLOG(LOG_DEBUG, TAG_STTC, "=====");
176 SLOG(LOG_DEBUG, TAG_STTC, " ");
181 int stt_setting_get_engine(char** engine_id)
183 SLOG(LOG_DEBUG, TAG_STTC, "===== Get current engine");
185 if (STT_SETTING_STATE_NONE == g_state) {
186 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Not initialized");
187 SLOG(LOG_DEBUG, TAG_STTC, "=====");
188 SLOG(LOG_DEBUG, TAG_STTC, " ");
189 return STT_SETTING_ERROR_INVALID_STATE;
192 if (NULL == engine_id) {
193 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Engine id is NULL");
194 SLOG(LOG_DEBUG, TAG_STTC, "=====");
195 SLOG(LOG_DEBUG, TAG_STTC, " ");
196 return STT_SETTING_ERROR_INVALID_PARAMETER;
199 int ret = stt_setting_dbus_request_get_engine(engine_id);
201 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result : %d", ret);
203 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Get current engine");
206 SLOG(LOG_DEBUG, TAG_STTC, "=====");
207 SLOG(LOG_DEBUG, TAG_STTC, " ");
212 int stt_setting_set_engine(const char* engine_id)
214 SLOG(LOG_DEBUG, TAG_STTC, "===== Set current engine");
216 if (STT_SETTING_STATE_NONE == g_state) {
217 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Not initialized");
218 SLOG(LOG_DEBUG, TAG_STTC, "=====");
219 SLOG(LOG_DEBUG, TAG_STTC, " ");
220 return STT_SETTING_ERROR_INVALID_STATE;
223 if (NULL == engine_id) {
224 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Engine id is NULL");
225 SLOG(LOG_DEBUG, TAG_STTC, "=====");
226 SLOG(LOG_DEBUG, TAG_STTC, " ");
227 return STT_SETTING_ERROR_INVALID_PARAMETER;
230 int ret = stt_setting_dbus_request_set_engine(engine_id);
232 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result : %d", ret);
234 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set current engine");
237 SLOG(LOG_DEBUG, TAG_STTC, "=====");
238 SLOG(LOG_DEBUG, TAG_STTC, " ");
243 int stt_setting_foreach_supported_languages(stt_setting_supported_language_cb callback, void* user_data)
245 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach supported languages");
247 if (STT_SETTING_STATE_NONE == g_state) {
248 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Not initialized");
249 SLOG(LOG_DEBUG, TAG_STTC, "=====");
250 SLOG(LOG_DEBUG, TAG_STTC, " ");
251 return STT_SETTING_ERROR_INVALID_STATE;
254 if (NULL == callback) {
255 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Param is NULL");
256 SLOG(LOG_DEBUG, TAG_STTC, "=====");
257 SLOG(LOG_DEBUG, TAG_STTC, " ");
258 return STT_SETTING_ERROR_INVALID_PARAMETER;
261 int ret = stt_setting_dbus_request_get_language_list(callback, user_data);
264 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result : %d", ret);
266 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Foreach supported languages");
269 SLOG(LOG_DEBUG, TAG_STTC, "=====");
270 SLOG(LOG_DEBUG, TAG_STTC, " ");
275 int stt_setting_get_default_language(char** language)
277 SLOG(LOG_DEBUG, TAG_STTC, "===== Get default language");
279 if (STT_SETTING_STATE_NONE == g_state) {
280 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Not initialized");
281 SLOG(LOG_DEBUG, TAG_STTC, "=====");
282 SLOG(LOG_DEBUG, TAG_STTC, " ");
283 return STT_SETTING_ERROR_INVALID_STATE;
286 if (NULL == language) {
287 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
288 SLOG(LOG_DEBUG, TAG_STTC, "=====");
289 SLOG(LOG_DEBUG, TAG_STTC, " ");
290 return STT_SETTING_ERROR_INVALID_PARAMETER;
293 int ret = stt_setting_dbus_request_get_default_language(language);
295 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result : %d", ret);
297 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Foreach supported voices");
300 SLOG(LOG_DEBUG, TAG_STTC, "=====");
301 SLOG(LOG_DEBUG, TAG_STTC, " ");
306 int stt_setting_set_default_language(const char* language)
308 SLOG(LOG_DEBUG, TAG_STTC, "===== Set default language");
310 if (STT_SETTING_STATE_NONE == g_state) {
311 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Not initialized");
312 SLOG(LOG_DEBUG, TAG_STTC, "=====");
313 SLOG(LOG_DEBUG, TAG_STTC, " ");
314 return STT_SETTING_ERROR_INVALID_STATE;
317 if (NULL == language) {
318 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
319 SLOG(LOG_DEBUG, TAG_STTC, "=====");
320 SLOG(LOG_DEBUG, TAG_STTC, " ");
321 return STT_SETTING_ERROR_INVALID_PARAMETER;
324 int ret = stt_setting_dbus_request_set_default_language(language);
326 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result : %d", ret);
328 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set default voice");
331 SLOG(LOG_DEBUG, TAG_STTC, "=====");
332 SLOG(LOG_DEBUG, TAG_STTC, " ");
337 int stt_setting_get_profanity_filter(bool* value)
339 SLOG(LOG_DEBUG, TAG_STTC, "===== Get profanity filter");
343 if (STT_SETTING_STATE_NONE == g_state) {
344 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Not initialized");
345 SLOG(LOG_DEBUG, TAG_STTC, "=====");
346 SLOG(LOG_DEBUG, TAG_STTC, " ");
347 return STT_SETTING_ERROR_INVALID_STATE;
351 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
352 SLOG(LOG_DEBUG, TAG_STTC, "=====");
353 SLOG(LOG_DEBUG, TAG_STTC, " ");
354 return STT_SETTING_ERROR_INVALID_PARAMETER;
357 ret = stt_setting_dbus_request_get_profanity_filter(value);
359 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result (%d)", ret);
361 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Get profanity filter(%s)", *value ? "true":"false");
364 SLOG(LOG_DEBUG, TAG_STTC, "=====");
365 SLOG(LOG_DEBUG, TAG_STTC, " ");
370 int stt_setting_set_profanity_filter(const bool value)
372 SLOG(LOG_DEBUG, TAG_STTC, "===== Set profanity filter");
376 if (STT_SETTING_STATE_NONE == g_state) {
377 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] not initialized");
378 SLOG(LOG_DEBUG, TAG_STTC, "=====");
379 SLOG(LOG_DEBUG, TAG_STTC, " ");
380 return STT_SETTING_ERROR_INVALID_STATE;
383 ret = stt_setting_dbus_request_set_profanity_filter(value);
385 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result (%d)", ret);
387 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set profanity filter(%s)", value ? "true":"false");
390 SLOG(LOG_DEBUG, TAG_STTC, "=====");
391 SLOG(LOG_DEBUG, TAG_STTC, " ");
396 int stt_setting_get_punctuation_override(bool* value)
398 SLOG(LOG_DEBUG, TAG_STTC, "===== Get punctuation override");
402 if (STT_SETTING_STATE_NONE == g_state) {
403 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] not initialized");
404 SLOG(LOG_DEBUG, TAG_STTC, "=====");
405 SLOG(LOG_DEBUG, TAG_STTC, " ");
406 return STT_SETTING_ERROR_INVALID_STATE;
410 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] param is NULL");
411 SLOG(LOG_DEBUG, TAG_STTC, "=====");
412 SLOG(LOG_DEBUG, TAG_STTC, " ");
413 return STT_SETTING_ERROR_INVALID_PARAMETER;
416 ret = stt_setting_dbus_request_get_punctuation_override(value);
418 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result (%d)", ret);
420 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Get punctuation override(%s)", *value ? "true":"false");
423 SLOG(LOG_DEBUG, TAG_STTC, "=====");
424 SLOG(LOG_DEBUG, TAG_STTC, " ");
429 int stt_setting_set_punctuation_override(bool value)
431 SLOG(LOG_DEBUG, TAG_STTC, "===== Set punctuation override");
435 if (STT_SETTING_STATE_NONE == g_state) {
436 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] not initialized");
437 SLOG(LOG_DEBUG, TAG_STTC, "=====");
438 SLOG(LOG_DEBUG, TAG_STTC, " ");
439 return STT_SETTING_ERROR_INVALID_STATE;
442 ret = stt_setting_dbus_request_set_punctuation_override(value);
444 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result (%d)", ret);
446 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set punctuation override(%s)", value ? "true":"false");
449 SLOG(LOG_DEBUG, TAG_STTC, "=====");
450 SLOG(LOG_DEBUG, TAG_STTC, " ");
455 int stt_setting_get_silence_detection(bool* value)
457 SLOG(LOG_DEBUG, TAG_STTC, "===== Get silence detection");
461 if (STT_SETTING_STATE_NONE == g_state) {
462 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] not initialized");
463 SLOG(LOG_DEBUG, TAG_STTC, "=====");
464 SLOG(LOG_DEBUG, TAG_STTC, " ");
465 return STT_SETTING_ERROR_INVALID_STATE;
469 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] param is NULL");
470 SLOG(LOG_DEBUG, TAG_STTC, "=====");
471 SLOG(LOG_DEBUG, TAG_STTC, " ");
472 return STT_SETTING_ERROR_INVALID_PARAMETER;
475 ret = stt_setting_dbus_request_get_silence_detection(value);
477 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result (%d)", ret);
479 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Get silence detection(%s)", *value ? "true":"false");
482 SLOG(LOG_DEBUG, TAG_STTC, "=====");
483 SLOG(LOG_DEBUG, TAG_STTC, " ");
488 int stt_setting_set_silence_detection(bool value)
490 SLOG(LOG_DEBUG, TAG_STTC, "===== Set silence detection");
494 if (STT_SETTING_STATE_NONE == g_state) {
495 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] not initialized");
496 SLOG(LOG_DEBUG, TAG_STTC, "=====");
497 SLOG(LOG_DEBUG, TAG_STTC, " ");
498 return STT_SETTING_ERROR_INVALID_STATE;
501 ret = stt_setting_dbus_request_set_silence_detection(value);
503 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result (%d)", ret);
505 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set silence detection(%s)", value ? "true":"false");
508 SLOG(LOG_DEBUG, TAG_STTC, "=====");
509 SLOG(LOG_DEBUG, TAG_STTC, " ");
514 int stt_setting_foreach_engine_settings(stt_setting_engine_setting_cb callback, void* user_data)
516 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach engine setting");
520 if (STT_SETTING_STATE_NONE == g_state) {
521 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] not initialized");
522 SLOG(LOG_DEBUG, TAG_STTC, "=====");
523 SLOG(LOG_DEBUG, TAG_STTC, " ");
524 return STT_SETTING_ERROR_INVALID_STATE;
527 if (NULL == callback) {
528 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] parameter is NULL");
529 SLOG(LOG_DEBUG, TAG_STTC, "=====");
530 SLOG(LOG_DEBUG, TAG_STTC, " ");
531 return STT_SETTING_ERROR_INVALID_PARAMETER;
534 ret = stt_setting_dbus_request_get_engine_setting(callback, user_data);
536 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result (%d)", ret);
538 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Foreach engine setting");
541 SLOG(LOG_DEBUG, TAG_STTC, "=====");
542 SLOG(LOG_DEBUG, TAG_STTC, " ");
547 int stt_setting_set_engine_setting(const char* key, const char* value)
549 SLOG(LOG_DEBUG, TAG_STTC, "===== Set engine setting");
553 if (STT_SETTING_STATE_NONE == g_state) {
554 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] not initialized");
555 return STT_SETTING_ERROR_INVALID_STATE;
558 if (NULL == key || NULL == value) {
559 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] parameter is NULL");
560 return STT_SETTING_ERROR_INVALID_PARAMETER;
563 ret = stt_setting_dbus_request_set_engine_setting(key, value);
565 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result (%d)", ret);
567 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set engine setting(%s)", *value ? "true":"false");
570 SLOG(LOG_DEBUG, TAG_STTC, "=====");
571 SLOG(LOG_DEBUG, TAG_STTC, " ");
576 int __setting_get_cmd_line(char *file, char *buf)
581 fp = fopen(file, "r");
583 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get command line");
594 static bool __stt_setting_is_alive()
597 struct dirent *entry;
598 struct stat filestat;
604 dir = opendir("/proc");
606 SLOG(LOG_ERROR, TAG_STTC, "process checking is FAILED");
610 while ((entry = readdir(dir)) != NULL) {
611 if (0 != lstat(entry->d_name, &filestat))
614 if (!S_ISDIR(filestat.st_mode))
617 pid = atoi(entry->d_name);
618 if (pid <= 0) continue;
620 sprintf(tempPath, "/proc/%d/cmdline", pid);
621 if (0 != __setting_get_cmd_line(tempPath, cmdLine)) {
625 if ( 0 == strncmp(cmdLine, "[stt-daemon]", strlen("[stt-daemon]")) ||
626 0 == strncmp(cmdLine, "stt-daemon", strlen("stt-daemon")) ||
627 0 == strncmp(cmdLine, "/usr/bin/stt-daemon", strlen("/usr/bin/stt-daemon"))) {
628 SLOG(LOG_DEBUG, TAG_STTC, "stt-daemon is ALIVE !! \n");
633 SLOG(LOG_DEBUG, TAG_STTC, "THERE IS NO stt-daemon !! \n");
640 int __check_setting_stt_daemon()
642 if (TRUE == __stt_setting_is_alive())
645 /* fork-exec stt-daemom */
652 SLOG(LOG_DEBUG, TAG_STTC, "Fail to create stt-daemon");
657 for( i = 0 ; i < _NSIG ; i++ )
660 execl("/usr/bin/stt-daemon", "/usr/bin/stt-daemon", NULL);