2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <app_manager.h>
19 #include <cynara-client.h>
20 #include <cynara-error.h>
21 #include <cynara-session.h>
22 #include <Ecore_Wl2.h>
26 #include <system_info.h>
28 #include "vc_client.h"
29 #include "vc_cmd_db.h"
30 #include "vc_command.h"
31 #include "vc_config_mgr.h"
34 #include "vc_info_parser.h"
35 #include "vc_json_parser.h"
37 #include "voice_control.h"
38 #include "voice_control_internal.h"
39 #include "voice_control_authority.h"
40 #include "voice_control_command.h"
41 #include "voice_control_command_expand.h"
44 static Ecore_Event_Handler* g_focus_in_handler = NULL;
45 static Ecore_Event_Handler* g_focus_out_handler = NULL;
47 static Ecore_Thread* g_tts_thread = NULL;
48 static Ecore_Thread* g_prepare_thread = NULL;
49 static pthread_mutex_t g_prepare_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
53 static int g_daemon_pid = 0;
55 static int g_feature_enabled = -1;
56 static bool g_privilege_allowed = false;
57 static bool g_vc_tts_privilege_allowed = false;
58 static bool g_backup = false;
60 static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER;
61 static cynara *p_cynara = NULL;
63 static void __vc_notify_state_changed(void *data);
64 static void __vc_notify_error(void *data);
66 static int __vc_get_feature_enabled()
68 if (0 == g_feature_enabled) {
70 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
71 return VC_ERROR_NOT_SUPPORTED;
73 } else if (-1 == g_feature_enabled) {
74 bool vc_supported = false;
75 bool mic_supported = false;
76 if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
78 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value");
79 return VC_ERROR_NOT_SUPPORTED;
83 if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
85 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value");
86 return VC_ERROR_NOT_SUPPORTED;
90 if (false == vc_supported || false == mic_supported) {
92 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
93 g_feature_enabled = 0;
94 return VC_ERROR_NOT_SUPPORTED;
98 g_feature_enabled = 1;
101 return VC_ERROR_NONE;
104 static int __check_privilege_initialize()
106 int ret = cynara_initialize(&p_cynara, NULL);
107 if (CYNARA_API_SUCCESS != ret)
108 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to initialize"); //LCOV_EXCL_LINE
110 return ret == CYNARA_API_SUCCESS;
113 static int __check_privilege(const char* uid, const char * privilege)
116 char label_path[1024] = "/proc/self/attr/current";
117 char smack_label[1024] = {'\0',};
120 return false; //LCOV_EXCL_LINE
123 fp = fopen(label_path, "r");
125 if (0 >= fread(smack_label, 1, sizeof(smack_label), fp))
126 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to fread"); //LCOV_EXCL_LINE
131 pid_t pid = getpid();
132 char *session = cynara_session_from_pid(pid);
133 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
134 SLOG(LOG_DEBUG, TAG_VCC, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
137 if (ret != CYNARA_API_ACCESS_ALLOWED)
138 return false; //LCOV_EXCL_LINE
142 static void __check_privilege_deinitialize()
146 int ret = cynara_finish(p_cynara);
147 if (ret != CYNARA_API_SUCCESS)
148 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cynara finish %d", ret); //LCOV_EXCL_LINE
153 static int __vc_check_privilege()
155 if (true == g_privilege_allowed)
156 return VC_ERROR_NONE;
158 pthread_mutex_lock(&g_cynara_mutex);
160 if (false == g_privilege_allowed) {
162 ret = __check_privilege_initialize();
165 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed");
166 pthread_mutex_unlock(&g_cynara_mutex);
167 return VC_ERROR_PERMISSION_DENIED;
172 snprintf(uid, 32, "%d", getuid());
174 ret = __check_privilege(uid, VC_PRIVILEGE_RECORDER);
177 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_RECORDER, uid);
178 __check_privilege_deinitialize();
179 g_privilege_allowed = false;
180 pthread_mutex_unlock(&g_cynara_mutex);
181 return VC_ERROR_PERMISSION_DENIED;
185 __check_privilege_deinitialize();
188 g_privilege_allowed = true;
189 pthread_mutex_unlock(&g_cynara_mutex);
190 return VC_ERROR_NONE;
193 int __check_feature_privilege()
195 if (0 != __vc_get_feature_enabled()) {
196 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
198 if (0 != __vc_check_privilege()) {
199 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
202 return VC_ERROR_NONE;
205 int __vc_tts_check_privilege()
207 if (true == g_vc_tts_privilege_allowed)
208 return VC_ERROR_NONE;
210 pthread_mutex_lock(&g_cynara_mutex);
212 if (false == g_vc_tts_privilege_allowed) {
214 ret = __check_privilege_initialize();
217 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed");
218 pthread_mutex_unlock(&g_cynara_mutex);
219 return VC_ERROR_PERMISSION_DENIED;
224 snprintf(uid, 32, "%d", getuid());
226 ret = __check_privilege(uid, VC_TTS_PRIVILEGE);
229 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied(%s)(%s)", VC_TTS_PRIVILEGE, uid);
230 __check_privilege_deinitialize();
231 g_vc_tts_privilege_allowed = false;
232 pthread_mutex_unlock(&g_cynara_mutex);
233 return VC_ERROR_PERMISSION_DENIED;
237 __check_privilege_deinitialize();
240 g_vc_tts_privilege_allowed = true;
241 pthread_mutex_unlock(&g_cynara_mutex);
242 return VC_ERROR_NONE;
246 static const char* __vc_get_error_code(vc_error_e err)
249 case VC_ERROR_NONE: return "VC_ERROR_NONE";
250 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
251 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
252 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
253 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
254 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
255 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
256 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
257 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
258 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
259 default: return "Invalid error code";
264 static int __vc_convert_config_error_code(vc_config_error_e code)
266 if (code == VC_CONFIG_ERROR_NONE) return VC_ERROR_NONE;
267 if (code == VC_CONFIG_ERROR_OUT_OF_MEMORY) return VC_ERROR_OUT_OF_MEMORY;
268 if (code == VC_CONFIG_ERROR_IO_ERROR) return VC_ERROR_IO_ERROR;
269 if (code == VC_CONFIG_ERROR_INVALID_PARAMETER) return VC_ERROR_INVALID_PARAMETER;
270 if (code == VC_CONFIG_ERROR_INVALID_STATE) return VC_ERROR_INVALID_STATE;
271 if (code == VC_CONFIG_ERROR_INVALID_LANGUAGE) return VC_ERROR_INVALID_LANGUAGE;
272 if (code == VC_CONFIG_ERROR_ENGINE_NOT_FOUND) return VC_ERROR_ENGINE_NOT_FOUND;
273 if (code == VC_CONFIG_ERROR_OPERATION_FAILED) return VC_ERROR_OPERATION_FAILED;
275 return VC_ERROR_NONE;
279 static void __vc_lang_changed_cb(const char* previous_lang, const char* current_lang)
281 SLOG(LOG_DEBUG, TAG_VCC, "Lang changed : previous lang(%s) Current lang(%s)",
282 previous_lang, current_lang);
284 vc_current_language_changed_cb callback;
285 void* lang_user_data;
286 vc_client_get_current_lang_changed_cb(&callback, &lang_user_data);
288 if (NULL != callback) {
289 vc_client_use_callback();
290 callback(previous_lang, current_lang, lang_user_data);
291 vc_client_not_use_callback();
292 SLOG(LOG_DEBUG, TAG_VCC, "Language changed callback is called");
294 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Language changed callback is null");
299 static Eina_Bool __notify_auth_changed_cb(void *data)
301 vc_auth_state_changed_cb callback = NULL;
304 vc_client_get_auth_state_changed_cb(&callback, &user_data);
306 vc_auth_state_e previous = -1;
307 vc_auth_state_e current = -1;
309 vc_client_get_previous_auth_state(&previous, ¤t);
311 if (NULL != callback) {
312 vc_client_use_callback();
313 callback(previous, current, user_data);
314 vc_client_not_use_callback();
315 SLOG(LOG_DEBUG, TAG_VCC, "Auth state changed callback is called");
317 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Auth state changed callback is null");
323 static Eina_Bool __focus_changed_cb(void *data, int type, void *event)
325 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Focus changed");
328 if (ECORE_WL2_EVENT_FOCUS_IN == type) {
329 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground");
330 ret = vc_tidl_request_set_foreground(getpid(), true);
332 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
335 ret = vc_client_set_is_foreground(true);
337 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret);
340 /* set authority valid */
341 vc_auth_state_e state = VC_AUTH_STATE_NONE;
342 if (0 != vc_client_get_auth_state(&state)) {
343 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
345 if (VC_AUTH_STATE_INVALID == state) {
346 vc_client_set_auth_state(VC_AUTH_STATE_VALID);
348 /* notify auth changed cb */
349 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
351 } else if (ECORE_WL2_EVENT_FOCUS_OUT == type) {
352 SLOG(LOG_DEBUG, TAG_VCW, "@@@ Set background");
353 ret = vc_tidl_request_set_foreground(getpid(), false);
355 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (false) : %d", ret);
358 ret = vc_client_set_is_foreground(false);
360 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (false) : %d", ret);
363 /* set authority valid */
364 vc_auth_state_e state = VC_AUTH_STATE_NONE;
365 if (0 != vc_client_get_auth_state(&state)) {
366 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
368 if (VC_AUTH_STATE_VALID == state) {
369 vc_client_set_auth_state(VC_AUTH_STATE_INVALID);
371 /* notify authority changed cb */
372 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
375 SLOG(LOG_DEBUG, TAG_VCC, "@@@ type(%d) is NOT valid", type);
378 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Focus changed DONE");
380 return ECORE_CALLBACK_RENEW;
384 int vc_initialize(void)
387 ret = __check_feature_privilege();
388 if (VC_ERROR_NONE != ret)
391 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Initialize");
394 if (true == vc_client_is_valid()) {
395 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized");
396 return VC_ERROR_NONE;
399 if (0 != vc_tidl_open_connection()) {
400 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to open connection"); //LCOV_EXCL_LINE
401 return VC_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
404 if (0 != vc_client_create()) {
405 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create client!!!!!"); //LCOV_EXCL_LINE
406 return VC_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
410 ret = vc_config_mgr_initialize(g_pid);
412 ret = __vc_convert_config_error_code(ret); //LCOV_EXCL_LINE
413 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to init config manager : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
414 vc_client_destroy(); //LCOV_EXCL_LINE
415 return ret; //LCOV_EXCL_LINE
418 ret = vc_config_mgr_set_lang_cb(g_pid, __vc_lang_changed_cb);
420 ret = __vc_convert_config_error_code(ret); //LCOV_EXCL_LINE
421 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set config changed : %d", ret); //LCOV_EXCL_LINE
422 vc_config_mgr_finalize(g_pid); //LCOV_EXCL_LINE
423 vc_client_destroy(); //LCOV_EXCL_LINE
424 return ret; //LCOV_EXCL_LINE
427 SLOG(LOG_DEBUG, TAG_VCC, "[Success] pid(%d)", g_pid);
429 return VC_ERROR_NONE;
432 static void __vc_internal_unprepare(void)
434 /* return authority */
435 vc_auth_state_e state = VC_AUTH_STATE_NONE;
436 if (0 != vc_client_get_auth_state(&state)) {
437 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
440 if (VC_AUTH_STATE_NONE != state) {
441 if (0 != vc_auth_disable()) { //LCOV_EXCL_LINE
442 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to auth disable"); //LCOV_EXCL_LINE
446 int ret = vc_tidl_request_finalize(g_pid);
448 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
451 /* TODO set_start_listening should be move to proper place */
452 vc_client_set_start_listening(false);
454 if (NULL != g_focus_in_handler) {
455 ecore_event_handler_del(g_focus_in_handler);
456 g_focus_in_handler = NULL;
458 if (NULL != g_focus_out_handler) {
459 ecore_event_handler_del(g_focus_out_handler);
460 g_focus_out_handler = NULL;
463 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
465 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
468 int vc_deinitialize(void)
470 int ret = VC_ERROR_NONE;
471 ret = __check_feature_privilege();
472 if (VC_ERROR_NONE != ret)
475 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Deinitialize");
477 if (false == vc_client_is_valid()) {
478 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NOT initialized");
479 return VC_ERROR_INVALID_STATE;
483 vc_client_get_client_state(&state);
488 __vc_internal_unprepare();
489 /* no break. need to next step*/
490 case VC_STATE_INITIALIZED:
491 pthread_mutex_lock(&g_prepare_thread_mutex);
492 if (NULL != g_prepare_thread) {
493 ecore_thread_cancel(g_prepare_thread);
495 pthread_mutex_unlock(&g_prepare_thread_mutex);
497 vc_config_mgr_unset_lang_cb(g_pid);
498 vc_config_mgr_finalize(g_pid);
500 /* Free client resources */
508 SLOG(LOG_INFO, TAG_VCC, "Success: destroy");
510 if (true == g_backup) {
511 ret = vc_db_backup_command();
513 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to backup command, ret(%d)", ret); //LCOV_EXCL_LINE
517 ret = vc_db_finalize();
519 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB, ret(%d)", ret); //LCOV_EXCL_LINE
522 if (0 != vc_tidl_close_connection()) {
523 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection"); //LCOV_EXCL_LINE
526 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Deinitialize DONE");
528 return VC_ERROR_NONE;
531 static Eina_Bool connect_service(void *data)
533 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon");
535 /* request initialization */
538 int service_state = 0;
541 if (false == vc_client_is_valid()) {
542 SLOG(LOG_ERROR, TAG_VCC, "[Not ERROR] The current client is not valid. It is destroyed."); //LCOV_EXCL_LINE
546 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] The current client is valid");
549 ret = vc_db_initialize();
551 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize DB : %d", ret); //LCOV_EXCL_LINE
555 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
557 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
559 ret = vc_tidl_request_initialize(g_pid, &mgr_pid, &service_state, &g_daemon_pid);
561 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
562 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
564 vc_client_set_error(VC_ERROR_ENGINE_NOT_FOUND);
565 ecore_main_loop_thread_safe_call_async(__vc_notify_error, NULL);
569 } else if (0 != ret) {
570 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
572 vc_client_set_error(VC_ERROR_TIMED_OUT);
573 ecore_main_loop_thread_safe_call_async(__vc_notify_error, NULL);
575 ret = vc_db_finalize();
577 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB : %d", ret); //LCOV_EXCL_LINE
582 /* Success to connect */
585 /* Set service state */
586 vc_service_state_e previous_service_state;
587 vc_client_get_service_state(&previous_service_state);
589 vc_client_set_service_state((vc_service_state_e)service_state);
591 vc_service_state_changed_cb service_changed_callback = NULL;
592 void* user_data = NULL;
593 vc_client_get_service_state_changed_cb(&service_changed_callback, &user_data);
595 if (NULL != service_changed_callback) {
596 vc_client_use_callback();
597 service_changed_callback(previous_service_state, service_state, user_data);
598 vc_client_not_use_callback();
599 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called"); //LCOV_EXCL_LINE
601 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null"); //LCOV_EXCL_LINE
604 /* Register focus handler */
605 ecore_thread_main_loop_begin();
606 g_focus_in_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_IN, __focus_changed_cb, NULL);
607 g_focus_out_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_OUT, __focus_changed_cb, NULL);
608 ecore_thread_main_loop_end();
610 char appid[1024] = {'\0',};
611 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1);
613 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get aul_app_get_appid_bypid : %d", ret);
615 int status = aul_app_get_status(appid);
616 if (STATUS_FOCUS == status) {
617 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground"); //LCOV_EXCL_LINE
618 ret = vc_tidl_request_set_foreground(getpid(), true);
620 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret); //LCOV_EXCL_LINE
623 ret = vc_client_set_is_foreground(true);
625 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret); //LCOV_EXCL_LINE
628 /* set authority valid */
629 vc_auth_state_e state = VC_AUTH_STATE_NONE;
630 if (0 != vc_client_get_auth_state(&state)) {
631 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
633 if (VC_AUTH_STATE_INVALID == state) {
634 vc_client_set_auth_state(VC_AUTH_STATE_VALID);
636 /* notify auth changed cb */
637 ecore_idler_add(__notify_auth_changed_cb, NULL);
641 vc_client_set_client_state(VC_STATE_READY);
642 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, NULL);
644 vc_client_set_mgr_pid(mgr_pid);
646 /* TODO set_start_listening should be move to proper place */
647 vc_client_set_start_listening(true);
649 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon DONE");
654 static void __start_prepare_thread(void *data, Ecore_Thread *thread)
656 SLOG(LOG_ERROR, TAG_VCC, "@@@ Start prepare thread");
657 int ret = -1, retry_count = 0;
661 pthread_mutex_lock(&g_prepare_thread_mutex);
662 if (EINA_TRUE == ecore_thread_check(thread)) {
663 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!");
664 pthread_mutex_unlock(&g_prepare_thread_mutex);
668 if (retry_count == VC_TIDL_RETRY_COUNT) { // 200 ms * 20 = 4 sec
669 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!"); //LCOV_EXCL_LINE
670 pthread_mutex_unlock(&g_prepare_thread_mutex); //LCOV_EXCL_LINE
671 return; //LCOV_EXCL_LINE
674 ret = vc_tidl_request_hello();
675 pthread_mutex_unlock(&g_prepare_thread_mutex);
677 SLOG(LOG_DEBUG, TAG_VCC, "Success to request hello. retry count(%d)", retry_count);
688 pthread_mutex_lock(&g_prepare_thread_mutex);
689 if (EINA_TRUE == ecore_thread_check(thread)) {
690 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!"); //LCOV_EXCL_LINE
691 pthread_mutex_unlock(&g_prepare_thread_mutex); //LCOV_EXCL_LINE
692 return; //LCOV_EXCL_LINE
695 if (retry_count == 10) {
696 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon !!"); //LCOV_EXCL_LINE
697 pthread_mutex_unlock(&g_prepare_thread_mutex); //LCOV_EXCL_LINE
698 return; //LCOV_EXCL_LINE
701 ret = connect_service(NULL);
702 pthread_mutex_unlock(&g_prepare_thread_mutex);
710 static void __end_prepare_thread(void *data, Ecore_Thread *thread)
712 SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread");
713 g_prepare_thread = NULL;
716 static void __cancel_prepare_thread(void *data, Ecore_Thread *thread)
718 SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread");
719 g_prepare_thread = NULL;
725 ret = __check_feature_privilege();
726 if (VC_ERROR_NONE != ret)
729 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
732 if (0 != vc_client_get_client_state(&state)) {
733 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
734 return VC_ERROR_INVALID_STATE;
738 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
740 g_prepare_thread = ecore_thread_run(__start_prepare_thread, __end_prepare_thread, __cancel_prepare_thread, NULL);
742 return VC_ERROR_NONE;
745 int vc_prepare_sync(void)
748 ret = __check_feature_privilege();
749 if (VC_ERROR_NONE != ret)
752 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
755 if (0 != vc_client_get_client_state(&state)) {
756 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
757 return VC_ERROR_INVALID_STATE;
761 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
765 while (VC_CONNECTION_RETRY_COUNT > cnt) {
766 ret= vc_tidl_request_hello_sync();
767 if (VC_ERROR_NONE == ret)
769 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello_sync and retry, ret(%d)", ret);
773 if (VC_ERROR_NONE != ret) {
774 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello_sync, ret(%d)", ret);
779 while (EINA_TRUE == connect_service(NULL) && VC_CONNECTION_RETRY_COUNT > cnt) {
783 RETVM_IF(VC_CONNECTION_RETRY_COUNT == cnt, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Fail to connect daemon");
785 return VC_ERROR_NONE;
788 int vc_unprepare(void)
791 ret = __check_feature_privilege();
792 if (VC_ERROR_NONE != ret)
795 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare");
798 if (0 != vc_client_get_client_state(&state)) {
799 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
800 return VC_ERROR_INVALID_STATE;
804 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
806 __vc_internal_unprepare();
808 vc_client_set_client_state(VC_STATE_INITIALIZED);
809 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, NULL);
811 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare DONE");
813 return VC_ERROR_NONE;
816 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
819 ret = __check_feature_privilege();
820 if (VC_ERROR_NONE != ret)
823 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
826 if (0 != vc_client_get_client_state(&state)) {
827 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
828 return VC_ERROR_INVALID_STATE;
831 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language");
833 ret = vc_config_mgr_get_language_list(callback, user_data);
835 ret = vc_config_convert_error_code((vc_config_error_e)ret); //LCOV_EXCL_LINE
836 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
839 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language DONE");
841 return VC_ERROR_NONE;
845 int vc_get_current_language(char** language)
848 ret = __check_feature_privilege();
849 if (VC_ERROR_NONE != ret)
852 RETVM_IF(NULL == language, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
855 if (0 != vc_client_get_client_state(&state)) {
856 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
857 return VC_ERROR_INVALID_STATE;
860 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language");
862 ret = vc_config_mgr_get_default_language(language);
864 ret = vc_config_convert_error_code((vc_config_error_e)ret); //LCOV_EXCL_LINE
865 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
868 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language DONE");
873 int vc_get_state(vc_state_e* state)
876 ret = __check_feature_privilege();
877 if (VC_ERROR_NONE != ret)
880 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
883 if (0 != vc_client_get_client_state(&temp)) {
884 SLOG(LOG_WARN, TAG_VCC, "[ERROR] handle is not valid");
885 temp = VC_STATE_NONE;
888 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State");
890 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
891 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
892 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
893 default: //LCOV_EXCL_LINE
894 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state. Return state as 'None'."); //LCOV_EXCL_LINE
895 temp = VC_STATE_NONE; //LCOV_EXCL_LINE
899 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State DONE");
901 return VC_ERROR_NONE;
904 int vc_get_service_state(vc_service_state_e* state)
907 ret = __check_feature_privilege();
908 if (VC_ERROR_NONE != ret)
911 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
914 if (0 != vc_client_get_client_state(&temp)) {
915 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
916 return VC_ERROR_INVALID_STATE;
919 RETVM_IF(VC_STATE_READY != temp, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", temp);
921 /* get service state */
922 vc_service_state_e service_state;
923 if (0 != vc_client_get_service_state(&service_state)) {
924 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state"); //LCOV_EXCL_LINE
925 return VC_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
928 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State");
930 *state = service_state;
933 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break; //LCOV_EXCL_LINE
934 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
935 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
936 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
937 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state"); //LCOV_EXCL_LINE
940 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State DONE");
942 return VC_ERROR_NONE;
945 int vc_get_system_command_list(vc_cmd_list_h* vc_sys_cmd_list)
948 ret = __check_feature_privilege();
949 if (VC_ERROR_NONE != ret)
952 RETVM_IF(NULL == vc_sys_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
953 *vc_sys_cmd_list = NULL;
956 if (0 != vc_client_get_client_state(&state)) {
957 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
958 return VC_ERROR_INVALID_STATE;
962 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
964 /* Check service state */
965 vc_service_state_e service_state = -1;
966 vc_client_get_service_state(&service_state);
967 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
970 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list");
972 bool is_sys_cmd_valid = false;
975 bool is_prepared = false;
977 ret = vc_tidl_request_is_system_command_valid(g_pid, &is_sys_cmd_valid);
980 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
981 vc_client_set_client_state(VC_STATE_INITIALIZED);
982 if (0 == vc_prepare_sync()) {
984 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
986 } else if (VC_ERROR_TIMED_OUT != ret) {
987 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to ask system command is : %s", __vc_get_error_code(ret));
990 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to ask system command is : %s", __vc_get_error_code(ret));
993 if (VC_RETRY_COUNT == count) {
994 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1003 ret = vc_client_get_mgr_pid(&mgr_pid);
1005 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get the manager pid"); //LCOV_EXCL_LINE
1006 return VC_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1009 if (true == is_sys_cmd_valid) {
1010 vc_cmd_list_s* list = NULL;
1011 ret = vc_cmd_list_create((vc_cmd_list_h*)&list);
1013 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
1014 return ret; //LCOV_EXCL_LINE
1017 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, &(list->list));
1019 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
1020 vc_cmd_list_destroy((vc_cmd_list_h)list, true); //LCOV_EXCL_LINE
1021 return ret; //LCOV_EXCL_LINE
1024 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &(list->list));
1026 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
1027 vc_cmd_list_destroy((vc_cmd_list_h)list, true); //LCOV_EXCL_LINE
1028 return ret; //LCOV_EXCL_LINE
1031 *vc_sys_cmd_list = (vc_cmd_list_h)list;
1033 SLOG(LOG_WARN, TAG_VCC, "[WARNING] No system commands");
1034 return VC_ERROR_NONE;
1037 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list DONE");
1044 * @brief Checks whether the command format is supported.
1045 * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
1047 * @param[in] format The command format
1048 * @param[out] support The result status @c true = supported, @c false = not supported
1050 * @return 0 on success, otherwise a negative error value
1051 * @retval #VC_ERROR_NONE Successful
1052 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1053 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
1054 * @retval #VC_ERROR_INVALID_STATE Invalid state
1056 * @pre The state should be #VC_STATE_READY.
1058 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
1061 ret = __check_feature_privilege();
1062 if (VC_ERROR_NONE != ret)
1065 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported");
1068 if (0 != vc_client_get_client_state(&state)) {
1069 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1070 return VC_ERROR_INVALID_STATE;
1074 bool non_fixed_support = false;
1075 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
1076 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
1080 case VC_CMD_FORMAT_FIXED: *support = true; break;
1081 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
1082 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
1083 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
1084 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
1085 default: *support = false; break;
1088 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
1090 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported DONE");
1092 return VC_ERROR_NONE;
1096 static int __vc_get_invocation_name(char** invocation_name)
1098 int ret = vc_client_get_invocation_name(invocation_name);
1100 SLOG(LOG_WARN, TAG_VCC, "Fail to get invocation name"); //LCOV_EXCL_LINE
1101 return ret; //LCOV_EXCL_LINE
1104 if (NULL == *invocation_name) {
1105 char* temp_label = NULL;
1109 ret = app_manager_get_app_id(getpid(), &appid);
1110 if (0 != ret || NULL == appid) {
1112 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get appid, ret(%d)", ret);
1114 return VC_ERROR_OPERATION_FAILED;
1118 ret = vc_get_current_language(&lang);
1119 if (0 != ret || NULL == lang) {
1121 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current language, ret(%d)", ret);
1124 return VC_ERROR_OPERATION_FAILED;
1128 ret = app_info_get_localed_label(appid, lang, &temp_label);
1129 if (0 != ret || NULL == temp_label) {
1131 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get localed label, ret(%d) appid(%s) lang(%s)", ret, appid, lang);
1135 return VC_ERROR_OPERATION_FAILED;
1139 *invocation_name = strdup(temp_label);
1140 if (NULL == *invocation_name) {
1142 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory");
1146 return VC_ERROR_OUT_OF_MEMORY;
1155 SLOG(LOG_DEBUG, TAG_VCC, "Get invocation name(%s)", *invocation_name);
1156 return VC_ERROR_NONE;
1159 void __set_command(vc_cmd_type_e type)
1163 bool is_prepared = false;
1165 ret = vc_tidl_request_set_command(g_pid, type);
1168 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1169 vc_client_set_client_state(VC_STATE_INITIALIZED);
1170 if (0 == vc_prepare_sync()) {
1172 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1174 } else if (VC_ERROR_TIMED_OUT != ret) {
1175 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1178 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1181 if (VC_RETRY_COUNT == count) {
1182 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1191 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
1194 ret = __check_feature_privilege();
1195 if (VC_ERROR_NONE != ret)
1198 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
1201 if (0 != vc_client_get_client_state(&state)) {
1202 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1203 return VC_ERROR_INVALID_STATE;
1207 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1210 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list");
1213 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1214 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1215 return VC_ERROR_INVALID_PARAMETER;
1218 vc_cmd_list_s* list = NULL;
1219 list = (vc_cmd_list_s*)vc_cmd_list;
1220 RETVM_IF(NULL == list->list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Invalid command list");
1223 char* invocation_name = NULL;
1224 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1225 ret = __vc_get_invocation_name(&invocation_name);
1226 if (0 != ret || NULL == invocation_name) {
1227 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret); //LCOV_EXCL_LINE
1228 return ret;//LCOV_EXCL_LINE
1232 ret = vc_cmd_parser_delete_file(getpid(), type);
1234 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1236 ret = vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list, invocation_name);
1238 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
1240 __set_command((vc_cmd_type_e)type);
1243 FREE(invocation_name);
1245 if (VC_COMMAND_TYPE_BACKGROUND == type)
1248 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list DONE");
1253 int vc_unset_command_list(int type)
1256 ret = __check_feature_privilege();
1257 if (VC_ERROR_NONE != ret)
1261 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1262 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1263 return VC_ERROR_INVALID_PARAMETER;
1267 if (0 != vc_client_get_client_state(&state)) {
1268 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1269 return VC_ERROR_INVALID_STATE;
1273 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1276 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list");
1280 bool is_prepared = false;
1282 ret = vc_tidl_request_unset_command(g_pid, (vc_cmd_type_e)type);
1285 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1286 vc_client_set_client_state(VC_STATE_INITIALIZED);
1287 if (0 == vc_prepare_sync()) {
1289 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1291 } else if (VC_ERROR_TIMED_OUT != ret) {
1292 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
1295 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
1298 if (VC_RETRY_COUNT == count) {
1299 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1307 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
1309 ret = vc_config_convert_error_code((vc_config_error_e)ret); //LCOV_EXCL_LINE
1310 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret)); //LCOV_EXCL_LINE
1313 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list DONE");
1318 int vc_set_command_list_from_file(const char* file_path, int type)
1321 ret = __check_feature_privilege();
1322 if (VC_ERROR_NONE != ret)
1325 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1326 SLOG(LOG_INFO, TAG_VCC, "@@@ File path: %s", file_path);
1329 if (0 != vc_client_get_client_state(&state)) {
1330 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1331 return VC_ERROR_INVALID_STATE;
1335 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1338 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1339 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1340 return VC_ERROR_INVALID_PARAMETER;
1344 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file");
1347 char* invocation_name = NULL;
1348 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1349 ret = __vc_get_invocation_name(&invocation_name);
1350 if (0 != ret || NULL == invocation_name) {
1351 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1356 ret = vc_cmd_parser_delete_file(getpid(), type);
1358 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1360 ret = vc_json_set_commands_from_file(file_path, (vc_cmd_type_e)type, invocation_name);
1362 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set commands from file : %s", __vc_get_error_code(ret));
1364 __set_command((vc_cmd_type_e)type);
1367 FREE(invocation_name);
1369 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file DONE");
1373 static void __vc_notify_error(void *data)
1375 vc_error_cb callback = NULL;
1379 vc_client_get_error_cb(&callback, &user_data);
1380 vc_client_get_error(&reason);
1382 if (NULL != callback) {
1383 vc_client_use_callback();
1384 callback(reason, user_data);
1385 vc_client_not_use_callback();
1386 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1388 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1392 int __vc_cb_error(int reason, const char* msg)
1394 if (VC_ERROR_SERVICE_RESET == reason) {
1395 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset");
1397 vc_client_set_client_state(VC_STATE_INITIALIZED);
1398 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, NULL);
1400 if (0 != vc_prepare()) {
1401 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare");
1405 SLOG(LOG_ERROR, TAG_VCC, "[INFO] send error reason(%d), msg(%s)", reason, msg);
1407 vc_client_set_error(reason);
1408 ecore_main_loop_thread_safe_call_async(__vc_notify_error, NULL);
1410 return VC_ERROR_NONE;
1413 static void __vc_notify_state_changed(void *data)
1415 vc_state_changed_cb changed_callback = NULL;
1418 vc_client_get_state_changed_cb(&changed_callback, &user_data);
1420 vc_state_e current_state;
1421 vc_state_e previous_state;
1423 vc_client_get_previous_state(¤t_state, &previous_state);
1425 if (NULL != changed_callback) {
1426 vc_client_use_callback();
1427 changed_callback(previous_state, current_state, user_data);
1428 vc_client_not_use_callback();
1429 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1431 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1436 static Eina_Bool __vc_notify_result(void *data)
1440 vc_cmd_list_h vc_cmd_list = NULL;
1442 vc_result_cb callback = NULL;
1443 void* user_data = NULL;
1445 vc_client_get_result_cb(&callback, &user_data);
1447 RETVM_IF(NULL == callback, EINA_FALSE, TAG_VCC, "[ERROR] Client result callback is NULL");
1449 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1450 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1454 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1456 SECURE_SLOG(LOG_INFO, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1458 vc_cmd_print_list(vc_cmd_list);
1460 vc_client_use_callback();
1461 callback(event, vc_cmd_list, temp_text, user_data);
1462 vc_client_not_use_callback();
1464 SLOG(LOG_INFO, TAG_VCC, "Client result callback called");
1466 vc_cmd_list_destroy(vc_cmd_list, true);
1469 /* Release result */
1475 void __vc_cb_result(void)
1477 ecore_timer_add(0, __vc_notify_result, NULL);
1481 int vc_get_result(vc_result_cb callback, void* user_data)
1484 ret = __check_feature_privilege();
1485 if (VC_ERROR_NONE != ret)
1489 if (0 != vc_client_get_client_state(&state)) {
1490 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1491 return VC_ERROR_INVALID_STATE;
1495 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1497 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client result callback is NULL");
1499 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result");
1501 char* temp_text = NULL;
1503 vc_cmd_list_h vc_cmd_list = NULL;
1505 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1506 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
1507 return VC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1510 ret = vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1511 if (0 != ret || NULL == temp_text) {
1512 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get result, ret(%d) temp_text(%s)", ret, temp_text);
1517 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event); //LCOV_EXCL_LINE
1519 vc_cmd_print_list(vc_cmd_list);
1521 vc_client_use_callback();
1522 callback(event, vc_cmd_list, temp_text, user_data);
1523 vc_client_not_use_callback();
1525 vc_cmd_list_destroy(vc_cmd_list, true);
1528 /* Release result */
1531 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result DONE");
1533 return VC_ERROR_NONE;
1537 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1540 ret = __check_feature_privilege();
1541 if (VC_ERROR_NONE != ret)
1544 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client result callback is NULL");
1547 if (0 != vc_client_get_client_state(&state)) {
1548 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1549 return VC_ERROR_INVALID_STATE;
1553 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1555 vc_client_set_result_cb(callback, user_data);
1557 return VC_ERROR_NONE;
1560 int vc_unset_result_cb(void)
1563 ret = __check_feature_privilege();
1564 if (VC_ERROR_NONE != ret)
1568 if (0 != vc_client_get_client_state(&state)) {
1569 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1570 return VC_ERROR_INVALID_STATE;
1574 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1576 vc_client_set_result_cb(NULL, NULL);
1578 return VC_ERROR_NONE;
1581 int __vc_cb_service_state(int state)
1583 vc_service_state_e current_state = (vc_service_state_e)state;
1584 vc_service_state_e previous_state;
1585 vc_client_get_service_state(&previous_state);
1587 if (current_state == previous_state) {
1588 return VC_ERROR_NONE;
1591 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : previous(%d) current(%d)",
1592 previous_state, current_state);
1594 /* Save service state */
1595 vc_client_set_service_state(current_state);
1597 vc_service_state_changed_cb callback = NULL;
1598 void* service_user_data;
1599 vc_client_get_service_state_changed_cb(&callback, &service_user_data);
1601 if (NULL != callback) {
1602 vc_client_use_callback();
1603 callback((vc_service_state_e)previous_state, (vc_service_state_e)current_state, service_user_data);
1604 vc_client_not_use_callback();
1605 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
1607 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null");
1610 return VC_ERROR_NONE;
1613 int __vc_cb_manager_pid(int manager_pid)
1615 SLOG(LOG_DEBUG, TAG_VCC, "Manager pid is changed : %d", manager_pid);
1617 /* Save service state */
1618 vc_client_set_mgr_pid(manager_pid);
1620 return VC_ERROR_NONE;
1623 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1626 ret = __check_feature_privilege();
1627 if (VC_ERROR_NONE != ret)
1630 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client service state changed callback is NULL");
1633 if (0 != vc_client_get_client_state(&state)) {
1634 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1635 return VC_ERROR_INVALID_STATE;
1639 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1641 vc_client_set_service_state_changed_cb(callback, user_data);
1643 return VC_ERROR_NONE;
1646 int vc_unset_service_state_changed_cb(void)
1649 ret = __check_feature_privilege();
1650 if (VC_ERROR_NONE != ret)
1654 if (0 != vc_client_get_client_state(&state)) {
1655 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1656 return VC_ERROR_INVALID_STATE;
1660 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1662 vc_client_set_service_state_changed_cb(NULL, NULL);
1664 return VC_ERROR_NONE;
1667 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1670 ret = __check_feature_privilege();
1671 if (VC_ERROR_NONE != ret)
1674 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client state changed callback is NULL");
1677 if (0 != vc_client_get_client_state(&state)) {
1678 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
1679 return VC_ERROR_INVALID_STATE;
1683 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1685 vc_client_set_state_changed_cb(callback, user_data);
1687 return VC_ERROR_NONE;
1690 int vc_unset_state_changed_cb(void)
1693 ret = __check_feature_privilege();
1694 if (VC_ERROR_NONE != ret)
1698 if (0 != vc_client_get_client_state(&state)) {
1699 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
1700 return VC_ERROR_INVALID_STATE;
1704 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1706 vc_client_set_state_changed_cb(NULL, NULL);
1708 return VC_ERROR_NONE;
1711 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
1714 ret = __check_feature_privilege();
1715 if (VC_ERROR_NONE != ret)
1718 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client current language changed callback is NULL");
1721 if (0 != vc_client_get_client_state(&state)) {
1722 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
1723 return VC_ERROR_INVALID_STATE;
1727 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1729 vc_client_set_current_lang_changed_cb(callback, user_data);
1731 return VC_ERROR_NONE;
1734 int vc_unset_current_language_changed_cb(void)
1737 ret = __check_feature_privilege();
1738 if (VC_ERROR_NONE != ret)
1742 if (0 != vc_client_get_client_state(&state)) {
1743 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
1744 return VC_ERROR_INVALID_STATE;
1748 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1750 vc_client_set_current_lang_changed_cb(NULL, NULL);
1752 return VC_ERROR_NONE;
1755 int vc_set_error_cb(vc_error_cb callback, void* user_data)
1758 ret = __check_feature_privilege();
1759 if (VC_ERROR_NONE != ret)
1762 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client error callback is NULL");
1765 if (0 != vc_client_get_client_state(&state)) {
1766 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
1767 return VC_ERROR_INVALID_STATE;
1771 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1773 vc_client_set_error_cb(callback, user_data);
1775 return VC_ERROR_NONE;
1778 int vc_unset_error_cb(void)
1781 ret = __check_feature_privilege();
1782 if (VC_ERROR_NONE != ret)
1786 if (0 != vc_client_get_client_state(&state)) {
1787 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
1788 return VC_ERROR_INVALID_STATE;
1792 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1794 vc_client_set_error_cb(NULL, NULL);
1796 return VC_ERROR_NONE;
1799 int vc_set_invocation_name(const char* name)
1802 ret = __check_feature_privilege();
1803 if (VC_ERROR_NONE != ret)
1806 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set invocation name");
1809 if (0 != vc_client_get_client_state(&state)) {
1810 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
1811 return VC_ERROR_INVALID_STATE;
1815 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1817 ret = vc_client_set_invocation_name(name);
1819 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set invocation name");
1824 int vc_set_server_dialog(const char* app_id, const char* credential)
1828 ret = __check_feature_privilege();
1829 if (VC_ERROR_NONE != ret)
1832 RETVM_IF(NULL == credential, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Credential is NULL");
1834 if (0 != vc_client_get_client_state(&state)) {
1835 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
1836 return VC_ERROR_INVALID_STATE;
1840 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1842 /* Check service state */
1843 vc_service_state_e service_state = -1;
1844 vc_client_get_service_state(&service_state);
1845 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
1848 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog, pid(%d), app_id(%s)", getpid(), app_id);
1850 char* tmp_appid = NULL;
1851 if (NULL == app_id) {
1852 ret = app_manager_get_app_id(getpid(), &tmp_appid);
1853 if (0 != ret || NULL == tmp_appid) {
1854 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
1856 return VC_ERROR_INVALID_PARAMETER;
1859 tmp_appid = strdup(app_id);
1863 SLOG(LOG_DEBUG, TAG_VCC, "Set server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
1866 bool is_prepared = false;
1868 ret = vc_tidl_request_set_server_dialog(pid, tmp_appid, credential);
1871 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1872 vc_client_set_client_state(VC_STATE_INITIALIZED);
1873 if (0 == vc_prepare_sync()) {
1875 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1877 } else if (VC_ERROR_TIMED_OUT != ret) {
1878 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set server dialog to vc service : %s", __vc_get_error_code(ret));
1881 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set server dialog : %s", __vc_get_error_code(ret));
1884 if (VC_RETRY_COUNT == count) {
1885 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1895 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog DONE");
1900 int vc_unset_server_dialog(const char* app_id)
1904 char* tmp_appid = NULL;
1906 ret = __check_feature_privilege();
1907 if (VC_ERROR_NONE != ret)
1910 if (0 != vc_client_get_client_state(&state)) {
1911 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
1912 return VC_ERROR_INVALID_STATE;
1916 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1918 /* Check service state */
1919 vc_service_state_e service_state = -1;
1920 vc_client_get_service_state(&service_state);
1921 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
1924 if (NULL == app_id) {
1925 ret = app_manager_get_app_id(getpid(), &tmp_appid);
1926 if (0 != ret || NULL == tmp_appid) {
1927 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
1929 return VC_ERROR_INVALID_PARAMETER;
1932 tmp_appid = strdup(app_id);
1936 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
1939 bool is_prepared = false;
1940 char* credential = strdup("#NULL");
1942 ret = vc_tidl_request_set_server_dialog(pid, tmp_appid, credential);
1945 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1946 vc_client_set_client_state(VC_STATE_INITIALIZED);
1947 if (0 == vc_prepare_sync()) {
1949 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1951 } else if (VC_ERROR_TIMED_OUT != ret) {
1952 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset server dialog to vc service : %s", __vc_get_error_code(ret));
1955 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset server dialog : %s", __vc_get_error_code(ret));
1958 if (VC_RETRY_COUNT == count) {
1959 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1970 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog DONE");
1975 int vc_request_dialog(const char* disp_text, const char* utt_text, bool auto_start)
1979 ret = __check_feature_privilege();
1980 if (VC_ERROR_NONE != ret)
1983 if (0 != vc_client_get_client_state(&state)) {
1984 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
1985 return VC_ERROR_INVALID_STATE;
1989 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1991 /* Check service state */
1992 vc_service_state_e service_state = -1;
1993 vc_client_get_service_state(&service_state);
1994 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
1996 RETVM_IF(NULL == disp_text && NULL == utt_text, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Both two parameters are NULL");
1998 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog : pid(%d) disp_text(%s), utt_text(%s), auto_start(%d)", getpid(), disp_text, utt_text, auto_start);
1999 ret = vc_tidl_request_request_dialog(getpid(), disp_text, utt_text, auto_start);
2001 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request dialog, ret(%d)", ret);
2002 return VC_ERROR_OPERATION_FAILED;
2005 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog DONE");
2007 return VC_ERROR_NONE;
2012 int vc_auth_enable(void)
2016 if (0 != vc_client_get_client_state(&state)) {
2017 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2018 return VC_ERROR_INVALID_STATE;
2020 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", state);
2022 /* check already authority */
2023 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2024 if (0 != vc_client_get_auth_state(&auth_state)) {
2025 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2026 return VC_ERROR_INVALID_STATE;
2028 RETVM_IF(VC_AUTH_STATE_NONE != auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Already authority enabled");
2030 /* request authority */
2032 if (0 != vc_client_get_mgr_pid(&mgr_pid)) {
2033 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2034 return VC_ERROR_OPERATION_FAILED;
2037 if (0 != vc_tidl_request_auth_enable(g_pid, mgr_pid)) {
2038 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
2039 return VC_ERROR_OPERATION_FAILED;
2042 /* set authority into handle */
2043 bool is_foreground = false;
2044 if (0 != vc_client_get_is_foreground(&is_foreground)) {
2045 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get is_foreground");
2046 return VC_ERROR_OPERATION_FAILED;
2049 if (is_foreground) {
2050 auth_state = VC_AUTH_STATE_VALID;
2052 auth_state = VC_AUTH_STATE_INVALID;
2055 if (0 != vc_client_set_auth_state(auth_state)) {
2056 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2057 return VC_ERROR_OPERATION_FAILED;
2060 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2062 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
2064 return VC_ERROR_NONE;
2067 int vc_auth_disable(void)
2071 if (0 != vc_client_get_client_state(&state)) {
2072 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2073 return VC_ERROR_INVALID_STATE;
2075 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", state);
2077 /* check authority */
2078 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2079 if (0 != vc_client_get_auth_state(&auth_state)) {
2080 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2081 return VC_ERROR_INVALID_STATE;
2083 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] No authority");
2085 if (0 != vc_auth_unset_state_changed_cb()) {
2086 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
2089 /* request return authority by tidl */
2091 if (0 != vc_client_get_mgr_pid(&mgr_pid)) {
2092 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2093 return VC_ERROR_OPERATION_FAILED;
2096 if (0 != vc_tidl_request_auth_disable(g_pid, mgr_pid)) {
2097 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disable");
2098 return VC_ERROR_OPERATION_FAILED;
2101 /* unset authority from handle */
2102 if (0 != vc_client_set_auth_state(VC_AUTH_STATE_NONE)) {
2103 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2104 return VC_ERROR_OPERATION_FAILED;
2107 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2109 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
2111 return VC_ERROR_NONE;
2114 int vc_auth_get_state(vc_auth_state_e* state)
2117 vc_state_e vc_state;
2118 if (0 != vc_client_get_client_state(&vc_state)) {
2119 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2120 return VC_ERROR_INVALID_STATE;
2122 RETVM_IF(VC_STATE_READY != vc_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", vc_state);
2125 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
2126 if (0 != vc_client_get_auth_state(&temp)) {
2127 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2128 return VC_ERROR_INVALID_STATE;
2133 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
2135 return VC_ERROR_NONE;
2138 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
2140 /* check parameter */
2141 if (NULL == callback) {
2142 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
2143 return VC_ERROR_INVALID_PARAMETER;
2147 vc_auth_state_e auth_state;
2148 if (0 != vc_client_get_auth_state(&auth_state)) {
2149 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2150 return VC_ERROR_INVALID_STATE;
2152 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Auth is not enabled");
2154 /* set cb into handle */
2155 if (0 != vc_client_set_auth_state_changed_cb(callback, user_data)) {
2156 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
2157 return VC_ERROR_OPERATION_FAILED;
2160 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
2162 return VC_ERROR_NONE;
2165 int vc_auth_unset_state_changed_cb(void)
2168 vc_auth_state_e auth_state;
2169 if (0 != vc_client_get_auth_state(&auth_state)) {
2170 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2171 return VC_ERROR_INVALID_STATE;
2173 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Auth is not enabled");
2175 /* unset cb from handle */
2176 if (0 != vc_client_unset_auth_state_changed_cb()) {
2177 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
2178 return VC_ERROR_OPERATION_FAILED;
2181 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
2183 return VC_ERROR_NONE;
2186 int vc_auth_start(void)
2188 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
2191 if (0 != vc_client_get_client_state(&state)) {
2192 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2193 return VC_ERROR_INVALID_STATE;
2197 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2199 /* Check service state */
2200 vc_service_state_e service_state = -1;
2201 vc_client_get_service_state(&service_state);
2202 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2204 /* Check authority */
2205 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2206 if (0 != vc_client_get_auth_state(&auth_state)) {
2207 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2208 return VC_ERROR_OPERATION_FAILED;
2210 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2214 if (0 != vc_client_get_mgr_pid(&mgr_pid)) {
2215 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2216 return VC_ERROR_OPERATION_FAILED;
2221 bool is_prepared = false;
2224 ret = vc_tidl_request_auth_start(g_pid, mgr_pid);
2226 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2227 vc_client_set_client_state(VC_STATE_INITIALIZED);
2228 if (0 == vc_prepare_sync()) {
2230 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2232 } else if (VC_ERROR_TIMED_OUT != ret) {
2233 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
2236 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
2239 if (VC_RETRY_COUNT == count) {
2240 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2245 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
2249 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start DONE");
2254 int vc_auth_stop(void)
2256 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
2259 if (0 != vc_client_get_client_state(&state)) {
2260 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2261 return VC_ERROR_INVALID_STATE;
2265 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2267 /* Check service state */
2268 vc_service_state_e service_state = -1;
2269 vc_client_get_service_state(&service_state);
2270 RETVM_IF(service_state != VC_SERVICE_STATE_RECORDING, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'RECORDING'", service_state);
2272 /* Check authority */
2273 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2274 if (0 != vc_client_get_auth_state(&auth_state)) {
2275 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2276 return VC_ERROR_OPERATION_FAILED;
2278 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2282 if (0 != vc_client_get_mgr_pid(&mgr_pid)) {
2283 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2284 return VC_ERROR_OPERATION_FAILED;
2289 bool is_prepared = false;
2292 ret = vc_tidl_request_auth_stop(g_pid, mgr_pid);
2294 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2295 vc_client_set_client_state(VC_STATE_INITIALIZED);
2296 if (0 == vc_prepare_sync()) {
2298 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2300 } else if (VC_ERROR_TIMED_OUT != ret) {
2301 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
2304 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
2307 if (VC_RETRY_COUNT == count) {
2308 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2313 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
2317 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop DONE");
2322 int vc_auth_cancel(void)
2324 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel");
2327 if (0 != vc_client_get_client_state(&state)) {
2328 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2329 return VC_ERROR_INVALID_STATE;
2333 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2335 /* Check service state */
2336 vc_service_state_e service_state = -1;
2337 vc_client_get_service_state(&service_state);
2338 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
2339 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
2340 return VC_ERROR_INVALID_STATE;
2343 /* Check authority */
2344 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2345 if (0 != vc_client_get_auth_state(&auth_state)) {
2346 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2347 return VC_ERROR_OPERATION_FAILED;
2349 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2353 if (0 != vc_client_get_mgr_pid(&mgr_pid)) {
2354 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2355 return VC_ERROR_OPERATION_FAILED;
2360 bool is_prepared = false;
2362 ret = vc_tidl_request_auth_cancel(g_pid, mgr_pid);
2364 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2365 vc_client_set_client_state(VC_STATE_INITIALIZED);
2366 if (0 == vc_prepare_sync()) {
2368 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2370 } else if (VC_ERROR_TIMED_OUT != ret) {
2371 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
2374 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
2377 if (VC_RETRY_COUNT == count) {
2378 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2383 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
2387 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel DONE");
2392 static void __start_tts_streaming_thread(void* data, Ecore_Thread* thread)
2394 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Start tts streaming thread");
2396 vc_tts_streaming_cb callback = NULL;
2397 void* user_data = NULL;
2399 vc_client_get_tts_streaming_cb(&callback, &user_data);
2400 RETM_IF(NULL == callback, TAG_VCC, "[WARNING] tts streaming callback is null");
2407 vc_tts_data_s *tts_data = NULL;
2408 ret = vc_data_get_first_tts_data(&tts_data);
2409 if (0 != ret || NULL == tts_data) {
2411 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] No tts data. Waiting mode");
2416 if (0 < vc_data_get_tts_data_size()) {
2417 SLOG(LOG_INFO, TAG_VCC, "[INFO] Resume thread");
2421 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Wrong request, there's no pcm data");
2422 vc_data_clear_tts_data(&tts_data);
2427 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish to wait for new tts data come");
2429 /* resume tts thread */
2430 vc_data_clear_tts_data(&tts_data);
2434 if (NULL != tts_data) {
2435 SLOG(LOG_DEBUG, TAG_VCC, "tts streaming callback is called");
2436 vc_client_use_callback();
2437 callback(tts_data->event, tts_data->data, tts_data->data_size, tts_data->utt_id, user_data);
2438 vc_client_not_use_callback();
2440 /* If no tts data and EVENT_FINISH */
2441 if (0 >= vc_data_get_tts_data_size() && VC_TTS_EVENT_FINISH == tts_data->event) {
2442 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish tts");
2451 static void __end_tts_streaming_thread(void* data, Ecore_Thread* thread)
2453 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] End tts streaming thread");
2454 g_tts_thread = NULL;
2457 int __vc_cb_tts_streaming(int utt_id, vc_tts_event_e event, char* buffer, int len)
2460 vc_tts_data_s* temp_tts_data = NULL;
2461 temp_tts_data = (vc_tts_data_s*)calloc(1, sizeof(vc_tts_data_s));
2462 RETVM_IF(NULL == temp_tts_data, VC_ERROR_OUT_OF_MEMORY, TAG_VCC, "[ERROR] Out of memory");
2464 temp_tts_data->data = NULL;
2465 temp_tts_data->data_size = 0;
2468 temp_tts_data->data = (char*)calloc(len + 5, sizeof(char));
2469 if (NULL != temp_tts_data->data) {
2470 memcpy(temp_tts_data->data, buffer, len);
2471 temp_tts_data->data_size = len;
2472 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG][memcpy] data(%p) size(%d)",
2473 temp_tts_data->data, temp_tts_data->data_size);
2475 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to allocate memory");
2478 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] tts data is NULL");
2481 temp_tts_data->utt_id = utt_id;
2482 temp_tts_data->event = event;
2484 int ret = vc_data_add_tts_data(temp_tts_data);
2486 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to add tts data");
2487 FREE(temp_tts_data->data);
2488 FREE(temp_tts_data);
2491 bool is_canceled = ecore_thread_check(g_tts_thread);
2492 if (NULL == g_tts_thread || TRUE == is_canceled) {
2493 SLOG(LOG_INFO, TAG_VCC, "ecore thread run : __start_tts_streaming_thread ");
2494 g_tts_thread = ecore_thread_run(__start_tts_streaming_thread, __end_tts_streaming_thread, NULL, NULL);
2501 int vc_tts_request(const char* text, const char* language, bool to_vc_manager, int* utt_id)
2507 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request tts");
2509 ret = __vc_tts_check_privilege();
2510 if (VC_ERROR_NONE != ret)
2513 if (0 != vc_client_get_client_state(&state)) {
2514 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2515 return VC_ERROR_INVALID_STATE;
2519 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2521 /* Check service state */
2522 vc_service_state_e service_state = -1;
2523 vc_client_get_service_state(&service_state);
2524 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2525 RETVM_IF(NULL == text || NULL == language || NULL == utt_id, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Parameter is NULL");
2527 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts request, pid(%d), text(%s), language(%s), to_vc_manager(%d)", pid, text, language, to_vc_manager);
2530 bool is_prepared = false;
2532 ret = vc_tidl_request_request_tts(pid, text, language, to_vc_manager, utt_id);
2535 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2536 vc_client_set_client_state(VC_STATE_INITIALIZED);
2537 if (0 == vc_prepare_sync()) {
2539 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2541 } else if (VC_ERROR_TIMED_OUT != ret) {
2542 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request tts to vc service : %s", __vc_get_error_code(ret));
2545 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request tts : %s", __vc_get_error_code(ret));
2548 if (VC_RETRY_COUNT == count) {
2549 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2557 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request tts DONE");
2562 int vc_tts_cancel(int utt_id)
2568 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Cancel tts");
2570 ret = __vc_tts_check_privilege();
2571 if (VC_ERROR_NONE != ret)
2574 if (0 != vc_client_get_client_state(&state)) {
2575 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2576 return VC_ERROR_INVALID_STATE;
2580 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2582 /* Check service state */
2583 vc_service_state_e service_state = -1;
2584 vc_client_get_service_state(&service_state);
2585 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2586 RETVM_IF(0 > utt_id, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] utt_id is negative value");
2588 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts cancel, pid(%d), utt_id(%d)", pid, utt_id);
2590 ret = vc_data_clear_tts_data_by_uttid(utt_id);
2592 SLOG(LOG_INFO, TAG_VCC, "[INFO] There's no data in client pcm queue");
2596 bool is_prepared = false;
2598 ret = vc_tidl_request_cancel_tts(pid, utt_id);
2601 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2602 vc_client_set_client_state(VC_STATE_INITIALIZED);
2603 if (0 == vc_prepare_sync()) {
2605 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2607 } else if (VC_ERROR_TIMED_OUT != ret) {
2608 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel tts to vc service : %s", __vc_get_error_code(ret));
2611 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel tts : %s", __vc_get_error_code(ret));
2614 if (VC_RETRY_COUNT == count) {
2615 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel");
2623 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Cancel tts DONE");
2629 int vc_tts_get_synthesized_audio_details(int* rate, vc_audio_channel_e* channel, vc_audio_type_e* audio_type)
2635 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Get tts audio format");
2637 ret = __vc_tts_check_privilege();
2638 if (VC_ERROR_NONE != ret)
2641 if (0 != vc_client_get_client_state(&state)) {
2642 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2643 return VC_ERROR_INVALID_STATE;
2647 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2649 /* Check service state */
2650 vc_service_state_e service_state = -1;
2651 vc_client_get_service_state(&service_state);
2652 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2654 SLOG(LOG_DEBUG, TAG_VCC, "@@@ get tts audio format, pid(%d)", pid);
2657 bool is_prepared = false;
2659 ret = vc_tidl_request_get_tts_audio_format(pid, rate, channel, audio_type);
2661 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2662 vc_client_set_client_state(VC_STATE_INITIALIZED);
2663 if (0 == vc_prepare_sync()) {
2665 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2667 } else if (VC_ERROR_TIMED_OUT != ret) {
2668 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format : %s", __vc_get_error_code(ret));
2671 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to get tts audio format : %s", __vc_get_error_code(ret));
2674 if (VC_RETRY_COUNT == count) {
2675 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format");
2682 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Get tts audio format DONE");
2688 int vc_tts_set_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
2691 ret = __vc_tts_check_privilege();
2692 if (VC_ERROR_NONE != ret)
2695 if (NULL == callback)
2696 return VC_ERROR_INVALID_PARAMETER;
2699 if (0 != vc_client_get_client_state(&state)) {
2700 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : A handle is not available");
2701 return VC_ERROR_INVALID_STATE;
2705 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2707 vc_client_set_tts_streaming_cb(callback, user_data);
2709 return VC_ERROR_NONE;
2712 int vc_tts_unset_streaming_cb(void)
2715 ret = __vc_tts_check_privilege();
2716 if (VC_ERROR_NONE != ret)
2720 if (0 != vc_client_get_client_state(&state)) {
2721 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : A handle is not available");
2722 return VC_ERROR_INVALID_STATE;
2726 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2728 vc_client_set_tts_streaming_cb(NULL, NULL);
2730 return VC_ERROR_NONE;
2734 int __vc_cb_utterance_status(int utt_id, int utt_status)
2736 vc_tts_utterance_status_cb callback = NULL;
2737 void* user_data = NULL;
2739 vc_client_get_tts_utterance_status_cb(&callback, &user_data);
2740 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Utterance status callback is null");
2742 SLOG(LOG_DEBUG, TAG_VCC, "Utterance status callback is called");
2743 vc_client_use_callback();
2744 callback(utt_id, (vc_tts_utterance_status_e)utt_status, user_data);
2745 vc_client_not_use_callback();
2747 return VC_ERROR_NONE;
2751 int vc_tts_set_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
2754 ret = __vc_tts_check_privilege();
2755 if (VC_ERROR_NONE != ret)
2758 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Utterance status callback is null");
2761 if (0 != vc_client_get_client_state(&state)) {
2762 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : A handle is not available");
2763 return VC_ERROR_INVALID_STATE;
2767 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2769 vc_client_set_tts_utterance_status_cb(callback, user_data);
2771 return VC_ERROR_NONE;
2774 int vc_tts_unset_utterance_status_cb(void)
2777 ret = __vc_tts_check_privilege();
2778 if (VC_ERROR_NONE != ret)
2782 if (0 != vc_client_get_client_state(&state)) {
2783 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : A handle is not available");
2784 return VC_ERROR_INVALID_STATE;
2788 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2790 vc_client_set_tts_utterance_status_cb(NULL, NULL);
2792 return VC_ERROR_NONE;