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 "vc_client.h"
19 #include "vc_command.h"
20 #include "vc_config_mgr.h"
22 #include "vc_info_parser.h"
24 #include "voice_control.h"
25 #include "voice_control_authority.h"
26 #include "voice_control_command.h"
27 #include "voice_control_command_expand.h"
30 static bool g_is_daemon_started = false;
32 static Ecore_Timer* g_connect_timer = NULL;
34 static vc_h g_vc = NULL;
36 static Ecore_Event_Handler* g_focus_in_hander = NULL;
37 static Ecore_Event_Handler* g_focus_out_hander = NULL;
39 Eina_Bool __vc_notify_state_changed(void *data);
40 Eina_Bool __vc_notify_error(void *data);
43 static const char* __vc_get_error_code(vc_error_e err)
46 case VC_ERROR_NONE: return "VC_ERROR_NONE"; break;
47 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY"; break;
48 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR"; break;
49 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER"; break;
50 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT"; break;
51 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY"; break;
52 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE"; break;
53 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE"; break;
54 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND"; break;
55 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED"; break;
56 default: return "Invalid error code"; break;
61 static int __vc_convert_config_error_code(vc_config_error_e code)
63 if (code == VC_CONFIG_ERROR_NONE) return VC_ERROR_NONE;
64 if (code == VC_CONFIG_ERROR_OUT_OF_MEMORY) return VC_ERROR_OUT_OF_MEMORY;
65 if (code == VC_CONFIG_ERROR_IO_ERROR) return VC_ERROR_IO_ERROR;
66 if (code == VC_CONFIG_ERROR_INVALID_PARAMETER) return VC_ERROR_INVALID_PARAMETER;
67 if (code == VC_CONFIG_ERROR_INVALID_STATE) return VC_ERROR_INVALID_STATE;
68 if (code == VC_CONFIG_ERROR_INVALID_LANGUAGE) return VC_ERROR_INVALID_LANGUAGE;
69 if (code == VC_CONFIG_ERROR_ENGINE_NOT_FOUND) return VC_ERROR_ENGINE_NOT_FOUND;
70 if (code == VC_CONFIG_ERROR_OPERATION_FAILED) return VC_ERROR_OPERATION_FAILED;
75 static void __vc_lang_changed_cb(const char* before_lang, const char* current_lang)
77 SECURE_SLOG(LOG_DEBUG, TAG_VCC, "Lang changed : Before lang(%s) Current lang(%s)",
78 before_lang, current_lang);
80 vc_current_language_changed_cb callback;
82 vc_client_get_current_lang_changed_cb(g_vc, &callback, &lang_user_data);
84 if (NULL != callback) {
85 vc_client_use_callback(g_vc);
86 callback(before_lang, current_lang, lang_user_data);
87 vc_client_not_use_callback(g_vc);
88 SLOG(LOG_DEBUG, TAG_VCC, "Language changed callback is called");
90 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Language changed callback is null");
96 static void __vc_service_state_changed_cb(int before_state, int current_state)
98 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
99 before_state, current_state);
101 /* Save service state */
102 vc_client_set_service_state(g_vc, (vc_service_state_e)current_state);
104 vc_service_state_changed_cb service_callback = NULL;
105 void* service_user_data;
106 vc_client_get_service_state_changed_cb(g_vc, &service_callback, &service_user_data);
108 if (NULL != service_callback) {
109 vc_client_use_callback(g_vc);
110 service_callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
111 vc_client_not_use_callback(g_vc);
112 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
114 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is NULL");
122 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Initialize");
125 if (true == vc_client_is_valid(g_vc)) {
126 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already initialized");
127 return VC_ERROR_INVALID_STATE;
130 if (0 < vc_client_get_count()) {
131 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized");
132 return VC_ERROR_INVALID_STATE;
135 if (0 != vc_dbus_open_connection()) {
136 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to open connection");
137 return VC_ERROR_OPERATION_FAILED;
140 if (0 != vc_client_create(&g_vc)) {
141 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create client!!!!!");
142 return VC_ERROR_OUT_OF_MEMORY;
145 int ret = vc_config_mgr_initialize(g_vc->handle);
147 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to init config manager : %s",
148 __vc_get_error_code(__vc_convert_config_error_code(ret)));
149 vc_client_destroy(g_vc);
150 return __vc_convert_config_error_code(ret);
153 ret = vc_config_mgr_set_lang_cb(g_vc->handle, __vc_lang_changed_cb);
155 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set config changed : %d", ret);
156 vc_config_mgr_finalize(g_vc->handle);
157 vc_client_destroy(g_vc);
158 return __vc_convert_config_error_code(ret);
161 ret = vc_config_mgr_set_service_state_cb(g_vc->handle, __vc_service_state_changed_cb);
163 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set service change callback : %d", ret);
164 vc_config_mgr_unset_lang_cb(g_vc->handle);
165 vc_config_mgr_finalize(g_vc->handle);
166 vc_client_destroy(g_vc);
167 return __vc_convert_config_error_code(ret);
170 int service_state = -1;
171 if (0 != vc_config_mgr_get_service_state(&service_state)) {
172 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state");
173 vc_config_mgr_finalize(g_vc->handle);
174 vc_client_destroy(g_vc);
175 return __vc_convert_config_error_code(ret);
178 vc_client_set_service_state(g_vc, service_state);
180 SLOG(LOG_DEBUG, TAG_VCC, "[Success] pid(%d)", g_vc->handle);
182 SLOG(LOG_DEBUG, TAG_VCC, "=====");
183 SLOG(LOG_DEBUG, TAG_VCC, " ");
185 return VC_ERROR_NONE;
188 static void __vc_internal_unprepare()
190 /* return authority */
191 vc_auth_state_e state = VC_AUTH_STATE_NONE;
192 if (0 != vc_client_get_auth_state(g_vc, &state)) {
193 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
196 if (VC_AUTH_STATE_NONE != state) {
197 if (0 != vc_auth_disable()) {
198 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to auth disable");
202 int ret = vc_dbus_request_finalize(g_vc->handle);
204 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret));
207 g_is_daemon_started = false;
209 ecore_event_handler_del(g_focus_in_hander);
210 ecore_event_handler_del(g_focus_out_hander);
212 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
213 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_BACKGROUND);
218 int vc_deinitialize()
220 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Deinitialize");
222 if (false == vc_client_is_valid(g_vc)) {
223 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NOT initialized");
224 SLOG(LOG_DEBUG, TAG_VCC, "=====");
225 SLOG(LOG_DEBUG, TAG_VCC, " ");
226 return VC_ERROR_INVALID_STATE;
230 vc_client_get_client_state(g_vc, &state);
235 __vc_internal_unprepare();
236 /* no break. need to next step*/
237 case VC_STATE_INITIALIZED:
238 if (NULL != g_connect_timer) {
239 SLOG(LOG_DEBUG, TAG_VCC, "Connect Timer is deleted");
240 ecore_timer_del(g_connect_timer);
243 vc_config_mgr_unset_service_state_cb(g_vc->handle);
244 vc_config_mgr_unset_lang_cb(g_vc->handle);
245 vc_config_mgr_finalize(g_vc->handle);
247 /* Free client resources */
248 vc_client_destroy(g_vc);
257 SLOG(LOG_DEBUG, TAG_VCC, "Success: destroy");
259 if (0 != vc_dbus_close_connection()) {
260 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection");
263 SLOG(LOG_DEBUG, TAG_VCC, "=====");
264 SLOG(LOG_DEBUG, TAG_VCC, " ");
266 return VC_ERROR_NONE;
269 static Eina_Bool __notify_auth_changed_cb(void *data)
271 vc_auth_state_changed_cb callback = NULL;
274 vc_client_get_auth_state_changed_cb(g_vc, &callback, &user_data);
276 vc_auth_state_e before = -1;
277 vc_auth_state_e current = -1;
279 vc_client_get_before_auth_state(g_vc, &before, ¤t);
281 if (NULL != callback) {
282 vc_client_use_callback(g_vc);
283 callback(before, current, user_data);
284 vc_client_not_use_callback(g_vc);
285 SLOG(LOG_DEBUG, TAG_VCC, "Auth state changed callback is called");
287 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Auth state changed callback is null");
295 static Eina_Bool __vc_x_event_window_focus_in(void *data, int type, void *event)
297 Ecore_X_Event_Window_Focus_In *e;
302 if (0 != vc_client_get_xid(g_vc, &xid)) {
303 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current xid");
304 return ECORE_CALLBACK_PASS_ON;
307 if (e->win == (Ecore_X_Window)xid) {
308 SLOG(LOG_DEBUG, TAG_VCC, "Focus in : pid(%d) xid(%d)", getpid(), xid);
309 int ret = vc_config_mgr_set_foreground(getpid(), true);
311 ret = vc_config_convert_error_code((vc_config_error_e)ret);
312 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set focus in : %s", __vc_get_error_code(ret));
314 /* set authority valid */
315 vc_auth_state_e state = VC_AUTH_STATE_NONE;
316 if (0 != vc_client_get_auth_state(g_vc, &state)) {
317 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
319 if (VC_AUTH_STATE_INVALID == state) {
320 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
322 /* notify auth changed cb */
323 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
327 return ECORE_CALLBACK_PASS_ON;
330 static Eina_Bool __vc_x_event_window_focus_out(void *data, int type, void *event)
332 Ecore_X_Event_Window_Focus_In *e;
337 if (0 != vc_client_get_xid(g_vc, &xid)) {
338 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current xid");
339 return ECORE_CALLBACK_PASS_ON;
342 if (e->win == (Ecore_X_Window)xid) {
343 SLOG(LOG_DEBUG, TAG_VCC, "Focus out : pid(%d) xid(%d)", getpid(), xid);
344 int ret = vc_config_mgr_set_foreground(getpid(), false);
346 ret = vc_config_convert_error_code((vc_config_error_e)ret);
347 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set focus out : %s", __vc_get_error_code(ret));
349 /* set authority valid */
350 vc_auth_state_e state = VC_AUTH_STATE_NONE;
351 if (0 != vc_client_get_auth_state(g_vc, &state)) {
352 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
354 if (VC_AUTH_STATE_VALID == state) {
355 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_INVALID);
357 /* notify authority changed cb */
358 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
362 return ECORE_CALLBACK_PASS_ON;
365 static void __vc_fork_vc_daemon()
372 SLOG(LOG_ERROR, TAG_VCC, "Fail to create daemon");
376 for (i = 0;i < _NSIG;i++)
379 execl(VC_DAEMON_PATH, VC_DAEMON_PATH, NULL);
387 static Eina_Bool __vc_connect_daemon(void *data)
390 if (0 != vc_dbus_request_hello()) {
391 if (false == g_is_daemon_started) {
392 g_is_daemon_started = true;
393 __vc_fork_vc_daemon();
398 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Connect daemon");
400 /* request initialization */
403 ret = vc_dbus_request_initialize(g_vc->handle, &mgr_pid);
404 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
405 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
407 vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND);
408 ecore_timer_add(0, __vc_notify_error, g_vc);
410 SLOG(LOG_DEBUG, TAG_VCC, "=====");
411 SLOG(LOG_DEBUG, TAG_VCC, " ");
414 } else if (0 != ret) {
415 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret));
417 vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT);
418 ecore_timer_add(0, __vc_notify_error, g_vc);
420 SLOG(LOG_DEBUG, TAG_VCC, "=====");
421 SLOG(LOG_DEBUG, TAG_VCC, " ");
424 /* Success to connect */
427 g_connect_timer = NULL;
429 g_focus_in_hander = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, __vc_x_event_window_focus_in, NULL);
430 g_focus_out_hander = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, __vc_x_event_window_focus_out, NULL);
432 vc_client_set_client_state(g_vc, VC_STATE_READY);
433 ecore_timer_add(0, __vc_notify_state_changed, g_vc);
435 vc_client_set_mgr_pid(g_vc, mgr_pid);
437 SLOG(LOG_DEBUG, TAG_VCC, "=====");
438 SLOG(LOG_DEBUG, TAG_VCC, " ");
445 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Prepare");
448 if (0 != vc_client_get_client_state(g_vc, &state)) {
449 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
450 SLOG(LOG_DEBUG, TAG_VCC, "=====");
451 SLOG(LOG_DEBUG, TAG_VCC, " ");
452 return VC_ERROR_INVALID_STATE;
456 if (state != VC_STATE_INITIALIZED) {
457 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'");
458 SLOG(LOG_DEBUG, TAG_VCC, "=====");
459 SLOG(LOG_DEBUG, TAG_VCC, " ");
460 return VC_ERROR_INVALID_STATE;
463 g_is_daemon_started = false;
465 g_connect_timer = ecore_timer_add(0, __vc_connect_daemon, NULL);
467 SLOG(LOG_DEBUG, TAG_VCC, "=====");
468 SLOG(LOG_DEBUG, TAG_VCC, " ");
470 return VC_ERROR_NONE;
475 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Unprepare");
478 if (0 != vc_client_get_client_state(g_vc, &state)) {
479 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
480 SLOG(LOG_DEBUG, TAG_VCC, "=====");
481 SLOG(LOG_DEBUG, TAG_VCC, " ");
482 return VC_ERROR_INVALID_STATE;
486 if (state != VC_STATE_READY) {
487 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
488 SLOG(LOG_DEBUG, TAG_VCC, "=====");
489 SLOG(LOG_DEBUG, TAG_VCC, " ");
490 return VC_ERROR_INVALID_STATE;
493 __vc_internal_unprepare();
495 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
496 ecore_timer_add(0, __vc_notify_state_changed, g_vc);
498 SLOG(LOG_DEBUG, TAG_VCC, "=====");
499 SLOG(LOG_DEBUG, TAG_VCC, " ");
501 return VC_ERROR_NONE;
504 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
506 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Foreach Supported Language");
508 if (NULL == callback) {
509 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
510 SLOG(LOG_DEBUG, TAG_VCC, "=====");
511 SLOG(LOG_DEBUG, TAG_VCC, " ");
512 return VC_ERROR_INVALID_PARAMETER;
516 if (0 != vc_client_get_client_state(g_vc, &state)) {
517 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
518 SLOG(LOG_DEBUG, TAG_VCC, "=====");
519 SLOG(LOG_DEBUG, TAG_VCC, " ");
520 return VC_ERROR_INVALID_STATE;
524 ret = vc_config_mgr_get_language_list(callback, user_data);
526 ret = vc_config_convert_error_code((vc_config_error_e)ret);
527 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret));
530 SLOG(LOG_DEBUG, TAG_VCC, "=====");
531 SLOG(LOG_DEBUG, TAG_VCC, " ");
533 return VC_ERROR_NONE;
537 int vc_get_current_language(char** language)
539 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get Current Language");
541 if (NULL == language) {
542 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
543 SLOG(LOG_DEBUG, TAG_VCC, "=====");
544 SLOG(LOG_DEBUG, TAG_VCC, " ");
545 return VC_ERROR_INVALID_PARAMETER;
549 if (0 != vc_client_get_client_state(g_vc, &state)) {
550 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
551 SLOG(LOG_DEBUG, TAG_VCC, "=====");
552 SLOG(LOG_DEBUG, TAG_VCC, " ");
553 return VC_ERROR_INVALID_STATE;
557 ret = vc_config_mgr_get_default_language(language);
559 ret = vc_config_convert_error_code((vc_config_error_e)ret);
560 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret));
563 SLOG(LOG_DEBUG, TAG_VCC, "=====");
564 SLOG(LOG_DEBUG, TAG_VCC, " ");
569 int vc_get_state(vc_state_e* state)
571 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get State");
574 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
575 return VC_ERROR_INVALID_PARAMETER;
579 if (0 != vc_client_get_client_state(g_vc, &temp)) {
580 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
581 SLOG(LOG_DEBUG, TAG_VCC, "=====");
582 SLOG(LOG_DEBUG, TAG_VCC, " ");
583 return VC_ERROR_INVALID_STATE;
589 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
590 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
591 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
592 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state"); break;
595 SLOG(LOG_DEBUG, TAG_VCC, "=====");
596 SLOG(LOG_DEBUG, TAG_VCC, " ");
598 return VC_ERROR_NONE;
601 int vc_get_service_state(vc_service_state_e* state)
603 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get Service State");
606 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
607 return VC_ERROR_INVALID_PARAMETER;
611 if (0 != vc_client_get_client_state(g_vc, &temp)) {
612 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
613 SLOG(LOG_DEBUG, TAG_VCC, "=====");
614 SLOG(LOG_DEBUG, TAG_VCC, " ");
615 return VC_ERROR_INVALID_STATE;
618 /* get service state */
619 vc_service_state_e service_state;
620 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
621 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state");
622 return VC_ERROR_OPERATION_FAILED;
625 *state = service_state;
628 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break;
629 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
630 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
631 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
632 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state"); break;
635 SLOG(LOG_DEBUG, TAG_VCC, "=====");
636 SLOG(LOG_DEBUG, TAG_VCC, " ");
638 return VC_ERROR_NONE;
642 int vc_set_window_id(int wid)
644 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Set Window id");
647 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is invalid");
648 SLOG(LOG_DEBUG, TAG_VCC, "=====");
649 SLOG(LOG_DEBUG, TAG_VCC, " ");
650 return VC_ERROR_INVALID_PARAMETER;
654 if (0 != vc_client_get_client_state(g_vc, &state)) {
655 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
656 SLOG(LOG_DEBUG, TAG_VCC, "=====");
657 SLOG(LOG_DEBUG, TAG_VCC, " ");
658 return VC_ERROR_INVALID_STATE;
662 if (state != VC_STATE_READY) {
663 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
664 SLOG(LOG_DEBUG, TAG_VCC, "=====");
665 SLOG(LOG_DEBUG, TAG_VCC, " ");
666 return VC_ERROR_INVALID_STATE;
669 if (0 != vc_client_set_xid(g_vc, wid)) {
670 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
671 SLOG(LOG_DEBUG, TAG_VCC, "=====");
672 SLOG(LOG_DEBUG, TAG_VCC, " ");
673 return VC_ERROR_INVALID_STATE;
676 /* Check if current xid is top window */
678 if ((Ecore_X_Window)wid == ecore_x_window_focus_get()) {
679 /* Set current pid */
680 ret = vc_config_mgr_set_foreground(getpid(), true);
682 ret = vc_config_convert_error_code((vc_config_error_e)ret);
683 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set focus in : %s", __vc_get_error_code(ret));
687 SLOG(LOG_DEBUG, TAG_VCC, "=====");
688 SLOG(LOG_DEBUG, TAG_VCC, " ");
693 int vc_get_window_id(int* wid)
695 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get Window id");
698 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
699 SLOG(LOG_DEBUG, TAG_VCC, "=====");
700 SLOG(LOG_DEBUG, TAG_VCC, " ");
701 return VC_ERROR_INVALID_PARAMETER;
705 if (0 != vc_client_get_client_state(g_vc, &state)) {
706 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
707 SLOG(LOG_DEBUG, TAG_VCC, "=====");
708 SLOG(LOG_DEBUG, TAG_VCC, " ");
709 return VC_ERROR_INVALID_STATE;
713 if (state != VC_STATE_READY) {
714 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
715 SLOG(LOG_DEBUG, TAG_VCC, "=====");
716 SLOG(LOG_DEBUG, TAG_VCC, " ");
717 return VC_ERROR_INVALID_STATE;
720 if (0 != vc_client_get_xid(g_vc, wid)) {
721 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
722 SLOG(LOG_DEBUG, TAG_VCC, "=====");
723 SLOG(LOG_DEBUG, TAG_VCC, " ");
724 return VC_ERROR_INVALID_STATE;
727 SLOG(LOG_DEBUG, TAG_VCC, "=====");
728 SLOG(LOG_DEBUG, TAG_VCC, " ");
730 return VC_ERROR_NONE;
735 * @brief Checks whether the command format is supported.
738 * @param[in] format The command format
739 * @param[out] support The result status @c true = supported, @c false = not supported
741 * @return 0 on success, otherwise a negative error value
742 * @retval #VC_ERROR_NONE Successful
743 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
744 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
745 * @retval #VC_ERROR_INVALID_STATE Invalid state
747 * @pre The state should be #VC_STATE_READY.
750 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
752 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Is command format supported");
755 if (0 != vc_client_get_client_state(g_vc, &state)) {
756 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
757 SLOG(LOG_DEBUG, TAG_VCC, "=====");
758 SLOG(LOG_DEBUG, TAG_VCC, " ");
759 return VC_ERROR_INVALID_STATE;
763 bool non_fixed_support = false;
764 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
765 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
769 case VC_CMD_FORMAT_FIXED: *support = true; break;
770 case VC_CMD_FORMAT_FIXED_AND_EXTRA: *support = non_fixed_support; break;
771 case VC_CMD_FORMAT_EXTRA_AND_FIXED: *support = non_fixed_support; break;
772 default: *support = false; break;
775 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
777 SLOG(LOG_DEBUG, TAG_VCC, "=====");
778 SLOG(LOG_DEBUG, TAG_VCC, " ");
780 return VC_ERROR_NONE;
784 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
786 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Set Command list");
788 if (NULL == vc_cmd_list) {
789 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
790 return VC_ERROR_INVALID_PARAMETER;
794 if (0 != vc_client_get_client_state(g_vc, &state)) {
795 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
796 SLOG(LOG_DEBUG, TAG_VCC, "=====");
797 SLOG(LOG_DEBUG, TAG_VCC, " ");
798 return VC_ERROR_INVALID_STATE;
802 if (state != VC_STATE_READY) {
803 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
804 SLOG(LOG_DEBUG, TAG_VCC, "=====");
805 SLOG(LOG_DEBUG, TAG_VCC, " ");
806 return VC_ERROR_INVALID_STATE;
810 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
811 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
812 SLOG(LOG_DEBUG, TAG_VCC, "=====");
813 SLOG(LOG_DEBUG, TAG_VCC, " ");
814 return VC_ERROR_INVALID_STATE;
817 vc_cmd_list_s* list = NULL;
818 list = (vc_cmd_list_s*)vc_cmd_list;
821 if (0 != vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list)) {
822 ret = VC_ERROR_INVALID_PARAMETER;
823 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
827 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
829 if (VC_ERROR_TIMED_OUT != ret) {
830 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
833 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
836 if (VC_RETRY_COUNT == count) {
837 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
845 SLOG(LOG_DEBUG, TAG_VCC, "=====");
846 SLOG(LOG_DEBUG, TAG_VCC, " ");
851 int vc_unset_command_list(int type)
853 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Unset Command list");
856 if (0 != vc_client_get_client_state(g_vc, &state)) {
857 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
858 SLOG(LOG_DEBUG, TAG_VCC, "=====");
859 SLOG(LOG_DEBUG, TAG_VCC, " ");
860 return VC_ERROR_INVALID_STATE;
864 if (state != VC_STATE_READY) {
865 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
866 SLOG(LOG_DEBUG, TAG_VCC, "=====");
867 SLOG(LOG_DEBUG, TAG_VCC, " ");
868 return VC_ERROR_INVALID_STATE;
874 ret = vc_dbus_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
876 if (VC_ERROR_TIMED_OUT != ret) {
877 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
880 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
883 if (VC_RETRY_COUNT == count) {
884 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
891 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
893 ret = vc_config_convert_error_code((vc_config_error_e)ret);
894 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret));
897 SLOG(LOG_DEBUG, TAG_VCC, "=====");
898 SLOG(LOG_DEBUG, TAG_VCC, " ");
904 int vc_get_exclusive_command_option(bool* value)
906 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get exclusive command");
909 if (0 != vc_client_get_client_state(g_vc, &state)) {
910 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
911 SLOG(LOG_DEBUG, TAG_VCC, "=====");
912 SLOG(LOG_DEBUG, TAG_VCC, " ");
913 return VC_ERROR_INVALID_STATE;
917 if (state != VC_STATE_READY) {
918 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
919 SLOG(LOG_DEBUG, TAG_VCC, "=====");
920 SLOG(LOG_DEBUG, TAG_VCC, " ");
921 return VC_ERROR_INVALID_STATE;
924 int ret = vc_client_get_exclusive_cmd(g_vc, value);
926 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
927 SLOG(LOG_DEBUG, TAG_VCC, "=====");
928 SLOG(LOG_DEBUG, TAG_VCC, " ");
932 SLOG(LOG_DEBUG, TAG_VCC, "=====");
933 SLOG(LOG_DEBUG, TAG_VCC, " ");
938 int vc_set_exclusive_command_option(bool value)
940 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Set exclusive command");
943 if (0 != vc_client_get_client_state(g_vc, &state)) {
944 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
945 SLOG(LOG_DEBUG, TAG_VCC, "=====");
946 SLOG(LOG_DEBUG, TAG_VCC, " ");
947 return VC_ERROR_INVALID_STATE;
951 if (state != VC_STATE_READY) {
952 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
953 SLOG(LOG_DEBUG, TAG_VCC, "=====");
954 SLOG(LOG_DEBUG, TAG_VCC, " ");
955 return VC_ERROR_INVALID_STATE;
958 int ret = vc_client_set_exclusive_cmd(g_vc, value);
960 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
961 SLOG(LOG_DEBUG, TAG_VCC, "=====");
962 SLOG(LOG_DEBUG, TAG_VCC, " ");
966 /* Check if current xid is top window */
969 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
971 if (VC_ERROR_TIMED_OUT != ret) {
972 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
975 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
978 if (VC_RETRY_COUNT == count) {
979 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
986 SLOG(LOG_DEBUG, TAG_VCC, "=====");
987 SLOG(LOG_DEBUG, TAG_VCC, " ");
994 int vc_request_start(bool stop_by_silence)
996 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request start");
999 if (0 != vc_client_get_client_state(g_vc, &state)) {
1000 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1001 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1002 SLOG(LOG_DEBUG, TAG_VCC, " ");
1003 return VC_ERROR_INVALID_STATE;
1007 if (state != VC_STATE_READY) {
1008 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1009 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1010 SLOG(LOG_DEBUG, TAG_VCC, " ");
1011 return VC_ERROR_INVALID_STATE;
1014 /* Check service state */
1015 vc_service_state_e service_state = -1;
1016 vc_client_get_service_state(g_vc, &service_state);
1017 if (service_state != VC_SERVICE_STATE_READY) {
1018 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1019 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1020 SLOG(LOG_DEBUG, TAG_VCC, " ");
1021 return VC_ERROR_INVALID_STATE;
1031 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1033 if (VC_ERROR_TIMED_OUT != ret) {
1034 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1037 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1040 if (VC_RETRY_COUNT == count) {
1041 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1046 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1050 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1051 SLOG(LOG_DEBUG, TAG_VCC, " ");
1056 int vc_request_stop()
1058 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request stop");
1061 if (0 != vc_client_get_client_state(g_vc, &state)) {
1062 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1063 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1064 SLOG(LOG_DEBUG, TAG_VCC, " ");
1065 return VC_ERROR_INVALID_STATE;
1069 if (state != VC_STATE_READY) {
1070 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1071 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1072 SLOG(LOG_DEBUG, TAG_VCC, " ");
1073 return VC_ERROR_INVALID_STATE;
1076 /* Check service state */
1077 vc_service_state_e service_state = -1;
1078 vc_client_get_service_state(g_vc, &service_state);
1079 if (service_state != VC_SERVICE_STATE_RECORDING) {
1080 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1081 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1082 SLOG(LOG_DEBUG, TAG_VCC, " ");
1083 return VC_ERROR_INVALID_STATE;
1090 ret = vc_dbus_request_stop(g_vc->handle);
1092 if (VC_ERROR_TIMED_OUT != ret) {
1093 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1096 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1099 if (VC_RETRY_COUNT == count) {
1100 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1105 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1109 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1110 SLOG(LOG_DEBUG, TAG_VCC, " ");
1115 int vc_request_cancel()
1117 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request cancel Interrupt");
1120 if (0 != vc_client_get_client_state(g_vc, &state)) {
1121 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1122 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1123 SLOG(LOG_DEBUG, TAG_VCC, " ");
1124 return VC_ERROR_INVALID_STATE;
1128 if (state != VC_STATE_READY) {
1129 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1130 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1131 SLOG(LOG_DEBUG, TAG_VCC, " ");
1132 return VC_ERROR_INVALID_STATE;
1135 /* Check service state */
1136 vc_service_state_e service_state = -1;
1137 vc_client_get_service_state(g_vc, &service_state);
1138 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1139 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1140 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1141 SLOG(LOG_DEBUG, TAG_VCC, " ");
1142 return VC_ERROR_INVALID_STATE;
1148 ret = vc_dbus_request_cancel(g_vc->handle);
1150 if (VC_ERROR_TIMED_OUT != ret) {
1151 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1154 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel request : %s", __vc_get_error_code(ret));
1157 if (VC_RETRY_COUNT == count) {
1158 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1163 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Cancel interrupt");
1167 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1168 SLOG(LOG_DEBUG, TAG_VCC, " ");
1174 Eina_Bool __vc_notify_error(void *data)
1176 vc_h vc = (vc_h)data;
1178 vc_error_cb callback = NULL;
1182 vc_client_get_error_cb(vc, &callback, &user_data);
1183 vc_client_get_error(vc, &reason);
1185 if (NULL != callback) {
1186 vc_client_use_callback(vc);
1187 callback(reason, user_data);
1188 vc_client_not_use_callback(vc);
1189 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1191 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1197 int __vc_cb_error(int pid, int reason)
1199 if (0 != vc_client_get_handle(pid, &g_vc)) {
1200 SLOG(LOG_ERROR, TAG_VCC, "Handle is not valid");
1204 vc_client_set_error(g_vc, reason);
1205 ecore_timer_add(0, __vc_notify_error, g_vc);
1210 Eina_Bool __vc_notify_state_changed(void *data)
1212 vc_h vc = (vc_h)data;
1214 vc_state_changed_cb changed_callback = NULL;
1217 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1219 vc_state_e current_state;
1220 vc_state_e before_state;
1222 vc_client_get_before_state(vc, ¤t_state, &before_state);
1224 if (NULL != changed_callback) {
1225 vc_client_use_callback(vc);
1226 changed_callback(before_state, current_state, user_data);
1227 vc_client_not_use_callback(vc);
1228 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1230 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1236 static Eina_Bool __vc_notify_result(void *data)
1240 vc_cmd_list_h vc_cmd_list = NULL;
1242 vc_result_cb callback = NULL;
1243 void* user_data = NULL;
1245 vc_client_get_result_cb(g_vc, &callback, &user_data);
1247 if (NULL == callback) {
1248 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1252 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1253 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1257 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1259 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1261 vc_cmd_print_list(vc_cmd_list);
1263 vc_client_use_callback(g_vc);
1264 callback(event, vc_cmd_list, temp_text, user_data);
1265 vc_client_not_use_callback(g_vc);
1267 SLOG(LOG_DEBUG, TAG_VCC, "Client result callback called");
1269 vc_cmd_list_destroy(vc_cmd_list, true);
1271 /* Release result */
1272 if (NULL != temp_text) free(temp_text);
1277 void __vc_cb_result()
1279 ecore_timer_add(0, __vc_notify_result, NULL);
1284 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1286 if (NULL == callback)
1287 return VC_ERROR_INVALID_PARAMETER;
1290 if (0 != vc_client_get_client_state(g_vc, &state)) {
1291 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1292 return VC_ERROR_INVALID_STATE;
1296 if (state != VC_STATE_INITIALIZED) {
1297 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1298 return VC_ERROR_INVALID_STATE;
1301 vc_client_set_result_cb(g_vc, callback, user_data);
1306 int vc_unset_result_cb()
1309 if (0 != vc_client_get_client_state(g_vc, &state)) {
1310 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1311 return VC_ERROR_INVALID_STATE;
1315 if (state != VC_STATE_INITIALIZED) {
1316 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1317 return VC_ERROR_INVALID_STATE;
1320 vc_client_set_result_cb(g_vc, NULL, NULL);
1325 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1327 if (NULL == callback)
1328 return VC_ERROR_INVALID_PARAMETER;
1331 if (0 != vc_client_get_client_state(g_vc, &state)) {
1332 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1333 return VC_ERROR_INVALID_STATE;
1337 if (state != VC_STATE_INITIALIZED) {
1338 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1339 return VC_ERROR_INVALID_STATE;
1342 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
1347 int vc_unset_service_state_changed_cb()
1350 if (0 != vc_client_get_client_state(g_vc, &state)) {
1351 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1352 return VC_ERROR_INVALID_STATE;
1356 if (state != VC_STATE_INITIALIZED) {
1357 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1358 return VC_ERROR_INVALID_STATE;
1361 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
1366 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1368 if (callback == NULL)
1369 return VC_ERROR_INVALID_PARAMETER;
1372 if (0 != vc_client_get_client_state(g_vc, &state)) {
1373 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
1374 return VC_ERROR_INVALID_STATE;
1378 if (state != VC_STATE_INITIALIZED) {
1379 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
1380 return VC_ERROR_INVALID_STATE;
1383 vc_client_set_state_changed_cb(g_vc, callback, user_data);
1388 int vc_unset_state_changed_cb()
1391 if (0 != vc_client_get_client_state(g_vc, &state)) {
1392 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
1393 return VC_ERROR_INVALID_STATE;
1397 if (state != VC_STATE_INITIALIZED) {
1398 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
1399 return VC_ERROR_INVALID_STATE;
1402 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
1407 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
1409 if (NULL == callback)
1410 return VC_ERROR_INVALID_PARAMETER;
1413 if (0 != vc_client_get_client_state(g_vc, &state)) {
1414 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
1415 return VC_ERROR_INVALID_STATE;
1419 if (state != VC_STATE_INITIALIZED) {
1420 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : Current state is not 'Initialized'");
1421 return VC_ERROR_INVALID_STATE;
1424 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
1429 int vc_unset_current_language_changed_cb()
1432 if (0 != vc_client_get_client_state(g_vc, &state)) {
1433 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
1434 return VC_ERROR_INVALID_STATE;
1438 if (state != VC_STATE_INITIALIZED) {
1439 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
1440 return VC_ERROR_INVALID_STATE;
1443 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
1448 int vc_set_error_cb(vc_error_cb callback, void* user_data)
1450 if (NULL == callback)
1451 return VC_ERROR_INVALID_PARAMETER;
1454 if (0 != vc_client_get_client_state(g_vc, &state)) {
1455 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
1456 return VC_ERROR_INVALID_STATE;
1460 if (state != VC_STATE_INITIALIZED) {
1461 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : Current state is not 'Initialized'");
1462 return VC_ERROR_INVALID_STATE;
1465 vc_client_set_error_cb(g_vc, callback, user_data);
1470 int vc_unset_error_cb()
1473 if (0 != vc_client_get_client_state(g_vc, &state)) {
1474 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
1475 return VC_ERROR_INVALID_STATE;
1479 if (state != VC_STATE_INITIALIZED) {
1480 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : Current state is not 'Initialized'");
1481 return VC_ERROR_INVALID_STATE;
1484 vc_client_set_error_cb(g_vc, NULL, NULL);
1490 int vc_auth_enable()
1494 if (0 != vc_client_get_client_state(g_vc, &state)) {
1495 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1496 return VC_ERROR_INVALID_STATE;
1499 if (VC_STATE_READY != state) {
1500 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
1501 return VC_ERROR_INVALID_STATE;
1504 /* check already authority */
1505 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1506 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1507 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
1508 return VC_ERROR_INVALID_STATE;
1511 if (VC_AUTH_STATE_NONE != auth_state) {
1512 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already authority enabled");
1513 return VC_ERROR_INVALID_STATE;
1516 /* request authority */
1518 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1519 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1520 return VC_ERROR_OPERATION_FAILED;
1523 if (0 != vc_dbus_request_auth_enable(g_vc->handle, mgr_pid)) {
1524 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
1525 return VC_ERROR_OPERATION_FAILED;
1528 /* set authority into handle */
1530 if (0 != vc_config_mgr_get_foreground(&fg_pid)) {
1531 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get foreground");
1532 return VC_ERROR_OPERATION_FAILED;
1535 if (g_vc->handle == fg_pid) {
1536 auth_state = VC_AUTH_STATE_VALID;
1538 auth_state = VC_AUTH_STATE_INVALID;
1541 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
1542 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
1543 return VC_ERROR_OPERATION_FAILED;
1546 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
1548 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
1550 return VC_ERROR_NONE;
1553 int vc_auth_disable()
1557 if (0 != vc_client_get_client_state(g_vc, &state)) {
1558 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1559 return VC_ERROR_INVALID_STATE;
1562 if (VC_STATE_READY != state) {
1563 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
1564 return VC_ERROR_INVALID_STATE;
1567 /* check autority */
1568 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1569 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1570 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
1571 return VC_ERROR_INVALID_STATE;
1574 if (VC_AUTH_STATE_NONE == auth_state) {
1575 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] No authority");
1576 return VC_ERROR_INVALID_STATE;
1579 if (0 != vc_auth_unset_state_changed_cb()) {
1580 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
1583 /* request return authority by dbus */
1585 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1586 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1587 return VC_ERROR_OPERATION_FAILED;
1590 if (0 != vc_dbus_request_auth_disable(g_vc->handle, mgr_pid)) {
1591 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disble");
1592 return VC_ERROR_OPERATION_FAILED;
1595 /* unset authority from handle */
1596 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
1597 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
1598 return VC_ERROR_OPERATION_FAILED;
1601 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
1603 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
1605 return VC_ERROR_NONE;
1608 int vc_auth_get_state(vc_auth_state_e* state)
1611 vc_state_e vc_state;
1612 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
1613 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1614 return VC_ERROR_INVALID_STATE;
1617 if (VC_STATE_READY != vc_state) {
1618 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
1619 return VC_ERROR_INVALID_STATE;
1623 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
1624 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
1625 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
1626 return VC_ERROR_INVALID_STATE;
1631 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
1633 return VC_ERROR_NONE;
1636 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
1638 /* check parameter */
1639 if (NULL == callback) {
1640 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
1641 return VC_ERROR_INVALID_PARAMETER;
1645 vc_auth_state_e auth_state;
1646 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1647 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1648 return VC_ERROR_INVALID_STATE;
1651 if (VC_AUTH_STATE_NONE == auth_state) {
1652 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auth is not enabled");
1653 return VC_ERROR_INVALID_STATE;
1656 /* set cb into handle */
1657 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
1658 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
1659 return VC_ERROR_OPERATION_FAILED;
1662 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
1664 return VC_ERROR_NONE;
1667 int vc_auth_unset_state_changed_cb()
1670 vc_auth_state_e auth_state;
1671 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1672 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1673 return VC_ERROR_INVALID_STATE;
1676 if (VC_AUTH_STATE_NONE == auth_state) {
1677 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auto is not enabled");
1678 return VC_ERROR_INVALID_STATE;
1681 /* unset cb from handle */
1682 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
1683 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
1684 return VC_ERROR_OPERATION_FAILED;
1687 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
1689 return VC_ERROR_NONE;
1694 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request start");
1697 if (0 != vc_client_get_client_state(g_vc, &state)) {
1698 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1699 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1700 SLOG(LOG_DEBUG, TAG_VCC, " ");
1701 return VC_ERROR_INVALID_STATE;
1705 if (state != VC_STATE_READY) {
1706 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1707 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1708 SLOG(LOG_DEBUG, TAG_VCC, " ");
1709 return VC_ERROR_INVALID_STATE;
1712 /* Check service state */
1713 vc_service_state_e service_state = -1;
1714 vc_client_get_service_state(g_vc, &service_state);
1715 if (service_state != VC_SERVICE_STATE_READY) {
1716 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1717 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1718 SLOG(LOG_DEBUG, TAG_VCC, " ");
1719 return VC_ERROR_INVALID_STATE;
1722 /* Check authority */
1723 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1724 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1725 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
1726 return VC_ERROR_OPERATION_FAILED;
1729 if (VC_AUTH_STATE_VALID != auth_state) {
1730 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
1731 return VC_ERROR_OPERATION_FAILED;
1736 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1737 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1738 return VC_ERROR_OPERATION_FAILED;
1747 ret = vc_dbus_request_auth_start(g_vc->handle, mgr_pid);
1749 if (VC_ERROR_TIMED_OUT != ret) {
1750 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
1753 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
1756 if (VC_RETRY_COUNT == count) {
1757 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1762 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
1766 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1767 SLOG(LOG_DEBUG, TAG_VCC, " ");
1774 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request stop");
1777 if (0 != vc_client_get_client_state(g_vc, &state)) {
1778 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1779 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1780 SLOG(LOG_DEBUG, TAG_VCC, " ");
1781 return VC_ERROR_INVALID_STATE;
1785 if (state != VC_STATE_READY) {
1786 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1787 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1788 SLOG(LOG_DEBUG, TAG_VCC, " ");
1789 return VC_ERROR_INVALID_STATE;
1792 /* Check service state */
1793 vc_service_state_e service_state = -1;
1794 vc_client_get_service_state(g_vc, &service_state);
1795 if (service_state != VC_SERVICE_STATE_RECORDING) {
1796 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1797 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1798 SLOG(LOG_DEBUG, TAG_VCC, " ");
1799 return VC_ERROR_INVALID_STATE;
1802 /* Check authority */
1803 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1804 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1805 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
1806 return VC_ERROR_OPERATION_FAILED;
1809 if (VC_AUTH_STATE_VALID != auth_state) {
1810 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
1811 return VC_ERROR_OPERATION_FAILED;
1816 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1817 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1818 return VC_ERROR_OPERATION_FAILED;
1825 ret = vc_dbus_request_auth_stop(g_vc->handle, mgr_pid);
1827 if (VC_ERROR_TIMED_OUT != ret) {
1828 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
1831 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
1834 if (VC_RETRY_COUNT == count) {
1835 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1840 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
1844 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1845 SLOG(LOG_DEBUG, TAG_VCC, " ");
1850 int vc_auth_cancel()
1852 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request cancel");
1855 if (0 != vc_client_get_client_state(g_vc, &state)) {
1856 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1857 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1858 SLOG(LOG_DEBUG, TAG_VCC, " ");
1859 return VC_ERROR_INVALID_STATE;
1863 if (state != VC_STATE_READY) {
1864 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1865 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1866 SLOG(LOG_DEBUG, TAG_VCC, " ");
1867 return VC_ERROR_INVALID_STATE;
1870 /* Check service state */
1871 vc_service_state_e service_state = -1;
1872 vc_client_get_service_state(g_vc, &service_state);
1873 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1874 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1875 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1876 SLOG(LOG_DEBUG, TAG_VCC, " ");
1877 return VC_ERROR_INVALID_STATE;
1880 /* Check authority */
1881 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1882 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1883 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
1884 return VC_ERROR_OPERATION_FAILED;
1887 if (VC_AUTH_STATE_VALID != auth_state) {
1888 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
1889 return VC_ERROR_OPERATION_FAILED;
1894 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1895 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1896 return VC_ERROR_OPERATION_FAILED;
1902 ret = vc_dbus_request_auth_cancel(g_vc->handle, mgr_pid);
1904 if (VC_ERROR_TIMED_OUT != ret) {
1905 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
1908 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
1911 if (VC_RETRY_COUNT == count) {
1912 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1917 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
1921 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1922 SLOG(LOG_DEBUG, TAG_VCC, " ");