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"
45 static Ecore_Timer* g_connect_timer = NULL;
47 static Ecore_Event_Handler* g_focus_in_handler = NULL;
48 static Ecore_Event_Handler* g_focus_out_handler = NULL;
50 static Ecore_Thread* g_tts_thread = NULL;
52 static vc_h g_vc = NULL;
54 static int g_daemon_pid = 0;
56 static int g_feature_enabled = -1;
57 static bool g_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 (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
77 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
78 if (false == vc_supported || false == mic_supported) {
80 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
81 g_feature_enabled = 0;
82 return VC_ERROR_NOT_SUPPORTED;
86 g_feature_enabled = 1;
88 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value"); //LCOV_EXCL_LINE
89 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
92 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value"); //LCOV_EXCL_LINE
93 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
100 static int __check_privilege_initialize()
102 int ret = cynara_initialize(&p_cynara, NULL);
103 if (CYNARA_API_SUCCESS != ret)
104 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to initialize"); //LCOV_EXCL_LINE
106 return ret == CYNARA_API_SUCCESS;
109 static int __check_privilege(const char* uid, const char * privilege)
112 char label_path[1024] = "/proc/self/attr/current";
113 char smack_label[1024] = {'\0',};
116 return false; //LCOV_EXCL_LINE
119 fp = fopen(label_path, "r");
121 if (0 >= fread(smack_label, 1, sizeof(smack_label), fp))
122 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to fread"); //LCOV_EXCL_LINE
127 pid_t pid = getpid();
128 char *session = cynara_session_from_pid(pid);
129 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
130 SLOG(LOG_DEBUG, TAG_VCC, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
133 if (ret != CYNARA_API_ACCESS_ALLOWED)
134 return false; //LCOV_EXCL_LINE
138 static void __check_privilege_deinitialize()
142 int ret = cynara_finish(p_cynara);
143 if (ret != CYNARA_API_SUCCESS)
144 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cynara finish %d", ret); //LCOV_EXCL_LINE
149 static int __vc_check_privilege()
151 if (true == g_privilege_allowed)
152 return VC_ERROR_NONE;
154 pthread_mutex_lock(&g_cynara_mutex);
156 if (false == g_privilege_allowed) {
158 ret = __check_privilege_initialize();
161 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed");
162 pthread_mutex_unlock(&g_cynara_mutex);
163 return VC_ERROR_PERMISSION_DENIED;
168 snprintf(uid, 32, "%d", getuid());
170 ret = __check_privilege(uid, VC_PRIVILEGE);
171 __check_privilege_deinitialize();
174 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied");
175 pthread_mutex_unlock(&g_cynara_mutex);
176 return VC_ERROR_PERMISSION_DENIED;
181 g_privilege_allowed = true;
182 pthread_mutex_unlock(&g_cynara_mutex);
183 return VC_ERROR_NONE;
187 static const char* __vc_get_error_code(vc_error_e err)
190 case VC_ERROR_NONE: return "VC_ERROR_NONE";
191 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
192 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
193 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
194 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
195 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
196 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
197 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
198 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
199 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
200 default: return "Invalid error code";
205 static int __vc_convert_config_error_code(vc_config_error_e code)
207 if (code == VC_CONFIG_ERROR_NONE) return VC_ERROR_NONE;
208 if (code == VC_CONFIG_ERROR_OUT_OF_MEMORY) return VC_ERROR_OUT_OF_MEMORY;
209 if (code == VC_CONFIG_ERROR_IO_ERROR) return VC_ERROR_IO_ERROR;
210 if (code == VC_CONFIG_ERROR_INVALID_PARAMETER) return VC_ERROR_INVALID_PARAMETER;
211 if (code == VC_CONFIG_ERROR_INVALID_STATE) return VC_ERROR_INVALID_STATE;
212 if (code == VC_CONFIG_ERROR_INVALID_LANGUAGE) return VC_ERROR_INVALID_LANGUAGE;
213 if (code == VC_CONFIG_ERROR_ENGINE_NOT_FOUND) return VC_ERROR_ENGINE_NOT_FOUND;
214 if (code == VC_CONFIG_ERROR_OPERATION_FAILED) return VC_ERROR_OPERATION_FAILED;
216 return VC_ERROR_NONE;
219 static void __vc_lang_changed_cb(const char* before_lang, const char* current_lang)
221 SLOG(LOG_DEBUG, TAG_VCC, "Lang changed : Before lang(%s) Current lang(%s)",
222 before_lang, current_lang);
224 vc_current_language_changed_cb callback;
225 void* lang_user_data;
226 vc_client_get_current_lang_changed_cb(g_vc, &callback, &lang_user_data);
228 if (NULL != callback) {
229 vc_client_use_callback(g_vc);
230 callback(before_lang, current_lang, lang_user_data);
231 vc_client_not_use_callback(g_vc);
232 SLOG(LOG_DEBUG, TAG_VCC, "Language changed callback is called");
234 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Language changed callback is null");
240 static Eina_Bool __notify_auth_changed_cb(void *data)
242 vc_auth_state_changed_cb callback = NULL;
245 vc_client_get_auth_state_changed_cb(g_vc, &callback, &user_data);
247 vc_auth_state_e before = -1;
248 vc_auth_state_e current = -1;
250 vc_client_get_before_auth_state(g_vc, &before, ¤t);
252 if (NULL != callback) {
253 vc_client_use_callback(g_vc);
254 callback(before, current, user_data);
255 vc_client_not_use_callback(g_vc);
256 SLOG(LOG_DEBUG, TAG_VCC, "Auth state changed callback is called");
258 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Auth state changed callback is null");
264 static Eina_Bool __focus_changed_cb(void *data, int type, void *event)
266 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Focus changed");
269 if (ECORE_WL2_EVENT_FOCUS_IN == type) {
270 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground");
271 ret = vc_dbus_set_foreground(getpid(), true);
273 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
276 ret = vc_client_set_is_foreground(g_vc, true);
278 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret);
281 /* set authority valid */
282 vc_auth_state_e state = VC_AUTH_STATE_NONE;
283 if (0 != vc_client_get_auth_state(g_vc, &state)) {
284 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
286 if (VC_AUTH_STATE_INVALID == state) {
287 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
289 /* notify auth changed cb */
290 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
292 } else if (ECORE_WL2_EVENT_FOCUS_OUT == type) {
293 SLOG(LOG_DEBUG, TAG_VCW, "@@@ Set background");
294 ret = vc_dbus_set_foreground(getpid(), false);
296 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (false) : %d", ret);
299 ret = vc_client_set_is_foreground(g_vc, false);
301 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (false) : %d", ret);
304 /* set authority valid */
305 vc_auth_state_e state = VC_AUTH_STATE_NONE;
306 if (0 != vc_client_get_auth_state(g_vc, &state)) {
307 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
309 if (VC_AUTH_STATE_VALID == state) {
310 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_INVALID);
312 /* notify authority changed cb */
313 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
316 SLOG(LOG_DEBUG, TAG_VCC, "@@@ type(%d) is NOT valid", type);
319 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
321 return ECORE_CALLBACK_RENEW;
325 int vc_initialize(void)
327 if (0 != __vc_get_feature_enabled()) {
328 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
330 if (0 != __vc_check_privilege()) {
331 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
334 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Initialize");
337 if (true == vc_client_is_valid(g_vc)) {
338 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized"); //LCOV_EXCL_LINE
339 return VC_ERROR_NONE; //LCOV_EXCL_LINE
342 if (0 < vc_client_get_count()) {
343 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized"); //LCOV_EXCL_LINE
344 return VC_ERROR_NONE; //LCOV_EXCL_LINE
347 if (0 != vc_dbus_open_connection()) {
348 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to open connection"); //LCOV_EXCL_LINE
349 return VC_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
352 if (0 != vc_client_create(&g_vc)) {
353 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create client!!!!!"); //LCOV_EXCL_LINE
354 return VC_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
357 int ret = vc_config_mgr_initialize(g_vc->handle);
359 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to init config manager : %s",
360 __vc_get_error_code(__vc_convert_config_error_code(ret))); //LCOV_EXCL_LINE
361 vc_client_destroy(g_vc); //LCOV_EXCL_LINE
362 return __vc_convert_config_error_code(ret); //LCOV_EXCL_LINE
365 ret = vc_config_mgr_set_lang_cb(g_vc->handle, __vc_lang_changed_cb);
367 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set config changed : %d", ret); //LCOV_EXCL_LINE
368 vc_config_mgr_finalize(g_vc->handle); //LCOV_EXCL_LINE
369 vc_client_destroy(g_vc); //LCOV_EXCL_LINE
370 return __vc_convert_config_error_code(ret);
373 SLOG(LOG_DEBUG, TAG_VCC, "[Success] pid(%d)", g_vc->handle);
375 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
377 return VC_ERROR_NONE;
380 static void __vc_internal_unprepare(void)
382 /* return authority */
383 vc_auth_state_e state = VC_AUTH_STATE_NONE;
384 if (0 != vc_client_get_auth_state(g_vc, &state)) {
385 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
388 if (VC_AUTH_STATE_NONE != state) {
389 if (0 != vc_auth_disable()) {
390 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to auth disable"); //LCOV_EXCL_LINE
394 int ret = vc_dbus_request_finalize(g_vc->handle);
396 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
399 if (NULL != g_focus_in_handler) {
400 ecore_event_handler_del(g_focus_in_handler);
401 g_focus_in_handler = NULL;
403 if (NULL != g_focus_out_handler) {
404 ecore_event_handler_del(g_focus_out_handler);
405 g_focus_out_handler = NULL;
408 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
410 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
415 int vc_deinitialize(void)
417 int ret = VC_ERROR_NONE;
419 if (0 != __vc_get_feature_enabled()) {
420 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
422 if (0 != __vc_check_privilege()) {
423 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
426 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Deinitialize");
428 if (false == vc_client_is_valid(g_vc)) {
429 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NOT initialized");
430 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
431 return VC_ERROR_INVALID_STATE;
435 vc_client_get_client_state(g_vc, &state);
440 __vc_internal_unprepare();
441 /* no break. need to next step*/
442 case VC_STATE_INITIALIZED:
443 if (NULL != g_connect_timer) {
444 SLOG(LOG_DEBUG, TAG_VCC, "Connect Timer is deleted"); //LCOV_EXCL_LINE
445 ecore_timer_del(g_connect_timer);
446 g_connect_timer = NULL;
449 vc_config_mgr_unset_lang_cb(g_vc->handle);
450 vc_config_mgr_finalize(g_vc->handle);
452 /* Free client resources */
453 vc_client_destroy(g_vc);
460 SLOG(LOG_INFO, TAG_VCC, "Success: destroy");
462 if (true == g_backup) {
463 ret = vc_db_backup_command();
465 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to backup command, ret(%d)", ret); //LCOV_EXCL_LINE
469 ret = vc_db_finalize();
471 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB, ret(%d)", ret); //LCOV_EXCL_LINE
474 if (0 != vc_dbus_close_connection()) {
475 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection"); //LCOV_EXCL_LINE
478 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
480 return VC_ERROR_NONE;
483 static Eina_Bool __vc_connect_daemon(void *data)
485 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon");
487 /* request initialization */
490 int service_state = 0;
492 g_connect_timer = NULL;
495 if (true == vc_client_is_valid(g_vc)) {
496 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] g_vc is valid");
499 ret = vc_db_initialize();
501 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize DB : %d", ret); //LCOV_EXCL_LINE
505 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
507 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
509 ret = vc_dbus_request_initialize(g_vc->handle, &mgr_pid, &service_state, &g_daemon_pid);
511 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
512 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
514 vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND);
515 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
519 } else if (0 != ret) {
520 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
522 vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT);
523 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
525 ret = vc_db_finalize();
527 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB : %d", ret); //LCOV_EXCL_LINE
532 /* Success to connect */
535 /* Set service state */
536 vc_service_state_e previous_service_state;
537 vc_client_get_service_state(g_vc, &previous_service_state);
539 vc_client_set_service_state(g_vc, (vc_service_state_e)service_state);
541 vc_service_state_changed_cb service_changed_callback = NULL;
542 void* user_data = NULL;
543 vc_client_get_service_state_changed_cb(g_vc, &service_changed_callback, &user_data);
545 if (NULL != service_changed_callback) {
546 vc_client_use_callback(g_vc);
547 service_changed_callback(previous_service_state, service_state, user_data);
548 vc_client_not_use_callback(g_vc);
549 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called"); //LCOV_EXCL_LINE
551 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null"); //LCOV_EXCL_LINE
554 /* Register focus handler */
555 ecore_thread_main_loop_begin();
556 g_focus_in_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_IN, __focus_changed_cb, NULL);
557 g_focus_out_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_OUT, __focus_changed_cb, NULL);
558 ecore_thread_main_loop_end();
560 char appid[1024] = {'\0',};
561 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1);
563 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get aul_app_get_appid_bypid : %d", ret);
565 int status = aul_app_get_status(appid);
566 if (STATUS_FOCUS == status) {
567 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground"); //LCOV_EXCL_LINE
568 ret = vc_dbus_set_foreground(getpid(), true);
570 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret); //LCOV_EXCL_LINE
573 ret = vc_client_set_is_foreground(g_vc, true);
575 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret); //LCOV_EXCL_LINE
578 /* set authority valid */
579 vc_auth_state_e state = VC_AUTH_STATE_NONE;
580 if (0 != vc_client_get_auth_state(g_vc, &state)) {
581 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
583 if (VC_AUTH_STATE_INVALID == state) {
584 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
586 /* notify auth changed cb */
587 ecore_idler_add(__notify_auth_changed_cb, NULL);
591 vc_client_set_client_state(g_vc, VC_STATE_READY);
592 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
594 vc_client_set_mgr_pid(g_vc, mgr_pid);
596 SLOG(LOG_ERROR, TAG_VCC, "[Not ERROR] g_vc is not valid. It is destroyed."); //LCOV_EXCL_LINE
600 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
605 static void __start_prepare_thread(void *data, Ecore_Thread *thread)
607 SLOG(LOG_ERROR, TAG_VCC, "@@@ Start prepare thread");
608 int ret = -1, retry_count = 0;
612 if (retry_count == 20) { // 200 ms * 20 = 4 sec
613 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!"); //LCOV_EXCL_LINE
617 ret = vc_dbus_request_hello();
619 SLOG(LOG_DEBUG, TAG_VCC, "Success to request hello. retry count(%d)", retry_count);
629 if (retry_count == 10) {
630 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon !!"); //LCOV_EXCL_LINE
633 ret = __vc_connect_daemon(NULL);
643 static void __end_prepare_thread(void *data, Ecore_Thread *thread)
645 SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread");
650 if (0 != __vc_get_feature_enabled()) {
651 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
653 if (0 != __vc_check_privilege()) {
654 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
657 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
660 if (0 != vc_client_get_client_state(g_vc, &state)) {
661 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available"); //LCOV_EXCL_LINE
662 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
663 return VC_ERROR_INVALID_STATE;
667 if (state != VC_STATE_INITIALIZED) {
668 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'"); //LCOV_EXCL_LINE
669 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
670 return VC_ERROR_INVALID_STATE;
673 ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, NULL);
675 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
677 return VC_ERROR_NONE;
681 int vc_prepare_sync(void)
683 if (0 != __vc_get_feature_enabled()) {
684 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
686 if (0 != __vc_check_privilege()) {
687 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
690 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
693 if (0 != vc_client_get_client_state(g_vc, &state)) {
694 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
695 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
696 return VC_ERROR_INVALID_STATE;
700 if (state != VC_STATE_INITIALIZED) {
701 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'INITIALIZED'");
702 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
703 return VC_ERROR_INVALID_STATE;
707 while (EINA_TRUE == __vc_connect_daemon(NULL) && VC_CONNECTION_RETRY_COUNT > cnt) {
711 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
713 if (VC_CONNECTION_RETRY_COUNT == cnt) {
714 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon");
715 return VC_ERROR_OPERATION_FAILED;
718 return VC_ERROR_NONE;
722 int vc_unprepare(void)
724 if (0 != __vc_get_feature_enabled()) {
725 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
727 if (0 != __vc_check_privilege()) {
728 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
731 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare");
734 if (0 != vc_client_get_client_state(g_vc, &state)) {
735 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
736 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
737 return VC_ERROR_INVALID_STATE;
741 if (state != VC_STATE_READY) {
742 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
743 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
744 return VC_ERROR_INVALID_STATE;
747 __vc_internal_unprepare();
749 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
750 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
752 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
754 return VC_ERROR_NONE;
757 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
759 if (0 != __vc_get_feature_enabled()) {
760 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
762 if (0 != __vc_check_privilege()) {
763 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
766 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language");
768 if (NULL == callback) {
769 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
770 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
771 return VC_ERROR_INVALID_PARAMETER;
775 if (0 != vc_client_get_client_state(g_vc, &state)) {
776 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
777 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
778 return VC_ERROR_INVALID_STATE;
782 ret = vc_config_mgr_get_language_list(callback, user_data);
784 ret = vc_config_convert_error_code((vc_config_error_e)ret);
785 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
788 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
790 return VC_ERROR_NONE;
794 int vc_get_current_language(char** language)
796 if (0 != __vc_get_feature_enabled()) {
797 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
799 if (0 != __vc_check_privilege()) {
800 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
803 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language");
805 if (NULL == language) {
806 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
807 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
808 return VC_ERROR_INVALID_PARAMETER;
812 if (0 != vc_client_get_client_state(g_vc, &state)) {
813 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
814 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
815 return VC_ERROR_INVALID_STATE;
819 ret = vc_config_mgr_get_default_language(language);
821 ret = vc_config_convert_error_code((vc_config_error_e)ret);
822 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
825 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
830 int vc_get_state(vc_state_e* state)
832 if (0 != __vc_get_feature_enabled()) {
833 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
835 if (0 != __vc_check_privilege()) {
836 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
839 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State");
842 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
843 return VC_ERROR_INVALID_PARAMETER;
847 if (0 != vc_client_get_client_state(g_vc, &temp)) {
848 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not valid");
849 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
850 return VC_ERROR_INVALID_STATE;
857 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
858 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
859 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
860 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
864 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
866 return VC_ERROR_NONE;
869 int vc_get_service_state(vc_service_state_e* state)
871 if (0 != __vc_get_feature_enabled()) {
872 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
874 if (0 != __vc_check_privilege()) {
875 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
878 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State");
881 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
882 return VC_ERROR_INVALID_PARAMETER;
886 if (0 != vc_client_get_client_state(g_vc, &temp)) {
887 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
888 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
889 return VC_ERROR_INVALID_STATE;
892 if (VC_STATE_READY != temp) {
893 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
894 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
895 return VC_ERROR_INVALID_STATE;
898 /* get service state */
899 vc_service_state_e service_state;
900 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
901 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state"); //LCOV_EXCL_LINE
902 return VC_ERROR_OPERATION_FAILED;
905 *state = service_state;
909 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break;
910 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
911 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
912 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
913 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
917 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
919 return VC_ERROR_NONE;
922 int vc_get_system_command_list(vc_cmd_list_h* vc_sys_cmd_list)
924 if (0 != __vc_get_feature_enabled()) {
925 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
927 if (0 != __vc_check_privilege()) {
928 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
931 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list");
933 if (NULL == vc_sys_cmd_list) {
934 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
935 return VC_ERROR_INVALID_PARAMETER;
937 *vc_sys_cmd_list = NULL;
940 if (0 != vc_client_get_client_state(g_vc, &state)) {
941 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
942 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
943 return VC_ERROR_INVALID_STATE;
947 if (state != VC_STATE_READY) {
948 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
949 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
950 return VC_ERROR_INVALID_STATE;
953 /* Check service state */
954 vc_service_state_e service_state = -1;
955 vc_client_get_service_state(g_vc, &service_state);
956 if (service_state != VC_SERVICE_STATE_READY) {
957 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'"); //LCOV_EXCL_LINE
958 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
959 return VC_ERROR_INVALID_STATE;
962 bool is_sys_cmd_valid = false;
965 bool is_prepared = false;
967 ret = vc_dbus_request_is_system_command_valid(g_vc->handle, &is_sys_cmd_valid);
970 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
971 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
972 if (0 == vc_prepare_sync()) {
974 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
976 } else if (VC_ERROR_TIMED_OUT != ret) {
977 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to ask system command is : %s", __vc_get_error_code(ret));
980 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to ask system command is : %s", __vc_get_error_code(ret));
983 if (VC_RETRY_COUNT == count) {
984 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
993 ret = vc_client_get_mgr_pid(g_vc, &mgr_pid);
995 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get the manager pid"); //LCOV_EXCL_LINE
996 return VC_ERROR_OPERATION_FAILED;
999 if (true == is_sys_cmd_valid) {
1000 vc_cmd_list_s* list = NULL;
1001 ret = vc_cmd_list_create((vc_cmd_list_h*)&list);
1003 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
1007 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, &(list->list));
1009 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
1010 vc_cmd_list_destroy((vc_cmd_list_h)list, true);
1014 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &(list->list));
1016 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
1017 vc_cmd_list_destroy((vc_cmd_list_h)list, true);
1021 *vc_sys_cmd_list = (vc_cmd_list_h)list;
1023 SLOG(LOG_WARN, TAG_VCC, "[WARNING] No system commands"); //LCOV_EXCL_LINE
1024 return VC_ERROR_NONE;
1027 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1034 * @brief Checks whether the command format is supported.
1035 * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
1037 * @param[in] format The command format
1038 * @param[out] support The result status @c true = supported, @c false = not supported
1040 * @return 0 on success, otherwise a negative error value
1041 * @retval #VC_ERROR_NONE Successful
1042 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1043 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
1044 * @retval #VC_ERROR_INVALID_STATE Invalid state
1046 * @pre The state should be #VC_STATE_READY.
1048 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
1050 if (0 != __vc_get_feature_enabled()) {
1051 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1053 if (0 != __vc_check_privilege()) {
1054 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1057 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported");
1060 if (0 != vc_client_get_client_state(g_vc, &state)) {
1061 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1062 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1063 return VC_ERROR_INVALID_STATE;
1067 bool non_fixed_support = false;
1068 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
1069 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
1073 case VC_CMD_FORMAT_FIXED: *support = true; break;
1074 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
1075 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
1076 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
1077 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
1078 default: *support = false; break;
1081 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
1083 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1085 return VC_ERROR_NONE;
1089 static int __vc_get_invocation_name(char** invocation_name)
1091 int ret = vc_client_get_invocation_name(g_vc, invocation_name);
1093 SLOG(LOG_WARN, TAG_VCC, "Fail to get invocation name"); //LCOV_EXCL_LINE
1094 return ret; //LCOV_EXCL_LINE
1097 if (NULL == *invocation_name) {
1098 char* temp_label = NULL;
1102 ret = app_manager_get_app_id(getpid(), &appid);
1103 if (0 != ret || NULL == appid) {
1105 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get appid, ret(%d)", ret); //LCOV_EXCL_LINE
1107 return VC_ERROR_OPERATION_FAILED;
1111 ret = vc_get_current_language(&lang);
1112 if (0 != ret || NULL == lang) {
1113 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current language, ret(%d)", ret); //LCOV_EXCL_LINE
1116 return VC_ERROR_OPERATION_FAILED;
1119 ret = app_info_get_localed_label(appid, lang, &temp_label);
1120 if (0 != ret || NULL == temp_label) {
1122 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get localed label, ret(%d) appid(%s) lang(%s)", ret, appid, lang); //LCOV_EXCL_LINE
1126 return VC_ERROR_OPERATION_FAILED;
1130 *invocation_name = strdup(temp_label);
1131 if (NULL == *invocation_name) {
1132 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE
1136 return VC_ERROR_OUT_OF_MEMORY;
1144 SLOG(LOG_DEBUG, TAG_VCC, "Get invocation name(%s)", *invocation_name);
1145 return VC_ERROR_NONE;
1148 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
1150 if (0 != __vc_get_feature_enabled()) {
1151 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1153 if (0 != __vc_check_privilege()) {
1154 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1157 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list");
1159 if (NULL == vc_cmd_list) {
1160 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
1161 return VC_ERROR_INVALID_PARAMETER;
1165 if (0 != vc_client_get_client_state(g_vc, &state)) {
1166 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1167 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1168 return VC_ERROR_INVALID_STATE;
1172 if (state != VC_STATE_READY) {
1173 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
1174 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1175 return VC_ERROR_INVALID_STATE;
1179 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1180 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type); //LCOV_EXCL_LINE
1181 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1182 return VC_ERROR_INVALID_PARAMETER;
1185 vc_cmd_list_s* list = NULL;
1186 list = (vc_cmd_list_s*)vc_cmd_list;
1188 if (NULL == list->list) {
1189 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command list"); //LCOV_EXCL_LINE
1190 return VC_ERROR_INVALID_PARAMETER;
1194 char* invocation_name = NULL;
1195 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1196 ret = __vc_get_invocation_name(&invocation_name);
1197 if (0 != ret || NULL == invocation_name) {
1198 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret); //LCOV_EXCL_LINE
1203 ret = vc_cmd_parser_delete_file(getpid(), type);
1205 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1207 ret = vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list, invocation_name);
1209 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
1212 bool is_prepared = false;
1214 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1217 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1218 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1219 if (0 == vc_prepare_sync()) {
1221 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1223 } else if (VC_ERROR_TIMED_OUT != ret) {
1224 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1227 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1230 if (VC_RETRY_COUNT == count) {
1231 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1240 FREE(invocation_name);
1242 if (VC_COMMAND_TYPE_BACKGROUND == type)
1245 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1250 int vc_unset_command_list(int type)
1252 if (0 != __vc_get_feature_enabled()) {
1253 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1255 if (0 != __vc_check_privilege()) {
1256 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1259 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list");
1262 if (0 != vc_client_get_client_state(g_vc, &state)) {
1263 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1264 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1265 return VC_ERROR_INVALID_STATE;
1269 if (state != VC_STATE_READY) {
1270 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1271 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1272 return VC_ERROR_INVALID_STATE;
1277 bool is_prepared = false;
1279 ret = vc_dbus_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
1282 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1283 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1284 if (0 == vc_prepare_sync()) {
1286 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1288 } else if (VC_ERROR_TIMED_OUT != ret) {
1289 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
1292 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
1295 if (VC_RETRY_COUNT == count) {
1296 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1304 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
1306 ret = vc_config_convert_error_code((vc_config_error_e)ret);
1307 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret)); //LCOV_EXCL_LINE
1310 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1316 int vc_set_command_list_from_file(const char* file_path, int type)
1318 if (0 != __vc_get_feature_enabled()) {
1319 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1321 if (0 != __vc_check_privilege()) {
1322 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1325 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file");
1328 if (0 != vc_client_get_client_state(g_vc, &state)) {
1329 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1330 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1331 return VC_ERROR_INVALID_STATE;
1335 if (state != VC_STATE_READY) {
1336 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1337 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1338 return VC_ERROR_INVALID_STATE;
1342 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1343 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1344 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1345 return VC_ERROR_INVALID_PARAMETER;
1349 char* invocation_name = NULL;
1350 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1351 ret = __vc_get_invocation_name(&invocation_name);
1352 if (0 != ret || NULL == invocation_name) {
1353 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1358 ret = vc_cmd_parser_delete_file(getpid(), type);
1360 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1362 ret = vc_json_set_commands_from_file(file_path, (vc_cmd_type_e)type, invocation_name);
1364 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set commands from file : %s", __vc_get_error_code(ret));
1367 bool is_prepared = false;
1369 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1371 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1372 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1373 if (0 == vc_prepare_sync()) {
1375 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1377 } else if (VC_ERROR_TIMED_OUT != ret) {
1378 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1381 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1384 if (VC_RETRY_COUNT == count) {
1385 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1393 FREE(invocation_name);
1395 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1401 int vc_get_exclusive_command_option(bool* value)
1403 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get exclusive command");
1406 if (0 != vc_client_get_client_state(g_vc, &state)) {
1407 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1408 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1409 return VC_ERROR_INVALID_STATE;
1413 if (state != VC_STATE_READY) {
1414 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1415 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1416 return VC_ERROR_INVALID_STATE;
1419 int ret = vc_client_get_exclusive_cmd(g_vc, value);
1421 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1422 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1426 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1431 int vc_set_exclusive_command_option(bool value)
1433 if (0 != __vc_get_feature_enabled()) {
1434 return VC_ERROR_NOT_SUPPORTED;
1436 if (0 != __vc_check_privilege()) {
1437 return VC_ERROR_PERMISSION_DENIED;
1440 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set exclusive command");
1443 if (0 != vc_client_get_client_state(g_vc, &state)) {
1444 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1445 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1446 return VC_ERROR_INVALID_STATE;
1450 if (state != VC_STATE_READY) {
1451 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1452 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1453 return VC_ERROR_INVALID_STATE;
1456 int ret = vc_client_set_exclusive_cmd(g_vc, value);
1458 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1459 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1465 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
1467 if (VC_ERROR_TIMED_OUT != ret) {
1468 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
1471 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
1474 if (VC_RETRY_COUNT == count) {
1475 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1482 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1489 int vc_request_start(bool stop_by_silence)
1491 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
1494 if (0 != vc_client_get_client_state(g_vc, &state)) {
1495 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1496 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1497 return VC_ERROR_INVALID_STATE;
1501 if (state != VC_STATE_READY) {
1502 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1503 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1504 return VC_ERROR_INVALID_STATE;
1507 /* Check service state */
1508 vc_service_state_e service_state = -1;
1509 vc_client_get_service_state(g_vc, &service_state);
1510 if (service_state != VC_SERVICE_STATE_READY) {
1511 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1512 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1513 return VC_ERROR_INVALID_STATE;
1523 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1525 if (VC_ERROR_TIMED_OUT != ret) {
1526 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1529 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1532 if (VC_RETRY_COUNT == count) {
1533 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1538 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1542 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1547 int vc_request_stop(void)
1549 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
1552 if (0 != vc_client_get_client_state(g_vc, &state)) {
1553 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1554 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1555 return VC_ERROR_INVALID_STATE;
1559 if (state != VC_STATE_READY) {
1560 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1561 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1562 return VC_ERROR_INVALID_STATE;
1565 /* Check service state */
1566 vc_service_state_e service_state = -1;
1567 vc_client_get_service_state(g_vc, &service_state);
1568 if (service_state != VC_SERVICE_STATE_RECORDING) {
1569 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1570 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1571 return VC_ERROR_INVALID_STATE;
1578 ret = vc_dbus_request_stop(g_vc->handle);
1580 if (VC_ERROR_TIMED_OUT != ret) {
1581 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1584 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1587 if (VC_RETRY_COUNT == count) {
1588 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1593 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1597 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1602 int vc_request_cancel(void)
1604 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel Interrupt");
1607 if (0 != vc_client_get_client_state(g_vc, &state)) {
1608 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1609 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1610 return VC_ERROR_INVALID_STATE;
1614 if (state != VC_STATE_READY) {
1615 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1616 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1617 return VC_ERROR_INVALID_STATE;
1620 /* Check service state */
1621 vc_service_state_e service_state = -1;
1622 vc_client_get_service_state(g_vc, &service_state);
1623 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1624 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1625 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1626 return VC_ERROR_INVALID_STATE;
1632 ret = vc_dbus_request_cancel(g_vc->handle);
1634 if (VC_ERROR_TIMED_OUT != ret) {
1635 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1638 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel request : %s", __vc_get_error_code(ret));
1641 if (VC_RETRY_COUNT == count) {
1642 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1647 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Cancel interrupt");
1651 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1658 static void __vc_notify_error(void *data)
1660 vc_h vc = (vc_h)data;
1662 vc_error_cb callback = NULL;
1666 vc_client_get_error_cb(vc, &callback, &user_data);
1667 vc_client_get_error(vc, &reason);
1669 if (NULL != callback) {
1670 vc_client_use_callback(vc);
1671 callback(reason, user_data);
1672 vc_client_not_use_callback(vc);
1673 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1675 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1679 int __vc_cb_error(int reason, int daemon_pid, char* msg)
1682 if (0 != vc_client_get_client_state(g_vc, &state)) {
1683 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid client");
1688 if (state != VC_STATE_READY) {
1689 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] State is not READY");
1690 if (VC_ERROR_SERVICE_RESET != reason) {
1691 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] not connected client yet");
1697 if (VC_ERROR_SERVICE_RESET == reason) {
1698 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset");
1700 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1701 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
1703 if (0 != vc_prepare()) {
1704 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare");
1708 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1710 vc_client_set_error(g_vc, reason);
1711 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
1716 int __vc_cb_error_to_app(int pid, int reason, const char* msg)
1718 SLOG(LOG_INFO, TAG_VCC, "[INFO] send error to app(%d)", pid);
1721 if (0 != vc_client_get_handle(pid, &vc)) {
1722 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get vc handle");
1723 return VC_ERROR_INVALID_PARAMETER;
1726 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1728 vc_client_set_error(vc, reason);
1729 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)vc);
1731 return VC_ERROR_NONE;
1734 static void __vc_notify_state_changed(void *data)
1736 vc_h vc = (vc_h)data;
1738 vc_state_changed_cb changed_callback = NULL;
1741 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1743 vc_state_e current_state;
1744 vc_state_e before_state;
1746 vc_client_get_before_state(vc, ¤t_state, &before_state);
1748 if (NULL != changed_callback) {
1749 vc_client_use_callback(vc);
1750 changed_callback(before_state, current_state, user_data);
1751 vc_client_not_use_callback(vc);
1752 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1754 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1758 static Eina_Bool __vc_notify_result(void *data)
1762 vc_cmd_list_h vc_cmd_list = NULL;
1764 vc_result_cb callback = NULL;
1765 void* user_data = NULL;
1767 vc_client_get_result_cb(g_vc, &callback, &user_data);
1769 if (NULL == callback) {
1770 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1774 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1775 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1779 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1781 SECURE_SLOG(LOG_INFO, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1783 vc_cmd_print_list(vc_cmd_list);
1785 vc_client_use_callback(g_vc);
1786 callback(event, vc_cmd_list, temp_text, user_data);
1787 vc_client_not_use_callback(g_vc);
1789 SLOG(LOG_INFO, TAG_VCC, "Client result callback called");
1791 vc_cmd_list_destroy(vc_cmd_list, true);
1794 /* Release result */
1800 void __vc_cb_result(void)
1802 ecore_timer_add(0, __vc_notify_result, NULL);
1808 int vc_get_result(vc_result_cb callback, void* user_data)
1810 if (0 != __vc_get_feature_enabled()) {
1811 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1813 if (0 != __vc_check_privilege()) {
1814 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1817 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result");
1820 if (0 != vc_client_get_client_state(g_vc, &state)) {
1821 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1822 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1823 return VC_ERROR_INVALID_STATE;
1827 if (state != VC_STATE_READY) {
1828 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
1829 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
1830 return VC_ERROR_INVALID_STATE;
1833 if (NULL == callback) {
1834 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL"); //LCOV_EXCL_LINE
1835 return VC_ERROR_INVALID_PARAMETER;
1838 char* temp_text = NULL;
1840 vc_cmd_list_h vc_cmd_list = NULL;
1842 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1843 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
1844 return VC_ERROR_INVALID_PARAMETER;
1847 int ret = vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1848 if (0 != ret || NULL == temp_text) {
1849 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get result, ret(%d) temp_text(%s)", ret, temp_text); //LCOV_EXCL_LINE
1853 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event); //LCOV_EXCL_LINE
1855 vc_cmd_print_list(vc_cmd_list);
1857 vc_client_use_callback(g_vc);
1858 callback(event, vc_cmd_list, temp_text, user_data);
1859 vc_client_not_use_callback(g_vc);
1861 vc_cmd_list_destroy(vc_cmd_list, true);
1864 /* Release result */
1867 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1869 return VC_ERROR_NONE;
1872 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1874 if (0 != __vc_get_feature_enabled()) {
1875 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1877 if (0 != __vc_check_privilege()) {
1878 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1881 if (NULL == callback)
1882 return VC_ERROR_INVALID_PARAMETER;
1885 if (0 != vc_client_get_client_state(g_vc, &state)) {
1886 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1887 return VC_ERROR_INVALID_STATE;
1891 if (state != VC_STATE_INITIALIZED) {
1892 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1893 return VC_ERROR_INVALID_STATE;
1896 vc_client_set_result_cb(g_vc, callback, user_data);
1901 int vc_unset_result_cb(void)
1903 if (0 != __vc_get_feature_enabled()) {
1904 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1906 if (0 != __vc_check_privilege()) {
1907 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1911 if (0 != vc_client_get_client_state(g_vc, &state)) {
1912 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1913 return VC_ERROR_INVALID_STATE;
1917 if (state != VC_STATE_INITIALIZED) {
1918 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1919 return VC_ERROR_INVALID_STATE;
1922 vc_client_set_result_cb(g_vc, NULL, NULL);
1928 int __vc_cb_service_state(int state)
1930 vc_service_state_e current_state = (vc_service_state_e)state;
1931 vc_service_state_e before_state;
1932 vc_client_get_service_state(g_vc, &before_state);
1934 if (current_state == before_state) {
1938 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
1939 before_state, current_state);
1941 /* Save service state */
1942 vc_client_set_service_state(g_vc, current_state);
1944 vc_service_state_changed_cb callback = NULL;
1945 void* service_user_data;
1946 vc_client_get_service_state_changed_cb(g_vc, &callback, &service_user_data);
1948 if (NULL != callback) {
1949 vc_client_use_callback(g_vc);
1950 callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
1951 vc_client_not_use_callback(g_vc);
1952 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
1954 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null");
1960 int __vc_cb_manager_pid(int manager_pid)
1962 SLOG(LOG_DEBUG, TAG_VCC, "Manager pid is changed : %d", manager_pid); //LCOV_EXCL_LINE
1964 /* Save service state */
1965 vc_client_set_mgr_pid(g_vc, manager_pid);
1971 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1973 if (0 != __vc_get_feature_enabled()) {
1974 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1976 if (0 != __vc_check_privilege()) {
1977 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1980 if (NULL == callback)
1981 return VC_ERROR_INVALID_PARAMETER;
1984 if (0 != vc_client_get_client_state(g_vc, &state)) {
1985 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1986 return VC_ERROR_INVALID_STATE;
1990 if (state != VC_STATE_INITIALIZED) {
1991 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1992 return VC_ERROR_INVALID_STATE;
1995 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
2000 int vc_unset_service_state_changed_cb(void)
2002 if (0 != __vc_get_feature_enabled()) {
2003 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2005 if (0 != __vc_check_privilege()) {
2006 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2010 if (0 != vc_client_get_client_state(g_vc, &state)) {
2011 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
2012 return VC_ERROR_INVALID_STATE;
2016 if (state != VC_STATE_INITIALIZED) {
2017 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2018 return VC_ERROR_INVALID_STATE;
2021 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
2026 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2028 if (0 != __vc_get_feature_enabled()) {
2029 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2031 if (0 != __vc_check_privilege()) {
2032 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2035 if (callback == NULL)
2036 return VC_ERROR_INVALID_PARAMETER;
2039 if (0 != vc_client_get_client_state(g_vc, &state)) {
2040 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
2041 return VC_ERROR_INVALID_STATE;
2045 if (state != VC_STATE_INITIALIZED) {
2046 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2047 return VC_ERROR_INVALID_STATE;
2050 vc_client_set_state_changed_cb(g_vc, callback, user_data);
2055 int vc_unset_state_changed_cb(void)
2057 if (0 != __vc_get_feature_enabled()) {
2058 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2060 if (0 != __vc_check_privilege()) {
2061 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2065 if (0 != vc_client_get_client_state(g_vc, &state)) {
2066 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
2067 return VC_ERROR_INVALID_STATE;
2071 if (state != VC_STATE_INITIALIZED) {
2072 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2073 return VC_ERROR_INVALID_STATE;
2076 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
2081 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2083 if (0 != __vc_get_feature_enabled()) {
2084 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2086 if (0 != __vc_check_privilege()) {
2087 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2090 if (NULL == callback)
2091 return VC_ERROR_INVALID_PARAMETER;
2094 if (0 != vc_client_get_client_state(g_vc, &state)) {
2095 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
2096 return VC_ERROR_INVALID_STATE;
2100 if (state != VC_STATE_INITIALIZED) {
2101 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : Current state is not 'Initialized'");
2102 return VC_ERROR_INVALID_STATE;
2105 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
2110 int vc_unset_current_language_changed_cb(void)
2112 if (0 != __vc_get_feature_enabled()) {
2113 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2115 if (0 != __vc_check_privilege()) {
2116 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2120 if (0 != vc_client_get_client_state(g_vc, &state)) {
2121 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
2122 return VC_ERROR_INVALID_STATE;
2126 if (state != VC_STATE_INITIALIZED) {
2127 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2128 return VC_ERROR_INVALID_STATE;
2131 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
2136 int vc_set_error_cb(vc_error_cb callback, void* user_data)
2138 if (0 != __vc_get_feature_enabled()) {
2139 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2141 if (0 != __vc_check_privilege()) {
2142 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2145 if (NULL == callback)
2146 return VC_ERROR_INVALID_PARAMETER;
2149 if (0 != vc_client_get_client_state(g_vc, &state)) {
2150 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
2151 return VC_ERROR_INVALID_STATE;
2155 if (state != VC_STATE_INITIALIZED) {
2156 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : Current state is not 'Initialized'");
2157 return VC_ERROR_INVALID_STATE;
2160 vc_client_set_error_cb(g_vc, callback, user_data);
2165 int vc_unset_error_cb(void)
2167 if (0 != __vc_get_feature_enabled()) {
2168 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2170 if (0 != __vc_check_privilege()) {
2171 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2175 if (0 != vc_client_get_client_state(g_vc, &state)) {
2176 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
2177 return VC_ERROR_INVALID_STATE;
2181 if (state != VC_STATE_INITIALIZED) {
2182 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2183 return VC_ERROR_INVALID_STATE;
2186 vc_client_set_error_cb(g_vc, NULL, NULL);
2191 int vc_set_invocation_name(const char* name)
2193 if (0 != __vc_get_feature_enabled()) {
2194 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2196 if (0 != __vc_check_privilege()) {
2197 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2201 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set invocation name");
2203 int ret = vc_client_get_client_state(g_vc, &state);
2205 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2206 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2211 if (state != VC_STATE_READY) {
2212 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
2213 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2214 return VC_ERROR_INVALID_STATE;
2217 ret = vc_client_set_invocation_name(g_vc, name);
2219 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set invocation name");
2225 int vc_set_server_dialog(const char* app_id, const char* credential)
2230 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog, pid(%d), app_id(%s)", getpid(), app_id);
2231 if (0 != __vc_get_feature_enabled()) {
2232 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2234 if (0 != __vc_check_privilege()) {
2235 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2238 if (NULL == credential) {
2239 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Credential is NULL");
2240 return VC_ERROR_INVALID_PARAMETER;
2243 if (0 != vc_client_get_client_state(g_vc, &state)) {
2244 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2245 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2246 return VC_ERROR_INVALID_STATE;
2250 if (state != VC_STATE_READY) {
2251 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2252 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2253 return VC_ERROR_INVALID_STATE;
2256 /* Check service state */
2257 vc_service_state_e service_state = -1;
2258 vc_client_get_service_state(g_vc, &service_state);
2259 if (service_state != VC_SERVICE_STATE_READY) {
2260 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2261 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2262 return VC_ERROR_INVALID_STATE;
2265 char* tmp_appid = NULL;
2266 if (NULL == app_id) {
2267 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2268 if (0 != ret || NULL == tmp_appid) {
2269 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2271 return VC_ERROR_INVALID_PARAMETER;
2274 tmp_appid = strdup(app_id);
2278 SLOG(LOG_DEBUG, TAG_VCC, "Set server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2281 bool is_prepared = false;
2283 ret = vc_dbus_set_server_dialog(pid, tmp_appid, credential);
2285 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2286 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2287 if (0 == vc_prepare_sync()) {
2289 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2291 } else if (VC_ERROR_TIMED_OUT != ret) {
2292 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set server dialog to vc service : %s", __vc_get_error_code(ret));
2295 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set server dialog : %s", __vc_get_error_code(ret));
2298 if (VC_RETRY_COUNT == count) {
2299 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2308 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2313 int vc_unset_server_dialog(const char* app_id)
2318 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog, pid(%d), app_id(%s)", getpid(), app_id);
2319 if (0 != __vc_get_feature_enabled()) {
2320 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2322 if (0 != __vc_check_privilege()) {
2323 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2326 if (0 != vc_client_get_client_state(g_vc, &state)) {
2327 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2328 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2329 return VC_ERROR_INVALID_STATE;
2333 if (state != VC_STATE_READY) {
2334 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2335 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2336 return VC_ERROR_INVALID_STATE;
2339 /* Check service state */
2340 vc_service_state_e service_state = -1;
2341 vc_client_get_service_state(g_vc, &service_state);
2342 if (service_state != VC_SERVICE_STATE_READY) {
2343 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2344 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2345 return VC_ERROR_INVALID_STATE;
2348 char* tmp_appid = NULL;
2349 if (NULL == app_id) {
2350 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2351 if (0 != ret || NULL == tmp_appid) {
2352 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2354 return VC_ERROR_INVALID_PARAMETER;
2357 tmp_appid = strdup(app_id);
2361 SLOG(LOG_DEBUG, TAG_VCC, "Unset server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2364 bool is_prepared = false;
2365 char* credential = strdup("#NULL");
2367 ret = vc_dbus_set_server_dialog(pid, tmp_appid, credential);
2369 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2370 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2371 if (0 == vc_prepare_sync()) {
2373 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2375 } else if (VC_ERROR_TIMED_OUT != ret) {
2376 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset server dialog to vc service : %s", __vc_get_error_code(ret));
2379 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset server dialog : %s", __vc_get_error_code(ret));
2382 if (VC_RETRY_COUNT == count) {
2383 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2393 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2399 int vc_request_dialog(const char* disp_text, const char* utt_text, bool auto_start)
2403 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog");
2404 if (0 != __vc_get_feature_enabled()) {
2405 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2407 if (0 != __vc_check_privilege()) {
2408 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2411 if (0 != vc_client_get_client_state(g_vc, &state)) {
2412 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2413 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2414 return VC_ERROR_INVALID_STATE;
2418 if (state != VC_STATE_READY) {
2419 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
2420 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
2421 return VC_ERROR_INVALID_STATE;
2424 /* Check service state */
2425 vc_service_state_e service_state = -1;
2426 vc_client_get_service_state(g_vc, &service_state);
2427 if (service_state != VC_SERVICE_STATE_READY) {
2428 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'"); //LCOV_EXCL_LINE
2429 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
2430 return VC_ERROR_INVALID_STATE;
2433 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);
2434 int ret = vc_dbus_request_dialog(getpid(), disp_text, utt_text, auto_start);
2436 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request dialog, ret(%d)", ret);
2437 return VC_ERROR_OPERATION_FAILED;
2440 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2442 return VC_ERROR_NONE;
2447 int vc_auth_enable(void)
2451 if (0 != vc_client_get_client_state(g_vc, &state)) {
2452 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2453 return VC_ERROR_INVALID_STATE;
2456 if (VC_STATE_READY != state) {
2457 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2458 return VC_ERROR_INVALID_STATE;
2461 /* check already authority */
2462 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2463 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2464 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2465 return VC_ERROR_INVALID_STATE;
2468 if (VC_AUTH_STATE_NONE != auth_state) {
2469 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already authority enabled");
2470 return VC_ERROR_INVALID_STATE;
2473 /* request authority */
2475 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2476 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2477 return VC_ERROR_OPERATION_FAILED;
2480 if (0 != vc_dbus_request_auth_enable(g_vc->handle, mgr_pid)) {
2481 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
2482 return VC_ERROR_OPERATION_FAILED;
2485 /* set authority into handle */
2486 bool is_foreground = false;
2487 if (0 != vc_client_get_is_foreground(g_vc, &is_foreground)) {
2488 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get is_foreground");
2489 return VC_ERROR_OPERATION_FAILED;
2492 if (is_foreground) {
2493 auth_state = VC_AUTH_STATE_VALID;
2495 auth_state = VC_AUTH_STATE_INVALID;
2498 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
2499 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2500 return VC_ERROR_OPERATION_FAILED;
2503 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2505 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
2507 return VC_ERROR_NONE;
2510 int vc_auth_disable(void)
2514 if (0 != vc_client_get_client_state(g_vc, &state)) {
2515 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2516 return VC_ERROR_INVALID_STATE;
2519 if (VC_STATE_READY != state) {
2520 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2521 return VC_ERROR_INVALID_STATE;
2524 /* check authority */
2525 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2526 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2527 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2528 return VC_ERROR_INVALID_STATE;
2531 if (VC_AUTH_STATE_NONE == auth_state) {
2532 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] No authority");
2533 return VC_ERROR_INVALID_STATE;
2536 if (0 != vc_auth_unset_state_changed_cb()) {
2537 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
2540 /* request return authority by dbus */
2542 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2543 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2544 return VC_ERROR_OPERATION_FAILED;
2547 if (0 != vc_dbus_request_auth_disable(g_vc->handle, mgr_pid)) {
2548 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disable");
2549 return VC_ERROR_OPERATION_FAILED;
2552 /* unset authority from handle */
2553 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
2554 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2555 return VC_ERROR_OPERATION_FAILED;
2558 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2560 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
2562 return VC_ERROR_NONE;
2565 int vc_auth_get_state(vc_auth_state_e* state)
2568 vc_state_e vc_state;
2569 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
2570 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2571 return VC_ERROR_INVALID_STATE;
2574 if (VC_STATE_READY != vc_state) {
2575 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2576 return VC_ERROR_INVALID_STATE;
2580 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
2581 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
2582 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2583 return VC_ERROR_INVALID_STATE;
2588 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
2590 return VC_ERROR_NONE;
2593 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
2595 /* check parameter */
2596 if (NULL == callback) {
2597 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
2598 return VC_ERROR_INVALID_PARAMETER;
2602 vc_auth_state_e auth_state;
2603 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2604 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2605 return VC_ERROR_INVALID_STATE;
2608 if (VC_AUTH_STATE_NONE == auth_state) {
2609 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auth is not enabled");
2610 return VC_ERROR_INVALID_STATE;
2613 /* set cb into handle */
2614 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
2615 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
2616 return VC_ERROR_OPERATION_FAILED;
2619 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
2621 return VC_ERROR_NONE;
2624 int vc_auth_unset_state_changed_cb(void)
2627 vc_auth_state_e auth_state;
2628 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2629 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2630 return VC_ERROR_INVALID_STATE;
2633 if (VC_AUTH_STATE_NONE == auth_state) {
2634 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auto is not enabled");
2635 return VC_ERROR_INVALID_STATE;
2638 /* unset cb from handle */
2639 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
2640 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
2641 return VC_ERROR_OPERATION_FAILED;
2644 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
2646 return VC_ERROR_NONE;
2649 int vc_auth_start(void)
2651 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
2654 if (0 != vc_client_get_client_state(g_vc, &state)) {
2655 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2656 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2657 return VC_ERROR_INVALID_STATE;
2661 if (state != VC_STATE_READY) {
2662 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
2663 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2664 return VC_ERROR_INVALID_STATE;
2667 /* Check service state */
2668 vc_service_state_e service_state = -1;
2669 vc_client_get_service_state(g_vc, &service_state);
2670 if (service_state != VC_SERVICE_STATE_READY) {
2671 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
2672 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2673 return VC_ERROR_INVALID_STATE;
2676 /* Check authority */
2677 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2678 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2679 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2680 return VC_ERROR_OPERATION_FAILED;
2683 if (VC_AUTH_STATE_VALID != auth_state) {
2684 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2685 return VC_ERROR_OPERATION_FAILED;
2690 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2691 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2692 return VC_ERROR_OPERATION_FAILED;
2697 bool is_prepared = false;
2700 ret = vc_dbus_request_auth_start(g_vc->handle, mgr_pid);
2702 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2703 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2704 if (0 == vc_prepare_sync()) {
2706 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2708 } else if (VC_ERROR_TIMED_OUT != ret) {
2709 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
2712 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
2715 if (VC_RETRY_COUNT == count) {
2716 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2721 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
2725 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2730 int vc_auth_stop(void)
2732 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
2735 if (0 != vc_client_get_client_state(g_vc, &state)) {
2736 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2737 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2738 return VC_ERROR_INVALID_STATE;
2742 if (state != VC_STATE_READY) {
2743 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
2744 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2745 return VC_ERROR_INVALID_STATE;
2748 /* Check service state */
2749 vc_service_state_e service_state = -1;
2750 vc_client_get_service_state(g_vc, &service_state);
2751 if (service_state != VC_SERVICE_STATE_RECORDING) {
2752 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
2753 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2754 return VC_ERROR_INVALID_STATE;
2757 /* Check authority */
2758 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2759 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2760 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2761 return VC_ERROR_OPERATION_FAILED;
2764 if (VC_AUTH_STATE_VALID != auth_state) {
2765 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2766 return VC_ERROR_OPERATION_FAILED;
2771 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2772 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2773 return VC_ERROR_OPERATION_FAILED;
2778 bool is_prepared = false;
2781 ret = vc_dbus_request_auth_stop(g_vc->handle, mgr_pid);
2783 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2784 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2785 if (0 == vc_prepare_sync()) {
2787 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2789 } else if (VC_ERROR_TIMED_OUT != ret) {
2790 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
2793 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
2796 if (VC_RETRY_COUNT == count) {
2797 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2802 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
2806 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2811 int vc_auth_cancel(void)
2813 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel");
2816 if (0 != vc_client_get_client_state(g_vc, &state)) {
2817 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2818 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2819 return VC_ERROR_INVALID_STATE;
2823 if (state != VC_STATE_READY) {
2824 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
2825 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2826 return VC_ERROR_INVALID_STATE;
2829 /* Check service state */
2830 vc_service_state_e service_state = -1;
2831 vc_client_get_service_state(g_vc, &service_state);
2832 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
2833 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
2834 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2835 return VC_ERROR_INVALID_STATE;
2838 /* Check authority */
2839 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2840 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2841 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2842 return VC_ERROR_OPERATION_FAILED;
2845 if (VC_AUTH_STATE_VALID != auth_state) {
2846 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2847 return VC_ERROR_OPERATION_FAILED;
2852 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2853 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2854 return VC_ERROR_OPERATION_FAILED;
2859 bool is_prepared = false;
2861 ret = vc_dbus_request_auth_cancel(g_vc->handle, mgr_pid);
2863 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2864 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2865 if (0 == vc_prepare_sync()) {
2867 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2869 } else if (VC_ERROR_TIMED_OUT != ret) {
2870 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
2873 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
2876 if (VC_RETRY_COUNT == count) {
2877 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2882 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
2886 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2891 static void __start_tts_streaming_thread(void* data, Ecore_Thread* thread)
2893 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Start tts streaming thread");
2895 vc_tts_streaming_cb callback = NULL;
2896 void* user_data = NULL;
2898 vc_client_get_tts_streaming_cb(g_vc, &callback, &user_data);
2899 if (NULL == callback) {
2900 SLOG(LOG_WARN, TAG_VCC, "[WARNING] tts streaming callback is null");
2909 vc_tts_data_s *tts_data = NULL;
2910 ret = vc_data_get_first_tts_data(&tts_data);
2911 if (0 != ret || NULL == tts_data) {
2913 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] No tts data. Waiting mode");
2918 if (0 < vc_data_get_tts_data_size()) {
2919 SLOG(LOG_INFO, TAG_VCC, "[INFO] Resume thread");
2923 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Wrong request, there's no pcm data");
2924 vc_data_clear_tts_data(&tts_data);
2929 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish to wait for new tts data come");
2931 /* resume tts thread */
2932 vc_data_clear_tts_data(&tts_data);
2936 if (NULL != tts_data) {
2937 SLOG(LOG_DEBUG, TAG_VCC, "tts streaming callback is called");
2938 vc_client_use_callback(g_vc);
2939 callback(tts_data->event, tts_data->data, tts_data->data_size, tts_data->utt_id, user_data);
2940 vc_client_not_use_callback(g_vc);
2942 /* If no tts data and EVENT_FINISH */
2943 if (0 >= vc_data_get_tts_data_size() && VC_TTS_EVENT_FINISH == tts_data->event) {
2944 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish tts");
2953 static void __end_tts_streaming_thread(void* data, Ecore_Thread* thread)
2955 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] End tts streaming thread");
2956 g_tts_thread = NULL;
2959 int __vc_cb_tts_streaming(int utt_id, vc_tts_event_e event, char* buffer, int len)
2962 vc_tts_data_s* temp_tts_data = NULL;
2963 temp_tts_data = (vc_tts_data_s*)calloc(1, sizeof(vc_tts_data_s));
2964 if (NULL == temp_tts_data) {
2965 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Out of memory");
2966 return VC_ERROR_OUT_OF_MEMORY;
2969 temp_tts_data->data = NULL;
2970 temp_tts_data->data_size = 0;
2973 temp_tts_data->data = (char*)calloc(len + 5, sizeof(char));
2974 if (NULL != temp_tts_data->data) {
2975 memcpy(temp_tts_data->data, buffer, len);
2976 temp_tts_data->data_size = len;
2977 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG][memcpy] data(%p) size(%d)",
2978 temp_tts_data->data, temp_tts_data->data_size);
2980 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to allocate memory");
2983 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] tts data is NULL");
2986 temp_tts_data->utt_id = utt_id;
2987 temp_tts_data->event = event;
2989 int ret = vc_data_add_tts_data(temp_tts_data);
2991 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to add tts data");
2992 FREE(temp_tts_data->data);
2993 FREE(temp_tts_data);
2996 bool is_canceled = ecore_thread_check(g_tts_thread);
2997 if (NULL == g_tts_thread || TRUE == is_canceled) {
2998 SLOG(LOG_INFO, TAG_VCC, "ecore thread run : __start_tts_streaming_thread ");
2999 g_tts_thread = ecore_thread_run(__start_tts_streaming_thread, __end_tts_streaming_thread, NULL, NULL);
3005 int vc_tts_request(const char* text, const char* language, bool to_vc_manager, int* utt_id)
3011 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request tts");
3013 if (0 != __vc_get_feature_enabled()) {
3014 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3016 if (0 != __vc_check_privilege()) {
3017 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3020 if (0 != vc_client_get_client_state(g_vc, &state)) {
3021 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3022 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3023 return VC_ERROR_INVALID_STATE;
3027 if (state != VC_STATE_READY) {
3028 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3029 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3030 return VC_ERROR_INVALID_STATE;
3033 /* Check service state */
3034 vc_service_state_e service_state = -1;
3035 vc_client_get_service_state(g_vc, &service_state);
3036 if (service_state != VC_SERVICE_STATE_READY) {
3037 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3038 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3039 return VC_ERROR_INVALID_STATE;
3042 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts request, pid(%d), text(%s), language(%s), to_vc_manager(%d)", pid, text, language, to_vc_manager);
3045 bool is_prepared = false;
3047 ret = vc_dbus_request_tts(pid, text, language, to_vc_manager, utt_id);
3049 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3050 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3051 if (0 == vc_prepare_sync()) {
3053 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3055 } else if (VC_ERROR_TIMED_OUT != ret) {
3056 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request tts to vc service : %s", __vc_get_error_code(ret));
3059 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request tts : %s", __vc_get_error_code(ret));
3062 if (VC_RETRY_COUNT == count) {
3063 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
3070 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3075 int vc_tts_cancel(int utt_id)
3081 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Cancel tts");
3083 if (0 != __vc_get_feature_enabled()) {
3084 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3086 if (0 != __vc_check_privilege()) {
3087 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3090 if (0 != vc_client_get_client_state(g_vc, &state)) {
3091 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3092 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3093 return VC_ERROR_INVALID_STATE;
3097 if (state != VC_STATE_READY) {
3098 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3099 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3100 return VC_ERROR_INVALID_STATE;
3103 /* Check service state */
3104 vc_service_state_e service_state = -1;
3105 vc_client_get_service_state(g_vc, &service_state);
3106 if (service_state != VC_SERVICE_STATE_READY) {
3107 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3108 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3109 return VC_ERROR_INVALID_STATE;
3112 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts cancel, pid(%d), utt_id(%d)", pid, utt_id);
3114 ret = vc_data_clear_tts_data_by_uttid(utt_id);
3116 SLOG(LOG_INFO, TAG_VCC, "[INFO] There's no data in client pcm queue");
3120 bool is_prepared = false;
3122 ret = vc_dbus_cancel_tts(pid, utt_id);
3124 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3125 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3126 if (0 == vc_prepare_sync()) {
3128 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3130 } else if (VC_ERROR_TIMED_OUT != ret) {
3131 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel tts to vc service : %s", __vc_get_error_code(ret));
3134 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel tts : %s", __vc_get_error_code(ret));
3137 if (VC_RETRY_COUNT == count) {
3138 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel");
3145 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3150 int vc_tts_get_synthesized_audio_details(int* rate, vc_audio_channel_e* channel, vc_audio_type_e* audio_type)
3156 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Get tts audio format");
3158 if (0 != __vc_get_feature_enabled()) {
3159 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3161 if (0 != __vc_check_privilege()) {
3162 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3165 if (0 != vc_client_get_client_state(g_vc, &state)) {
3166 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3167 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3168 return VC_ERROR_INVALID_STATE;
3172 if (state != VC_STATE_READY) {
3173 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3174 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3175 return VC_ERROR_INVALID_STATE;
3178 /* Check service state */
3179 vc_service_state_e service_state = -1;
3180 vc_client_get_service_state(g_vc, &service_state);
3181 if (service_state != VC_SERVICE_STATE_READY) {
3182 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3183 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3184 return VC_ERROR_INVALID_STATE;
3187 SLOG(LOG_DEBUG, TAG_VCC, "@@@ get tts audio format, pid(%d)", pid);
3190 bool is_prepared = false;
3192 ret = vc_dbus_get_tts_audio_format(pid, rate, channel, audio_type);
3194 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3195 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3196 if (0 == vc_prepare_sync()) {
3198 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3200 } else if (VC_ERROR_TIMED_OUT != ret) {
3201 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format : %s", __vc_get_error_code(ret));
3204 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to get tts audio format : %s", __vc_get_error_code(ret));
3207 if (VC_RETRY_COUNT == count) {
3208 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format");
3215 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3220 int vc_tts_set_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
3222 if (0 != __vc_get_feature_enabled()) {
3223 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3225 if (0 != __vc_check_privilege()) {
3226 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3229 if (NULL == callback)
3230 return VC_ERROR_INVALID_PARAMETER;
3233 if (0 != vc_client_get_client_state(g_vc, &state)) {
3234 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : A handle is not available");
3235 return VC_ERROR_INVALID_STATE;
3239 if (state != VC_STATE_INITIALIZED) {
3240 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : Current state(%d) is not 'Initialized'", state);
3241 return VC_ERROR_INVALID_STATE;
3244 vc_client_set_tts_streaming_cb(g_vc, callback, user_data);
3249 int vc_tts_unset_streaming_cb(void)
3251 if (0 != __vc_get_feature_enabled()) {
3252 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3254 if (0 != __vc_check_privilege()) {
3255 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3259 if (0 != vc_client_get_client_state(g_vc, &state)) {
3260 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : A handle is not available");
3261 return VC_ERROR_INVALID_STATE;
3265 if (state != VC_STATE_INITIALIZED) {
3266 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : Current state(%d) is not 'Initialized'", state);
3267 return VC_ERROR_INVALID_STATE;
3270 vc_client_set_tts_streaming_cb(g_vc, NULL, NULL);
3275 int __vc_cb_utterance_status(int utt_id, int utt_status)
3277 vc_tts_utterance_status_cb callback = NULL;
3278 void* user_data = NULL;
3280 vc_client_get_tts_utterance_status_cb(g_vc, &callback, &user_data);
3281 if (NULL == callback) {
3282 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Utterance status callback is null");
3286 SLOG(LOG_DEBUG, TAG_VCC, "Utterance status callback is called");
3287 vc_client_use_callback(g_vc);
3288 callback(utt_id, (vc_tts_utterance_status_e)utt_status, user_data);
3289 vc_client_not_use_callback(g_vc);
3294 int vc_tts_set_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
3296 if (0 != __vc_get_feature_enabled()) {
3297 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3299 if (0 != __vc_check_privilege()) {
3300 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3303 if (NULL == callback)
3304 return VC_ERROR_INVALID_PARAMETER;
3307 if (0 != vc_client_get_client_state(g_vc, &state)) {
3308 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : A handle is not available");
3309 return VC_ERROR_INVALID_STATE;
3313 if (state != VC_STATE_INITIALIZED) {
3314 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : Current state(%d) is not 'Initialized'", state);
3315 return VC_ERROR_INVALID_STATE;
3318 vc_client_set_tts_utterance_status_cb(g_vc, callback, user_data);
3323 int vc_tts_unset_utterance_status_cb(void)
3325 if (0 != __vc_get_feature_enabled()) {
3326 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3328 if (0 != __vc_check_privilege()) {
3329 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3333 if (0 != vc_client_get_client_state(g_vc, &state)) {
3334 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : A handle is not available");
3335 return VC_ERROR_INVALID_STATE;
3339 if (state != VC_STATE_INITIALIZED) {
3340 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : Current state(%d) is not 'Initialized'", state);
3341 return VC_ERROR_INVALID_STATE;
3344 vc_client_set_tts_utterance_status_cb(g_vc, NULL, NULL);