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, "@@@");
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 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
455 return VC_ERROR_INVALID_STATE;
459 vc_client_get_client_state(g_vc, &state);
464 __vc_internal_unprepare();
465 /* no break. need to next step*/
466 case VC_STATE_INITIALIZED:
467 if (NULL != g_connect_timer) {
468 SLOG(LOG_DEBUG, TAG_VCC, "Connect Timer is deleted"); //LCOV_EXCL_LINE
469 ecore_timer_del(g_connect_timer);
470 g_connect_timer = NULL;
473 vc_config_mgr_unset_lang_cb(g_vc->handle);
474 vc_config_mgr_finalize(g_vc->handle);
476 /* Free client resources */
477 vc_client_destroy(g_vc);
484 SLOG(LOG_INFO, TAG_VCC, "Success: destroy");
486 if (true == g_backup) {
487 ret = vc_db_backup_command();
489 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to backup command, ret(%d)", ret); //LCOV_EXCL_LINE
493 ret = vc_db_finalize();
495 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB, ret(%d)", ret); //LCOV_EXCL_LINE
498 if (0 != vc_tidl_close_connection()) {
499 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection"); //LCOV_EXCL_LINE
502 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
504 return VC_ERROR_NONE;
507 static Eina_Bool __vc_connect_daemon(void *data)
509 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon");
511 /* request initialization */
514 int service_state = 0;
516 g_connect_timer = NULL;
519 if (true == vc_client_is_valid(g_vc)) {
520 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] g_vc is valid");
523 ret = vc_db_initialize();
525 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize DB : %d", ret); //LCOV_EXCL_LINE
529 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
531 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
533 ret = vc_tidl_request_initialize(g_vc->handle, &mgr_pid, &service_state, &g_daemon_pid);
535 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
536 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
538 vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND);
539 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
543 } else if (0 != ret) {
544 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
546 vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT);
547 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
549 ret = vc_db_finalize();
551 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB : %d", ret); //LCOV_EXCL_LINE
556 /* Success to connect */
559 /* Set service state */
560 vc_service_state_e previous_service_state;
561 vc_client_get_service_state(g_vc, &previous_service_state);
563 vc_client_set_service_state(g_vc, (vc_service_state_e)service_state);
565 vc_service_state_changed_cb service_changed_callback = NULL;
566 void* user_data = NULL;
567 vc_client_get_service_state_changed_cb(g_vc, &service_changed_callback, &user_data);
569 if (NULL != service_changed_callback) {
570 vc_client_use_callback(g_vc);
571 service_changed_callback(previous_service_state, service_state, user_data);
572 vc_client_not_use_callback(g_vc);
573 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called"); //LCOV_EXCL_LINE
575 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null"); //LCOV_EXCL_LINE
578 /* Register focus handler */
579 ecore_thread_main_loop_begin();
580 g_focus_in_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_IN, __focus_changed_cb, NULL);
581 g_focus_out_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_OUT, __focus_changed_cb, NULL);
582 ecore_thread_main_loop_end();
584 char appid[1024] = {'\0',};
585 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1);
587 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get aul_app_get_appid_bypid : %d", ret);
589 int status = aul_app_get_status(appid);
590 if (STATUS_FOCUS == status) {
591 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground"); //LCOV_EXCL_LINE
592 ret = vc_tidl_request_set_foreground(getpid(), true);
594 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret); //LCOV_EXCL_LINE
597 ret = vc_client_set_is_foreground(g_vc, true);
599 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret); //LCOV_EXCL_LINE
602 /* set authority valid */
603 vc_auth_state_e state = VC_AUTH_STATE_NONE;
604 if (0 != vc_client_get_auth_state(g_vc, &state)) {
605 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
607 if (VC_AUTH_STATE_INVALID == state) {
608 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
610 /* notify auth changed cb */
611 ecore_idler_add(__notify_auth_changed_cb, NULL);
615 vc_client_set_client_state(g_vc, VC_STATE_READY);
616 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
618 vc_client_set_mgr_pid(g_vc, mgr_pid);
620 SLOG(LOG_ERROR, TAG_VCC, "[Not ERROR] g_vc is not valid. It is destroyed."); //LCOV_EXCL_LINE
624 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
629 static void __start_prepare_thread(void *data, Ecore_Thread *thread)
631 SLOG(LOG_ERROR, TAG_VCC, "@@@ Start prepare thread");
632 int ret = -1, retry_count = 0;
636 if (retry_count == 20) { // 200 ms * 20 = 4 sec
637 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!"); //LCOV_EXCL_LINE
641 ret = vc_tidl_request_hello();
643 SLOG(LOG_DEBUG, TAG_VCC, "Success to request hello. retry count(%d)", retry_count);
654 if (retry_count == 10) {
655 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon !!"); //LCOV_EXCL_LINE
658 ret = __vc_connect_daemon(NULL);
668 static void __end_prepare_thread(void *data, Ecore_Thread *thread)
670 SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread");
675 if (0 != __vc_get_feature_enabled()) {
676 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
678 if (0 != __vc_check_privilege()) {
679 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
682 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
685 if (0 != vc_client_get_client_state(g_vc, &state)) {
686 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available"); //LCOV_EXCL_LINE
687 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
688 return VC_ERROR_INVALID_STATE;
692 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
694 ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, NULL);
697 return VC_ERROR_NONE;
701 int vc_prepare_sync(void)
703 if (0 != __vc_get_feature_enabled()) {
704 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
706 if (0 != __vc_check_privilege()) {
707 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
710 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
713 if (0 != vc_client_get_client_state(g_vc, &state)) {
714 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
715 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
716 return VC_ERROR_INVALID_STATE;
720 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
723 while (EINA_TRUE == __vc_connect_daemon(NULL) && VC_CONNECTION_RETRY_COUNT > cnt) {
727 RETVM_IF(VC_CONNECTION_RETRY_COUNT == cnt, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Fail to connect daemon");
729 return VC_ERROR_NONE;
733 int vc_unprepare(void)
735 if (0 != __vc_get_feature_enabled()) {
736 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
738 if (0 != __vc_check_privilege()) {
739 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
742 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare");
745 if (0 != vc_client_get_client_state(g_vc, &state)) {
746 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
747 return VC_ERROR_INVALID_STATE;
751 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
753 __vc_internal_unprepare();
755 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
756 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
758 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare DONE");
760 return VC_ERROR_NONE;
763 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
765 if (0 != __vc_get_feature_enabled()) {
766 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
768 if (0 != __vc_check_privilege()) {
769 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
772 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
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;
781 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language");
785 ret = vc_config_mgr_get_language_list(callback, user_data);
787 ret = vc_config_convert_error_code((vc_config_error_e)ret);
788 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
791 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language DONE");
793 return VC_ERROR_NONE;
797 int vc_get_current_language(char** language)
799 if (0 != __vc_get_feature_enabled()) {
800 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
802 if (0 != __vc_check_privilege()) {
803 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
806 RETVM_IF(NULL == language, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
809 if (0 != vc_client_get_client_state(g_vc, &state)) {
810 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
811 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
812 return VC_ERROR_INVALID_STATE;
816 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language");
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, "@@@ [Client] Get Current Language DONE");
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 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
842 if (0 != vc_client_get_client_state(g_vc, &temp)) {
843 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not valid");
844 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
845 return VC_ERROR_INVALID_STATE;
849 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State");
855 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
856 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
857 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
858 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
862 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State DONE");
864 return VC_ERROR_NONE;
867 int vc_get_service_state(vc_service_state_e* state)
869 if (0 != __vc_get_feature_enabled()) {
870 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
872 if (0 != __vc_check_privilege()) {
873 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
876 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
879 if (0 != vc_client_get_client_state(g_vc, &temp)) {
880 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
881 return VC_ERROR_INVALID_STATE;
884 RETVM_IF(VC_STATE_READY != temp, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", temp);
886 /* get service state */
887 vc_service_state_e service_state;
888 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
889 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state"); //LCOV_EXCL_LINE
890 return VC_ERROR_OPERATION_FAILED;
894 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State");
896 *state = service_state;
900 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break;
901 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
902 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
903 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
904 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
908 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State DONE");
910 return VC_ERROR_NONE;
913 int vc_get_system_command_list(vc_cmd_list_h* vc_sys_cmd_list)
915 if (0 != __vc_get_feature_enabled()) {
916 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
918 if (0 != __vc_check_privilege()) {
919 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
922 RETVM_IF(NULL == vc_sys_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
923 *vc_sys_cmd_list = NULL;
926 if (0 != vc_client_get_client_state(g_vc, &state)) {
927 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
928 return VC_ERROR_INVALID_STATE;
932 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
934 /* Check service state */
935 vc_service_state_e service_state = -1;
936 vc_client_get_service_state(g_vc, &service_state);
937 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);
940 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list");
942 bool is_sys_cmd_valid = false;
945 bool is_prepared = false;
947 ret = vc_tidl_request_is_system_command_valid(g_vc->handle, &is_sys_cmd_valid);
950 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
951 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
952 if (0 == vc_prepare_sync()) {
954 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
956 } else if (VC_ERROR_TIMED_OUT != ret) {
957 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to ask system command is : %s", __vc_get_error_code(ret));
960 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to ask system command is : %s", __vc_get_error_code(ret));
963 if (VC_RETRY_COUNT == count) {
964 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
973 ret = vc_client_get_mgr_pid(g_vc, &mgr_pid);
975 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get the manager pid"); //LCOV_EXCL_LINE
976 return VC_ERROR_OPERATION_FAILED;
979 if (true == is_sys_cmd_valid) {
980 vc_cmd_list_s* list = NULL;
981 ret = vc_cmd_list_create((vc_cmd_list_h*)&list);
983 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
987 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, &(list->list));
989 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
990 vc_cmd_list_destroy((vc_cmd_list_h)list, true);
994 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &(list->list));
996 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
997 vc_cmd_list_destroy((vc_cmd_list_h)list, true);
1001 *vc_sys_cmd_list = (vc_cmd_list_h)list;
1003 SLOG(LOG_WARN, TAG_VCC, "[WARNING] No system commands"); //LCOV_EXCL_LINE
1004 return VC_ERROR_NONE;
1007 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list DONE");
1014 * @brief Checks whether the command format is supported.
1015 * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
1017 * @param[in] format The command format
1018 * @param[out] support The result status @c true = supported, @c false = not supported
1020 * @return 0 on success, otherwise a negative error value
1021 * @retval #VC_ERROR_NONE Successful
1022 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1023 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
1024 * @retval #VC_ERROR_INVALID_STATE Invalid state
1026 * @pre The state should be #VC_STATE_READY.
1028 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
1030 if (0 != __vc_get_feature_enabled()) {
1031 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1033 if (0 != __vc_check_privilege()) {
1034 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1037 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported");
1040 if (0 != vc_client_get_client_state(g_vc, &state)) {
1041 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1042 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1043 return VC_ERROR_INVALID_STATE;
1047 bool non_fixed_support = false;
1048 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
1049 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
1053 case VC_CMD_FORMAT_FIXED: *support = true; break;
1054 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
1055 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
1056 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
1057 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
1058 default: *support = false; break;
1061 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
1063 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported DONE");
1065 return VC_ERROR_NONE;
1069 static int __vc_get_invocation_name(char** invocation_name)
1071 int ret = vc_client_get_invocation_name(g_vc, invocation_name);
1073 SLOG(LOG_WARN, TAG_VCC, "Fail to get invocation name"); //LCOV_EXCL_LINE
1074 return ret; //LCOV_EXCL_LINE
1077 if (NULL == *invocation_name) {
1078 char* temp_label = NULL;
1082 ret = app_manager_get_app_id(getpid(), &appid);
1083 if (0 != ret || NULL == appid) {
1085 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get appid, ret(%d)", ret); //LCOV_EXCL_LINE
1087 return VC_ERROR_OPERATION_FAILED;
1091 ret = vc_get_current_language(&lang);
1092 if (0 != ret || NULL == lang) {
1093 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current language, ret(%d)", ret); //LCOV_EXCL_LINE
1096 return VC_ERROR_OPERATION_FAILED;
1099 ret = app_info_get_localed_label(appid, lang, &temp_label);
1100 if (0 != ret || NULL == temp_label) {
1102 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get localed label, ret(%d) appid(%s) lang(%s)", ret, appid, lang); //LCOV_EXCL_LINE
1106 return VC_ERROR_OPERATION_FAILED;
1110 *invocation_name = strdup(temp_label);
1111 if (NULL == *invocation_name) {
1112 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE
1116 return VC_ERROR_OUT_OF_MEMORY;
1124 SLOG(LOG_DEBUG, TAG_VCC, "Get invocation name(%s)", *invocation_name);
1125 return VC_ERROR_NONE;
1128 void __set_command(vc_h vc, vc_cmd_type_e type)
1132 bool is_prepared = false;
1134 ret = vc_tidl_request_set_command(vc->handle, type);
1137 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1138 vc_client_set_client_state(vc, VC_STATE_INITIALIZED);
1139 if (0 == vc_prepare_sync()) {
1141 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1143 } else if (VC_ERROR_TIMED_OUT != ret) {
1144 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1147 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1150 if (VC_RETRY_COUNT == count) {
1151 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1162 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
1164 if (0 != __vc_get_feature_enabled()) {
1165 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1167 if (0 != __vc_check_privilege()) {
1168 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1171 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Input parameter is NULL");
1174 if (0 != vc_client_get_client_state(g_vc, &state)) {
1175 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1176 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1177 return VC_ERROR_INVALID_STATE;
1181 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1184 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list");
1187 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1188 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type); //LCOV_EXCL_LINE
1189 return VC_ERROR_INVALID_PARAMETER;
1192 vc_cmd_list_s* list = NULL;
1193 list = (vc_cmd_list_s*)vc_cmd_list;
1194 RETVM_IF(NULL == list->list, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Invalid command list");
1197 char* invocation_name = NULL;
1198 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1199 ret = __vc_get_invocation_name(&invocation_name);
1200 if (0 != ret || NULL == invocation_name) {
1201 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret); //LCOV_EXCL_LINE
1206 ret = vc_cmd_parser_delete_file(getpid(), type);
1208 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1210 ret = vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list, invocation_name);
1212 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
1214 __set_command(g_vc, (vc_cmd_type_e)type);
1217 FREE(invocation_name);
1219 if (VC_COMMAND_TYPE_BACKGROUND == type)
1222 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list DONE");
1227 int vc_unset_command_list(int type)
1229 if (0 != __vc_get_feature_enabled()) {
1230 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1232 if (0 != __vc_check_privilege()) {
1233 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1237 if (0 != vc_client_get_client_state(g_vc, &state)) {
1238 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1239 return VC_ERROR_INVALID_STATE;
1243 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1246 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list");
1250 bool is_prepared = false;
1252 ret = vc_tidl_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
1255 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1256 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1257 if (0 == vc_prepare_sync()) {
1259 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1261 } else if (VC_ERROR_TIMED_OUT != ret) {
1262 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
1265 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
1268 if (VC_RETRY_COUNT == count) {
1269 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1277 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
1279 ret = vc_config_convert_error_code((vc_config_error_e)ret);
1280 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret)); //LCOV_EXCL_LINE
1283 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list DONE");
1289 int vc_set_command_list_from_file(const char* file_path, int type)
1291 if (0 != __vc_get_feature_enabled()) {
1292 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1294 if (0 != __vc_check_privilege()) {
1295 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1299 if (0 != vc_client_get_client_state(g_vc, &state)) {
1300 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1301 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1302 return VC_ERROR_INVALID_STATE;
1306 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1309 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1310 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1311 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1312 return VC_ERROR_INVALID_PARAMETER;
1316 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file");
1319 char* invocation_name = NULL;
1320 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1321 ret = __vc_get_invocation_name(&invocation_name);
1322 if (0 != ret || NULL == invocation_name) {
1323 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1328 ret = vc_cmd_parser_delete_file(getpid(), type);
1330 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1332 ret = vc_json_set_commands_from_file(file_path, (vc_cmd_type_e)type, invocation_name);
1334 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set commands from file : %s", __vc_get_error_code(ret));
1336 __set_command(g_vc, (vc_cmd_type_e)type);
1339 FREE(invocation_name);
1341 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file DONE");
1347 int vc_get_exclusive_command_option(bool* value)
1349 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get exclusive command");
1352 if (0 != vc_client_get_client_state(g_vc, &state)) {
1353 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1354 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1355 return VC_ERROR_INVALID_STATE;
1359 if (state != VC_STATE_READY) {
1360 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1361 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1362 return VC_ERROR_INVALID_STATE;
1365 int ret = vc_client_get_exclusive_cmd(g_vc, value);
1367 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1368 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1372 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1377 int vc_set_exclusive_command_option(bool value)
1379 if (0 != __vc_get_feature_enabled()) {
1380 return VC_ERROR_NOT_SUPPORTED;
1382 if (0 != __vc_check_privilege()) {
1383 return VC_ERROR_PERMISSION_DENIED;
1386 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set exclusive command");
1389 if (0 != vc_client_get_client_state(g_vc, &state)) {
1390 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1391 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1392 return VC_ERROR_INVALID_STATE;
1396 if (state != VC_STATE_READY) {
1397 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1398 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1399 return VC_ERROR_INVALID_STATE;
1402 int ret = vc_client_set_exclusive_cmd(g_vc, value);
1404 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1405 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1411 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
1413 if (VC_ERROR_TIMED_OUT != ret) {
1414 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
1417 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
1420 if (VC_RETRY_COUNT == count) {
1421 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1428 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1435 int vc_request_start(bool stop_by_silence)
1437 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
1440 if (0 != vc_client_get_client_state(g_vc, &state)) {
1441 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1442 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1443 return VC_ERROR_INVALID_STATE;
1447 if (state != VC_STATE_READY) {
1448 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1449 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1450 return VC_ERROR_INVALID_STATE;
1453 /* Check service state */
1454 vc_service_state_e service_state = -1;
1455 vc_client_get_service_state(g_vc, &service_state);
1456 if (service_state != VC_SERVICE_STATE_READY) {
1457 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1458 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1459 return VC_ERROR_INVALID_STATE;
1469 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1471 if (VC_ERROR_TIMED_OUT != ret) {
1472 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1475 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1478 if (VC_RETRY_COUNT == count) {
1479 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1484 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1488 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1493 int vc_request_stop(void)
1495 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
1498 if (0 != vc_client_get_client_state(g_vc, &state)) {
1499 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1500 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1501 return VC_ERROR_INVALID_STATE;
1505 if (state != VC_STATE_READY) {
1506 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1507 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1508 return VC_ERROR_INVALID_STATE;
1511 /* Check service state */
1512 vc_service_state_e service_state = -1;
1513 vc_client_get_service_state(g_vc, &service_state);
1514 if (service_state != VC_SERVICE_STATE_RECORDING) {
1515 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1516 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1517 return VC_ERROR_INVALID_STATE;
1524 ret = vc_dbus_request_stop(g_vc->handle);
1526 if (VC_ERROR_TIMED_OUT != ret) {
1527 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1530 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1533 if (VC_RETRY_COUNT == count) {
1534 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1539 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1543 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1548 int vc_request_cancel(void)
1550 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel Interrupt");
1553 if (0 != vc_client_get_client_state(g_vc, &state)) {
1554 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1555 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1556 return VC_ERROR_INVALID_STATE;
1560 if (state != VC_STATE_READY) {
1561 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1562 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1563 return VC_ERROR_INVALID_STATE;
1566 /* Check service state */
1567 vc_service_state_e service_state = -1;
1568 vc_client_get_service_state(g_vc, &service_state);
1569 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1570 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1571 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1572 return VC_ERROR_INVALID_STATE;
1578 ret = vc_dbus_request_cancel(g_vc->handle);
1580 if (VC_ERROR_TIMED_OUT != ret) {
1581 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1584 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel 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] Cancel interrupt");
1597 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1604 static void __vc_notify_error(void *data)
1606 vc_h vc = (vc_h)data;
1608 vc_error_cb callback = NULL;
1612 vc_client_get_error_cb(vc, &callback, &user_data);
1613 vc_client_get_error(vc, &reason);
1615 if (NULL != callback) {
1616 vc_client_use_callback(vc);
1617 callback(reason, user_data);
1618 vc_client_not_use_callback(vc);
1619 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1621 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1625 int __vc_cb_error(int reason, int daemon_pid, char* msg)
1628 if (0 != vc_client_get_client_state(g_vc, &state)) {
1629 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid client");
1630 return VC_ERROR_INVALID_PARAMETER;
1634 if (state != VC_STATE_READY) {
1635 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] State is not READY");
1636 if (VC_ERROR_SERVICE_RESET != reason) {
1637 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] not connected client yet(%d)", reason);
1638 return VC_ERROR_INVALID_STATE;
1640 return VC_ERROR_NONE;
1643 if (VC_ERROR_SERVICE_RESET == reason) {
1644 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset");
1646 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1647 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
1649 if (0 != vc_prepare()) {
1650 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare");
1654 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1656 vc_client_set_error(g_vc, reason);
1657 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
1659 return VC_ERROR_NONE;
1662 int __vc_cb_error_to_app(int pid, int reason, const char* msg)
1664 SLOG(LOG_INFO, TAG_VCC, "[INFO] send error to app(%d)", pid);
1667 if (0 != vc_client_get_handle(pid, &vc)) {
1668 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get vc handle");
1669 return VC_ERROR_INVALID_PARAMETER;
1672 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1674 vc_client_set_error(vc, reason);
1675 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)vc);
1677 return VC_ERROR_NONE;
1680 static void __vc_notify_state_changed(void *data)
1682 vc_h vc = (vc_h)data;
1684 vc_state_changed_cb changed_callback = NULL;
1687 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1689 vc_state_e current_state;
1690 vc_state_e before_state;
1692 vc_client_get_before_state(vc, ¤t_state, &before_state);
1694 if (NULL != changed_callback) {
1695 vc_client_use_callback(vc);
1696 changed_callback(before_state, current_state, user_data);
1697 vc_client_not_use_callback(vc);
1698 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1700 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1704 static Eina_Bool __vc_notify_result(void *data)
1708 vc_cmd_list_h vc_cmd_list = NULL;
1710 vc_result_cb callback = NULL;
1711 void* user_data = NULL;
1713 vc_client_get_result_cb(g_vc, &callback, &user_data);
1715 RETVM_IF(NULL == callback, EINA_FALSE, TAG_VCC, "[ERROR] Client result callback is NULL");
1717 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1718 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1722 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1724 SECURE_SLOG(LOG_INFO, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1726 vc_cmd_print_list(vc_cmd_list);
1728 vc_client_use_callback(g_vc);
1729 callback(event, vc_cmd_list, temp_text, user_data);
1730 vc_client_not_use_callback(g_vc);
1732 SLOG(LOG_INFO, TAG_VCC, "Client result callback called");
1734 vc_cmd_list_destroy(vc_cmd_list, true);
1737 /* Release result */
1743 void __vc_cb_result(void)
1745 ecore_timer_add(0, __vc_notify_result, NULL);
1751 int vc_get_result(vc_result_cb callback, void* user_data)
1753 if (0 != __vc_get_feature_enabled()) {
1754 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1756 if (0 != __vc_check_privilege()) {
1757 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1761 if (0 != vc_client_get_client_state(g_vc, &state)) {
1762 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1763 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1764 return VC_ERROR_INVALID_STATE;
1768 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1770 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client result callback is NULL");
1773 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result");
1775 char* temp_text = NULL;
1777 vc_cmd_list_h vc_cmd_list = NULL;
1779 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1780 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
1781 return VC_ERROR_INVALID_PARAMETER;
1784 int ret = vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1785 if (0 != ret || NULL == temp_text) {
1786 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get result, ret(%d) temp_text(%s)", ret, temp_text); //LCOV_EXCL_LINE
1790 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event); //LCOV_EXCL_LINE
1792 vc_cmd_print_list(vc_cmd_list);
1794 vc_client_use_callback(g_vc);
1795 callback(event, vc_cmd_list, temp_text, user_data);
1796 vc_client_not_use_callback(g_vc);
1798 vc_cmd_list_destroy(vc_cmd_list, true);
1801 /* Release result */
1804 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result DONE");
1806 return VC_ERROR_NONE;
1809 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1811 if (0 != __vc_get_feature_enabled()) {
1812 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1814 if (0 != __vc_check_privilege()) {
1815 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1818 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client result callback is NULL");
1821 if (0 != vc_client_get_client_state(g_vc, &state)) {
1822 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1823 return VC_ERROR_INVALID_STATE;
1827 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1829 vc_client_set_result_cb(g_vc, callback, user_data);
1831 return VC_ERROR_NONE;
1834 int vc_unset_result_cb(void)
1836 if (0 != __vc_get_feature_enabled()) {
1837 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1839 if (0 != __vc_check_privilege()) {
1840 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1844 if (0 != vc_client_get_client_state(g_vc, &state)) {
1845 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1846 return VC_ERROR_INVALID_STATE;
1850 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1852 vc_client_set_result_cb(g_vc, NULL, NULL);
1854 return VC_ERROR_NONE;
1858 int __vc_cb_service_state(int state)
1860 vc_service_state_e current_state = (vc_service_state_e)state;
1861 vc_service_state_e before_state;
1862 vc_client_get_service_state(g_vc, &before_state);
1864 if (current_state == before_state) {
1865 return VC_ERROR_NONE;
1868 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
1869 before_state, current_state);
1871 /* Save service state */
1872 vc_client_set_service_state(g_vc, current_state);
1874 vc_service_state_changed_cb callback = NULL;
1875 void* service_user_data;
1876 vc_client_get_service_state_changed_cb(g_vc, &callback, &service_user_data);
1878 if (NULL != callback) {
1879 vc_client_use_callback(g_vc);
1880 callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
1881 vc_client_not_use_callback(g_vc);
1882 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
1884 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null");
1887 return VC_ERROR_NONE;
1890 int __vc_cb_manager_pid(int manager_pid)
1892 SLOG(LOG_DEBUG, TAG_VCC, "Manager pid is changed : %d", manager_pid); //LCOV_EXCL_LINE
1894 /* Save service state */
1895 vc_client_set_mgr_pid(g_vc, manager_pid);
1897 return VC_ERROR_NONE;
1901 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
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
1910 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client service state changed callback is NULL");
1913 if (0 != vc_client_get_client_state(g_vc, &state)) {
1914 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1915 return VC_ERROR_INVALID_STATE;
1919 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1921 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
1923 return VC_ERROR_NONE;
1926 int vc_unset_service_state_changed_cb(void)
1928 if (0 != __vc_get_feature_enabled()) {
1929 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1931 if (0 != __vc_check_privilege()) {
1932 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1936 if (0 != vc_client_get_client_state(g_vc, &state)) {
1937 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1938 return VC_ERROR_INVALID_STATE;
1942 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1944 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
1946 return VC_ERROR_NONE;
1949 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1951 if (0 != __vc_get_feature_enabled()) {
1952 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1954 if (0 != __vc_check_privilege()) {
1955 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1958 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client state changed callback is NULL");
1961 if (0 != vc_client_get_client_state(g_vc, &state)) {
1962 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
1963 return VC_ERROR_INVALID_STATE;
1967 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1969 vc_client_set_state_changed_cb(g_vc, callback, user_data);
1971 return VC_ERROR_NONE;
1974 int vc_unset_state_changed_cb(void)
1976 if (0 != __vc_get_feature_enabled()) {
1977 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
1979 if (0 != __vc_check_privilege()) {
1980 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1984 if (0 != vc_client_get_client_state(g_vc, &state)) {
1985 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
1986 return VC_ERROR_INVALID_STATE;
1990 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1992 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
1994 return VC_ERROR_NONE;
1997 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
1999 if (0 != __vc_get_feature_enabled()) {
2000 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2002 if (0 != __vc_check_privilege()) {
2003 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2006 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client current language changed callback is NULL");
2009 if (0 != vc_client_get_client_state(g_vc, &state)) {
2010 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
2011 return VC_ERROR_INVALID_STATE;
2015 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2017 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
2019 return VC_ERROR_NONE;
2022 int vc_unset_current_language_changed_cb(void)
2024 if (0 != __vc_get_feature_enabled()) {
2025 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2027 if (0 != __vc_check_privilege()) {
2028 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2032 if (0 != vc_client_get_client_state(g_vc, &state)) {
2033 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
2034 return VC_ERROR_INVALID_STATE;
2038 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2040 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
2042 return VC_ERROR_NONE;
2045 int vc_set_error_cb(vc_error_cb callback, void* user_data)
2047 if (0 != __vc_get_feature_enabled()) {
2048 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2050 if (0 != __vc_check_privilege()) {
2051 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2054 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Client error callback is NULL");
2057 if (0 != vc_client_get_client_state(g_vc, &state)) {
2058 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
2059 return VC_ERROR_INVALID_STATE;
2063 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2065 vc_client_set_error_cb(g_vc, callback, user_data);
2067 return VC_ERROR_NONE;
2070 int vc_unset_error_cb(void)
2072 if (0 != __vc_get_feature_enabled()) {
2073 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2075 if (0 != __vc_check_privilege()) {
2076 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2080 if (0 != vc_client_get_client_state(g_vc, &state)) {
2081 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
2082 return VC_ERROR_INVALID_STATE;
2086 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2088 vc_client_set_error_cb(g_vc, NULL, NULL);
2090 return VC_ERROR_NONE;
2093 int vc_set_invocation_name(const char* name)
2095 if (0 != __vc_get_feature_enabled()) {
2096 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2098 if (0 != __vc_check_privilege()) {
2099 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2103 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set invocation name");
2105 int ret = vc_client_get_client_state(g_vc, &state);
2107 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2108 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2113 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2115 ret = vc_client_set_invocation_name(g_vc, name);
2117 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set invocation name");
2123 int vc_set_server_dialog(const char* app_id, const char* credential)
2128 if (0 != __vc_get_feature_enabled()) {
2129 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2131 if (0 != __vc_check_privilege()) {
2132 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2135 RETVM_IF(NULL == credential, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Credential is NULL");
2137 if (0 != vc_client_get_client_state(g_vc, &state)) {
2138 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2139 return VC_ERROR_INVALID_STATE;
2143 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2145 /* Check service state */
2146 vc_service_state_e service_state = -1;
2147 vc_client_get_service_state(g_vc, &service_state);
2148 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);
2151 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog, pid(%d), app_id(%s)", getpid(), app_id);
2153 char* tmp_appid = NULL;
2154 if (NULL == app_id) {
2155 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2156 if (0 != ret || NULL == tmp_appid) {
2157 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2159 return VC_ERROR_INVALID_PARAMETER;
2162 tmp_appid = strdup(app_id);
2166 SLOG(LOG_DEBUG, TAG_VCC, "Set server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2169 bool is_prepared = false;
2171 ret = vc_tidl_request_set_server_dialog(pid, tmp_appid, credential);
2173 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2174 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2175 if (0 == vc_prepare_sync()) {
2177 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2179 } else if (VC_ERROR_TIMED_OUT != ret) {
2180 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set server dialog to vc service : %s", __vc_get_error_code(ret));
2183 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set server dialog : %s", __vc_get_error_code(ret));
2186 if (VC_RETRY_COUNT == count) {
2187 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2196 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog DONE");
2201 int vc_unset_server_dialog(const char* app_id)
2205 char* tmp_appid = NULL;
2207 if (0 != __vc_get_feature_enabled()) {
2208 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2210 if (0 != __vc_check_privilege()) {
2211 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2214 if (0 != vc_client_get_client_state(g_vc, &state)) {
2215 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2216 return VC_ERROR_INVALID_STATE;
2220 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2222 /* Check service state */
2223 vc_service_state_e service_state = -1;
2224 vc_client_get_service_state(g_vc, &service_state);
2225 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);
2228 if (NULL == app_id) {
2229 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2230 if (0 != ret || NULL == tmp_appid) {
2231 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2233 return VC_ERROR_INVALID_PARAMETER;
2236 tmp_appid = strdup(app_id);
2240 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2243 bool is_prepared = false;
2244 char* credential = strdup("#NULL");
2246 ret = vc_tidl_request_set_server_dialog(pid, tmp_appid, credential);
2248 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2249 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2250 if (0 == vc_prepare_sync()) {
2252 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2254 } else if (VC_ERROR_TIMED_OUT != ret) {
2255 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset server dialog to vc service : %s", __vc_get_error_code(ret));
2258 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset server dialog : %s", __vc_get_error_code(ret));
2261 if (VC_RETRY_COUNT == count) {
2262 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2272 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog DONE");
2278 int vc_request_dialog(const char* disp_text, const char* utt_text, bool auto_start)
2282 if (0 != __vc_get_feature_enabled()) {
2283 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2285 if (0 != __vc_check_privilege()) {
2286 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2289 if (0 != vc_client_get_client_state(g_vc, &state)) {
2290 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2291 return VC_ERROR_INVALID_STATE;
2295 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2297 /* Check service state */
2298 vc_service_state_e service_state = -1;
2299 vc_client_get_service_state(g_vc, &service_state);
2300 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);
2302 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);
2303 int ret = vc_tidl_request_request_dialog(getpid(), disp_text, utt_text, auto_start);
2305 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request dialog, ret(%d)", ret);
2306 return VC_ERROR_OPERATION_FAILED;
2309 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog DONE");
2311 return VC_ERROR_NONE;
2316 int vc_auth_enable(void)
2320 if (0 != vc_client_get_client_state(g_vc, &state)) {
2321 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2322 return VC_ERROR_INVALID_STATE;
2324 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", state);
2326 /* check already authority */
2327 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2328 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2329 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2330 return VC_ERROR_INVALID_STATE;
2332 RETVM_IF(VC_AUTH_STATE_NONE != auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Already authority enabled");
2334 /* request authority */
2336 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2337 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2338 return VC_ERROR_OPERATION_FAILED;
2341 if (0 != vc_tidl_request_auth_enable(g_vc->handle, mgr_pid)) {
2342 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
2343 return VC_ERROR_OPERATION_FAILED;
2346 /* set authority into handle */
2347 bool is_foreground = false;
2348 if (0 != vc_client_get_is_foreground(g_vc, &is_foreground)) {
2349 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get is_foreground");
2350 return VC_ERROR_OPERATION_FAILED;
2353 if (is_foreground) {
2354 auth_state = VC_AUTH_STATE_VALID;
2356 auth_state = VC_AUTH_STATE_INVALID;
2359 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
2360 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2361 return VC_ERROR_OPERATION_FAILED;
2364 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2366 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
2368 return VC_ERROR_NONE;
2371 int vc_auth_disable(void)
2375 if (0 != vc_client_get_client_state(g_vc, &state)) {
2376 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2377 return VC_ERROR_INVALID_STATE;
2379 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", state);
2381 /* check authority */
2382 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2383 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2384 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2385 return VC_ERROR_INVALID_STATE;
2387 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] No authority");
2389 if (0 != vc_auth_unset_state_changed_cb()) {
2390 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
2393 /* request return authority by tidl */
2395 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2396 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2397 return VC_ERROR_OPERATION_FAILED;
2400 if (0 != vc_tidl_request_auth_disable(g_vc->handle, mgr_pid)) {
2401 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disable");
2402 return VC_ERROR_OPERATION_FAILED;
2405 /* unset authority from handle */
2406 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
2407 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2408 return VC_ERROR_OPERATION_FAILED;
2411 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2413 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
2415 return VC_ERROR_NONE;
2418 int vc_auth_get_state(vc_auth_state_e* state)
2421 vc_state_e vc_state;
2422 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
2423 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2424 return VC_ERROR_INVALID_STATE;
2426 RETVM_IF(VC_STATE_READY != vc_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Current state(%d) is not 'READY'", vc_state);
2429 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
2430 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
2431 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2432 return VC_ERROR_INVALID_STATE;
2437 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
2439 return VC_ERROR_NONE;
2442 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
2444 /* check parameter */
2445 if (NULL == callback) {
2446 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
2447 return VC_ERROR_INVALID_PARAMETER;
2451 vc_auth_state_e auth_state;
2452 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2453 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2454 return VC_ERROR_INVALID_STATE;
2456 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Auth is not enabled");
2458 /* set cb into handle */
2459 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
2460 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
2461 return VC_ERROR_OPERATION_FAILED;
2464 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
2466 return VC_ERROR_NONE;
2469 int vc_auth_unset_state_changed_cb(void)
2472 vc_auth_state_e auth_state;
2473 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2474 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2475 return VC_ERROR_INVALID_STATE;
2477 RETVM_IF(VC_AUTH_STATE_NONE == auth_state, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Auth is not enabled");
2479 /* unset cb from handle */
2480 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
2481 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
2482 return VC_ERROR_OPERATION_FAILED;
2485 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
2487 return VC_ERROR_NONE;
2490 int vc_auth_start(void)
2492 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
2495 if (0 != vc_client_get_client_state(g_vc, &state)) {
2496 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2497 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2498 return VC_ERROR_INVALID_STATE;
2502 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2504 /* Check service state */
2505 vc_service_state_e service_state = -1;
2506 vc_client_get_service_state(g_vc, &service_state);
2507 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);
2509 /* Check authority */
2510 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2511 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2512 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2513 return VC_ERROR_OPERATION_FAILED;
2515 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2519 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2520 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2521 return VC_ERROR_OPERATION_FAILED;
2526 bool is_prepared = false;
2529 ret = vc_tidl_request_auth_start(g_vc->handle, mgr_pid);
2531 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2532 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2533 if (0 == vc_prepare_sync()) {
2535 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2537 } else if (VC_ERROR_TIMED_OUT != ret) {
2538 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
2541 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
2544 if (VC_RETRY_COUNT == count) {
2545 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2550 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
2554 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2559 int vc_auth_stop(void)
2561 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
2564 if (0 != vc_client_get_client_state(g_vc, &state)) {
2565 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2566 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2567 return VC_ERROR_INVALID_STATE;
2571 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2573 /* Check service state */
2574 vc_service_state_e service_state = -1;
2575 vc_client_get_service_state(g_vc, &service_state);
2576 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);
2578 /* Check authority */
2579 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2580 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2581 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2582 return VC_ERROR_OPERATION_FAILED;
2584 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2588 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2589 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2590 return VC_ERROR_OPERATION_FAILED;
2595 bool is_prepared = false;
2598 ret = vc_tidl_request_auth_stop(g_vc->handle, mgr_pid);
2600 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2601 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2602 if (0 == vc_prepare_sync()) {
2604 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2606 } else if (VC_ERROR_TIMED_OUT != ret) {
2607 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
2610 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
2613 if (VC_RETRY_COUNT == count) {
2614 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2619 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
2623 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2628 int vc_auth_cancel(void)
2630 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel");
2633 if (0 != vc_client_get_client_state(g_vc, &state)) {
2634 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2635 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2636 return VC_ERROR_INVALID_STATE;
2640 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2642 /* Check service state */
2643 vc_service_state_e service_state = -1;
2644 vc_client_get_service_state(g_vc, &service_state);
2645 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
2646 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
2647 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2648 return VC_ERROR_INVALID_STATE;
2651 /* Check authority */
2652 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2653 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2654 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2655 return VC_ERROR_OPERATION_FAILED;
2657 RETVM_IF(VC_AUTH_STATE_VALID != auth_state, VC_ERROR_OPERATION_FAILED, TAG_VCC, "[ERROR] Not auth valid");
2661 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2662 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2663 return VC_ERROR_OPERATION_FAILED;
2668 bool is_prepared = false;
2670 ret = vc_tidl_request_auth_cancel(g_vc->handle, mgr_pid);
2672 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2673 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2674 if (0 == vc_prepare_sync()) {
2676 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2678 } else if (VC_ERROR_TIMED_OUT != ret) {
2679 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
2682 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
2685 if (VC_RETRY_COUNT == count) {
2686 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2691 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
2695 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2700 static void __start_tts_streaming_thread(void* data, Ecore_Thread* thread)
2702 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Start tts streaming thread");
2704 vc_tts_streaming_cb callback = NULL;
2705 void* user_data = NULL;
2707 vc_client_get_tts_streaming_cb(g_vc, &callback, &user_data);
2708 RETM_IF(NULL == callback, TAG_VCC, "[WARNING] tts streaming callback is null");
2715 vc_tts_data_s *tts_data = NULL;
2716 ret = vc_data_get_first_tts_data(&tts_data);
2717 if (0 != ret || NULL == tts_data) {
2719 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] No tts data. Waiting mode");
2724 if (0 < vc_data_get_tts_data_size()) {
2725 SLOG(LOG_INFO, TAG_VCC, "[INFO] Resume thread");
2729 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Wrong request, there's no pcm data");
2730 vc_data_clear_tts_data(&tts_data);
2735 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish to wait for new tts data come");
2737 /* resume tts thread */
2738 vc_data_clear_tts_data(&tts_data);
2742 if (NULL != tts_data) {
2743 SLOG(LOG_DEBUG, TAG_VCC, "tts streaming callback is called");
2744 vc_client_use_callback(g_vc);
2745 callback(tts_data->event, tts_data->data, tts_data->data_size, tts_data->utt_id, user_data);
2746 vc_client_not_use_callback(g_vc);
2748 /* If no tts data and EVENT_FINISH */
2749 if (0 >= vc_data_get_tts_data_size() && VC_TTS_EVENT_FINISH == tts_data->event) {
2750 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish tts");
2759 static void __end_tts_streaming_thread(void* data, Ecore_Thread* thread)
2761 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] End tts streaming thread");
2762 g_tts_thread = NULL;
2765 int __vc_cb_tts_streaming(int utt_id, vc_tts_event_e event, char* buffer, int len)
2768 vc_tts_data_s* temp_tts_data = NULL;
2769 temp_tts_data = (vc_tts_data_s*)calloc(1, sizeof(vc_tts_data_s));
2770 RETVM_IF(NULL == temp_tts_data, VC_ERROR_OUT_OF_MEMORY, TAG_VCC, "[ERROR] Out of memory");
2772 temp_tts_data->data = NULL;
2773 temp_tts_data->data_size = 0;
2776 temp_tts_data->data = (char*)calloc(len + 5, sizeof(char));
2777 if (NULL != temp_tts_data->data) {
2778 memcpy(temp_tts_data->data, buffer, len);
2779 temp_tts_data->data_size = len;
2780 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG][memcpy] data(%p) size(%d)",
2781 temp_tts_data->data, temp_tts_data->data_size);
2783 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to allocate memory");
2786 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] tts data is NULL");
2789 temp_tts_data->utt_id = utt_id;
2790 temp_tts_data->event = event;
2792 int ret = vc_data_add_tts_data(temp_tts_data);
2794 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to add tts data");
2795 FREE(temp_tts_data->data);
2796 FREE(temp_tts_data);
2799 bool is_canceled = ecore_thread_check(g_tts_thread);
2800 if (NULL == g_tts_thread || TRUE == is_canceled) {
2801 SLOG(LOG_INFO, TAG_VCC, "ecore thread run : __start_tts_streaming_thread ");
2802 g_tts_thread = ecore_thread_run(__start_tts_streaming_thread, __end_tts_streaming_thread, NULL, NULL);
2808 int vc_tts_request(const char* text, const char* language, bool to_vc_manager, int* utt_id)
2814 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request tts");
2816 if (0 != __vc_get_feature_enabled()) {
2817 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2819 if (0 != __vc_check_privilege()) {
2820 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2823 if (0 != vc_client_get_client_state(g_vc, &state)) {
2824 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2825 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2826 return VC_ERROR_INVALID_STATE;
2830 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2832 /* Check service state */
2833 vc_service_state_e service_state = -1;
2834 vc_client_get_service_state(g_vc, &service_state);
2835 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);
2837 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts request, pid(%d), text(%s), language(%s), to_vc_manager(%d)", pid, text, language, to_vc_manager);
2840 bool is_prepared = false;
2842 ret = vc_tidl_request_request_tts(pid, text, language, to_vc_manager, utt_id);
2844 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2845 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2846 if (0 == vc_prepare_sync()) {
2848 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2850 } else if (VC_ERROR_TIMED_OUT != ret) {
2851 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request tts to vc service : %s", __vc_get_error_code(ret));
2854 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request tts : %s", __vc_get_error_code(ret));
2857 if (VC_RETRY_COUNT == count) {
2858 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2865 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2870 int vc_tts_cancel(int utt_id)
2876 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Cancel tts");
2878 if (0 != __vc_get_feature_enabled()) {
2879 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2881 if (0 != __vc_check_privilege()) {
2882 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2885 if (0 != vc_client_get_client_state(g_vc, &state)) {
2886 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2887 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2888 return VC_ERROR_INVALID_STATE;
2892 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2894 /* Check service state */
2895 vc_service_state_e service_state = -1;
2896 vc_client_get_service_state(g_vc, &service_state);
2897 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);
2899 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts cancel, pid(%d), utt_id(%d)", pid, utt_id);
2901 ret = vc_data_clear_tts_data_by_uttid(utt_id);
2903 SLOG(LOG_INFO, TAG_VCC, "[INFO] There's no data in client pcm queue");
2907 bool is_prepared = false;
2909 ret = vc_tidl_request_cancel_tts(pid, utt_id);
2911 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2912 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2913 if (0 == vc_prepare_sync()) {
2915 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2917 } else if (VC_ERROR_TIMED_OUT != ret) {
2918 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel tts to vc service : %s", __vc_get_error_code(ret));
2921 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel tts : %s", __vc_get_error_code(ret));
2924 if (VC_RETRY_COUNT == count) {
2925 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel");
2932 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2937 int vc_tts_get_synthesized_audio_details(int* rate, vc_audio_channel_e* channel, vc_audio_type_e* audio_type)
2943 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Get tts audio format");
2945 if (0 != __vc_get_feature_enabled()) {
2946 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
2948 if (0 != __vc_check_privilege()) {
2949 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
2952 if (0 != vc_client_get_client_state(g_vc, &state)) {
2953 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2954 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2955 return VC_ERROR_INVALID_STATE;
2959 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2961 /* Check service state */
2962 vc_service_state_e service_state = -1;
2963 vc_client_get_service_state(g_vc, &service_state);
2964 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);
2966 SLOG(LOG_DEBUG, TAG_VCC, "@@@ get tts audio format, pid(%d)", pid);
2969 bool is_prepared = false;
2971 ret = vc_tidl_request_get_tts_audio_format(pid, rate, channel, audio_type);
2973 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2974 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2975 if (0 == vc_prepare_sync()) {
2977 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2979 } else if (VC_ERROR_TIMED_OUT != ret) {
2980 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format : %s", __vc_get_error_code(ret));
2983 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to get tts audio format : %s", __vc_get_error_code(ret));
2986 if (VC_RETRY_COUNT == count) {
2987 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format");
2994 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2999 int vc_tts_set_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
3001 if (0 != __vc_get_feature_enabled()) {
3002 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3004 if (0 != __vc_check_privilege()) {
3005 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3008 if (NULL == callback)
3009 return VC_ERROR_INVALID_PARAMETER;
3012 if (0 != vc_client_get_client_state(g_vc, &state)) {
3013 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : A handle is not available");
3014 return VC_ERROR_INVALID_STATE;
3018 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3020 vc_client_set_tts_streaming_cb(g_vc, callback, user_data);
3022 return VC_ERROR_NONE;
3025 int vc_tts_unset_streaming_cb(void)
3027 if (0 != __vc_get_feature_enabled()) {
3028 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3030 if (0 != __vc_check_privilege()) {
3031 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3035 if (0 != vc_client_get_client_state(g_vc, &state)) {
3036 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : A handle is not available");
3037 return VC_ERROR_INVALID_STATE;
3041 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3043 vc_client_set_tts_streaming_cb(g_vc, NULL, NULL);
3045 return VC_ERROR_NONE;
3048 int __vc_cb_utterance_status(int utt_id, int utt_status)
3050 vc_tts_utterance_status_cb callback = NULL;
3051 void* user_data = NULL;
3053 vc_client_get_tts_utterance_status_cb(g_vc, &callback, &user_data);
3054 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Utterance status callback is null");
3056 SLOG(LOG_DEBUG, TAG_VCC, "Utterance status callback is called");
3057 vc_client_use_callback(g_vc);
3058 callback(utt_id, (vc_tts_utterance_status_e)utt_status, user_data);
3059 vc_client_not_use_callback(g_vc);
3061 return VC_ERROR_NONE;
3064 int vc_tts_set_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
3066 if (0 != __vc_get_feature_enabled()) {
3067 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3069 if (0 != __vc_check_privilege()) {
3070 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3073 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCC, "[ERROR] Utterance status callback is null");
3076 if (0 != vc_client_get_client_state(g_vc, &state)) {
3077 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : A handle is not available");
3078 return VC_ERROR_INVALID_STATE;
3082 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3084 vc_client_set_tts_utterance_status_cb(g_vc, callback, user_data);
3086 return VC_ERROR_NONE;
3089 int vc_tts_unset_utterance_status_cb(void)
3091 if (0 != __vc_get_feature_enabled()) {
3092 return VC_ERROR_NOT_SUPPORTED; //LCOV_EXCL_LINE
3094 if (0 != __vc_check_privilege()) {
3095 return VC_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
3099 if (0 != vc_client_get_client_state(g_vc, &state)) {
3100 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : A handle is not available");
3101 return VC_ERROR_INVALID_STATE;
3105 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3107 vc_client_set_tts_utterance_status_cb(g_vc, NULL, NULL);
3109 return VC_ERROR_NONE;