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_RECORDER);
173 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_RECORDER, uid);
174 __check_privilege_deinitialize();
175 g_privilege_allowed = false;
176 pthread_mutex_unlock(&g_cynara_mutex);
177 return VC_ERROR_PERMISSION_DENIED;
181 ret = __check_privilege(uid, VC_PRIVILEGE_DATASHARING);
184 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_DATASHARING, uid);
185 __check_privilege_deinitialize();
186 g_privilege_allowed = false;
187 pthread_mutex_unlock(&g_cynara_mutex);
188 return VC_ERROR_PERMISSION_DENIED;
192 ret = __check_privilege(uid, VC_PRIVILEGE_APPMGR);
195 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_APPMGR, uid);
196 __check_privilege_deinitialize();
197 g_privilege_allowed = false;
198 pthread_mutex_unlock(&g_cynara_mutex);
199 return VC_ERROR_PERMISSION_DENIED;
203 __check_privilege_deinitialize();
206 g_privilege_allowed = true;
207 pthread_mutex_unlock(&g_cynara_mutex);
208 return VC_ERROR_NONE;
212 static const char* __vc_get_error_code(vc_error_e err)
215 case VC_ERROR_NONE: return "VC_ERROR_NONE";
216 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
217 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
218 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
219 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
220 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
221 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
222 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
223 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
224 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
225 default: return "Invalid error code";
230 static int __vc_convert_config_error_code(vc_config_error_e code)
232 if (code == VC_CONFIG_ERROR_NONE) return VC_ERROR_NONE;
233 if (code == VC_CONFIG_ERROR_OUT_OF_MEMORY) return VC_ERROR_OUT_OF_MEMORY;
234 if (code == VC_CONFIG_ERROR_IO_ERROR) return VC_ERROR_IO_ERROR;
235 if (code == VC_CONFIG_ERROR_INVALID_PARAMETER) return VC_ERROR_INVALID_PARAMETER;
236 if (code == VC_CONFIG_ERROR_INVALID_STATE) return VC_ERROR_INVALID_STATE;
237 if (code == VC_CONFIG_ERROR_INVALID_LANGUAGE) return VC_ERROR_INVALID_LANGUAGE;
238 if (code == VC_CONFIG_ERROR_ENGINE_NOT_FOUND) return VC_ERROR_ENGINE_NOT_FOUND;
239 if (code == VC_CONFIG_ERROR_OPERATION_FAILED) return VC_ERROR_OPERATION_FAILED;
241 return VC_ERROR_NONE;
244 static void __vc_lang_changed_cb(const char* before_lang, const char* current_lang)
246 SLOG(LOG_DEBUG, TAG_VCC, "Lang changed : Before lang(%s) Current lang(%s)",
247 before_lang, current_lang);
249 vc_current_language_changed_cb callback;
250 void* lang_user_data;
251 vc_client_get_current_lang_changed_cb(g_vc, &callback, &lang_user_data);
253 if (NULL != callback) {
254 vc_client_use_callback(g_vc);
255 callback(before_lang, current_lang, lang_user_data);
256 vc_client_not_use_callback(g_vc);
257 SLOG(LOG_DEBUG, TAG_VCC, "Language changed callback is called");
259 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Language changed callback is null");
265 static Eina_Bool __notify_auth_changed_cb(void *data)
267 vc_auth_state_changed_cb callback = NULL;
270 vc_client_get_auth_state_changed_cb(g_vc, &callback, &user_data);
272 vc_auth_state_e before = -1;
273 vc_auth_state_e current = -1;
275 vc_client_get_before_auth_state(g_vc, &before, ¤t);
277 if (NULL != callback) {
278 vc_client_use_callback(g_vc);
279 callback(before, current, user_data);
280 vc_client_not_use_callback(g_vc);
281 SLOG(LOG_DEBUG, TAG_VCC, "Auth state changed callback is called");
283 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Auth state changed callback is null");
289 static Eina_Bool __focus_changed_cb(void *data, int type, void *event)
291 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Focus changed");
294 if (ECORE_WL2_EVENT_FOCUS_IN == type) {
295 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground");
296 ret = vc_tidl_request_set_foreground(getpid(), true);
298 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
301 ret = vc_client_set_is_foreground(g_vc, true);
303 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret);
306 /* set authority valid */
307 vc_auth_state_e state = VC_AUTH_STATE_NONE;
308 if (0 != vc_client_get_auth_state(g_vc, &state)) {
309 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
311 if (VC_AUTH_STATE_INVALID == state) {
312 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
314 /* notify auth changed cb */
315 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
317 } else if (ECORE_WL2_EVENT_FOCUS_OUT == type) {
318 SLOG(LOG_DEBUG, TAG_VCW, "@@@ Set background");
319 ret = vc_tidl_request_set_foreground(getpid(), false);
321 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (false) : %d", ret);
324 ret = vc_client_set_is_foreground(g_vc, false);
326 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (false) : %d", ret);
329 /* set authority valid */
330 vc_auth_state_e state = VC_AUTH_STATE_NONE;
331 if (0 != vc_client_get_auth_state(g_vc, &state)) {
332 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
334 if (VC_AUTH_STATE_VALID == state) {
335 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_INVALID);
337 /* notify authority changed cb */
338 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
341 SLOG(LOG_DEBUG, TAG_VCC, "@@@ type(%d) is NOT valid", type);
344 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Focus changed DONE");
346 return ECORE_CALLBACK_RENEW;
350 int vc_initialize(void)
352 if (0 != __vc_get_feature_enabled()) {
353 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
355 if (0 != __vc_check_privilege()) {
356 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
359 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Initialize");
362 if (true == vc_client_is_valid(g_vc)) {
363 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized"); //LCOV_EXCL_LINE
364 return VC_ERROR_NONE; //LCOV_EXCL_LINE
367 if (0 < vc_client_get_count()) {
368 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized"); //LCOV_EXCL_LINE
369 return VC_ERROR_NONE; //LCOV_EXCL_LINE
372 if (0 != vc_tidl_open_connection()) {
373 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to open connection"); //LCOV_EXCL_LINE
374 return VC_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
377 if (0 != vc_client_create(&g_vc)) {
378 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create client!!!!!"); //LCOV_EXCL_LINE
379 return VC_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
382 int ret = vc_config_mgr_initialize(g_vc->handle);
384 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to init config manager : %s",
385 __vc_get_error_code(__vc_convert_config_error_code(ret))); //LCOV_EXCL_LINE
386 vc_client_destroy(g_vc); //LCOV_EXCL_LINE
387 return __vc_convert_config_error_code(ret); //LCOV_EXCL_LINE
390 ret = vc_config_mgr_set_lang_cb(g_vc->handle, __vc_lang_changed_cb);
392 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set config changed : %d", ret); //LCOV_EXCL_LINE
393 vc_config_mgr_finalize(g_vc->handle); //LCOV_EXCL_LINE
394 vc_client_destroy(g_vc); //LCOV_EXCL_LINE
395 return __vc_convert_config_error_code(ret);
398 SLOG(LOG_DEBUG, TAG_VCC, "[Success] pid(%d)", g_vc->handle);
401 return VC_ERROR_NONE;
404 static void __vc_internal_unprepare(void)
406 /* return authority */
407 vc_auth_state_e state = VC_AUTH_STATE_NONE;
408 if (0 != vc_client_get_auth_state(g_vc, &state)) {
409 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
412 if (VC_AUTH_STATE_NONE != state) {
413 if (0 != vc_auth_disable()) {
414 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to auth disable"); //LCOV_EXCL_LINE
418 int ret = vc_tidl_request_finalize(g_vc->handle);
420 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
423 if (NULL != g_focus_in_handler) {
424 ecore_event_handler_del(g_focus_in_handler);
425 g_focus_in_handler = NULL;
427 if (NULL != g_focus_out_handler) {
428 ecore_event_handler_del(g_focus_out_handler);
429 g_focus_out_handler = NULL;
432 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
434 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
439 int vc_deinitialize(void)
441 int ret = VC_ERROR_NONE;
443 if (0 != __vc_get_feature_enabled()) {
444 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
446 if (0 != __vc_check_privilege()) {
447 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
450 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Deinitialize");
452 if (false == vc_client_is_valid(g_vc)) {
453 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NOT initialized");
454 return VC_ERROR_INVALID_STATE;
458 vc_client_get_client_state(g_vc, &state);
463 __vc_internal_unprepare();
464 /* no break. need to next step*/
465 case VC_STATE_INITIALIZED:
466 if (NULL != g_connect_timer) {
467 SLOG(LOG_DEBUG, TAG_VCC, "Connect Timer is deleted"); //LCOV_EXCL_LINE
468 ecore_timer_del(g_connect_timer);
469 g_connect_timer = NULL;
472 vc_config_mgr_unset_lang_cb(g_vc->handle);
473 vc_config_mgr_finalize(g_vc->handle);
475 /* Free client resources */
476 vc_client_destroy(g_vc);
483 SLOG(LOG_INFO, TAG_VCC, "Success: destroy");
485 if (true == g_backup) {
486 ret = vc_db_backup_command();
488 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to backup command, ret(%d)", ret); //LCOV_EXCL_LINE
492 ret = vc_db_finalize();
494 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB, ret(%d)", ret); //LCOV_EXCL_LINE
497 if (0 != vc_tidl_close_connection()) {
498 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection"); //LCOV_EXCL_LINE
501 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Deinitialize DONE");
503 return VC_ERROR_NONE;
506 static Eina_Bool __vc_connect_daemon(void *data)
508 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon");
510 /* request initialization */
513 int service_state = 0;
515 g_connect_timer = NULL;
518 if (true == vc_client_is_valid(g_vc)) {
519 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] g_vc is valid");
522 ret = vc_db_initialize();
524 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize DB : %d", ret); //LCOV_EXCL_LINE
528 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
530 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
532 ret = vc_tidl_request_initialize(g_vc->handle, &mgr_pid, &service_state, &g_daemon_pid);
534 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
535 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
537 vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND);
538 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
542 } else if (0 != ret) {
543 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
545 vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT);
546 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
548 ret = vc_db_finalize();
550 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB : %d", ret); //LCOV_EXCL_LINE
555 /* Success to connect */
558 /* Set service state */
559 vc_service_state_e previous_service_state;
560 vc_client_get_service_state(g_vc, &previous_service_state);
562 vc_client_set_service_state(g_vc, (vc_service_state_e)service_state);
564 vc_service_state_changed_cb service_changed_callback = NULL;
565 void* user_data = NULL;
566 vc_client_get_service_state_changed_cb(g_vc, &service_changed_callback, &user_data);
568 if (NULL != service_changed_callback) {
569 vc_client_use_callback(g_vc);
570 service_changed_callback(previous_service_state, service_state, user_data);
571 vc_client_not_use_callback(g_vc);
572 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called"); //LCOV_EXCL_LINE
574 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null"); //LCOV_EXCL_LINE
577 /* Register focus handler */
578 ecore_thread_main_loop_begin();
579 g_focus_in_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_IN, __focus_changed_cb, NULL);
580 g_focus_out_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_OUT, __focus_changed_cb, NULL);
581 ecore_thread_main_loop_end();
583 char appid[1024] = {'\0',};
584 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1);
586 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get aul_app_get_appid_bypid : %d", ret);
588 int status = aul_app_get_status(appid);
589 if (STATUS_FOCUS == status) {
590 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground"); //LCOV_EXCL_LINE
591 ret = vc_tidl_request_set_foreground(getpid(), true);
593 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret); //LCOV_EXCL_LINE
596 ret = vc_client_set_is_foreground(g_vc, true);
598 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret); //LCOV_EXCL_LINE
601 /* set authority valid */
602 vc_auth_state_e state = VC_AUTH_STATE_NONE;
603 if (0 != vc_client_get_auth_state(g_vc, &state)) {
604 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
606 if (VC_AUTH_STATE_INVALID == state) {
607 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
609 /* notify auth changed cb */
610 ecore_idler_add(__notify_auth_changed_cb, NULL);
614 vc_client_set_client_state(g_vc, VC_STATE_READY);
615 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
617 vc_client_set_mgr_pid(g_vc, mgr_pid);
619 SLOG(LOG_ERROR, TAG_VCC, "[Not ERROR] g_vc is not valid. It is destroyed."); //LCOV_EXCL_LINE
623 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon DONE");
628 static void __start_prepare_thread(void *data, Ecore_Thread *thread)
630 SLOG(LOG_ERROR, TAG_VCC, "@@@ Start prepare thread");
631 int ret = -1, retry_count = 0;
635 if (retry_count == 20) { // 200 ms * 20 = 4 sec
636 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!"); //LCOV_EXCL_LINE
640 ret = vc_tidl_request_hello();
642 SLOG(LOG_DEBUG, TAG_VCC, "Success to request hello. retry count(%d)", retry_count);
653 if (retry_count == 10) {
654 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon !!"); //LCOV_EXCL_LINE
657 ret = __vc_connect_daemon(NULL);
667 static void __end_prepare_thread(void *data, Ecore_Thread *thread)
669 SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread");
674 if (0 != __vc_get_feature_enabled()) {
675 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
677 if (0 != __vc_check_privilege()) {
678 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
681 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
684 if (0 != vc_client_get_client_state(g_vc, &state)) {
685 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available"); //LCOV_EXCL_LINE
686 return VC_ERROR_INVALID_STATE;
690 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
692 ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, NULL);
695 return VC_ERROR_NONE;
699 int vc_prepare_sync(void)
701 if (0 != __vc_get_feature_enabled()) {
702 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
704 if (0 != __vc_check_privilege()) {
705 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
708 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
711 if (0 != vc_client_get_client_state(g_vc, &state)) {
712 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
713 return VC_ERROR_INVALID_STATE;
717 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
720 while (EINA_TRUE == __vc_connect_daemon(NULL) && VC_CONNECTION_RETRY_COUNT > cnt) {
724 RETVM_IF(VC_CONNECTION_RETRY_COUNT == cnt, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Fail to connect daemon");
726 return VC_ERROR_NONE;
730 int vc_unprepare(void)
732 if (0 != __vc_get_feature_enabled()) {
733 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
735 if (0 != __vc_check_privilege()) {
736 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
739 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare");
742 if (0 != vc_client_get_client_state(g_vc, &state)) {
743 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
744 return VC_ERROR_INVALID_STATE;
748 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
750 __vc_internal_unprepare();
752 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
753 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
755 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare DONE");
757 return VC_ERROR_NONE;
760 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
762 if (0 != __vc_get_feature_enabled()) {
763 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
765 if (0 != __vc_check_privilege()) {
766 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
769 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
772 if (0 != vc_client_get_client_state(g_vc, &state)) {
773 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
774 return VC_ERROR_INVALID_STATE;
777 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language");
781 ret = vc_config_mgr_get_language_list(callback, user_data);
783 ret = vc_config_convert_error_code((vc_config_error_e)ret);
784 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
787 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language DONE");
789 return VC_ERROR_NONE;
793 int vc_get_current_language(char** language)
795 if (0 != __vc_get_feature_enabled()) {
796 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
798 if (0 != __vc_check_privilege()) {
799 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
802 RETVM_IF(NULL == language, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
805 if (0 != vc_client_get_client_state(g_vc, &state)) {
806 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
807 return VC_ERROR_INVALID_STATE;
811 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language");
814 ret = vc_config_mgr_get_default_language(language);
816 ret = vc_config_convert_error_code((vc_config_error_e)ret);
817 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
820 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language DONE");
825 int vc_get_state(vc_state_e* state)
827 if (0 != __vc_get_feature_enabled()) {
828 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
830 if (0 != __vc_check_privilege()) {
831 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
834 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
837 if (0 != vc_client_get_client_state(g_vc, &temp)) {
838 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not valid");
839 return VC_ERROR_INVALID_STATE;
843 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State");
849 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
850 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
851 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
852 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
856 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State DONE");
858 return VC_ERROR_NONE;
861 int vc_get_service_state(vc_service_state_e* state)
863 if (0 != __vc_get_feature_enabled()) {
864 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
866 if (0 != __vc_check_privilege()) {
867 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
870 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
873 if (0 != vc_client_get_client_state(g_vc, &temp)) {
874 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
875 return VC_ERROR_INVALID_STATE;
878 RETVM_IF(VC_STATE_READY != temp, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", temp);
880 /* get service state */
881 vc_service_state_e service_state;
882 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
883 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state"); //LCOV_EXCL_LINE
884 return VC_ERROR_OPERATION_FAILED;
888 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State");
890 *state = service_state;
894 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break;
895 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
896 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
897 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
898 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
902 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State DONE");
904 return VC_ERROR_NONE;
907 int vc_get_system_command_list(vc_cmd_list_h* vc_sys_cmd_list)
909 if (0 != __vc_get_feature_enabled()) {
910 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
912 if (0 != __vc_check_privilege()) {
913 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
916 RETVM_IF(NULL == vc_sys_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
917 *vc_sys_cmd_list = NULL;
920 if (0 != vc_client_get_client_state(g_vc, &state)) {
921 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
922 return VC_ERROR_INVALID_STATE;
926 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
928 /* Check service state */
929 vc_service_state_e service_state = -1;
930 vc_client_get_service_state(g_vc, &service_state);
931 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);
934 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list");
936 bool is_sys_cmd_valid = false;
939 bool is_prepared = false;
941 ret = vc_tidl_request_is_system_command_valid(g_vc->handle, &is_sys_cmd_valid);
944 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
945 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
946 if (0 == vc_prepare_sync()) {
948 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
950 } else if (VC_ERROR_TIMED_OUT != ret) {
951 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to ask system command is : %s", __vc_get_error_code(ret));
954 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to ask system command is : %s", __vc_get_error_code(ret));
957 if (VC_RETRY_COUNT == count) {
958 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
967 ret = vc_client_get_mgr_pid(g_vc, &mgr_pid);
969 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get the manager pid"); //LCOV_EXCL_LINE
970 return VC_ERROR_OPERATION_FAILED;
973 if (true == is_sys_cmd_valid) {
974 vc_cmd_list_s* list = NULL;
975 ret = vc_cmd_list_create((vc_cmd_list_h*)&list);
977 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
981 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, &(list->list));
983 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
984 vc_cmd_list_destroy((vc_cmd_list_h)list, true);
988 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &(list->list));
990 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
991 vc_cmd_list_destroy((vc_cmd_list_h)list, true);
995 *vc_sys_cmd_list = (vc_cmd_list_h)list;
997 SLOG(LOG_WARN, TAG_VCC, "[WARNING] No system commands"); //LCOV_EXCL_LINE
998 return VC_ERROR_NONE;
1001 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list DONE");
1008 * @brief Checks whether the command format is supported.
1009 * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
1011 * @param[in] format The command format
1012 * @param[out] support The result status @c true = supported, @c false = not supported
1014 * @return 0 on success, otherwise a negative error value
1015 * @retval #VC_ERROR_NONE Successful
1016 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1017 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
1018 * @retval #VC_ERROR_INVALID_STATE Invalid state
1020 * @pre The state should be #VC_STATE_READY.
1022 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
1024 if (0 != __vc_get_feature_enabled()) {
1025 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1027 if (0 != __vc_check_privilege()) {
1028 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1031 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported");
1034 if (0 != vc_client_get_client_state(g_vc, &state)) {
1035 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1036 return VC_ERROR_INVALID_STATE;
1040 bool non_fixed_support = false;
1041 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
1042 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
1046 case VC_CMD_FORMAT_FIXED: *support = true; break;
1047 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
1048 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
1049 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
1050 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
1051 default: *support = false; break;
1054 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
1056 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported DONE");
1058 return VC_ERROR_NONE;
1062 static int __vc_get_invocation_name(char** invocation_name)
1064 int ret = vc_client_get_invocation_name(g_vc, invocation_name);
1066 SLOG(LOG_WARN, TAG_VCC, "Fail to get invocation name"); //LCOV_EXCL_LINE
1067 return ret; //LCOV_EXCL_LINE
1070 if (NULL == *invocation_name) {
1071 char* temp_label = NULL;
1075 ret = app_manager_get_app_id(getpid(), &appid);
1076 if (0 != ret || NULL == appid) {
1078 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get appid, ret(%d)", ret); //LCOV_EXCL_LINE
1080 return VC_ERROR_OPERATION_FAILED;
1084 ret = vc_get_current_language(&lang);
1085 if (0 != ret || NULL == lang) {
1086 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current language, ret(%d)", ret); //LCOV_EXCL_LINE
1089 return VC_ERROR_OPERATION_FAILED;
1092 ret = app_info_get_localed_label(appid, lang, &temp_label);
1093 if (0 != ret || NULL == temp_label) {
1095 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get localed label, ret(%d) appid(%s) lang(%s)", ret, appid, lang); //LCOV_EXCL_LINE
1099 return VC_ERROR_OPERATION_FAILED;
1103 *invocation_name = strdup(temp_label);
1104 if (NULL == *invocation_name) {
1105 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE
1109 return VC_ERROR_OUT_OF_MEMORY;
1117 SLOG(LOG_DEBUG, TAG_VCC, "Get invocation name(%s)", *invocation_name);
1118 return VC_ERROR_NONE;
1121 void __set_command(vc_h vc, vc_cmd_type_e type)
1125 bool is_prepared = false;
1127 ret = vc_tidl_request_set_command(vc->handle, type);
1130 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1131 vc_client_set_client_state(vc, VC_STATE_INITIALIZED);
1132 if (0 == vc_prepare_sync()) {
1134 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1136 } else if (VC_ERROR_TIMED_OUT != ret) {
1137 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1140 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1143 if (VC_RETRY_COUNT == count) {
1144 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1155 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
1157 if (0 != __vc_get_feature_enabled()) {
1158 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1160 if (0 != __vc_check_privilege()) {
1161 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1164 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
1167 if (0 != vc_client_get_client_state(g_vc, &state)) {
1168 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1169 return VC_ERROR_INVALID_STATE;
1173 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1176 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list");
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 return VC_ERROR_INVALID_PARAMETER;
1184 vc_cmd_list_s* list = NULL;
1185 list = (vc_cmd_list_s*)vc_cmd_list;
1186 RETVM_IF(NULL == list->list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Invalid command list");
1189 char* invocation_name = NULL;
1190 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1191 ret = __vc_get_invocation_name(&invocation_name);
1192 if (0 != ret || NULL == invocation_name) {
1193 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret); //LCOV_EXCL_LINE
1198 ret = vc_cmd_parser_delete_file(getpid(), type);
1200 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1202 ret = vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list, invocation_name);
1204 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
1206 __set_command(g_vc, (vc_cmd_type_e)type);
1209 FREE(invocation_name);
1211 if (VC_COMMAND_TYPE_BACKGROUND == type)
1214 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list DONE");
1219 int vc_unset_command_list(int type)
1221 if (0 != __vc_get_feature_enabled()) {
1222 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1224 if (0 != __vc_check_privilege()) {
1225 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1229 if (0 != vc_client_get_client_state(g_vc, &state)) {
1230 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1231 return VC_ERROR_INVALID_STATE;
1235 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1238 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list");
1242 bool is_prepared = false;
1244 ret = vc_tidl_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
1247 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1248 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1249 if (0 == vc_prepare_sync()) {
1251 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1253 } else if (VC_ERROR_TIMED_OUT != ret) {
1254 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
1257 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
1260 if (VC_RETRY_COUNT == count) {
1261 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1269 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
1271 ret = vc_config_convert_error_code((vc_config_error_e)ret);
1272 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret)); //LCOV_EXCL_LINE
1275 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list DONE");
1281 int vc_set_command_list_from_file(const char* file_path, int type)
1283 if (0 != __vc_get_feature_enabled()) {
1284 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1286 if (0 != __vc_check_privilege()) {
1287 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1291 if (0 != vc_client_get_client_state(g_vc, &state)) {
1292 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1293 return VC_ERROR_INVALID_STATE;
1297 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1300 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1301 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1302 return VC_ERROR_INVALID_PARAMETER;
1306 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file");
1309 char* invocation_name = NULL;
1310 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1311 ret = __vc_get_invocation_name(&invocation_name);
1312 if (0 != ret || NULL == invocation_name) {
1313 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1318 ret = vc_cmd_parser_delete_file(getpid(), type);
1320 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1322 ret = vc_json_set_commands_from_file(file_path, (vc_cmd_type_e)type, invocation_name);
1324 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set commands from file : %s", __vc_get_error_code(ret));
1326 __set_command(g_vc, (vc_cmd_type_e)type);
1329 FREE(invocation_name);
1331 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file DONE");
1337 int vc_get_exclusive_command_option(bool* value)
1339 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get exclusive command");
1342 if (0 != vc_client_get_client_state(g_vc, &state)) {
1343 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1344 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1345 return VC_ERROR_INVALID_STATE;
1349 if (state != VC_STATE_READY) {
1350 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1351 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1352 return VC_ERROR_INVALID_STATE;
1355 int ret = vc_client_get_exclusive_cmd(g_vc, value);
1357 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1358 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1362 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1367 int vc_set_exclusive_command_option(bool value)
1369 if (0 != __vc_get_feature_enabled()) {
1370 return VC_ERROR_NOT_SUPPORTED;
1372 if (0 != __vc_check_privilege()) {
1373 return VC_ERROR_PERMISSION_DENIED;
1376 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set exclusive command");
1379 if (0 != vc_client_get_client_state(g_vc, &state)) {
1380 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1381 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1382 return VC_ERROR_INVALID_STATE;
1386 if (state != VC_STATE_READY) {
1387 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1388 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1389 return VC_ERROR_INVALID_STATE;
1392 int ret = vc_client_set_exclusive_cmd(g_vc, value);
1394 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1395 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1401 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
1403 if (VC_ERROR_TIMED_OUT != ret) {
1404 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
1407 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
1410 if (VC_RETRY_COUNT == count) {
1411 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1418 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1425 int vc_request_start(bool stop_by_silence)
1427 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
1430 if (0 != vc_client_get_client_state(g_vc, &state)) {
1431 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1432 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1433 return VC_ERROR_INVALID_STATE;
1437 if (state != VC_STATE_READY) {
1438 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1439 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1440 return VC_ERROR_INVALID_STATE;
1443 /* Check service state */
1444 vc_service_state_e service_state = -1;
1445 vc_client_get_service_state(g_vc, &service_state);
1446 if (service_state != VC_SERVICE_STATE_READY) {
1447 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1448 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1449 return VC_ERROR_INVALID_STATE;
1459 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1461 if (VC_ERROR_TIMED_OUT != ret) {
1462 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1465 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1468 if (VC_RETRY_COUNT == count) {
1469 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1474 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1478 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1483 int vc_request_stop(void)
1485 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
1488 if (0 != vc_client_get_client_state(g_vc, &state)) {
1489 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1490 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1491 return VC_ERROR_INVALID_STATE;
1495 if (state != VC_STATE_READY) {
1496 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1497 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1498 return VC_ERROR_INVALID_STATE;
1501 /* Check service state */
1502 vc_service_state_e service_state = -1;
1503 vc_client_get_service_state(g_vc, &service_state);
1504 if (service_state != VC_SERVICE_STATE_RECORDING) {
1505 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1506 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1507 return VC_ERROR_INVALID_STATE;
1514 ret = vc_dbus_request_stop(g_vc->handle);
1516 if (VC_ERROR_TIMED_OUT != ret) {
1517 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1520 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1523 if (VC_RETRY_COUNT == count) {
1524 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1529 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1533 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1538 int vc_request_cancel(void)
1540 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel Interrupt");
1543 if (0 != vc_client_get_client_state(g_vc, &state)) {
1544 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1545 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1546 return VC_ERROR_INVALID_STATE;
1550 if (state != VC_STATE_READY) {
1551 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1552 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1553 return VC_ERROR_INVALID_STATE;
1556 /* Check service state */
1557 vc_service_state_e service_state = -1;
1558 vc_client_get_service_state(g_vc, &service_state);
1559 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1560 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1561 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1562 return VC_ERROR_INVALID_STATE;
1568 ret = vc_dbus_request_cancel(g_vc->handle);
1570 if (VC_ERROR_TIMED_OUT != ret) {
1571 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1574 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel request : %s", __vc_get_error_code(ret));
1577 if (VC_RETRY_COUNT == count) {
1578 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1583 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Cancel interrupt");
1587 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1594 static void __vc_notify_error(void *data)
1596 vc_h vc = (vc_h)data;
1598 vc_error_cb callback = NULL;
1602 vc_client_get_error_cb(vc, &callback, &user_data);
1603 vc_client_get_error(vc, &reason);
1605 if (NULL != callback) {
1606 vc_client_use_callback(vc);
1607 callback(reason, user_data);
1608 vc_client_not_use_callback(vc);
1609 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1611 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1615 int __vc_cb_error(int reason, int daemon_pid, char* msg)
1618 if (0 != vc_client_get_client_state(g_vc, &state)) {
1619 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid client");
1620 return VC_ERROR_INVALID_PARAMETER;
1624 if (state != VC_STATE_READY) {
1625 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] State is not READY");
1626 if (VC_ERROR_SERVICE_RESET != reason) {
1627 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] not connected client yet(%d)", reason);
1628 return VC_ERROR_INVALID_STATE;
1630 return VC_ERROR_NONE;
1633 if (VC_ERROR_SERVICE_RESET == reason) {
1634 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset");
1636 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1637 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
1639 if (0 != vc_prepare()) {
1640 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare");
1644 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1646 vc_client_set_error(g_vc, reason);
1647 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
1649 return VC_ERROR_NONE;
1652 int __vc_cb_error_to_app(int pid, int reason, const char* msg)
1654 SLOG(LOG_INFO, TAG_VCC, "[INFO] send error to app(%d)", pid);
1657 if (0 != vc_client_get_handle(pid, &vc)) {
1658 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get vc handle");
1659 return VC_ERROR_INVALID_PARAMETER;
1662 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1664 vc_client_set_error(vc, reason);
1665 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)vc);
1667 return VC_ERROR_NONE;
1670 static void __vc_notify_state_changed(void *data)
1672 vc_h vc = (vc_h)data;
1674 vc_state_changed_cb changed_callback = NULL;
1677 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1679 vc_state_e current_state;
1680 vc_state_e before_state;
1682 vc_client_get_before_state(vc, ¤t_state, &before_state);
1684 if (NULL != changed_callback) {
1685 vc_client_use_callback(vc);
1686 changed_callback(before_state, current_state, user_data);
1687 vc_client_not_use_callback(vc);
1688 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1690 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1694 static Eina_Bool __vc_notify_result(void *data)
1698 vc_cmd_list_h vc_cmd_list = NULL;
1700 vc_result_cb callback = NULL;
1701 void* user_data = NULL;
1703 vc_client_get_result_cb(g_vc, &callback, &user_data);
1705 RETVM_IF(NULL == callback, EINA_FALSE, TAG_VCC, "[ERROR] Client result callback is NULL");
1707 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1708 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1712 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1714 SECURE_SLOG(LOG_INFO, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1716 vc_cmd_print_list(vc_cmd_list);
1718 vc_client_use_callback(g_vc);
1719 callback(event, vc_cmd_list, temp_text, user_data);
1720 vc_client_not_use_callback(g_vc);
1722 SLOG(LOG_INFO, TAG_VCC, "Client result callback called");
1724 vc_cmd_list_destroy(vc_cmd_list, true);
1727 /* Release result */
1733 void __vc_cb_result(void)
1735 ecore_timer_add(0, __vc_notify_result, NULL);
1741 int vc_get_result(vc_result_cb callback, void* user_data)
1743 if (0 != __vc_get_feature_enabled()) {
1744 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1746 if (0 != __vc_check_privilege()) {
1747 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1751 if (0 != vc_client_get_client_state(g_vc, &state)) {
1752 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1753 return VC_ERROR_INVALID_STATE;
1757 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1759 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client result callback is NULL");
1762 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result");
1764 char* temp_text = NULL;
1766 vc_cmd_list_h vc_cmd_list = NULL;
1768 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1769 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
1770 return VC_ERROR_INVALID_PARAMETER;
1773 int ret = vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1774 if (0 != ret || NULL == temp_text) {
1775 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get result, ret(%d) temp_text(%s)", ret, temp_text); //LCOV_EXCL_LINE
1779 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event); //LCOV_EXCL_LINE
1781 vc_cmd_print_list(vc_cmd_list);
1783 vc_client_use_callback(g_vc);
1784 callback(event, vc_cmd_list, temp_text, user_data);
1785 vc_client_not_use_callback(g_vc);
1787 vc_cmd_list_destroy(vc_cmd_list, true);
1790 /* Release result */
1793 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result DONE");
1795 return VC_ERROR_NONE;
1798 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1800 if (0 != __vc_get_feature_enabled()) {
1801 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1803 if (0 != __vc_check_privilege()) {
1804 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1807 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client result callback is NULL");
1810 if (0 != vc_client_get_client_state(g_vc, &state)) {
1811 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1812 return VC_ERROR_INVALID_STATE;
1816 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1818 vc_client_set_result_cb(g_vc, callback, user_data);
1820 return VC_ERROR_NONE;
1823 int vc_unset_result_cb(void)
1825 if (0 != __vc_get_feature_enabled()) {
1826 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1828 if (0 != __vc_check_privilege()) {
1829 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1833 if (0 != vc_client_get_client_state(g_vc, &state)) {
1834 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1835 return VC_ERROR_INVALID_STATE;
1839 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1841 vc_client_set_result_cb(g_vc, NULL, NULL);
1843 return VC_ERROR_NONE;
1847 int __vc_cb_service_state(int state)
1849 vc_service_state_e current_state = (vc_service_state_e)state;
1850 vc_service_state_e before_state;
1851 vc_client_get_service_state(g_vc, &before_state);
1853 if (current_state == before_state) {
1854 return VC_ERROR_NONE;
1857 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
1858 before_state, current_state);
1860 /* Save service state */
1861 vc_client_set_service_state(g_vc, current_state);
1863 vc_service_state_changed_cb callback = NULL;
1864 void* service_user_data;
1865 vc_client_get_service_state_changed_cb(g_vc, &callback, &service_user_data);
1867 if (NULL != callback) {
1868 vc_client_use_callback(g_vc);
1869 callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
1870 vc_client_not_use_callback(g_vc);
1871 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
1873 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null");
1876 return VC_ERROR_NONE;
1879 int __vc_cb_manager_pid(int manager_pid)
1881 SLOG(LOG_DEBUG, TAG_VCC, "Manager pid is changed : %d", manager_pid); //LCOV_EXCL_LINE
1883 /* Save service state */
1884 vc_client_set_mgr_pid(g_vc, manager_pid);
1886 return VC_ERROR_NONE;
1890 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1892 if (0 != __vc_get_feature_enabled()) {
1893 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1895 if (0 != __vc_check_privilege()) {
1896 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1899 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client service state changed callback is NULL");
1902 if (0 != vc_client_get_client_state(g_vc, &state)) {
1903 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1904 return VC_ERROR_INVALID_STATE;
1908 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1910 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
1912 return VC_ERROR_NONE;
1915 int vc_unset_service_state_changed_cb(void)
1917 if (0 != __vc_get_feature_enabled()) {
1918 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1920 if (0 != __vc_check_privilege()) {
1921 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1925 if (0 != vc_client_get_client_state(g_vc, &state)) {
1926 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1927 return VC_ERROR_INVALID_STATE;
1931 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1933 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
1935 return VC_ERROR_NONE;
1938 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1940 if (0 != __vc_get_feature_enabled()) {
1941 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1943 if (0 != __vc_check_privilege()) {
1944 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1947 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client state changed callback is NULL");
1950 if (0 != vc_client_get_client_state(g_vc, &state)) {
1951 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
1952 return VC_ERROR_INVALID_STATE;
1956 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1958 vc_client_set_state_changed_cb(g_vc, callback, user_data);
1960 return VC_ERROR_NONE;
1963 int vc_unset_state_changed_cb(void)
1965 if (0 != __vc_get_feature_enabled()) {
1966 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1968 if (0 != __vc_check_privilege()) {
1969 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1973 if (0 != vc_client_get_client_state(g_vc, &state)) {
1974 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
1975 return VC_ERROR_INVALID_STATE;
1979 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1981 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
1983 return VC_ERROR_NONE;
1986 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
1988 if (0 != __vc_get_feature_enabled()) {
1989 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1991 if (0 != __vc_check_privilege()) {
1992 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1995 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client current language changed callback is NULL");
1998 if (0 != vc_client_get_client_state(g_vc, &state)) {
1999 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
2000 return VC_ERROR_INVALID_STATE;
2004 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2006 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
2008 return VC_ERROR_NONE;
2011 int vc_unset_current_language_changed_cb(void)
2013 if (0 != __vc_get_feature_enabled()) {
2014 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2016 if (0 != __vc_check_privilege()) {
2017 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2021 if (0 != vc_client_get_client_state(g_vc, &state)) {
2022 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
2023 return VC_ERROR_INVALID_STATE;
2027 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2029 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
2031 return VC_ERROR_NONE;
2034 int vc_set_error_cb(vc_error_cb callback, void* user_data)
2036 if (0 != __vc_get_feature_enabled()) {
2037 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2039 if (0 != __vc_check_privilege()) {
2040 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2043 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client error callback is NULL");
2046 if (0 != vc_client_get_client_state(g_vc, &state)) {
2047 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
2048 return VC_ERROR_INVALID_STATE;
2052 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2054 vc_client_set_error_cb(g_vc, callback, user_data);
2056 return VC_ERROR_NONE;
2059 int vc_unset_error_cb(void)
2061 if (0 != __vc_get_feature_enabled()) {
2062 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2064 if (0 != __vc_check_privilege()) {
2065 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2069 if (0 != vc_client_get_client_state(g_vc, &state)) {
2070 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
2071 return VC_ERROR_INVALID_STATE;
2075 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2077 vc_client_set_error_cb(g_vc, NULL, NULL);
2079 return VC_ERROR_NONE;
2082 int vc_set_invocation_name(const char* name)
2084 if (0 != __vc_get_feature_enabled()) {
2085 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2087 if (0 != __vc_check_privilege()) {
2088 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2092 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set invocation name");
2094 int ret = vc_client_get_client_state(g_vc, &state);
2096 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2101 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2103 ret = vc_client_set_invocation_name(g_vc, name);
2105 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set invocation name");
2111 int vc_set_server_dialog(const char* app_id, const char* credential)
2116 if (0 != __vc_get_feature_enabled()) {
2117 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2119 if (0 != __vc_check_privilege()) {
2120 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2123 RETVM_IF(NULL == credential, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Credential is NULL");
2125 if (0 != vc_client_get_client_state(g_vc, &state)) {
2126 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2127 return VC_ERROR_INVALID_STATE;
2131 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2133 /* Check service state */
2134 vc_service_state_e service_state = -1;
2135 vc_client_get_service_state(g_vc, &service_state);
2136 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);
2139 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog, pid(%d), app_id(%s)", getpid(), app_id);
2141 char* tmp_appid = NULL;
2142 if (NULL == app_id) {
2143 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2144 if (0 != ret || NULL == tmp_appid) {
2145 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2147 return VC_ERROR_INVALID_PARAMETER;
2150 tmp_appid = strdup(app_id);
2154 SLOG(LOG_DEBUG, TAG_VCC, "Set server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2157 bool is_prepared = false;
2159 ret = vc_tidl_request_set_server_dialog(pid, tmp_appid, credential);
2161 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2162 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2163 if (0 == vc_prepare_sync()) {
2165 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2167 } else if (VC_ERROR_TIMED_OUT != ret) {
2168 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set server dialog to vc service : %s", __vc_get_error_code(ret));
2171 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set server dialog : %s", __vc_get_error_code(ret));
2174 if (VC_RETRY_COUNT == count) {
2175 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2184 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog DONE");
2189 int vc_unset_server_dialog(const char* app_id)
2193 char* tmp_appid = NULL;
2195 if (0 != __vc_get_feature_enabled()) {
2196 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2198 if (0 != __vc_check_privilege()) {
2199 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2202 if (0 != vc_client_get_client_state(g_vc, &state)) {
2203 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2204 return VC_ERROR_INVALID_STATE;
2208 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2210 /* Check service state */
2211 vc_service_state_e service_state = -1;
2212 vc_client_get_service_state(g_vc, &service_state);
2213 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);
2216 if (NULL == app_id) {
2217 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2218 if (0 != ret || NULL == tmp_appid) {
2219 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2221 return VC_ERROR_INVALID_PARAMETER;
2224 tmp_appid = strdup(app_id);
2228 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2231 bool is_prepared = false;
2232 char* credential = strdup("#NULL");
2234 ret = vc_tidl_request_set_server_dialog(pid, tmp_appid, credential);
2236 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2237 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2238 if (0 == vc_prepare_sync()) {
2240 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2242 } else if (VC_ERROR_TIMED_OUT != ret) {
2243 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset server dialog to vc service : %s", __vc_get_error_code(ret));
2246 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset server dialog : %s", __vc_get_error_code(ret));
2249 if (VC_RETRY_COUNT == count) {
2250 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2260 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog DONE");
2266 int vc_request_dialog(const char* disp_text, const char* utt_text, bool auto_start)
2270 if (0 != __vc_get_feature_enabled()) {
2271 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2273 if (0 != __vc_check_privilege()) {
2274 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2277 if (0 != vc_client_get_client_state(g_vc, &state)) {
2278 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2279 return VC_ERROR_INVALID_STATE;
2283 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2285 /* Check service state */
2286 vc_service_state_e service_state = -1;
2287 vc_client_get_service_state(g_vc, &service_state);
2288 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);
2290 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);
2291 int ret = vc_tidl_request_request_dialog(getpid(), disp_text, utt_text, auto_start);
2293 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request dialog, ret(%d)", ret);
2294 return VC_ERROR_OPERATION_FAILED;
2297 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog DONE");
2299 return VC_ERROR_NONE;
2304 int vc_auth_enable(void)
2308 if (0 != vc_client_get_client_state(g_vc, &state)) {
2309 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2310 return VC_ERROR_INVALID_STATE;
2312 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", state);
2314 /* check already authority */
2315 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2316 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2317 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2318 return VC_ERROR_INVALID_STATE;
2320 RETVM_IF(VC_AUTH_STATE_NONE != auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Already authority enabled");
2322 /* request authority */
2324 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2325 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2326 return VC_ERROR_OPERATION_FAILED;
2329 if (0 != vc_tidl_request_auth_enable(g_vc->handle, mgr_pid)) {
2330 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
2331 return VC_ERROR_OPERATION_FAILED;
2334 /* set authority into handle */
2335 bool is_foreground = false;
2336 if (0 != vc_client_get_is_foreground(g_vc, &is_foreground)) {
2337 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get is_foreground");
2338 return VC_ERROR_OPERATION_FAILED;
2341 if (is_foreground) {
2342 auth_state = VC_AUTH_STATE_VALID;
2344 auth_state = VC_AUTH_STATE_INVALID;
2347 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
2348 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2349 return VC_ERROR_OPERATION_FAILED;
2352 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2354 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
2356 return VC_ERROR_NONE;
2359 int vc_auth_disable(void)
2363 if (0 != vc_client_get_client_state(g_vc, &state)) {
2364 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2365 return VC_ERROR_INVALID_STATE;
2367 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", state);
2369 /* check authority */
2370 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2371 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2372 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2373 return VC_ERROR_INVALID_STATE;
2375 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] No authority");
2377 if (0 != vc_auth_unset_state_changed_cb()) {
2378 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
2381 /* request return authority by tidl */
2383 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2384 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2385 return VC_ERROR_OPERATION_FAILED;
2388 if (0 != vc_tidl_request_auth_disable(g_vc->handle, mgr_pid)) {
2389 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disable");
2390 return VC_ERROR_OPERATION_FAILED;
2393 /* unset authority from handle */
2394 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
2395 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2396 return VC_ERROR_OPERATION_FAILED;
2399 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2401 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
2403 return VC_ERROR_NONE;
2406 int vc_auth_get_state(vc_auth_state_e* state)
2409 vc_state_e vc_state;
2410 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
2411 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2412 return VC_ERROR_INVALID_STATE;
2414 RETVM_IF(VC_STATE_READY != vc_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", vc_state);
2417 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
2418 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
2419 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2420 return VC_ERROR_INVALID_STATE;
2425 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
2427 return VC_ERROR_NONE;
2430 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
2432 /* check parameter */
2433 if (NULL == callback) {
2434 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
2435 return VC_ERROR_INVALID_PARAMETER;
2439 vc_auth_state_e auth_state;
2440 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2441 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2442 return VC_ERROR_INVALID_STATE;
2444 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Auth is not enabled");
2446 /* set cb into handle */
2447 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
2448 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
2449 return VC_ERROR_OPERATION_FAILED;
2452 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
2454 return VC_ERROR_NONE;
2457 int vc_auth_unset_state_changed_cb(void)
2460 vc_auth_state_e auth_state;
2461 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2462 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2463 return VC_ERROR_INVALID_STATE;
2465 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Auth is not enabled");
2467 /* unset cb from handle */
2468 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
2469 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
2470 return VC_ERROR_OPERATION_FAILED;
2473 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
2475 return VC_ERROR_NONE;
2478 int vc_auth_start(void)
2480 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
2483 if (0 != vc_client_get_client_state(g_vc, &state)) {
2484 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2485 return VC_ERROR_INVALID_STATE;
2489 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2491 /* Check service state */
2492 vc_service_state_e service_state = -1;
2493 vc_client_get_service_state(g_vc, &service_state);
2494 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);
2496 /* Check authority */
2497 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2498 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2499 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2500 return VC_ERROR_OPERATION_FAILED;
2502 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2506 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2507 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2508 return VC_ERROR_OPERATION_FAILED;
2513 bool is_prepared = false;
2516 ret = vc_tidl_request_auth_start(g_vc->handle, mgr_pid);
2518 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2519 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2520 if (0 == vc_prepare_sync()) {
2522 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2524 } else if (VC_ERROR_TIMED_OUT != ret) {
2525 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
2528 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
2531 if (VC_RETRY_COUNT == count) {
2532 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2537 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
2541 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start DONE");
2546 int vc_auth_stop(void)
2548 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
2551 if (0 != vc_client_get_client_state(g_vc, &state)) {
2552 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2553 return VC_ERROR_INVALID_STATE;
2557 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2559 /* Check service state */
2560 vc_service_state_e service_state = -1;
2561 vc_client_get_service_state(g_vc, &service_state);
2562 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);
2564 /* Check authority */
2565 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2566 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2567 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2568 return VC_ERROR_OPERATION_FAILED;
2570 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2574 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2575 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2576 return VC_ERROR_OPERATION_FAILED;
2581 bool is_prepared = false;
2584 ret = vc_tidl_request_auth_stop(g_vc->handle, mgr_pid);
2586 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2587 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2588 if (0 == vc_prepare_sync()) {
2590 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2592 } else if (VC_ERROR_TIMED_OUT != ret) {
2593 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
2596 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
2599 if (VC_RETRY_COUNT == count) {
2600 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2605 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
2609 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop DONE");
2614 int vc_auth_cancel(void)
2616 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel");
2619 if (0 != vc_client_get_client_state(g_vc, &state)) {
2620 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2621 return VC_ERROR_INVALID_STATE;
2625 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2627 /* Check service state */
2628 vc_service_state_e service_state = -1;
2629 vc_client_get_service_state(g_vc, &service_state);
2630 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
2631 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
2632 return VC_ERROR_INVALID_STATE;
2635 /* Check authority */
2636 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2637 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2638 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2639 return VC_ERROR_OPERATION_FAILED;
2641 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2645 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2646 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2647 return VC_ERROR_OPERATION_FAILED;
2652 bool is_prepared = false;
2654 ret = vc_tidl_request_auth_cancel(g_vc->handle, mgr_pid);
2656 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2657 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2658 if (0 == vc_prepare_sync()) {
2660 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2662 } else if (VC_ERROR_TIMED_OUT != ret) {
2663 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
2666 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
2669 if (VC_RETRY_COUNT == count) {
2670 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2675 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
2679 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel DONE");
2684 static void __start_tts_streaming_thread(void* data, Ecore_Thread* thread)
2686 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Start tts streaming thread");
2688 vc_tts_streaming_cb callback = NULL;
2689 void* user_data = NULL;
2691 vc_client_get_tts_streaming_cb(g_vc, &callback, &user_data);
2692 RETM_IF(NULL == callback, TAG_VCC, "[WARNING] tts streaming callback is null");
2699 vc_tts_data_s *tts_data = NULL;
2700 ret = vc_data_get_first_tts_data(&tts_data);
2701 if (0 != ret || NULL == tts_data) {
2703 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] No tts data. Waiting mode");
2708 if (0 < vc_data_get_tts_data_size()) {
2709 SLOG(LOG_INFO, TAG_VCC, "[INFO] Resume thread");
2713 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Wrong request, there's no pcm data");
2714 vc_data_clear_tts_data(&tts_data);
2719 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish to wait for new tts data come");
2721 /* resume tts thread */
2722 vc_data_clear_tts_data(&tts_data);
2726 if (NULL != tts_data) {
2727 SLOG(LOG_DEBUG, TAG_VCC, "tts streaming callback is called");
2728 vc_client_use_callback(g_vc);
2729 callback(tts_data->event, tts_data->data, tts_data->data_size, tts_data->utt_id, user_data);
2730 vc_client_not_use_callback(g_vc);
2732 /* If no tts data and EVENT_FINISH */
2733 if (0 >= vc_data_get_tts_data_size() && VC_TTS_EVENT_FINISH == tts_data->event) {
2734 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish tts");
2743 static void __end_tts_streaming_thread(void* data, Ecore_Thread* thread)
2745 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] End tts streaming thread");
2746 g_tts_thread = NULL;
2749 int __vc_cb_tts_streaming(int utt_id, vc_tts_event_e event, char* buffer, int len)
2752 vc_tts_data_s* temp_tts_data = NULL;
2753 temp_tts_data = (vc_tts_data_s*)calloc(1, sizeof(vc_tts_data_s));
2754 RETVM_IF(NULL == temp_tts_data, VC_ERROR_OUT_OF_MEMORY, TAG_VCC, "[ERROR] Out of memory");
2756 temp_tts_data->data = NULL;
2757 temp_tts_data->data_size = 0;
2760 temp_tts_data->data = (char*)calloc(len + 5, sizeof(char));
2761 if (NULL != temp_tts_data->data) {
2762 memcpy(temp_tts_data->data, buffer, len);
2763 temp_tts_data->data_size = len;
2764 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG][memcpy] data(%p) size(%d)",
2765 temp_tts_data->data, temp_tts_data->data_size);
2767 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to allocate memory");
2770 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] tts data is NULL");
2773 temp_tts_data->utt_id = utt_id;
2774 temp_tts_data->event = event;
2776 int ret = vc_data_add_tts_data(temp_tts_data);
2778 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to add tts data");
2779 FREE(temp_tts_data->data);
2780 FREE(temp_tts_data);
2783 bool is_canceled = ecore_thread_check(g_tts_thread);
2784 if (NULL == g_tts_thread || TRUE == is_canceled) {
2785 SLOG(LOG_INFO, TAG_VCC, "ecore thread run : __start_tts_streaming_thread ");
2786 g_tts_thread = ecore_thread_run(__start_tts_streaming_thread, __end_tts_streaming_thread, NULL, NULL);
2792 int vc_tts_request(const char* text, const char* language, bool to_vc_manager, int* utt_id)
2798 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request tts");
2800 if (0 != __vc_get_feature_enabled()) {
2801 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2803 if (0 != __vc_check_privilege()) {
2804 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2807 if (0 != vc_client_get_client_state(g_vc, &state)) {
2808 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2809 return VC_ERROR_INVALID_STATE;
2813 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2815 /* Check service state */
2816 vc_service_state_e service_state = -1;
2817 vc_client_get_service_state(g_vc, &service_state);
2818 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);
2820 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts request, pid(%d), text(%s), language(%s), to_vc_manager(%d)", pid, text, language, to_vc_manager);
2823 bool is_prepared = false;
2825 ret = vc_tidl_request_request_tts(pid, text, language, to_vc_manager, utt_id);
2827 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2828 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2829 if (0 == vc_prepare_sync()) {
2831 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2833 } else if (VC_ERROR_TIMED_OUT != ret) {
2834 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request tts to vc service : %s", __vc_get_error_code(ret));
2837 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request tts : %s", __vc_get_error_code(ret));
2840 if (VC_RETRY_COUNT == count) {
2841 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2848 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request tts DONE");
2853 int vc_tts_cancel(int utt_id)
2859 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Cancel tts");
2861 if (0 != __vc_get_feature_enabled()) {
2862 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2864 if (0 != __vc_check_privilege()) {
2865 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2868 if (0 != vc_client_get_client_state(g_vc, &state)) {
2869 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2870 return VC_ERROR_INVALID_STATE;
2874 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2876 /* Check service state */
2877 vc_service_state_e service_state = -1;
2878 vc_client_get_service_state(g_vc, &service_state);
2879 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);
2881 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts cancel, pid(%d), utt_id(%d)", pid, utt_id);
2883 ret = vc_data_clear_tts_data_by_uttid(utt_id);
2885 SLOG(LOG_INFO, TAG_VCC, "[INFO] There's no data in client pcm queue");
2889 bool is_prepared = false;
2891 ret = vc_tidl_request_cancel_tts(pid, utt_id);
2893 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2894 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2895 if (0 == vc_prepare_sync()) {
2897 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2899 } else if (VC_ERROR_TIMED_OUT != ret) {
2900 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel tts to vc service : %s", __vc_get_error_code(ret));
2903 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel tts : %s", __vc_get_error_code(ret));
2906 if (VC_RETRY_COUNT == count) {
2907 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel");
2914 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Cancel tts DONE");
2919 int vc_tts_get_synthesized_audio_details(int* rate, vc_audio_channel_e* channel, vc_audio_type_e* audio_type)
2925 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Get tts audio format");
2927 if (0 != __vc_get_feature_enabled()) {
2928 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2930 if (0 != __vc_check_privilege()) {
2931 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2934 if (0 != vc_client_get_client_state(g_vc, &state)) {
2935 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2936 return VC_ERROR_INVALID_STATE;
2940 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2942 /* Check service state */
2943 vc_service_state_e service_state = -1;
2944 vc_client_get_service_state(g_vc, &service_state);
2945 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);
2947 SLOG(LOG_DEBUG, TAG_VCC, "@@@ get tts audio format, pid(%d)", pid);
2950 bool is_prepared = false;
2952 ret = vc_tidl_request_get_tts_audio_format(pid, rate, channel, audio_type);
2954 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2955 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2956 if (0 == vc_prepare_sync()) {
2958 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2960 } else if (VC_ERROR_TIMED_OUT != ret) {
2961 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format : %s", __vc_get_error_code(ret));
2964 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to get tts audio format : %s", __vc_get_error_code(ret));
2967 if (VC_RETRY_COUNT == count) {
2968 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format");
2975 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Get tts audio format DONE");
2980 int vc_tts_set_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
2982 if (0 != __vc_get_feature_enabled()) {
2983 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2985 if (0 != __vc_check_privilege()) {
2986 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2989 if (NULL == callback)
2990 return VC_ERROR_INVALID_PARAMETER;
2993 if (0 != vc_client_get_client_state(g_vc, &state)) {
2994 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : A handle is not available");
2995 return VC_ERROR_INVALID_STATE;
2999 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3001 vc_client_set_tts_streaming_cb(g_vc, callback, user_data);
3003 return VC_ERROR_NONE;
3006 int vc_tts_unset_streaming_cb(void)
3008 if (0 != __vc_get_feature_enabled()) {
3009 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3011 if (0 != __vc_check_privilege()) {
3012 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3016 if (0 != vc_client_get_client_state(g_vc, &state)) {
3017 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : A handle is not available");
3018 return VC_ERROR_INVALID_STATE;
3022 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3024 vc_client_set_tts_streaming_cb(g_vc, NULL, NULL);
3026 return VC_ERROR_NONE;
3029 int __vc_cb_utterance_status(int utt_id, int utt_status)
3031 vc_tts_utterance_status_cb callback = NULL;
3032 void* user_data = NULL;
3034 vc_client_get_tts_utterance_status_cb(g_vc, &callback, &user_data);
3035 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Utterance status callback is null");
3037 SLOG(LOG_DEBUG, TAG_VCC, "Utterance status callback is called");
3038 vc_client_use_callback(g_vc);
3039 callback(utt_id, (vc_tts_utterance_status_e)utt_status, user_data);
3040 vc_client_not_use_callback(g_vc);
3042 return VC_ERROR_NONE;
3045 int vc_tts_set_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
3047 if (0 != __vc_get_feature_enabled()) {
3048 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3050 if (0 != __vc_check_privilege()) {
3051 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3054 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Utterance status callback is null");
3057 if (0 != vc_client_get_client_state(g_vc, &state)) {
3058 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : A handle is not available");
3059 return VC_ERROR_INVALID_STATE;
3063 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3065 vc_client_set_tts_utterance_status_cb(g_vc, callback, user_data);
3067 return VC_ERROR_NONE;
3070 int vc_tts_unset_utterance_status_cb(void)
3072 if (0 != __vc_get_feature_enabled()) {
3073 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3075 if (0 != __vc_check_privilege()) {
3076 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3080 if (0 != vc_client_get_client_state(g_vc, &state)) {
3081 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : A handle is not available");
3082 return VC_ERROR_INVALID_STATE;
3086 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3088 vc_client_set_tts_utterance_status_cb(g_vc, NULL, NULL);
3090 return VC_ERROR_NONE;