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 Ecore_Timer* g_m_set_volume_timer = NULL;
42 static vc_h g_vc_m = NULL;
44 static GSList* g_demandable_client_list = NULL;
46 static float g_volume_db = 0;
48 static float g_prev_volume_db = 0;
50 static float g_cur_volume_db = 0;
52 static int g_daemon_pid = 0;
54 static int g_feature_enabled = -1;
56 static bool g_err_callback_status = false;
58 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
59 static Eina_Bool __vc_mgr_notify_error(void *data);
60 static Eina_Bool __vc_mgr_notify_result(void *data);
62 static const char* __vc_mgr_get_error_code(vc_error_e err)
65 case VC_ERROR_NONE: return "VC_ERROR_NONE";
66 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
67 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
68 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
69 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
70 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
71 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
72 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
73 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
74 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
75 default: return "Invalid error code";
80 static void __vc_mgr_lang_changed_cb(const char* before_lang, const char* current_lang)
82 SLOG(LOG_DEBUG, TAG_VCM, "Lang changed : Before lang(%s) Current lang(%s)",
83 before_lang, current_lang);
85 vc_current_language_changed_cb callback = NULL;
87 vc_mgr_client_get_current_lang_changed_cb(g_vc_m, &callback, &lang_user_data);
89 if (NULL != callback) {
90 vc_mgr_client_use_callback(g_vc_m);
91 callback(before_lang, current_lang, lang_user_data);
92 vc_mgr_client_not_use_callback(g_vc_m);
93 SLOG(LOG_DEBUG, TAG_VCM, "Language changed callback is called");
95 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
101 static int __vc_mgr_get_feature_enabled()
103 if (0 == g_feature_enabled) {
104 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
105 return VC_ERROR_NOT_SUPPORTED;
106 } else if (-1 == g_feature_enabled) {
107 bool vc_supported = false;
108 bool mic_supported = false;
109 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
110 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
111 if (false == vc_supported || false == mic_supported) {
112 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
113 g_feature_enabled = 0;
114 return VC_ERROR_NOT_SUPPORTED;
117 g_feature_enabled = 1;
125 int vc_mgr_initialize()
127 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Initialize");
130 if (0 != __vc_mgr_get_feature_enabled()) {
131 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] not supported");
132 return VC_ERROR_NOT_SUPPORTED;
136 if (true == vc_mgr_client_is_valid(g_vc_m)) {
137 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
138 return VC_ERROR_NONE;
141 if (0 != vc_mgr_dbus_open_connection()) {
142 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open connection");
143 return VC_ERROR_OPERATION_FAILED;
146 if (0 != vc_mgr_client_create(&g_vc_m)) {
147 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
148 return VC_ERROR_OUT_OF_MEMORY;
151 int ret = vc_config_mgr_initialize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
153 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
154 vc_mgr_client_destroy(g_vc_m);
155 return VC_ERROR_OPERATION_FAILED;
158 ret = vc_config_mgr_set_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
160 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
161 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
162 vc_mgr_client_destroy(g_vc_m);
163 return VC_ERROR_OPERATION_FAILED;
166 ret = vc_db_initialize();
168 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
169 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
170 vc_mgr_client_destroy(g_vc_m);
174 SLOG(LOG_DEBUG, TAG_VCM, "[Success] pid(%d)", g_vc_m->handle);
176 SLOG(LOG_DEBUG, TAG_VCM, "=====");
177 SLOG(LOG_DEBUG, TAG_VCM, " ");
179 return VC_ERROR_NONE;
182 static void __vc_mgr_internal_unprepare()
184 int ret = vc_mgr_dbus_request_finalize(g_vc_m->handle);
186 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
189 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
193 int vc_mgr_deinitialize()
195 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Deinitialize");
197 if (false == vc_mgr_client_is_valid(g_vc_m)) {
198 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
199 SLOG(LOG_DEBUG, TAG_VCM, "=====");
200 SLOG(LOG_DEBUG, TAG_VCM, " ");
201 return VC_ERROR_INVALID_STATE;
205 vc_mgr_client_get_client_state(g_vc_m, &state);
210 __vc_mgr_internal_unprepare();
211 /* no break. need to next step*/
212 case VC_STATE_INITIALIZED:
213 if (NULL != g_m_connect_timer) {
214 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
215 ecore_timer_del(g_m_connect_timer);
218 vc_config_mgr_unset_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
219 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
221 /* Free client resources */
222 vc_mgr_client_destroy(g_vc_m);
229 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
231 int cnt = VC_COMMAND_TYPE_FOREGROUND;
233 int ret = vc_cmd_parser_delete_file(getpid(), cnt);
235 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
236 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
238 int ret = vc_db_finalize();
240 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
243 if (0 != vc_mgr_dbus_close_connection()) {
244 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
247 SLOG(LOG_DEBUG, TAG_VCM, "=====");
248 SLOG(LOG_DEBUG, TAG_VCM, " ");
250 return VC_ERROR_NONE;
253 static Eina_Bool __vc_mgr_connect_daemon(void *data)
255 /* request initialization */
257 int service_state = 0;
258 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
260 g_m_connect_timer = NULL;
262 ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, &service_state, &foreground, &g_daemon_pid);
264 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
265 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
267 vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND);
268 ecore_timer_add(0, __vc_mgr_notify_error, g_vc_m);
270 SLOG(LOG_DEBUG, TAG_VCM, "=====");
271 SLOG(LOG_DEBUG, TAG_VCM, " ");
274 } else if (0 != ret) {
275 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
278 /* Success to connect */
281 /* Set service state */
282 vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state);
285 vc_mgr_client_set_foreground(g_vc_m, foreground, true);
287 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Connected daemon");
289 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY);
291 vc_state_changed_cb changed_callback = NULL;
292 void* user_data = NULL;
294 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
296 vc_state_e current_state;
297 vc_state_e before_state;
299 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
301 if (NULL != changed_callback) {
302 vc_mgr_client_use_callback(g_vc_m);
303 changed_callback(before_state, current_state, user_data);
304 vc_mgr_client_not_use_callback(g_vc_m);
305 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
307 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
310 SLOG(LOG_DEBUG, TAG_VCM, "=====");
311 SLOG(LOG_DEBUG, TAG_VCM, " ");
316 static Eina_Bool __vc_mgr_prepare_daemon(void *data)
319 if (0 != vc_mgr_dbus_request_hello()) {
323 g_m_connect_timer = NULL;
324 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
326 g_m_connect_timer = ecore_idler_add(__vc_mgr_connect_daemon, data);
333 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Prepare");
336 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
337 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
338 SLOG(LOG_DEBUG, TAG_VCM, "=====");
339 SLOG(LOG_DEBUG, TAG_VCM, " ");
340 return VC_ERROR_INVALID_STATE;
344 if (state != VC_STATE_INITIALIZED) {
345 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'CREATED'");
346 SLOG(LOG_DEBUG, TAG_VCM, "=====");
347 SLOG(LOG_DEBUG, TAG_VCM, " ");
348 return VC_ERROR_INVALID_STATE;
351 g_m_connect_timer = ecore_timer_add(0, __vc_mgr_prepare_daemon, NULL);
353 SLOG(LOG_DEBUG, TAG_VCM, "=====");
354 SLOG(LOG_DEBUG, TAG_VCM, " ");
356 return VC_ERROR_NONE;
359 int vc_mgr_unprepare()
361 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unprepare");
364 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
365 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
366 SLOG(LOG_DEBUG, TAG_VCM, "=====");
367 SLOG(LOG_DEBUG, TAG_VCM, " ");
368 return VC_ERROR_INVALID_STATE;
372 if (state != VC_STATE_READY) {
373 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
374 SLOG(LOG_DEBUG, TAG_VCM, "=====");
375 SLOG(LOG_DEBUG, TAG_VCM, " ");
376 return VC_ERROR_INVALID_STATE;
379 __vc_mgr_internal_unprepare();
381 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
382 ecore_timer_add(0, __vc_mgr_notify_state_changed, g_vc_m);
384 SLOG(LOG_DEBUG, TAG_VCM, "=====");
385 SLOG(LOG_DEBUG, TAG_VCM, " ");
387 return VC_ERROR_NONE;
390 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
392 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach Supported Language");
394 if (NULL == callback) {
395 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
396 SLOG(LOG_DEBUG, TAG_VCM, "=====");
397 SLOG(LOG_DEBUG, TAG_VCM, " ");
398 return VC_ERROR_INVALID_PARAMETER;
402 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
403 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
404 SLOG(LOG_DEBUG, TAG_VCM, "=====");
405 SLOG(LOG_DEBUG, TAG_VCM, " ");
406 return VC_ERROR_INVALID_STATE;
410 ret = vc_config_mgr_get_language_list(callback, user_data);
412 ret = vc_config_convert_error_code((vc_config_error_e)ret);
413 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
416 SLOG(LOG_DEBUG, TAG_VCM, "=====");
417 SLOG(LOG_DEBUG, TAG_VCM, " ");
419 return VC_ERROR_NONE;
422 int vc_mgr_get_current_language(char** language)
424 if (NULL == language) {
425 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
426 return VC_ERROR_INVALID_PARAMETER;
430 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
431 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
432 return VC_ERROR_INVALID_STATE;
436 ret = vc_config_mgr_get_default_language(language);
438 ret = vc_config_convert_error_code((vc_config_error_e)ret);
439 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
441 SLOG(LOG_DEBUG, TAG_VCM, "[Get current language] language : %s", *language);
447 int vc_mgr_get_state(vc_state_e* state)
449 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get State");
452 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
453 return VC_ERROR_INVALID_PARAMETER;
457 if (0 != vc_mgr_client_get_client_state(g_vc_m, &temp)) {
458 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
459 SLOG(LOG_DEBUG, TAG_VCM, "=====");
460 SLOG(LOG_DEBUG, TAG_VCM, " ");
461 return VC_ERROR_INVALID_STATE;
467 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'None'"); break;
468 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Created'"); break;
469 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Ready'"); break;
470 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
473 SLOG(LOG_DEBUG, TAG_VCM, "=====");
474 SLOG(LOG_DEBUG, TAG_VCM, " ");
476 return VC_ERROR_NONE;
479 int vc_mgr_get_service_state(vc_service_state_e* state)
481 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get Service State");
484 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
485 return VC_ERROR_INVALID_PARAMETER;
488 vc_state_e client_state;
489 if (0 != vc_mgr_client_get_client_state(g_vc_m, &client_state)) {
490 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
491 return VC_ERROR_INVALID_STATE;
495 if (client_state != VC_STATE_READY) {
496 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
497 return VC_ERROR_INVALID_STATE;
500 /* get service state */
501 vc_service_state_e service_state;
502 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
503 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
504 return VC_ERROR_OPERATION_FAILED;
507 *state = service_state;
510 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
511 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
512 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
513 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
514 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
517 SLOG(LOG_DEBUG, TAG_VCM, "=====");
518 SLOG(LOG_DEBUG, TAG_VCM, " ");
520 return VC_ERROR_NONE;
523 int vc_mgr_set_demandable_client_rule(const char* rule)
525 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Demandable client rule");
528 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
529 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
530 SLOG(LOG_DEBUG, TAG_VCM, "=====");
531 SLOG(LOG_DEBUG, TAG_VCM, " ");
532 return VC_ERROR_INVALID_STATE;
536 if (state != VC_STATE_READY) {
537 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
538 SLOG(LOG_DEBUG, TAG_VCM, "=====");
539 SLOG(LOG_DEBUG, TAG_VCM, " ");
540 return VC_ERROR_INVALID_STATE;
544 ret = vc_info_parser_set_demandable_client(rule);
546 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] rule is NOT valid");
547 SLOG(LOG_DEBUG, TAG_VCM, "=====");
548 SLOG(LOG_DEBUG, TAG_VCM, " ");
549 return VC_ERROR_INVALID_PARAMETER;
552 if (0 != vc_info_parser_get_demandable_clients(&g_demandable_client_list)) {
553 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get demandable clients");
554 return VC_ERROR_OPERATION_FAILED;
557 SLOG(LOG_DEBUG, TAG_VCM, "=====");
558 SLOG(LOG_DEBUG, TAG_VCM, " ");
566 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
568 if (VC_ERROR_TIMED_OUT != ret) {
569 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set client rule to daemon : %s", __vc_mgr_get_error_code(ret));
572 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set client rule : %s", __vc_mgr_get_error_code(ret));
575 if (VC_RETRY_COUNT == count) {
576 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
583 SLOG(LOG_DEBUG, TAG_VCM, "=====");
584 SLOG(LOG_DEBUG, TAG_VCM, " ");
590 int vc_mgr_unset_demandable_client_rule()
592 vc_info_parser_set_demandable_client(NULL);
597 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
599 if (VC_ERROR_TIMED_OUT != ret) {
600 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
603 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset client rule : %s", __vc_mgr_get_error_code(ret));
606 if (VC_RETRY_COUNT == count) {
607 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
617 int vc_mgr_is_command_format_supported(vc_cmd_format_e format, bool* support)
619 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Is command type supported");
622 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
623 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
624 SLOG(LOG_DEBUG, TAG_VCM, "=====");
625 SLOG(LOG_DEBUG, TAG_VCM, " ");
626 return VC_ERROR_INVALID_STATE;
630 bool non_fixed_support = false;
631 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
632 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
636 case VC_CMD_FORMAT_FIXED: *support = true; break;
637 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
638 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
639 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
640 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
641 default: *support = false; break;
644 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
646 SLOG(LOG_DEBUG, TAG_VCM, "=====");
647 SLOG(LOG_DEBUG, TAG_VCM, " ");
649 return VC_ERROR_NONE;
652 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
654 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list");
657 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
658 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
659 SLOG(LOG_DEBUG, TAG_VCM, "=====");
660 SLOG(LOG_DEBUG, TAG_VCM, " ");
661 return VC_ERROR_INVALID_STATE;
665 if (state != VC_STATE_READY) {
666 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
667 SLOG(LOG_DEBUG, TAG_VCM, "=====");
668 SLOG(LOG_DEBUG, TAG_VCM, " ");
669 return VC_ERROR_INVALID_STATE;
672 /* Check service state */
673 vc_service_state_e service_state = -1;
674 vc_mgr_client_get_service_state(g_vc_m, &service_state);
675 if (service_state != VC_SERVICE_STATE_READY) {
676 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
677 SLOG(LOG_DEBUG, TAG_VCM, "=====");
678 SLOG(LOG_DEBUG, TAG_VCM, " ");
679 return VC_ERROR_INVALID_STATE;
682 vc_cmd_list_s* list = NULL;
683 list = (vc_cmd_list_s*)vc_cmd_list;
687 bool success_save = false;
688 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
689 ret = vc_cmd_parser_delete_file(getpid(), i);
691 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
693 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
695 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
697 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
702 if (true != success_save) {
703 ret = VC_ERROR_INVALID_PARAMETER;
704 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
708 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
710 if (VC_ERROR_TIMED_OUT != ret) {
711 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
714 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
717 if (VC_RETRY_COUNT == count) {
718 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
726 SLOG(LOG_DEBUG, TAG_VCM, "=====");
727 SLOG(LOG_DEBUG, TAG_VCM, " ");
732 int vc_mgr_unset_command_list()
734 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unset Command list");
737 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
738 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
739 return VC_ERROR_INVALID_STATE;
743 if (state != VC_STATE_READY) {
744 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
745 return VC_ERROR_INVALID_STATE;
751 ret = vc_mgr_dbus_request_unset_command(g_vc_m->handle);
753 if (VC_ERROR_TIMED_OUT != ret) {
754 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
757 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset command : %s", __vc_mgr_get_error_code(ret));
760 if (VC_RETRY_COUNT == count) {
761 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
769 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
770 ret = vc_cmd_parser_delete_file(getpid(), i);
772 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
775 SLOG(LOG_DEBUG, TAG_VCM, "=====");
776 SLOG(LOG_DEBUG, TAG_VCM, " ");
781 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
783 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list from file");
785 if (NULL == file_path) {
786 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter!!");
787 return VC_ERROR_INVALID_PARAMETER;
789 SLOG(LOG_DEBUG, TAG_VCM, "===== File path: %s", file_path);
793 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
794 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
795 SLOG(LOG_DEBUG, TAG_VCC, "=====");
796 SLOG(LOG_DEBUG, TAG_VCC, " ");
797 return VC_ERROR_INVALID_PARAMETER;
801 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
802 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
803 return VC_ERROR_INVALID_STATE;
807 if (state != VC_STATE_READY) {
808 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
809 return VC_ERROR_INVALID_STATE;
812 /* Check service state */
813 vc_service_state_e service_state = -1;
814 vc_mgr_client_get_service_state(g_vc_m, &service_state);
815 if (service_state != VC_SERVICE_STATE_READY) {
816 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
817 return VC_ERROR_INVALID_STATE;
820 int ret = vc_cmd_parser_delete_file(getpid(), type);
822 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
824 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
825 ret = VC_ERROR_INVALID_PARAMETER;
826 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
830 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
832 if (VC_ERROR_TIMED_OUT != ret) {
833 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
836 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
839 if (VC_RETRY_COUNT == count) {
840 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
848 SLOG(LOG_DEBUG, TAG_VCM, "=====");
849 SLOG(LOG_DEBUG, TAG_VCM, " ");
854 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
856 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set preloaded command list");
859 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
860 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
861 return VC_ERROR_INVALID_STATE;
865 if (state != VC_STATE_READY) {
866 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
867 return VC_ERROR_INVALID_STATE;
870 /* Check service state */
871 vc_service_state_e service_state = -1;
872 vc_mgr_client_get_service_state(g_vc_m, &service_state);
873 if (service_state != VC_SERVICE_STATE_READY) {
874 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
875 return VC_ERROR_INVALID_STATE;
878 /* Only support to set background commands for preloaded application */
879 int ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
881 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
883 SLOG(LOG_DEBUG, TAG_VCM, "=====");
884 SLOG(LOG_DEBUG, TAG_VCM, " ");
888 int vc_mgr_set_audio_type(const char* audio_id)
890 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set audio type");
892 if (NULL == audio_id) {
893 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
894 return VC_ERROR_INVALID_PARAMETER;
898 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
899 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
900 SLOG(LOG_DEBUG, TAG_VCM, "=====");
901 SLOG(LOG_DEBUG, TAG_VCM, " ");
902 return VC_ERROR_INVALID_STATE;
906 if (state != VC_STATE_READY) {
907 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
908 SLOG(LOG_DEBUG, TAG_VCM, "=====");
909 SLOG(LOG_DEBUG, TAG_VCM, " ");
910 return VC_ERROR_INVALID_STATE;
913 /* Check service state */
914 vc_service_state_e service_state = -1;
915 vc_mgr_client_get_service_state(g_vc_m, &service_state);
916 if (service_state != VC_SERVICE_STATE_READY) {
917 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
918 SLOG(LOG_DEBUG, TAG_VCM, "=====");
919 SLOG(LOG_DEBUG, TAG_VCM, " ");
920 return VC_ERROR_INVALID_STATE;
930 ret = vc_mgr_dbus_request_set_audio_type(g_vc_m->handle, audio_id);
932 if (VC_ERROR_TIMED_OUT != ret) {
933 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
936 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set audio type : %s", __vc_mgr_get_error_code(ret));
939 if (VC_RETRY_COUNT == count) {
940 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
945 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio type");
947 vc_mgr_client_set_audio_type(g_vc_m, audio_id);
951 SLOG(LOG_DEBUG, TAG_VCM, "=====");
952 SLOG(LOG_DEBUG, TAG_VCM, " ");
957 int vc_mgr_get_audio_type(char** audio_id)
959 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get audio type");
961 if (NULL == audio_id) {
962 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
963 return VC_ERROR_INVALID_PARAMETER;
967 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
968 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
969 SLOG(LOG_DEBUG, TAG_VCM, "=====");
970 SLOG(LOG_DEBUG, TAG_VCM, " ");
971 return VC_ERROR_INVALID_STATE;
975 if (state != VC_STATE_READY) {
976 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
977 SLOG(LOG_DEBUG, TAG_VCM, "=====");
978 SLOG(LOG_DEBUG, TAG_VCM, " ");
979 return VC_ERROR_INVALID_STATE;
982 /* Check service state */
983 vc_service_state_e service_state = -1;
984 vc_mgr_client_get_service_state(g_vc_m, &service_state);
985 if (service_state != VC_SERVICE_STATE_READY) {
986 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
987 SLOG(LOG_DEBUG, TAG_VCM, "=====");
988 SLOG(LOG_DEBUG, TAG_VCM, " ");
989 return VC_ERROR_INVALID_STATE;
994 vc_mgr_client_get_audio_type(g_vc_m, &temp);
997 /* Not initiallized */
1001 ret = vc_mgr_dbus_request_get_audio_type(g_vc_m->handle, &temp);
1003 if (VC_ERROR_TIMED_OUT != ret) {
1004 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1007 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to get audio type : %s", __vc_mgr_get_error_code(ret));
1010 if (VC_RETRY_COUNT == count) {
1011 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1016 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1018 vc_mgr_client_set_audio_type(g_vc_m, temp);
1024 *audio_id = strdup(temp);
1032 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1034 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach current commands");
1037 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1038 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1039 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1040 SLOG(LOG_DEBUG, TAG_VCM, " ");
1041 return VC_ERROR_INVALID_STATE;
1045 if (state != VC_STATE_READY) {
1046 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1047 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1048 SLOG(LOG_DEBUG, TAG_VCM, " ");
1049 return VC_ERROR_INVALID_STATE;
1052 /* Check service state */
1053 vc_service_state_e service_state = -1;
1054 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1055 if (service_state != VC_SERVICE_STATE_READY) {
1056 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1057 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1058 SLOG(LOG_DEBUG, TAG_VCM, " ");
1059 return VC_ERROR_INVALID_STATE;
1062 if (NULL == vc_cmd_list) {
1063 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid Parameter");
1064 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1065 SLOG(LOG_DEBUG, TAG_VCM, " ");
1066 return VC_ERROR_INVALID_PARAMETER;
1069 vc_cmd_list_h temp_list = NULL;
1070 if (0 != vc_cmd_list_create(&temp_list)) {
1071 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1072 return VC_ERROR_INVALID_PARAMETER;
1075 *vc_cmd_list = temp_list;
1082 /* Get foreground pid */
1083 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fg_pid)) {
1084 /* There is no foreground app for voice control */
1085 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1087 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1090 if (0 != vc_mgr_client_get_pid(g_vc_m, &mgr_pid)) {
1091 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Fail to get manager pid");
1092 return VC_ERROR_OPERATION_FAILED;
1094 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1097 /* Get system command */
1098 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1100 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No system commands");
1107 ret = vc_mgr_dbus_request_set_client_info(g_vc_m->handle);
1109 if (VC_ERROR_TIMED_OUT != ret) {
1110 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1113 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set client info : %s", __vc_mgr_get_error_code(ret));
1116 if (VC_RETRY_COUNT == count) {
1117 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1122 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set client info");
1126 GSList *iter = NULL;
1127 GSList* client_info_list = NULL;
1128 vc_client_info_s *client_info = NULL;
1129 bool is_fgpid = false;
1131 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1132 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] No client");
1136 if (VC_NO_FOREGROUND_PID != fg_pid) {
1137 iter = g_slist_nth(client_info_list, 0);
1138 while (NULL != iter) {
1139 client_info = iter->data;
1140 if (NULL != client_info) {
1141 if (fg_pid == client_info->pid) {
1146 iter = g_slist_next(iter);
1150 /* Get foreground commands and widget */
1151 if (true == is_fgpid) {
1153 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1155 /* Get foreground command */
1156 if (true == client_info->fg_cmd) {
1157 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1159 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1162 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground commands");
1165 /* Check exclusive option */
1166 if (true == client_info->exclusive_cmd) {
1167 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Exclusive command is ON");
1169 /* Set background command for exclusive option */
1170 if (true == client_info->bg_cmd) {
1171 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Set background command");
1172 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1174 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1178 /* need to release client info */
1179 iter = g_slist_nth(client_info_list, 0);
1181 while (NULL != iter) {
1182 client_info = iter->data;
1183 if (NULL != client_info) {
1186 client_info_list = g_slist_remove_link(client_info_list, iter);
1187 iter = g_slist_nth(client_info_list, 0);
1190 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1191 SLOG(LOG_DEBUG, TAG_VCM, " ");
1196 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground app");
1199 /* Get background commands */
1200 if (0 < g_slist_length(client_info_list)) {
1201 iter = g_slist_nth(client_info_list, 0);
1203 while (NULL != iter) {
1204 client_info = iter->data;
1206 if (NULL != client_info) {
1207 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1208 if (true == client_info->bg_cmd) {
1209 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1211 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1216 client_info_list = g_slist_remove_link(client_info_list, iter);
1218 iter = g_slist_nth(client_info_list, 0);
1222 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No background commands");
1225 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1226 SLOG(LOG_DEBUG, TAG_VCM, " ");
1231 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1233 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set recognition mode = %d", mode);
1236 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1237 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1238 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1239 SLOG(LOG_DEBUG, TAG_VCM, " ");
1240 return VC_ERROR_INVALID_STATE;
1244 if (state != VC_STATE_READY) {
1245 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1246 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1247 SLOG(LOG_DEBUG, TAG_VCM, " ");
1248 return VC_ERROR_INVALID_STATE;
1251 /* Check service state */
1252 vc_service_state_e service_state = -1;
1253 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1254 if (service_state != VC_SERVICE_STATE_READY) {
1255 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1256 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1257 SLOG(LOG_DEBUG, TAG_VCM, " ");
1258 return VC_ERROR_INVALID_STATE;
1261 vc_mgr_client_set_recognition_mode(g_vc_m, mode);
1265 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1269 ret = vc_mgr_client_get_recognition_mode(g_vc_m, mode);
1271 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1275 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get recognition mode = %d", *mode);
1279 int vc_mgr_set_private_data(const char* key, const char* data)
1281 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set private data");
1284 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1285 return VC_ERROR_INVALID_PARAMETER;
1289 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1290 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1291 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1292 SLOG(LOG_DEBUG, TAG_VCM, " ");
1293 return VC_ERROR_INVALID_STATE;
1297 if (state != VC_STATE_READY) {
1298 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1299 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1300 SLOG(LOG_DEBUG, TAG_VCM, " ");
1301 return VC_ERROR_INVALID_STATE;
1304 /* Check service state */
1305 vc_service_state_e service_state = -1;
1306 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1307 if (service_state != VC_SERVICE_STATE_READY) {
1308 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1309 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1310 SLOG(LOG_DEBUG, TAG_VCM, " ");
1311 return VC_ERROR_INVALID_STATE;
1317 ret = vc_mgr_dbus_request_set_private_data(g_vc_m->handle, key, data);
1319 if (VC_ERROR_TIMED_OUT != ret) {
1320 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to set private data request : %s", __vc_mgr_get_error_code(ret));
1323 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry set private data request : %s", __vc_mgr_get_error_code(ret));
1326 if (VC_RETRY_COUNT == count) {
1327 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1332 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set domain");
1335 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1336 SLOG(LOG_DEBUG, TAG_VCM, " ");
1341 int vc_mgr_get_private_data(const char* key, char** data)
1343 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get private data");
1345 if (NULL == key || NULL == data) {
1346 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1347 return VC_ERROR_INVALID_PARAMETER;
1351 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1352 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1353 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1354 SLOG(LOG_DEBUG, TAG_VCM, " ");
1355 return VC_ERROR_INVALID_STATE;
1359 if (state != VC_STATE_READY) {
1360 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1361 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1362 SLOG(LOG_DEBUG, TAG_VCM, " ");
1363 return VC_ERROR_INVALID_STATE;
1366 /* Check service state */
1367 vc_service_state_e service_state = -1;
1368 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1369 if (service_state != VC_SERVICE_STATE_READY) {
1370 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1371 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1372 SLOG(LOG_DEBUG, TAG_VCM, " ");
1373 return VC_ERROR_INVALID_STATE;
1381 ret = vc_mgr_dbus_request_get_private_data(g_vc_m->handle, key, &temp);
1383 if (VC_ERROR_TIMED_OUT != ret) {
1384 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1387 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry get private data request : %s", __vc_mgr_get_error_code(ret));
1390 if (VC_RETRY_COUNT == count) {
1391 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1396 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1401 *data = strdup(temp);
1406 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1407 SLOG(LOG_DEBUG, TAG_VCM, " ");
1412 int vc_mgr_set_domain(const char* domain)
1414 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set domain");
1416 if (NULL == domain) {
1417 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1418 return VC_ERROR_INVALID_PARAMETER;
1422 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1423 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1424 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1425 SLOG(LOG_DEBUG, TAG_VCM, " ");
1426 return VC_ERROR_INVALID_STATE;
1430 if (state != VC_STATE_READY) {
1431 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1432 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1433 SLOG(LOG_DEBUG, TAG_VCM, " ");
1434 return VC_ERROR_INVALID_STATE;
1437 /* Check service state */
1438 vc_service_state_e service_state = -1;
1439 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1440 if (service_state != VC_SERVICE_STATE_READY) {
1441 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1442 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1443 SLOG(LOG_DEBUG, TAG_VCM, " ");
1444 return VC_ERROR_INVALID_STATE;
1450 ret = vc_mgr_dbus_request_set_domain(g_vc_m->handle, domain);
1452 if (VC_ERROR_TIMED_OUT != ret) {
1453 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1456 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry set domain request : %s", __vc_mgr_get_error_code(ret));
1459 if (VC_RETRY_COUNT == count) {
1460 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1465 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set domain");
1468 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1469 SLOG(LOG_DEBUG, TAG_VCM, " ");
1474 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1476 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] do action");
1478 if (NULL == send_event) {
1479 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1480 return VC_ERROR_INVALID_PARAMETER;
1484 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1485 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1486 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1487 SLOG(LOG_DEBUG, TAG_VCM, " ");
1488 return VC_ERROR_INVALID_STATE;
1492 if (state != VC_STATE_READY) {
1493 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1494 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1495 SLOG(LOG_DEBUG, TAG_VCM, " ");
1496 return VC_ERROR_INVALID_STATE;
1499 /* Check service state */
1500 vc_service_state_e service_state = -1;
1501 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1502 if (service_state != VC_SERVICE_STATE_READY) {
1503 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1504 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1505 SLOG(LOG_DEBUG, TAG_VCM, " ");
1506 return VC_ERROR_INVALID_STATE;
1512 ret = vc_mgr_dbus_request_do_action(g_vc_m->handle, type, send_event);
1514 if (VC_ERROR_TIMED_OUT != ret) {
1515 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1518 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry do action request : %s", __vc_mgr_get_error_code(ret));
1521 if (VC_RETRY_COUNT == count) {
1522 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1527 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] do action");
1530 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1531 SLOG(LOG_DEBUG, TAG_VCM, " ");
1536 int vc_mgr_start(bool exclusive_command_option)
1538 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request start");
1541 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1542 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1543 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1544 SLOG(LOG_DEBUG, TAG_VCM, " ");
1545 return VC_ERROR_INVALID_STATE;
1549 if (state != VC_STATE_READY) {
1550 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1551 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1552 SLOG(LOG_DEBUG, TAG_VCM, " ");
1553 return VC_ERROR_INVALID_STATE;
1556 /* Check service state */
1557 vc_service_state_e service_state = -1;
1558 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1559 if (service_state != VC_SERVICE_STATE_READY) {
1560 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1561 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1562 SLOG(LOG_DEBUG, TAG_VCM, " ");
1563 return VC_ERROR_INVALID_STATE;
1566 /* Check internal state for async */
1567 vc_internal_state_e internal_state = -1;
1568 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1569 if (internal_state != VC_INTERNAL_STATE_NONE) {
1570 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invaid State : Internal state is NOT none : %d", internal_state);
1571 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1574 vc_mgr_client_set_exclusive_command(g_vc_m, exclusive_command_option);
1576 bool start_by_client = false;
1577 if (0 != vc_mgr_client_get_start_by_client(g_vc_m, &start_by_client)) {
1578 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1583 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1584 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1585 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1592 ret = vc_mgr_dbus_request_start(g_vc_m->handle, (int)recognition_mode, exclusive_command_option, start_by_client);
1594 if (VC_ERROR_TIMED_OUT != ret) {
1595 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1598 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry start request start : %s", __vc_mgr_get_error_code(ret));
1601 if (VC_RETRY_COUNT == count) {
1602 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1603 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1608 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] start recognition");
1609 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STARTING);
1613 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1614 SLOG(LOG_DEBUG, TAG_VCM, " ");
1621 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request stop");
1624 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1625 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1626 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1627 SLOG(LOG_DEBUG, TAG_VCM, " ");
1628 return VC_ERROR_INVALID_STATE;
1632 if (state != VC_STATE_READY) {
1633 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1634 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1635 SLOG(LOG_DEBUG, TAG_VCM, " ");
1636 return VC_ERROR_INVALID_STATE;
1639 /* Check service state */
1640 vc_service_state_e service_state = -1;
1641 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1642 if (service_state != VC_SERVICE_STATE_RECORDING) {
1643 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING'");
1644 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1645 SLOG(LOG_DEBUG, TAG_VCM, " ");
1646 return VC_ERROR_INVALID_STATE;
1649 /* Check internal state for async */
1650 vc_internal_state_e internal_state = -1;
1651 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1652 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1653 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1654 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1655 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1656 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1657 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1658 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1659 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1660 return VC_ERROR_IN_PROGRESS_TO_READY;
1667 ret = vc_mgr_dbus_request_stop(g_vc_m->handle);
1669 if (VC_ERROR_TIMED_OUT != ret) {
1670 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1673 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry stop request : %s", __vc_mgr_get_error_code(ret));
1676 if (VC_RETRY_COUNT == count) {
1677 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1682 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Stop recognition");
1683 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STOPPING);
1687 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1688 SLOG(LOG_DEBUG, TAG_VCM, " ");
1695 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request cancel");
1698 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1699 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1700 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1701 SLOG(LOG_DEBUG, TAG_VCM, " ");
1702 return VC_ERROR_INVALID_STATE;
1706 if (state != VC_STATE_READY) {
1707 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1708 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1709 SLOG(LOG_DEBUG, TAG_VCM, " ");
1710 return VC_ERROR_INVALID_STATE;
1713 /* Check service state */
1714 vc_service_state_e service_state = -1;
1715 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1716 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1717 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1718 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1719 SLOG(LOG_DEBUG, TAG_VCM, " ");
1720 return VC_ERROR_INVALID_STATE;
1723 vc_internal_state_e internal_state = -1;
1724 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1725 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1726 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1727 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1728 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1729 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1730 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1731 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1732 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1733 return VC_ERROR_IN_PROGRESS_TO_READY;
1739 ret = vc_mgr_dbus_request_cancel(g_vc_m->handle);
1741 if (VC_ERROR_TIMED_OUT != ret) {
1742 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1745 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry cancel request : %s", __vc_mgr_get_error_code(ret));
1748 if (VC_RETRY_COUNT == count) {
1749 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1754 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Cancel recognition");
1755 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_CANCELING);
1759 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1761 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1762 SLOG(LOG_DEBUG, TAG_VCM, " ");
1767 static int g_cnt = 0;
1768 static Eina_Bool __vc_mgr_set_volume(void* data)
1771 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5 * g_cnt;
1773 SLOG(LOG_DEBUG, TAG_VCM, "Set volume (%f)(%f)", g_volume_db, g_cur_volume_db);
1775 if (0 == g_cnt % 5) {
1781 int __vc_mgr_cb_set_volume(float volume)
1783 g_prev_volume_db = g_volume_db;
1784 g_cur_volume_db = volume;
1786 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5;
1788 SLOG(LOG_DEBUG, TAG_VCM, "Set volume (%f)(%f)", g_volume_db, g_cur_volume_db);
1790 if (NULL != g_m_set_volume_timer) {
1791 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
1792 ecore_timer_del(g_m_set_volume_timer);
1796 g_m_set_volume_timer = ecore_timer_add(50, __vc_mgr_set_volume, NULL);
1801 int vc_mgr_get_recording_volume(float* volume)
1803 if (NULL == volume) {
1804 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1805 return VC_ERROR_INVALID_PARAMETER;
1808 vc_service_state_e service_state = -1;
1809 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
1810 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1811 return VC_ERROR_INVALID_STATE;
1815 if (VC_SERVICE_STATE_RECORDING != service_state) {
1816 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1817 return VC_ERROR_INVALID_STATE;
1820 *volume = g_volume_db;
1825 int __vc_mgr_cb_set_foreground(int pid, bool value)
1827 vc_mgr_client_set_foreground(g_vc_m, pid, value);
1829 /* get authorized valid app */
1831 if (0 != vc_mgr_client_get_valid_authorized_client(g_vc_m, &tmp_pid)) {
1832 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get authorized valid app");
1833 return VC_ERROR_INVALID_PARAMETER;
1836 if (true == value) {
1837 /* compare & set valid */
1838 if (tmp_pid != pid) {
1839 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1841 /* set authorized valid */
1842 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
1843 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) change to valid", pid);
1844 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
1846 SLOG(LOG_DEBUG, TAG_VCM, "No valid Authority");
1847 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1851 if (tmp_pid == pid) {
1852 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1853 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1860 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1862 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Select result");
1864 /* Do not check state for 'restart continusly' mode */
1866 vc_service_state_e service_state = -1;
1867 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1868 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1869 vc_recognition_mode_e recognition_mode;
1870 vc_mgr_get_recognition_mode(&recognition_mode);
1872 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1873 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continously'");
1874 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1875 SLOG(LOG_DEBUG, TAG_VCM, " ");
1876 return VC_ERROR_INVALID_STATE;
1880 if (NULL != vc_cmd_list) {
1882 char* result_text = NULL;
1884 vc_mgr_client_get_all_result(g_vc_m, &event, &result_text);
1886 vc_info_parser_set_result(result_text, event, NULL, vc_cmd_list, false);
1888 if (NULL != result_text) {
1901 ret = vc_mgr_dbus_send_result_selection(g_vc_m->handle);
1903 if (VC_ERROR_TIMED_OUT != ret) {
1904 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send result selection : %s", __vc_mgr_get_error_code(ret));
1907 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry send result selection : %s", __vc_mgr_get_error_code(ret));
1910 if (VC_RETRY_COUNT == count) {
1911 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1916 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] result selection");
1920 vc_mgr_client_unset_all_result(g_vc_m);
1922 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1923 SLOG(LOG_DEBUG, TAG_VCM, " ");
1928 static Eina_Bool __vc_mgr_set_select_result(void *data)
1930 vc_mgr_set_selected_results(NULL);
1934 static void __vc_mgr_notify_all_result(vc_result_type_e result_type)
1936 char* temp_text = NULL;
1938 char* temp_message = NULL;
1939 vc_cmd_list_h vc_cmd_list = NULL;
1941 vc_mgr_all_result_cb all_callback = NULL;
1942 void* all_user_data = NULL;
1944 vc_mgr_client_get_all_result_cb(g_vc_m, &all_callback, &all_user_data);
1945 if (NULL == all_callback) {
1946 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] All result callback is NULL");
1950 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1951 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
1955 vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command(g_vc_m));
1957 SLOG(LOG_DEBUG, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)",
1958 result_type, temp_text, event, temp_message);
1960 vc_cmd_print_list(vc_cmd_list);
1964 vc_mgr_client_use_callback(g_vc_m);
1965 cb_ret = all_callback(event, vc_cmd_list, temp_text, temp_message, all_user_data);
1966 vc_mgr_client_not_use_callback(g_vc_m);
1968 if (true == vc_mgr_client_get_exclusive_command(g_vc_m)) {
1970 vc_result_cb callback = NULL;
1971 void* user_data = NULL;
1973 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
1974 if (NULL == callback) {
1975 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
1979 vc_mgr_client_use_callback(g_vc_m);
1980 callback(event, vc_cmd_list, temp_text, user_data);
1981 vc_mgr_client_not_use_callback(g_vc_m);
1982 SLOG(LOG_DEBUG, TAG_VCM, "Exclusive result callback called");
1984 /* Release result */
1985 if (NULL != temp_text) free(temp_text);
1988 vc_cmd_list_destroy(vc_cmd_list, true);
1990 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1996 vc_cmd_list_get_count(vc_cmd_list, &count);
1998 vc_mgr_client_set_all_result(g_vc_m, event, temp_text);
1999 if (true == cb_ret) {
2000 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is true");
2001 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2002 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2004 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is false");
2005 /* need to select conflicted result */
2008 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2009 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2011 vc_mgr_client_set_exclusive_command(g_vc_m, false);
2012 vc_mgr_client_unset_all_result(g_vc_m);
2015 /* Release result */
2016 if (NULL != temp_text) {
2022 vc_cmd_list_destroy(vc_cmd_list, true);
2027 static Eina_Bool __vc_mgr_notify_result(void *data)
2029 char* temp_text = NULL;
2031 vc_cmd_list_h vc_cmd_list = NULL;
2033 vc_result_cb callback = NULL;
2034 void* user_data = NULL;
2036 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
2037 if (NULL == callback) {
2038 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
2042 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
2043 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
2047 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
2049 SLOG(LOG_DEBUG, TAG_VCM, "Result : result text(%s) event(%d)", temp_text, event);
2051 vc_cmd_print_list(vc_cmd_list);
2053 vc_mgr_client_use_callback(g_vc_m);
2054 callback(event, vc_cmd_list, temp_text, user_data);
2055 vc_mgr_client_not_use_callback(g_vc_m);
2056 SLOG(LOG_DEBUG, TAG_VCM, "Result callback called");
2058 vc_cmd_list_destroy(vc_cmd_list, true);
2060 /* Release result */
2061 if (NULL != temp_text) free(temp_text);
2066 void __vc_mgr_cb_all_result(vc_result_type_e type)
2068 if (false == vc_mgr_client_get_exclusive_command(g_vc_m)) {
2069 __vc_mgr_notify_all_result(type);
2071 __vc_mgr_notify_result(0);
2077 void __vc_mgr_cb_pre_result(vc_pre_result_event_e event, const char* pre_result)
2079 vc_mgr_pre_result_cb callback = NULL;
2080 void* user_data = NULL;
2082 vc_mgr_client_get_pre_result_cb(g_vc_m, &callback, &user_data);
2083 if (NULL == callback) {
2084 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client pre result callback is NULL");
2088 vc_mgr_client_use_callback(g_vc_m);
2089 callback(event, pre_result, user_data);
2090 vc_mgr_client_not_use_callback(g_vc_m);
2091 SLOG(LOG_DEBUG, TAG_VCM, "Pre result callback is called");
2096 void __vc_mgr_cb_system_result()
2098 __vc_mgr_notify_result(NULL);
2102 static Eina_Bool __vc_mgr_speech_detected(void *data)
2104 vc_mgr_begin_speech_detected_cb callback = NULL;
2105 void* user_data = NULL;
2107 vc_mgr_client_get_speech_detected_cb(g_vc_m, &callback, &user_data);
2108 if (NULL == callback) {
2109 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
2113 vc_mgr_client_use_callback(g_vc_m);
2114 callback(user_data);
2115 vc_mgr_client_not_use_callback(g_vc_m);
2116 SLOG(LOG_DEBUG, TAG_VCM, "Speech detected callback called");
2121 void __vc_mgr_cb_speech_detected()
2123 __vc_mgr_speech_detected(NULL);
2128 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
2130 if (NULL == callback)
2131 return VC_ERROR_INVALID_PARAMETER;
2134 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2135 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2136 return VC_ERROR_INVALID_STATE;
2140 if (state != VC_STATE_INITIALIZED) {
2141 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
2142 return VC_ERROR_INVALID_STATE;
2145 vc_mgr_client_set_all_result_cb(g_vc_m, callback, user_data);
2147 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set all result callback");
2152 int vc_mgr_unset_all_result_cb()
2155 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2156 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2157 return VC_ERROR_INVALID_STATE;
2161 if (state != VC_STATE_INITIALIZED) {
2162 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2163 return VC_ERROR_INVALID_STATE;
2166 vc_mgr_client_set_all_result_cb(g_vc_m, NULL, NULL);
2171 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
2173 if (NULL == callback)
2174 return VC_ERROR_INVALID_PARAMETER;
2177 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2178 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2179 return VC_ERROR_INVALID_STATE;
2183 if (state != VC_STATE_INITIALIZED) {
2184 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
2185 return VC_ERROR_INVALID_STATE;
2188 vc_mgr_client_set_result_cb(g_vc_m, callback, user_data);
2193 int vc_mgr_unset_result_cb()
2196 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2197 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2198 return VC_ERROR_INVALID_STATE;
2202 if (state != VC_STATE_INITIALIZED) {
2203 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2204 return VC_ERROR_INVALID_STATE;
2207 vc_mgr_client_set_result_cb(g_vc_m, NULL, NULL);
2212 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
2214 if (NULL == callback)
2215 return VC_ERROR_INVALID_PARAMETER;
2218 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2219 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
2220 return VC_ERROR_INVALID_STATE;
2224 if (state != VC_STATE_INITIALIZED) {
2225 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : Current state is not 'Initialized'");
2226 return VC_ERROR_INVALID_STATE;
2229 vc_mgr_client_set_pre_result_cb(g_vc_m, callback, user_data);
2234 int vc_mgr_unset_pre_result_cb()
2237 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2238 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
2239 return VC_ERROR_INVALID_STATE;
2243 if (state != VC_STATE_INITIALIZED) {
2244 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : Current state is not 'Initialize'");
2245 return VC_ERROR_INVALID_STATE;
2248 vc_mgr_client_set_pre_result_cb(g_vc_m, NULL, NULL);
2253 int vc_mgr_get_error_message(char** err_msg)
2255 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get error message");
2257 if (NULL == err_msg) {
2258 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter");
2259 return VC_ERROR_INVALID_PARAMETER;
2262 if (false == g_err_callback_status) {
2263 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not in error callback");
2264 return VC_ERROR_OPERATION_FAILED;
2268 ret = vc_mgr_client_get_error_message(g_vc_m, err_msg);
2270 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get error message");
2273 SLOG(LOG_DEBUG, TAG_VCM, "=====");
2274 SLOG(LOG_DEBUG, TAG_VCM, " ");
2279 static Eina_Bool __vc_mgr_notify_error(void *data)
2281 vc_h vc_m = (vc_h)data;
2283 vc_error_cb callback = NULL;
2284 void* user_data = NULL;
2287 vc_mgr_client_get_error_cb(vc_m, &callback, &user_data);
2288 vc_mgr_client_get_error(vc_m, &reason);
2290 if (NULL != callback) {
2291 vc_mgr_client_use_callback(vc_m);
2292 g_err_callback_status = true;
2293 callback(reason, user_data);
2294 g_err_callback_status = false;
2295 vc_mgr_client_not_use_callback(vc_m);
2296 SLOG(LOG_DEBUG, TAG_VCM, "Error callback is called");
2298 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2304 int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg)
2307 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2308 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Invalid client");
2313 if (state != VC_STATE_READY) {
2314 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] not connected client yet");
2318 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2320 if (VC_ERROR_SERVICE_RESET == reason) {
2321 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] VC daemon reset");
2323 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
2324 __vc_mgr_notify_state_changed(g_vc_m);
2326 if (0 != vc_mgr_prepare()) {
2327 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to prepare");
2331 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
2333 vc_mgr_client_set_error(g_vc_m, reason);
2334 vc_mgr_client_set_error_message(g_vc_m, msg);
2335 __vc_mgr_notify_error(g_vc_m);
2340 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2342 vc_state_changed_cb changed_callback = NULL;
2345 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
2347 vc_state_e current_state;
2348 vc_state_e before_state;
2350 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
2352 if (NULL != changed_callback) {
2353 vc_mgr_client_use_callback(g_vc_m);
2354 changed_callback(before_state, current_state, user_data);
2355 vc_mgr_client_not_use_callback(g_vc_m);
2356 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
2358 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2364 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2366 if (callback == NULL)
2367 return VC_ERROR_INVALID_PARAMETER;
2370 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2371 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2372 return VC_ERROR_INVALID_STATE;
2376 if (state != VC_STATE_INITIALIZED) {
2377 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2378 return VC_ERROR_INVALID_STATE;
2381 vc_mgr_client_set_state_changed_cb(g_vc_m, callback, user_data);
2383 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set state changed callback");
2387 int vc_mgr_unset_state_changed_cb()
2390 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2391 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2392 return VC_ERROR_INVALID_STATE;
2396 if (state != VC_STATE_INITIALIZED) {
2397 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2398 return VC_ERROR_INVALID_STATE;
2401 vc_mgr_client_set_state_changed_cb(g_vc_m, NULL, NULL);
2406 int __vc_mgr_cb_service_state(int state)
2408 vc_service_state_e current_state = (vc_service_state_e)state;
2409 vc_service_state_e before_state;
2410 vc_mgr_client_get_service_state(g_vc_m, &before_state);
2412 if (current_state == before_state) {
2413 SLOG(LOG_WARN, TAG_VCM, "Service State NOT changed : Before(%d) Current(%d)",
2414 before_state, current_state);
2418 SLOG(LOG_DEBUG, TAG_VCM, "Service State changed : Before(%d) Current(%d)",
2419 before_state, current_state);
2421 vc_internal_state_e internal_state = -1;
2422 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
2423 if ((VC_INTERNAL_STATE_STARTING == internal_state && VC_SERVICE_STATE_RECORDING == current_state) ||
2424 (VC_INTERNAL_STATE_STOPPING == internal_state && VC_SERVICE_STATE_PROCESSING == current_state) ||
2425 (VC_INTERNAL_STATE_CANCELING == internal_state && VC_SERVICE_STATE_READY == current_state)) {
2426 SLOG(LOG_DEBUG, TAG_VCM, "Internal state is changed to NONE");
2427 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2430 /* Save service state */
2431 vc_mgr_client_set_service_state(g_vc_m, current_state);
2433 vc_service_state_changed_cb callback = NULL;
2434 void* service_user_data = NULL;
2435 vc_mgr_client_get_service_state_changed_cb(g_vc_m, &callback, &service_user_data);
2437 if (NULL != callback) {
2438 vc_mgr_client_use_callback(g_vc_m);
2439 callback(before_state, current_state, service_user_data);
2440 vc_mgr_client_not_use_callback(g_vc_m);
2441 SLOG(LOG_DEBUG, TAG_VCM, "Service state changed callback is called");
2443 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
2449 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2451 if (callback == NULL)
2452 return VC_ERROR_INVALID_PARAMETER;
2455 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2456 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2457 return VC_ERROR_INVALID_STATE;
2461 if (state != VC_STATE_INITIALIZED) {
2462 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2463 return VC_ERROR_INVALID_STATE;
2466 vc_mgr_client_set_service_state_changed_cb(g_vc_m, callback, user_data);
2468 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set sevice state changed callback");
2472 int vc_mgr_unset_service_state_changed_cb()
2475 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2476 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2477 return VC_ERROR_INVALID_STATE;
2481 if (state != VC_STATE_INITIALIZED) {
2482 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2483 return VC_ERROR_INVALID_STATE;
2486 vc_mgr_client_set_service_state_changed_cb(g_vc_m, NULL, NULL);
2490 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2492 if (callback == NULL)
2493 return VC_ERROR_INVALID_PARAMETER;
2496 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2497 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2498 return VC_ERROR_INVALID_STATE;
2502 if (state != VC_STATE_INITIALIZED) {
2503 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set speech detected callback : Current state is not 'Initialized'");
2504 return VC_ERROR_INVALID_STATE;
2507 vc_mgr_client_set_speech_detected_cb(g_vc_m, callback, user_data);
2509 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set speech detected callback");
2513 int vc_mgr_unset_speech_detected_cb()
2516 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2517 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2518 return VC_ERROR_INVALID_STATE;
2522 if (state != VC_STATE_INITIALIZED) {
2523 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2524 return VC_ERROR_INVALID_STATE;
2527 vc_mgr_client_set_speech_detected_cb(g_vc_m, NULL, NULL);
2531 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2533 if (NULL == callback)
2534 return VC_ERROR_INVALID_PARAMETER;
2537 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2538 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2539 return VC_ERROR_INVALID_STATE;
2543 if (state != VC_STATE_INITIALIZED) {
2544 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : Current state is not 'Initialized'");
2545 return VC_ERROR_INVALID_STATE;
2548 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, callback, user_data);
2550 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set current language changed callback");
2554 int vc_mgr_unset_current_language_changed_cb()
2557 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2558 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2559 return VC_ERROR_INVALID_STATE;
2563 if (state != VC_STATE_INITIALIZED) {
2564 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2565 return VC_ERROR_INVALID_STATE;
2568 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, NULL, NULL);
2573 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2575 if (NULL == callback)
2576 return VC_ERROR_INVALID_PARAMETER;
2579 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2580 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2581 return VC_ERROR_INVALID_STATE;
2585 if (state != VC_STATE_INITIALIZED) {
2586 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2587 return VC_ERROR_INVALID_STATE;
2590 vc_mgr_client_set_error_cb(g_vc_m, callback, user_data);
2595 int vc_mgr_unset_error_cb()
2598 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2599 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2600 return VC_ERROR_INVALID_STATE;
2604 if (state != VC_STATE_INITIALIZED) {
2605 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2606 return VC_ERROR_INVALID_STATE;
2609 vc_mgr_client_set_error_cb(g_vc_m, NULL, NULL);
2614 int __vc_mgr_cb_dialog(int pid, const char* disp_text, const char* utt_text, bool continuous)
2616 vc_mgr_dialog_request_cb callback = NULL;
2617 void* user_data = NULL;
2619 vc_mgr_client_get_dialog_request_cb(g_vc_m, &callback, &user_data);
2621 if (NULL != callback) {
2622 vc_mgr_client_use_callback(g_vc_m);
2623 callback(pid, disp_text, utt_text, continuous, user_data);
2624 vc_mgr_client_not_use_callback(g_vc_m);
2625 SLOG(LOG_DEBUG, TAG_VCM, "Dialog callback is called");
2627 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2633 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2635 if (NULL == callback)
2636 return VC_ERROR_INVALID_PARAMETER;
2639 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2640 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2641 return VC_ERROR_INVALID_STATE;
2645 if (state != VC_STATE_INITIALIZED) {
2646 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2647 return VC_ERROR_INVALID_STATE;
2650 vc_mgr_client_set_dialog_request_cb(g_vc_m, callback, user_data);
2655 int vc_mgr_unset_dialog_request_cb()
2658 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2659 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2660 return VC_ERROR_INVALID_STATE;
2664 if (state != VC_STATE_INITIALIZED) {
2665 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2666 return VC_ERROR_INVALID_STATE;
2669 vc_mgr_client_set_dialog_request_cb(g_vc_m, NULL, NULL);
2674 static bool __vc_mgr_check_demandable_client(int pid)
2676 if (0 == g_slist_length(g_demandable_client_list)) {
2677 SLOG(LOG_WARN, TAG_VCM, "[WARNING] No demandable clients");
2681 char appid[128] = {'\0', };
2682 aul_app_get_appid_bypid(pid, appid, sizeof(appid));
2684 if (0 >= strlen(appid)) {
2685 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No appid");
2688 SLOG(LOG_DEBUG, TAG_VCM, "[CHECK] Appid - %s", appid);
2690 GSList *iter = NULL;
2691 vc_demandable_client_s* temp_client;
2692 iter = g_slist_nth(g_demandable_client_list, 0);
2694 while (NULL != iter) {
2695 temp_client = iter->data;
2697 if (NULL != temp_client) {
2698 if (NULL != temp_client->appid) {
2699 if (!strcmp(temp_client->appid, appid)) {
2700 SLOG(LOG_DEBUG, TAG_VCM, "pid(%d) is available", pid);
2706 iter = g_slist_next(iter);
2713 int __vc_mgr_request_auth_enable(int pid)
2715 if (false == __vc_mgr_check_demandable_client(pid)) {
2716 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not demandable client");
2717 return VC_ERROR_INVALID_PARAMETER;
2720 /* check already authorized */
2721 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2722 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already authorized");
2723 return VC_ERROR_INVALID_PARAMETER;
2726 /* add authorized list */
2727 if (0 != vc_mgr_client_add_authorized_client(g_vc_m, pid)) {
2728 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add authorized client");
2729 return VC_ERROR_OPERATION_FAILED;
2732 /* foreground check */
2734 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fore_pid)) {
2735 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get foreground");
2736 return VC_ERROR_OPERATION_FAILED;
2739 if (pid == fore_pid) {
2740 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
2746 int __vc_mgr_request_auth_disable(int pid)
2748 /* check authorized */
2749 if (false == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2750 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No authorized");
2751 return VC_ERROR_INVALID_PARAMETER;
2754 /* remove authorized list */
2755 if (0 != vc_mgr_client_remove_authorized_client(g_vc_m, pid)) {
2756 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to remove authorized client");
2757 return VC_ERROR_OPERATION_FAILED;
2760 /* check authority valid */
2761 if (true == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2762 SLOG(LOG_DEBUG, TAG_VCM, "Valid authorized client is removed");
2763 if (0 != vc_mgr_client_set_valid_authorized_client(g_vc_m, -1)) {
2764 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set valid authorized client");
2765 return VC_ERROR_OPERATION_FAILED;
2772 static Eina_Bool __request_auth_start(void* data)
2774 SLOG(LOG_DEBUG, TAG_VCM, "Request Start");
2776 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, true)) {
2777 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2780 if (0 != vc_mgr_start(false)) {
2781 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request start is failed");
2782 /* TODO - Error handling? */
2785 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, false)) {
2786 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2793 int __vc_mgr_request_auth_start(int pid)
2795 /* check authorized */
2796 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2797 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2798 return VC_ERROR_INVALID_PARAMETER;
2801 /* add timer for start recording */
2802 ecore_timer_add(0, __request_auth_start, NULL);
2807 static Eina_Bool __request_auth_stop(void* data)
2809 SLOG(LOG_DEBUG, TAG_VCM, "Request Stop");
2811 if (0 != vc_mgr_stop()) {
2812 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request stop is failed");
2813 /* TODO - Error handling? */
2819 int __vc_mgr_request_auth_stop(int pid)
2821 /* check authorized */
2822 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2823 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2824 return VC_ERROR_INVALID_PARAMETER;
2827 /* add timer for start recording */
2828 ecore_timer_add(0, __request_auth_stop, NULL);
2833 static Eina_Bool __request_auth_cancel(void* data)
2835 SLOG(LOG_DEBUG, TAG_VCM, "Request Cancel");
2837 if (0 != vc_mgr_cancel()) {
2838 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request cancel is failed");
2839 /* TODO - Error handling? */
2845 int __vc_mgr_request_auth_cancel(int pid)
2847 /* check authorized */
2848 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2849 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2850 return VC_ERROR_INVALID_PARAMETER;
2853 /* add timer for start recording */
2854 ecore_timer_add(0, __request_auth_cancel, NULL);