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 Eina_Bool __vc_notify_state_changed(void *data);
60 Eina_Bool __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 (sizeof(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_timer_add(0, __vc_notify_error, 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_timer_add(0, __vc_notify_error, 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_timer_add(0, __vc_notify_state_changed, g_vc);
547 vc_client_set_mgr_pid(g_vc, mgr_pid);
549 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
556 if (0 != __vc_get_feature_enabled()) {
557 return VC_ERROR_NOT_SUPPORTED;
559 if (0 != __vc_check_privilege()) {
560 return VC_ERROR_PERMISSION_DENIED;
563 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
566 if (0 != vc_client_get_client_state(g_vc, &state)) {
567 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
568 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
569 return VC_ERROR_INVALID_STATE;
573 if (state != VC_STATE_INITIALIZED) {
574 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'");
575 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
576 return VC_ERROR_INVALID_STATE;
579 g_connect_timer = ecore_timer_add(0, __vc_connect_daemon, NULL);
581 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
583 return VC_ERROR_NONE;
586 int vc_prepare_sync(void)
588 if (0 != __vc_get_feature_enabled()) {
589 return VC_ERROR_NOT_SUPPORTED;
591 if (0 != __vc_check_privilege()) {
592 return VC_ERROR_PERMISSION_DENIED;
595 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
598 if (0 != vc_client_get_client_state(g_vc, &state)) {
599 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
600 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
601 return VC_ERROR_INVALID_STATE;
605 if (state != VC_STATE_INITIALIZED) {
606 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'");
607 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
608 return VC_ERROR_INVALID_STATE;
612 while (EINA_TRUE == __vc_connect_daemon(NULL) && VC_CONNECTION_RETRY_COUNT > cnt) {
616 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
618 if (VC_CONNECTION_RETRY_COUNT == cnt) {
619 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon");
620 return VC_ERROR_OPERATION_FAILED;
623 return VC_ERROR_NONE;
626 int vc_unprepare(void)
628 if (0 != __vc_get_feature_enabled()) {
629 return VC_ERROR_NOT_SUPPORTED;
631 if (0 != __vc_check_privilege()) {
632 return VC_ERROR_PERMISSION_DENIED;
635 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare");
638 if (0 != vc_client_get_client_state(g_vc, &state)) {
639 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
640 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
641 return VC_ERROR_INVALID_STATE;
645 if (state != VC_STATE_READY) {
646 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
647 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
648 return VC_ERROR_INVALID_STATE;
651 __vc_internal_unprepare();
653 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
654 ecore_timer_add(0, __vc_notify_state_changed, g_vc);
656 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
658 return VC_ERROR_NONE;
661 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
663 if (0 != __vc_get_feature_enabled()) {
664 return VC_ERROR_NOT_SUPPORTED;
666 if (0 != __vc_check_privilege()) {
667 return VC_ERROR_PERMISSION_DENIED;
670 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language");
672 if (NULL == callback) {
673 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
674 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
675 return VC_ERROR_INVALID_PARAMETER;
679 if (0 != vc_client_get_client_state(g_vc, &state)) {
680 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
681 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
682 return VC_ERROR_INVALID_STATE;
686 ret = vc_config_mgr_get_language_list(callback, user_data);
688 ret = vc_config_convert_error_code((vc_config_error_e)ret);
689 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret));
692 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
694 return VC_ERROR_NONE;
698 int vc_get_current_language(char** language)
700 if (0 != __vc_get_feature_enabled()) {
701 return VC_ERROR_NOT_SUPPORTED;
703 if (0 != __vc_check_privilege()) {
704 return VC_ERROR_PERMISSION_DENIED;
707 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language");
709 if (NULL == language) {
710 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
711 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
712 return VC_ERROR_INVALID_PARAMETER;
716 if (0 != vc_client_get_client_state(g_vc, &state)) {
717 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
718 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
719 return VC_ERROR_INVALID_STATE;
723 ret = vc_config_mgr_get_default_language(language);
725 ret = vc_config_convert_error_code((vc_config_error_e)ret);
726 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret));
729 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
734 int vc_get_state(vc_state_e* state)
736 if (0 != __vc_get_feature_enabled()) {
737 return VC_ERROR_NOT_SUPPORTED;
739 if (0 != __vc_check_privilege()) {
740 return VC_ERROR_PERMISSION_DENIED;
743 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State");
746 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
747 return VC_ERROR_INVALID_PARAMETER;
751 if (0 != vc_client_get_client_state(g_vc, &temp)) {
752 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not valid");
753 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
754 return VC_ERROR_INVALID_STATE;
760 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
761 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
762 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
763 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
766 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
768 return VC_ERROR_NONE;
771 int vc_get_service_state(vc_service_state_e* state)
773 if (0 != __vc_get_feature_enabled()) {
774 return VC_ERROR_NOT_SUPPORTED;
776 if (0 != __vc_check_privilege()) {
777 return VC_ERROR_PERMISSION_DENIED;
780 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State");
783 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
784 return VC_ERROR_INVALID_PARAMETER;
788 if (0 != vc_client_get_client_state(g_vc, &temp)) {
789 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
790 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
791 return VC_ERROR_INVALID_STATE;
794 if (VC_STATE_READY != temp) {
795 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
796 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
797 return VC_ERROR_INVALID_STATE;
800 /* get service state */
801 vc_service_state_e service_state;
802 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
803 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state");
804 return VC_ERROR_OPERATION_FAILED;
807 *state = service_state;
810 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break;
811 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
812 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
813 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
814 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
817 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
819 return VC_ERROR_NONE;
822 int vc_get_system_command_list(vc_cmd_list_h* vc_sys_cmd_list)
824 if (0 != __vc_get_feature_enabled()) {
825 return VC_ERROR_NOT_SUPPORTED;
827 if (0 != __vc_check_privilege()) {
828 return VC_ERROR_PERMISSION_DENIED;
831 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list");
833 if (NULL == vc_sys_cmd_list) {
834 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
835 return VC_ERROR_INVALID_PARAMETER;
839 if (0 != vc_client_get_client_state(g_vc, &state)) {
840 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
841 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
842 return VC_ERROR_INVALID_STATE;
846 if (state != VC_STATE_READY) {
847 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
848 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
849 return VC_ERROR_INVALID_STATE;
852 /* Check service state */
853 vc_service_state_e service_state = -1;
854 vc_client_get_service_state(g_vc, &service_state);
855 if (service_state != VC_SERVICE_STATE_READY) {
856 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
857 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
858 return VC_ERROR_INVALID_STATE;
861 bool is_sys_cmd_valid = false;
866 ret = vc_dbus_request_is_system_command_valid(g_vc->handle, &is_sys_cmd_valid);
868 if (VC_ERROR_TIMED_OUT != ret) {
869 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to ask system command is : %s", __vc_get_error_code(ret));
872 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to ask system command is : %s", __vc_get_error_code(ret));
875 if (VC_RETRY_COUNT == count) {
876 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
884 ret = vc_client_get_mgr_pid(g_vc, &mgr_pid);
886 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get the manager pid");
887 return VC_ERROR_OPERATION_FAILED;
890 vc_cmd_list_s* list = NULL;
891 list = (vc_cmd_list_s*)(*vc_sys_cmd_list);
892 if (true == is_sys_cmd_valid) {
893 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, &(list->list));
895 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands");
898 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &(list->list));
900 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands");
903 *vc_sys_cmd_list = (vc_cmd_list_h)list;
905 SLOG(LOG_WARN, TAG_VCC, "[WARNING] No system commands");
906 *vc_sys_cmd_list = NULL;
907 return VC_ERROR_NONE;
910 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
916 * @brief Checks whether the command format is supported.
917 * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
919 * @param[in] format The command format
920 * @param[out] support The result status @c true = supported, @c false = not supported
922 * @return 0 on success, otherwise a negative error value
923 * @retval #VC_ERROR_NONE Successful
924 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
925 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
926 * @retval #VC_ERROR_INVALID_STATE Invalid state
928 * @pre The state should be #VC_STATE_READY.
930 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
932 if (0 != __vc_get_feature_enabled()) {
933 return VC_ERROR_NOT_SUPPORTED;
935 if (0 != __vc_check_privilege()) {
936 return VC_ERROR_PERMISSION_DENIED;
939 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported");
942 if (0 != vc_client_get_client_state(g_vc, &state)) {
943 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
944 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
945 return VC_ERROR_INVALID_STATE;
949 bool non_fixed_support = false;
950 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
951 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
955 case VC_CMD_FORMAT_FIXED: *support = true; break;
956 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
957 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
958 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
959 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
960 default: *support = false; break;
963 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
965 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
967 return VC_ERROR_NONE;
970 static int __vc_get_invocation_name(char** invocation_name)
972 int ret = vc_client_get_invocation_name(g_vc, invocation_name);
974 SLOG(LOG_WARN, TAG_VCC, "Fail to get invocation name");
978 if (NULL == *invocation_name) {
979 char* temp_label = NULL;
983 ret = app_manager_get_app_id(getpid(), &appid);
984 if (0 != ret || NULL == appid) {
985 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get appid, ret(%d)", ret);
990 return VC_ERROR_OPERATION_FAILED;
993 ret = vc_get_current_language(&lang);
994 if (0 != ret || NULL == lang) {
995 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current laguage, ret(%d)", ret);
1002 return VC_ERROR_OPERATION_FAILED;
1005 ret = app_info_get_localed_label(appid, lang, &temp_label);
1006 if (0 != ret || NULL == temp_label) {
1007 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get localed label, ret(%d) appid(%s) lang(%s)", ret, appid, lang);
1012 if (NULL != temp_label) {
1016 return VC_ERROR_OPERATION_FAILED;
1019 *invocation_name = strdup(temp_label);
1020 if (NULL == *invocation_name) {
1021 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory");
1022 return VC_ERROR_OUT_OF_MEMORY;
1033 SLOG(LOG_DEBUG, TAG_VCC, "Get invocation name(%s)", *invocation_name);
1034 return VC_ERROR_NONE;
1037 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
1039 if (0 != __vc_get_feature_enabled()) {
1040 return VC_ERROR_NOT_SUPPORTED;
1042 if (0 != __vc_check_privilege()) {
1043 return VC_ERROR_PERMISSION_DENIED;
1046 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list");
1048 if (NULL == vc_cmd_list) {
1049 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
1050 return VC_ERROR_INVALID_PARAMETER;
1054 if (0 != vc_client_get_client_state(g_vc, &state)) {
1055 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1056 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1057 return VC_ERROR_INVALID_STATE;
1061 if (state != VC_STATE_READY) {
1062 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1063 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1064 return VC_ERROR_INVALID_STATE;
1068 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1069 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1070 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1071 return VC_ERROR_INVALID_PARAMETER;
1074 vc_cmd_list_s* list = NULL;
1075 list = (vc_cmd_list_s*)vc_cmd_list;
1077 if (NULL == list->list) {
1078 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command list");
1079 return VC_ERROR_INVALID_PARAMETER;
1083 char* invocation_name = NULL;
1084 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1085 ret = __vc_get_invocation_name(&invocation_name);
1086 if (0 != ret || NULL == invocation_name) {
1087 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1092 ret = vc_cmd_parser_delete_file(getpid(), type);
1094 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1096 ret = vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list, invocation_name);
1098 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
1102 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1104 if (VC_ERROR_TIMED_OUT != ret) {
1105 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1108 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1111 if (VC_RETRY_COUNT == count) {
1112 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1120 if (NULL != invocation_name) {
1121 free(invocation_name);
1122 invocation_name = NULL;
1125 if (VC_COMMAND_TYPE_BACKGROUND == type)
1128 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1133 int vc_unset_command_list(int type)
1135 if (0 != __vc_get_feature_enabled()) {
1136 return VC_ERROR_NOT_SUPPORTED;
1138 if (0 != __vc_check_privilege()) {
1139 return VC_ERROR_PERMISSION_DENIED;
1142 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list");
1145 if (0 != vc_client_get_client_state(g_vc, &state)) {
1146 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1147 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1148 return VC_ERROR_INVALID_STATE;
1152 if (state != VC_STATE_READY) {
1153 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1154 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1155 return VC_ERROR_INVALID_STATE;
1161 ret = vc_dbus_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
1163 if (VC_ERROR_TIMED_OUT != ret) {
1164 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
1167 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
1170 if (VC_RETRY_COUNT == count) {
1171 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1178 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
1180 ret = vc_config_convert_error_code((vc_config_error_e)ret);
1181 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret));
1184 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1189 int vc_set_command_list_from_file(const char* file_path, int type)
1191 if (0 != __vc_get_feature_enabled()) {
1192 return VC_ERROR_NOT_SUPPORTED;
1194 if (0 != __vc_check_privilege()) {
1195 return VC_ERROR_PERMISSION_DENIED;
1198 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file");
1201 if (0 != vc_client_get_client_state(g_vc, &state)) {
1202 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1203 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1204 return VC_ERROR_INVALID_STATE;
1208 if (state != VC_STATE_READY) {
1209 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1210 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1211 return VC_ERROR_INVALID_STATE;
1215 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1216 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1217 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1218 return VC_ERROR_INVALID_PARAMETER;
1222 char* invocation_name = NULL;
1223 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1224 ret = __vc_get_invocation_name(&invocation_name);
1225 if (0 != ret || NULL == invocation_name) {
1226 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1231 ret = vc_cmd_parser_delete_file(getpid(), type);
1233 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1235 ret = vc_json_set_commands_from_file(file_path, (vc_cmd_type_e)type, invocation_name);
1237 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set commands from file : %s", __vc_get_error_code(ret));
1241 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1243 if (VC_ERROR_TIMED_OUT != ret) {
1244 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1247 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1250 if (VC_RETRY_COUNT == count) {
1251 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1259 if (NULL != invocation_name) {
1260 free(invocation_name);
1261 invocation_name = NULL;
1264 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1269 int vc_get_exclusive_command_option(bool* value)
1271 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get exclusive command");
1274 if (0 != vc_client_get_client_state(g_vc, &state)) {
1275 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1276 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1277 return VC_ERROR_INVALID_STATE;
1281 if (state != VC_STATE_READY) {
1282 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1283 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1284 return VC_ERROR_INVALID_STATE;
1287 int ret = vc_client_get_exclusive_cmd(g_vc, value);
1289 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1290 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1294 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1299 int vc_set_exclusive_command_option(bool value)
1301 if (0 != __vc_get_feature_enabled()) {
1302 return VC_ERROR_NOT_SUPPORTED;
1304 if (0 != __vc_check_privilege()) {
1305 return VC_ERROR_PERMISSION_DENIED;
1308 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set exclusive command");
1311 if (0 != vc_client_get_client_state(g_vc, &state)) {
1312 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1313 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1314 return VC_ERROR_INVALID_STATE;
1318 if (state != VC_STATE_READY) {
1319 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1320 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1321 return VC_ERROR_INVALID_STATE;
1324 int ret = vc_client_set_exclusive_cmd(g_vc, value);
1326 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1327 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1333 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
1335 if (VC_ERROR_TIMED_OUT != ret) {
1336 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
1339 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
1342 if (VC_RETRY_COUNT == count) {
1343 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1350 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1357 int vc_request_start(bool stop_by_silence)
1359 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
1362 if (0 != vc_client_get_client_state(g_vc, &state)) {
1363 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1364 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1365 return VC_ERROR_INVALID_STATE;
1369 if (state != VC_STATE_READY) {
1370 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1371 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1372 return VC_ERROR_INVALID_STATE;
1375 /* Check service state */
1376 vc_service_state_e service_state = -1;
1377 vc_client_get_service_state(g_vc, &service_state);
1378 if (service_state != VC_SERVICE_STATE_READY) {
1379 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1380 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1381 return VC_ERROR_INVALID_STATE;
1391 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1393 if (VC_ERROR_TIMED_OUT != ret) {
1394 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1397 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1400 if (VC_RETRY_COUNT == count) {
1401 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1406 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1410 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1415 int vc_request_stop(void)
1417 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
1420 if (0 != vc_client_get_client_state(g_vc, &state)) {
1421 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1422 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1423 return VC_ERROR_INVALID_STATE;
1427 if (state != VC_STATE_READY) {
1428 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1429 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1430 return VC_ERROR_INVALID_STATE;
1433 /* Check service state */
1434 vc_service_state_e service_state = -1;
1435 vc_client_get_service_state(g_vc, &service_state);
1436 if (service_state != VC_SERVICE_STATE_RECORDING) {
1437 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1438 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1439 return VC_ERROR_INVALID_STATE;
1446 ret = vc_dbus_request_stop(g_vc->handle);
1448 if (VC_ERROR_TIMED_OUT != ret) {
1449 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1452 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1455 if (VC_RETRY_COUNT == count) {
1456 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1461 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1465 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1470 int vc_request_cancel(void)
1472 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel Interrupt");
1475 if (0 != vc_client_get_client_state(g_vc, &state)) {
1476 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1477 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1478 return VC_ERROR_INVALID_STATE;
1482 if (state != VC_STATE_READY) {
1483 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1484 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1485 return VC_ERROR_INVALID_STATE;
1488 /* Check service state */
1489 vc_service_state_e service_state = -1;
1490 vc_client_get_service_state(g_vc, &service_state);
1491 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1492 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1493 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1494 return VC_ERROR_INVALID_STATE;
1500 ret = vc_dbus_request_cancel(g_vc->handle);
1502 if (VC_ERROR_TIMED_OUT != ret) {
1503 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1506 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel request : %s", __vc_get_error_code(ret));
1509 if (VC_RETRY_COUNT == count) {
1510 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1515 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Cancel interrupt");
1519 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1525 Eina_Bool __vc_notify_error(void *data)
1527 vc_h vc = (vc_h)data;
1529 vc_error_cb callback = NULL;
1533 vc_client_get_error_cb(vc, &callback, &user_data);
1534 vc_client_get_error(vc, &reason);
1536 if (NULL != callback) {
1537 vc_client_use_callback(vc);
1538 callback(reason, user_data);
1539 vc_client_not_use_callback(vc);
1540 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1542 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1548 int __vc_cb_error(int reason, int daemon_pid, char* msg)
1551 if (0 != vc_client_get_client_state(g_vc, &state)) {
1552 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid client");
1557 if (state != VC_STATE_READY) {
1558 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] not connected client yet");
1562 if (VC_ERROR_SERVICE_RESET == reason) {
1563 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset");
1565 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1566 __vc_notify_state_changed(g_vc);
1568 if (0 != vc_prepare()) {
1569 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare");
1573 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1575 vc_client_set_error(g_vc, reason);
1576 ecore_timer_add(0, __vc_notify_error, g_vc);
1581 Eina_Bool __vc_notify_state_changed(void *data)
1583 vc_h vc = (vc_h)data;
1585 vc_state_changed_cb changed_callback = NULL;
1588 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1590 vc_state_e current_state;
1591 vc_state_e before_state;
1593 vc_client_get_before_state(vc, ¤t_state, &before_state);
1595 if (NULL != changed_callback) {
1596 vc_client_use_callback(vc);
1597 changed_callback(before_state, current_state, user_data);
1598 vc_client_not_use_callback(vc);
1599 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1601 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1607 static Eina_Bool __vc_notify_result(void *data)
1611 vc_cmd_list_h vc_cmd_list = NULL;
1613 vc_result_cb callback = NULL;
1614 void* user_data = NULL;
1616 vc_client_get_result_cb(g_vc, &callback, &user_data);
1618 if (NULL == callback) {
1619 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1623 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1624 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1628 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1630 SLOG(LOG_INFO, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1632 vc_cmd_print_list(vc_cmd_list);
1634 vc_client_use_callback(g_vc);
1635 callback(event, vc_cmd_list, temp_text, user_data);
1636 vc_client_not_use_callback(g_vc);
1638 SLOG(LOG_INFO, TAG_VCC, "Client result callback called");
1640 vc_cmd_list_destroy(vc_cmd_list, true);
1642 /* Release result */
1643 if (NULL != temp_text) free(temp_text);
1648 void __vc_cb_result(void)
1650 ecore_timer_add(0, __vc_notify_result, NULL);
1655 int vc_get_result(vc_result_cb callback, void* user_data)
1657 if (0 != __vc_get_feature_enabled()) {
1658 return VC_ERROR_NOT_SUPPORTED;
1660 if (0 != __vc_check_privilege()) {
1661 return VC_ERROR_PERMISSION_DENIED;
1664 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result");
1666 if (NULL == callback) {
1667 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1668 return VC_ERROR_INVALID_PARAMETER;
1671 char* temp_text = NULL;
1673 vc_cmd_list_h vc_cmd_list = NULL;
1675 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1676 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1677 return VC_ERROR_INVALID_PARAMETER;
1680 int ret = vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1681 if (0 != ret || NULL == temp_text) {
1682 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get result, ret(%d) temp_text(%s)", ret, temp_text);
1686 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1688 vc_cmd_print_list(vc_cmd_list);
1690 vc_client_use_callback(g_vc);
1691 callback(event, vc_cmd_list, temp_text, user_data);
1692 vc_client_not_use_callback(g_vc);
1694 vc_cmd_list_destroy(vc_cmd_list, true);
1696 /* Release result */
1697 if (NULL != temp_text) {
1702 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1704 return VC_ERROR_NONE;
1707 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1709 if (0 != __vc_get_feature_enabled()) {
1710 return VC_ERROR_NOT_SUPPORTED;
1712 if (0 != __vc_check_privilege()) {
1713 return VC_ERROR_PERMISSION_DENIED;
1716 if (NULL == callback)
1717 return VC_ERROR_INVALID_PARAMETER;
1720 if (0 != vc_client_get_client_state(g_vc, &state)) {
1721 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1722 return VC_ERROR_INVALID_STATE;
1726 if (state != VC_STATE_INITIALIZED) {
1727 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1728 return VC_ERROR_INVALID_STATE;
1731 vc_client_set_result_cb(g_vc, callback, user_data);
1736 int vc_unset_result_cb(void)
1738 if (0 != __vc_get_feature_enabled()) {
1739 return VC_ERROR_NOT_SUPPORTED;
1741 if (0 != __vc_check_privilege()) {
1742 return VC_ERROR_PERMISSION_DENIED;
1746 if (0 != vc_client_get_client_state(g_vc, &state)) {
1747 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1748 return VC_ERROR_INVALID_STATE;
1752 if (state != VC_STATE_INITIALIZED) {
1753 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1754 return VC_ERROR_INVALID_STATE;
1757 vc_client_set_result_cb(g_vc, NULL, NULL);
1762 int __vc_cb_service_state(int state)
1764 vc_service_state_e current_state = (vc_service_state_e)state;
1765 vc_service_state_e before_state;
1766 vc_client_get_service_state(g_vc, &before_state);
1768 if (current_state == before_state) {
1772 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
1773 before_state, current_state);
1775 /* Save service state */
1776 vc_client_set_service_state(g_vc, current_state);
1778 vc_service_state_changed_cb callback = NULL;
1779 void* service_user_data;
1780 vc_client_get_service_state_changed_cb(g_vc, &callback, &service_user_data);
1782 if (NULL != callback) {
1783 vc_client_use_callback(g_vc);
1784 callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
1785 vc_client_not_use_callback(g_vc);
1786 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
1788 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null");
1794 int __vc_cb_manager_pid(int manager_pid)
1796 SLOG(LOG_DEBUG, TAG_VCC, "Manager pid is changed : %d", manager_pid);
1798 /* Save service state */
1799 vc_client_set_mgr_pid(g_vc, manager_pid);
1804 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1806 if (0 != __vc_get_feature_enabled()) {
1807 return VC_ERROR_NOT_SUPPORTED;
1809 if (0 != __vc_check_privilege()) {
1810 return VC_ERROR_PERMISSION_DENIED;
1813 if (NULL == callback)
1814 return VC_ERROR_INVALID_PARAMETER;
1817 if (0 != vc_client_get_client_state(g_vc, &state)) {
1818 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1819 return VC_ERROR_INVALID_STATE;
1823 if (state != VC_STATE_INITIALIZED) {
1824 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1825 return VC_ERROR_INVALID_STATE;
1828 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
1833 int vc_unset_service_state_changed_cb(void)
1835 if (0 != __vc_get_feature_enabled()) {
1836 return VC_ERROR_NOT_SUPPORTED;
1838 if (0 != __vc_check_privilege()) {
1839 return VC_ERROR_PERMISSION_DENIED;
1843 if (0 != vc_client_get_client_state(g_vc, &state)) {
1844 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1845 return VC_ERROR_INVALID_STATE;
1849 if (state != VC_STATE_INITIALIZED) {
1850 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1851 return VC_ERROR_INVALID_STATE;
1854 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
1859 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1861 if (0 != __vc_get_feature_enabled()) {
1862 return VC_ERROR_NOT_SUPPORTED;
1864 if (0 != __vc_check_privilege()) {
1865 return VC_ERROR_PERMISSION_DENIED;
1868 if (callback == NULL)
1869 return VC_ERROR_INVALID_PARAMETER;
1872 if (0 != vc_client_get_client_state(g_vc, &state)) {
1873 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
1874 return VC_ERROR_INVALID_STATE;
1878 if (state != VC_STATE_INITIALIZED) {
1879 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
1880 return VC_ERROR_INVALID_STATE;
1883 vc_client_set_state_changed_cb(g_vc, callback, user_data);
1888 int vc_unset_state_changed_cb(void)
1890 if (0 != __vc_get_feature_enabled()) {
1891 return VC_ERROR_NOT_SUPPORTED;
1893 if (0 != __vc_check_privilege()) {
1894 return VC_ERROR_PERMISSION_DENIED;
1898 if (0 != vc_client_get_client_state(g_vc, &state)) {
1899 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
1900 return VC_ERROR_INVALID_STATE;
1904 if (state != VC_STATE_INITIALIZED) {
1905 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
1906 return VC_ERROR_INVALID_STATE;
1909 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
1914 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
1916 if (0 != __vc_get_feature_enabled()) {
1917 return VC_ERROR_NOT_SUPPORTED;
1919 if (0 != __vc_check_privilege()) {
1920 return VC_ERROR_PERMISSION_DENIED;
1923 if (NULL == callback)
1924 return VC_ERROR_INVALID_PARAMETER;
1927 if (0 != vc_client_get_client_state(g_vc, &state)) {
1928 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
1929 return VC_ERROR_INVALID_STATE;
1933 if (state != VC_STATE_INITIALIZED) {
1934 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : Current state is not 'Initialized'");
1935 return VC_ERROR_INVALID_STATE;
1938 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
1943 int vc_unset_current_language_changed_cb(void)
1945 if (0 != __vc_get_feature_enabled()) {
1946 return VC_ERROR_NOT_SUPPORTED;
1948 if (0 != __vc_check_privilege()) {
1949 return VC_ERROR_PERMISSION_DENIED;
1953 if (0 != vc_client_get_client_state(g_vc, &state)) {
1954 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
1955 return VC_ERROR_INVALID_STATE;
1959 if (state != VC_STATE_INITIALIZED) {
1960 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
1961 return VC_ERROR_INVALID_STATE;
1964 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
1969 int vc_set_error_cb(vc_error_cb callback, void* user_data)
1971 if (0 != __vc_get_feature_enabled()) {
1972 return VC_ERROR_NOT_SUPPORTED;
1974 if (0 != __vc_check_privilege()) {
1975 return VC_ERROR_PERMISSION_DENIED;
1978 if (NULL == callback)
1979 return VC_ERROR_INVALID_PARAMETER;
1982 if (0 != vc_client_get_client_state(g_vc, &state)) {
1983 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
1984 return VC_ERROR_INVALID_STATE;
1988 if (state != VC_STATE_INITIALIZED) {
1989 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : Current state is not 'Initialized'");
1990 return VC_ERROR_INVALID_STATE;
1993 vc_client_set_error_cb(g_vc, callback, user_data);
1998 int vc_unset_error_cb(void)
2000 if (0 != __vc_get_feature_enabled()) {
2001 return VC_ERROR_NOT_SUPPORTED;
2003 if (0 != __vc_check_privilege()) {
2004 return VC_ERROR_PERMISSION_DENIED;
2008 if (0 != vc_client_get_client_state(g_vc, &state)) {
2009 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
2010 return VC_ERROR_INVALID_STATE;
2014 if (state != VC_STATE_INITIALIZED) {
2015 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2016 return VC_ERROR_INVALID_STATE;
2019 vc_client_set_error_cb(g_vc, NULL, NULL);
2024 int vc_set_invocation_name(const char* name)
2026 if (0 != __vc_get_feature_enabled()) {
2027 return VC_ERROR_NOT_SUPPORTED;
2029 if (0 != __vc_check_privilege()) {
2030 return VC_ERROR_PERMISSION_DENIED;
2034 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set invocation name");
2036 int ret = vc_client_get_client_state(g_vc, &state);
2038 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2039 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2044 if (state != VC_STATE_READY) {
2045 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
2046 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2047 return VC_ERROR_INVALID_STATE;
2050 ret = vc_client_set_invocation_name(g_vc, name);
2052 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set invocation name");
2057 int vc_request_dialog(const char* disp_text, const char* utt_text, bool auto_start)
2061 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog");
2062 if (0 != __vc_get_feature_enabled()) {
2063 return VC_ERROR_NOT_SUPPORTED;
2065 if (0 != __vc_check_privilege()) {
2066 return VC_ERROR_PERMISSION_DENIED;
2069 if (0 != vc_client_get_client_state(g_vc, &state)) {
2070 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2071 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2072 return VC_ERROR_INVALID_STATE;
2076 if (state != VC_STATE_READY) {
2077 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
2078 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2079 return VC_ERROR_INVALID_STATE;
2082 /* Check service state */
2083 vc_service_state_e service_state = -1;
2084 vc_client_get_service_state(g_vc, &service_state);
2085 if (service_state != VC_SERVICE_STATE_READY) {
2086 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
2087 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2088 return VC_ERROR_INVALID_STATE;
2091 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);
2092 int ret = vc_dbus_request_dialog(getpid(), disp_text, utt_text, auto_start);
2094 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
2095 return VC_ERROR_OPERATION_FAILED;
2098 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2100 return VC_ERROR_NONE;
2104 int vc_auth_enable(void)
2108 if (0 != vc_client_get_client_state(g_vc, &state)) {
2109 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2110 return VC_ERROR_INVALID_STATE;
2113 if (VC_STATE_READY != state) {
2114 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2115 return VC_ERROR_INVALID_STATE;
2118 /* check already authority */
2119 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2120 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2121 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2122 return VC_ERROR_INVALID_STATE;
2125 if (VC_AUTH_STATE_NONE != auth_state) {
2126 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already authority enabled");
2127 return VC_ERROR_INVALID_STATE;
2130 /* request authority */
2132 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2133 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2134 return VC_ERROR_OPERATION_FAILED;
2137 if (0 != vc_dbus_request_auth_enable(g_vc->handle, mgr_pid)) {
2138 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
2139 return VC_ERROR_OPERATION_FAILED;
2142 /* set authority into handle */
2143 bool is_foreground = false;
2144 if (0 != vc_client_get_is_foreground(g_vc, &is_foreground)) {
2145 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get is_foreground");
2146 return VC_ERROR_OPERATION_FAILED;
2149 if (is_foreground) {
2150 auth_state = VC_AUTH_STATE_VALID;
2152 auth_state = VC_AUTH_STATE_INVALID;
2155 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
2156 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2157 return VC_ERROR_OPERATION_FAILED;
2160 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2162 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
2164 return VC_ERROR_NONE;
2167 int vc_auth_disable(void)
2171 if (0 != vc_client_get_client_state(g_vc, &state)) {
2172 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2173 return VC_ERROR_INVALID_STATE;
2176 if (VC_STATE_READY != state) {
2177 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2178 return VC_ERROR_INVALID_STATE;
2181 /* check autority */
2182 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2183 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2184 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2185 return VC_ERROR_INVALID_STATE;
2188 if (VC_AUTH_STATE_NONE == auth_state) {
2189 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] No authority");
2190 return VC_ERROR_INVALID_STATE;
2193 if (0 != vc_auth_unset_state_changed_cb()) {
2194 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
2197 /* request return authority by dbus */
2199 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2200 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2201 return VC_ERROR_OPERATION_FAILED;
2204 if (0 != vc_dbus_request_auth_disable(g_vc->handle, mgr_pid)) {
2205 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disble");
2206 return VC_ERROR_OPERATION_FAILED;
2209 /* unset authority from handle */
2210 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
2211 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2212 return VC_ERROR_OPERATION_FAILED;
2215 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2217 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
2219 return VC_ERROR_NONE;
2222 int vc_auth_get_state(vc_auth_state_e* state)
2225 vc_state_e vc_state;
2226 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
2227 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2228 return VC_ERROR_INVALID_STATE;
2231 if (VC_STATE_READY != vc_state) {
2232 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2233 return VC_ERROR_INVALID_STATE;
2237 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
2238 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
2239 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2240 return VC_ERROR_INVALID_STATE;
2245 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
2247 return VC_ERROR_NONE;
2250 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
2252 /* check parameter */
2253 if (NULL == callback) {
2254 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
2255 return VC_ERROR_INVALID_PARAMETER;
2259 vc_auth_state_e auth_state;
2260 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2261 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2262 return VC_ERROR_INVALID_STATE;
2265 if (VC_AUTH_STATE_NONE == auth_state) {
2266 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auth is not enabled");
2267 return VC_ERROR_INVALID_STATE;
2270 /* set cb into handle */
2271 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
2272 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
2273 return VC_ERROR_OPERATION_FAILED;
2276 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
2278 return VC_ERROR_NONE;
2281 int vc_auth_unset_state_changed_cb(void)
2284 vc_auth_state_e auth_state;
2285 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2286 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2287 return VC_ERROR_INVALID_STATE;
2290 if (VC_AUTH_STATE_NONE == auth_state) {
2291 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auto is not enabled");
2292 return VC_ERROR_INVALID_STATE;
2295 /* unset cb from handle */
2296 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
2297 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
2298 return VC_ERROR_OPERATION_FAILED;
2301 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
2303 return VC_ERROR_NONE;
2306 int vc_auth_start(void)
2308 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
2311 if (0 != vc_client_get_client_state(g_vc, &state)) {
2312 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2313 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2314 return VC_ERROR_INVALID_STATE;
2318 if (state != VC_STATE_READY) {
2319 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
2320 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2321 return VC_ERROR_INVALID_STATE;
2324 /* Check service state */
2325 vc_service_state_e service_state = -1;
2326 vc_client_get_service_state(g_vc, &service_state);
2327 if (service_state != VC_SERVICE_STATE_READY) {
2328 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
2329 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2330 return VC_ERROR_INVALID_STATE;
2333 /* Check authority */
2334 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2335 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2336 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2337 return VC_ERROR_OPERATION_FAILED;
2340 if (VC_AUTH_STATE_VALID != auth_state) {
2341 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2342 return VC_ERROR_OPERATION_FAILED;
2347 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2348 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2349 return VC_ERROR_OPERATION_FAILED;
2358 ret = vc_dbus_request_auth_start(g_vc->handle, mgr_pid);
2360 if (VC_ERROR_TIMED_OUT != ret) {
2361 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
2364 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
2367 if (VC_RETRY_COUNT == count) {
2368 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2373 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
2377 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2382 int vc_auth_stop(void)
2384 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
2387 if (0 != vc_client_get_client_state(g_vc, &state)) {
2388 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2389 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2390 return VC_ERROR_INVALID_STATE;
2394 if (state != VC_STATE_READY) {
2395 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
2396 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2397 return VC_ERROR_INVALID_STATE;
2400 /* Check service state */
2401 vc_service_state_e service_state = -1;
2402 vc_client_get_service_state(g_vc, &service_state);
2403 if (service_state != VC_SERVICE_STATE_RECORDING) {
2404 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
2405 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2406 return VC_ERROR_INVALID_STATE;
2409 /* Check authority */
2410 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2411 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2412 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2413 return VC_ERROR_OPERATION_FAILED;
2416 if (VC_AUTH_STATE_VALID != auth_state) {
2417 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2418 return VC_ERROR_OPERATION_FAILED;
2423 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2424 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2425 return VC_ERROR_OPERATION_FAILED;
2432 ret = vc_dbus_request_auth_stop(g_vc->handle, mgr_pid);
2434 if (VC_ERROR_TIMED_OUT != ret) {
2435 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
2438 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
2441 if (VC_RETRY_COUNT == count) {
2442 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2447 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
2451 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2456 int vc_auth_cancel(void)
2458 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel");
2461 if (0 != vc_client_get_client_state(g_vc, &state)) {
2462 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2463 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2464 return VC_ERROR_INVALID_STATE;
2468 if (state != VC_STATE_READY) {
2469 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
2470 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2471 return VC_ERROR_INVALID_STATE;
2474 /* Check service state */
2475 vc_service_state_e service_state = -1;
2476 vc_client_get_service_state(g_vc, &service_state);
2477 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
2478 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
2479 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2480 return VC_ERROR_INVALID_STATE;
2483 /* Check authority */
2484 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2485 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2486 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2487 return VC_ERROR_OPERATION_FAILED;
2490 if (VC_AUTH_STATE_VALID != auth_state) {
2491 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2492 return VC_ERROR_OPERATION_FAILED;
2497 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2498 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2499 return VC_ERROR_OPERATION_FAILED;
2505 ret = vc_dbus_request_auth_cancel(g_vc->handle, mgr_pid);
2507 if (VC_ERROR_TIMED_OUT != ret) {
2508 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
2511 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
2514 if (VC_RETRY_COUNT == count) {
2515 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2520 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
2524 SLOG(LOG_DEBUG, TAG_VCC, "@@@");