2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <app_manager.h>
19 #include <cynara-client.h>
20 #include <cynara-error.h>
21 #include <cynara-session.h>
22 #include <Ecore_Wl2.h>
26 #include <system_info.h>
28 #include "vc_client.h"
29 #include "vc_cmd_db.h"
30 #include "vc_command.h"
31 #include "vc_config_mgr.h"
34 #include "vc_info_parser.h"
35 #include "vc_json_parser.h"
37 #include "voice_control.h"
38 #include "voice_control_internal.h"
39 #include "voice_control_authority.h"
40 #include "voice_control_command.h"
41 #include "voice_control_command_expand.h"
45 static Ecore_Timer* g_connect_timer = NULL;
47 static Ecore_Event_Handler* g_focus_in_handler = NULL;
48 static Ecore_Event_Handler* g_focus_out_handler = NULL;
50 static Ecore_Thread* g_tts_thread = NULL;
52 static vc_h g_vc = NULL;
54 static int g_daemon_pid = 0;
56 static int g_feature_enabled = -1;
57 static bool g_backup = false;
59 static int g_privilege_allowed = -1;
60 static cynara *p_cynara = NULL;
62 static void __vc_notify_state_changed(void *data);
63 static void __vc_notify_error(void *data);
65 static int __vc_get_feature_enabled()
67 if (0 == g_feature_enabled) {
69 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
70 return VC_ERROR_NOT_SUPPORTED;
72 } else if (-1 == g_feature_enabled) {
73 bool vc_supported = false;
74 bool mic_supported = false;
75 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
76 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
77 if (false == vc_supported || false == mic_supported) {
78 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Voice control feature NOT supported");
79 g_feature_enabled = 0;
80 return VC_ERROR_NOT_SUPPORTED;
83 g_feature_enabled = 1;
85 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value"); //LCOV_EXCL_LINE
86 return VC_ERROR_NOT_SUPPORTED;
89 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get feature value"); //LCOV_EXCL_LINE
90 return VC_ERROR_NOT_SUPPORTED;
97 static int __check_privilege_initialize()
99 int ret = cynara_initialize(&p_cynara, NULL);
100 if (CYNARA_API_SUCCESS != ret)
101 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to initialize"); //LCOV_EXCL_LINE
103 return ret == CYNARA_API_SUCCESS;
106 static int __check_privilege(const char* uid, const char * privilege)
109 char label_path[1024] = "/proc/self/attr/current";
110 char smack_label[1024] = {'\0',};
116 fp = fopen(label_path, "r");
118 if (0 >= fread(smack_label, 1, sizeof(smack_label), fp))
119 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to fread"); //LCOV_EXCL_LINE
124 pid_t pid = getpid();
125 char *session = cynara_session_from_pid(pid);
126 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
127 SLOG(LOG_DEBUG, TAG_VCC, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
131 if (ret != CYNARA_API_ACCESS_ALLOWED)
136 static void __check_privilege_deinitialize()
139 cynara_finish(p_cynara);
143 static int __vc_check_privilege()
147 if (0 == g_privilege_allowed) {
149 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied");
150 return VC_ERROR_PERMISSION_DENIED;
152 } else if (-1 == g_privilege_allowed) {
153 if (false == __check_privilege_initialize()) {
154 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] privilege initialize is failed"); //LCOV_EXCL_LINE
155 return VC_ERROR_PERMISSION_DENIED;
157 snprintf(uid, 16, "%d", getuid());
158 if (false == __check_privilege(uid, VC_PRIVILEGE)) {
159 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Permission is denied");
160 g_privilege_allowed = 0;
161 __check_privilege_deinitialize();
162 return VC_ERROR_PERMISSION_DENIED;
164 __check_privilege_deinitialize();
167 g_privilege_allowed = 1;
168 return VC_ERROR_NONE;
172 static const char* __vc_get_error_code(vc_error_e err)
175 case VC_ERROR_NONE: return "VC_ERROR_NONE";
176 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
177 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
178 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
179 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
180 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
181 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
182 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
183 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
184 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
185 default: return "Invalid error code";
190 static int __vc_convert_config_error_code(vc_config_error_e code)
192 if (code == VC_CONFIG_ERROR_NONE) return VC_ERROR_NONE;
193 if (code == VC_CONFIG_ERROR_OUT_OF_MEMORY) return VC_ERROR_OUT_OF_MEMORY;
194 if (code == VC_CONFIG_ERROR_IO_ERROR) return VC_ERROR_IO_ERROR;
195 if (code == VC_CONFIG_ERROR_INVALID_PARAMETER) return VC_ERROR_INVALID_PARAMETER;
196 if (code == VC_CONFIG_ERROR_INVALID_STATE) return VC_ERROR_INVALID_STATE;
197 if (code == VC_CONFIG_ERROR_INVALID_LANGUAGE) return VC_ERROR_INVALID_LANGUAGE;
198 if (code == VC_CONFIG_ERROR_ENGINE_NOT_FOUND) return VC_ERROR_ENGINE_NOT_FOUND;
199 if (code == VC_CONFIG_ERROR_OPERATION_FAILED) return VC_ERROR_OPERATION_FAILED;
201 return VC_ERROR_NONE;
204 static void __vc_lang_changed_cb(const char* before_lang, const char* current_lang)
206 SLOG(LOG_DEBUG, TAG_VCC, "Lang changed : Before lang(%s) Current lang(%s)",
207 before_lang, current_lang);
209 vc_current_language_changed_cb callback;
210 void* lang_user_data;
211 vc_client_get_current_lang_changed_cb(g_vc, &callback, &lang_user_data);
213 if (NULL != callback) {
214 vc_client_use_callback(g_vc);
215 callback(before_lang, current_lang, lang_user_data);
216 vc_client_not_use_callback(g_vc);
217 SLOG(LOG_DEBUG, TAG_VCC, "Language changed callback is called");
219 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Language changed callback is null");
225 static Eina_Bool __notify_auth_changed_cb(void *data)
227 vc_auth_state_changed_cb callback = NULL;
230 vc_client_get_auth_state_changed_cb(g_vc, &callback, &user_data);
232 vc_auth_state_e before = -1;
233 vc_auth_state_e current = -1;
235 vc_client_get_before_auth_state(g_vc, &before, ¤t);
237 if (NULL != callback) {
238 vc_client_use_callback(g_vc);
239 callback(before, current, user_data);
240 vc_client_not_use_callback(g_vc);
241 SLOG(LOG_DEBUG, TAG_VCC, "Auth state changed callback is called");
243 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Auth state changed callback is null");
249 static Eina_Bool __focus_changed_cb(void *data, int type, void *event)
251 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Focus changed");
254 if (ECORE_WL2_EVENT_FOCUS_IN == type) {
255 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground");
256 ret = vc_dbus_set_foreground(getpid(), true);
258 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret);
261 ret = vc_client_set_is_foreground(g_vc, true);
263 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret);
266 /* set authority valid */
267 vc_auth_state_e state = VC_AUTH_STATE_NONE;
268 if (0 != vc_client_get_auth_state(g_vc, &state)) {
269 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
271 if (VC_AUTH_STATE_INVALID == state) {
272 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
274 /* notify auth changed cb */
275 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
277 } else if (ECORE_WL2_EVENT_FOCUS_OUT == type) {
278 SLOG(LOG_DEBUG, TAG_VCW, "@@@ Set background");
279 ret = vc_dbus_set_foreground(getpid(), false);
281 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (false) : %d", ret);
284 ret = vc_client_set_is_foreground(g_vc, false);
286 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (false) : %d", ret);
289 /* set authority valid */
290 vc_auth_state_e state = VC_AUTH_STATE_NONE;
291 if (0 != vc_client_get_auth_state(g_vc, &state)) {
292 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
294 if (VC_AUTH_STATE_VALID == state) {
295 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_INVALID);
297 /* notify authority changed cb */
298 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
301 SLOG(LOG_DEBUG, TAG_VCC, "@@@ type(%d) is NOT valid", type);
304 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
306 return ECORE_CALLBACK_RENEW;
310 int vc_initialize(void)
312 if (!ecore_main_loop_glib_integrate()) {
313 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail ecore_main_loop_glib_integrate()");
316 if (0 != __vc_get_feature_enabled()) {
317 return VC_ERROR_NOT_SUPPORTED;
319 if (0 != __vc_check_privilege()) {
320 return VC_ERROR_PERMISSION_DENIED;
323 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Initialize");
326 if (true == vc_client_is_valid(g_vc)) {
327 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized"); //LCOV_EXCL_LINE
328 return VC_ERROR_NONE; //LCOV_EXCL_LINE
331 if (0 < vc_client_get_count()) {
332 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] Already initialized"); //LCOV_EXCL_LINE
333 return VC_ERROR_NONE; //LCOV_EXCL_LINE
336 if (0 != vc_dbus_open_connection()) {
337 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to open connection"); //LCOV_EXCL_LINE
338 return VC_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
341 if (0 != vc_client_create(&g_vc)) {
342 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create client!!!!!"); //LCOV_EXCL_LINE
343 return VC_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
346 int ret = vc_config_mgr_initialize(g_vc->handle);
348 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to init config manager : %s",
349 __vc_get_error_code(__vc_convert_config_error_code(ret))); //LCOV_EXCL_LINE
350 vc_client_destroy(g_vc); //LCOV_EXCL_LINE
351 return __vc_convert_config_error_code(ret); //LCOV_EXCL_LINE
354 ret = vc_config_mgr_set_lang_cb(g_vc->handle, __vc_lang_changed_cb);
356 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set config changed : %d", ret); //LCOV_EXCL_LINE
357 vc_config_mgr_finalize(g_vc->handle); //LCOV_EXCL_LINE
358 vc_client_destroy(g_vc); //LCOV_EXCL_LINE
359 return __vc_convert_config_error_code(ret);
362 SLOG(LOG_DEBUG, TAG_VCC, "[Success] pid(%d)", g_vc->handle);
364 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
366 return VC_ERROR_NONE;
369 static void __vc_internal_unprepare(void)
371 /* return authority */
372 vc_auth_state_e state = VC_AUTH_STATE_NONE;
373 if (0 != vc_client_get_auth_state(g_vc, &state)) {
374 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
377 if (VC_AUTH_STATE_NONE != state) {
378 if (0 != vc_auth_disable()) {
379 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to auth disable"); //LCOV_EXCL_LINE
383 int ret = vc_dbus_request_finalize(g_vc->handle);
385 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
388 if (NULL != g_focus_in_handler) {
389 ecore_event_handler_del(g_focus_in_handler);
390 g_focus_in_handler = NULL;
392 if (NULL != g_focus_out_handler) {
393 ecore_event_handler_del(g_focus_out_handler);
394 g_focus_out_handler = NULL;
397 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
399 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
404 int vc_deinitialize(void)
406 int ret = VC_ERROR_NONE;
408 if (0 != __vc_get_feature_enabled()) {
409 return VC_ERROR_NOT_SUPPORTED;
411 if (0 != __vc_check_privilege()) {
412 return VC_ERROR_PERMISSION_DENIED;
415 SLOG(LOG_INFO, TAG_VCC, "@@@ [Client] Deinitialize");
417 if (false == vc_client_is_valid(g_vc)) {
418 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NOT initialized");
419 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
420 return VC_ERROR_INVALID_STATE;
424 vc_client_get_client_state(g_vc, &state);
429 __vc_internal_unprepare();
430 /* no break. need to next step*/
431 case VC_STATE_INITIALIZED:
432 if (NULL != g_connect_timer) {
433 SLOG(LOG_DEBUG, TAG_VCC, "Connect Timer is deleted"); //LCOV_EXCL_LINE
434 ecore_timer_del(g_connect_timer);
435 g_connect_timer = NULL;
438 vc_config_mgr_unset_lang_cb(g_vc->handle);
439 vc_config_mgr_finalize(g_vc->handle);
441 /* Free client resources */
442 vc_client_destroy(g_vc);
449 SLOG(LOG_INFO, TAG_VCC, "Success: destroy");
451 if (true == g_backup) {
452 ret = vc_db_backup_command();
454 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to backup command, ret(%d)", ret); //LCOV_EXCL_LINE
458 ret = vc_db_finalize();
460 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB, ret(%d)", ret); //LCOV_EXCL_LINE
463 if (0 != vc_dbus_close_connection()) {
464 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to close connection"); //LCOV_EXCL_LINE
467 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
469 return VC_ERROR_NONE;
472 static Eina_Bool __vc_connect_daemon(void *data)
474 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Connect daemon");
476 /* request initialization */
479 int service_state = 0;
481 g_connect_timer = NULL;
484 if (true == vc_client_is_valid(g_vc)) {
485 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] g_vc is valid");
488 ret = vc_db_initialize();
490 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize DB : %d", ret); //LCOV_EXCL_LINE
494 ret = vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_FOREGROUND);
496 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", VC_COMMAND_TYPE_FOREGROUND, ret); //LCOV_EXCL_LINE
498 ret = vc_dbus_request_initialize(g_vc->handle, &mgr_pid, &service_state, &g_daemon_pid);
500 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
501 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize : %s", __vc_get_error_code(ret));
503 vc_client_set_error(g_vc, VC_ERROR_ENGINE_NOT_FOUND);
504 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
508 } else if (0 != ret) {
509 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to initialize :%s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
511 vc_client_set_error(g_vc, VC_ERROR_TIMED_OUT);
512 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
514 ret = vc_db_finalize();
516 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to finalize DB : %d", ret); //LCOV_EXCL_LINE
521 /* Success to connect */
524 /* Set service state */
525 vc_service_state_e previous_service_state;
526 vc_client_get_service_state(g_vc, &previous_service_state);
528 vc_client_set_service_state(g_vc, (vc_service_state_e)service_state);
530 vc_service_state_changed_cb service_changed_callback = NULL;
531 void* user_data = NULL;
532 vc_client_get_service_state_changed_cb(g_vc, &service_changed_callback, &user_data);
534 if (NULL != service_changed_callback) {
535 vc_client_use_callback(g_vc);
536 service_changed_callback(previous_service_state, service_state, user_data);
537 vc_client_not_use_callback(g_vc);
538 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called"); //LCOV_EXCL_LINE
540 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null"); //LCOV_EXCL_LINE
543 /* Register focus handler */
544 ecore_thread_main_loop_begin();
545 g_focus_in_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_IN, __focus_changed_cb, NULL);
546 g_focus_out_handler = ecore_event_handler_add(ECORE_WL2_EVENT_FOCUS_OUT, __focus_changed_cb, NULL);
547 ecore_thread_main_loop_end();
549 char appid[1024] = {'\0',};
550 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid) - 1);
552 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get aul_app_get_appid_bypid : %d", ret);
554 int status = aul_app_get_status(appid);
555 if (STATUS_FOCUS == status) {
556 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set foreground"); //LCOV_EXCL_LINE
557 ret = vc_dbus_set_foreground(getpid(), true);
559 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set foreground (true) : %d", ret); //LCOV_EXCL_LINE
562 ret = vc_client_set_is_foreground(g_vc, true);
564 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save is_foreground (true) : %d", ret); //LCOV_EXCL_LINE
567 /* set authority valid */
568 vc_auth_state_e state = VC_AUTH_STATE_NONE;
569 if (0 != vc_client_get_auth_state(g_vc, &state)) {
570 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state"); //LCOV_EXCL_LINE
572 if (VC_AUTH_STATE_INVALID == state) {
573 vc_client_set_auth_state(g_vc, VC_AUTH_STATE_VALID);
575 /* notify auth changed cb */
576 ecore_idler_add(__notify_auth_changed_cb, NULL);
580 vc_client_set_client_state(g_vc, VC_STATE_READY);
581 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
583 vc_client_set_mgr_pid(g_vc, mgr_pid);
585 SLOG(LOG_ERROR, TAG_VCC, "[Not ERROR] g_vc is not valid. It is destroyed."); //LCOV_EXCL_LINE
589 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
594 static void __start_prepare_thread(void *data, Ecore_Thread *thread)
596 SLOG(LOG_ERROR, TAG_VCC, "@@@ Start prepare thread");
597 int ret = -1, retry_count = 0;
601 if (retry_count == 10) {
602 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request hello !!"); //LCOV_EXCL_LINE
606 ret = vc_dbus_request_hello();
608 SLOG(LOG_DEBUG, TAG_VCC, "Success to request hello. retry count(%d)", retry_count);
618 if (retry_count == 10) {
619 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon !!"); //LCOV_EXCL_LINE
622 ret = __vc_connect_daemon(NULL);
632 static void __end_prepare_thread(void *data, Ecore_Thread *thread)
634 SLOG(LOG_DEBUG, TAG_VCC, "@@@ End prepare thread");
639 if (0 != __vc_get_feature_enabled()) {
640 return VC_ERROR_NOT_SUPPORTED;
642 if (0 != __vc_check_privilege()) {
643 return VC_ERROR_PERMISSION_DENIED;
646 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
649 if (0 != vc_client_get_client_state(g_vc, &state)) {
650 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available"); //LCOV_EXCL_LINE
651 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
652 return VC_ERROR_INVALID_STATE;
656 if (state != VC_STATE_INITIALIZED) {
657 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'CREATED'"); //LCOV_EXCL_LINE
658 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
659 return VC_ERROR_INVALID_STATE;
662 ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, NULL);
664 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
666 return VC_ERROR_NONE;
670 int vc_prepare_sync(void)
672 if (0 != __vc_get_feature_enabled()) {
673 return VC_ERROR_NOT_SUPPORTED;
675 if (0 != __vc_check_privilege()) {
676 return VC_ERROR_PERMISSION_DENIED;
679 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Prepare");
682 if (0 != vc_client_get_client_state(g_vc, &state)) {
683 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
684 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
685 return VC_ERROR_INVALID_STATE;
689 if (state != VC_STATE_INITIALIZED) {
690 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'INITIALIZED'");
691 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
692 return VC_ERROR_INVALID_STATE;
696 while (EINA_TRUE == __vc_connect_daemon(NULL) && VC_CONNECTION_RETRY_COUNT > cnt) {
700 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
702 if (VC_CONNECTION_RETRY_COUNT == cnt) {
703 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to connect daemon");
704 return VC_ERROR_OPERATION_FAILED;
707 return VC_ERROR_NONE;
711 int vc_unprepare(void)
713 if (0 != __vc_get_feature_enabled()) {
714 return VC_ERROR_NOT_SUPPORTED;
716 if (0 != __vc_check_privilege()) {
717 return VC_ERROR_PERMISSION_DENIED;
720 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unprepare");
723 if (0 != vc_client_get_client_state(g_vc, &state)) {
724 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
725 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
726 return VC_ERROR_INVALID_STATE;
730 if (state != VC_STATE_READY) {
731 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
732 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
733 return VC_ERROR_INVALID_STATE;
736 __vc_internal_unprepare();
738 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
739 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
741 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
743 return VC_ERROR_NONE;
746 int vc_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
748 if (0 != __vc_get_feature_enabled()) {
749 return VC_ERROR_NOT_SUPPORTED;
751 if (0 != __vc_check_privilege()) {
752 return VC_ERROR_PERMISSION_DENIED;
755 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Foreach Supported Language");
757 if (NULL == callback) {
758 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
759 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
760 return VC_ERROR_INVALID_PARAMETER;
764 if (0 != vc_client_get_client_state(g_vc, &state)) {
765 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
766 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
767 return VC_ERROR_INVALID_STATE;
771 ret = vc_config_mgr_get_language_list(callback, user_data);
773 ret = vc_config_convert_error_code((vc_config_error_e)ret);
774 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
777 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
779 return VC_ERROR_NONE;
783 int vc_get_current_language(char** language)
785 if (0 != __vc_get_feature_enabled()) {
786 return VC_ERROR_NOT_SUPPORTED;
788 if (0 != __vc_check_privilege()) {
789 return VC_ERROR_PERMISSION_DENIED;
792 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Current Language");
794 if (NULL == language) {
795 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
796 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
797 return VC_ERROR_INVALID_PARAMETER;
801 if (0 != vc_client_get_client_state(g_vc, &state)) {
802 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
803 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
804 return VC_ERROR_INVALID_STATE;
808 ret = vc_config_mgr_get_default_language(language);
810 ret = vc_config_convert_error_code((vc_config_error_e)ret);
811 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current languages : %s", __vc_get_error_code(ret)); //LCOV_EXCL_LINE
814 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
819 int vc_get_state(vc_state_e* state)
821 if (0 != __vc_get_feature_enabled()) {
822 return VC_ERROR_NOT_SUPPORTED;
824 if (0 != __vc_check_privilege()) {
825 return VC_ERROR_PERMISSION_DENIED;
828 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get State");
831 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
832 return VC_ERROR_INVALID_PARAMETER;
836 if (0 != vc_client_get_client_state(g_vc, &temp)) {
837 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not valid");
838 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
839 return VC_ERROR_INVALID_STATE;
846 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'None'"); break;
847 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Created'"); break;
848 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current state is 'Ready'"); break;
849 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
853 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
855 return VC_ERROR_NONE;
858 int vc_get_service_state(vc_service_state_e* state)
860 if (0 != __vc_get_feature_enabled()) {
861 return VC_ERROR_NOT_SUPPORTED;
863 if (0 != __vc_check_privilege()) {
864 return VC_ERROR_PERMISSION_DENIED;
867 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get Service State");
870 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
871 return VC_ERROR_INVALID_PARAMETER;
875 if (0 != vc_client_get_client_state(g_vc, &temp)) {
876 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
877 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
878 return VC_ERROR_INVALID_STATE;
881 if (VC_STATE_READY != temp) {
882 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
883 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
884 return VC_ERROR_INVALID_STATE;
887 /* get service state */
888 vc_service_state_e service_state;
889 if (0 != vc_client_get_service_state(g_vc, &service_state)) {
890 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get service state"); //LCOV_EXCL_LINE
891 return VC_ERROR_OPERATION_FAILED;
894 *state = service_state;
898 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'None'"); break;
899 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Ready'"); break;
900 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Recording'"); break;
901 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCC, "Current service state is 'Processing'"); break;
902 default: SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid state");
906 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
908 return VC_ERROR_NONE;
911 int vc_get_system_command_list(vc_cmd_list_h* vc_sys_cmd_list)
913 if (0 != __vc_get_feature_enabled()) {
914 return VC_ERROR_NOT_SUPPORTED;
916 if (0 != __vc_check_privilege()) {
917 return VC_ERROR_PERMISSION_DENIED;
920 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get system command list");
922 if (NULL == vc_sys_cmd_list) {
923 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
924 return VC_ERROR_INVALID_PARAMETER;
928 if (0 != vc_client_get_client_state(g_vc, &state)) {
929 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
930 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
931 return VC_ERROR_INVALID_STATE;
935 if (state != VC_STATE_READY) {
936 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
937 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
938 return VC_ERROR_INVALID_STATE;
941 /* Check service state */
942 vc_service_state_e service_state = -1;
943 vc_client_get_service_state(g_vc, &service_state);
944 if (service_state != VC_SERVICE_STATE_READY) {
945 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'"); //LCOV_EXCL_LINE
946 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
947 return VC_ERROR_INVALID_STATE;
950 bool is_sys_cmd_valid = false;
953 bool is_prepared = false;
955 ret = vc_dbus_request_is_system_command_valid(g_vc->handle, &is_sys_cmd_valid);
958 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
959 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
960 if (0 == vc_prepare_sync()) {
962 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
964 } else if (VC_ERROR_TIMED_OUT != ret) {
965 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to ask system command is : %s", __vc_get_error_code(ret));
968 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to ask system command is : %s", __vc_get_error_code(ret));
971 if (VC_RETRY_COUNT == count) {
972 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
981 ret = vc_client_get_mgr_pid(g_vc, &mgr_pid);
983 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get the manager pid"); //LCOV_EXCL_LINE
984 return VC_ERROR_OPERATION_FAILED;
987 vc_cmd_list_s* list = NULL;
988 list = (vc_cmd_list_s*)(*vc_sys_cmd_list);
989 if (true == is_sys_cmd_valid) {
990 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, &(list->list));
992 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
995 ret = vc_cmd_parser_get_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &(list->list));
997 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get parsing commands"); //LCOV_EXCL_LINE
1000 *vc_sys_cmd_list = (vc_cmd_list_h)list;
1002 SLOG(LOG_WARN, TAG_VCC, "[WARNING] No system commands"); //LCOV_EXCL_LINE
1003 *vc_sys_cmd_list = NULL;
1004 return VC_ERROR_NONE;
1007 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1014 * @brief Checks whether the command format is supported.
1015 * @since_tizen @if MOBILE 2.4 @elseif WEARABLE 3.0 @endif
1017 * @param[in] format The command format
1018 * @param[out] support The result status @c true = supported, @c false = not supported
1020 * @return 0 on success, otherwise a negative error value
1021 * @retval #VC_ERROR_NONE Successful
1022 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1023 * @retval #VC_ERROR_OPERATION_FAILED Operation failure
1024 * @retval #VC_ERROR_INVALID_STATE Invalid state
1026 * @pre The state should be #VC_STATE_READY.
1028 int vc_is_command_format_supported(vc_cmd_format_e format, bool* support)
1030 if (0 != __vc_get_feature_enabled()) {
1031 return VC_ERROR_NOT_SUPPORTED;
1033 if (0 != __vc_check_privilege()) {
1034 return VC_ERROR_PERMISSION_DENIED;
1037 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Is command format supported");
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 return VC_ERROR_INVALID_STATE;
1047 bool non_fixed_support = false;
1048 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
1049 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get nonfixed support info");
1053 case VC_CMD_FORMAT_FIXED: *support = true; break;
1054 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
1055 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
1056 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
1057 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
1058 default: *support = false; break;
1061 SLOG(LOG_ERROR, TAG_VCC, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
1063 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1065 return VC_ERROR_NONE;
1069 static int __vc_get_invocation_name(char** invocation_name)
1071 int ret = vc_client_get_invocation_name(g_vc, invocation_name);
1073 SLOG(LOG_WARN, TAG_VCC, "Fail to get invocation name"); //LCOV_EXCL_LINE
1074 return ret; //LCOV_EXCL_LINE
1077 if (NULL == *invocation_name) {
1078 char* temp_label = NULL;
1082 ret = app_manager_get_app_id(getpid(), &appid);
1083 if (0 != ret || NULL == appid) {
1084 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get appid, ret(%d)", ret); //LCOV_EXCL_LINE
1085 if (NULL != appid) {
1089 return VC_ERROR_OPERATION_FAILED;
1092 ret = vc_get_current_language(&lang);
1093 if (0 != ret || NULL == lang) {
1094 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get current language, ret(%d)", ret); //LCOV_EXCL_LINE
1101 return VC_ERROR_OPERATION_FAILED;
1104 ret = app_info_get_localed_label(appid, lang, &temp_label);
1105 if (0 != ret || NULL == temp_label) {
1106 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get localed label, ret(%d) appid(%s) lang(%s)", ret, appid, lang); //LCOV_EXCL_LINE
1111 if (NULL != temp_label) {
1115 return VC_ERROR_OPERATION_FAILED;
1118 *invocation_name = strdup(temp_label);
1119 if (NULL == *invocation_name) {
1120 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE
1121 return VC_ERROR_OUT_OF_MEMORY;
1132 SLOG(LOG_DEBUG, TAG_VCC, "Get invocation name(%s)", *invocation_name);
1133 return VC_ERROR_NONE;
1136 int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type)
1138 if (0 != __vc_get_feature_enabled()) {
1139 return VC_ERROR_NOT_SUPPORTED;
1141 if (0 != __vc_check_privilege()) {
1142 return VC_ERROR_PERMISSION_DENIED;
1145 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list");
1147 if (NULL == vc_cmd_list) {
1148 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Input parameter is NULL");
1149 return VC_ERROR_INVALID_PARAMETER;
1153 if (0 != vc_client_get_client_state(g_vc, &state)) {
1154 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1155 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1156 return VC_ERROR_INVALID_STATE;
1160 if (state != VC_STATE_READY) {
1161 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
1162 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1163 return VC_ERROR_INVALID_STATE;
1167 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1168 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type); //LCOV_EXCL_LINE
1169 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1170 return VC_ERROR_INVALID_PARAMETER;
1173 vc_cmd_list_s* list = NULL;
1174 list = (vc_cmd_list_s*)vc_cmd_list;
1176 if (NULL == list->list) {
1177 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command list"); //LCOV_EXCL_LINE
1178 return VC_ERROR_INVALID_PARAMETER;
1182 char* invocation_name = NULL;
1183 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1184 ret = __vc_get_invocation_name(&invocation_name);
1185 if (0 != ret || NULL == invocation_name) {
1186 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret); //LCOV_EXCL_LINE
1191 ret = vc_cmd_parser_delete_file(getpid(), type);
1193 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1195 ret = vc_cmd_parser_save_file(getpid(), (vc_cmd_type_e)type, list->list, invocation_name);
1197 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to save command list : %s", __vc_get_error_code(ret));
1200 bool is_prepared = false;
1202 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1205 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1206 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1207 if (0 == vc_prepare_sync()) {
1209 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1211 } else if (VC_ERROR_TIMED_OUT != ret) {
1212 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1215 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1218 if (VC_RETRY_COUNT == count) {
1219 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1228 if (NULL != invocation_name) {
1229 free(invocation_name);
1230 invocation_name = NULL;
1233 if (VC_COMMAND_TYPE_BACKGROUND == type)
1236 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1241 int vc_unset_command_list(int type)
1243 if (0 != __vc_get_feature_enabled()) {
1244 return VC_ERROR_NOT_SUPPORTED;
1246 if (0 != __vc_check_privilege()) {
1247 return VC_ERROR_PERMISSION_DENIED;
1250 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Unset Command list");
1253 if (0 != vc_client_get_client_state(g_vc, &state)) {
1254 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1255 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1256 return VC_ERROR_INVALID_STATE;
1260 if (state != VC_STATE_READY) {
1261 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1262 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1263 return VC_ERROR_INVALID_STATE;
1268 bool is_prepared = false;
1270 ret = vc_dbus_request_unset_command(g_vc->handle, (vc_cmd_type_e)type);
1273 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1274 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1275 if (0 == vc_prepare_sync()) {
1277 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1279 } else if (VC_ERROR_TIMED_OUT != ret) {
1280 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset command to daemon : %s", __vc_get_error_code(ret));
1283 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset command : %s", __vc_get_error_code(ret));
1286 if (VC_RETRY_COUNT == count) {
1287 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1295 ret = vc_cmd_parser_delete_file(getpid(), (vc_cmd_type_e)type);
1297 ret = vc_config_convert_error_code((vc_config_error_e)ret);
1298 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] cmd_type(%d), Fail to delete command list : %s", type, __vc_get_error_code(ret)); //LCOV_EXCL_LINE
1301 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1307 int vc_set_command_list_from_file(const char* file_path, int type)
1309 if (0 != __vc_get_feature_enabled()) {
1310 return VC_ERROR_NOT_SUPPORTED;
1312 if (0 != __vc_check_privilege()) {
1313 return VC_ERROR_PERMISSION_DENIED;
1316 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set Command list from file");
1319 if (0 != vc_client_get_client_state(g_vc, &state)) {
1320 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1321 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1322 return VC_ERROR_INVALID_STATE;
1326 if (state != VC_STATE_READY) {
1327 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1328 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1329 return VC_ERROR_INVALID_STATE;
1333 if ((VC_COMMAND_TYPE_FOREGROUND != type) && (VC_COMMAND_TYPE_BACKGROUND != type)) {
1334 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
1335 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1336 return VC_ERROR_INVALID_PARAMETER;
1340 char* invocation_name = NULL;
1341 if (VC_COMMAND_TYPE_BACKGROUND == type) {
1342 ret = __vc_get_invocation_name(&invocation_name);
1343 if (0 != ret || NULL == invocation_name) {
1344 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get invocation name, ret(%d)", ret);
1349 ret = vc_cmd_parser_delete_file(getpid(), type);
1351 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to delete file, type(%d), ret(%d)", type, ret);
1353 ret = vc_json_set_commands_from_file(file_path, (vc_cmd_type_e)type, invocation_name);
1355 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set commands from file : %s", __vc_get_error_code(ret));
1358 bool is_prepared = false;
1360 ret = vc_dbus_request_set_command(g_vc->handle, (vc_cmd_type_e)type);
1363 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1364 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1365 if (0 == vc_prepare_sync()) {
1367 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
1369 } else if (VC_ERROR_TIMED_OUT != ret) {
1370 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set command to daemon : %s", __vc_get_error_code(ret));
1373 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set command : %s", __vc_get_error_code(ret));
1376 if (VC_RETRY_COUNT == count) {
1377 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1386 if (NULL != invocation_name) {
1387 free(invocation_name);
1388 invocation_name = NULL;
1391 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1397 int vc_get_exclusive_command_option(bool* value)
1399 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get exclusive command");
1402 if (0 != vc_client_get_client_state(g_vc, &state)) {
1403 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1404 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1405 return VC_ERROR_INVALID_STATE;
1409 if (state != VC_STATE_READY) {
1410 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1411 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1412 return VC_ERROR_INVALID_STATE;
1415 int ret = vc_client_get_exclusive_cmd(g_vc, value);
1417 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1418 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1422 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1427 int vc_set_exclusive_command_option(bool value)
1429 if (0 != __vc_get_feature_enabled()) {
1430 return VC_ERROR_NOT_SUPPORTED;
1432 if (0 != __vc_check_privilege()) {
1433 return VC_ERROR_PERMISSION_DENIED;
1436 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Set exclusive command");
1439 if (0 != vc_client_get_client_state(g_vc, &state)) {
1440 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1441 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1442 return VC_ERROR_INVALID_STATE;
1446 if (state != VC_STATE_READY) {
1447 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
1448 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1449 return VC_ERROR_INVALID_STATE;
1452 int ret = vc_client_set_exclusive_cmd(g_vc, value);
1454 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set exclusive option : %d", ret);
1455 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1461 ret = vc_dbus_request_set_exclusive_command(g_vc->handle, value);
1463 if (VC_ERROR_TIMED_OUT != ret) {
1464 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set exclusive command to daemon : %s", __vc_get_error_code(ret));
1467 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set exclusive command : %s", __vc_get_error_code(ret));
1470 if (VC_RETRY_COUNT == count) {
1471 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1478 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1485 int vc_request_start(bool stop_by_silence)
1487 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
1490 if (0 != vc_client_get_client_state(g_vc, &state)) {
1491 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1492 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1493 return VC_ERROR_INVALID_STATE;
1497 if (state != VC_STATE_READY) {
1498 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
1499 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1500 return VC_ERROR_INVALID_STATE;
1503 /* Check service state */
1504 vc_service_state_e service_state = -1;
1505 vc_client_get_service_state(g_vc, &service_state);
1506 if (service_state != VC_SERVICE_STATE_READY) {
1507 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
1508 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1509 return VC_ERROR_INVALID_STATE;
1519 ret = vc_dbus_request_start(g_vc->handle, stop_by_silence);
1521 if (VC_ERROR_TIMED_OUT != ret) {
1522 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to start request start : %s", __vc_get_error_code(ret));
1525 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry start request start : %s", __vc_get_error_code(ret));
1528 if (VC_RETRY_COUNT == count) {
1529 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1534 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] start interrupt");
1538 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1543 int vc_request_stop(void)
1545 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
1548 if (0 != vc_client_get_client_state(g_vc, &state)) {
1549 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1550 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1551 return VC_ERROR_INVALID_STATE;
1555 if (state != VC_STATE_READY) {
1556 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
1557 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1558 return VC_ERROR_INVALID_STATE;
1561 /* Check service state */
1562 vc_service_state_e service_state = -1;
1563 vc_client_get_service_state(g_vc, &service_state);
1564 if (service_state != VC_SERVICE_STATE_RECORDING) {
1565 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
1566 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1567 return VC_ERROR_INVALID_STATE;
1574 ret = vc_dbus_request_stop(g_vc->handle);
1576 if (VC_ERROR_TIMED_OUT != ret) {
1577 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to stop request : %s", __vc_get_error_code(ret));
1580 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry stop request : %s", __vc_get_error_code(ret));
1583 if (VC_RETRY_COUNT == count) {
1584 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1589 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Stop interrupt");
1593 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1598 int vc_request_cancel(void)
1600 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel Interrupt");
1603 if (0 != vc_client_get_client_state(g_vc, &state)) {
1604 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1605 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1606 return VC_ERROR_INVALID_STATE;
1610 if (state != VC_STATE_READY) {
1611 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
1612 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1613 return VC_ERROR_INVALID_STATE;
1616 /* Check service state */
1617 vc_service_state_e service_state = -1;
1618 vc_client_get_service_state(g_vc, &service_state);
1619 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1620 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1621 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1622 return VC_ERROR_INVALID_STATE;
1628 ret = vc_dbus_request_cancel(g_vc->handle);
1630 if (VC_ERROR_TIMED_OUT != ret) {
1631 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to cancel request : %s", __vc_get_error_code(ret));
1634 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel request : %s", __vc_get_error_code(ret));
1637 if (VC_RETRY_COUNT == count) {
1638 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
1643 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Cancel interrupt");
1647 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1654 static void __vc_notify_error(void *data)
1656 vc_h vc = (vc_h)data;
1658 vc_error_cb callback = NULL;
1662 vc_client_get_error_cb(vc, &callback, &user_data);
1663 vc_client_get_error(vc, &reason);
1665 if (NULL != callback) {
1666 vc_client_use_callback(vc);
1667 callback(reason, user_data);
1668 vc_client_not_use_callback(vc);
1669 SLOG(LOG_DEBUG, TAG_VCC, "Error callback is called");
1671 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Error callback is null");
1675 int __vc_cb_error(int reason, int daemon_pid, const char* msg)
1678 if (0 != vc_client_get_client_state(g_vc, &state)) {
1679 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid client");
1684 if (state != VC_STATE_READY) {
1685 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] State is not READY");
1686 if (VC_ERROR_SERVICE_RESET != reason) {
1687 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] not connected client yet");
1693 if (VC_ERROR_SERVICE_RESET == reason) {
1694 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] VC daemon reset");
1696 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
1697 ecore_main_loop_thread_safe_call_async(__vc_notify_state_changed, (void*)g_vc);
1699 if (0 != vc_prepare()) {
1700 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to prepare");
1704 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1706 vc_client_set_error(g_vc, reason);
1707 ecore_main_loop_thread_safe_call_async(__vc_notify_error, (void*)g_vc);
1712 static void __vc_notify_state_changed(void *data)
1714 vc_h vc = (vc_h)data;
1716 vc_state_changed_cb changed_callback = NULL;
1719 vc_client_get_state_changed_cb(vc, &changed_callback, &user_data);
1721 vc_state_e current_state;
1722 vc_state_e before_state;
1724 vc_client_get_before_state(vc, ¤t_state, &before_state);
1726 if (NULL != changed_callback) {
1727 vc_client_use_callback(vc);
1728 changed_callback(before_state, current_state, user_data);
1729 vc_client_not_use_callback(vc);
1730 SLOG(LOG_DEBUG, TAG_VCC, "State changed callback is called");
1732 SLOG(LOG_WARN, TAG_VCC, "[WARNING] State changed callback is null");
1736 static Eina_Bool __vc_notify_result(void *data)
1740 vc_cmd_list_h vc_cmd_list = NULL;
1742 vc_result_cb callback = NULL;
1743 void* user_data = NULL;
1745 vc_client_get_result_cb(g_vc, &callback, &user_data);
1747 if (NULL == callback) {
1748 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL");
1752 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1753 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list");
1757 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1759 SECURE_SLOG(LOG_INFO, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event);
1761 vc_cmd_print_list(vc_cmd_list);
1763 vc_client_use_callback(g_vc);
1764 callback(event, vc_cmd_list, temp_text, user_data);
1765 vc_client_not_use_callback(g_vc);
1767 SLOG(LOG_INFO, TAG_VCC, "Client result callback called");
1769 vc_cmd_list_destroy(vc_cmd_list, true);
1771 /* Release result */
1772 if (NULL != temp_text) free(temp_text);
1777 void __vc_cb_result(void)
1779 ecore_timer_add(0, __vc_notify_result, NULL);
1785 int vc_get_result(vc_result_cb callback, void* user_data)
1787 if (0 != __vc_get_feature_enabled()) {
1788 return VC_ERROR_NOT_SUPPORTED;
1790 if (0 != __vc_check_privilege()) {
1791 return VC_ERROR_PERMISSION_DENIED;
1794 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Get result");
1797 if (0 != vc_client_get_client_state(g_vc, &state)) {
1798 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
1799 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1800 return VC_ERROR_INVALID_STATE;
1804 if (state != VC_STATE_READY) {
1805 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
1806 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
1807 return VC_ERROR_INVALID_STATE;
1810 if (NULL == callback) {
1811 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Client result callback is NULL"); //LCOV_EXCL_LINE
1812 return VC_ERROR_INVALID_PARAMETER;
1815 char* temp_text = NULL;
1817 vc_cmd_list_h vc_cmd_list = NULL;
1819 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1820 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to create command list"); //LCOV_EXCL_LINE
1821 return VC_ERROR_INVALID_PARAMETER;
1824 int ret = vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1825 if (0 != ret || NULL == temp_text) {
1826 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get result, ret(%d) temp_text(%s)", ret, temp_text); //LCOV_EXCL_LINE
1830 SLOG(LOG_DEBUG, TAG_VCC, "Result info : result text(%s) event(%d)", temp_text, event); //LCOV_EXCL_LINE
1832 vc_cmd_print_list(vc_cmd_list);
1834 vc_client_use_callback(g_vc);
1835 callback(event, vc_cmd_list, temp_text, user_data);
1836 vc_client_not_use_callback(g_vc);
1838 vc_cmd_list_destroy(vc_cmd_list, true);
1840 /* Release result */
1841 if (NULL != temp_text) {
1846 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
1848 return VC_ERROR_NONE;
1851 int vc_set_result_cb(vc_result_cb callback, void* user_data)
1853 if (0 != __vc_get_feature_enabled()) {
1854 return VC_ERROR_NOT_SUPPORTED;
1856 if (0 != __vc_check_privilege()) {
1857 return VC_ERROR_PERMISSION_DENIED;
1860 if (NULL == callback)
1861 return VC_ERROR_INVALID_PARAMETER;
1864 if (0 != vc_client_get_client_state(g_vc, &state)) {
1865 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1866 return VC_ERROR_INVALID_STATE;
1870 if (state != VC_STATE_INITIALIZED) {
1871 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1872 return VC_ERROR_INVALID_STATE;
1875 vc_client_set_result_cb(g_vc, callback, user_data);
1880 int vc_unset_result_cb(void)
1882 if (0 != __vc_get_feature_enabled()) {
1883 return VC_ERROR_NOT_SUPPORTED;
1885 if (0 != __vc_check_privilege()) {
1886 return VC_ERROR_PERMISSION_DENIED;
1890 if (0 != vc_client_get_client_state(g_vc, &state)) {
1891 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1892 return VC_ERROR_INVALID_STATE;
1896 if (state != VC_STATE_INITIALIZED) {
1897 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1898 return VC_ERROR_INVALID_STATE;
1901 vc_client_set_result_cb(g_vc, NULL, NULL);
1907 int __vc_cb_service_state(int state)
1909 vc_service_state_e current_state = (vc_service_state_e)state;
1910 vc_service_state_e before_state;
1911 vc_client_get_service_state(g_vc, &before_state);
1913 if (current_state == before_state) {
1917 SLOG(LOG_DEBUG, TAG_VCC, "Service State changed : Before(%d) Current(%d)",
1918 before_state, current_state);
1920 /* Save service state */
1921 vc_client_set_service_state(g_vc, current_state);
1923 vc_service_state_changed_cb callback = NULL;
1924 void* service_user_data;
1925 vc_client_get_service_state_changed_cb(g_vc, &callback, &service_user_data);
1927 if (NULL != callback) {
1928 vc_client_use_callback(g_vc);
1929 callback((vc_service_state_e)before_state, (vc_service_state_e)current_state, service_user_data);
1930 vc_client_not_use_callback(g_vc);
1931 SLOG(LOG_DEBUG, TAG_VCC, "Service state changed callback is called");
1933 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Service state changed callback is null");
1940 int __vc_cb_manager_pid(int manager_pid)
1942 SLOG(LOG_DEBUG, TAG_VCC, "Manager pid is changed : %d", manager_pid); //LCOV_EXCL_LINE
1944 /* Save service state */
1945 vc_client_set_mgr_pid(g_vc, manager_pid);
1950 int vc_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1952 if (0 != __vc_get_feature_enabled()) {
1953 return VC_ERROR_NOT_SUPPORTED;
1955 if (0 != __vc_check_privilege()) {
1956 return VC_ERROR_PERMISSION_DENIED;
1959 if (NULL == callback)
1960 return VC_ERROR_INVALID_PARAMETER;
1963 if (0 != vc_client_get_client_state(g_vc, &state)) {
1964 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : A handle is not available");
1965 return VC_ERROR_INVALID_STATE;
1969 if (state != VC_STATE_INITIALIZED) {
1970 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set result callback : Current state is not 'Initialized'");
1971 return VC_ERROR_INVALID_STATE;
1974 vc_client_set_service_state_changed_cb(g_vc, callback, user_data);
1979 int vc_unset_service_state_changed_cb(void)
1981 if (0 != __vc_get_feature_enabled()) {
1982 return VC_ERROR_NOT_SUPPORTED;
1984 if (0 != __vc_check_privilege()) {
1985 return VC_ERROR_PERMISSION_DENIED;
1989 if (0 != vc_client_get_client_state(g_vc, &state)) {
1990 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : A handle is not available");
1991 return VC_ERROR_INVALID_STATE;
1995 if (state != VC_STATE_INITIALIZED) {
1996 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1997 return VC_ERROR_INVALID_STATE;
2000 vc_client_set_service_state_changed_cb(g_vc, NULL, NULL);
2005 int vc_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2007 if (0 != __vc_get_feature_enabled()) {
2008 return VC_ERROR_NOT_SUPPORTED;
2010 if (0 != __vc_check_privilege()) {
2011 return VC_ERROR_PERMISSION_DENIED;
2014 if (callback == NULL)
2015 return VC_ERROR_INVALID_PARAMETER;
2018 if (0 != vc_client_get_client_state(g_vc, &state)) {
2019 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : A handle is not available");
2020 return VC_ERROR_INVALID_STATE;
2024 if (state != VC_STATE_INITIALIZED) {
2025 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2026 return VC_ERROR_INVALID_STATE;
2029 vc_client_set_state_changed_cb(g_vc, callback, user_data);
2034 int vc_unset_state_changed_cb(void)
2036 if (0 != __vc_get_feature_enabled()) {
2037 return VC_ERROR_NOT_SUPPORTED;
2039 if (0 != __vc_check_privilege()) {
2040 return VC_ERROR_PERMISSION_DENIED;
2044 if (0 != vc_client_get_client_state(g_vc, &state)) {
2045 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : A handle is not available");
2046 return VC_ERROR_INVALID_STATE;
2050 if (state != VC_STATE_INITIALIZED) {
2051 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2052 return VC_ERROR_INVALID_STATE;
2055 vc_client_set_state_changed_cb(g_vc, NULL, NULL);
2060 int vc_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2062 if (0 != __vc_get_feature_enabled()) {
2063 return VC_ERROR_NOT_SUPPORTED;
2065 if (0 != __vc_check_privilege()) {
2066 return VC_ERROR_PERMISSION_DENIED;
2069 if (NULL == callback)
2070 return VC_ERROR_INVALID_PARAMETER;
2073 if (0 != vc_client_get_client_state(g_vc, &state)) {
2074 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : A handle is not available");
2075 return VC_ERROR_INVALID_STATE;
2079 if (state != VC_STATE_INITIALIZED) {
2080 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set current language changed : Current state is not 'Initialized'");
2081 return VC_ERROR_INVALID_STATE;
2084 vc_client_set_current_lang_changed_cb(g_vc, callback, user_data);
2089 int vc_unset_current_language_changed_cb(void)
2091 if (0 != __vc_get_feature_enabled()) {
2092 return VC_ERROR_NOT_SUPPORTED;
2094 if (0 != __vc_check_privilege()) {
2095 return VC_ERROR_PERMISSION_DENIED;
2099 if (0 != vc_client_get_client_state(g_vc, &state)) {
2100 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : A handle is not available");
2101 return VC_ERROR_INVALID_STATE;
2105 if (state != VC_STATE_INITIALIZED) {
2106 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2107 return VC_ERROR_INVALID_STATE;
2110 vc_client_set_current_lang_changed_cb(g_vc, NULL, NULL);
2115 int vc_set_error_cb(vc_error_cb callback, void* user_data)
2117 if (0 != __vc_get_feature_enabled()) {
2118 return VC_ERROR_NOT_SUPPORTED;
2120 if (0 != __vc_check_privilege()) {
2121 return VC_ERROR_PERMISSION_DENIED;
2124 if (NULL == callback)
2125 return VC_ERROR_INVALID_PARAMETER;
2128 if (0 != vc_client_get_client_state(g_vc, &state)) {
2129 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : A handle is not available");
2130 return VC_ERROR_INVALID_STATE;
2134 if (state != VC_STATE_INITIALIZED) {
2135 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set error callback : Current state is not 'Initialized'");
2136 return VC_ERROR_INVALID_STATE;
2139 vc_client_set_error_cb(g_vc, callback, user_data);
2144 int vc_unset_error_cb(void)
2146 if (0 != __vc_get_feature_enabled()) {
2147 return VC_ERROR_NOT_SUPPORTED;
2149 if (0 != __vc_check_privilege()) {
2150 return VC_ERROR_PERMISSION_DENIED;
2154 if (0 != vc_client_get_client_state(g_vc, &state)) {
2155 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : A handle is not available");
2156 return VC_ERROR_INVALID_STATE;
2160 if (state != VC_STATE_INITIALIZED) {
2161 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2162 return VC_ERROR_INVALID_STATE;
2165 vc_client_set_error_cb(g_vc, NULL, NULL);
2170 int vc_set_invocation_name(const char* name)
2172 if (0 != __vc_get_feature_enabled()) {
2173 return VC_ERROR_NOT_SUPPORTED;
2175 if (0 != __vc_check_privilege()) {
2176 return VC_ERROR_PERMISSION_DENIED;
2180 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set invocation name");
2182 int ret = vc_client_get_client_state(g_vc, &state);
2184 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2185 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2190 if (state != VC_STATE_READY) {
2191 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'");
2192 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2193 return VC_ERROR_INVALID_STATE;
2196 ret = vc_client_set_invocation_name(g_vc, name);
2198 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set invocation name");
2204 int vc_set_server_dialog(const char* app_id, const char* credential)
2209 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Set server dialog, pid(%d), app_id(%s)", getpid(), app_id);
2210 if (0 != __vc_get_feature_enabled()) {
2211 return VC_ERROR_NOT_SUPPORTED;
2213 if (0 != __vc_check_privilege()) {
2214 return VC_ERROR_PERMISSION_DENIED;
2217 if (NULL == credential) {
2218 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Credential is NULL");
2219 return VC_ERROR_INVALID_PARAMETER;
2222 if (0 != vc_client_get_client_state(g_vc, &state)) {
2223 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2224 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2225 return VC_ERROR_INVALID_STATE;
2229 if (state != VC_STATE_READY) {
2230 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2231 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2232 return VC_ERROR_INVALID_STATE;
2235 /* Check service state */
2236 vc_service_state_e service_state = -1;
2237 vc_client_get_service_state(g_vc, &service_state);
2238 if (service_state != VC_SERVICE_STATE_READY) {
2239 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2240 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2241 return VC_ERROR_INVALID_STATE;
2244 char* tmp_appid = NULL;
2245 if (NULL == app_id) {
2246 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2247 if (0 != ret || NULL == tmp_appid) {
2248 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2249 if (NULL != tmp_appid)
2251 return VC_ERROR_INVALID_PARAMETER;
2254 tmp_appid = strdup(app_id);
2258 SLOG(LOG_DEBUG, TAG_VCC, "Set server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2261 bool is_prepared = false;
2263 ret = vc_dbus_set_server_dialog(pid, tmp_appid, credential);
2265 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2266 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2267 if (0 == vc_prepare_sync()) {
2269 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2271 } else if (VC_ERROR_TIMED_OUT != ret) {
2272 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request set server dialog to vc service : %s", __vc_get_error_code(ret));
2275 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request set server dialog : %s", __vc_get_error_code(ret));
2278 if (VC_RETRY_COUNT == count) {
2279 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2287 if (NULL != tmp_appid)
2290 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2295 int vc_unset_server_dialog(const char* app_id)
2300 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Unset server dialog, pid(%d), app_id(%s)", getpid(), app_id);
2301 if (0 != __vc_get_feature_enabled()) {
2302 return VC_ERROR_NOT_SUPPORTED;
2304 if (0 != __vc_check_privilege()) {
2305 return VC_ERROR_PERMISSION_DENIED;
2308 if (0 != vc_client_get_client_state(g_vc, &state)) {
2309 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2310 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2311 return VC_ERROR_INVALID_STATE;
2315 if (state != VC_STATE_READY) {
2316 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
2317 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2318 return VC_ERROR_INVALID_STATE;
2321 /* Check service state */
2322 vc_service_state_e service_state = -1;
2323 vc_client_get_service_state(g_vc, &service_state);
2324 if (service_state != VC_SERVICE_STATE_READY) {
2325 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
2326 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2327 return VC_ERROR_INVALID_STATE;
2330 char* tmp_appid = NULL;
2331 if (NULL == app_id) {
2332 ret = app_manager_get_app_id(getpid(), &tmp_appid);
2333 if (0 != ret || NULL == tmp_appid) {
2334 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] app_id is NULL");
2335 if (NULL != tmp_appid)
2337 return VC_ERROR_INVALID_PARAMETER;
2340 tmp_appid = strdup(app_id);
2344 SLOG(LOG_DEBUG, TAG_VCC, "Unset server dialog : pid(%d), app_id(%s)", pid, tmp_appid);
2347 bool is_prepared = false;
2348 char* credential = strdup("#NULL");
2350 ret = vc_dbus_set_server_dialog(pid, tmp_appid, credential);
2352 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2353 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2354 if (0 == vc_prepare_sync()) {
2356 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2358 } else if (VC_ERROR_TIMED_OUT != ret) {
2359 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request unset server dialog to vc service : %s", __vc_get_error_code(ret));
2362 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request unset server dialog : %s", __vc_get_error_code(ret));
2365 if (VC_RETRY_COUNT == count) {
2366 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2374 if (NULL != tmp_appid)
2376 if (NULL != credential)
2379 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2385 int vc_request_dialog(const char* disp_text, const char* utt_text, bool auto_start)
2389 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request dialog");
2390 if (0 != __vc_get_feature_enabled()) {
2391 return VC_ERROR_NOT_SUPPORTED;
2393 if (0 != __vc_check_privilege()) {
2394 return VC_ERROR_PERMISSION_DENIED;
2397 if (0 != vc_client_get_client_state(g_vc, &state)) {
2398 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
2399 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2400 return VC_ERROR_INVALID_STATE;
2404 if (state != VC_STATE_READY) {
2405 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'READY'"); //LCOV_EXCL_LINE
2406 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
2407 return VC_ERROR_INVALID_STATE;
2410 /* Check service state */
2411 vc_service_state_e service_state = -1;
2412 vc_client_get_service_state(g_vc, &service_state);
2413 if (service_state != VC_SERVICE_STATE_READY) {
2414 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'"); //LCOV_EXCL_LINE
2415 SLOG(LOG_DEBUG, TAG_VCC, "@@@"); //LCOV_EXCL_LINE
2416 return VC_ERROR_INVALID_STATE;
2419 SLOG(LOG_DEBUG, TAG_VCC, "Request dialog : pid(%d) disp_text(%s), utt_text(%s), auto_start(%d)", getpid(), disp_text, utt_text, auto_start);
2420 int ret = vc_dbus_request_dialog(getpid(), disp_text, utt_text, auto_start);
2422 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request dialog, ret(%d)", ret);
2423 return VC_ERROR_OPERATION_FAILED;
2426 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2428 return VC_ERROR_NONE;
2433 int vc_auth_enable(void)
2437 if (0 != vc_client_get_client_state(g_vc, &state)) {
2438 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2439 return VC_ERROR_INVALID_STATE;
2442 if (VC_STATE_READY != state) {
2443 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2444 return VC_ERROR_INVALID_STATE;
2447 /* check already authority */
2448 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2449 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2450 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2451 return VC_ERROR_INVALID_STATE;
2454 if (VC_AUTH_STATE_NONE != auth_state) {
2455 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Already authority enabled");
2456 return VC_ERROR_INVALID_STATE;
2459 /* request authority */
2461 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2462 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2463 return VC_ERROR_OPERATION_FAILED;
2466 if (0 != vc_dbus_request_auth_enable(g_vc->handle, mgr_pid)) {
2467 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority enabled");
2468 return VC_ERROR_OPERATION_FAILED;
2471 /* set authority into handle */
2472 bool is_foreground = false;
2473 if (0 != vc_client_get_is_foreground(g_vc, &is_foreground)) {
2474 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get is_foreground");
2475 return VC_ERROR_OPERATION_FAILED;
2478 if (is_foreground) {
2479 auth_state = VC_AUTH_STATE_VALID;
2481 auth_state = VC_AUTH_STATE_INVALID;
2484 if (0 != vc_client_set_auth_state(g_vc, auth_state)) {
2485 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2486 return VC_ERROR_OPERATION_FAILED;
2489 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2491 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth enable");
2493 return VC_ERROR_NONE;
2496 int vc_auth_disable(void)
2500 if (0 != vc_client_get_client_state(g_vc, &state)) {
2501 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2502 return VC_ERROR_INVALID_STATE;
2505 if (VC_STATE_READY != state) {
2506 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2507 return VC_ERROR_INVALID_STATE;
2510 /* check authority */
2511 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2512 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2513 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2514 return VC_ERROR_INVALID_STATE;
2517 if (VC_AUTH_STATE_NONE == auth_state) {
2518 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] No authority");
2519 return VC_ERROR_INVALID_STATE;
2522 if (0 != vc_auth_unset_state_changed_cb()) {
2523 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset state changed cb");
2526 /* request return authority by dbus */
2528 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2529 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2530 return VC_ERROR_OPERATION_FAILED;
2533 if (0 != vc_dbus_request_auth_disable(g_vc->handle, mgr_pid)) {
2534 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to authority disable");
2535 return VC_ERROR_OPERATION_FAILED;
2538 /* unset authority from handle */
2539 if (0 != vc_client_set_auth_state(g_vc, VC_AUTH_STATE_NONE)) {
2540 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state");
2541 return VC_ERROR_OPERATION_FAILED;
2544 ecore_timer_add(0, __notify_auth_changed_cb, NULL);
2546 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Auth disable");
2548 return VC_ERROR_NONE;
2551 int vc_auth_get_state(vc_auth_state_e* state)
2554 vc_state_e vc_state;
2555 if (0 != vc_client_get_client_state(g_vc, &vc_state)) {
2556 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2557 return VC_ERROR_INVALID_STATE;
2560 if (VC_STATE_READY != vc_state) {
2561 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Current state is not 'READY'");
2562 return VC_ERROR_INVALID_STATE;
2566 vc_auth_state_e temp = VC_AUTH_STATE_NONE;
2567 if (0 != vc_client_get_auth_state(g_vc, &temp)) {
2568 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] handle is not available");
2569 return VC_ERROR_INVALID_STATE;
2574 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Current auth state is %d", *state);
2576 return VC_ERROR_NONE;
2579 int vc_auth_set_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
2581 /* check parameter */
2582 if (NULL == callback) {
2583 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] NULL Parameter");
2584 return VC_ERROR_INVALID_PARAMETER;
2588 vc_auth_state_e auth_state;
2589 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2590 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2591 return VC_ERROR_INVALID_STATE;
2594 if (VC_AUTH_STATE_NONE == auth_state) {
2595 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auth is not enabled");
2596 return VC_ERROR_INVALID_STATE;
2599 /* set cb into handle */
2600 if (0 != vc_client_set_auth_state_changed_cb(g_vc, callback, user_data)) {
2601 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to set auth state changed cb");
2602 return VC_ERROR_OPERATION_FAILED;
2605 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Set auth state changed cb");
2607 return VC_ERROR_NONE;
2610 int vc_auth_unset_state_changed_cb(void)
2613 vc_auth_state_e auth_state;
2614 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2615 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Handle is not available");
2616 return VC_ERROR_INVALID_STATE;
2619 if (VC_AUTH_STATE_NONE == auth_state) {
2620 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Auto is not enabled");
2621 return VC_ERROR_INVALID_STATE;
2624 /* unset cb from handle */
2625 if (0 != vc_client_unset_auth_state_changed_cb(g_vc)) {
2626 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to unset auth state changed cb");
2627 return VC_ERROR_OPERATION_FAILED;
2630 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Unset auth state changed cb");
2632 return VC_ERROR_NONE;
2635 int vc_auth_start(void)
2637 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request start");
2640 if (0 != vc_client_get_client_state(g_vc, &state)) {
2641 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2642 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2643 return VC_ERROR_INVALID_STATE;
2647 if (state != VC_STATE_READY) {
2648 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'READY'");
2649 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2650 return VC_ERROR_INVALID_STATE;
2653 /* Check service state */
2654 vc_service_state_e service_state = -1;
2655 vc_client_get_service_state(g_vc, &service_state);
2656 if (service_state != VC_SERVICE_STATE_READY) {
2657 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'READY'");
2658 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2659 return VC_ERROR_INVALID_STATE;
2662 /* Check authority */
2663 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2664 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2665 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2666 return VC_ERROR_OPERATION_FAILED;
2669 if (VC_AUTH_STATE_VALID != auth_state) {
2670 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2671 return VC_ERROR_OPERATION_FAILED;
2676 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2677 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2678 return VC_ERROR_OPERATION_FAILED;
2683 bool is_prepared = false;
2686 ret = vc_dbus_request_auth_start(g_vc->handle, mgr_pid);
2688 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2689 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2690 if (0 == vc_prepare_sync()) {
2692 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2694 } else if (VC_ERROR_TIMED_OUT != ret) {
2695 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request auth start : %s", __vc_get_error_code(ret));
2698 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth start : %s", __vc_get_error_code(ret));
2701 if (VC_RETRY_COUNT == count) {
2702 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2707 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth start");
2711 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2716 int vc_auth_stop(void)
2718 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request stop");
2721 if (0 != vc_client_get_client_state(g_vc, &state)) {
2722 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2723 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2724 return VC_ERROR_INVALID_STATE;
2728 if (state != VC_STATE_READY) {
2729 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: client state is not 'Ready'");
2730 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2731 return VC_ERROR_INVALID_STATE;
2734 /* Check service state */
2735 vc_service_state_e service_state = -1;
2736 vc_client_get_service_state(g_vc, &service_state);
2737 if (service_state != VC_SERVICE_STATE_RECORDING) {
2738 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING'");
2739 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2740 return VC_ERROR_INVALID_STATE;
2743 /* Check authority */
2744 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2745 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2746 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2747 return VC_ERROR_OPERATION_FAILED;
2750 if (VC_AUTH_STATE_VALID != auth_state) {
2751 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2752 return VC_ERROR_OPERATION_FAILED;
2757 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2758 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2759 return VC_ERROR_OPERATION_FAILED;
2764 bool is_prepared = false;
2767 ret = vc_dbus_request_auth_stop(g_vc->handle, mgr_pid);
2769 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2770 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2771 if (0 == vc_prepare_sync()) {
2773 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2775 } else if (VC_ERROR_TIMED_OUT != ret) {
2776 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth stop: %s", __vc_get_error_code(ret));
2779 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth stop: %s", __vc_get_error_code(ret));
2782 if (VC_RETRY_COUNT == count) {
2783 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2788 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth stop");
2792 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2797 int vc_auth_cancel(void)
2799 SLOG(LOG_DEBUG, TAG_VCC, "@@@ [Client] Request cancel");
2802 if (0 != vc_client_get_client_state(g_vc, &state)) {
2803 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not available");
2804 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2805 return VC_ERROR_INVALID_STATE;
2809 if (state != VC_STATE_READY) {
2810 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state is not 'Ready'");
2811 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2812 return VC_ERROR_INVALID_STATE;
2815 /* Check service state */
2816 vc_service_state_e service_state = -1;
2817 vc_client_get_service_state(g_vc, &service_state);
2818 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
2819 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
2820 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2821 return VC_ERROR_INVALID_STATE;
2824 /* Check authority */
2825 vc_auth_state_e auth_state = VC_AUTH_STATE_NONE;
2826 if (0 != vc_client_get_auth_state(g_vc, &auth_state)) {
2827 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get auth state");
2828 return VC_ERROR_OPERATION_FAILED;
2831 if (VC_AUTH_STATE_VALID != auth_state) {
2832 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Not auth valid");
2833 return VC_ERROR_OPERATION_FAILED;
2838 if (0 != vc_client_get_mgr_pid(g_vc, &mgr_pid)) {
2839 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get mgr info");
2840 return VC_ERROR_OPERATION_FAILED;
2845 bool is_prepared = false;
2847 ret = vc_dbus_request_auth_cancel(g_vc->handle, mgr_pid);
2849 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2850 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
2851 if (0 == vc_prepare_sync()) {
2853 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
2855 } else if (VC_ERROR_TIMED_OUT != ret) {
2856 SLOG(LOG_DEBUG, TAG_VCC, "[ERROR] Fail to request auth cancel: %s", __vc_get_error_code(ret));
2859 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request auth cancel: %s", __vc_get_error_code(ret));
2862 if (VC_RETRY_COUNT == count) {
2863 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
2868 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] request auth cancel");
2872 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
2877 static void __start_tts_streaming_thread(void* data, Ecore_Thread* thread)
2879 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] Start tts streaming thread");
2881 vc_tts_data_s* tts_data = NULL;
2882 vc_tts_streaming_cb callback = NULL;
2883 void* user_data = NULL;
2885 vc_client_get_tts_streaming_cb(g_vc, &callback, &user_data);
2886 if (NULL == callback) {
2887 SLOG(LOG_WARN, TAG_VCC, "[WARNING] tts streaming callback is null");
2896 ret = vc_data_get_tts_data(&tts_data);
2897 if (0 != ret || NULL == tts_data) {
2899 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] No tts data. Waiting mode");
2904 if (0 < vc_data_get_tts_data_size()) {
2905 SLOG(LOG_INFO, TAG_VCC, "[INFO] Resume thread");
2909 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Wrong request, there's no pcm data");
2910 vc_data_clear_tts_data(&tts_data);
2915 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish to wait for new tts data come");
2917 /* resume tts thread */
2918 vc_data_clear_tts_data(&tts_data);
2922 if (NULL != tts_data) {
2923 SLOG(LOG_DEBUG, TAG_VCC, "tts streaming callback is called");
2924 vc_client_use_callback(g_vc);
2925 callback(tts_data->event, tts_data->data, tts_data->data_size, tts_data->utt_id, user_data);
2926 vc_client_not_use_callback(g_vc);
2928 /* If no tts data and EVENT_FINISH */
2929 if (0 >= vc_data_get_tts_data_size() && VC_TTS_EVENT_FINISH == tts_data->event) {
2930 SLOG(LOG_INFO, TAG_VCC, "[INFO] Finish tts");
2941 static void __end_tts_streaming_thread(void* data, Ecore_Thread* thread)
2943 SLOG(LOG_DEBUG, TAG_VCC, "[SUCCESS] End tts streaming thread");
2944 g_tts_thread = NULL;
2947 int __vc_cb_tts_streaming(int utt_id, vc_tts_event_e event, char* buffer, int len)
2950 vc_tts_data_s* temp_tts_data = NULL;
2951 temp_tts_data = (vc_tts_data_s*)calloc(1, sizeof(vc_tts_data_s));
2952 if (NULL == temp_tts_data) {
2953 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Out of memory");
2954 return VC_ERROR_OUT_OF_MEMORY;
2957 temp_tts_data->data = NULL;
2958 temp_tts_data->data_size = 0;
2961 temp_tts_data->data = (char*)calloc(len + 5, sizeof(char));
2962 if (NULL != temp_tts_data->data) {
2963 memcpy(temp_tts_data->data, buffer, len);
2964 temp_tts_data->data_size = len;
2965 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG][memcpy] data(%p) size(%d)",
2966 temp_tts_data->data, temp_tts_data->data_size);
2968 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] fail to allocate memory");
2971 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] tts data is NULL");
2974 temp_tts_data->utt_id = utt_id;
2975 temp_tts_data->event = event;
2977 int ret = vc_data_add_tts_data(temp_tts_data);
2979 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to add tts data");
2980 if (NULL != temp_tts_data->data) {
2981 free(temp_tts_data->data);
2982 temp_tts_data->data = NULL;
2984 if (NULL != temp_tts_data) {
2985 free(temp_tts_data);
2986 temp_tts_data = NULL;
2990 bool is_canceled = ecore_thread_check(g_tts_thread);
2991 if (NULL == g_tts_thread || TRUE == is_canceled) {
2992 SLOG(LOG_INFO, TAG_VCC, "ecore thread run : __start_tts_streaming_thread ");
2993 g_tts_thread = ecore_thread_run(__start_tts_streaming_thread, __end_tts_streaming_thread, NULL, NULL);
2999 int vc_tts_request(const char* text, const char* language, bool to_vc_manager, int* utt_id)
3005 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Request tts");
3007 if (0 != __vc_get_feature_enabled()) {
3008 return VC_ERROR_NOT_SUPPORTED;
3010 if (0 != __vc_check_privilege()) {
3011 return VC_ERROR_PERMISSION_DENIED;
3014 if (0 != vc_client_get_client_state(g_vc, &state)) {
3015 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3016 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3017 return VC_ERROR_INVALID_STATE;
3021 if (state != VC_STATE_READY) {
3022 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3023 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3024 return VC_ERROR_INVALID_STATE;
3027 /* Check service state */
3028 vc_service_state_e service_state = -1;
3029 vc_client_get_service_state(g_vc, &service_state);
3030 if (service_state != VC_SERVICE_STATE_READY) {
3031 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3032 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3033 return VC_ERROR_INVALID_STATE;
3036 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts request, pid(%d), text(%s), language(%s), to_vc_manager(%d)", pid, text, language, to_vc_manager);
3039 bool is_prepared = false;
3041 ret = vc_dbus_request_tts(pid, text, language, to_vc_manager, utt_id);
3043 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3044 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3045 if (0 == vc_prepare_sync()) {
3047 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3049 } else if (VC_ERROR_TIMED_OUT != ret) {
3050 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request tts to vc service : %s", __vc_get_error_code(ret));
3053 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry request tts : %s", __vc_get_error_code(ret));
3056 if (VC_RETRY_COUNT == count) {
3057 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request");
3064 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3069 int vc_tts_cancel(int utt_id)
3075 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Cancel tts");
3077 if (0 != __vc_get_feature_enabled()) {
3078 return VC_ERROR_NOT_SUPPORTED;
3080 if (0 != __vc_check_privilege()) {
3081 return VC_ERROR_PERMISSION_DENIED;
3084 if (0 != vc_client_get_client_state(g_vc, &state)) {
3085 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3086 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3087 return VC_ERROR_INVALID_STATE;
3091 if (state != VC_STATE_READY) {
3092 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3093 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3094 return VC_ERROR_INVALID_STATE;
3097 /* Check service state */
3098 vc_service_state_e service_state = -1;
3099 vc_client_get_service_state(g_vc, &service_state);
3100 if (service_state != VC_SERVICE_STATE_READY) {
3101 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3102 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3103 return VC_ERROR_INVALID_STATE;
3106 SLOG(LOG_DEBUG, TAG_VCC, "@@@ tts cancel, pid(%d), utt_id(%d)", pid, utt_id);
3108 ret = vc_data_clear_tts_data_by_uttid(utt_id);
3110 SLOG(LOG_INFO, TAG_VCC, "[INFO] There's no data in client pcm queue");
3114 bool is_prepared = false;
3116 ret = vc_dbus_cancel_tts(pid, utt_id);
3118 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3119 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3120 if (0 == vc_prepare_sync()) {
3122 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3124 } else if (VC_ERROR_TIMED_OUT != ret) {
3125 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel tts to vc service : %s", __vc_get_error_code(ret));
3128 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry cancel tts : %s", __vc_get_error_code(ret));
3131 if (VC_RETRY_COUNT == count) {
3132 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to cancel");
3139 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3144 int vc_tts_get_audio_format(int* rate, vc_audio_channel_e* channel, vc_audio_type_e* audio_type)
3150 SLOG(LOG_DEBUG, TAG_VCC, "@@@ Get tts audio format");
3152 if (0 != __vc_get_feature_enabled()) {
3153 return VC_ERROR_NOT_SUPPORTED;
3155 if (0 != __vc_check_privilege()) {
3156 return VC_ERROR_PERMISSION_DENIED;
3159 if (0 != vc_client_get_client_state(g_vc, &state)) {
3160 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] A handle is not valid");
3161 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3162 return VC_ERROR_INVALID_STATE;
3166 if (state != VC_STATE_READY) {
3167 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
3168 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3169 return VC_ERROR_INVALID_STATE;
3172 /* Check service state */
3173 vc_service_state_e service_state = -1;
3174 vc_client_get_service_state(g_vc, &service_state);
3175 if (service_state != VC_SERVICE_STATE_READY) {
3176 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
3177 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3178 return VC_ERROR_INVALID_STATE;
3181 SLOG(LOG_DEBUG, TAG_VCC, "@@@ get tts audio format, pid(%d)", pid);
3184 bool is_prepared = false;
3186 ret = vc_dbus_get_tts_audio_format(pid, rate, channel, audio_type);
3188 if (VC_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3189 vc_client_set_client_state(g_vc, VC_STATE_INITIALIZED);
3190 if (0 == vc_prepare_sync()) {
3192 SLOG(LOG_INFO, TAG_VCC, "[INFO] Success vc_prepare_sync");
3194 } else if (VC_ERROR_TIMED_OUT != ret) {
3195 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format : %s", __vc_get_error_code(ret));
3198 SLOG(LOG_WARN, TAG_VCC, "[WARNING] retry to get tts audio format : %s", __vc_get_error_code(ret));
3201 if (VC_RETRY_COUNT == count) {
3202 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to get tts audio format");
3209 SLOG(LOG_DEBUG, TAG_VCC, "@@@");
3214 int vc_tts_set_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
3216 if (0 != __vc_get_feature_enabled()) {
3217 return VC_ERROR_NOT_SUPPORTED;
3219 if (0 != __vc_check_privilege()) {
3220 return VC_ERROR_PERMISSION_DENIED;
3223 if (NULL == callback)
3224 return VC_ERROR_INVALID_PARAMETER;
3227 if (0 != vc_client_get_client_state(g_vc, &state)) {
3228 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : A handle is not available");
3229 return VC_ERROR_INVALID_STATE;
3233 if (state != VC_STATE_INITIALIZED) {
3234 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts streaming callback : Current state(%d) is not 'Initialized'", state);
3235 return VC_ERROR_INVALID_STATE;
3238 vc_client_set_tts_streaming_cb(g_vc, callback, user_data);
3243 int vc_tts_unset_streaming_cb(void)
3245 if (0 != __vc_get_feature_enabled()) {
3246 return VC_ERROR_NOT_SUPPORTED;
3248 if (0 != __vc_check_privilege()) {
3249 return VC_ERROR_PERMISSION_DENIED;
3253 if (0 != vc_client_get_client_state(g_vc, &state)) {
3254 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : A handle is not available");
3255 return VC_ERROR_INVALID_STATE;
3259 if (state != VC_STATE_INITIALIZED) {
3260 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts streaming callback : Current state(%d) is not 'Initialized'", state);
3261 return VC_ERROR_INVALID_STATE;
3264 vc_client_set_tts_streaming_cb(g_vc, NULL, NULL);
3269 int __vc_cb_utterance_status(int utt_id, int utt_status)
3271 vc_tts_utterance_status_cb callback = NULL;
3272 void* user_data = NULL;
3274 vc_client_get_tts_utterance_status_cb(g_vc, &callback, &user_data);
3275 if (NULL == callback) {
3276 SLOG(LOG_WARN, TAG_VCC, "[WARNING] Utterance status callback is null");
3280 SLOG(LOG_DEBUG, TAG_VCC, "Utterance status callback is called");
3281 vc_client_use_callback(g_vc);
3282 callback(utt_id, (vc_tts_utterance_status_e)utt_status, user_data);
3283 vc_client_not_use_callback(g_vc);
3288 int vc_tts_set_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
3290 if (0 != __vc_get_feature_enabled()) {
3291 return VC_ERROR_NOT_SUPPORTED;
3293 if (0 != __vc_check_privilege()) {
3294 return VC_ERROR_PERMISSION_DENIED;
3297 if (NULL == callback)
3298 return VC_ERROR_INVALID_PARAMETER;
3301 if (0 != vc_client_get_client_state(g_vc, &state)) {
3302 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : A handle is not available");
3303 return VC_ERROR_INVALID_STATE;
3307 if (state != VC_STATE_INITIALIZED) {
3308 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Set tts utterance status callback : Current state(%d) is not 'Initialized'", state);
3309 return VC_ERROR_INVALID_STATE;
3312 vc_client_set_tts_utterance_status_cb(g_vc, callback, user_data);
3317 int vc_tts_unset_utterance_status_cb(void)
3319 if (0 != __vc_get_feature_enabled()) {
3320 return VC_ERROR_NOT_SUPPORTED;
3322 if (0 != __vc_check_privilege()) {
3323 return VC_ERROR_PERMISSION_DENIED;
3327 if (0 != vc_client_get_client_state(g_vc, &state)) {
3328 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : A handle is not available");
3329 return VC_ERROR_INVALID_STATE;
3333 if (state != VC_STATE_INITIALIZED) {
3334 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Unset tts utterance status callback : Current state(%d) is not 'Initialized'", state);
3335 return VC_ERROR_INVALID_STATE;
3338 vc_client_set_tts_utterance_status_cb(g_vc, NULL, NULL);