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_backup = false;
59 static int g_privilege_allowed = -1;
60 static cynara *p_cynara = NULL;
62 static void __vc_notify_state_changed(void *data);
63 static void __vc_notify_error(void *data);
65 static int __vc_get_feature_enabled()
67 if (0 == g_feature_enabled) {
69 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
70 return VC_ERROR_NOT_SUPPORTED;
72 } else if (-1 == g_feature_enabled) {
73 bool vc_supported = false;
74 bool mic_supported = false;
75 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
76 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
77 if (false == vc_supported || false == mic_supported) {
78 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
79 g_feature_enabled = 0;
80 return VC_ERROR_NOT_SUPPORTED;
83 g_feature_enabled = 1;
85 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value"); //LCOV_EXCL_LINE
86 return VC_ERROR_NOT_SUPPORTED;
89 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value"); //LCOV_EXCL_LINE
90 return VC_ERROR_NOT_SUPPORTED;
97 static int __check_privilege_initialize()
99 int ret = cynara_initialize(&p_cynara, NULL);
100 if (CYNARA_API_SUCCESS != ret)
101 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to initialize"); //LCOV_EXCL_LINE
103 return ret == CYNARA_API_SUCCESS;
106 static int __check_privilege(const char* uid, const char * privilege)
109 char label_path[1024] = "/proc/self/attr/current";
110 char smack_label[1024] = {'\0',};
116 fp = fopen(label_path, "r");
118 if (0 >= fread(smack_label, 1, sizeof(smack_label), fp))
119 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to fread"); //LCOV_EXCL_LINE
124 pid_t pid = getpid();
125 char *session = cynara_session_from_pid(pid);
126 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
127 SLOG(LOG_DEBUG, TAG_VCC, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
131 if (ret != CYNARA_API_ACCESS_ALLOWED)
136 static void __check_privilege_deinitialize()
139 cynara_finish(p_cynara);
143 static int __vc_check_privilege()
147 if (0 == g_privilege_allowed) {
149 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied");
150 return VC_ERROR_PERMISSION_DENIED;
152 } else if (-1 == g_privilege_allowed) {
153 if (false == __check_privilege_initialize()) {
154 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed"); //LCOV_EXCL_LINE
155 return VC_ERROR_PERMISSION_DENIED;
157 snprintf(uid, 16, "%d", getuid());
158 if (false == __check_privilege(uid, VC_PRIVILEGE)) {
159 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied");
160 g_privilege_allowed = 0;
161 __check_privilege_deinitialize();
162 return VC_ERROR_PERMISSION_DENIED;
164 __check_privilege_deinitialize();
167 g_privilege_allowed = 1;
168 return VC_ERROR_NONE;
172 static const char* __vc_get_error_code(vc_error_e err)
175 case VC_ERROR_NONE: return "VC_ERROR_NONE";
176 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
177 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
178 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
179 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
180 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
181 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
182 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
183 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
184 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
185 default: return "Invalid error code";
190 static int __vc_convert_config_error_code(vc_config_error_e code)
192 if (code == VC_CONFIG_ERROR_NONE) return VC_ERROR_NONE;
193 if (code == VC_CONFIG_ERROR_OUT_OF_MEMORY) return VC_ERROR_OUT_OF_MEMORY;
194 if (code == VC_CONFIG_ERROR_IO_ERROR) return VC_ERROR_IO_ERROR;
195 if (code == VC_CONFIG_ERROR_INVALID_PARAMETER) return VC_ERROR_INVALID_PARAMETER;
196 if (code == VC_CONFIG_ERROR_INVALID_STATE) return VC_ERROR_INVALID_STATE;
197 if (code == VC_CONFIG_ERROR_INVALID_LANGUAGE) return VC_ERROR_INVALID_LANGUAGE;
198 if (code == VC_CONFIG_ERROR_ENGINE_NOT_FOUND) return VC_ERROR_ENGINE_NOT_FOUND;
199 if (code == VC_CONFIG_ERROR_OPERATION_FAILED) return VC_ERROR_OPERATION_FAILED;
201 return VC_ERROR_NONE;
204 static void __vc_lang_changed_cb(const char* before_lang, const char* current_lang)
206 SLOG(LOG_DEBUG, TAG_VCC, "Lang changed : Before lang(%s) Current lang(%s)",
207 before_lang, current_lang);
209 vc_current_language_changed_cb callback;
210 void* lang_user_data;
211 vc_client_get_current_lang_changed_cb(g_vc, &callback, &lang_user_data);
213 if (NULL != callback) {
214 vc_client_use_callback(g_vc);
215 callback(before_lang, current_lang, lang_user_data);
216 vc_client_not_use_callback(g_vc);
217 SLOG(LOG_DEBUG, TAG_VCC, "Language changed callback is called");
219 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Language changed callback is null");
225 static Eina_Bool __notify_auth_changed_cb(void *data)
227 vc_auth_state_changed_cb callback = NULL;
230 vc_client_get_auth_state_changed_cb(g_vc, &callback, &user_data);
232 vc_auth_state_e before = -1;
233 vc_auth_state_e current = -1;
235 vc_client_get_before_auth_state(g_vc, &before, ¤t);
237 if (NULL != callback) {
238 vc_client_use_callback(g_vc);
239 callback(before, current, user_data);
240 vc_client_not_use_callback(g_vc);
241 SLOG(LOG_DEBUG, TAG_VCC, "Auth state changed callback is called");
243 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Auth state changed callback is null");
249 static Eina_Bool __focus_changed_cb(void *data, int type, void *event)
251 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Focus changed");
254 if (ECORE_WL2_EVENT_FOCUS_IN == type) {
255 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground");
256 ret = vc_dbus_set_foreground(getpid(), true);
258 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
261 ret = vc_client_set_is_foreground(g_vc, true);
263 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret);
266 /* set authority valid */
267 vc_auth_state_e state = VC_AUTH_STATE_NONE;
268 if (0 != vc_client_get_auth_state(g_vc, &state)) {
269 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
271 if (VC_AUTH_STATE_INVALID == state) {
272 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
274 /* notify auth changed cb */
275 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
277 } else if (ECORE_WL2_EVENT_FOCUS_OUT == type) {
278 SLOG(LOG_DEBUG, TAG_VCW, "@@@ Set background");
279 ret = vc_dbus_set_foreground(getpid(), false);
281 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (false) : %d", ret);
284 ret = vc_client_set_is_foreground(g_vc, false);
286 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (false) : %d", ret);
289 /* set authority valid */
290 vc_auth_state_e state = VC_AUTH_STATE_NONE;
291 if (0 != vc_client_get_auth_state(g_vc, &state)) {
292 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
294 if (VC_AUTH_STATE_VALID == state) {
295 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_INVALID);
297 /* notify authority changed cb */
298 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
301 SLOG(LOG_DEBUG, TAG_VCC, "@@@ type(%d) is NOT valid", type);
304 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
306 return ECORE_CALLBACK_RENEW;
310 int vc_initialize(void)
312 if (0 != __vc_get_feature_enabled()) {
313 return VC_ERROR_NOT_SUPPORTED;
315 if (0 != __vc_check_privilege()) {
316 return VC_ERROR_PERMISSION_DENIED;
319 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Initialize");
322 if (true == vc_client_is_valid(g_vc)) {
323 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized"); //LCOV_EXCL_LINE
324 return VC_ERROR_NONE; //LCOV_EXCL_LINE
327 if (0 < vc_client_get_count()) {
328 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized"); //LCOV_EXCL_LINE
329 return VC_ERROR_NONE; //LCOV_EXCL_LINE
332 if (0 != vc_dbus_open_connection()) {
333 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to open connection"); //LCOV_EXCL_LINE
334 return VC_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
337 if (0 != vc_client_create(&g_vc)) {
338 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create client!!!!!"); //LCOV_EXCL_LINE
339 return VC_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
342 int ret = vc_config_mgr_initialize(g_vc->handle);
344 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to init config manager : %s",
345 __vc_get_error_code(__vc_convert_config_error_code(ret))); //LCOV_EXCL_LINE
346 vc_client_destroy(g_vc); //LCOV_EXCL_LINE
347 return __vc_convert_config_error_code(ret); //LCOV_EXCL_LINE
350 ret = vc_config_mgr_set_lang_cb(g_vc->handle, __vc_lang_changed_cb);
352 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set config changed : %d", ret); //LCOV_EXCL_LINE
353 vc_config_mgr_finalize(g_vc->handle); //LCOV_EXCL_LINE
354 vc_client_destroy(g_vc); //LCOV_EXCL_LINE
355 return __vc_convert_config_error_code(ret);
358 SLOG(LOG_DEBUG, TAG_VCC, "[Success] pid(%d)", g_vc->handle);
360 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
362 return VC_ERROR_NONE;
365 static void __vc_internal_unprepare(void)
367 /* return authority */
368 vc_auth_state_e state = VC_AUTH_STATE_NONE;
369 if (0 != vc_client_get_auth_state(g_vc, &state)) {
370 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
373 if (VC_AUTH_STATE_NONE != state) {
374 if (0 != vc_auth_disable()) {
375 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to auth disable"); //LCOV_EXCL_LINE
379 int ret = vc_dbus_request_finalize(g_vc->handle);
381 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
384 if (NULL != g_focus_in_handler) {
385 ecore_event_handler_del(g_focus_in_handler);
386 g_focus_in_handler = NULL;
388 if (NULL != g_focus_out_handler) {
389 ecore_event_handler_del(g_focus_out_handler);
390 g_focus_out_handler = NULL;
393 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
395 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
400 int vc_deinitialize(void)
402 int ret = VC_ERROR_NONE;
404 if (0 != __vc_get_feature_enabled()) {
405 return VC_ERROR_NOT_SUPPORTED;
407 if (0 != __vc_check_privilege()) {
408 return VC_ERROR_PERMISSION_DENIED;
411 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Deinitialize");
413 if (false == vc_client_is_valid(g_vc)) {
414 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NOT initialized");
415 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
416 return VC_ERROR_INVALID_STATE;
420 vc_client_get_client_state(g_vc, &state);
425 __vc_internal_unprepare();
426 /* no break. need to next step*/
427 case VC_STATE_INITIALIZED:
428 if (NULL != g_connect_timer) {
429 SLOG(LOG_DEBUG, TAG_VCC, "Connect Timer is deleted"); //LCOV_EXCL_LINE
430 ecore_timer_del(g_connect_timer);
431 g_connect_timer = NULL;
434 vc_config_mgr_unset_lang_cb(g_vc->handle);
435 vc_config_mgr_finalize(g_vc->handle);
437 /* Free client resources */
438 vc_client_destroy(g_vc);
445 SLOG(LOG_INFO, TAG_VCC, "Success: destroy");
447 if (true == g_backup) {
448 ret = vc_db_backup_command();
450 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to backup command, ret(%d)", ret); //LCOV_EXCL_LINE
454 ret = vc_db_finalize();
456 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB, ret(%d)", ret); //LCOV_EXCL_LINE
459 if (0 != vc_dbus_close_connection()) {
460 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection"); //LCOV_EXCL_LINE
463 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
465 return VC_ERROR_NONE;
468 static Eina_Bool __vc_connect_daemon(void *data)
470 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon");
472 /* request initialization */
475 int service_state = 0;
477 g_connect_timer = NULL;
480 if (true == vc_client_is_valid(g_vc)) {
481 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] g_vc is valid");
484 ret = vc_db_initialize();
486 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize DB : %d", ret); //LCOV_EXCL_LINE
490 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
492 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
494 ret = vc_dbus_request_initialize(g_vc->handle, &mgr_pid, &service_state, &g_daemon_pid);
496 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
497 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
499 vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND);
500 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
504 } else if (0 != ret) {
505 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
507 vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT);
508 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
510 ret = vc_db_finalize();
512 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB : %d", ret); //LCOV_EXCL_LINE
517 /* Success to connect */
520 /* Set service state */
521 vc_service_state_e previous_service_state;
522 vc_client_get_service_state(g_vc, &previous_service_state);
524 vc_client_set_service_state(g_vc, (vc_service_state_e)service_state);
526 vc_service_state_changed_cb service_changed_callback = NULL;
527 void* user_data = NULL;
528 vc_client_get_service_state_changed_cb(g_vc, &service_changed_callback, &user_data);
530 if (NULL != service_changed_callback) {
531 vc_client_use_callback(g_vc);
532 service_changed_callback(previous_service_state, service_state, user_data);
533 vc_client_not_use_callback(g_vc);
534 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called"); //LCOV_EXCL_LINE
536 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null"); //LCOV_EXCL_LINE
539 /* Register focus handler */
540 ecore_thread_main_loop_begin();
541 g_focus_in_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_IN, __focus_changed_cb, NULL);
542 g_focus_out_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_OUT, __focus_changed_cb, NULL);
543 ecore_thread_main_loop_end();
545 char appid[1024] = {'\0',};
546 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1);
548 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get aul_app_get_appid_bypid : %d", ret);
550 int status = aul_app_get_status(appid);
551 if (STATUS_FOCUS == status) {
552 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground"); //LCOV_EXCL_LINE
553 ret = vc_dbus_set_foreground(getpid(), true);
555 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret); //LCOV_EXCL_LINE
558 ret = vc_client_set_is_foreground(g_vc, true);
560 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret); //LCOV_EXCL_LINE
563 /* set authority valid */
564 vc_auth_state_e state = VC_AUTH_STATE_NONE;
565 if (0 != vc_client_get_auth_state(g_vc, &state)) {
566 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
568 if (VC_AUTH_STATE_INVALID == state) {
569 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
571 /* notify auth changed cb */
572 ecore_idler_add(__notify_auth_changed_cb, NULL);
576 vc_client_set_client_state(g_vc, VC_STATE_READY);
577 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
579 vc_client_set_mgr_pid(g_vc, mgr_pid);
581 SLOG(LOG_ERROR, TAG_VCC, "[Not ERROR] g_vc is not valid. It is destroyed."); //LCOV_EXCL_LINE
585 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
590 static void __start_prepare_thread(void *data, Ecore_Thread *thread)
592 SLOG(LOG_ERROR, TAG_VCC, "@@@ Start prepare thread");
593 int ret = -1, retry_count = 0;
597 if (retry_count == 10) {
598 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!"); //LCOV_EXCL_LINE
602 ret = vc_dbus_request_hello();
604 SLOG(LOG_DEBUG, TAG_VCC, "Success to request hello. retry count(%d)", retry_count);
614 if (retry_count == 10) {
615 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon !!"); //LCOV_EXCL_LINE
618 ret = __vc_connect_daemon(NULL);
628 static void __end_prepare_thread(void *data, Ecore_Thread *thread)
630 SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread");
635 if (0 != __vc_get_feature_enabled()) {
636 return VC_ERROR_NOT_SUPPORTED;
638 if (0 != __vc_check_privilege()) {
639 return VC_ERROR_PERMISSION_DENIED;
642 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
645 if (0 != vc_client_get_client_state(g_vc, &state)) {
646 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available"); //LCOV_EXCL_LINE
647 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
648 return VC_ERROR_INVALID_STATE;
652 if (state != VC_STATE_INITIALIZED) {
653 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'"); //LCOV_EXCL_LINE
654 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
655 return VC_ERROR_INVALID_STATE;
658 ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, NULL);
660 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
662 return VC_ERROR_NONE;
666 int vc_prepare_sync(void)
668 if (0 != __vc_get_feature_enabled()) {
669 return VC_ERROR_NOT_SUPPORTED;
671 if (0 != __vc_check_privilege()) {
672 return VC_ERROR_PERMISSION_DENIED;
675 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
678 if (0 != vc_client_get_client_state(g_vc, &state)) {
679 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
680 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
681 return VC_ERROR_INVALID_STATE;
685 if (state != VC_STATE_INITIALIZED) {
686 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'INITIALIZED'");
687 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
688 return VC_ERROR_INVALID_STATE;
692 while (EINA_TRUE == __vc_connect_daemon(NULL) && VC_CONNECTION_RETRY_COUNT > cnt) {
696 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
698 if (VC_CONNECTION_RETRY_COUNT == cnt) {
699 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon");
700 return VC_ERROR_OPERATION_FAILED;
703 return VC_ERROR_NONE;
707 int vc_unprepare(void)
709 if (0 != __vc_get_feature_enabled()) {
710 return VC_ERROR_NOT_SUPPORTED;
712 if (0 != __vc_check_privilege()) {
713 return VC_ERROR_PERMISSION_DENIED;
716 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare");
719 if (0 != vc_client_get_client_state(g_vc, &state)) {
720 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
721 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
722 return VC_ERROR_INVALID_STATE;
726 if (state != VC_STATE_READY) {
727 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
728 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
729 return VC_ERROR_INVALID_STATE;
732 __vc_internal_unprepare();
734 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
735 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
737 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
739 return VC_ERROR_NONE;
742 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
744 if (0 != __vc_get_feature_enabled()) {
745 return VC_ERROR_NOT_SUPPORTED;
747 if (0 != __vc_check_privilege()) {
748 return VC_ERROR_PERMISSION_DENIED;
751 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language");
753 if (NULL == callback) {
754 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
755 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
756 return VC_ERROR_INVALID_PARAMETER;
760 if (0 != vc_client_get_client_state(g_vc, &state)) {
761 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
762 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
763 return VC_ERROR_INVALID_STATE;
767 ret = vc_config_mgr_get_language_list(callback, user_data);
769 ret = vc_config_convert_error_code((vc_config_error_e)ret);
770 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
773 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
775 return VC_ERROR_NONE;
779 int vc_get_current_language(char** language)
781 if (0 != __vc_get_feature_enabled()) {
782 return VC_ERROR_NOT_SUPPORTED;
784 if (0 != __vc_check_privilege()) {
785 return VC_ERROR_PERMISSION_DENIED;
788 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language");
790 if (NULL == language) {
791 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
792 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
793 return VC_ERROR_INVALID_PARAMETER;
797 if (0 != vc_client_get_client_state(g_vc, &state)) {
798 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
799 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
800 return VC_ERROR_INVALID_STATE;
804 ret = vc_config_mgr_get_default_language(language);
806 ret = vc_config_convert_error_code((vc_config_error_e)ret);
807 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
810 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
815 int vc_get_state(vc_state_e* state)
817 if (0 != __vc_get_feature_enabled()) {
818 return VC_ERROR_NOT_SUPPORTED;
820 if (0 != __vc_check_privilege()) {
821 return VC_ERROR_PERMISSION_DENIED;
824 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State");
827 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
828 return VC_ERROR_INVALID_PARAMETER;
832 if (0 != vc_client_get_client_state(g_vc, &temp)) {
833 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not valid");
834 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
835 return VC_ERROR_INVALID_STATE;
842 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
843 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
844 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
845 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
849 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
851 return VC_ERROR_NONE;
854 int vc_get_service_state(vc_service_state_e* state)
856 if (0 != __vc_get_feature_enabled()) {
857 return VC_ERROR_NOT_SUPPORTED;
859 if (0 != __vc_check_privilege()) {
860 return VC_ERROR_PERMISSION_DENIED;
863 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State");
866 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
867 return VC_ERROR_INVALID_PARAMETER;
871 if (0 != vc_client_get_client_state(g_vc, &temp)) {
872 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
873 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
874 return VC_ERROR_INVALID_STATE;
877 if (VC_STATE_READY != temp) {
878 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
879 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
880 return VC_ERROR_INVALID_STATE;
883 /* get service state */
884 vc_service_state_e service_state;
885 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
886 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state"); //LCOV_EXCL_LINE
887 return VC_ERROR_OPERATION_FAILED;
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, "@@@");
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;
912 if (0 != __vc_check_privilege()) {
913 return VC_ERROR_PERMISSION_DENIED;
916 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list");
918 if (NULL == vc_sys_cmd_list) {
919 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
920 return VC_ERROR_INVALID_PARAMETER;
924 if (0 != vc_client_get_client_state(g_vc, &state)) {
925 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
926 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
927 return VC_ERROR_INVALID_STATE;
931 if (state != VC_STATE_READY) {
932 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
933 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
934 return VC_ERROR_INVALID_STATE;
937 /* Check service state */
938 vc_service_state_e service_state = -1;
939 vc_client_get_service_state(g_vc, &service_state);
940 if (service_state != VC_SERVICE_STATE_READY) {
941 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'"); //LCOV_EXCL_LINE
942 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
943 return VC_ERROR_INVALID_STATE;
946 bool is_sys_cmd_valid = false;
949 bool is_prepared = false;
951 ret = vc_dbus_request_is_system_command_valid(g_vc->handle, &is_sys_cmd_valid);
954 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
955 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
956 if (0 == vc_prepare_sync()) {
958 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
960 } else if (VC_ERROR_TIMED_OUT != ret) {
961 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to ask system command is : %s", __vc_get_error_code(ret));
964 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to ask system command is : %s", __vc_get_error_code(ret));
967 if (VC_RETRY_COUNT == count) {
968 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
977 ret = vc_client_get_mgr_pid(g_vc, &mgr_pid);
979 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get the manager pid"); //LCOV_EXCL_LINE
980 return VC_ERROR_OPERATION_FAILED;
983 vc_cmd_list_s* list = NULL;
984 list = (vc_cmd_list_s*)(*vc_sys_cmd_list);
985 if (true == is_sys_cmd_valid) {
986 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, &(list->list));
988 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
991 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &(list->list));
993 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
996 *vc_sys_cmd_list = (vc_cmd_list_h)list;
998 SLOG(LOG_WARN, TAG_VCC, "[WARNING] No system commands"); //LCOV_EXCL_LINE
999 *vc_sys_cmd_list = NULL;
1000 return VC_ERROR_NONE;
1003 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1010 * @brief Checks whether the command format is supported.
1011 * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
1013 * @param[in] format The command format
1014 * @param[out] support The result status @c true = supported, @c false = not supported
1016 * @return 0 on success, otherwise a negative error value
1017 * @retval #VC_ERROR_NONE Successful
1018 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1019 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
1020 * @retval #VC_ERROR_INVALID_STATE Invalid state
1022 * @pre The state should be #VC_STATE_READY.
1024 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
1026 if (0 != __vc_get_feature_enabled()) {
1027 return VC_ERROR_NOT_SUPPORTED;
1029 if (0 != __vc_check_privilege()) {
1030 return VC_ERROR_PERMISSION_DENIED;
1033 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported");
1036 if (0 != vc_client_get_client_state(g_vc, &state)) {
1037 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1038 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1039 return VC_ERROR_INVALID_STATE;
1043 bool non_fixed_support = false;
1044 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
1045 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
1049 case VC_CMD_FORMAT_FIXED: *support = true; break;
1050 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
1051 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
1052 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
1053 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
1054 default: *support = false; break;
1057 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
1059 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1061 return VC_ERROR_NONE;
1065 static int __vc_get_invocation_name(char** invocation_name)
1067 int ret = vc_client_get_invocation_name(g_vc, invocation_name);
1069 SLOG(LOG_WARN, TAG_VCC, "Fail to get invocation name"); //LCOV_EXCL_LINE
1070 return ret; //LCOV_EXCL_LINE
1073 if (NULL == *invocation_name) {
1074 char* temp_label = NULL;
1078 ret = app_manager_get_app_id(getpid(), &appid);
1079 if (0 != ret || NULL == appid) {
1080 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get appid, ret(%d)", ret); //LCOV_EXCL_LINE
1081 if (NULL != appid) {
1085 return VC_ERROR_OPERATION_FAILED;
1088 ret = vc_get_current_language(&lang);
1089 if (0 != ret || NULL == lang) {
1090 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current language, ret(%d)", ret); //LCOV_EXCL_LINE
1097 return VC_ERROR_OPERATION_FAILED;
1100 ret = app_info_get_localed_label(appid, lang, &temp_label);
1101 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
1107 if (NULL != temp_label) {
1111 return VC_ERROR_OPERATION_FAILED;
1114 *invocation_name = strdup(temp_label);
1115 if (NULL == *invocation_name) {
1116 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE
1117 return VC_ERROR_OUT_OF_MEMORY;
1128 SLOG(LOG_DEBUG, TAG_VCC, "Get invocation name(%s)", *invocation_name);
1129 return VC_ERROR_NONE;
1132 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
1134 if (0 != __vc_get_feature_enabled()) {
1135 return VC_ERROR_NOT_SUPPORTED;
1137 if (0 != __vc_check_privilege()) {
1138 return VC_ERROR_PERMISSION_DENIED;
1141 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list");
1143 if (NULL == vc_cmd_list) {
1144 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
1145 return VC_ERROR_INVALID_PARAMETER;
1149 if (0 != vc_client_get_client_state(g_vc, &state)) {
1150 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1151 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1152 return VC_ERROR_INVALID_STATE;
1156 if (state != VC_STATE_READY) {
1157 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
1158 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1159 return VC_ERROR_INVALID_STATE;
1163 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1164 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type); //LCOV_EXCL_LINE
1165 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1166 return VC_ERROR_INVALID_PARAMETER;
1169 vc_cmd_list_s* list = NULL;
1170 list = (vc_cmd_list_s*)vc_cmd_list;
1172 if (NULL == list->list) {
1173 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command list"); //LCOV_EXCL_LINE
1174 return VC_ERROR_INVALID_PARAMETER;
1178 char* invocation_name = NULL;
1179 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1180 ret = __vc_get_invocation_name(&invocation_name);
1181 if (0 != ret || NULL == invocation_name) {
1182 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret); //LCOV_EXCL_LINE
1187 ret = vc_cmd_parser_delete_file(getpid(), type);
1189 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1191 ret = vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list, invocation_name);
1193 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
1196 bool is_prepared = false;
1198 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1201 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1202 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1203 if (0 == vc_prepare_sync()) {
1205 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1207 } else if (VC_ERROR_TIMED_OUT != ret) {
1208 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1211 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1214 if (VC_RETRY_COUNT == count) {
1215 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1224 if (NULL != invocation_name) {
1225 free(invocation_name);
1226 invocation_name = NULL;
1229 if (VC_COMMAND_TYPE_BACKGROUND == type)
1232 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1237 int vc_unset_command_list(int type)
1239 if (0 != __vc_get_feature_enabled()) {
1240 return VC_ERROR_NOT_SUPPORTED;
1242 if (0 != __vc_check_privilege()) {
1243 return VC_ERROR_PERMISSION_DENIED;
1246 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list");
1249 if (0 != vc_client_get_client_state(g_vc, &state)) {
1250 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1251 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1252 return VC_ERROR_INVALID_STATE;
1256 if (state != VC_STATE_READY) {
1257 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1258 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1259 return VC_ERROR_INVALID_STATE;
1264 bool is_prepared = false;
1266 ret = vc_dbus_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
1269 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1270 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1271 if (0 == vc_prepare_sync()) {
1273 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1275 } else if (VC_ERROR_TIMED_OUT != ret) {
1276 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
1279 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
1282 if (VC_RETRY_COUNT == count) {
1283 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1291 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
1293 ret = vc_config_convert_error_code((vc_config_error_e)ret);
1294 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret)); //LCOV_EXCL_LINE
1297 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1303 int vc_set_command_list_from_file(const char* file_path, int type)
1305 if (0 != __vc_get_feature_enabled()) {
1306 return VC_ERROR_NOT_SUPPORTED;
1308 if (0 != __vc_check_privilege()) {
1309 return VC_ERROR_PERMISSION_DENIED;
1312 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file");
1315 if (0 != vc_client_get_client_state(g_vc, &state)) {
1316 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1317 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1318 return VC_ERROR_INVALID_STATE;
1322 if (state != VC_STATE_READY) {
1323 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1324 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1325 return VC_ERROR_INVALID_STATE;
1329 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1330 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1331 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1332 return VC_ERROR_INVALID_PARAMETER;
1336 char* invocation_name = NULL;
1337 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1338 ret = __vc_get_invocation_name(&invocation_name);
1339 if (0 != ret || NULL == invocation_name) {
1340 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1345 ret = vc_cmd_parser_delete_file(getpid(), type);
1347 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1349 ret = vc_json_set_commands_from_file(file_path, (vc_cmd_type_e)type, invocation_name);
1351 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set commands from file : %s", __vc_get_error_code(ret));
1354 bool is_prepared = false;
1356 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1359 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1360 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1361 if (0 == vc_prepare_sync()) {
1363 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1365 } else if (VC_ERROR_TIMED_OUT != ret) {
1366 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1369 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1372 if (VC_RETRY_COUNT == count) {
1373 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1382 if (NULL != invocation_name) {
1383 free(invocation_name);
1384 invocation_name = NULL;
1387 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1393 int vc_get_exclusive_command_option(bool* value)
1395 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get exclusive command");
1398 if (0 != vc_client_get_client_state(g_vc, &state)) {
1399 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1400 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1401 return VC_ERROR_INVALID_STATE;
1405 if (state != VC_STATE_READY) {
1406 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1407 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1408 return VC_ERROR_INVALID_STATE;
1411 int ret = vc_client_get_exclusive_cmd(g_vc, value);
1413 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1414 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1418 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1423 int vc_set_exclusive_command_option(bool value)
1425 if (0 != __vc_get_feature_enabled()) {
1426 return VC_ERROR_NOT_SUPPORTED;
1428 if (0 != __vc_check_privilege()) {
1429 return VC_ERROR_PERMISSION_DENIED;
1432 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set exclusive command");
1435 if (0 != vc_client_get_client_state(g_vc, &state)) {
1436 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1437 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1438 return VC_ERROR_INVALID_STATE;
1442 if (state != VC_STATE_READY) {
1443 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1444 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1445 return VC_ERROR_INVALID_STATE;
1448 int ret = vc_client_set_exclusive_cmd(g_vc, value);
1450 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1451 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1457 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
1459 if (VC_ERROR_TIMED_OUT != ret) {
1460 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
1463 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
1466 if (VC_RETRY_COUNT == count) {
1467 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1474 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1481 int vc_request_start(bool stop_by_silence)
1483 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
1486 if (0 != vc_client_get_client_state(g_vc, &state)) {
1487 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1488 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1489 return VC_ERROR_INVALID_STATE;
1493 if (state != VC_STATE_READY) {
1494 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1495 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1496 return VC_ERROR_INVALID_STATE;
1499 /* Check service state */
1500 vc_service_state_e service_state = -1;
1501 vc_client_get_service_state(g_vc, &service_state);
1502 if (service_state != VC_SERVICE_STATE_READY) {
1503 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1504 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1505 return VC_ERROR_INVALID_STATE;
1515 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1517 if (VC_ERROR_TIMED_OUT != ret) {
1518 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1521 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1524 if (VC_RETRY_COUNT == count) {
1525 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1530 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1534 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1539 int vc_request_stop(void)
1541 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
1544 if (0 != vc_client_get_client_state(g_vc, &state)) {
1545 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1546 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1547 return VC_ERROR_INVALID_STATE;
1551 if (state != VC_STATE_READY) {
1552 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1553 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1554 return VC_ERROR_INVALID_STATE;
1557 /* Check service state */
1558 vc_service_state_e service_state = -1;
1559 vc_client_get_service_state(g_vc, &service_state);
1560 if (service_state != VC_SERVICE_STATE_RECORDING) {
1561 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1562 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1563 return VC_ERROR_INVALID_STATE;
1570 ret = vc_dbus_request_stop(g_vc->handle);
1572 if (VC_ERROR_TIMED_OUT != ret) {
1573 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1576 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1579 if (VC_RETRY_COUNT == count) {
1580 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1585 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1589 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1594 int vc_request_cancel(void)
1596 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel Interrupt");
1599 if (0 != vc_client_get_client_state(g_vc, &state)) {
1600 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1601 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1602 return VC_ERROR_INVALID_STATE;
1606 if (state != VC_STATE_READY) {
1607 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1608 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1609 return VC_ERROR_INVALID_STATE;
1612 /* Check service state */
1613 vc_service_state_e service_state = -1;
1614 vc_client_get_service_state(g_vc, &service_state);
1615 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1616 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1617 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1618 return VC_ERROR_INVALID_STATE;
1624 ret = vc_dbus_request_cancel(g_vc->handle);
1626 if (VC_ERROR_TIMED_OUT != ret) {
1627 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1630 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel request : %s", __vc_get_error_code(ret));
1633 if (VC_RETRY_COUNT == count) {
1634 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1639 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Cancel interrupt");
1643 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1650 static void __vc_notify_error(void *data)
1652 vc_h vc = (vc_h)data;
1654 vc_error_cb callback = NULL;
1658 vc_client_get_error_cb(vc, &callback, &user_data);
1659 vc_client_get_error(vc, &reason);
1661 if (NULL != callback) {
1662 vc_client_use_callback(vc);
1663 callback(reason, user_data);
1664 vc_client_not_use_callback(vc);
1665 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1667 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1671 int __vc_cb_error(int reason, int daemon_pid, char* msg)
1674 if (0 != vc_client_get_client_state(g_vc, &state)) {
1675 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid client");
1680 if (state != VC_STATE_READY) {
1681 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] State is not READY");
1682 if (VC_ERROR_SERVICE_RESET != reason) {
1683 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] not connected client yet");
1689 if (VC_ERROR_SERVICE_RESET == reason) {
1690 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset");
1692 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1693 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
1695 if (0 != vc_prepare()) {
1696 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare");
1700 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1702 vc_client_set_error(g_vc, reason);
1703 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
1708 static void __vc_notify_state_changed(void *data)
1710 vc_h vc = (vc_h)data;
1712 vc_state_changed_cb changed_callback = NULL;
1715 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1717 vc_state_e current_state;
1718 vc_state_e before_state;
1720 vc_client_get_before_state(vc, ¤t_state, &before_state);
1722 if (NULL != changed_callback) {
1723 vc_client_use_callback(vc);
1724 changed_callback(before_state, current_state, user_data);
1725 vc_client_not_use_callback(vc);
1726 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1728 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1732 static Eina_Bool __vc_notify_result(void *data)
1736 vc_cmd_list_h vc_cmd_list = NULL;
1738 vc_result_cb callback = NULL;
1739 void* user_data = NULL;
1741 vc_client_get_result_cb(g_vc, &callback, &user_data);
1743 if (NULL == callback) {
1744 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1748 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1749 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1753 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1755 SECURE_SLOG(LOG_INFO, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1757 vc_cmd_print_list(vc_cmd_list);
1759 vc_client_use_callback(g_vc);
1760 callback(event, vc_cmd_list, temp_text, user_data);
1761 vc_client_not_use_callback(g_vc);
1763 SLOG(LOG_INFO, TAG_VCC, "Client result callback called");
1765 vc_cmd_list_destroy(vc_cmd_list, true);
1767 /* Release result */
1768 if (NULL != temp_text) free(temp_text);
1773 void __vc_cb_result(void)
1775 ecore_timer_add(0, __vc_notify_result, NULL);
1781 int vc_get_result(vc_result_cb callback, void* user_data)
1783 if (0 != __vc_get_feature_enabled()) {
1784 return VC_ERROR_NOT_SUPPORTED;
1786 if (0 != __vc_check_privilege()) {
1787 return VC_ERROR_PERMISSION_DENIED;
1790 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result");
1793 if (0 != vc_client_get_client_state(g_vc, &state)) {
1794 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1795 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1796 return VC_ERROR_INVALID_STATE;
1800 if (state != VC_STATE_READY) {
1801 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
1802 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
1803 return VC_ERROR_INVALID_STATE;
1806 if (NULL == callback) {
1807 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL"); //LCOV_EXCL_LINE
1808 return VC_ERROR_INVALID_PARAMETER;
1811 char* temp_text = NULL;
1813 vc_cmd_list_h vc_cmd_list = NULL;
1815 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1816 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
1817 return VC_ERROR_INVALID_PARAMETER;
1820 int ret = vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1821 if (0 != ret || NULL == temp_text) {
1822 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get result, ret(%d) temp_text(%s)", ret, temp_text); //LCOV_EXCL_LINE
1826 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event); //LCOV_EXCL_LINE
1828 vc_cmd_print_list(vc_cmd_list);
1830 vc_client_use_callback(g_vc);
1831 callback(event, vc_cmd_list, temp_text, user_data);
1832 vc_client_not_use_callback(g_vc);
1834 vc_cmd_list_destroy(vc_cmd_list, true);
1836 /* Release result */
1837 if (NULL != temp_text) {
1842 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1844 return VC_ERROR_NONE;
1847 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1849 if (0 != __vc_get_feature_enabled()) {
1850 return VC_ERROR_NOT_SUPPORTED;
1852 if (0 != __vc_check_privilege()) {
1853 return VC_ERROR_PERMISSION_DENIED;
1856 if (NULL == callback)
1857 return VC_ERROR_INVALID_PARAMETER;
1860 if (0 != vc_client_get_client_state(g_vc, &state)) {
1861 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1862 return VC_ERROR_INVALID_STATE;
1866 if (state != VC_STATE_INITIALIZED) {
1867 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1868 return VC_ERROR_INVALID_STATE;
1871 vc_client_set_result_cb(g_vc, callback, user_data);
1876 int vc_unset_result_cb(void)
1878 if (0 != __vc_get_feature_enabled()) {
1879 return VC_ERROR_NOT_SUPPORTED;
1881 if (0 != __vc_check_privilege()) {
1882 return VC_ERROR_PERMISSION_DENIED;
1886 if (0 != vc_client_get_client_state(g_vc, &state)) {
1887 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1888 return VC_ERROR_INVALID_STATE;
1892 if (state != VC_STATE_INITIALIZED) {
1893 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1894 return VC_ERROR_INVALID_STATE;
1897 vc_client_set_result_cb(g_vc, NULL, NULL);
1903 int __vc_cb_service_state(int state)
1905 vc_service_state_e current_state = (vc_service_state_e)state;
1906 vc_service_state_e before_state;
1907 vc_client_get_service_state(g_vc, &before_state);
1909 if (current_state == before_state) {
1913 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
1914 before_state, current_state);
1916 /* Save service state */
1917 vc_client_set_service_state(g_vc, current_state);
1919 vc_service_state_changed_cb callback = NULL;
1920 void* service_user_data;
1921 vc_client_get_service_state_changed_cb(g_vc, &callback, &service_user_data);
1923 if (NULL != callback) {
1924 vc_client_use_callback(g_vc);
1925 callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
1926 vc_client_not_use_callback(g_vc);
1927 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
1929 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null");
1936 int __vc_cb_manager_pid(int manager_pid)
1938 SLOG(LOG_DEBUG, TAG_VCC, "Manager pid is changed : %d", manager_pid); //LCOV_EXCL_LINE
1940 /* Save service state */
1941 vc_client_set_mgr_pid(g_vc, manager_pid);
1946 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1948 if (0 != __vc_get_feature_enabled()) {
1949 return VC_ERROR_NOT_SUPPORTED;
1951 if (0 != __vc_check_privilege()) {
1952 return VC_ERROR_PERMISSION_DENIED;
1955 if (NULL == callback)
1956 return VC_ERROR_INVALID_PARAMETER;
1959 if (0 != vc_client_get_client_state(g_vc, &state)) {
1960 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1961 return VC_ERROR_INVALID_STATE;
1965 if (state != VC_STATE_INITIALIZED) {
1966 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1967 return VC_ERROR_INVALID_STATE;
1970 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
1975 int vc_unset_service_state_changed_cb(void)
1977 if (0 != __vc_get_feature_enabled()) {
1978 return VC_ERROR_NOT_SUPPORTED;
1980 if (0 != __vc_check_privilege()) {
1981 return VC_ERROR_PERMISSION_DENIED;
1985 if (0 != vc_client_get_client_state(g_vc, &state)) {
1986 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1987 return VC_ERROR_INVALID_STATE;
1991 if (state != VC_STATE_INITIALIZED) {
1992 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1993 return VC_ERROR_INVALID_STATE;
1996 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
2001 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2003 if (0 != __vc_get_feature_enabled()) {
2004 return VC_ERROR_NOT_SUPPORTED;
2006 if (0 != __vc_check_privilege()) {
2007 return VC_ERROR_PERMISSION_DENIED;
2010 if (callback == NULL)
2011 return VC_ERROR_INVALID_PARAMETER;
2014 if (0 != vc_client_get_client_state(g_vc, &state)) {
2015 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
2016 return VC_ERROR_INVALID_STATE;
2020 if (state != VC_STATE_INITIALIZED) {
2021 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2022 return VC_ERROR_INVALID_STATE;
2025 vc_client_set_state_changed_cb(g_vc, callback, user_data);
2030 int vc_unset_state_changed_cb(void)
2032 if (0 != __vc_get_feature_enabled()) {
2033 return VC_ERROR_NOT_SUPPORTED;
2035 if (0 != __vc_check_privilege()) {
2036 return VC_ERROR_PERMISSION_DENIED;
2040 if (0 != vc_client_get_client_state(g_vc, &state)) {
2041 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
2042 return VC_ERROR_INVALID_STATE;
2046 if (state != VC_STATE_INITIALIZED) {
2047 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2048 return VC_ERROR_INVALID_STATE;
2051 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
2056 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2058 if (0 != __vc_get_feature_enabled()) {
2059 return VC_ERROR_NOT_SUPPORTED;
2061 if (0 != __vc_check_privilege()) {
2062 return VC_ERROR_PERMISSION_DENIED;
2065 if (NULL == callback)
2066 return VC_ERROR_INVALID_PARAMETER;
2069 if (0 != vc_client_get_client_state(g_vc, &state)) {
2070 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
2071 return VC_ERROR_INVALID_STATE;
2075 if (state != VC_STATE_INITIALIZED) {
2076 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : Current state is not 'Initialized'");
2077 return VC_ERROR_INVALID_STATE;
2080 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
2085 int vc_unset_current_language_changed_cb(void)
2087 if (0 != __vc_get_feature_enabled()) {
2088 return VC_ERROR_NOT_SUPPORTED;
2090 if (0 != __vc_check_privilege()) {
2091 return VC_ERROR_PERMISSION_DENIED;
2095 if (0 != vc_client_get_client_state(g_vc, &state)) {
2096 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
2097 return VC_ERROR_INVALID_STATE;
2101 if (state != VC_STATE_INITIALIZED) {
2102 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2103 return VC_ERROR_INVALID_STATE;
2106 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
2111 int vc_set_error_cb(vc_error_cb callback, void* user_data)
2113 if (0 != __vc_get_feature_enabled()) {
2114 return VC_ERROR_NOT_SUPPORTED;
2116 if (0 != __vc_check_privilege()) {
2117 return VC_ERROR_PERMISSION_DENIED;
2120 if (NULL == callback)
2121 return VC_ERROR_INVALID_PARAMETER;
2124 if (0 != vc_client_get_client_state(g_vc, &state)) {
2125 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
2126 return VC_ERROR_INVALID_STATE;
2130 if (state != VC_STATE_INITIALIZED) {
2131 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : Current state is not 'Initialized'");
2132 return VC_ERROR_INVALID_STATE;
2135 vc_client_set_error_cb(g_vc, callback, user_data);
2140 int vc_unset_error_cb(void)
2142 if (0 != __vc_get_feature_enabled()) {
2143 return VC_ERROR_NOT_SUPPORTED;
2145 if (0 != __vc_check_privilege()) {
2146 return VC_ERROR_PERMISSION_DENIED;
2150 if (0 != vc_client_get_client_state(g_vc, &state)) {
2151 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
2152 return VC_ERROR_INVALID_STATE;
2156 if (state != VC_STATE_INITIALIZED) {
2157 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2158 return VC_ERROR_INVALID_STATE;
2161 vc_client_set_error_cb(g_vc, NULL, NULL);
2166 int vc_set_invocation_name(const char* name)
2168 if (0 != __vc_get_feature_enabled()) {
2169 return VC_ERROR_NOT_SUPPORTED;
2171 if (0 != __vc_check_privilege()) {
2172 return VC_ERROR_PERMISSION_DENIED;
2176 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set invocation name");
2178 int ret = vc_client_get_client_state(g_vc, &state);
2180 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2181 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2186 if (state != VC_STATE_READY) {
2187 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
2188 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2189 return VC_ERROR_INVALID_STATE;
2192 ret = vc_client_set_invocation_name(g_vc, name);
2194 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set invocation name");
2200 int vc_set_server_dialog(const char* app_id, const char* credential)
2205 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog, pid(%d), app_id(%s)", getpid(), app_id);
2206 if (0 != __vc_get_feature_enabled()) {
2207 return VC_ERROR_NOT_SUPPORTED;
2209 if (0 != __vc_check_privilege()) {
2210 return VC_ERROR_PERMISSION_DENIED;
2213 if (NULL == credential) {
2214 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Credential is NULL");
2215 return VC_ERROR_INVALID_PARAMETER;
2218 if (0 != vc_client_get_client_state(g_vc, &state)) {
2219 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2220 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2221 return VC_ERROR_INVALID_STATE;
2225 if (state != VC_STATE_READY) {
2226 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2227 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2228 return VC_ERROR_INVALID_STATE;
2231 /* Check service state */
2232 vc_service_state_e service_state = -1;
2233 vc_client_get_service_state(g_vc, &service_state);
2234 if (service_state != VC_SERVICE_STATE_READY) {
2235 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2236 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2237 return VC_ERROR_INVALID_STATE;
2240 char* tmp_appid = NULL;
2241 if (NULL == app_id) {
2242 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2243 if (0 != ret || NULL == tmp_appid) {
2244 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2245 if (NULL != tmp_appid)
2247 return VC_ERROR_INVALID_PARAMETER;
2250 tmp_appid = strdup(app_id);
2254 SLOG(LOG_DEBUG, TAG_VCC, "Set server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2257 bool is_prepared = false;
2259 ret = vc_dbus_set_server_dialog(pid, tmp_appid, credential);
2261 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2262 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2263 if (0 == vc_prepare_sync()) {
2265 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2267 } else if (VC_ERROR_TIMED_OUT != ret) {
2268 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set server dialog to vc service : %s", __vc_get_error_code(ret));
2271 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set server dialog : %s", __vc_get_error_code(ret));
2274 if (VC_RETRY_COUNT == count) {
2275 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2283 if (NULL != tmp_appid)
2286 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2291 int vc_unset_server_dialog(const char* app_id)
2296 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog, pid(%d), app_id(%s)", getpid(), app_id);
2297 if (0 != __vc_get_feature_enabled()) {
2298 return VC_ERROR_NOT_SUPPORTED;
2300 if (0 != __vc_check_privilege()) {
2301 return VC_ERROR_PERMISSION_DENIED;
2304 if (0 != vc_client_get_client_state(g_vc, &state)) {
2305 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2306 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2307 return VC_ERROR_INVALID_STATE;
2311 if (state != VC_STATE_READY) {
2312 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2313 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2314 return VC_ERROR_INVALID_STATE;
2317 /* Check service state */
2318 vc_service_state_e service_state = -1;
2319 vc_client_get_service_state(g_vc, &service_state);
2320 if (service_state != VC_SERVICE_STATE_READY) {
2321 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2322 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2323 return VC_ERROR_INVALID_STATE;
2326 char* tmp_appid = NULL;
2327 if (NULL == app_id) {
2328 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2329 if (0 != ret || NULL == tmp_appid) {
2330 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2331 if (NULL != tmp_appid)
2333 return VC_ERROR_INVALID_PARAMETER;
2336 tmp_appid = strdup(app_id);
2340 SLOG(LOG_DEBUG, TAG_VCC, "Unset server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2343 bool is_prepared = false;
2344 char* credential = strdup("#NULL");
2346 ret = vc_dbus_set_server_dialog(pid, tmp_appid, credential);
2348 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2349 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2350 if (0 == vc_prepare_sync()) {
2352 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2354 } else if (VC_ERROR_TIMED_OUT != ret) {
2355 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset server dialog to vc service : %s", __vc_get_error_code(ret));
2358 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset server dialog : %s", __vc_get_error_code(ret));
2361 if (VC_RETRY_COUNT == count) {
2362 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2370 if (NULL != tmp_appid)
2372 if (NULL != credential)
2375 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2381 int vc_request_dialog(const char* disp_text, const char* utt_text, bool auto_start)
2385 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog");
2386 if (0 != __vc_get_feature_enabled()) {
2387 return VC_ERROR_NOT_SUPPORTED;
2389 if (0 != __vc_check_privilege()) {
2390 return VC_ERROR_PERMISSION_DENIED;
2393 if (0 != vc_client_get_client_state(g_vc, &state)) {
2394 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2395 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2396 return VC_ERROR_INVALID_STATE;
2400 if (state != VC_STATE_READY) {
2401 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
2402 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
2403 return VC_ERROR_INVALID_STATE;
2406 /* Check service state */
2407 vc_service_state_e service_state = -1;
2408 vc_client_get_service_state(g_vc, &service_state);
2409 if (service_state != VC_SERVICE_STATE_READY) {
2410 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'"); //LCOV_EXCL_LINE
2411 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
2412 return VC_ERROR_INVALID_STATE;
2415 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);
2416 int ret = vc_dbus_request_dialog(getpid(), disp_text, utt_text, auto_start);
2418 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request dialog, ret(%d)", ret);
2419 return VC_ERROR_OPERATION_FAILED;
2422 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2424 return VC_ERROR_NONE;
2429 int vc_auth_enable(void)
2433 if (0 != vc_client_get_client_state(g_vc, &state)) {
2434 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2435 return VC_ERROR_INVALID_STATE;
2438 if (VC_STATE_READY != state) {
2439 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2440 return VC_ERROR_INVALID_STATE;
2443 /* check already authority */
2444 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2445 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2446 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2447 return VC_ERROR_INVALID_STATE;
2450 if (VC_AUTH_STATE_NONE != auth_state) {
2451 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already authority enabled");
2452 return VC_ERROR_INVALID_STATE;
2455 /* request authority */
2457 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2458 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2459 return VC_ERROR_OPERATION_FAILED;
2462 if (0 != vc_dbus_request_auth_enable(g_vc->handle, mgr_pid)) {
2463 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
2464 return VC_ERROR_OPERATION_FAILED;
2467 /* set authority into handle */
2468 bool is_foreground = false;
2469 if (0 != vc_client_get_is_foreground(g_vc, &is_foreground)) {
2470 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get is_foreground");
2471 return VC_ERROR_OPERATION_FAILED;
2474 if (is_foreground) {
2475 auth_state = VC_AUTH_STATE_VALID;
2477 auth_state = VC_AUTH_STATE_INVALID;
2480 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
2481 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2482 return VC_ERROR_OPERATION_FAILED;
2485 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2487 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
2489 return VC_ERROR_NONE;
2492 int vc_auth_disable(void)
2496 if (0 != vc_client_get_client_state(g_vc, &state)) {
2497 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2498 return VC_ERROR_INVALID_STATE;
2501 if (VC_STATE_READY != state) {
2502 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2503 return VC_ERROR_INVALID_STATE;
2506 /* check authority */
2507 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2508 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2509 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2510 return VC_ERROR_INVALID_STATE;
2513 if (VC_AUTH_STATE_NONE == auth_state) {
2514 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] No authority");
2515 return VC_ERROR_INVALID_STATE;
2518 if (0 != vc_auth_unset_state_changed_cb()) {
2519 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
2522 /* request return authority by dbus */
2524 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2525 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2526 return VC_ERROR_OPERATION_FAILED;
2529 if (0 != vc_dbus_request_auth_disable(g_vc->handle, mgr_pid)) {
2530 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disable");
2531 return VC_ERROR_OPERATION_FAILED;
2534 /* unset authority from handle */
2535 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
2536 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2537 return VC_ERROR_OPERATION_FAILED;
2540 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2542 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
2544 return VC_ERROR_NONE;
2547 int vc_auth_get_state(vc_auth_state_e* state)
2550 vc_state_e vc_state;
2551 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
2552 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2553 return VC_ERROR_INVALID_STATE;
2556 if (VC_STATE_READY != vc_state) {
2557 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2558 return VC_ERROR_INVALID_STATE;
2562 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
2563 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
2564 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2565 return VC_ERROR_INVALID_STATE;
2570 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
2572 return VC_ERROR_NONE;
2575 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
2577 /* check parameter */
2578 if (NULL == callback) {
2579 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
2580 return VC_ERROR_INVALID_PARAMETER;
2584 vc_auth_state_e auth_state;
2585 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2586 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2587 return VC_ERROR_INVALID_STATE;
2590 if (VC_AUTH_STATE_NONE == auth_state) {
2591 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auth is not enabled");
2592 return VC_ERROR_INVALID_STATE;
2595 /* set cb into handle */
2596 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
2597 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
2598 return VC_ERROR_OPERATION_FAILED;
2601 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
2603 return VC_ERROR_NONE;
2606 int vc_auth_unset_state_changed_cb(void)
2609 vc_auth_state_e auth_state;
2610 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2611 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2612 return VC_ERROR_INVALID_STATE;
2615 if (VC_AUTH_STATE_NONE == auth_state) {
2616 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auto is not enabled");
2617 return VC_ERROR_INVALID_STATE;
2620 /* unset cb from handle */
2621 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
2622 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
2623 return VC_ERROR_OPERATION_FAILED;
2626 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
2628 return VC_ERROR_NONE;
2631 int vc_auth_start(void)
2633 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
2636 if (0 != vc_client_get_client_state(g_vc, &state)) {
2637 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2638 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2639 return VC_ERROR_INVALID_STATE;
2643 if (state != VC_STATE_READY) {
2644 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
2645 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2646 return VC_ERROR_INVALID_STATE;
2649 /* Check service state */
2650 vc_service_state_e service_state = -1;
2651 vc_client_get_service_state(g_vc, &service_state);
2652 if (service_state != VC_SERVICE_STATE_READY) {
2653 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
2654 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2655 return VC_ERROR_INVALID_STATE;
2658 /* Check authority */
2659 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2660 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2661 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2662 return VC_ERROR_OPERATION_FAILED;
2665 if (VC_AUTH_STATE_VALID != auth_state) {
2666 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2667 return VC_ERROR_OPERATION_FAILED;
2672 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2673 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2674 return VC_ERROR_OPERATION_FAILED;
2679 bool is_prepared = false;
2682 ret = vc_dbus_request_auth_start(g_vc->handle, mgr_pid);
2684 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2685 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2686 if (0 == vc_prepare_sync()) {
2688 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2690 } else if (VC_ERROR_TIMED_OUT != ret) {
2691 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
2694 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
2697 if (VC_RETRY_COUNT == count) {
2698 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2703 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
2707 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2712 int vc_auth_stop(void)
2714 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
2717 if (0 != vc_client_get_client_state(g_vc, &state)) {
2718 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2719 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2720 return VC_ERROR_INVALID_STATE;
2724 if (state != VC_STATE_READY) {
2725 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
2726 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2727 return VC_ERROR_INVALID_STATE;
2730 /* Check service state */
2731 vc_service_state_e service_state = -1;
2732 vc_client_get_service_state(g_vc, &service_state);
2733 if (service_state != VC_SERVICE_STATE_RECORDING) {
2734 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
2735 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2736 return VC_ERROR_INVALID_STATE;
2739 /* Check authority */
2740 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2741 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2742 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2743 return VC_ERROR_OPERATION_FAILED;
2746 if (VC_AUTH_STATE_VALID != auth_state) {
2747 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2748 return VC_ERROR_OPERATION_FAILED;
2753 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2754 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2755 return VC_ERROR_OPERATION_FAILED;
2760 bool is_prepared = false;
2763 ret = vc_dbus_request_auth_stop(g_vc->handle, mgr_pid);
2765 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2766 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2767 if (0 == vc_prepare_sync()) {
2769 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2771 } else if (VC_ERROR_TIMED_OUT != ret) {
2772 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
2775 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
2778 if (VC_RETRY_COUNT == count) {
2779 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2784 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
2788 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2793 int vc_auth_cancel(void)
2795 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel");
2798 if (0 != vc_client_get_client_state(g_vc, &state)) {
2799 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2800 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2801 return VC_ERROR_INVALID_STATE;
2805 if (state != VC_STATE_READY) {
2806 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
2807 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2808 return VC_ERROR_INVALID_STATE;
2811 /* Check service state */
2812 vc_service_state_e service_state = -1;
2813 vc_client_get_service_state(g_vc, &service_state);
2814 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
2815 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
2816 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2817 return VC_ERROR_INVALID_STATE;
2820 /* Check authority */
2821 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2822 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2823 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2824 return VC_ERROR_OPERATION_FAILED;
2827 if (VC_AUTH_STATE_VALID != auth_state) {
2828 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2829 return VC_ERROR_OPERATION_FAILED;
2834 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2835 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2836 return VC_ERROR_OPERATION_FAILED;
2841 bool is_prepared = false;
2843 ret = vc_dbus_request_auth_cancel(g_vc->handle, mgr_pid);
2845 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2846 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2847 if (0 == vc_prepare_sync()) {
2849 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2851 } else if (VC_ERROR_TIMED_OUT != ret) {
2852 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
2855 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
2858 if (VC_RETRY_COUNT == count) {
2859 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2864 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
2868 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2873 static void __start_tts_streaming_thread(void* data, Ecore_Thread* thread)
2875 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Start tts streaming thread");
2877 vc_tts_data_s* tts_data = NULL;
2878 vc_tts_streaming_cb callback = NULL;
2879 void* user_data = NULL;
2881 vc_client_get_tts_streaming_cb(g_vc, &callback, &user_data);
2882 if (NULL == callback) {
2883 SLOG(LOG_WARN, TAG_VCC, "[WARNING] tts streaming callback is null");
2892 ret = vc_data_get_tts_data(&tts_data);
2893 if (0 != ret || NULL == tts_data) {
2895 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] No tts data. Waiting mode");
2900 if (0 < vc_data_get_tts_data_size()) {
2901 SLOG(LOG_INFO, TAG_VCC, "[INFO] Resume thread");
2905 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Wrong request, there's no pcm data");
2906 vc_data_clear_tts_data(&tts_data);
2911 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish to wait for new tts data come");
2913 /* resume tts thread */
2914 vc_data_clear_tts_data(&tts_data);
2918 if (NULL != tts_data) {
2919 SLOG(LOG_DEBUG, TAG_VCC, "tts streaming callback is called");
2920 vc_client_use_callback(g_vc);
2921 callback(tts_data->event, tts_data->data, tts_data->data_size, tts_data->utt_id, user_data);
2922 vc_client_not_use_callback(g_vc);
2924 /* If no tts data and EVENT_FINISH */
2925 if (0 >= vc_data_get_tts_data_size() && VC_TTS_EVENT_FINISH == tts_data->event) {
2926 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish tts");
2937 static void __end_tts_streaming_thread(void* data, Ecore_Thread* thread)
2939 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] End tts streaming thread");
2940 g_tts_thread = NULL;
2943 int __vc_cb_tts_streaming(int utt_id, vc_tts_event_e event, char* buffer, int len)
2946 vc_tts_data_s* temp_tts_data = NULL;
2947 temp_tts_data = (vc_tts_data_s*)calloc(1, sizeof(vc_tts_data_s));
2948 if (NULL == temp_tts_data) {
2949 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Out of memory");
2950 return VC_ERROR_OUT_OF_MEMORY;
2953 temp_tts_data->data = NULL;
2954 temp_tts_data->data_size = 0;
2957 temp_tts_data->data = (char*)calloc(len + 5, sizeof(char));
2958 if (NULL != temp_tts_data->data) {
2959 memcpy(temp_tts_data->data, buffer, len);
2960 temp_tts_data->data_size = len;
2961 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG][memcpy] data(%p) size(%d)",
2962 temp_tts_data->data, temp_tts_data->data_size);
2964 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to allocate memory");
2967 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] tts data is NULL");
2970 temp_tts_data->utt_id = utt_id;
2971 temp_tts_data->event = event;
2973 int ret = vc_data_add_tts_data(temp_tts_data);
2975 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to add tts data");
2976 if (NULL != temp_tts_data->data) {
2977 free(temp_tts_data->data);
2978 temp_tts_data->data = NULL;
2980 if (NULL != temp_tts_data) {
2981 free(temp_tts_data);
2982 temp_tts_data = NULL;
2986 bool is_canceled = ecore_thread_check(g_tts_thread);
2987 if (NULL == g_tts_thread || TRUE == is_canceled) {
2988 SLOG(LOG_INFO, TAG_VCC, "ecore thread run : __start_tts_streaming_thread ");
2989 g_tts_thread = ecore_thread_run(__start_tts_streaming_thread, __end_tts_streaming_thread, NULL, NULL);
2995 int vc_tts_request(const char* text, const char* language, bool to_vc_manager, int* utt_id)
3001 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request tts");
3003 if (0 != __vc_get_feature_enabled()) {
3004 return VC_ERROR_NOT_SUPPORTED;
3006 if (0 != __vc_check_privilege()) {
3007 return VC_ERROR_PERMISSION_DENIED;
3010 if (0 != vc_client_get_client_state(g_vc, &state)) {
3011 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3012 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3013 return VC_ERROR_INVALID_STATE;
3017 if (state != VC_STATE_READY) {
3018 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3019 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3020 return VC_ERROR_INVALID_STATE;
3023 /* Check service state */
3024 vc_service_state_e service_state = -1;
3025 vc_client_get_service_state(g_vc, &service_state);
3026 if (service_state != VC_SERVICE_STATE_READY) {
3027 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3028 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3029 return VC_ERROR_INVALID_STATE;
3032 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts request, pid(%d), text(%s), language(%s), to_vc_manager(%d)", pid, text, language, to_vc_manager);
3035 bool is_prepared = false;
3037 ret = vc_dbus_request_tts(pid, text, language, to_vc_manager, utt_id);
3039 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3040 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3041 if (0 == vc_prepare_sync()) {
3043 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3045 } else if (VC_ERROR_TIMED_OUT != ret) {
3046 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request tts to vc service : %s", __vc_get_error_code(ret));
3049 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request tts : %s", __vc_get_error_code(ret));
3052 if (VC_RETRY_COUNT == count) {
3053 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
3060 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3065 int vc_tts_cancel(int utt_id)
3071 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Cancel tts");
3073 if (0 != __vc_get_feature_enabled()) {
3074 return VC_ERROR_NOT_SUPPORTED;
3076 if (0 != __vc_check_privilege()) {
3077 return VC_ERROR_PERMISSION_DENIED;
3080 if (0 != vc_client_get_client_state(g_vc, &state)) {
3081 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3082 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3083 return VC_ERROR_INVALID_STATE;
3087 if (state != VC_STATE_READY) {
3088 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3089 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3090 return VC_ERROR_INVALID_STATE;
3093 /* Check service state */
3094 vc_service_state_e service_state = -1;
3095 vc_client_get_service_state(g_vc, &service_state);
3096 if (service_state != VC_SERVICE_STATE_READY) {
3097 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3098 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3099 return VC_ERROR_INVALID_STATE;
3102 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts cancel, pid(%d), utt_id(%d)", pid, utt_id);
3104 ret = vc_data_clear_tts_data_by_uttid(utt_id);
3106 SLOG(LOG_INFO, TAG_VCC, "[INFO] There's no data in client pcm queue");
3110 bool is_prepared = false;
3112 ret = vc_dbus_cancel_tts(pid, utt_id);
3114 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3115 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3116 if (0 == vc_prepare_sync()) {
3118 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3120 } else if (VC_ERROR_TIMED_OUT != ret) {
3121 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel tts to vc service : %s", __vc_get_error_code(ret));
3124 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel tts : %s", __vc_get_error_code(ret));
3127 if (VC_RETRY_COUNT == count) {
3128 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel");
3135 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3140 int vc_tts_get_synthesized_audio_details(int* rate, vc_audio_channel_e* channel, vc_audio_type_e* audio_type)
3146 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Get tts audio format");
3148 if (0 != __vc_get_feature_enabled()) {
3149 return VC_ERROR_NOT_SUPPORTED;
3151 if (0 != __vc_check_privilege()) {
3152 return VC_ERROR_PERMISSION_DENIED;
3155 if (0 != vc_client_get_client_state(g_vc, &state)) {
3156 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3157 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3158 return VC_ERROR_INVALID_STATE;
3162 if (state != VC_STATE_READY) {
3163 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3164 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3165 return VC_ERROR_INVALID_STATE;
3168 /* Check service state */
3169 vc_service_state_e service_state = -1;
3170 vc_client_get_service_state(g_vc, &service_state);
3171 if (service_state != VC_SERVICE_STATE_READY) {
3172 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3173 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3174 return VC_ERROR_INVALID_STATE;
3177 SLOG(LOG_DEBUG, TAG_VCC, "@@@ get tts audio format, pid(%d)", pid);
3180 bool is_prepared = false;
3182 ret = vc_dbus_get_tts_audio_format(pid, rate, channel, audio_type);
3184 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3185 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3186 if (0 == vc_prepare_sync()) {
3188 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3190 } else if (VC_ERROR_TIMED_OUT != ret) {
3191 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format : %s", __vc_get_error_code(ret));
3194 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to get tts audio format : %s", __vc_get_error_code(ret));
3197 if (VC_RETRY_COUNT == count) {
3198 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format");
3205 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3210 int vc_tts_set_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
3212 if (0 != __vc_get_feature_enabled()) {
3213 return VC_ERROR_NOT_SUPPORTED;
3215 if (0 != __vc_check_privilege()) {
3216 return VC_ERROR_PERMISSION_DENIED;
3219 if (NULL == callback)
3220 return VC_ERROR_INVALID_PARAMETER;
3223 if (0 != vc_client_get_client_state(g_vc, &state)) {
3224 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : A handle is not available");
3225 return VC_ERROR_INVALID_STATE;
3229 if (state != VC_STATE_INITIALIZED) {
3230 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : Current state(%d) is not 'Initialized'", state);
3231 return VC_ERROR_INVALID_STATE;
3234 vc_client_set_tts_streaming_cb(g_vc, callback, user_data);
3239 int vc_tts_unset_streaming_cb(void)
3241 if (0 != __vc_get_feature_enabled()) {
3242 return VC_ERROR_NOT_SUPPORTED;
3244 if (0 != __vc_check_privilege()) {
3245 return VC_ERROR_PERMISSION_DENIED;
3249 if (0 != vc_client_get_client_state(g_vc, &state)) {
3250 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : A handle is not available");
3251 return VC_ERROR_INVALID_STATE;
3255 if (state != VC_STATE_INITIALIZED) {
3256 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : Current state(%d) is not 'Initialized'", state);
3257 return VC_ERROR_INVALID_STATE;
3260 vc_client_set_tts_streaming_cb(g_vc, NULL, NULL);
3265 int __vc_cb_utterance_status(int utt_id, int utt_status)
3267 vc_tts_utterance_status_cb callback = NULL;
3268 void* user_data = NULL;
3270 vc_client_get_tts_utterance_status_cb(g_vc, &callback, &user_data);
3271 if (NULL == callback) {
3272 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Utterance status callback is null");
3276 SLOG(LOG_DEBUG, TAG_VCC, "Utterance status callback is called");
3277 vc_client_use_callback(g_vc);
3278 callback(utt_id, (vc_tts_utterance_status_e)utt_status, user_data);
3279 vc_client_not_use_callback(g_vc);
3284 int vc_tts_set_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
3286 if (0 != __vc_get_feature_enabled()) {
3287 return VC_ERROR_NOT_SUPPORTED;
3289 if (0 != __vc_check_privilege()) {
3290 return VC_ERROR_PERMISSION_DENIED;
3293 if (NULL == callback)
3294 return VC_ERROR_INVALID_PARAMETER;
3297 if (0 != vc_client_get_client_state(g_vc, &state)) {
3298 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : A handle is not available");
3299 return VC_ERROR_INVALID_STATE;
3303 if (state != VC_STATE_INITIALIZED) {
3304 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : Current state(%d) is not 'Initialized'", state);
3305 return VC_ERROR_INVALID_STATE;
3308 vc_client_set_tts_utterance_status_cb(g_vc, callback, user_data);
3313 int vc_tts_unset_utterance_status_cb(void)
3315 if (0 != __vc_get_feature_enabled()) {
3316 return VC_ERROR_NOT_SUPPORTED;
3318 if (0 != __vc_check_privilege()) {
3319 return VC_ERROR_PERMISSION_DENIED;
3323 if (0 != vc_client_get_client_state(g_vc, &state)) {
3324 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : A handle is not available");
3325 return VC_ERROR_INVALID_STATE;
3329 if (state != VC_STATE_INITIALIZED) {
3330 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : Current state(%d) is not 'Initialized'", state);
3331 return VC_ERROR_INVALID_STATE;
3334 vc_client_set_tts_utterance_status_cb(g_vc, NULL, NULL);