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.
19 #include <system_info.h>
21 #include "vc_cmd_db.h"
22 #include "vc_config_mgr.h"
23 #include "vc_command.h"
24 #include "vc_info_parser.h"
25 #include "vc_json_parser.h"
27 #include "vc_mgr_client.h"
28 #include "vc_mgr_dbus.h"
29 #include "voice_control.h"
30 #include "voice_control_command.h"
31 #include "voice_control_command_expand.h"
32 #include "voice_control_common.h"
33 #include "voice_control_manager.h"
36 #define VC_MANAGER_CONFIG_HANDLE 100000
38 static Ecore_Timer* g_m_connect_timer = NULL;
40 static vc_h g_vc_m = NULL;
42 static GSList* g_demandable_client_list = NULL;
44 static float g_volume_db = 0;
46 static int g_daemon_pid = 0;
48 static int g_feature_enabled = -1;
50 static bool g_err_callback_status = false;
52 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
53 static Eina_Bool __vc_mgr_notify_error(void *data);
54 static Eina_Bool __vc_mgr_notify_result(void *data);
56 static const char* __vc_mgr_get_error_code(vc_error_e err)
59 case VC_ERROR_NONE: return "VC_ERROR_NONE";
60 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
61 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
62 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
63 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
64 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
65 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
66 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
67 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
68 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
69 default: return "Invalid error code";
74 static void __vc_mgr_lang_changed_cb(const char* before_lang, const char* current_lang)
76 SLOG(LOG_DEBUG, TAG_VCM, "Lang changed : Before lang(%s) Current lang(%s)",
77 before_lang, current_lang);
79 vc_current_language_changed_cb callback = NULL;
81 vc_mgr_client_get_current_lang_changed_cb(g_vc_m, &callback, &lang_user_data);
83 if (NULL != callback) {
84 vc_mgr_client_use_callback(g_vc_m);
85 callback(before_lang, current_lang, lang_user_data);
86 vc_mgr_client_not_use_callback(g_vc_m);
87 SLOG(LOG_DEBUG, TAG_VCM, "Language changed callback is called");
89 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
95 static int __vc_mgr_get_feature_enabled()
97 if (0 == g_feature_enabled) {
98 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
99 return VC_ERROR_NOT_SUPPORTED;
100 } else if (-1 == g_feature_enabled) {
101 bool vc_supported = false;
102 bool mic_supported = false;
103 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
104 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
105 if (false == vc_supported || false == mic_supported) {
106 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
107 g_feature_enabled = 0;
108 return VC_ERROR_NOT_SUPPORTED;
111 g_feature_enabled = 1;
119 int vc_mgr_initialize()
121 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Initialize");
124 if (0 != __vc_mgr_get_feature_enabled()) {
125 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] not supported");
126 return VC_ERROR_NOT_SUPPORTED;
130 if (true == vc_mgr_client_is_valid(g_vc_m)) {
131 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
132 return VC_ERROR_NONE;
135 if (0 != vc_mgr_dbus_open_connection()) {
136 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open connection");
137 return VC_ERROR_OPERATION_FAILED;
140 if (0 != vc_mgr_client_create(&g_vc_m)) {
141 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
142 return VC_ERROR_OUT_OF_MEMORY;
145 int ret = vc_config_mgr_initialize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
147 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
148 vc_mgr_client_destroy(g_vc_m);
149 return VC_ERROR_OPERATION_FAILED;
152 ret = vc_config_mgr_set_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
154 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
155 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
156 vc_mgr_client_destroy(g_vc_m);
157 return VC_ERROR_OPERATION_FAILED;
160 ret = vc_db_initialize();
162 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
163 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
164 vc_mgr_client_destroy(g_vc_m);
168 SLOG(LOG_DEBUG, TAG_VCM, "[Success] pid(%d)", g_vc_m->handle);
170 SLOG(LOG_DEBUG, TAG_VCM, "=====");
171 SLOG(LOG_DEBUG, TAG_VCM, " ");
173 return VC_ERROR_NONE;
176 static void __vc_mgr_internal_unprepare()
178 int ret = vc_mgr_dbus_request_finalize(g_vc_m->handle);
180 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
183 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
187 int vc_mgr_deinitialize()
189 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Deinitialize");
191 if (false == vc_mgr_client_is_valid(g_vc_m)) {
192 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
193 SLOG(LOG_DEBUG, TAG_VCM, "=====");
194 SLOG(LOG_DEBUG, TAG_VCM, " ");
195 return VC_ERROR_INVALID_STATE;
199 vc_mgr_client_get_client_state(g_vc_m, &state);
204 __vc_mgr_internal_unprepare();
205 /* no break. need to next step*/
206 case VC_STATE_INITIALIZED:
207 if (NULL != g_m_connect_timer) {
208 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
209 ecore_timer_del(g_m_connect_timer);
212 vc_config_mgr_unset_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
213 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
215 /* Free client resources */
216 vc_mgr_client_destroy(g_vc_m);
223 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
225 int cnt = VC_COMMAND_TYPE_FOREGROUND;
227 int ret = vc_cmd_parser_delete_file(getpid(), cnt);
229 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
230 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
232 int ret = vc_db_finalize();
234 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
237 if (0 != vc_mgr_dbus_close_connection()) {
238 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
241 SLOG(LOG_DEBUG, TAG_VCM, "=====");
242 SLOG(LOG_DEBUG, TAG_VCM, " ");
244 return VC_ERROR_NONE;
247 static Eina_Bool __vc_mgr_connect_daemon(void *data)
249 /* request initialization */
251 int service_state = 0;
252 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
254 g_m_connect_timer = NULL;
256 ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, &service_state, &foreground, &g_daemon_pid);
258 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
259 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
261 vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND);
262 ecore_timer_add(0, __vc_mgr_notify_error, g_vc_m);
264 SLOG(LOG_DEBUG, TAG_VCM, "=====");
265 SLOG(LOG_DEBUG, TAG_VCM, " ");
268 } else if (0 != ret) {
269 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
272 /* Success to connect */
275 /* Set service state */
276 vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state);
279 vc_mgr_client_set_foreground(g_vc_m, foreground, true);
281 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Connected daemon");
283 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY);
285 vc_state_changed_cb changed_callback = NULL;
286 void* user_data = NULL;
288 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
290 vc_state_e current_state;
291 vc_state_e before_state;
293 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
295 if (NULL != changed_callback) {
296 vc_mgr_client_use_callback(g_vc_m);
297 changed_callback(before_state, current_state, user_data);
298 vc_mgr_client_not_use_callback(g_vc_m);
299 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
301 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
304 SLOG(LOG_DEBUG, TAG_VCM, "=====");
305 SLOG(LOG_DEBUG, TAG_VCM, " ");
310 static Eina_Bool __vc_mgr_prepare_daemon(void *data)
313 if (0 != vc_mgr_dbus_request_hello()) {
317 g_m_connect_timer = NULL;
318 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
320 g_m_connect_timer = ecore_idler_add(__vc_mgr_connect_daemon, data);
327 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Prepare");
330 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
331 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
332 SLOG(LOG_DEBUG, TAG_VCM, "=====");
333 SLOG(LOG_DEBUG, TAG_VCM, " ");
334 return VC_ERROR_INVALID_STATE;
338 if (state != VC_STATE_INITIALIZED) {
339 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'CREATED'");
340 SLOG(LOG_DEBUG, TAG_VCM, "=====");
341 SLOG(LOG_DEBUG, TAG_VCM, " ");
342 return VC_ERROR_INVALID_STATE;
345 g_m_connect_timer = ecore_timer_add(0, __vc_mgr_prepare_daemon, NULL);
347 SLOG(LOG_DEBUG, TAG_VCM, "=====");
348 SLOG(LOG_DEBUG, TAG_VCM, " ");
350 return VC_ERROR_NONE;
353 int vc_mgr_unprepare()
355 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unprepare");
358 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
359 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
360 SLOG(LOG_DEBUG, TAG_VCM, "=====");
361 SLOG(LOG_DEBUG, TAG_VCM, " ");
362 return VC_ERROR_INVALID_STATE;
366 if (state != VC_STATE_READY) {
367 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
368 SLOG(LOG_DEBUG, TAG_VCM, "=====");
369 SLOG(LOG_DEBUG, TAG_VCM, " ");
370 return VC_ERROR_INVALID_STATE;
373 __vc_mgr_internal_unprepare();
375 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
376 ecore_timer_add(0, __vc_mgr_notify_state_changed, g_vc_m);
378 SLOG(LOG_DEBUG, TAG_VCM, "=====");
379 SLOG(LOG_DEBUG, TAG_VCM, " ");
381 return VC_ERROR_NONE;
384 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
386 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach Supported Language");
388 if (NULL == callback) {
389 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
390 SLOG(LOG_DEBUG, TAG_VCM, "=====");
391 SLOG(LOG_DEBUG, TAG_VCM, " ");
392 return VC_ERROR_INVALID_PARAMETER;
396 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
397 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
398 SLOG(LOG_DEBUG, TAG_VCM, "=====");
399 SLOG(LOG_DEBUG, TAG_VCM, " ");
400 return VC_ERROR_INVALID_STATE;
404 ret = vc_config_mgr_get_language_list(callback, user_data);
406 ret = vc_config_convert_error_code((vc_config_error_e)ret);
407 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
410 SLOG(LOG_DEBUG, TAG_VCM, "=====");
411 SLOG(LOG_DEBUG, TAG_VCM, " ");
413 return VC_ERROR_NONE;
416 int vc_mgr_get_current_language(char** language)
418 if (NULL == language) {
419 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
420 return VC_ERROR_INVALID_PARAMETER;
424 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
425 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
426 return VC_ERROR_INVALID_STATE;
430 ret = vc_config_mgr_get_default_language(language);
432 ret = vc_config_convert_error_code((vc_config_error_e)ret);
433 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
435 SLOG(LOG_DEBUG, TAG_VCM, "[Get current language] language : %s", *language);
441 int vc_mgr_get_state(vc_state_e* state)
443 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get State");
446 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
447 return VC_ERROR_INVALID_PARAMETER;
451 if (0 != vc_mgr_client_get_client_state(g_vc_m, &temp)) {
452 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
453 SLOG(LOG_DEBUG, TAG_VCM, "=====");
454 SLOG(LOG_DEBUG, TAG_VCM, " ");
455 return VC_ERROR_INVALID_STATE;
461 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'None'"); break;
462 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Created'"); break;
463 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Ready'"); break;
464 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
467 SLOG(LOG_DEBUG, TAG_VCM, "=====");
468 SLOG(LOG_DEBUG, TAG_VCM, " ");
470 return VC_ERROR_NONE;
473 int vc_mgr_get_service_state(vc_service_state_e* state)
475 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get Service State");
478 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
479 return VC_ERROR_INVALID_PARAMETER;
482 vc_state_e client_state;
483 if (0 != vc_mgr_client_get_client_state(g_vc_m, &client_state)) {
484 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
485 return VC_ERROR_INVALID_STATE;
489 if (client_state != VC_STATE_READY) {
490 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
491 return VC_ERROR_INVALID_STATE;
494 /* get service state */
495 vc_service_state_e service_state;
496 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
497 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
498 return VC_ERROR_OPERATION_FAILED;
501 *state = service_state;
504 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
505 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
506 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
507 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
508 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
511 SLOG(LOG_DEBUG, TAG_VCM, "=====");
512 SLOG(LOG_DEBUG, TAG_VCM, " ");
514 return VC_ERROR_NONE;
517 int vc_mgr_set_demandable_client_rule(const char* rule)
519 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Demandable client rule");
522 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
523 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
524 SLOG(LOG_DEBUG, TAG_VCM, "=====");
525 SLOG(LOG_DEBUG, TAG_VCM, " ");
526 return VC_ERROR_INVALID_STATE;
530 if (state != VC_STATE_READY) {
531 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
532 SLOG(LOG_DEBUG, TAG_VCM, "=====");
533 SLOG(LOG_DEBUG, TAG_VCM, " ");
534 return VC_ERROR_INVALID_STATE;
538 ret = vc_info_parser_set_demandable_client(rule);
540 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] rule is NOT valid");
541 SLOG(LOG_DEBUG, TAG_VCM, "=====");
542 SLOG(LOG_DEBUG, TAG_VCM, " ");
543 return VC_ERROR_INVALID_PARAMETER;
546 if (0 != vc_info_parser_get_demandable_clients(&g_demandable_client_list)) {
547 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get demandable clients");
548 return VC_ERROR_OPERATION_FAILED;
551 SLOG(LOG_DEBUG, TAG_VCM, "=====");
552 SLOG(LOG_DEBUG, TAG_VCM, " ");
560 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
562 if (VC_ERROR_TIMED_OUT != ret) {
563 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set client rule to daemon : %s", __vc_mgr_get_error_code(ret));
566 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set client rule : %s", __vc_mgr_get_error_code(ret));
569 if (VC_RETRY_COUNT == count) {
570 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
577 SLOG(LOG_DEBUG, TAG_VCM, "=====");
578 SLOG(LOG_DEBUG, TAG_VCM, " ");
584 int vc_mgr_unset_demandable_client_rule()
586 vc_info_parser_set_demandable_client(NULL);
591 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
593 if (VC_ERROR_TIMED_OUT != ret) {
594 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
597 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset client rule : %s", __vc_mgr_get_error_code(ret));
600 if (VC_RETRY_COUNT == count) {
601 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
611 int vc_mgr_is_command_format_supported(vc_cmd_format_e format, bool* support)
613 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Is command type supported");
616 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
617 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
618 SLOG(LOG_DEBUG, TAG_VCM, "=====");
619 SLOG(LOG_DEBUG, TAG_VCM, " ");
620 return VC_ERROR_INVALID_STATE;
624 bool non_fixed_support = false;
625 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
626 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
630 case VC_CMD_FORMAT_FIXED: *support = true; break;
631 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
632 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
633 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
634 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
635 default: *support = false; break;
638 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
640 SLOG(LOG_DEBUG, TAG_VCM, "=====");
641 SLOG(LOG_DEBUG, TAG_VCM, " ");
643 return VC_ERROR_NONE;
646 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
648 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list");
651 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
652 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
653 SLOG(LOG_DEBUG, TAG_VCM, "=====");
654 SLOG(LOG_DEBUG, TAG_VCM, " ");
655 return VC_ERROR_INVALID_STATE;
659 if (state != VC_STATE_READY) {
660 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
661 SLOG(LOG_DEBUG, TAG_VCM, "=====");
662 SLOG(LOG_DEBUG, TAG_VCM, " ");
663 return VC_ERROR_INVALID_STATE;
666 /* Check service state */
667 vc_service_state_e service_state = -1;
668 vc_mgr_client_get_service_state(g_vc_m, &service_state);
669 if (service_state != VC_SERVICE_STATE_READY) {
670 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
671 SLOG(LOG_DEBUG, TAG_VCM, "=====");
672 SLOG(LOG_DEBUG, TAG_VCM, " ");
673 return VC_ERROR_INVALID_STATE;
676 vc_cmd_list_s* list = NULL;
677 list = (vc_cmd_list_s*)vc_cmd_list;
681 bool success_save = false;
682 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
683 ret = vc_cmd_parser_delete_file(getpid(), i);
685 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
687 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
689 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
691 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
696 if (true != success_save) {
697 ret = VC_ERROR_INVALID_PARAMETER;
698 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
702 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
704 if (VC_ERROR_TIMED_OUT != ret) {
705 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
708 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
711 if (VC_RETRY_COUNT == count) {
712 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
720 SLOG(LOG_DEBUG, TAG_VCM, "=====");
721 SLOG(LOG_DEBUG, TAG_VCM, " ");
726 int vc_mgr_unset_command_list()
728 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unset Command list");
731 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
732 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
733 return VC_ERROR_INVALID_STATE;
737 if (state != VC_STATE_READY) {
738 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
739 return VC_ERROR_INVALID_STATE;
745 ret = vc_mgr_dbus_request_unset_command(g_vc_m->handle);
747 if (VC_ERROR_TIMED_OUT != ret) {
748 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
751 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset command : %s", __vc_mgr_get_error_code(ret));
754 if (VC_RETRY_COUNT == count) {
755 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
763 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
764 ret = vc_cmd_parser_delete_file(getpid(), i);
766 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
769 SLOG(LOG_DEBUG, TAG_VCM, "=====");
770 SLOG(LOG_DEBUG, TAG_VCM, " ");
775 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
777 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list from file");
779 if (NULL == file_path) {
780 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter!!");
781 return VC_ERROR_INVALID_PARAMETER;
783 SLOG(LOG_DEBUG, TAG_VCM, "===== File path: %s", file_path);
787 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
788 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
789 SLOG(LOG_DEBUG, TAG_VCC, "=====");
790 SLOG(LOG_DEBUG, TAG_VCC, " ");
791 return VC_ERROR_INVALID_PARAMETER;
795 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
796 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
797 return VC_ERROR_INVALID_STATE;
801 if (state != VC_STATE_READY) {
802 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
803 return VC_ERROR_INVALID_STATE;
806 /* Check service state */
807 vc_service_state_e service_state = -1;
808 vc_mgr_client_get_service_state(g_vc_m, &service_state);
809 if (service_state != VC_SERVICE_STATE_READY) {
810 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
811 return VC_ERROR_INVALID_STATE;
814 int ret = vc_cmd_parser_delete_file(getpid(), type);
816 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
818 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
819 ret = VC_ERROR_INVALID_PARAMETER;
820 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
824 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
826 if (VC_ERROR_TIMED_OUT != ret) {
827 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
830 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
833 if (VC_RETRY_COUNT == count) {
834 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
842 SLOG(LOG_DEBUG, TAG_VCM, "=====");
843 SLOG(LOG_DEBUG, TAG_VCM, " ");
848 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
850 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set preloaded command list");
853 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
854 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
855 return VC_ERROR_INVALID_STATE;
859 if (state != VC_STATE_READY) {
860 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
861 return VC_ERROR_INVALID_STATE;
864 /* Check service state */
865 vc_service_state_e service_state = -1;
866 vc_mgr_client_get_service_state(g_vc_m, &service_state);
867 if (service_state != VC_SERVICE_STATE_READY) {
868 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
869 return VC_ERROR_INVALID_STATE;
872 /* Only support to set background commands for preloaded application */
873 int ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
875 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
877 SLOG(LOG_DEBUG, TAG_VCM, "=====");
878 SLOG(LOG_DEBUG, TAG_VCM, " ");
882 int vc_mgr_set_audio_type(const char* audio_id)
884 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set audio type");
886 if (NULL == audio_id) {
887 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
888 return VC_ERROR_INVALID_PARAMETER;
892 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
893 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
894 SLOG(LOG_DEBUG, TAG_VCM, "=====");
895 SLOG(LOG_DEBUG, TAG_VCM, " ");
896 return VC_ERROR_INVALID_STATE;
900 if (state != VC_STATE_READY) {
901 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
902 SLOG(LOG_DEBUG, TAG_VCM, "=====");
903 SLOG(LOG_DEBUG, TAG_VCM, " ");
904 return VC_ERROR_INVALID_STATE;
907 /* Check service state */
908 vc_service_state_e service_state = -1;
909 vc_mgr_client_get_service_state(g_vc_m, &service_state);
910 if (service_state != VC_SERVICE_STATE_READY) {
911 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
912 SLOG(LOG_DEBUG, TAG_VCM, "=====");
913 SLOG(LOG_DEBUG, TAG_VCM, " ");
914 return VC_ERROR_INVALID_STATE;
924 ret = vc_mgr_dbus_request_set_audio_type(g_vc_m->handle, audio_id);
926 if (VC_ERROR_TIMED_OUT != ret) {
927 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
930 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set audio type : %s", __vc_mgr_get_error_code(ret));
933 if (VC_RETRY_COUNT == count) {
934 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
939 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio type");
941 vc_mgr_client_set_audio_type(g_vc_m, audio_id);
945 SLOG(LOG_DEBUG, TAG_VCM, "=====");
946 SLOG(LOG_DEBUG, TAG_VCM, " ");
951 int vc_mgr_get_audio_type(char** audio_id)
953 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get audio type");
955 if (NULL == audio_id) {
956 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
957 return VC_ERROR_INVALID_PARAMETER;
961 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
962 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
963 SLOG(LOG_DEBUG, TAG_VCM, "=====");
964 SLOG(LOG_DEBUG, TAG_VCM, " ");
965 return VC_ERROR_INVALID_STATE;
969 if (state != VC_STATE_READY) {
970 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
971 SLOG(LOG_DEBUG, TAG_VCM, "=====");
972 SLOG(LOG_DEBUG, TAG_VCM, " ");
973 return VC_ERROR_INVALID_STATE;
976 /* Check service state */
977 vc_service_state_e service_state = -1;
978 vc_mgr_client_get_service_state(g_vc_m, &service_state);
979 if (service_state != VC_SERVICE_STATE_READY) {
980 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
981 SLOG(LOG_DEBUG, TAG_VCM, "=====");
982 SLOG(LOG_DEBUG, TAG_VCM, " ");
983 return VC_ERROR_INVALID_STATE;
988 vc_mgr_client_get_audio_type(g_vc_m, &temp);
991 /* Not initiallized */
995 ret = vc_mgr_dbus_request_get_audio_type(g_vc_m->handle, &temp);
997 if (VC_ERROR_TIMED_OUT != ret) {
998 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1001 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to get audio type : %s", __vc_mgr_get_error_code(ret));
1004 if (VC_RETRY_COUNT == count) {
1005 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1010 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1012 vc_mgr_client_set_audio_type(g_vc_m, temp);
1018 *audio_id = strdup(temp);
1026 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1028 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach current commands");
1031 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1032 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1033 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1034 SLOG(LOG_DEBUG, TAG_VCM, " ");
1035 return VC_ERROR_INVALID_STATE;
1039 if (state != VC_STATE_READY) {
1040 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1041 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1042 SLOG(LOG_DEBUG, TAG_VCM, " ");
1043 return VC_ERROR_INVALID_STATE;
1046 /* Check service state */
1047 vc_service_state_e service_state = -1;
1048 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1049 if (service_state != VC_SERVICE_STATE_READY) {
1050 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1051 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1052 SLOG(LOG_DEBUG, TAG_VCM, " ");
1053 return VC_ERROR_INVALID_STATE;
1056 if (NULL == vc_cmd_list) {
1057 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid Parameter");
1058 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1059 SLOG(LOG_DEBUG, TAG_VCM, " ");
1060 return VC_ERROR_INVALID_PARAMETER;
1063 vc_cmd_list_h temp_list = NULL;
1064 if (0 != vc_cmd_list_create(&temp_list)) {
1065 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1066 return VC_ERROR_INVALID_PARAMETER;
1069 *vc_cmd_list = temp_list;
1076 /* Get foreground pid */
1077 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fg_pid)) {
1078 /* There is no foreground app for voice control */
1079 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1081 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1084 if (0 != vc_mgr_client_get_pid(g_vc_m, &mgr_pid)) {
1085 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Fail to get manager pid");
1086 return VC_ERROR_OPERATION_FAILED;
1088 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1091 /* Get system command */
1092 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1094 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No system commands");
1101 ret = vc_mgr_dbus_request_set_client_info(g_vc_m->handle);
1103 if (VC_ERROR_TIMED_OUT != ret) {
1104 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1107 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set client info : %s", __vc_mgr_get_error_code(ret));
1110 if (VC_RETRY_COUNT == count) {
1111 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1116 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set client info");
1120 GSList *iter = NULL;
1121 GSList* client_info_list = NULL;
1122 vc_client_info_s *client_info = NULL;
1123 bool is_fgpid = false;
1125 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1126 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] No client");
1130 if (VC_NO_FOREGROUND_PID != fg_pid) {
1131 iter = g_slist_nth(client_info_list, 0);
1132 while (NULL != iter) {
1133 client_info = iter->data;
1134 if (NULL != client_info) {
1135 if (fg_pid == client_info->pid) {
1140 iter = g_slist_next(iter);
1144 /* Get foreground commands and widget */
1145 if (true == is_fgpid) {
1147 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1149 /* Get foreground command */
1150 if (true == client_info->fg_cmd) {
1151 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1153 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1156 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground commands");
1159 /* Check exclusive option */
1160 if (true == client_info->exclusive_cmd) {
1161 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Exclusive command is ON");
1163 /* Set background command for exclusive option */
1164 if (true == client_info->bg_cmd) {
1165 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Set background command");
1166 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1168 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1172 /* need to release client info */
1173 iter = g_slist_nth(client_info_list, 0);
1175 while (NULL != iter) {
1176 client_info = iter->data;
1177 if (NULL != client_info) {
1180 client_info_list = g_slist_remove_link(client_info_list, iter);
1181 iter = g_slist_nth(client_info_list, 0);
1184 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1185 SLOG(LOG_DEBUG, TAG_VCM, " ");
1190 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground app");
1193 /* Get background commands */
1194 if (0 < g_slist_length(client_info_list)) {
1195 iter = g_slist_nth(client_info_list, 0);
1197 while (NULL != iter) {
1198 client_info = iter->data;
1200 if (NULL != client_info) {
1201 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1202 if (true == client_info->bg_cmd) {
1203 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1205 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1210 client_info_list = g_slist_remove_link(client_info_list, iter);
1212 iter = g_slist_nth(client_info_list, 0);
1216 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No background commands");
1219 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1220 SLOG(LOG_DEBUG, TAG_VCM, " ");
1225 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1227 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set recognition mode = %d", mode);
1230 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1231 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1232 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1233 SLOG(LOG_DEBUG, TAG_VCM, " ");
1234 return VC_ERROR_INVALID_STATE;
1238 if (state != VC_STATE_READY) {
1239 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1240 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1241 SLOG(LOG_DEBUG, TAG_VCM, " ");
1242 return VC_ERROR_INVALID_STATE;
1245 /* Check service state */
1246 vc_service_state_e service_state = -1;
1247 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1248 if (service_state != VC_SERVICE_STATE_READY) {
1249 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1250 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1251 SLOG(LOG_DEBUG, TAG_VCM, " ");
1252 return VC_ERROR_INVALID_STATE;
1255 vc_mgr_client_set_recognition_mode(g_vc_m, mode);
1259 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1263 ret = vc_mgr_client_get_recognition_mode(g_vc_m, mode);
1265 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1269 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get recognition mode = %d", *mode);
1273 int vc_mgr_set_private_data(const char* key, const char* data)
1275 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set private data");
1278 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1279 return VC_ERROR_INVALID_PARAMETER;
1283 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1284 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1285 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1286 SLOG(LOG_DEBUG, TAG_VCM, " ");
1287 return VC_ERROR_INVALID_STATE;
1291 if (state != VC_STATE_READY) {
1292 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1293 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1294 SLOG(LOG_DEBUG, TAG_VCM, " ");
1295 return VC_ERROR_INVALID_STATE;
1298 /* Check service state */
1299 vc_service_state_e service_state = -1;
1300 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1301 if (service_state != VC_SERVICE_STATE_READY) {
1302 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1303 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1304 SLOG(LOG_DEBUG, TAG_VCM, " ");
1305 return VC_ERROR_INVALID_STATE;
1311 ret = vc_mgr_dbus_request_set_private_data(g_vc_m->handle, key, data);
1313 if (VC_ERROR_TIMED_OUT != ret) {
1314 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to set private data request : %s", __vc_mgr_get_error_code(ret));
1317 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry set private data request : %s", __vc_mgr_get_error_code(ret));
1320 if (VC_RETRY_COUNT == count) {
1321 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1326 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set domain");
1329 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1330 SLOG(LOG_DEBUG, TAG_VCM, " ");
1335 int vc_mgr_get_private_data(const char* key, char** data)
1337 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get private data");
1339 if (NULL == key || NULL == data) {
1340 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1341 return VC_ERROR_INVALID_PARAMETER;
1345 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1346 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1347 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1348 SLOG(LOG_DEBUG, TAG_VCM, " ");
1349 return VC_ERROR_INVALID_STATE;
1353 if (state != VC_STATE_READY) {
1354 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1355 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1356 SLOG(LOG_DEBUG, TAG_VCM, " ");
1357 return VC_ERROR_INVALID_STATE;
1360 /* Check service state */
1361 vc_service_state_e service_state = -1;
1362 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1363 if (service_state != VC_SERVICE_STATE_READY) {
1364 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1365 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1366 SLOG(LOG_DEBUG, TAG_VCM, " ");
1367 return VC_ERROR_INVALID_STATE;
1375 ret = vc_mgr_dbus_request_get_private_data(g_vc_m->handle, key, &temp);
1377 if (VC_ERROR_TIMED_OUT != ret) {
1378 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1381 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry get private data request : %s", __vc_mgr_get_error_code(ret));
1384 if (VC_RETRY_COUNT == count) {
1385 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1390 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1395 *data = strdup(temp);
1400 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1401 SLOG(LOG_DEBUG, TAG_VCM, " ");
1406 int vc_mgr_set_domain(const char* domain)
1408 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set domain");
1410 if (NULL == domain) {
1411 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1412 return VC_ERROR_INVALID_PARAMETER;
1416 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1417 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1418 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1419 SLOG(LOG_DEBUG, TAG_VCM, " ");
1420 return VC_ERROR_INVALID_STATE;
1424 if (state != VC_STATE_READY) {
1425 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1426 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1427 SLOG(LOG_DEBUG, TAG_VCM, " ");
1428 return VC_ERROR_INVALID_STATE;
1431 /* Check service state */
1432 vc_service_state_e service_state = -1;
1433 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1434 if (service_state != VC_SERVICE_STATE_READY) {
1435 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1436 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1437 SLOG(LOG_DEBUG, TAG_VCM, " ");
1438 return VC_ERROR_INVALID_STATE;
1444 ret = vc_mgr_dbus_request_set_domain(g_vc_m->handle, domain);
1446 if (VC_ERROR_TIMED_OUT != ret) {
1447 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1450 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry set domain request : %s", __vc_mgr_get_error_code(ret));
1453 if (VC_RETRY_COUNT == count) {
1454 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1459 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set domain");
1462 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1463 SLOG(LOG_DEBUG, TAG_VCM, " ");
1468 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1470 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] do action");
1472 if (NULL == send_event) {
1473 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1474 return VC_ERROR_INVALID_PARAMETER;
1478 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1479 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1480 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1481 SLOG(LOG_DEBUG, TAG_VCM, " ");
1482 return VC_ERROR_INVALID_STATE;
1486 if (state != VC_STATE_READY) {
1487 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1488 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1489 SLOG(LOG_DEBUG, TAG_VCM, " ");
1490 return VC_ERROR_INVALID_STATE;
1493 /* Check service state */
1494 vc_service_state_e service_state = -1;
1495 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1496 if (service_state != VC_SERVICE_STATE_READY) {
1497 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1498 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1499 SLOG(LOG_DEBUG, TAG_VCM, " ");
1500 return VC_ERROR_INVALID_STATE;
1506 ret = vc_mgr_dbus_request_do_action(g_vc_m->handle, type, send_event);
1508 if (VC_ERROR_TIMED_OUT != ret) {
1509 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1512 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry do action request : %s", __vc_mgr_get_error_code(ret));
1515 if (VC_RETRY_COUNT == count) {
1516 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1521 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] do action");
1524 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1525 SLOG(LOG_DEBUG, TAG_VCM, " ");
1530 int vc_mgr_start(bool exclusive_command_option)
1532 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request start");
1535 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1536 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1537 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1538 SLOG(LOG_DEBUG, TAG_VCM, " ");
1539 return VC_ERROR_INVALID_STATE;
1543 if (state != VC_STATE_READY) {
1544 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1545 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1546 SLOG(LOG_DEBUG, TAG_VCM, " ");
1547 return VC_ERROR_INVALID_STATE;
1550 /* Check service state */
1551 vc_service_state_e service_state = -1;
1552 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1553 if (service_state != VC_SERVICE_STATE_READY) {
1554 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1555 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1556 SLOG(LOG_DEBUG, TAG_VCM, " ");
1557 return VC_ERROR_INVALID_STATE;
1560 /* Check internal state for async */
1561 vc_internal_state_e internal_state = -1;
1562 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1563 if (internal_state != VC_INTERNAL_STATE_NONE) {
1564 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invaid State : Internal state is NOT none : %d", internal_state);
1565 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1568 vc_mgr_client_set_exclusive_command(g_vc_m, exclusive_command_option);
1570 bool start_by_client = false;
1571 if (0 != vc_mgr_client_get_start_by_client(g_vc_m, &start_by_client)) {
1572 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1577 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1578 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1579 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1586 ret = vc_mgr_dbus_request_start(g_vc_m->handle, (int)recognition_mode, exclusive_command_option, start_by_client);
1588 if (VC_ERROR_TIMED_OUT != ret) {
1589 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1592 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry start request start : %s", __vc_mgr_get_error_code(ret));
1595 if (VC_RETRY_COUNT == count) {
1596 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1597 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1602 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] start recognition");
1603 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STARTING);
1607 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1608 SLOG(LOG_DEBUG, TAG_VCM, " ");
1615 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request stop");
1618 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1619 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1620 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1621 SLOG(LOG_DEBUG, TAG_VCM, " ");
1622 return VC_ERROR_INVALID_STATE;
1626 if (state != VC_STATE_READY) {
1627 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1628 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1629 SLOG(LOG_DEBUG, TAG_VCM, " ");
1630 return VC_ERROR_INVALID_STATE;
1633 /* Check service state */
1634 vc_service_state_e service_state = -1;
1635 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1636 if (service_state != VC_SERVICE_STATE_RECORDING) {
1637 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING'");
1638 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1639 SLOG(LOG_DEBUG, TAG_VCM, " ");
1640 return VC_ERROR_INVALID_STATE;
1643 /* Check internal state for async */
1644 vc_internal_state_e internal_state = -1;
1645 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1646 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1647 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1648 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1649 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1650 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1651 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1652 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1653 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1654 return VC_ERROR_IN_PROGRESS_TO_READY;
1661 ret = vc_mgr_dbus_request_stop(g_vc_m->handle);
1663 if (VC_ERROR_TIMED_OUT != ret) {
1664 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1667 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry stop request : %s", __vc_mgr_get_error_code(ret));
1670 if (VC_RETRY_COUNT == count) {
1671 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1676 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Stop recognition");
1677 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STOPPING);
1681 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1682 SLOG(LOG_DEBUG, TAG_VCM, " ");
1689 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request cancel");
1692 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1693 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1694 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1695 SLOG(LOG_DEBUG, TAG_VCM, " ");
1696 return VC_ERROR_INVALID_STATE;
1700 if (state != VC_STATE_READY) {
1701 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1702 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1703 SLOG(LOG_DEBUG, TAG_VCM, " ");
1704 return VC_ERROR_INVALID_STATE;
1707 /* Check service state */
1708 vc_service_state_e service_state = -1;
1709 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1710 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1711 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1712 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1713 SLOG(LOG_DEBUG, TAG_VCM, " ");
1714 return VC_ERROR_INVALID_STATE;
1717 vc_internal_state_e internal_state = -1;
1718 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1719 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1720 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1721 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1722 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1723 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1724 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1725 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1726 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1727 return VC_ERROR_IN_PROGRESS_TO_READY;
1733 ret = vc_mgr_dbus_request_cancel(g_vc_m->handle);
1735 if (VC_ERROR_TIMED_OUT != ret) {
1736 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1739 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry cancel request : %s", __vc_mgr_get_error_code(ret));
1742 if (VC_RETRY_COUNT == count) {
1743 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1748 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Cancel recognition");
1749 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_CANCELING);
1753 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1755 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1756 SLOG(LOG_DEBUG, TAG_VCM, " ");
1761 int __vc_mgr_cb_set_volume(float volume)
1763 g_volume_db = volume;
1764 SLOG(LOG_DEBUG, TAG_VCM, "Set volume (%f)", g_volume_db);
1769 int vc_mgr_get_recording_volume(float* volume)
1771 if (NULL == volume) {
1772 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1773 return VC_ERROR_INVALID_PARAMETER;
1776 vc_service_state_e service_state = -1;
1777 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
1778 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1779 return VC_ERROR_INVALID_STATE;
1783 if (VC_SERVICE_STATE_RECORDING != service_state) {
1784 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1785 return VC_ERROR_INVALID_STATE;
1788 *volume = g_volume_db;
1793 int __vc_mgr_cb_set_foreground(int pid, bool value)
1795 vc_mgr_client_set_foreground(g_vc_m, pid, value);
1797 /* get authorized valid app */
1799 if (0 != vc_mgr_client_get_valid_authorized_client(g_vc_m, &tmp_pid)) {
1800 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get authorized valid app");
1801 return VC_ERROR_INVALID_PARAMETER;
1804 if (true == value) {
1805 /* compare & set valid */
1806 if (tmp_pid != pid) {
1807 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1809 /* set authorized valid */
1810 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
1811 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) change to valid", pid);
1812 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
1814 SLOG(LOG_DEBUG, TAG_VCM, "No valid Authority");
1815 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1819 if (tmp_pid == pid) {
1820 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1821 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1828 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1830 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Select result");
1832 /* Do not check state for 'restart continusly' mode */
1834 vc_service_state_e service_state = -1;
1835 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1836 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1837 vc_recognition_mode_e recognition_mode;
1838 vc_mgr_get_recognition_mode(&recognition_mode);
1840 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1841 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continously'");
1842 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1843 SLOG(LOG_DEBUG, TAG_VCM, " ");
1844 return VC_ERROR_INVALID_STATE;
1848 if (NULL != vc_cmd_list) {
1850 char* result_text = NULL;
1852 vc_mgr_client_get_all_result(g_vc_m, &event, &result_text);
1854 vc_info_parser_set_result(result_text, event, NULL, vc_cmd_list, false);
1856 if (NULL != result_text) {
1869 ret = vc_mgr_dbus_send_result_selection(g_vc_m->handle);
1871 if (VC_ERROR_TIMED_OUT != ret) {
1872 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send result selection : %s", __vc_mgr_get_error_code(ret));
1875 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry send result selection : %s", __vc_mgr_get_error_code(ret));
1878 if (VC_RETRY_COUNT == count) {
1879 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1884 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] result selection");
1888 vc_mgr_client_unset_all_result(g_vc_m);
1890 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1891 SLOG(LOG_DEBUG, TAG_VCM, " ");
1896 static Eina_Bool __vc_mgr_set_select_result(void *data)
1898 vc_mgr_set_selected_results(NULL);
1902 static void __vc_mgr_notify_all_result(vc_result_type_e result_type)
1904 char* temp_text = NULL;
1906 char* temp_message = NULL;
1907 vc_cmd_list_h vc_cmd_list = NULL;
1909 vc_mgr_all_result_cb all_callback = NULL;
1910 void* all_user_data = NULL;
1912 vc_mgr_client_get_all_result_cb(g_vc_m, &all_callback, &all_user_data);
1913 if (NULL == all_callback) {
1914 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] All result callback is NULL");
1918 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1919 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
1923 vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command(g_vc_m));
1925 SLOG(LOG_DEBUG, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)",
1926 result_type, temp_text, event, temp_message);
1928 vc_cmd_print_list(vc_cmd_list);
1932 vc_mgr_client_use_callback(g_vc_m);
1933 cb_ret = all_callback(event, vc_cmd_list, temp_text, temp_message, all_user_data);
1934 vc_mgr_client_not_use_callback(g_vc_m);
1936 if (true == vc_mgr_client_get_exclusive_command(g_vc_m)) {
1938 vc_result_cb callback = NULL;
1939 void* user_data = NULL;
1941 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
1942 if (NULL == callback) {
1943 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
1947 vc_mgr_client_use_callback(g_vc_m);
1948 callback(event, vc_cmd_list, temp_text, user_data);
1949 vc_mgr_client_not_use_callback(g_vc_m);
1950 SLOG(LOG_DEBUG, TAG_VCM, "Exclusive result callback called");
1952 /* Release result */
1953 if (NULL != temp_text) free(temp_text);
1956 vc_cmd_list_destroy(vc_cmd_list, true);
1958 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1964 vc_cmd_list_get_count(vc_cmd_list, &count);
1966 vc_mgr_client_set_all_result(g_vc_m, event, temp_text);
1967 if (true == cb_ret) {
1968 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is true");
1969 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
1970 ecore_idler_add(__vc_mgr_set_select_result, NULL);
1972 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is false");
1973 /* need to select conflicted result */
1976 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
1977 ecore_idler_add(__vc_mgr_set_select_result, NULL);
1979 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1980 vc_mgr_client_unset_all_result(g_vc_m);
1983 /* Release result */
1984 if (NULL != temp_text) {
1990 vc_cmd_list_destroy(vc_cmd_list, true);
1995 static Eina_Bool __vc_mgr_notify_result(void *data)
1997 char* temp_text = NULL;
1999 vc_cmd_list_h vc_cmd_list = NULL;
2001 vc_result_cb callback = NULL;
2002 void* user_data = NULL;
2004 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
2005 if (NULL == callback) {
2006 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
2010 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
2011 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
2015 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
2017 SLOG(LOG_DEBUG, TAG_VCM, "Result : result text(%s) event(%d)", temp_text, event);
2019 vc_cmd_print_list(vc_cmd_list);
2021 vc_mgr_client_use_callback(g_vc_m);
2022 callback(event, vc_cmd_list, temp_text, user_data);
2023 vc_mgr_client_not_use_callback(g_vc_m);
2024 SLOG(LOG_DEBUG, TAG_VCM, "Result callback called");
2026 vc_cmd_list_destroy(vc_cmd_list, true);
2028 /* Release result */
2029 if (NULL != temp_text) free(temp_text);
2034 void __vc_mgr_cb_all_result(vc_result_type_e type)
2036 if (false == vc_mgr_client_get_exclusive_command(g_vc_m)) {
2037 __vc_mgr_notify_all_result(type);
2039 __vc_mgr_notify_result(0);
2045 void __vc_mgr_cb_pre_result(vc_pre_result_event_e event, const char* pre_result)
2047 vc_mgr_pre_result_cb callback = NULL;
2048 void* user_data = NULL;
2050 vc_mgr_client_get_pre_result_cb(g_vc_m, &callback, &user_data);
2051 if (NULL == callback) {
2052 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client pre result callback is NULL");
2056 vc_mgr_client_use_callback(g_vc_m);
2057 callback(event, pre_result, user_data);
2058 vc_mgr_client_not_use_callback(g_vc_m);
2059 SLOG(LOG_DEBUG, TAG_VCM, "Pre result callback is called");
2064 void __vc_mgr_cb_system_result()
2066 __vc_mgr_notify_result(NULL);
2070 static Eina_Bool __vc_mgr_speech_detected(void *data)
2072 vc_mgr_begin_speech_detected_cb callback = NULL;
2073 void* user_data = NULL;
2075 vc_mgr_client_get_speech_detected_cb(g_vc_m, &callback, &user_data);
2076 if (NULL == callback) {
2077 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
2081 vc_mgr_client_use_callback(g_vc_m);
2082 callback(user_data);
2083 vc_mgr_client_not_use_callback(g_vc_m);
2084 SLOG(LOG_DEBUG, TAG_VCM, "Speech detected callback called");
2089 void __vc_mgr_cb_speech_detected()
2091 __vc_mgr_speech_detected(NULL);
2096 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
2098 if (NULL == callback)
2099 return VC_ERROR_INVALID_PARAMETER;
2102 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2103 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2104 return VC_ERROR_INVALID_STATE;
2108 if (state != VC_STATE_INITIALIZED) {
2109 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
2110 return VC_ERROR_INVALID_STATE;
2113 vc_mgr_client_set_all_result_cb(g_vc_m, callback, user_data);
2115 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set all result callback");
2120 int vc_mgr_unset_all_result_cb()
2123 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2124 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2125 return VC_ERROR_INVALID_STATE;
2129 if (state != VC_STATE_INITIALIZED) {
2130 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2131 return VC_ERROR_INVALID_STATE;
2134 vc_mgr_client_set_all_result_cb(g_vc_m, NULL, NULL);
2139 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
2141 if (NULL == callback)
2142 return VC_ERROR_INVALID_PARAMETER;
2145 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2146 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2147 return VC_ERROR_INVALID_STATE;
2151 if (state != VC_STATE_INITIALIZED) {
2152 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
2153 return VC_ERROR_INVALID_STATE;
2156 vc_mgr_client_set_result_cb(g_vc_m, callback, user_data);
2161 int vc_mgr_unset_result_cb()
2164 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2165 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2166 return VC_ERROR_INVALID_STATE;
2170 if (state != VC_STATE_INITIALIZED) {
2171 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2172 return VC_ERROR_INVALID_STATE;
2175 vc_mgr_client_set_result_cb(g_vc_m, NULL, NULL);
2180 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
2182 if (NULL == callback)
2183 return VC_ERROR_INVALID_PARAMETER;
2186 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2187 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
2188 return VC_ERROR_INVALID_STATE;
2192 if (state != VC_STATE_INITIALIZED) {
2193 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : Current state is not 'Initialized'");
2194 return VC_ERROR_INVALID_STATE;
2197 vc_mgr_client_set_pre_result_cb(g_vc_m, callback, user_data);
2202 int vc_mgr_unset_pre_result_cb()
2205 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2206 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
2207 return VC_ERROR_INVALID_STATE;
2211 if (state != VC_STATE_INITIALIZED) {
2212 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : Current state is not 'Initialize'");
2213 return VC_ERROR_INVALID_STATE;
2216 vc_mgr_client_set_pre_result_cb(g_vc_m, NULL, NULL);
2221 int vc_mgr_get_error_message(char** err_msg)
2223 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get error message");
2225 if (NULL == err_msg) {
2226 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter");
2227 return VC_ERROR_INVALID_PARAMETER;
2230 if (false == g_err_callback_status) {
2231 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not in error callback");
2232 return VC_ERROR_OPERATION_FAILED;
2236 ret = vc_mgr_client_get_error_message(g_vc_m, err_msg);
2238 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get error message");
2241 SLOG(LOG_DEBUG, TAG_VCM, "=====");
2242 SLOG(LOG_DEBUG, TAG_VCM, " ");
2247 static Eina_Bool __vc_mgr_notify_error(void *data)
2249 vc_h vc_m = (vc_h)data;
2251 vc_error_cb callback = NULL;
2252 void* user_data = NULL;
2255 vc_mgr_client_get_error_cb(vc_m, &callback, &user_data);
2256 vc_mgr_client_get_error(vc_m, &reason);
2258 if (NULL != callback) {
2259 vc_mgr_client_use_callback(vc_m);
2260 g_err_callback_status = true;
2261 callback(reason, user_data);
2262 g_err_callback_status = false;
2263 vc_mgr_client_not_use_callback(vc_m);
2264 SLOG(LOG_DEBUG, TAG_VCM, "Error callback is called");
2266 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2272 int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg)
2275 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2276 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Invalid client");
2281 if (state != VC_STATE_READY) {
2282 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] not connected client yet");
2286 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2288 if (VC_ERROR_SERVICE_RESET == reason) {
2289 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] VC daemon reset");
2291 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
2292 __vc_mgr_notify_state_changed(g_vc_m);
2294 if (0 != vc_mgr_prepare()) {
2295 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to prepare");
2299 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
2301 vc_mgr_client_set_error(g_vc_m, reason);
2302 vc_mgr_client_set_error_message(g_vc_m, msg);
2303 __vc_mgr_notify_error(g_vc_m);
2308 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2310 vc_state_changed_cb changed_callback = NULL;
2313 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
2315 vc_state_e current_state;
2316 vc_state_e before_state;
2318 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
2320 if (NULL != changed_callback) {
2321 vc_mgr_client_use_callback(g_vc_m);
2322 changed_callback(before_state, current_state, user_data);
2323 vc_mgr_client_not_use_callback(g_vc_m);
2324 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
2326 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2332 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2334 if (callback == NULL)
2335 return VC_ERROR_INVALID_PARAMETER;
2338 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2339 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2340 return VC_ERROR_INVALID_STATE;
2344 if (state != VC_STATE_INITIALIZED) {
2345 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2346 return VC_ERROR_INVALID_STATE;
2349 vc_mgr_client_set_state_changed_cb(g_vc_m, callback, user_data);
2351 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set state changed callback");
2355 int vc_mgr_unset_state_changed_cb()
2358 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2359 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2360 return VC_ERROR_INVALID_STATE;
2364 if (state != VC_STATE_INITIALIZED) {
2365 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2366 return VC_ERROR_INVALID_STATE;
2369 vc_mgr_client_set_state_changed_cb(g_vc_m, NULL, NULL);
2374 int __vc_mgr_cb_service_state(int state)
2376 vc_service_state_e current_state = (vc_service_state_e)state;
2377 vc_service_state_e before_state;
2378 vc_mgr_client_get_service_state(g_vc_m, &before_state);
2380 if (current_state == before_state) {
2381 SLOG(LOG_WARN, TAG_VCM, "Service State NOT changed : Before(%d) Current(%d)",
2382 before_state, current_state);
2386 SLOG(LOG_DEBUG, TAG_VCM, "Service State changed : Before(%d) Current(%d)",
2387 before_state, current_state);
2389 vc_internal_state_e internal_state = -1;
2390 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
2391 if ((VC_INTERNAL_STATE_STARTING == internal_state && VC_SERVICE_STATE_RECORDING == current_state) ||
2392 (VC_INTERNAL_STATE_STOPPING == internal_state && VC_SERVICE_STATE_PROCESSING == current_state) ||
2393 (VC_INTERNAL_STATE_CANCELING == internal_state && VC_SERVICE_STATE_READY == current_state)) {
2394 SLOG(LOG_DEBUG, TAG_VCM, "Internal state is changed to NONE");
2395 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2398 /* Save service state */
2399 vc_mgr_client_set_service_state(g_vc_m, current_state);
2401 vc_service_state_changed_cb callback = NULL;
2402 void* service_user_data = NULL;
2403 vc_mgr_client_get_service_state_changed_cb(g_vc_m, &callback, &service_user_data);
2405 if (NULL != callback) {
2406 vc_mgr_client_use_callback(g_vc_m);
2407 callback(before_state, current_state, service_user_data);
2408 vc_mgr_client_not_use_callback(g_vc_m);
2409 SLOG(LOG_DEBUG, TAG_VCM, "Service state changed callback is called");
2411 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
2417 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2419 if (callback == NULL)
2420 return VC_ERROR_INVALID_PARAMETER;
2423 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2424 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2425 return VC_ERROR_INVALID_STATE;
2429 if (state != VC_STATE_INITIALIZED) {
2430 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2431 return VC_ERROR_INVALID_STATE;
2434 vc_mgr_client_set_service_state_changed_cb(g_vc_m, callback, user_data);
2436 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set sevice state changed callback");
2440 int vc_mgr_unset_service_state_changed_cb()
2443 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2444 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2445 return VC_ERROR_INVALID_STATE;
2449 if (state != VC_STATE_INITIALIZED) {
2450 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2451 return VC_ERROR_INVALID_STATE;
2454 vc_mgr_client_set_service_state_changed_cb(g_vc_m, NULL, NULL);
2458 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2460 if (callback == NULL)
2461 return VC_ERROR_INVALID_PARAMETER;
2464 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2465 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2466 return VC_ERROR_INVALID_STATE;
2470 if (state != VC_STATE_INITIALIZED) {
2471 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set speech detected callback : Current state is not 'Initialized'");
2472 return VC_ERROR_INVALID_STATE;
2475 vc_mgr_client_set_speech_detected_cb(g_vc_m, callback, user_data);
2477 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set speech detected callback");
2481 int vc_mgr_unset_speech_detected_cb()
2484 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2485 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2486 return VC_ERROR_INVALID_STATE;
2490 if (state != VC_STATE_INITIALIZED) {
2491 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2492 return VC_ERROR_INVALID_STATE;
2495 vc_mgr_client_set_speech_detected_cb(g_vc_m, NULL, NULL);
2499 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2501 if (NULL == callback)
2502 return VC_ERROR_INVALID_PARAMETER;
2505 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2506 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2507 return VC_ERROR_INVALID_STATE;
2511 if (state != VC_STATE_INITIALIZED) {
2512 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : Current state is not 'Initialized'");
2513 return VC_ERROR_INVALID_STATE;
2516 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, callback, user_data);
2518 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set current language changed callback");
2522 int vc_mgr_unset_current_language_changed_cb()
2525 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2526 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2527 return VC_ERROR_INVALID_STATE;
2531 if (state != VC_STATE_INITIALIZED) {
2532 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2533 return VC_ERROR_INVALID_STATE;
2536 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, NULL, NULL);
2541 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2543 if (NULL == callback)
2544 return VC_ERROR_INVALID_PARAMETER;
2547 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2548 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2549 return VC_ERROR_INVALID_STATE;
2553 if (state != VC_STATE_INITIALIZED) {
2554 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2555 return VC_ERROR_INVALID_STATE;
2558 vc_mgr_client_set_error_cb(g_vc_m, callback, user_data);
2563 int vc_mgr_unset_error_cb()
2566 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2567 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2568 return VC_ERROR_INVALID_STATE;
2572 if (state != VC_STATE_INITIALIZED) {
2573 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2574 return VC_ERROR_INVALID_STATE;
2577 vc_mgr_client_set_error_cb(g_vc_m, NULL, NULL);
2582 int __vc_mgr_cb_dialog(int pid, const char* disp_text, const char* utt_text, bool continuous)
2584 vc_mgr_dialog_request_cb callback = NULL;
2585 void* user_data = NULL;
2587 vc_mgr_client_get_dialog_request_cb(g_vc_m, &callback, &user_data);
2589 if (NULL != callback) {
2590 vc_mgr_client_use_callback(g_vc_m);
2591 callback(pid, disp_text, utt_text, continuous, user_data);
2592 vc_mgr_client_not_use_callback(g_vc_m);
2593 SLOG(LOG_DEBUG, TAG_VCM, "Dialog callback is called");
2595 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2601 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2603 if (NULL == callback)
2604 return VC_ERROR_INVALID_PARAMETER;
2607 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2608 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2609 return VC_ERROR_INVALID_STATE;
2613 if (state != VC_STATE_INITIALIZED) {
2614 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2615 return VC_ERROR_INVALID_STATE;
2618 vc_mgr_client_set_dialog_request_cb(g_vc_m, callback, user_data);
2623 int vc_mgr_unset_dialog_request_cb()
2626 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2627 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2628 return VC_ERROR_INVALID_STATE;
2632 if (state != VC_STATE_INITIALIZED) {
2633 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2634 return VC_ERROR_INVALID_STATE;
2637 vc_mgr_client_set_dialog_request_cb(g_vc_m, NULL, NULL);
2642 static bool __vc_mgr_check_demandable_client(int pid)
2644 if (0 == g_slist_length(g_demandable_client_list)) {
2645 SLOG(LOG_WARN, TAG_VCM, "[WARNING] No demandable clients");
2649 char appid[128] = {'\0', };
2650 aul_app_get_appid_bypid(pid, appid, sizeof(appid));
2652 if (0 >= strlen(appid)) {
2653 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No appid");
2656 SLOG(LOG_DEBUG, TAG_VCM, "[CHECK] Appid - %s", appid);
2658 GSList *iter = NULL;
2659 vc_demandable_client_s* temp_client;
2660 iter = g_slist_nth(g_demandable_client_list, 0);
2662 while (NULL != iter) {
2663 temp_client = iter->data;
2665 if (NULL != temp_client) {
2666 if (NULL != temp_client->appid) {
2667 if (!strcmp(temp_client->appid, appid)) {
2668 SLOG(LOG_DEBUG, TAG_VCM, "pid(%d) is available", pid);
2674 iter = g_slist_next(iter);
2681 int __vc_mgr_request_auth_enable(int pid)
2683 if (false == __vc_mgr_check_demandable_client(pid)) {
2684 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not demandable client");
2685 return VC_ERROR_INVALID_PARAMETER;
2688 /* check already authorized */
2689 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2690 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already authorized");
2691 return VC_ERROR_INVALID_PARAMETER;
2694 /* add authorized list */
2695 if (0 != vc_mgr_client_add_authorized_client(g_vc_m, pid)) {
2696 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add authorized client");
2697 return VC_ERROR_OPERATION_FAILED;
2700 /* foreground check */
2702 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fore_pid)) {
2703 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get foreground");
2704 return VC_ERROR_OPERATION_FAILED;
2707 if (pid == fore_pid) {
2708 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
2714 int __vc_mgr_request_auth_disable(int pid)
2716 /* check authorized */
2717 if (false == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2718 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No authorized");
2719 return VC_ERROR_INVALID_PARAMETER;
2722 /* remove authorized list */
2723 if (0 != vc_mgr_client_remove_authorized_client(g_vc_m, pid)) {
2724 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to remove authorized client");
2725 return VC_ERROR_OPERATION_FAILED;
2728 /* check authority valid */
2729 if (true == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2730 SLOG(LOG_DEBUG, TAG_VCM, "Valid authorized client is removed");
2731 if (0 != vc_mgr_client_set_valid_authorized_client(g_vc_m, -1)) {
2732 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set valid authorized client");
2733 return VC_ERROR_OPERATION_FAILED;
2740 static Eina_Bool __request_auth_start(void* data)
2742 SLOG(LOG_DEBUG, TAG_VCM, "Request Start");
2744 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, true)) {
2745 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2748 if (0 != vc_mgr_start(false)) {
2749 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request start is failed");
2750 /* TODO - Error handling? */
2753 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, false)) {
2754 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2761 int __vc_mgr_request_auth_start(int pid)
2763 /* check authorized */
2764 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2765 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2766 return VC_ERROR_INVALID_PARAMETER;
2769 /* add timer for start recording */
2770 ecore_timer_add(0, __request_auth_start, NULL);
2775 static Eina_Bool __request_auth_stop(void* data)
2777 SLOG(LOG_DEBUG, TAG_VCM, "Request Stop");
2779 if (0 != vc_mgr_stop()) {
2780 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request stop is failed");
2781 /* TODO - Error handling? */
2787 int __vc_mgr_request_auth_stop(int pid)
2789 /* check authorized */
2790 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2791 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2792 return VC_ERROR_INVALID_PARAMETER;
2795 /* add timer for start recording */
2796 ecore_timer_add(0, __request_auth_stop, NULL);
2801 static Eina_Bool __request_auth_cancel(void* data)
2803 SLOG(LOG_DEBUG, TAG_VCM, "Request Cancel");
2805 if (0 != vc_mgr_cancel()) {
2806 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request cancel is failed");
2807 /* TODO - Error handling? */
2813 int __vc_mgr_request_auth_cancel(int pid)
2815 /* check authorized */
2816 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2817 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2818 return VC_ERROR_INVALID_PARAMETER;
2821 /* add timer for start recording */
2822 ecore_timer_add(0, __request_auth_cancel, NULL);