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"
31 static Ecore_Timer* g_connect_timer = NULL;
33 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;
40 Eina_Bool __vc_notify_state_changed(void *data);
41 Eina_Bool __vc_notify_error(void *data);
44 static const char* __vc_get_error_code(vc_error_e err)
47 case VC_ERROR_NONE: return "VC_ERROR_NONE"; break;
48 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY"; break;
49 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR"; break;
50 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER"; break;
51 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT"; break;
52 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY"; break;
53 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE"; break;
54 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE"; break;
55 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND"; break;
56 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED"; break;
57 default: return "Invalid error code"; break;
62 static int __vc_convert_config_error_code(vc_config_error_e code)
64 if (code == VC_CONFIG_ERROR_NONE) return VC_ERROR_NONE;
65 if (code == VC_CONFIG_ERROR_OUT_OF_MEMORY) return VC_ERROR_OUT_OF_MEMORY;
66 if (code == VC_CONFIG_ERROR_IO_ERROR) return VC_ERROR_IO_ERROR;
67 if (code == VC_CONFIG_ERROR_INVALID_PARAMETER) return VC_ERROR_INVALID_PARAMETER;
68 if (code == VC_CONFIG_ERROR_INVALID_STATE) return VC_ERROR_INVALID_STATE;
69 if (code == VC_CONFIG_ERROR_INVALID_LANGUAGE) return VC_ERROR_INVALID_LANGUAGE;
70 if (code == VC_CONFIG_ERROR_ENGINE_NOT_FOUND) return VC_ERROR_ENGINE_NOT_FOUND;
71 if (code == VC_CONFIG_ERROR_OPERATION_FAILED) return VC_ERROR_OPERATION_FAILED;
76 static void __vc_lang_changed_cb(const char* before_lang, const char* current_lang)
78 SECURE_SLOG(LOG_DEBUG, TAG_VCC, "Lang changed : Before lang(%s) Current lang(%s)",
79 before_lang, current_lang);
81 vc_current_language_changed_cb callback;
83 vc_client_get_current_lang_changed_cb(g_vc, &callback, &lang_user_data);
85 if (NULL != callback) {
86 vc_client_use_callback(g_vc);
87 callback(before_lang, current_lang, lang_user_data);
88 vc_client_not_use_callback(g_vc);
89 SLOG(LOG_DEBUG, TAG_VCC, "Language changed callback is called");
91 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Language changed callback is null");
97 static void __vc_service_state_changed_cb(int before_state, int current_state)
99 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
100 before_state, current_state);
102 /* Save service state */
103 vc_client_set_service_state(g_vc, (vc_service_state_e)current_state);
105 vc_service_state_changed_cb service_callback = NULL;
106 void* service_user_data;
107 vc_client_get_service_state_changed_cb(g_vc, &service_callback, &service_user_data);
109 if (NULL != service_callback) {
110 vc_client_use_callback(g_vc);
111 service_callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
112 vc_client_not_use_callback(g_vc);
113 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
115 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is NULL");
123 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Initialize");
126 if (true == vc_client_is_valid(g_vc)) {
127 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already initialized");
128 return VC_ERROR_INVALID_STATE;
131 if (0 < vc_client_get_count()) {
132 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized");
133 return VC_ERROR_INVALID_STATE;
136 if (0 != vc_dbus_open_connection()) {
137 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to open connection");
138 return VC_ERROR_OPERATION_FAILED;
141 if (0 != vc_client_create(&g_vc)) {
142 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create client!!!!!");
143 return VC_ERROR_OUT_OF_MEMORY;
146 int ret = vc_config_mgr_initialize(g_vc->handle);
148 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to init config manager : %s",
149 __vc_get_error_code(__vc_convert_config_error_code(ret)));
150 vc_client_destroy(g_vc);
151 return __vc_convert_config_error_code(ret);
154 ret = vc_config_mgr_set_lang_cb(g_vc->handle, __vc_lang_changed_cb);
156 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set config changed : %d", ret);
157 vc_config_mgr_finalize(g_vc->handle);
158 vc_client_destroy(g_vc);
159 return __vc_convert_config_error_code(ret);
162 ret = vc_config_mgr_set_service_state_cb(g_vc->handle, __vc_service_state_changed_cb);
164 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set service change callback : %d", ret);
165 vc_config_mgr_unset_lang_cb(g_vc->handle);
166 vc_config_mgr_finalize(g_vc->handle);
167 vc_client_destroy(g_vc);
168 return __vc_convert_config_error_code(ret);
171 int service_state = -1;
172 if (0 != vc_config_mgr_get_service_state(&service_state)) {
173 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state");
174 vc_config_mgr_finalize(g_vc->handle);
175 vc_client_destroy(g_vc);
176 return __vc_convert_config_error_code(ret);
179 vc_client_set_service_state(g_vc, service_state);
181 SLOG(LOG_DEBUG, TAG_VCC, "[Success] pid(%d)", g_vc->handle);
183 SLOG(LOG_DEBUG, TAG_VCC, "=====");
184 SLOG(LOG_DEBUG, TAG_VCC, " ");
186 return VC_ERROR_NONE;
189 static void __vc_internal_unprepare()
191 /* return authority */
192 vc_auth_state_e state = VC_AUTH_STATE_NONE;
193 if (0 != vc_client_get_auth_state(g_vc, &state)) {
194 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
197 if (VC_AUTH_STATE_NONE != state) {
198 if (0 != vc_auth_disable()) {
199 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to auth disable");
203 int ret = vc_dbus_request_finalize(g_vc->handle);
205 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret));
210 ecore_event_handler_del(g_focus_in_hander);
211 ecore_event_handler_del(g_focus_out_hander);
214 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
215 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_BACKGROUND);
220 int vc_deinitialize()
222 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Deinitialize");
224 if (false == vc_client_is_valid(g_vc)) {
225 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NOT initialized");
226 SLOG(LOG_DEBUG, TAG_VCC, "=====");
227 SLOG(LOG_DEBUG, TAG_VCC, " ");
228 return VC_ERROR_INVALID_STATE;
232 vc_client_get_client_state(g_vc, &state);
237 __vc_internal_unprepare();
238 /* no break. need to next step*/
239 case VC_STATE_INITIALIZED:
240 if (NULL != g_connect_timer) {
241 SLOG(LOG_DEBUG, TAG_VCC, "Connect Timer is deleted");
242 ecore_timer_del(g_connect_timer);
245 vc_config_mgr_unset_service_state_cb(g_vc->handle);
246 vc_config_mgr_unset_lang_cb(g_vc->handle);
247 vc_config_mgr_finalize(g_vc->handle);
249 /* Free client resources */
250 vc_client_destroy(g_vc);
259 SLOG(LOG_DEBUG, TAG_VCC, "Success: destroy");
261 if (0 != vc_dbus_close_connection()) {
262 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection");
265 SLOG(LOG_DEBUG, TAG_VCC, "=====");
266 SLOG(LOG_DEBUG, TAG_VCC, " ");
268 return VC_ERROR_NONE;
271 static Eina_Bool __notify_auth_changed_cb(void *data)
273 vc_auth_state_changed_cb callback = NULL;
276 vc_client_get_auth_state_changed_cb(g_vc, &callback, &user_data);
278 vc_auth_state_e before = -1;
279 vc_auth_state_e current = -1;
281 vc_client_get_before_auth_state(g_vc, &before, ¤t);
283 if (NULL != callback) {
284 vc_client_use_callback(g_vc);
285 callback(before, current, user_data);
286 vc_client_not_use_callback(g_vc);
287 SLOG(LOG_DEBUG, TAG_VCC, "Auth state changed callback is called");
289 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Auth state changed callback is null");
298 static Eina_Bool __vc_x_event_window_focus_in(void *data, int type, void *event)
300 Ecore_X_Event_Window_Focus_In *e;
305 if (0 != vc_client_get_xid(g_vc, &xid)) {
306 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current xid");
307 return ECORE_CALLBACK_PASS_ON;
310 if (e->win == (Ecore_X_Window)xid) {
311 SLOG(LOG_DEBUG, TAG_VCC, "Focus in : pid(%d) xid(%d)", getpid(), xid);
312 int ret = vc_config_mgr_set_foreground(getpid(), true);
314 ret = vc_config_convert_error_code((vc_config_error_e)ret);
315 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set focus in : %s", __vc_get_error_code(ret));
317 /* set authority valid */
318 vc_auth_state_e state = VC_AUTH_STATE_NONE;
319 if (0 != vc_client_get_auth_state(g_vc, &state)) {
320 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
322 if (VC_AUTH_STATE_INVALID == state) {
323 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
325 /* notify auth changed cb */
326 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
330 return ECORE_CALLBACK_PASS_ON;
333 static Eina_Bool __vc_x_event_window_focus_out(void *data, int type, void *event)
335 Ecore_X_Event_Window_Focus_In *e;
340 if (0 != vc_client_get_xid(g_vc, &xid)) {
341 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current xid");
342 return ECORE_CALLBACK_PASS_ON;
345 if (e->win == (Ecore_X_Window)xid) {
346 SLOG(LOG_DEBUG, TAG_VCC, "Focus out : pid(%d) xid(%d)", getpid(), xid);
347 int ret = vc_config_mgr_set_foreground(getpid(), false);
349 ret = vc_config_convert_error_code((vc_config_error_e)ret);
350 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set focus out : %s", __vc_get_error_code(ret));
352 /* set authority valid */
353 vc_auth_state_e state = VC_AUTH_STATE_NONE;
354 if (0 != vc_client_get_auth_state(g_vc, &state)) {
355 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
357 if (VC_AUTH_STATE_VALID == state) {
358 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_INVALID);
360 /* notify authority changed cb */
361 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
365 return ECORE_CALLBACK_PASS_ON;
369 static Eina_Bool __vc_connect_daemon(void *data)
372 if (0 != vc_dbus_request_hello()) {
376 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Connect daemon");
378 /* request initialization */
381 ret = vc_dbus_request_initialize(g_vc->handle, &mgr_pid);
382 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
383 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
385 vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND);
386 ecore_timer_add(0, __vc_notify_error, g_vc);
388 SLOG(LOG_DEBUG, TAG_VCC, "=====");
389 SLOG(LOG_DEBUG, TAG_VCC, " ");
392 } else if (0 != ret) {
393 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret));
395 vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT);
396 ecore_timer_add(0, __vc_notify_error, g_vc);
398 SLOG(LOG_DEBUG, TAG_VCC, "=====");
399 SLOG(LOG_DEBUG, TAG_VCC, " ");
402 /* Success to connect */
405 g_connect_timer = NULL;
408 g_focus_in_hander = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, __vc_x_event_window_focus_in, NULL);
409 g_focus_out_hander = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, __vc_x_event_window_focus_out, NULL);
412 vc_client_set_client_state(g_vc, VC_STATE_READY);
413 ecore_timer_add(0, __vc_notify_state_changed, g_vc);
415 vc_client_set_mgr_pid(g_vc, mgr_pid);
417 SLOG(LOG_DEBUG, TAG_VCC, "=====");
418 SLOG(LOG_DEBUG, TAG_VCC, " ");
425 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Prepare");
428 if (0 != vc_client_get_client_state(g_vc, &state)) {
429 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
430 SLOG(LOG_DEBUG, TAG_VCC, "=====");
431 SLOG(LOG_DEBUG, TAG_VCC, " ");
432 return VC_ERROR_INVALID_STATE;
436 if (state != VC_STATE_INITIALIZED) {
437 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'");
438 SLOG(LOG_DEBUG, TAG_VCC, "=====");
439 SLOG(LOG_DEBUG, TAG_VCC, " ");
440 return VC_ERROR_INVALID_STATE;
444 g_connect_timer = ecore_timer_add(0, __vc_connect_daemon, NULL);
446 SLOG(LOG_DEBUG, TAG_VCC, "=====");
447 SLOG(LOG_DEBUG, TAG_VCC, " ");
449 return VC_ERROR_NONE;
454 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Unprepare");
457 if (0 != vc_client_get_client_state(g_vc, &state)) {
458 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
459 SLOG(LOG_DEBUG, TAG_VCC, "=====");
460 SLOG(LOG_DEBUG, TAG_VCC, " ");
461 return VC_ERROR_INVALID_STATE;
465 if (state != VC_STATE_READY) {
466 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
467 SLOG(LOG_DEBUG, TAG_VCC, "=====");
468 SLOG(LOG_DEBUG, TAG_VCC, " ");
469 return VC_ERROR_INVALID_STATE;
472 __vc_internal_unprepare();
474 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
475 ecore_timer_add(0, __vc_notify_state_changed, g_vc);
477 SLOG(LOG_DEBUG, TAG_VCC, "=====");
478 SLOG(LOG_DEBUG, TAG_VCC, " ");
480 return VC_ERROR_NONE;
483 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
485 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Foreach Supported Language");
487 if (NULL == callback) {
488 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
489 SLOG(LOG_DEBUG, TAG_VCC, "=====");
490 SLOG(LOG_DEBUG, TAG_VCC, " ");
491 return VC_ERROR_INVALID_PARAMETER;
495 if (0 != vc_client_get_client_state(g_vc, &state)) {
496 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
497 SLOG(LOG_DEBUG, TAG_VCC, "=====");
498 SLOG(LOG_DEBUG, TAG_VCC, " ");
499 return VC_ERROR_INVALID_STATE;
503 ret = vc_config_mgr_get_language_list(callback, user_data);
505 ret = vc_config_convert_error_code((vc_config_error_e)ret);
506 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret));
509 SLOG(LOG_DEBUG, TAG_VCC, "=====");
510 SLOG(LOG_DEBUG, TAG_VCC, " ");
512 return VC_ERROR_NONE;
516 int vc_get_current_language(char** language)
518 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get Current Language");
520 if (NULL == language) {
521 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
522 SLOG(LOG_DEBUG, TAG_VCC, "=====");
523 SLOG(LOG_DEBUG, TAG_VCC, " ");
524 return VC_ERROR_INVALID_PARAMETER;
528 if (0 != vc_client_get_client_state(g_vc, &state)) {
529 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
530 SLOG(LOG_DEBUG, TAG_VCC, "=====");
531 SLOG(LOG_DEBUG, TAG_VCC, " ");
532 return VC_ERROR_INVALID_STATE;
536 ret = vc_config_mgr_get_default_language(language);
538 ret = vc_config_convert_error_code((vc_config_error_e)ret);
539 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret));
542 SLOG(LOG_DEBUG, TAG_VCC, "=====");
543 SLOG(LOG_DEBUG, TAG_VCC, " ");
548 int vc_get_state(vc_state_e* state)
550 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get State");
553 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
554 return VC_ERROR_INVALID_PARAMETER;
558 if (0 != vc_client_get_client_state(g_vc, &temp)) {
559 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
560 SLOG(LOG_DEBUG, TAG_VCC, "=====");
561 SLOG(LOG_DEBUG, TAG_VCC, " ");
562 return VC_ERROR_INVALID_STATE;
568 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
569 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
570 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
571 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state"); break;
574 SLOG(LOG_DEBUG, TAG_VCC, "=====");
575 SLOG(LOG_DEBUG, TAG_VCC, " ");
577 return VC_ERROR_NONE;
580 int vc_get_service_state(vc_service_state_e* state)
582 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get Service State");
585 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
586 return VC_ERROR_INVALID_PARAMETER;
590 if (0 != vc_client_get_client_state(g_vc, &temp)) {
591 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
592 SLOG(LOG_DEBUG, TAG_VCC, "=====");
593 SLOG(LOG_DEBUG, TAG_VCC, " ");
594 return VC_ERROR_INVALID_STATE;
597 /* get service state */
598 vc_service_state_e service_state;
599 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
600 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state");
601 return VC_ERROR_OPERATION_FAILED;
604 *state = service_state;
607 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break;
608 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
609 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
610 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
611 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state"); break;
614 SLOG(LOG_DEBUG, TAG_VCC, "=====");
615 SLOG(LOG_DEBUG, TAG_VCC, " ");
617 return VC_ERROR_NONE;
621 int vc_set_window_id(int wid)
623 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Set Window id");
626 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is invalid");
627 SLOG(LOG_DEBUG, TAG_VCC, "=====");
628 SLOG(LOG_DEBUG, TAG_VCC, " ");
629 return VC_ERROR_INVALID_PARAMETER;
633 if (0 != vc_client_get_client_state(g_vc, &state)) {
634 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
635 SLOG(LOG_DEBUG, TAG_VCC, "=====");
636 SLOG(LOG_DEBUG, TAG_VCC, " ");
637 return VC_ERROR_INVALID_STATE;
641 if (state != VC_STATE_READY) {
642 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
643 SLOG(LOG_DEBUG, TAG_VCC, "=====");
644 SLOG(LOG_DEBUG, TAG_VCC, " ");
645 return VC_ERROR_INVALID_STATE;
648 if (0 != vc_client_set_xid(g_vc, wid)) {
649 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
650 SLOG(LOG_DEBUG, TAG_VCC, "=====");
651 SLOG(LOG_DEBUG, TAG_VCC, " ");
652 return VC_ERROR_INVALID_STATE;
655 /* Check if current xid is top window */
657 if ((Ecore_X_Window)wid == ecore_x_window_focus_get()) {
658 /* Set current pid */
659 ret = vc_config_mgr_set_foreground(getpid(), true);
661 ret = vc_config_convert_error_code((vc_config_error_e)ret);
662 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set focus in : %s", __vc_get_error_code(ret));
666 SLOG(LOG_DEBUG, TAG_VCC, "=====");
667 SLOG(LOG_DEBUG, TAG_VCC, " ");
672 int vc_get_window_id(int* wid)
674 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get Window id");
677 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
678 SLOG(LOG_DEBUG, TAG_VCC, "=====");
679 SLOG(LOG_DEBUG, TAG_VCC, " ");
680 return VC_ERROR_INVALID_PARAMETER;
684 if (0 != vc_client_get_client_state(g_vc, &state)) {
685 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
686 SLOG(LOG_DEBUG, TAG_VCC, "=====");
687 SLOG(LOG_DEBUG, TAG_VCC, " ");
688 return VC_ERROR_INVALID_STATE;
692 if (state != VC_STATE_READY) {
693 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
694 SLOG(LOG_DEBUG, TAG_VCC, "=====");
695 SLOG(LOG_DEBUG, TAG_VCC, " ");
696 return VC_ERROR_INVALID_STATE;
699 if (0 != vc_client_get_xid(g_vc, wid)) {
700 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
701 SLOG(LOG_DEBUG, TAG_VCC, "=====");
702 SLOG(LOG_DEBUG, TAG_VCC, " ");
703 return VC_ERROR_INVALID_STATE;
706 SLOG(LOG_DEBUG, TAG_VCC, "=====");
707 SLOG(LOG_DEBUG, TAG_VCC, " ");
709 return VC_ERROR_NONE;
714 * @brief Checks whether the command format is supported.
717 * @param[in] format The command format
718 * @param[out] support The result status @c true = supported, @c false = not supported
720 * @return 0 on success, otherwise a negative error value
721 * @retval #VC_ERROR_NONE Successful
722 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
723 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
724 * @retval #VC_ERROR_INVALID_STATE Invalid state
726 * @pre The state should be #VC_STATE_READY.
729 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
731 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Is command format supported");
734 if (0 != vc_client_get_client_state(g_vc, &state)) {
735 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
736 SLOG(LOG_DEBUG, TAG_VCC, "=====");
737 SLOG(LOG_DEBUG, TAG_VCC, " ");
738 return VC_ERROR_INVALID_STATE;
742 bool non_fixed_support = false;
743 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
744 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
748 case VC_CMD_FORMAT_FIXED: *support = true; break;
749 case VC_CMD_FORMAT_FIXED_AND_EXTRA: *support = non_fixed_support; break;
750 case VC_CMD_FORMAT_EXTRA_AND_FIXED: *support = non_fixed_support; break;
751 default: *support = false; break;
754 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
756 SLOG(LOG_DEBUG, TAG_VCC, "=====");
757 SLOG(LOG_DEBUG, TAG_VCC, " ");
759 return VC_ERROR_NONE;
763 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
765 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Set Command list");
767 if (NULL == vc_cmd_list) {
768 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
769 return VC_ERROR_INVALID_PARAMETER;
773 if (0 != vc_client_get_client_state(g_vc, &state)) {
774 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
775 SLOG(LOG_DEBUG, TAG_VCC, "=====");
776 SLOG(LOG_DEBUG, TAG_VCC, " ");
777 return VC_ERROR_INVALID_STATE;
781 if (state != VC_STATE_READY) {
782 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
783 SLOG(LOG_DEBUG, TAG_VCC, "=====");
784 SLOG(LOG_DEBUG, TAG_VCC, " ");
785 return VC_ERROR_INVALID_STATE;
789 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
790 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
791 SLOG(LOG_DEBUG, TAG_VCC, "=====");
792 SLOG(LOG_DEBUG, TAG_VCC, " ");
793 return VC_ERROR_INVALID_PARAMETER;
796 vc_cmd_list_s* list = NULL;
797 list = (vc_cmd_list_s*)vc_cmd_list;
800 if (0 != vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list)) {
801 ret = VC_ERROR_INVALID_PARAMETER;
802 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
806 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
808 if (VC_ERROR_TIMED_OUT != ret) {
809 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
812 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
815 if (VC_RETRY_COUNT == count) {
816 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
824 SLOG(LOG_DEBUG, TAG_VCC, "=====");
825 SLOG(LOG_DEBUG, TAG_VCC, " ");
830 int vc_unset_command_list(int type)
832 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Unset Command list");
835 if (0 != vc_client_get_client_state(g_vc, &state)) {
836 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
837 SLOG(LOG_DEBUG, TAG_VCC, "=====");
838 SLOG(LOG_DEBUG, TAG_VCC, " ");
839 return VC_ERROR_INVALID_STATE;
843 if (state != VC_STATE_READY) {
844 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
845 SLOG(LOG_DEBUG, TAG_VCC, "=====");
846 SLOG(LOG_DEBUG, TAG_VCC, " ");
847 return VC_ERROR_INVALID_STATE;
853 ret = vc_dbus_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
855 if (VC_ERROR_TIMED_OUT != ret) {
856 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
859 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
862 if (VC_RETRY_COUNT == count) {
863 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
870 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
872 ret = vc_config_convert_error_code((vc_config_error_e)ret);
873 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret));
876 SLOG(LOG_DEBUG, TAG_VCC, "=====");
877 SLOG(LOG_DEBUG, TAG_VCC, " ");
883 int vc_get_exclusive_command_option(bool* value)
885 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Get exclusive command");
888 if (0 != vc_client_get_client_state(g_vc, &state)) {
889 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
890 SLOG(LOG_DEBUG, TAG_VCC, "=====");
891 SLOG(LOG_DEBUG, TAG_VCC, " ");
892 return VC_ERROR_INVALID_STATE;
896 if (state != VC_STATE_READY) {
897 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
898 SLOG(LOG_DEBUG, TAG_VCC, "=====");
899 SLOG(LOG_DEBUG, TAG_VCC, " ");
900 return VC_ERROR_INVALID_STATE;
903 int ret = vc_client_get_exclusive_cmd(g_vc, value);
905 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
906 SLOG(LOG_DEBUG, TAG_VCC, "=====");
907 SLOG(LOG_DEBUG, TAG_VCC, " ");
911 SLOG(LOG_DEBUG, TAG_VCC, "=====");
912 SLOG(LOG_DEBUG, TAG_VCC, " ");
917 int vc_set_exclusive_command_option(bool value)
919 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Set exclusive command");
922 if (0 != vc_client_get_client_state(g_vc, &state)) {
923 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
924 SLOG(LOG_DEBUG, TAG_VCC, "=====");
925 SLOG(LOG_DEBUG, TAG_VCC, " ");
926 return VC_ERROR_INVALID_STATE;
930 if (state != VC_STATE_READY) {
931 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
932 SLOG(LOG_DEBUG, TAG_VCC, "=====");
933 SLOG(LOG_DEBUG, TAG_VCC, " ");
934 return VC_ERROR_INVALID_STATE;
937 int ret = vc_client_set_exclusive_cmd(g_vc, value);
939 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
940 SLOG(LOG_DEBUG, TAG_VCC, "=====");
941 SLOG(LOG_DEBUG, TAG_VCC, " ");
945 /* Check if current xid is top window */
948 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
950 if (VC_ERROR_TIMED_OUT != ret) {
951 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
954 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
957 if (VC_RETRY_COUNT == count) {
958 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
965 SLOG(LOG_DEBUG, TAG_VCC, "=====");
966 SLOG(LOG_DEBUG, TAG_VCC, " ");
973 int vc_request_start(bool stop_by_silence)
975 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request start");
978 if (0 != vc_client_get_client_state(g_vc, &state)) {
979 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
980 SLOG(LOG_DEBUG, TAG_VCC, "=====");
981 SLOG(LOG_DEBUG, TAG_VCC, " ");
982 return VC_ERROR_INVALID_STATE;
986 if (state != VC_STATE_READY) {
987 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
988 SLOG(LOG_DEBUG, TAG_VCC, "=====");
989 SLOG(LOG_DEBUG, TAG_VCC, " ");
990 return VC_ERROR_INVALID_STATE;
993 /* Check service state */
994 vc_service_state_e service_state = -1;
995 vc_client_get_service_state(g_vc, &service_state);
996 if (service_state != VC_SERVICE_STATE_READY) {
997 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
998 SLOG(LOG_DEBUG, TAG_VCC, "=====");
999 SLOG(LOG_DEBUG, TAG_VCC, " ");
1000 return VC_ERROR_INVALID_STATE;
1010 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1012 if (VC_ERROR_TIMED_OUT != ret) {
1013 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1016 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1019 if (VC_RETRY_COUNT == count) {
1020 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1025 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1029 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1030 SLOG(LOG_DEBUG, TAG_VCC, " ");
1035 int vc_request_stop()
1037 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request stop");
1040 if (0 != vc_client_get_client_state(g_vc, &state)) {
1041 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1042 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1043 SLOG(LOG_DEBUG, TAG_VCC, " ");
1044 return VC_ERROR_INVALID_STATE;
1048 if (state != VC_STATE_READY) {
1049 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1050 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1051 SLOG(LOG_DEBUG, TAG_VCC, " ");
1052 return VC_ERROR_INVALID_STATE;
1055 /* Check service state */
1056 vc_service_state_e service_state = -1;
1057 vc_client_get_service_state(g_vc, &service_state);
1058 if (service_state != VC_SERVICE_STATE_RECORDING) {
1059 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1060 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1061 SLOG(LOG_DEBUG, TAG_VCC, " ");
1062 return VC_ERROR_INVALID_STATE;
1069 ret = vc_dbus_request_stop(g_vc->handle);
1071 if (VC_ERROR_TIMED_OUT != ret) {
1072 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1075 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1078 if (VC_RETRY_COUNT == count) {
1079 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1084 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1088 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1089 SLOG(LOG_DEBUG, TAG_VCC, " ");
1094 int vc_request_cancel()
1096 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request cancel Interrupt");
1099 if (0 != vc_client_get_client_state(g_vc, &state)) {
1100 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1101 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1102 SLOG(LOG_DEBUG, TAG_VCC, " ");
1103 return VC_ERROR_INVALID_STATE;
1107 if (state != VC_STATE_READY) {
1108 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1109 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1110 SLOG(LOG_DEBUG, TAG_VCC, " ");
1111 return VC_ERROR_INVALID_STATE;
1114 /* Check service state */
1115 vc_service_state_e service_state = -1;
1116 vc_client_get_service_state(g_vc, &service_state);
1117 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1118 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1119 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1120 SLOG(LOG_DEBUG, TAG_VCC, " ");
1121 return VC_ERROR_INVALID_STATE;
1127 ret = vc_dbus_request_cancel(g_vc->handle);
1129 if (VC_ERROR_TIMED_OUT != ret) {
1130 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1133 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel request : %s", __vc_get_error_code(ret));
1136 if (VC_RETRY_COUNT == count) {
1137 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1142 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Cancel interrupt");
1146 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1147 SLOG(LOG_DEBUG, TAG_VCC, " ");
1153 Eina_Bool __vc_notify_error(void *data)
1155 vc_h vc = (vc_h)data;
1157 vc_error_cb callback = NULL;
1161 vc_client_get_error_cb(vc, &callback, &user_data);
1162 vc_client_get_error(vc, &reason);
1164 if (NULL != callback) {
1165 vc_client_use_callback(vc);
1166 callback(reason, user_data);
1167 vc_client_not_use_callback(vc);
1168 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1170 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1176 int __vc_cb_error(int pid, int reason)
1178 if (0 != vc_client_get_handle(pid, &g_vc)) {
1179 SLOG(LOG_ERROR, TAG_VCC, "Handle is not valid");
1183 vc_client_set_error(g_vc, reason);
1184 ecore_timer_add(0, __vc_notify_error, g_vc);
1189 Eina_Bool __vc_notify_state_changed(void *data)
1191 vc_h vc = (vc_h)data;
1193 vc_state_changed_cb changed_callback = NULL;
1196 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1198 vc_state_e current_state;
1199 vc_state_e before_state;
1201 vc_client_get_before_state(vc, ¤t_state, &before_state);
1203 if (NULL != changed_callback) {
1204 vc_client_use_callback(vc);
1205 changed_callback(before_state, current_state, user_data);
1206 vc_client_not_use_callback(vc);
1207 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1209 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1215 static Eina_Bool __vc_notify_result(void *data)
1219 vc_cmd_list_h vc_cmd_list = NULL;
1221 vc_result_cb callback = NULL;
1222 void* user_data = NULL;
1224 vc_client_get_result_cb(g_vc, &callback, &user_data);
1226 if (NULL == callback) {
1227 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1231 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1232 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1236 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1238 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1240 vc_cmd_print_list(vc_cmd_list);
1242 vc_client_use_callback(g_vc);
1243 callback(event, vc_cmd_list, temp_text, user_data);
1244 vc_client_not_use_callback(g_vc);
1246 SLOG(LOG_DEBUG, TAG_VCC, "Client result callback called");
1248 vc_cmd_list_destroy(vc_cmd_list, true);
1250 /* Release result */
1251 if (NULL != temp_text) free(temp_text);
1256 void __vc_cb_result()
1258 ecore_timer_add(0, __vc_notify_result, NULL);
1263 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1265 if (NULL == callback)
1266 return VC_ERROR_INVALID_PARAMETER;
1269 if (0 != vc_client_get_client_state(g_vc, &state)) {
1270 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1271 return VC_ERROR_INVALID_STATE;
1275 if (state != VC_STATE_INITIALIZED) {
1276 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1277 return VC_ERROR_INVALID_STATE;
1280 vc_client_set_result_cb(g_vc, callback, user_data);
1285 int vc_unset_result_cb()
1288 if (0 != vc_client_get_client_state(g_vc, &state)) {
1289 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1290 return VC_ERROR_INVALID_STATE;
1294 if (state != VC_STATE_INITIALIZED) {
1295 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1296 return VC_ERROR_INVALID_STATE;
1299 vc_client_set_result_cb(g_vc, NULL, NULL);
1304 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1306 if (NULL == callback)
1307 return VC_ERROR_INVALID_PARAMETER;
1310 if (0 != vc_client_get_client_state(g_vc, &state)) {
1311 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1312 return VC_ERROR_INVALID_STATE;
1316 if (state != VC_STATE_INITIALIZED) {
1317 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1318 return VC_ERROR_INVALID_STATE;
1321 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
1326 int vc_unset_service_state_changed_cb()
1329 if (0 != vc_client_get_client_state(g_vc, &state)) {
1330 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1331 return VC_ERROR_INVALID_STATE;
1335 if (state != VC_STATE_INITIALIZED) {
1336 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1337 return VC_ERROR_INVALID_STATE;
1340 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
1345 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1347 if (callback == NULL)
1348 return VC_ERROR_INVALID_PARAMETER;
1351 if (0 != vc_client_get_client_state(g_vc, &state)) {
1352 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
1353 return VC_ERROR_INVALID_STATE;
1357 if (state != VC_STATE_INITIALIZED) {
1358 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
1359 return VC_ERROR_INVALID_STATE;
1362 vc_client_set_state_changed_cb(g_vc, callback, user_data);
1367 int vc_unset_state_changed_cb()
1370 if (0 != vc_client_get_client_state(g_vc, &state)) {
1371 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
1372 return VC_ERROR_INVALID_STATE;
1376 if (state != VC_STATE_INITIALIZED) {
1377 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
1378 return VC_ERROR_INVALID_STATE;
1381 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
1386 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
1388 if (NULL == callback)
1389 return VC_ERROR_INVALID_PARAMETER;
1392 if (0 != vc_client_get_client_state(g_vc, &state)) {
1393 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
1394 return VC_ERROR_INVALID_STATE;
1398 if (state != VC_STATE_INITIALIZED) {
1399 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : Current state is not 'Initialized'");
1400 return VC_ERROR_INVALID_STATE;
1403 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
1408 int vc_unset_current_language_changed_cb()
1411 if (0 != vc_client_get_client_state(g_vc, &state)) {
1412 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
1413 return VC_ERROR_INVALID_STATE;
1417 if (state != VC_STATE_INITIALIZED) {
1418 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
1419 return VC_ERROR_INVALID_STATE;
1422 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
1427 int vc_set_error_cb(vc_error_cb callback, void* user_data)
1429 if (NULL == callback)
1430 return VC_ERROR_INVALID_PARAMETER;
1433 if (0 != vc_client_get_client_state(g_vc, &state)) {
1434 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
1435 return VC_ERROR_INVALID_STATE;
1439 if (state != VC_STATE_INITIALIZED) {
1440 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : Current state is not 'Initialized'");
1441 return VC_ERROR_INVALID_STATE;
1444 vc_client_set_error_cb(g_vc, callback, user_data);
1449 int vc_unset_error_cb()
1452 if (0 != vc_client_get_client_state(g_vc, &state)) {
1453 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
1454 return VC_ERROR_INVALID_STATE;
1458 if (state != VC_STATE_INITIALIZED) {
1459 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : Current state is not 'Initialized'");
1460 return VC_ERROR_INVALID_STATE;
1463 vc_client_set_error_cb(g_vc, NULL, NULL);
1469 int vc_auth_enable()
1473 if (0 != vc_client_get_client_state(g_vc, &state)) {
1474 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1475 return VC_ERROR_INVALID_STATE;
1478 if (VC_STATE_READY != state) {
1479 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
1480 return VC_ERROR_INVALID_STATE;
1483 /* check already authority */
1484 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1485 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1486 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
1487 return VC_ERROR_INVALID_STATE;
1490 if (VC_AUTH_STATE_NONE != auth_state) {
1491 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already authority enabled");
1492 return VC_ERROR_INVALID_STATE;
1495 /* request authority */
1497 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1498 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1499 return VC_ERROR_OPERATION_FAILED;
1502 if (0 != vc_dbus_request_auth_enable(g_vc->handle, mgr_pid)) {
1503 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
1504 return VC_ERROR_OPERATION_FAILED;
1507 /* set authority into handle */
1509 if (0 != vc_config_mgr_get_foreground(&fg_pid)) {
1510 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get foreground");
1511 return VC_ERROR_OPERATION_FAILED;
1514 if (g_vc->handle == fg_pid) {
1515 auth_state = VC_AUTH_STATE_VALID;
1517 auth_state = VC_AUTH_STATE_INVALID;
1520 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
1521 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
1522 return VC_ERROR_OPERATION_FAILED;
1525 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
1527 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
1529 return VC_ERROR_NONE;
1532 int vc_auth_disable()
1536 if (0 != vc_client_get_client_state(g_vc, &state)) {
1537 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1538 return VC_ERROR_INVALID_STATE;
1541 if (VC_STATE_READY != state) {
1542 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
1543 return VC_ERROR_INVALID_STATE;
1546 /* check autority */
1547 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1548 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1549 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
1550 return VC_ERROR_INVALID_STATE;
1553 if (VC_AUTH_STATE_NONE == auth_state) {
1554 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] No authority");
1555 return VC_ERROR_INVALID_STATE;
1558 if (0 != vc_auth_unset_state_changed_cb()) {
1559 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
1562 /* request return authority by dbus */
1564 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1565 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1566 return VC_ERROR_OPERATION_FAILED;
1569 if (0 != vc_dbus_request_auth_disable(g_vc->handle, mgr_pid)) {
1570 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disble");
1571 return VC_ERROR_OPERATION_FAILED;
1574 /* unset authority from handle */
1575 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
1576 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
1577 return VC_ERROR_OPERATION_FAILED;
1580 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
1582 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
1584 return VC_ERROR_NONE;
1587 int vc_auth_get_state(vc_auth_state_e* state)
1590 vc_state_e vc_state;
1591 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
1592 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1593 return VC_ERROR_INVALID_STATE;
1596 if (VC_STATE_READY != vc_state) {
1597 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
1598 return VC_ERROR_INVALID_STATE;
1602 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
1603 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
1604 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
1605 return VC_ERROR_INVALID_STATE;
1610 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
1612 return VC_ERROR_NONE;
1615 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
1617 /* check parameter */
1618 if (NULL == callback) {
1619 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
1620 return VC_ERROR_INVALID_PARAMETER;
1624 vc_auth_state_e auth_state;
1625 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1626 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1627 return VC_ERROR_INVALID_STATE;
1630 if (VC_AUTH_STATE_NONE == auth_state) {
1631 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auth is not enabled");
1632 return VC_ERROR_INVALID_STATE;
1635 /* set cb into handle */
1636 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
1637 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
1638 return VC_ERROR_OPERATION_FAILED;
1641 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
1643 return VC_ERROR_NONE;
1646 int vc_auth_unset_state_changed_cb()
1649 vc_auth_state_e auth_state;
1650 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1651 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
1652 return VC_ERROR_INVALID_STATE;
1655 if (VC_AUTH_STATE_NONE == auth_state) {
1656 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auto is not enabled");
1657 return VC_ERROR_INVALID_STATE;
1660 /* unset cb from handle */
1661 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
1662 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
1663 return VC_ERROR_OPERATION_FAILED;
1666 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
1668 return VC_ERROR_NONE;
1673 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request start");
1676 if (0 != vc_client_get_client_state(g_vc, &state)) {
1677 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1678 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1679 SLOG(LOG_DEBUG, TAG_VCC, " ");
1680 return VC_ERROR_INVALID_STATE;
1684 if (state != VC_STATE_READY) {
1685 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1686 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1687 SLOG(LOG_DEBUG, TAG_VCC, " ");
1688 return VC_ERROR_INVALID_STATE;
1691 /* Check service state */
1692 vc_service_state_e service_state = -1;
1693 vc_client_get_service_state(g_vc, &service_state);
1694 if (service_state != VC_SERVICE_STATE_READY) {
1695 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1696 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1697 SLOG(LOG_DEBUG, TAG_VCC, " ");
1698 return VC_ERROR_INVALID_STATE;
1701 /* Check authority */
1702 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1703 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1704 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
1705 return VC_ERROR_OPERATION_FAILED;
1708 if (VC_AUTH_STATE_VALID != auth_state) {
1709 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
1710 return VC_ERROR_OPERATION_FAILED;
1715 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1716 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1717 return VC_ERROR_OPERATION_FAILED;
1726 ret = vc_dbus_request_auth_start(g_vc->handle, mgr_pid);
1728 if (VC_ERROR_TIMED_OUT != ret) {
1729 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
1732 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
1735 if (VC_RETRY_COUNT == count) {
1736 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1741 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
1745 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1746 SLOG(LOG_DEBUG, TAG_VCC, " ");
1753 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request stop");
1756 if (0 != vc_client_get_client_state(g_vc, &state)) {
1757 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1758 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1759 SLOG(LOG_DEBUG, TAG_VCC, " ");
1760 return VC_ERROR_INVALID_STATE;
1764 if (state != VC_STATE_READY) {
1765 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1766 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1767 SLOG(LOG_DEBUG, TAG_VCC, " ");
1768 return VC_ERROR_INVALID_STATE;
1771 /* Check service state */
1772 vc_service_state_e service_state = -1;
1773 vc_client_get_service_state(g_vc, &service_state);
1774 if (service_state != VC_SERVICE_STATE_RECORDING) {
1775 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1776 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1777 SLOG(LOG_DEBUG, TAG_VCC, " ");
1778 return VC_ERROR_INVALID_STATE;
1781 /* Check authority */
1782 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1783 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1784 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
1785 return VC_ERROR_OPERATION_FAILED;
1788 if (VC_AUTH_STATE_VALID != auth_state) {
1789 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
1790 return VC_ERROR_OPERATION_FAILED;
1795 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1796 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1797 return VC_ERROR_OPERATION_FAILED;
1804 ret = vc_dbus_request_auth_stop(g_vc->handle, mgr_pid);
1806 if (VC_ERROR_TIMED_OUT != ret) {
1807 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
1810 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
1813 if (VC_RETRY_COUNT == count) {
1814 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1819 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
1823 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1824 SLOG(LOG_DEBUG, TAG_VCC, " ");
1829 int vc_auth_cancel()
1831 SLOG(LOG_DEBUG, TAG_VCC, "===== [Client] Request cancel");
1834 if (0 != vc_client_get_client_state(g_vc, &state)) {
1835 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1836 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1837 SLOG(LOG_DEBUG, TAG_VCC, " ");
1838 return VC_ERROR_INVALID_STATE;
1842 if (state != VC_STATE_READY) {
1843 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1844 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1845 SLOG(LOG_DEBUG, TAG_VCC, " ");
1846 return VC_ERROR_INVALID_STATE;
1849 /* Check service state */
1850 vc_service_state_e service_state = -1;
1851 vc_client_get_service_state(g_vc, &service_state);
1852 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1853 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1854 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1855 SLOG(LOG_DEBUG, TAG_VCC, " ");
1856 return VC_ERROR_INVALID_STATE;
1859 /* Check authority */
1860 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
1861 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
1862 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
1863 return VC_ERROR_OPERATION_FAILED;
1866 if (VC_AUTH_STATE_VALID != auth_state) {
1867 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
1868 return VC_ERROR_OPERATION_FAILED;
1873 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
1874 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
1875 return VC_ERROR_OPERATION_FAILED;
1881 ret = vc_dbus_request_auth_cancel(g_vc->handle, mgr_pid);
1883 if (VC_ERROR_TIMED_OUT != ret) {
1884 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
1887 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
1890 if (VC_RETRY_COUNT == count) {
1891 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1896 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
1900 SLOG(LOG_DEBUG, TAG_VCC, "=====");
1901 SLOG(LOG_DEBUG, TAG_VCC, " ");