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_Wayland.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"
33 #include "vc_info_parser.h"
34 #include "vc_json_parser.h"
36 #include "voice_control.h"
37 #include "voice_control_internal.h"
38 #include "voice_control_authority.h"
39 #include "voice_control_command.h"
40 #include "voice_control_command_expand.h"
44 static Ecore_Timer* g_connect_timer = NULL;
46 static Ecore_Event_Handler* g_focus_in_handler = NULL;
47 static Ecore_Event_Handler* g_focus_out_handler = NULL;
49 static vc_h g_vc = NULL;
51 static int g_daemon_pid = 0;
53 static int g_feature_enabled = -1;
54 static bool g_backup = false;
56 static int g_privilege_allowed = -1;
57 static cynara *p_cynara = NULL;
59 static void __vc_notify_state_changed(void *data);
60 static void __vc_notify_error(void *data);
62 static int __vc_get_feature_enabled()
64 if (0 == g_feature_enabled) {
65 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
66 return VC_ERROR_NOT_SUPPORTED;
67 } else if (-1 == g_feature_enabled) {
68 bool vc_supported = false;
69 bool mic_supported = false;
70 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
71 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
72 if (false == vc_supported || false == mic_supported) {
73 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
74 g_feature_enabled = 0;
75 return VC_ERROR_NOT_SUPPORTED;
78 g_feature_enabled = 1;
80 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value");
81 return VC_ERROR_NOT_SUPPORTED;
84 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value");
85 return VC_ERROR_NOT_SUPPORTED;
92 static int __check_privilege_initialize()
94 int ret = cynara_initialize(&p_cynara, NULL);
95 if (CYNARA_API_SUCCESS != ret)
96 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to initialize");
98 return ret == CYNARA_API_SUCCESS;
101 static int __check_privilege(const char* uid, const char * privilege)
104 char label_path[1024] = "/proc/self/attr/current";
105 char smack_label[1024] = {'\0',};
111 fp = fopen(label_path, "r");
113 if (strlen(smack_label) != fread(smack_label, 1, sizeof(smack_label), fp))
114 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to fread");
119 pid_t pid = getpid();
120 char *session = cynara_session_from_pid(pid);
121 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
122 SLOG(LOG_DEBUG, TAG_VCC, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
126 if (ret != CYNARA_API_ACCESS_ALLOWED)
131 static void __check_privilege_deinitialize()
134 cynara_finish(p_cynara);
138 static int __vc_check_privilege()
142 if (0 == g_privilege_allowed) {
143 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied");
144 return VC_ERROR_PERMISSION_DENIED;
145 } else if (-1 == g_privilege_allowed) {
146 if (false == __check_privilege_initialize()) {
147 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed");
148 return VC_ERROR_PERMISSION_DENIED;
150 snprintf(uid, 16, "%d", getuid());
151 if (false == __check_privilege(uid, VC_PRIVILEGE)) {
152 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied");
153 g_privilege_allowed = 0;
154 __check_privilege_deinitialize();
155 return VC_ERROR_PERMISSION_DENIED;
157 __check_privilege_deinitialize();
160 g_privilege_allowed = 1;
161 return VC_ERROR_NONE;
164 static const char* __vc_get_error_code(vc_error_e err)
167 case VC_ERROR_NONE: return "VC_ERROR_NONE";
168 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
169 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
170 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
171 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
172 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
173 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
174 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
175 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
176 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
177 default: return "Invalid error code";
182 static int __vc_convert_config_error_code(vc_config_error_e code)
184 if (code == VC_CONFIG_ERROR_NONE) return VC_ERROR_NONE;
185 if (code == VC_CONFIG_ERROR_OUT_OF_MEMORY) return VC_ERROR_OUT_OF_MEMORY;
186 if (code == VC_CONFIG_ERROR_IO_ERROR) return VC_ERROR_IO_ERROR;
187 if (code == VC_CONFIG_ERROR_INVALID_PARAMETER) return VC_ERROR_INVALID_PARAMETER;
188 if (code == VC_CONFIG_ERROR_INVALID_STATE) return VC_ERROR_INVALID_STATE;
189 if (code == VC_CONFIG_ERROR_INVALID_LANGUAGE) return VC_ERROR_INVALID_LANGUAGE;
190 if (code == VC_CONFIG_ERROR_ENGINE_NOT_FOUND) return VC_ERROR_ENGINE_NOT_FOUND;
191 if (code == VC_CONFIG_ERROR_OPERATION_FAILED) return VC_ERROR_OPERATION_FAILED;
193 return VC_ERROR_NONE;
196 static void __vc_lang_changed_cb(const char* before_lang, const char* current_lang)
198 SLOG(LOG_DEBUG, TAG_VCC, "Lang changed : Before lang(%s) Current lang(%s)",
199 before_lang, current_lang);
201 vc_current_language_changed_cb callback;
202 void* lang_user_data;
203 vc_client_get_current_lang_changed_cb(g_vc, &callback, &lang_user_data);
205 if (NULL != callback) {
206 vc_client_use_callback(g_vc);
207 callback(before_lang, current_lang, lang_user_data);
208 vc_client_not_use_callback(g_vc);
209 SLOG(LOG_DEBUG, TAG_VCC, "Language changed callback is called");
211 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Language changed callback is null");
217 static Eina_Bool __notify_auth_changed_cb(void *data)
219 vc_auth_state_changed_cb callback = NULL;
222 vc_client_get_auth_state_changed_cb(g_vc, &callback, &user_data);
224 vc_auth_state_e before = -1;
225 vc_auth_state_e current = -1;
227 vc_client_get_before_auth_state(g_vc, &before, ¤t);
229 if (NULL != callback) {
230 vc_client_use_callback(g_vc);
231 callback(before, current, user_data);
232 vc_client_not_use_callback(g_vc);
233 SLOG(LOG_DEBUG, TAG_VCC, "Auth state changed callback is called");
235 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Auth state changed callback is null");
241 static Eina_Bool __focus_changed_cb(void *data, int type, void *event)
243 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Focus changed");
246 if (ECORE_WL_EVENT_FOCUS_IN == type) {
247 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground");
248 ret = vc_dbus_set_foreground(getpid(), true);
250 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
253 ret = vc_client_set_is_foreground(g_vc, true);
255 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret);
258 /* set authority valid */
259 vc_auth_state_e state = VC_AUTH_STATE_NONE;
260 if (0 != vc_client_get_auth_state(g_vc, &state)) {
261 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
263 if (VC_AUTH_STATE_INVALID == state) {
264 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
266 /* notify auth changed cb */
267 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
269 } else if (ECORE_WL_EVENT_FOCUS_OUT == type) {
270 SLOG(LOG_DEBUG, TAG_VCW, "@@@ Set background");
271 ret = vc_dbus_set_foreground(getpid(), false);
273 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (false) : %d", ret);
276 ret = vc_client_set_is_foreground(g_vc, false);
278 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (false) : %d", ret);
281 /* set authority valid */
282 vc_auth_state_e state = VC_AUTH_STATE_NONE;
283 if (0 != vc_client_get_auth_state(g_vc, &state)) {
284 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
286 if (VC_AUTH_STATE_VALID == state) {
287 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_INVALID);
289 /* notify authority changed cb */
290 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
293 SLOG(LOG_DEBUG, TAG_VCC, "@@@ type(%d) is NOT valid", type);
296 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
298 return ECORE_CALLBACK_RENEW;
301 int vc_initialize(void)
303 if (0 != __vc_get_feature_enabled()) {
304 return VC_ERROR_NOT_SUPPORTED;
306 if (0 != __vc_check_privilege()) {
307 return VC_ERROR_PERMISSION_DENIED;
310 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Initialize");
313 if (true == vc_client_is_valid(g_vc)) {
314 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized");
315 return VC_ERROR_NONE;
318 if (0 < vc_client_get_count()) {
319 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized");
320 return VC_ERROR_NONE;
323 if (0 != vc_dbus_open_connection()) {
324 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to open connection");
325 return VC_ERROR_OPERATION_FAILED;
328 if (0 != vc_client_create(&g_vc)) {
329 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create client!!!!!");
330 return VC_ERROR_OUT_OF_MEMORY;
333 int ret = vc_config_mgr_initialize(g_vc->handle);
335 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to init config manager : %s",
336 __vc_get_error_code(__vc_convert_config_error_code(ret)));
337 vc_client_destroy(g_vc);
338 return __vc_convert_config_error_code(ret);
341 ret = vc_config_mgr_set_lang_cb(g_vc->handle, __vc_lang_changed_cb);
343 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set config changed : %d", ret);
344 vc_config_mgr_finalize(g_vc->handle);
345 vc_client_destroy(g_vc);
346 return __vc_convert_config_error_code(ret);
349 ret = vc_db_initialize();
351 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize DB : %d", ret);
352 vc_config_mgr_finalize(g_vc->handle);
353 vc_client_destroy(g_vc);
357 SLOG(LOG_DEBUG, TAG_VCC, "[Success] pid(%d)", g_vc->handle);
359 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
361 return VC_ERROR_NONE;
364 static void __vc_internal_unprepare(void)
366 /* return authority */
367 vc_auth_state_e state = VC_AUTH_STATE_NONE;
368 if (0 != vc_client_get_auth_state(g_vc, &state)) {
369 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
372 if (VC_AUTH_STATE_NONE != state) {
373 if (0 != vc_auth_disable()) {
374 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to auth disable");
378 int ret = vc_dbus_request_finalize(g_vc->handle);
380 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret));
383 if (NULL != g_focus_in_handler) {
384 ecore_event_handler_del(g_focus_in_handler);
385 g_focus_in_handler = NULL;
387 if (NULL != g_focus_out_handler) {
388 ecore_event_handler_del(g_focus_out_handler);
389 g_focus_out_handler = NULL;
392 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
394 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret);
399 int vc_deinitialize(void)
401 int ret = VC_ERROR_NONE;
403 if (0 != __vc_get_feature_enabled()) {
404 return VC_ERROR_NOT_SUPPORTED;
406 if (0 != __vc_check_privilege()) {
407 return VC_ERROR_PERMISSION_DENIED;
410 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Deinitialize");
412 if (false == vc_client_is_valid(g_vc)) {
413 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NOT initialized");
414 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
415 return VC_ERROR_INVALID_STATE;
419 vc_client_get_client_state(g_vc, &state);
424 __vc_internal_unprepare();
425 /* no break. need to next step*/
426 case VC_STATE_INITIALIZED:
427 if (NULL != g_connect_timer) {
428 SLOG(LOG_DEBUG, TAG_VCC, "Connect Timer is deleted");
429 ecore_timer_del(g_connect_timer);
430 g_connect_timer = NULL;
433 vc_config_mgr_unset_lang_cb(g_vc->handle);
434 vc_config_mgr_finalize(g_vc->handle);
436 /* Free client resources */
437 vc_client_destroy(g_vc);
444 SLOG(LOG_DEBUG, TAG_VCC, "Success: destroy");
446 if (true == g_backup) {
447 ret = vc_db_backup_command();
449 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to backup command, ret(%d)", ret);
453 ret = vc_db_finalize();
455 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB, ret(%d)", ret);
458 if (0 != vc_dbus_close_connection()) {
459 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection");
462 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
464 return VC_ERROR_NONE;
467 static Eina_Bool __vc_connect_daemon(void *data)
470 if (0 != vc_dbus_request_hello()) {
474 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon");
476 /* request initialization */
479 int service_state = 0;
481 g_connect_timer = NULL;
483 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
485 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret);
487 ret = vc_dbus_request_initialize(g_vc->handle, &mgr_pid, &service_state, &g_daemon_pid);
488 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
489 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
491 vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND);
492 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
494 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
497 } else if (0 != ret) {
498 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret));
500 vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT);
501 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
503 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
506 /* Success to connect */
509 /* Set service state */
510 vc_client_set_service_state(g_vc, (vc_service_state_e)service_state);
512 g_focus_in_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN, __focus_changed_cb, NULL);
513 g_focus_out_handler = ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT, __focus_changed_cb, NULL);
515 char appid[255] = {'\0',};
516 aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
518 int status = aul_app_get_status(appid);
519 if (STATUS_FOCUS == status) {
520 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground");
521 ret = vc_dbus_set_foreground(getpid(), true);
523 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
526 ret = vc_client_set_is_foreground(g_vc, true);
528 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret);
531 /* set authority valid */
532 vc_auth_state_e state = VC_AUTH_STATE_NONE;
533 if (0 != vc_client_get_auth_state(g_vc, &state)) {
534 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
536 if (VC_AUTH_STATE_INVALID == state) {
537 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
539 /* notify auth changed cb */
540 ecore_idler_add(__notify_auth_changed_cb, NULL);
544 vc_client_set_client_state(g_vc, VC_STATE_READY);
545 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
547 vc_client_set_mgr_pid(g_vc, mgr_pid);
549 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
554 static void __start_prepare_thread(void *data, Ecore_Thread *thread)
556 SLOG(LOG_ERROR, TAG_VCC, "@@@ Start prepare thread");
557 int ret = -1, retry_count = 0;
562 if (retry_count == 10) {
563 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!");
567 ret = vc_dbus_request_hello();
569 SLOG(LOG_DEBUG, TAG_VCC, "Success to request hello. retry count(%d)", retry_count);
579 if (retry_count == 10) {
580 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon !!");
583 ret = __vc_connect_daemon(NULL);
593 static void __end_prepare_thread(void *data, Ecore_Thread *thread)
595 SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread");
600 if (0 != __vc_get_feature_enabled()) {
601 return VC_ERROR_NOT_SUPPORTED;
603 if (0 != __vc_check_privilege()) {
604 return VC_ERROR_PERMISSION_DENIED;
607 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
610 if (0 != vc_client_get_client_state(g_vc, &state)) {
611 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
612 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
613 return VC_ERROR_INVALID_STATE;
617 if (state != VC_STATE_INITIALIZED) {
618 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'");
619 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
620 return VC_ERROR_INVALID_STATE;
623 ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, NULL);
625 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
627 return VC_ERROR_NONE;
630 int vc_prepare_sync(void)
632 if (0 != __vc_get_feature_enabled()) {
633 return VC_ERROR_NOT_SUPPORTED;
635 if (0 != __vc_check_privilege()) {
636 return VC_ERROR_PERMISSION_DENIED;
639 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
642 if (0 != vc_client_get_client_state(g_vc, &state)) {
643 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
644 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
645 return VC_ERROR_INVALID_STATE;
649 if (state != VC_STATE_INITIALIZED) {
650 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'");
651 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
652 return VC_ERROR_INVALID_STATE;
656 while (EINA_TRUE == __vc_connect_daemon(NULL) && VC_CONNECTION_RETRY_COUNT > cnt) {
660 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
662 if (VC_CONNECTION_RETRY_COUNT == cnt) {
663 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon");
664 return VC_ERROR_OPERATION_FAILED;
667 return VC_ERROR_NONE;
670 int vc_unprepare(void)
672 if (0 != __vc_get_feature_enabled()) {
673 return VC_ERROR_NOT_SUPPORTED;
675 if (0 != __vc_check_privilege()) {
676 return VC_ERROR_PERMISSION_DENIED;
679 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare");
682 if (0 != vc_client_get_client_state(g_vc, &state)) {
683 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
684 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
685 return VC_ERROR_INVALID_STATE;
689 if (state != VC_STATE_READY) {
690 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
691 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
692 return VC_ERROR_INVALID_STATE;
695 __vc_internal_unprepare();
697 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
698 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
700 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
702 return VC_ERROR_NONE;
705 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
707 if (0 != __vc_get_feature_enabled()) {
708 return VC_ERROR_NOT_SUPPORTED;
710 if (0 != __vc_check_privilege()) {
711 return VC_ERROR_PERMISSION_DENIED;
714 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language");
716 if (NULL == callback) {
717 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
718 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
719 return VC_ERROR_INVALID_PARAMETER;
723 if (0 != vc_client_get_client_state(g_vc, &state)) {
724 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
725 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
726 return VC_ERROR_INVALID_STATE;
730 ret = vc_config_mgr_get_language_list(callback, user_data);
732 ret = vc_config_convert_error_code((vc_config_error_e)ret);
733 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret));
736 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
738 return VC_ERROR_NONE;
742 int vc_get_current_language(char** language)
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] Get Current Language");
753 if (NULL == language) {
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_default_language(language);
769 ret = vc_config_convert_error_code((vc_config_error_e)ret);
770 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret));
773 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
778 int vc_get_state(vc_state_e* state)
780 if (0 != __vc_get_feature_enabled()) {
781 return VC_ERROR_NOT_SUPPORTED;
783 if (0 != __vc_check_privilege()) {
784 return VC_ERROR_PERMISSION_DENIED;
787 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State");
790 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
791 return VC_ERROR_INVALID_PARAMETER;
795 if (0 != vc_client_get_client_state(g_vc, &temp)) {
796 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not valid");
797 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
798 return VC_ERROR_INVALID_STATE;
804 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
805 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
806 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
807 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
810 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
812 return VC_ERROR_NONE;
815 int vc_get_service_state(vc_service_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 Service 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] A handle is not available");
834 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
835 return VC_ERROR_INVALID_STATE;
838 if (VC_STATE_READY != temp) {
839 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
840 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
841 return VC_ERROR_INVALID_STATE;
844 /* get service state */
845 vc_service_state_e service_state;
846 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
847 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state");
848 return VC_ERROR_OPERATION_FAILED;
851 *state = service_state;
854 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break;
855 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
856 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
857 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
858 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
861 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
863 return VC_ERROR_NONE;
866 int vc_get_system_command_list(vc_cmd_list_h* vc_sys_cmd_list)
868 if (0 != __vc_get_feature_enabled()) {
869 return VC_ERROR_NOT_SUPPORTED;
871 if (0 != __vc_check_privilege()) {
872 return VC_ERROR_PERMISSION_DENIED;
875 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list");
877 if (NULL == vc_sys_cmd_list) {
878 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
879 return VC_ERROR_INVALID_PARAMETER;
883 if (0 != vc_client_get_client_state(g_vc, &state)) {
884 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
885 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
886 return VC_ERROR_INVALID_STATE;
890 if (state != VC_STATE_READY) {
891 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
892 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
893 return VC_ERROR_INVALID_STATE;
896 /* Check service state */
897 vc_service_state_e service_state = -1;
898 vc_client_get_service_state(g_vc, &service_state);
899 if (service_state != VC_SERVICE_STATE_READY) {
900 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
901 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
902 return VC_ERROR_INVALID_STATE;
905 bool is_sys_cmd_valid = false;
910 ret = vc_dbus_request_is_system_command_valid(g_vc->handle, &is_sys_cmd_valid);
912 if (VC_ERROR_TIMED_OUT != ret) {
913 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to ask system command is : %s", __vc_get_error_code(ret));
916 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to ask system command is : %s", __vc_get_error_code(ret));
919 if (VC_RETRY_COUNT == count) {
920 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
928 ret = vc_client_get_mgr_pid(g_vc, &mgr_pid);
930 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get the manager pid");
931 return VC_ERROR_OPERATION_FAILED;
934 vc_cmd_list_s* list = NULL;
935 list = (vc_cmd_list_s*)(*vc_sys_cmd_list);
936 if (true == is_sys_cmd_valid) {
937 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, &(list->list));
939 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands");
942 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &(list->list));
944 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands");
947 *vc_sys_cmd_list = (vc_cmd_list_h)list;
949 SLOG(LOG_WARN, TAG_VCC, "[WARNING] No system commands");
950 *vc_sys_cmd_list = NULL;
951 return VC_ERROR_NONE;
954 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
960 * @brief Checks whether the command format is supported.
961 * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
963 * @param[in] format The command format
964 * @param[out] support The result status @c true = supported, @c false = not supported
966 * @return 0 on success, otherwise a negative error value
967 * @retval #VC_ERROR_NONE Successful
968 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
969 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
970 * @retval #VC_ERROR_INVALID_STATE Invalid state
972 * @pre The state should be #VC_STATE_READY.
974 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
976 if (0 != __vc_get_feature_enabled()) {
977 return VC_ERROR_NOT_SUPPORTED;
979 if (0 != __vc_check_privilege()) {
980 return VC_ERROR_PERMISSION_DENIED;
983 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported");
986 if (0 != vc_client_get_client_state(g_vc, &state)) {
987 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
988 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
989 return VC_ERROR_INVALID_STATE;
993 bool non_fixed_support = false;
994 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
995 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
999 case VC_CMD_FORMAT_FIXED: *support = true; break;
1000 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
1001 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
1002 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
1003 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
1004 default: *support = false; break;
1007 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
1009 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1011 return VC_ERROR_NONE;
1014 static int __vc_get_invocation_name(char** invocation_name)
1016 int ret = vc_client_get_invocation_name(g_vc, invocation_name);
1018 SLOG(LOG_WARN, TAG_VCC, "Fail to get invocation name");
1022 if (NULL == *invocation_name) {
1023 char* temp_label = NULL;
1027 ret = app_manager_get_app_id(getpid(), &appid);
1028 if (0 != ret || NULL == appid) {
1029 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get appid, ret(%d)", ret);
1030 if (NULL != appid) {
1034 return VC_ERROR_OPERATION_FAILED;
1037 ret = vc_get_current_language(&lang);
1038 if (0 != ret || NULL == lang) {
1039 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current laguage, ret(%d)", ret);
1046 return VC_ERROR_OPERATION_FAILED;
1049 ret = app_info_get_localed_label(appid, lang, &temp_label);
1050 if (0 != ret || NULL == temp_label) {
1051 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get localed label, ret(%d) appid(%s) lang(%s)", ret, appid, lang);
1056 if (NULL != temp_label) {
1060 return VC_ERROR_OPERATION_FAILED;
1063 *invocation_name = strdup(temp_label);
1064 if (NULL == *invocation_name) {
1065 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory");
1066 return VC_ERROR_OUT_OF_MEMORY;
1077 SLOG(LOG_DEBUG, TAG_VCC, "Get invocation name(%s)", *invocation_name);
1078 return VC_ERROR_NONE;
1081 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
1083 if (0 != __vc_get_feature_enabled()) {
1084 return VC_ERROR_NOT_SUPPORTED;
1086 if (0 != __vc_check_privilege()) {
1087 return VC_ERROR_PERMISSION_DENIED;
1090 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list");
1092 if (NULL == vc_cmd_list) {
1093 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
1094 return VC_ERROR_INVALID_PARAMETER;
1098 if (0 != vc_client_get_client_state(g_vc, &state)) {
1099 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1100 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1101 return VC_ERROR_INVALID_STATE;
1105 if (state != VC_STATE_READY) {
1106 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1107 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1108 return VC_ERROR_INVALID_STATE;
1112 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1113 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1114 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1115 return VC_ERROR_INVALID_PARAMETER;
1118 vc_cmd_list_s* list = NULL;
1119 list = (vc_cmd_list_s*)vc_cmd_list;
1121 if (NULL == list->list) {
1122 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command list");
1123 return VC_ERROR_INVALID_PARAMETER;
1127 char* invocation_name = NULL;
1128 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1129 ret = __vc_get_invocation_name(&invocation_name);
1130 if (0 != ret || NULL == invocation_name) {
1131 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1136 ret = vc_cmd_parser_delete_file(getpid(), type);
1138 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1140 ret = vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list, invocation_name);
1142 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
1146 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1148 if (VC_ERROR_TIMED_OUT != ret) {
1149 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1152 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1155 if (VC_RETRY_COUNT == count) {
1156 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1164 if (NULL != invocation_name) {
1165 free(invocation_name);
1166 invocation_name = NULL;
1169 if (VC_COMMAND_TYPE_BACKGROUND == type)
1172 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1177 int vc_unset_command_list(int type)
1179 if (0 != __vc_get_feature_enabled()) {
1180 return VC_ERROR_NOT_SUPPORTED;
1182 if (0 != __vc_check_privilege()) {
1183 return VC_ERROR_PERMISSION_DENIED;
1186 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list");
1189 if (0 != vc_client_get_client_state(g_vc, &state)) {
1190 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1191 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1192 return VC_ERROR_INVALID_STATE;
1196 if (state != VC_STATE_READY) {
1197 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1198 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1199 return VC_ERROR_INVALID_STATE;
1205 ret = vc_dbus_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
1207 if (VC_ERROR_TIMED_OUT != ret) {
1208 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
1211 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
1214 if (VC_RETRY_COUNT == count) {
1215 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1222 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
1224 ret = vc_config_convert_error_code((vc_config_error_e)ret);
1225 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret));
1228 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1233 int vc_set_command_list_from_file(const char* file_path, int type)
1235 if (0 != __vc_get_feature_enabled()) {
1236 return VC_ERROR_NOT_SUPPORTED;
1238 if (0 != __vc_check_privilege()) {
1239 return VC_ERROR_PERMISSION_DENIED;
1242 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file");
1245 if (0 != vc_client_get_client_state(g_vc, &state)) {
1246 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1247 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1248 return VC_ERROR_INVALID_STATE;
1252 if (state != VC_STATE_READY) {
1253 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1254 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1255 return VC_ERROR_INVALID_STATE;
1259 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1260 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1261 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1262 return VC_ERROR_INVALID_PARAMETER;
1266 char* invocation_name = NULL;
1267 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1268 ret = __vc_get_invocation_name(&invocation_name);
1269 if (0 != ret || NULL == invocation_name) {
1270 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1275 ret = vc_cmd_parser_delete_file(getpid(), type);
1277 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1279 ret = vc_json_set_commands_from_file(file_path, (vc_cmd_type_e)type, invocation_name);
1281 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set commands from file : %s", __vc_get_error_code(ret));
1285 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1287 if (VC_ERROR_TIMED_OUT != ret) {
1288 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1291 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1294 if (VC_RETRY_COUNT == count) {
1295 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1303 if (NULL != invocation_name) {
1304 free(invocation_name);
1305 invocation_name = NULL;
1308 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1313 int vc_get_exclusive_command_option(bool* value)
1315 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get exclusive command");
1318 if (0 != vc_client_get_client_state(g_vc, &state)) {
1319 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1320 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1321 return VC_ERROR_INVALID_STATE;
1325 if (state != VC_STATE_READY) {
1326 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1327 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1328 return VC_ERROR_INVALID_STATE;
1331 int ret = vc_client_get_exclusive_cmd(g_vc, value);
1333 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1334 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1338 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1343 int vc_set_exclusive_command_option(bool value)
1345 if (0 != __vc_get_feature_enabled()) {
1346 return VC_ERROR_NOT_SUPPORTED;
1348 if (0 != __vc_check_privilege()) {
1349 return VC_ERROR_PERMISSION_DENIED;
1352 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set exclusive command");
1355 if (0 != vc_client_get_client_state(g_vc, &state)) {
1356 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1357 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1358 return VC_ERROR_INVALID_STATE;
1362 if (state != VC_STATE_READY) {
1363 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1364 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1365 return VC_ERROR_INVALID_STATE;
1368 int ret = vc_client_set_exclusive_cmd(g_vc, value);
1370 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1371 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1377 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
1379 if (VC_ERROR_TIMED_OUT != ret) {
1380 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
1383 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
1386 if (VC_RETRY_COUNT == count) {
1387 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1394 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1401 int vc_request_start(bool stop_by_silence)
1403 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
1406 if (0 != vc_client_get_client_state(g_vc, &state)) {
1407 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1408 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1409 return VC_ERROR_INVALID_STATE;
1413 if (state != VC_STATE_READY) {
1414 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1415 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1416 return VC_ERROR_INVALID_STATE;
1419 /* Check service state */
1420 vc_service_state_e service_state = -1;
1421 vc_client_get_service_state(g_vc, &service_state);
1422 if (service_state != VC_SERVICE_STATE_READY) {
1423 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1424 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1425 return VC_ERROR_INVALID_STATE;
1435 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1437 if (VC_ERROR_TIMED_OUT != ret) {
1438 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1441 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1444 if (VC_RETRY_COUNT == count) {
1445 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1450 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1454 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1459 int vc_request_stop(void)
1461 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
1464 if (0 != vc_client_get_client_state(g_vc, &state)) {
1465 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1466 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1467 return VC_ERROR_INVALID_STATE;
1471 if (state != VC_STATE_READY) {
1472 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1473 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1474 return VC_ERROR_INVALID_STATE;
1477 /* Check service state */
1478 vc_service_state_e service_state = -1;
1479 vc_client_get_service_state(g_vc, &service_state);
1480 if (service_state != VC_SERVICE_STATE_RECORDING) {
1481 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1482 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1483 return VC_ERROR_INVALID_STATE;
1490 ret = vc_dbus_request_stop(g_vc->handle);
1492 if (VC_ERROR_TIMED_OUT != ret) {
1493 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1496 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1499 if (VC_RETRY_COUNT == count) {
1500 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1505 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1509 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1514 int vc_request_cancel(void)
1516 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel Interrupt");
1519 if (0 != vc_client_get_client_state(g_vc, &state)) {
1520 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1521 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1522 return VC_ERROR_INVALID_STATE;
1526 if (state != VC_STATE_READY) {
1527 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1528 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1529 return VC_ERROR_INVALID_STATE;
1532 /* Check service state */
1533 vc_service_state_e service_state = -1;
1534 vc_client_get_service_state(g_vc, &service_state);
1535 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1536 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1537 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1538 return VC_ERROR_INVALID_STATE;
1544 ret = vc_dbus_request_cancel(g_vc->handle);
1546 if (VC_ERROR_TIMED_OUT != ret) {
1547 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1550 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel request : %s", __vc_get_error_code(ret));
1553 if (VC_RETRY_COUNT == count) {
1554 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1559 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Cancel interrupt");
1563 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1569 static void __vc_notify_error(void *data)
1571 vc_h vc = (vc_h)data;
1573 vc_error_cb callback = NULL;
1577 vc_client_get_error_cb(vc, &callback, &user_data);
1578 vc_client_get_error(vc, &reason);
1580 if (NULL != callback) {
1581 vc_client_use_callback(vc);
1582 callback(reason, user_data);
1583 vc_client_not_use_callback(vc);
1584 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1586 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1590 int __vc_cb_error(int reason, int daemon_pid, char* msg)
1593 if (0 != vc_client_get_client_state(g_vc, &state)) {
1594 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid client");
1599 if (state != VC_STATE_READY) {
1600 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] not connected client yet");
1604 if (VC_ERROR_SERVICE_RESET == reason) {
1605 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset");
1607 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1608 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
1610 if (0 != vc_prepare()) {
1611 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare");
1615 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1617 vc_client_set_error(g_vc, reason);
1618 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
1623 static void __vc_notify_state_changed(void *data)
1625 vc_h vc = (vc_h)data;
1627 vc_state_changed_cb changed_callback = NULL;
1630 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1632 vc_state_e current_state;
1633 vc_state_e before_state;
1635 vc_client_get_before_state(vc, ¤t_state, &before_state);
1637 if (NULL != changed_callback) {
1638 vc_client_use_callback(vc);
1639 changed_callback(before_state, current_state, user_data);
1640 vc_client_not_use_callback(vc);
1641 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1643 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1647 static Eina_Bool __vc_notify_result(void *data)
1651 vc_cmd_list_h vc_cmd_list = NULL;
1653 vc_result_cb callback = NULL;
1654 void* user_data = NULL;
1656 vc_client_get_result_cb(g_vc, &callback, &user_data);
1658 if (NULL == callback) {
1659 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1663 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1664 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1668 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1670 SLOG(LOG_INFO, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1672 vc_cmd_print_list(vc_cmd_list);
1674 vc_client_use_callback(g_vc);
1675 callback(event, vc_cmd_list, temp_text, user_data);
1676 vc_client_not_use_callback(g_vc);
1678 SLOG(LOG_INFO, TAG_VCC, "Client result callback called");
1680 vc_cmd_list_destroy(vc_cmd_list, true);
1682 /* Release result */
1683 if (NULL != temp_text) free(temp_text);
1688 void __vc_cb_result(void)
1690 ecore_timer_add(0, __vc_notify_result, NULL);
1695 int vc_get_result(vc_result_cb callback, void* user_data)
1697 if (0 != __vc_get_feature_enabled()) {
1698 return VC_ERROR_NOT_SUPPORTED;
1700 if (0 != __vc_check_privilege()) {
1701 return VC_ERROR_PERMISSION_DENIED;
1704 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result");
1706 if (NULL == callback) {
1707 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1708 return VC_ERROR_INVALID_PARAMETER;
1711 char* temp_text = NULL;
1713 vc_cmd_list_h vc_cmd_list = NULL;
1715 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1716 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1717 return VC_ERROR_INVALID_PARAMETER;
1720 int ret = vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1721 if (0 != ret || NULL == temp_text) {
1722 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get result, ret(%d) temp_text(%s)", ret, temp_text);
1726 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1728 vc_cmd_print_list(vc_cmd_list);
1730 vc_client_use_callback(g_vc);
1731 callback(event, vc_cmd_list, temp_text, user_data);
1732 vc_client_not_use_callback(g_vc);
1734 vc_cmd_list_destroy(vc_cmd_list, true);
1736 /* Release result */
1737 if (NULL != temp_text) {
1742 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1744 return VC_ERROR_NONE;
1747 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1749 if (0 != __vc_get_feature_enabled()) {
1750 return VC_ERROR_NOT_SUPPORTED;
1752 if (0 != __vc_check_privilege()) {
1753 return VC_ERROR_PERMISSION_DENIED;
1756 if (NULL == callback)
1757 return VC_ERROR_INVALID_PARAMETER;
1760 if (0 != vc_client_get_client_state(g_vc, &state)) {
1761 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1762 return VC_ERROR_INVALID_STATE;
1766 if (state != VC_STATE_INITIALIZED) {
1767 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1768 return VC_ERROR_INVALID_STATE;
1771 vc_client_set_result_cb(g_vc, callback, user_data);
1776 int vc_unset_result_cb(void)
1778 if (0 != __vc_get_feature_enabled()) {
1779 return VC_ERROR_NOT_SUPPORTED;
1781 if (0 != __vc_check_privilege()) {
1782 return VC_ERROR_PERMISSION_DENIED;
1786 if (0 != vc_client_get_client_state(g_vc, &state)) {
1787 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1788 return VC_ERROR_INVALID_STATE;
1792 if (state != VC_STATE_INITIALIZED) {
1793 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1794 return VC_ERROR_INVALID_STATE;
1797 vc_client_set_result_cb(g_vc, NULL, NULL);
1802 int __vc_cb_service_state(int state)
1804 vc_service_state_e current_state = (vc_service_state_e)state;
1805 vc_service_state_e before_state;
1806 vc_client_get_service_state(g_vc, &before_state);
1808 if (current_state == before_state) {
1812 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
1813 before_state, current_state);
1815 /* Save service state */
1816 vc_client_set_service_state(g_vc, current_state);
1818 vc_service_state_changed_cb callback = NULL;
1819 void* service_user_data;
1820 vc_client_get_service_state_changed_cb(g_vc, &callback, &service_user_data);
1822 if (NULL != callback) {
1823 vc_client_use_callback(g_vc);
1824 callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
1825 vc_client_not_use_callback(g_vc);
1826 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
1828 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null");
1834 int __vc_cb_manager_pid(int manager_pid)
1836 SLOG(LOG_DEBUG, TAG_VCC, "Manager pid is changed : %d", manager_pid);
1838 /* Save service state */
1839 vc_client_set_mgr_pid(g_vc, manager_pid);
1844 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1846 if (0 != __vc_get_feature_enabled()) {
1847 return VC_ERROR_NOT_SUPPORTED;
1849 if (0 != __vc_check_privilege()) {
1850 return VC_ERROR_PERMISSION_DENIED;
1853 if (NULL == callback)
1854 return VC_ERROR_INVALID_PARAMETER;
1857 if (0 != vc_client_get_client_state(g_vc, &state)) {
1858 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1859 return VC_ERROR_INVALID_STATE;
1863 if (state != VC_STATE_INITIALIZED) {
1864 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1865 return VC_ERROR_INVALID_STATE;
1868 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
1873 int vc_unset_service_state_changed_cb(void)
1875 if (0 != __vc_get_feature_enabled()) {
1876 return VC_ERROR_NOT_SUPPORTED;
1878 if (0 != __vc_check_privilege()) {
1879 return VC_ERROR_PERMISSION_DENIED;
1883 if (0 != vc_client_get_client_state(g_vc, &state)) {
1884 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1885 return VC_ERROR_INVALID_STATE;
1889 if (state != VC_STATE_INITIALIZED) {
1890 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1891 return VC_ERROR_INVALID_STATE;
1894 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
1899 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1901 if (0 != __vc_get_feature_enabled()) {
1902 return VC_ERROR_NOT_SUPPORTED;
1904 if (0 != __vc_check_privilege()) {
1905 return VC_ERROR_PERMISSION_DENIED;
1908 if (callback == NULL)
1909 return VC_ERROR_INVALID_PARAMETER;
1912 if (0 != vc_client_get_client_state(g_vc, &state)) {
1913 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
1914 return VC_ERROR_INVALID_STATE;
1918 if (state != VC_STATE_INITIALIZED) {
1919 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
1920 return VC_ERROR_INVALID_STATE;
1923 vc_client_set_state_changed_cb(g_vc, callback, user_data);
1928 int vc_unset_state_changed_cb(void)
1930 if (0 != __vc_get_feature_enabled()) {
1931 return VC_ERROR_NOT_SUPPORTED;
1933 if (0 != __vc_check_privilege()) {
1934 return VC_ERROR_PERMISSION_DENIED;
1938 if (0 != vc_client_get_client_state(g_vc, &state)) {
1939 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
1940 return VC_ERROR_INVALID_STATE;
1944 if (state != VC_STATE_INITIALIZED) {
1945 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
1946 return VC_ERROR_INVALID_STATE;
1949 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
1954 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
1956 if (0 != __vc_get_feature_enabled()) {
1957 return VC_ERROR_NOT_SUPPORTED;
1959 if (0 != __vc_check_privilege()) {
1960 return VC_ERROR_PERMISSION_DENIED;
1963 if (NULL == callback)
1964 return VC_ERROR_INVALID_PARAMETER;
1967 if (0 != vc_client_get_client_state(g_vc, &state)) {
1968 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
1969 return VC_ERROR_INVALID_STATE;
1973 if (state != VC_STATE_INITIALIZED) {
1974 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : Current state is not 'Initialized'");
1975 return VC_ERROR_INVALID_STATE;
1978 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
1983 int vc_unset_current_language_changed_cb(void)
1985 if (0 != __vc_get_feature_enabled()) {
1986 return VC_ERROR_NOT_SUPPORTED;
1988 if (0 != __vc_check_privilege()) {
1989 return VC_ERROR_PERMISSION_DENIED;
1993 if (0 != vc_client_get_client_state(g_vc, &state)) {
1994 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
1995 return VC_ERROR_INVALID_STATE;
1999 if (state != VC_STATE_INITIALIZED) {
2000 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2001 return VC_ERROR_INVALID_STATE;
2004 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
2009 int vc_set_error_cb(vc_error_cb callback, void* user_data)
2011 if (0 != __vc_get_feature_enabled()) {
2012 return VC_ERROR_NOT_SUPPORTED;
2014 if (0 != __vc_check_privilege()) {
2015 return VC_ERROR_PERMISSION_DENIED;
2018 if (NULL == callback)
2019 return VC_ERROR_INVALID_PARAMETER;
2022 if (0 != vc_client_get_client_state(g_vc, &state)) {
2023 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
2024 return VC_ERROR_INVALID_STATE;
2028 if (state != VC_STATE_INITIALIZED) {
2029 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : Current state is not 'Initialized'");
2030 return VC_ERROR_INVALID_STATE;
2033 vc_client_set_error_cb(g_vc, callback, user_data);
2038 int vc_unset_error_cb(void)
2040 if (0 != __vc_get_feature_enabled()) {
2041 return VC_ERROR_NOT_SUPPORTED;
2043 if (0 != __vc_check_privilege()) {
2044 return VC_ERROR_PERMISSION_DENIED;
2048 if (0 != vc_client_get_client_state(g_vc, &state)) {
2049 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
2050 return VC_ERROR_INVALID_STATE;
2054 if (state != VC_STATE_INITIALIZED) {
2055 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2056 return VC_ERROR_INVALID_STATE;
2059 vc_client_set_error_cb(g_vc, NULL, NULL);
2064 int vc_set_invocation_name(const char* name)
2066 if (0 != __vc_get_feature_enabled()) {
2067 return VC_ERROR_NOT_SUPPORTED;
2069 if (0 != __vc_check_privilege()) {
2070 return VC_ERROR_PERMISSION_DENIED;
2074 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set invocation name");
2076 int ret = vc_client_get_client_state(g_vc, &state);
2078 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2079 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2084 if (state != VC_STATE_READY) {
2085 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
2086 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2087 return VC_ERROR_INVALID_STATE;
2090 ret = vc_client_set_invocation_name(g_vc, name);
2092 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set invocation name");
2097 int vc_request_dialog(const char* disp_text, const char* utt_text, bool auto_start)
2101 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog");
2102 if (0 != __vc_get_feature_enabled()) {
2103 return VC_ERROR_NOT_SUPPORTED;
2105 if (0 != __vc_check_privilege()) {
2106 return VC_ERROR_PERMISSION_DENIED;
2109 if (0 != vc_client_get_client_state(g_vc, &state)) {
2110 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2111 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2112 return VC_ERROR_INVALID_STATE;
2116 if (state != VC_STATE_READY) {
2117 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
2118 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2119 return VC_ERROR_INVALID_STATE;
2122 /* Check service state */
2123 vc_service_state_e service_state = -1;
2124 vc_client_get_service_state(g_vc, &service_state);
2125 if (service_state != VC_SERVICE_STATE_READY) {
2126 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
2127 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2128 return VC_ERROR_INVALID_STATE;
2131 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);
2132 int ret = vc_dbus_request_dialog(getpid(), disp_text, utt_text, auto_start);
2134 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
2135 return VC_ERROR_OPERATION_FAILED;
2138 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2140 return VC_ERROR_NONE;
2144 int vc_auth_enable(void)
2148 if (0 != vc_client_get_client_state(g_vc, &state)) {
2149 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2150 return VC_ERROR_INVALID_STATE;
2153 if (VC_STATE_READY != state) {
2154 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2155 return VC_ERROR_INVALID_STATE;
2158 /* check already authority */
2159 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2160 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2161 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2162 return VC_ERROR_INVALID_STATE;
2165 if (VC_AUTH_STATE_NONE != auth_state) {
2166 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already authority enabled");
2167 return VC_ERROR_INVALID_STATE;
2170 /* request authority */
2172 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2173 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2174 return VC_ERROR_OPERATION_FAILED;
2177 if (0 != vc_dbus_request_auth_enable(g_vc->handle, mgr_pid)) {
2178 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
2179 return VC_ERROR_OPERATION_FAILED;
2182 /* set authority into handle */
2183 bool is_foreground = false;
2184 if (0 != vc_client_get_is_foreground(g_vc, &is_foreground)) {
2185 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get is_foreground");
2186 return VC_ERROR_OPERATION_FAILED;
2189 if (is_foreground) {
2190 auth_state = VC_AUTH_STATE_VALID;
2192 auth_state = VC_AUTH_STATE_INVALID;
2195 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
2196 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2197 return VC_ERROR_OPERATION_FAILED;
2200 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2202 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
2204 return VC_ERROR_NONE;
2207 int vc_auth_disable(void)
2211 if (0 != vc_client_get_client_state(g_vc, &state)) {
2212 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2213 return VC_ERROR_INVALID_STATE;
2216 if (VC_STATE_READY != state) {
2217 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2218 return VC_ERROR_INVALID_STATE;
2221 /* check autority */
2222 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2223 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2224 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2225 return VC_ERROR_INVALID_STATE;
2228 if (VC_AUTH_STATE_NONE == auth_state) {
2229 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] No authority");
2230 return VC_ERROR_INVALID_STATE;
2233 if (0 != vc_auth_unset_state_changed_cb()) {
2234 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
2237 /* request return authority by dbus */
2239 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2240 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2241 return VC_ERROR_OPERATION_FAILED;
2244 if (0 != vc_dbus_request_auth_disable(g_vc->handle, mgr_pid)) {
2245 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disble");
2246 return VC_ERROR_OPERATION_FAILED;
2249 /* unset authority from handle */
2250 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
2251 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2252 return VC_ERROR_OPERATION_FAILED;
2255 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2257 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
2259 return VC_ERROR_NONE;
2262 int vc_auth_get_state(vc_auth_state_e* state)
2265 vc_state_e vc_state;
2266 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
2267 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2268 return VC_ERROR_INVALID_STATE;
2271 if (VC_STATE_READY != vc_state) {
2272 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2273 return VC_ERROR_INVALID_STATE;
2277 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
2278 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
2279 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2280 return VC_ERROR_INVALID_STATE;
2285 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
2287 return VC_ERROR_NONE;
2290 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
2292 /* check parameter */
2293 if (NULL == callback) {
2294 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
2295 return VC_ERROR_INVALID_PARAMETER;
2299 vc_auth_state_e auth_state;
2300 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2301 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2302 return VC_ERROR_INVALID_STATE;
2305 if (VC_AUTH_STATE_NONE == auth_state) {
2306 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auth is not enabled");
2307 return VC_ERROR_INVALID_STATE;
2310 /* set cb into handle */
2311 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
2312 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
2313 return VC_ERROR_OPERATION_FAILED;
2316 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
2318 return VC_ERROR_NONE;
2321 int vc_auth_unset_state_changed_cb(void)
2324 vc_auth_state_e auth_state;
2325 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2326 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2327 return VC_ERROR_INVALID_STATE;
2330 if (VC_AUTH_STATE_NONE == auth_state) {
2331 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auto is not enabled");
2332 return VC_ERROR_INVALID_STATE;
2335 /* unset cb from handle */
2336 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
2337 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
2338 return VC_ERROR_OPERATION_FAILED;
2341 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
2343 return VC_ERROR_NONE;
2346 int vc_auth_start(void)
2348 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
2351 if (0 != vc_client_get_client_state(g_vc, &state)) {
2352 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2353 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2354 return VC_ERROR_INVALID_STATE;
2358 if (state != VC_STATE_READY) {
2359 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
2360 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2361 return VC_ERROR_INVALID_STATE;
2364 /* Check service state */
2365 vc_service_state_e service_state = -1;
2366 vc_client_get_service_state(g_vc, &service_state);
2367 if (service_state != VC_SERVICE_STATE_READY) {
2368 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
2369 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2370 return VC_ERROR_INVALID_STATE;
2373 /* Check authority */
2374 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2375 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2376 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2377 return VC_ERROR_OPERATION_FAILED;
2380 if (VC_AUTH_STATE_VALID != auth_state) {
2381 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2382 return VC_ERROR_OPERATION_FAILED;
2387 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2388 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2389 return VC_ERROR_OPERATION_FAILED;
2398 ret = vc_dbus_request_auth_start(g_vc->handle, mgr_pid);
2400 if (VC_ERROR_TIMED_OUT != ret) {
2401 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
2404 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
2407 if (VC_RETRY_COUNT == count) {
2408 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2413 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
2417 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2422 int vc_auth_stop(void)
2424 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
2427 if (0 != vc_client_get_client_state(g_vc, &state)) {
2428 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2429 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2430 return VC_ERROR_INVALID_STATE;
2434 if (state != VC_STATE_READY) {
2435 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
2436 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2437 return VC_ERROR_INVALID_STATE;
2440 /* Check service state */
2441 vc_service_state_e service_state = -1;
2442 vc_client_get_service_state(g_vc, &service_state);
2443 if (service_state != VC_SERVICE_STATE_RECORDING) {
2444 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
2445 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2446 return VC_ERROR_INVALID_STATE;
2449 /* Check authority */
2450 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2451 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2452 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2453 return VC_ERROR_OPERATION_FAILED;
2456 if (VC_AUTH_STATE_VALID != auth_state) {
2457 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2458 return VC_ERROR_OPERATION_FAILED;
2463 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2464 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2465 return VC_ERROR_OPERATION_FAILED;
2472 ret = vc_dbus_request_auth_stop(g_vc->handle, mgr_pid);
2474 if (VC_ERROR_TIMED_OUT != ret) {
2475 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
2478 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
2481 if (VC_RETRY_COUNT == count) {
2482 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2487 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
2491 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2496 int vc_auth_cancel(void)
2498 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel");
2501 if (0 != vc_client_get_client_state(g_vc, &state)) {
2502 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2503 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2504 return VC_ERROR_INVALID_STATE;
2508 if (state != VC_STATE_READY) {
2509 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
2510 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2511 return VC_ERROR_INVALID_STATE;
2514 /* Check service state */
2515 vc_service_state_e service_state = -1;
2516 vc_client_get_service_state(g_vc, &service_state);
2517 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
2518 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
2519 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2520 return VC_ERROR_INVALID_STATE;
2523 /* Check authority */
2524 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2525 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2526 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2527 return VC_ERROR_OPERATION_FAILED;
2530 if (VC_AUTH_STATE_VALID != auth_state) {
2531 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2532 return VC_ERROR_OPERATION_FAILED;
2537 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2538 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2539 return VC_ERROR_OPERATION_FAILED;
2545 ret = vc_dbus_request_auth_cancel(g_vc->handle, mgr_pid);
2547 if (VC_ERROR_TIMED_OUT != ret) {
2548 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
2551 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
2554 if (VC_RETRY_COUNT == count) {
2555 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2560 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
2564 SLOG(LOG_DEBUG, TAG_VCC, "@@@");