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 "vc_info_parser.h"
20 #include "vc_config_mgr.h"
21 #include "vc_command.h"
23 #include "vc_mgr_client.h"
24 #include "vc_mgr_dbus.h"
25 #include "voice_control.h"
26 #include "voice_control_command.h"
27 #include "voice_control_command_expand.h"
28 #include "voice_control_common.h"
29 #include "voice_control_manager.h"
32 #define VC_MANAGER_CONFIG_HANDLE 100000
34 static Ecore_Timer* g_m_connect_timer = NULL;
36 static vc_h g_vc_m = NULL;
38 static GSList* g_demandable_client_list = NULL;
40 static float g_volume_db = 0;
42 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
43 static Eina_Bool __vc_mgr_notify_error(void *data);
44 static Eina_Bool __vc_mgr_notify_result(void *data);
46 static const char* __vc_mgr_get_error_code(vc_error_e err)
49 case VC_ERROR_NONE: return "VC_ERROR_NONE"; break;
50 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY"; break;
51 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR"; break;
52 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER"; break;
53 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT"; break;
54 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY"; break;
55 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE"; break;
56 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE"; break;
57 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND"; break;
58 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED"; break;
59 default: return "Invalid error code"; break;
64 static void __vc_mgr_lang_changed_cb(const char* before_lang, const char* current_lang)
66 SLOG(LOG_DEBUG, TAG_VCM, "Lang changed : Before lang(%s) Current lang(%s)",
67 before_lang, current_lang);
69 vc_current_language_changed_cb callback = NULL;
71 vc_mgr_client_get_current_lang_changed_cb(g_vc_m, &callback, &lang_user_data);
73 if (NULL != callback) {
74 vc_mgr_client_use_callback(g_vc_m);
75 callback(before_lang, current_lang, lang_user_data);
76 vc_mgr_client_not_use_callback(g_vc_m);
77 SLOG(LOG_DEBUG, TAG_VCM, "Language changed callback is called");
79 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
85 int vc_mgr_initialize()
87 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Initialize");
90 if (true == vc_mgr_client_is_valid(g_vc_m)) {
91 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
95 if (0 != vc_mgr_dbus_open_connection()) {
96 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open connection");
97 return VC_ERROR_OPERATION_FAILED;
100 if (0 != vc_mgr_client_create(&g_vc_m)) {
101 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
102 return VC_ERROR_OUT_OF_MEMORY;
105 int ret = vc_config_mgr_initialize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
107 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
108 vc_mgr_client_destroy(g_vc_m);
109 return VC_ERROR_OPERATION_FAILED;
112 ret = vc_config_mgr_set_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
114 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
115 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
116 vc_mgr_client_destroy(g_vc_m);
117 return VC_ERROR_OPERATION_FAILED;
120 SLOG(LOG_DEBUG, TAG_VCM, "[Success] pid(%d)", g_vc_m->handle);
122 SLOG(LOG_DEBUG, TAG_VCM, "=====");
123 SLOG(LOG_DEBUG, TAG_VCM, " ");
125 return VC_ERROR_NONE;
128 static void __vc_mgr_internal_unprepare()
130 int ret = vc_mgr_dbus_request_finalize(g_vc_m->handle);
132 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
135 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_SYSTEM);
136 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_EXCLUSIVE);
141 int vc_mgr_deinitialize()
143 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Deinitialize");
145 if (false == vc_mgr_client_is_valid(g_vc_m)) {
146 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
147 SLOG(LOG_DEBUG, TAG_VCM, "=====");
148 SLOG(LOG_DEBUG, TAG_VCM, " ");
149 return VC_ERROR_INVALID_STATE;
153 vc_mgr_client_get_client_state(g_vc_m, &state);
158 __vc_mgr_internal_unprepare();
159 /* no break. need to next step*/
160 case VC_STATE_INITIALIZED:
161 if (NULL != g_m_connect_timer) {
162 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
163 ecore_timer_del(g_m_connect_timer);
166 vc_config_mgr_unset_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
167 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
169 /* Free client resources */
170 vc_mgr_client_destroy(g_vc_m);
179 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
181 if (0 != vc_mgr_dbus_close_connection()) {
182 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
185 SLOG(LOG_DEBUG, TAG_VCM, "=====");
186 SLOG(LOG_DEBUG, TAG_VCM, " ");
188 return VC_ERROR_NONE;
191 static Eina_Bool __vc_mgr_connect_daemon(void *data)
194 if (0 != vc_mgr_dbus_request_hello()) {
198 g_m_connect_timer = NULL;
199 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
201 /* request initialization */
203 int service_state = 0;
204 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
205 ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, &service_state, &foreground);
207 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
208 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
210 vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND);
211 ecore_timer_add(0, __vc_mgr_notify_error, g_vc_m);
213 SLOG(LOG_DEBUG, TAG_VCM, "=====");
214 SLOG(LOG_DEBUG, TAG_VCM, " ");
217 } else if (0 != ret) {
218 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
221 /* Success to connect */
224 /* Set service state */
225 vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state);
228 vc_mgr_client_set_foreground(g_vc_m, foreground, true);
230 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Connected daemon");
232 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY);
234 vc_state_changed_cb changed_callback = NULL;
235 void* user_data = NULL;
237 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
239 vc_state_e current_state;
240 vc_state_e before_state;
242 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
244 if (NULL != changed_callback) {
245 vc_mgr_client_use_callback(g_vc_m);
246 changed_callback(before_state, current_state, user_data);
247 vc_mgr_client_not_use_callback(g_vc_m);
248 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
250 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
253 SLOG(LOG_DEBUG, TAG_VCM, "=====");
254 SLOG(LOG_DEBUG, TAG_VCM, " ");
261 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Prepare");
264 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
265 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
266 SLOG(LOG_DEBUG, TAG_VCM, "=====");
267 SLOG(LOG_DEBUG, TAG_VCM, " ");
268 return VC_ERROR_INVALID_STATE;
272 if (state != VC_STATE_INITIALIZED) {
273 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'CREATED'");
274 SLOG(LOG_DEBUG, TAG_VCM, "=====");
275 SLOG(LOG_DEBUG, TAG_VCM, " ");
276 return VC_ERROR_INVALID_STATE;
279 g_m_connect_timer = ecore_timer_add(0, __vc_mgr_connect_daemon, NULL);
281 SLOG(LOG_DEBUG, TAG_VCM, "=====");
282 SLOG(LOG_DEBUG, TAG_VCM, " ");
284 return VC_ERROR_NONE;
287 int vc_mgr_unprepare()
289 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unprepare");
292 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
293 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
294 SLOG(LOG_DEBUG, TAG_VCM, "=====");
295 SLOG(LOG_DEBUG, TAG_VCM, " ");
296 return VC_ERROR_INVALID_STATE;
300 if (state != VC_STATE_READY) {
301 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
302 SLOG(LOG_DEBUG, TAG_VCM, "=====");
303 SLOG(LOG_DEBUG, TAG_VCM, " ");
304 return VC_ERROR_INVALID_STATE;
307 __vc_mgr_internal_unprepare();
309 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
310 ecore_timer_add(0, __vc_mgr_notify_state_changed, g_vc_m);
312 SLOG(LOG_DEBUG, TAG_VCM, "=====");
313 SLOG(LOG_DEBUG, TAG_VCM, " ");
315 return VC_ERROR_NONE;
318 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
320 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach Supported Language");
322 if (NULL == callback) {
323 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
324 SLOG(LOG_DEBUG, TAG_VCM, "=====");
325 SLOG(LOG_DEBUG, TAG_VCM, " ");
326 return VC_ERROR_INVALID_PARAMETER;
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 ret = vc_config_mgr_get_language_list(callback, user_data);
340 ret = vc_config_convert_error_code((vc_config_error_e)ret);
341 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
344 SLOG(LOG_DEBUG, TAG_VCM, "=====");
345 SLOG(LOG_DEBUG, TAG_VCM, " ");
347 return VC_ERROR_NONE;
350 int vc_mgr_get_current_language(char** language)
352 if (NULL == language) {
353 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
354 return VC_ERROR_INVALID_PARAMETER;
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 return VC_ERROR_INVALID_STATE;
364 ret = vc_config_mgr_get_default_language(language);
366 ret = vc_config_convert_error_code((vc_config_error_e)ret);
367 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
369 SLOG(LOG_DEBUG, TAG_VCM, "[Get current language] language : %s", *language);
375 int vc_mgr_get_state(vc_state_e* state)
377 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get State");
380 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
381 return VC_ERROR_INVALID_PARAMETER;
385 if (0 != vc_mgr_client_get_client_state(g_vc_m, &temp)) {
386 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
387 SLOG(LOG_DEBUG, TAG_VCM, "=====");
388 SLOG(LOG_DEBUG, TAG_VCM, " ");
389 return VC_ERROR_INVALID_STATE;
395 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'None'"); break;
396 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Created'"); break;
397 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Ready'"); break;
398 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state"); break;
401 SLOG(LOG_DEBUG, TAG_VCM, "=====");
402 SLOG(LOG_DEBUG, TAG_VCM, " ");
404 return VC_ERROR_NONE;
407 int vc_mgr_get_service_state(vc_service_state_e* state)
409 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get Service State");
412 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
413 return VC_ERROR_INVALID_PARAMETER;
416 vc_state_e client_state;
417 if (0 != vc_mgr_client_get_client_state(g_vc_m, &client_state)) {
418 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
419 return VC_ERROR_INVALID_STATE;
423 if (client_state != VC_STATE_READY) {
424 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
425 return VC_ERROR_INVALID_STATE;
428 /* get service state */
429 vc_service_state_e service_state;
430 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
431 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
432 return VC_ERROR_OPERATION_FAILED;
435 *state = service_state;
438 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
439 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
440 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
441 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
442 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state"); break;
445 SLOG(LOG_DEBUG, TAG_VCM, "=====");
446 SLOG(LOG_DEBUG, TAG_VCM, " ");
448 return VC_ERROR_NONE;
451 int vc_mgr_set_demandable_client_rule(const char* rule)
453 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Demandable client rule");
456 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
457 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
458 SLOG(LOG_DEBUG, TAG_VCM, "=====");
459 SLOG(LOG_DEBUG, TAG_VCM, " ");
460 return VC_ERROR_INVALID_STATE;
464 if (state != VC_STATE_READY) {
465 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
466 SLOG(LOG_DEBUG, TAG_VCM, "=====");
467 SLOG(LOG_DEBUG, TAG_VCM, " ");
468 return VC_ERROR_INVALID_STATE;
472 ret = vc_info_parser_set_demandable_client(rule);
474 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] rule is NOT valid");
475 SLOG(LOG_DEBUG, TAG_VCM, "=====");
476 SLOG(LOG_DEBUG, TAG_VCM, " ");
477 return VC_ERROR_INVALID_PARAMETER;
480 if (0 != vc_info_parser_get_demandable_clients(&g_demandable_client_list)) {
481 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get demandable clients");
482 return VC_ERROR_OPERATION_FAILED;
485 SLOG(LOG_DEBUG, TAG_VCM, "=====");
486 SLOG(LOG_DEBUG, TAG_VCM, " ");
494 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
496 if (VC_ERROR_TIMED_OUT != ret) {
497 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set client rule to daemon : %s", __vc_mgr_get_error_code(ret));
500 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set client rule : %s", __vc_mgr_get_error_code(ret));
503 if (VC_RETRY_COUNT == count) {
504 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
511 SLOG(LOG_DEBUG, TAG_VCM, "=====");
512 SLOG(LOG_DEBUG, TAG_VCM, " ");
518 int vc_mgr_unset_demandable_client_rule()
520 vc_info_parser_set_demandable_client(NULL);
525 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
527 if (VC_ERROR_TIMED_OUT != ret) {
528 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
531 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset client rule : %s", __vc_mgr_get_error_code(ret));
534 if (VC_RETRY_COUNT == count) {
535 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
545 int vc_mgr_is_command_format_supported(vc_cmd_format_e format, bool* support)
547 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Is command type supported");
550 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
551 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
552 SLOG(LOG_DEBUG, TAG_VCM, "=====");
553 SLOG(LOG_DEBUG, TAG_VCM, " ");
554 return VC_ERROR_INVALID_STATE;
558 bool non_fixed_support = false;
559 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
560 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
564 case VC_CMD_FORMAT_FIXED: *support = true; break;
565 case VC_CMD_FORMAT_FIXED_AND_EXTRA: *support = non_fixed_support; break;
566 case VC_CMD_FORMAT_EXTRA_AND_FIXED: *support = non_fixed_support; break;
567 default: *support = false; break;
570 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
572 SLOG(LOG_DEBUG, TAG_VCM, "=====");
573 SLOG(LOG_DEBUG, TAG_VCM, " ");
575 return VC_ERROR_NONE;
578 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
580 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list");
583 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
584 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
585 SLOG(LOG_DEBUG, TAG_VCM, "=====");
586 SLOG(LOG_DEBUG, TAG_VCM, " ");
587 return VC_ERROR_INVALID_STATE;
591 if (state != VC_STATE_READY) {
592 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
593 SLOG(LOG_DEBUG, TAG_VCM, "=====");
594 SLOG(LOG_DEBUG, TAG_VCM, " ");
595 return VC_ERROR_INVALID_STATE;
598 /* Check service state */
599 vc_service_state_e service_state = -1;
600 vc_mgr_client_get_service_state(g_vc_m, &service_state);
601 if (service_state != VC_SERVICE_STATE_READY) {
602 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
603 SLOG(LOG_DEBUG, TAG_VCM, "=====");
604 SLOG(LOG_DEBUG, TAG_VCM, " ");
605 return VC_ERROR_INVALID_STATE;
608 vc_cmd_list_s* list = NULL;
609 list = (vc_cmd_list_s*)vc_cmd_list;
611 int system_ret = vc_cmd_parser_save_file(getpid(), VC_COMMAND_TYPE_SYSTEM, list->list);
612 int exclsive_ret = vc_cmd_parser_save_file(getpid(), VC_COMMAND_TYPE_EXCLUSIVE, list->list);
615 if (0 != system_ret && 0 != exclsive_ret) {
616 ret = VC_ERROR_INVALID_PARAMETER;
617 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
621 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
623 if (VC_ERROR_TIMED_OUT != ret) {
624 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
627 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
630 if (VC_RETRY_COUNT == count) {
631 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
639 SLOG(LOG_DEBUG, TAG_VCM, "=====");
640 SLOG(LOG_DEBUG, TAG_VCM, " ");
645 int vc_mgr_unset_command_list()
647 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unset Command list");
650 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
651 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
652 return VC_ERROR_INVALID_STATE;
656 if (state != VC_STATE_READY) {
657 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
658 return VC_ERROR_INVALID_STATE;
664 ret = vc_mgr_dbus_request_unset_command(g_vc_m->handle);
666 if (VC_ERROR_TIMED_OUT != ret) {
667 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
670 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset command : %s", __vc_mgr_get_error_code(ret));
673 if (VC_RETRY_COUNT == count) {
674 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
681 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_SYSTEM);
682 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_EXCLUSIVE);
684 SLOG(LOG_DEBUG, TAG_VCM, "=====");
685 SLOG(LOG_DEBUG, TAG_VCM, " ");
690 int vc_mgr_set_audio_type(const char* audio_id)
692 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set audio type");
694 if (NULL == audio_id) {
695 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
696 return VC_ERROR_INVALID_PARAMETER;
700 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
701 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
702 SLOG(LOG_DEBUG, TAG_VCM, "=====");
703 SLOG(LOG_DEBUG, TAG_VCM, " ");
704 return VC_ERROR_INVALID_STATE;
708 if (state != VC_STATE_READY) {
709 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
710 SLOG(LOG_DEBUG, TAG_VCM, "=====");
711 SLOG(LOG_DEBUG, TAG_VCM, " ");
712 return VC_ERROR_INVALID_STATE;
715 /* Check service state */
716 vc_service_state_e service_state = -1;
717 vc_mgr_client_get_service_state(g_vc_m, &service_state);
718 if (service_state != VC_SERVICE_STATE_READY) {
719 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
720 SLOG(LOG_DEBUG, TAG_VCM, "=====");
721 SLOG(LOG_DEBUG, TAG_VCM, " ");
722 return VC_ERROR_INVALID_STATE;
732 ret = vc_mgr_dbus_request_set_audio_type(g_vc_m->handle, audio_id);
734 if (VC_ERROR_TIMED_OUT != ret) {
735 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
738 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set audio type : %s", __vc_mgr_get_error_code(ret));
741 if (VC_RETRY_COUNT == count) {
742 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
747 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio type");
749 vc_mgr_client_set_audio_type(g_vc_m, audio_id);
753 SLOG(LOG_DEBUG, TAG_VCM, "=====");
754 SLOG(LOG_DEBUG, TAG_VCM, " ");
759 int vc_mgr_get_audio_type(char** audio_id)
761 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get audio type");
763 if (NULL == audio_id) {
764 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
765 return VC_ERROR_INVALID_PARAMETER;
769 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
770 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
771 SLOG(LOG_DEBUG, TAG_VCM, "=====");
772 SLOG(LOG_DEBUG, TAG_VCM, " ");
773 return VC_ERROR_INVALID_STATE;
777 if (state != VC_STATE_READY) {
778 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
779 SLOG(LOG_DEBUG, TAG_VCM, "=====");
780 SLOG(LOG_DEBUG, TAG_VCM, " ");
781 return VC_ERROR_INVALID_STATE;
784 /* Check service state */
785 vc_service_state_e service_state = -1;
786 vc_mgr_client_get_service_state(g_vc_m, &service_state);
787 if (service_state != VC_SERVICE_STATE_READY) {
788 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
789 SLOG(LOG_DEBUG, TAG_VCM, "=====");
790 SLOG(LOG_DEBUG, TAG_VCM, " ");
791 return VC_ERROR_INVALID_STATE;
796 vc_mgr_client_get_audio_type(g_vc_m, &temp);
799 /* Not initiallized */
803 ret = vc_mgr_dbus_request_get_audio_type(g_vc_m->handle, &temp);
805 if (VC_ERROR_TIMED_OUT != ret) {
806 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
809 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to get audio type : %s", __vc_mgr_get_error_code(ret));
812 if (VC_RETRY_COUNT == count) {
813 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
818 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
820 vc_mgr_client_set_audio_type(g_vc_m, temp);
826 *audio_id = strdup(temp);
834 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
836 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach current commands");
839 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
840 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
841 SLOG(LOG_DEBUG, TAG_VCM, "=====");
842 SLOG(LOG_DEBUG, TAG_VCM, " ");
843 return VC_ERROR_INVALID_STATE;
847 if (state != VC_STATE_READY) {
848 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
849 SLOG(LOG_DEBUG, TAG_VCM, "=====");
850 SLOG(LOG_DEBUG, TAG_VCM, " ");
851 return VC_ERROR_INVALID_STATE;
854 /* Check service state */
855 vc_service_state_e service_state = -1;
856 vc_mgr_client_get_service_state(g_vc_m, &service_state);
857 if (service_state != VC_SERVICE_STATE_READY) {
858 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
859 SLOG(LOG_DEBUG, TAG_VCM, "=====");
860 SLOG(LOG_DEBUG, TAG_VCM, " ");
861 return VC_ERROR_INVALID_STATE;
864 if (NULL == vc_cmd_list) {
865 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid Parameter");
866 SLOG(LOG_DEBUG, TAG_VCM, "=====");
867 SLOG(LOG_DEBUG, TAG_VCM, " ");
868 return VC_ERROR_INVALID_PARAMETER;
871 vc_cmd_list_h temp_list = NULL;
872 if (0 != vc_cmd_list_create(&temp_list)) {
873 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
874 return VC_ERROR_INVALID_PARAMETER;
877 *vc_cmd_list = temp_list;
884 /* Get foreground pid */
885 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fg_pid)) {
886 /* There is no foreground app for voice control */
887 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
889 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
892 if (0 != vc_mgr_client_get_pid(g_vc_m, &mgr_pid)) {
893 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Fail to get manager pid");
894 return VC_ERROR_OPERATION_FAILED;
896 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
899 /* Get system command */
900 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
902 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No system commands");
909 ret = vc_mgr_dbus_request_set_client_info(g_vc_m->handle);
911 if (VC_ERROR_TIMED_OUT != ret) {
912 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
915 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set client info : %s", __vc_mgr_get_error_code(ret));
918 if (VC_RETRY_COUNT == count) {
919 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
924 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set client info");
929 GSList* client_info_list = NULL;
930 vc_client_info_s *client_info = NULL;
931 bool is_fgpid = false;
933 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
934 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] No client");
938 if (VC_NO_FOREGROUND_PID != fg_pid) {
939 iter = g_slist_nth(client_info_list, 0);
940 while (NULL != iter) {
941 client_info = iter->data;
942 if (NULL != client_info) {
943 if (fg_pid == client_info->pid) {
948 iter = g_slist_next(iter);
952 /* Get foreground commands and widget */
953 if (true == is_fgpid) {
955 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
957 /* Get foreground command */
958 if (true == client_info->fg_cmd) {
959 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
961 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
964 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground commands");
967 /* Check exclusive option */
968 if (true == client_info->exclusive_cmd) {
969 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Exclusive command is ON");
971 /* Set background command for exclusive option */
972 if (true == client_info->bg_cmd) {
973 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Set background command");
974 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
976 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
980 /* need to release client info */
981 iter = g_slist_nth(client_info_list, 0);
983 while (NULL != iter) {
984 client_info = iter->data;
985 if (NULL != client_info) {
988 client_info_list = g_slist_remove_link(client_info_list, iter);
989 iter = g_slist_nth(client_info_list, 0);
992 SLOG(LOG_DEBUG, TAG_VCM, "=====");
993 SLOG(LOG_DEBUG, TAG_VCM, " ");
998 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground app");
1001 /* Get background commands */
1002 if (0 < g_slist_length(client_info_list)) {
1003 iter = g_slist_nth(client_info_list, 0);
1005 while (NULL != iter) {
1006 client_info = iter->data;
1008 if (NULL != client_info) {
1009 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1010 if (true == client_info->bg_cmd) {
1011 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1013 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1018 client_info_list = g_slist_remove_link(client_info_list, iter);
1020 iter = g_slist_nth(client_info_list, 0);
1024 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No background commands");
1027 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1028 SLOG(LOG_DEBUG, TAG_VCM, " ");
1033 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1035 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set recognition mode = %d", mode);
1038 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1039 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1040 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1041 SLOG(LOG_DEBUG, TAG_VCM, " ");
1042 return VC_ERROR_INVALID_STATE;
1046 if (state != VC_STATE_READY) {
1047 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1048 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1049 SLOG(LOG_DEBUG, TAG_VCM, " ");
1050 return VC_ERROR_INVALID_STATE;
1053 /* Check service state */
1054 vc_service_state_e service_state = -1;
1055 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1056 if (service_state != VC_SERVICE_STATE_READY) {
1057 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1058 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1059 SLOG(LOG_DEBUG, TAG_VCM, " ");
1060 return VC_ERROR_INVALID_STATE;
1063 vc_mgr_client_set_recognition_mode(g_vc_m, mode);
1067 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1071 ret = vc_mgr_client_get_recognition_mode(g_vc_m, mode);
1073 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1077 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get recognition mode = %d", *mode);
1081 int vc_mgr_start(bool exclusive_command_option)
1083 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request start");
1086 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1087 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1088 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1089 SLOG(LOG_DEBUG, TAG_VCM, " ");
1090 return VC_ERROR_INVALID_STATE;
1094 if (state != VC_STATE_READY) {
1095 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1096 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1097 SLOG(LOG_DEBUG, TAG_VCM, " ");
1098 return VC_ERROR_INVALID_STATE;
1101 /* Check service state */
1102 vc_service_state_e service_state = -1;
1103 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1104 if (service_state != VC_SERVICE_STATE_READY) {
1105 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1106 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1107 SLOG(LOG_DEBUG, TAG_VCM, " ");
1108 return VC_ERROR_INVALID_STATE;
1111 vc_mgr_client_set_exclusive_command(g_vc_m, exclusive_command_option);
1113 bool start_by_client = false;
1114 if (0 != vc_mgr_client_get_start_by_client(g_vc_m, &start_by_client)) {
1115 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1120 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1121 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1122 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1129 ret = vc_mgr_dbus_request_start(g_vc_m->handle, (int)recognition_mode, exclusive_command_option, start_by_client);
1131 if (VC_ERROR_TIMED_OUT != ret) {
1132 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1135 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry start request start : %s", __vc_mgr_get_error_code(ret));
1138 if (VC_RETRY_COUNT == count) {
1139 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1140 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1145 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] start recognition");
1149 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1150 SLOG(LOG_DEBUG, TAG_VCM, " ");
1157 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request stop");
1160 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1161 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1162 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1163 SLOG(LOG_DEBUG, TAG_VCM, " ");
1164 return VC_ERROR_INVALID_STATE;
1168 if (state != VC_STATE_READY) {
1169 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1170 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1171 SLOG(LOG_DEBUG, TAG_VCM, " ");
1172 return VC_ERROR_INVALID_STATE;
1175 /* Check service state */
1176 vc_service_state_e service_state = -1;
1177 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1178 if (service_state != VC_SERVICE_STATE_RECORDING) {
1179 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING'");
1180 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1181 SLOG(LOG_DEBUG, TAG_VCM, " ");
1182 return VC_ERROR_INVALID_STATE;
1189 ret = vc_mgr_dbus_request_stop(g_vc_m->handle);
1191 if (VC_ERROR_TIMED_OUT != ret) {
1192 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1195 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry stop request : %s", __vc_mgr_get_error_code(ret));
1198 if (VC_RETRY_COUNT == count) {
1199 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1204 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Stop recognition");
1208 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1209 SLOG(LOG_DEBUG, TAG_VCM, " ");
1216 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request cancel");
1219 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1220 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1221 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1222 SLOG(LOG_DEBUG, TAG_VCM, " ");
1223 return VC_ERROR_INVALID_STATE;
1227 if (state != VC_STATE_READY) {
1228 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1229 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1230 SLOG(LOG_DEBUG, TAG_VCM, " ");
1231 return VC_ERROR_INVALID_STATE;
1234 /* Check service state */
1235 vc_service_state_e service_state = -1;
1236 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1237 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1238 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1239 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1240 SLOG(LOG_DEBUG, TAG_VCM, " ");
1241 return VC_ERROR_INVALID_STATE;
1247 ret = vc_mgr_dbus_request_cancel(g_vc_m->handle);
1249 if (VC_ERROR_TIMED_OUT != ret) {
1250 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1253 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry cancel request : %s", __vc_mgr_get_error_code(ret));
1256 if (VC_RETRY_COUNT == count) {
1257 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1262 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Cancel recognition");
1266 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1268 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1269 SLOG(LOG_DEBUG, TAG_VCM, " ");
1274 int __vc_mgr_cb_set_volume(float volume)
1276 g_volume_db = volume;
1277 SLOG(LOG_DEBUG, TAG_VCM, "Set volume (%f)", g_volume_db);
1282 int vc_mgr_get_recording_volume(float* volume)
1284 if (NULL == volume) {
1285 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1286 return VC_ERROR_INVALID_PARAMETER;
1289 vc_service_state_e service_state = -1;
1290 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
1291 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1292 return VC_ERROR_INVALID_STATE;
1296 if (VC_SERVICE_STATE_RECORDING != service_state) {
1297 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1298 return VC_ERROR_INVALID_STATE;
1301 *volume = g_volume_db;
1306 int __vc_mgr_cb_set_foreground(int pid, bool value)
1308 vc_mgr_client_set_foreground(g_vc_m, pid, value);
1310 /* get authorized valid app */
1312 if (0 != vc_mgr_client_get_valid_authorized_client(g_vc_m, &tmp_pid)) {
1313 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get authorized valid app");
1314 return VC_ERROR_INVALID_PARAMETER;
1317 if (true == value) {
1318 /* compare & set valid */
1319 if (tmp_pid != pid) {
1320 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1322 /* set authorized valid */
1323 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
1324 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) change to valid", pid);
1325 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
1327 SLOG(LOG_DEBUG, TAG_VCM, "No valid Authority");
1328 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1332 if (tmp_pid == pid) {
1333 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1334 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1341 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1343 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Select result");
1345 /* Do not check state for 'restart continusly' mode */
1347 vc_service_state_e service_state = -1;
1348 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1349 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1350 vc_recognition_mode_e recognition_mode;
1351 vc_mgr_get_recognition_mode(&recognition_mode);
1353 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1354 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continously'");
1355 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1356 SLOG(LOG_DEBUG, TAG_VCM, " ");
1357 return VC_ERROR_INVALID_STATE;
1361 if (NULL != vc_cmd_list) {
1363 char* result_text = NULL;
1365 vc_mgr_client_get_all_result(g_vc_m, &event, &result_text);
1367 vc_info_parser_set_result(result_text, event, NULL, vc_cmd_list, false);
1369 if (NULL != result_text) {
1382 ret = vc_mgr_dbus_send_result_selection(g_vc_m->handle);
1384 if (VC_ERROR_TIMED_OUT != ret) {
1385 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send result selection : %s", __vc_mgr_get_error_code(ret));
1388 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry send result selection : %s", __vc_mgr_get_error_code(ret));
1391 if (VC_RETRY_COUNT == count) {
1392 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1397 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] result selection");
1401 vc_mgr_client_unset_all_result(g_vc_m);
1403 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1404 SLOG(LOG_DEBUG, TAG_VCM, " ");
1409 static Eina_Bool __vc_mgr_set_select_result(void *data)
1411 vc_mgr_set_selected_results(NULL);
1415 static void __vc_mgr_notify_all_result(vc_result_type_e result_type)
1417 char* temp_text = NULL;
1419 char* temp_message = NULL;
1420 vc_cmd_list_h vc_cmd_list = NULL;
1422 vc_mgr_all_result_cb all_callback = NULL;
1423 void* all_user_data = NULL;
1425 vc_mgr_client_get_all_result_cb(g_vc_m, &all_callback, &all_user_data);
1426 if (NULL == all_callback) {
1427 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] All result callback is NULL");
1431 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1432 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
1436 vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command(g_vc_m));
1438 SLOG(LOG_DEBUG, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)",
1439 result_type, temp_text, event, temp_message);
1441 vc_cmd_print_list(vc_cmd_list);
1445 vc_mgr_client_use_callback(g_vc_m);
1446 cb_ret = all_callback(event, vc_cmd_list, temp_text, temp_message, all_user_data);
1447 vc_mgr_client_not_use_callback(g_vc_m);
1449 if (true == vc_mgr_client_get_exclusive_command(g_vc_m)) {
1451 vc_result_cb callback = NULL;
1452 void* user_data = NULL;
1454 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
1455 if (NULL == callback) {
1456 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
1460 vc_mgr_client_use_callback(g_vc_m);
1461 callback(event, vc_cmd_list, temp_text, user_data);
1462 vc_mgr_client_not_use_callback(g_vc_m);
1463 SLOG(LOG_DEBUG, TAG_VCM, "Exclusive result callback called");
1465 /* Release result */
1466 if (NULL != temp_text) free(temp_text);
1469 vc_cmd_list_destroy(vc_cmd_list, true);
1471 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1477 vc_cmd_list_get_count(vc_cmd_list, &count);
1479 if (true == cb_ret) {
1480 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is true");
1481 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
1482 ecore_idler_add(__vc_mgr_set_select_result, NULL);
1484 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is false");
1485 /* need to select conflicted result */
1487 vc_mgr_client_set_all_result(g_vc_m, event, temp_text);
1490 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
1491 ecore_idler_add(__vc_mgr_set_select_result, NULL);
1493 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1494 vc_mgr_client_unset_all_result(g_vc_m);
1497 /* Release result */
1498 if (NULL != temp_text) free(temp_text);
1501 vc_cmd_list_destroy(vc_cmd_list, true);
1506 static Eina_Bool __vc_mgr_notify_result(void *data)
1510 vc_cmd_list_h vc_cmd_list = NULL;
1512 vc_result_cb callback = NULL;
1513 void* user_data = NULL;
1515 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
1516 if (NULL == callback) {
1517 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
1521 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1522 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
1526 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1528 SLOG(LOG_DEBUG, TAG_VCM, "Result : result text(%s) event(%d)", temp_text, event);
1530 vc_cmd_print_list(vc_cmd_list);
1532 vc_mgr_client_use_callback(g_vc_m);
1533 callback(event, vc_cmd_list, temp_text, user_data);
1534 vc_mgr_client_not_use_callback(g_vc_m);
1535 SLOG(LOG_DEBUG, TAG_VCM, "Result callback called");
1537 vc_cmd_list_destroy(vc_cmd_list, true);
1539 /* Release result */
1540 if (NULL != temp_text) free(temp_text);
1545 void __vc_mgr_cb_all_result(vc_result_type_e type)
1547 if (false == vc_mgr_client_get_exclusive_command(g_vc_m)) {
1548 __vc_mgr_notify_all_result(type);
1550 __vc_mgr_notify_result(0);
1556 void __vc_mgr_cb_system_result()
1558 __vc_mgr_notify_result(NULL);
1562 static Eina_Bool __vc_mgr_speech_detected(void *data)
1564 vc_mgr_begin_speech_detected_cb callback = NULL;
1565 void* user_data = NULL;
1567 vc_mgr_client_get_speech_detected_cb(g_vc_m, &callback, &user_data);
1568 if (NULL == callback) {
1569 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
1573 vc_mgr_client_use_callback(g_vc_m);
1574 callback(user_data);
1575 vc_mgr_client_not_use_callback(g_vc_m);
1576 SLOG(LOG_DEBUG, TAG_VCM, "Speech detected callback called");
1581 void __vc_mgr_cb_speech_detected()
1583 __vc_mgr_speech_detected(NULL);
1588 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
1590 if (NULL == callback)
1591 return VC_ERROR_INVALID_PARAMETER;
1594 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1595 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1596 return VC_ERROR_INVALID_STATE;
1600 if (state != VC_STATE_INITIALIZED) {
1601 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
1602 return VC_ERROR_INVALID_STATE;
1605 vc_mgr_client_set_all_result_cb(g_vc_m, callback, user_data);
1607 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set all result callback");
1612 int vc_mgr_unset_all_result_cb()
1615 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1616 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1617 return VC_ERROR_INVALID_STATE;
1621 if (state != VC_STATE_INITIALIZED) {
1622 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1623 return VC_ERROR_INVALID_STATE;
1626 vc_mgr_client_set_all_result_cb(g_vc_m, NULL, NULL);
1631 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
1633 if (NULL == callback)
1634 return VC_ERROR_INVALID_PARAMETER;
1637 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1638 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1639 return VC_ERROR_INVALID_STATE;
1643 if (state != VC_STATE_INITIALIZED) {
1644 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
1645 return VC_ERROR_INVALID_STATE;
1648 vc_mgr_client_set_result_cb(g_vc_m, callback, user_data);
1653 int vc_mgr_unset_result_cb()
1656 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1657 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1658 return VC_ERROR_INVALID_STATE;
1662 if (state != VC_STATE_INITIALIZED) {
1663 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1664 return VC_ERROR_INVALID_STATE;
1667 vc_mgr_client_set_result_cb(g_vc_m, NULL, NULL);
1672 static Eina_Bool __vc_mgr_notify_error(void *data)
1674 vc_h vc_m = (vc_h)data;
1676 vc_error_cb callback = NULL;
1677 void* user_data = NULL;
1680 vc_mgr_client_get_error_cb(vc_m, &callback, &user_data);
1681 vc_mgr_client_get_error(vc_m, &reason);
1683 if (NULL != callback) {
1684 vc_mgr_client_use_callback(vc_m);
1685 callback(reason, user_data);
1686 vc_mgr_client_not_use_callback(vc_m);
1687 SLOG(LOG_DEBUG, TAG_VCM, "Error callback is called");
1689 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
1695 int __vc_mgr_cb_error(int pid, int reason)
1697 if (0 != vc_mgr_client_get_handle(pid, &g_vc_m)) {
1698 SLOG(LOG_ERROR, TAG_VCM, "Handle is not valid");
1702 vc_mgr_client_set_error(g_vc_m, reason);
1703 __vc_mgr_notify_error(g_vc_m);
1708 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
1710 vc_state_changed_cb changed_callback = NULL;
1713 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
1715 vc_state_e current_state;
1716 vc_state_e before_state;
1718 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
1720 if (NULL != changed_callback) {
1721 vc_mgr_client_use_callback(g_vc_m);
1722 changed_callback(before_state, current_state, user_data);
1723 vc_mgr_client_not_use_callback(g_vc_m);
1724 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
1726 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
1732 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1734 if (callback == NULL)
1735 return VC_ERROR_INVALID_PARAMETER;
1738 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1739 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
1740 return VC_ERROR_INVALID_STATE;
1744 if (state != VC_STATE_INITIALIZED) {
1745 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
1746 return VC_ERROR_INVALID_STATE;
1749 vc_mgr_client_set_state_changed_cb(g_vc_m, callback, user_data);
1754 int vc_mgr_unset_state_changed_cb()
1757 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1758 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
1759 return VC_ERROR_INVALID_STATE;
1763 if (state != VC_STATE_INITIALIZED) {
1764 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
1765 return VC_ERROR_INVALID_STATE;
1768 vc_mgr_client_set_state_changed_cb(g_vc_m, NULL, NULL);
1773 int __vc_mgr_cb_service_state(int state)
1775 vc_service_state_e current_state = (vc_service_state_e)state;
1776 vc_service_state_e before_state;
1777 vc_mgr_client_get_service_state(g_vc_m, &before_state);
1779 if (current_state == before_state) {
1780 SLOG(LOG_WARN, TAG_VCM, "Service State NOT changed : Before(%d) Current(%d)",
1781 before_state, current_state);
1785 SLOG(LOG_DEBUG, TAG_VCM, "Service State changed : Before(%d) Current(%d)",
1786 before_state, current_state);
1788 /* Save service state */
1789 vc_mgr_client_set_service_state(g_vc_m, current_state);
1791 vc_service_state_changed_cb callback = NULL;
1792 void* service_user_data = NULL;
1793 vc_mgr_client_get_service_state_changed_cb(g_vc_m, &callback, &service_user_data);
1795 if (NULL != callback) {
1796 vc_mgr_client_use_callback(g_vc_m);
1797 callback(before_state, current_state, service_user_data);
1798 vc_mgr_client_not_use_callback(g_vc_m);
1799 SLOG(LOG_DEBUG, TAG_VCM, "Service state changed callback is called");
1801 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
1807 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
1809 if (callback == NULL)
1810 return VC_ERROR_INVALID_PARAMETER;
1813 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1814 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
1815 return VC_ERROR_INVALID_STATE;
1819 if (state != VC_STATE_INITIALIZED) {
1820 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
1821 return VC_ERROR_INVALID_STATE;
1824 vc_mgr_client_set_service_state_changed_cb(g_vc_m, callback, user_data);
1829 int vc_mgr_unset_service_state_changed_cb()
1832 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1833 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
1834 return VC_ERROR_INVALID_STATE;
1838 if (state != VC_STATE_INITIALIZED) {
1839 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
1840 return VC_ERROR_INVALID_STATE;
1843 vc_mgr_client_set_service_state_changed_cb(g_vc_m, NULL, NULL);
1847 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
1849 if (callback == NULL)
1850 return VC_ERROR_INVALID_PARAMETER;
1853 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1854 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
1855 return VC_ERROR_INVALID_STATE;
1859 if (state != VC_STATE_INITIALIZED) {
1860 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set speech detected callback : Current state is not 'Initialized'");
1861 return VC_ERROR_INVALID_STATE;
1864 vc_mgr_client_set_speech_detected_cb(g_vc_m, callback, user_data);
1869 int vc_mgr_unset_speech_detected_cb()
1872 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1873 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
1874 return VC_ERROR_INVALID_STATE;
1878 if (state != VC_STATE_INITIALIZED) {
1879 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
1880 return VC_ERROR_INVALID_STATE;
1883 vc_mgr_client_set_speech_detected_cb(g_vc_m, NULL, NULL);
1887 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
1889 if (NULL == callback)
1890 return VC_ERROR_INVALID_PARAMETER;
1893 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1894 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
1895 return VC_ERROR_INVALID_STATE;
1899 if (state != VC_STATE_INITIALIZED) {
1900 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : Current state is not 'Initialized'");
1901 return VC_ERROR_INVALID_STATE;
1904 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, callback, user_data);
1909 int vc_mgr_unset_current_language_changed_cb()
1912 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1913 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
1914 return VC_ERROR_INVALID_STATE;
1918 if (state != VC_STATE_INITIALIZED) {
1919 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
1920 return VC_ERROR_INVALID_STATE;
1923 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, NULL, NULL);
1928 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
1930 if (NULL == callback)
1931 return VC_ERROR_INVALID_PARAMETER;
1934 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1935 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
1936 return VC_ERROR_INVALID_STATE;
1940 if (state != VC_STATE_INITIALIZED) {
1941 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
1942 return VC_ERROR_INVALID_STATE;
1945 vc_mgr_client_set_error_cb(g_vc_m, callback, user_data);
1950 int vc_mgr_unset_error_cb()
1953 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1954 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
1955 return VC_ERROR_INVALID_STATE;
1959 if (state != VC_STATE_INITIALIZED) {
1960 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
1961 return VC_ERROR_INVALID_STATE;
1964 vc_mgr_client_set_error_cb(g_vc_m, NULL, NULL);
1969 static bool __vc_mgr_check_demandable_client(int pid)
1971 if (0 == g_slist_length(g_demandable_client_list)) {
1972 SLOG(LOG_WARN, TAG_VCM, "[WARNING] No demandable clients");
1976 char appid[128] = {'\0', };
1977 aul_app_get_appid_bypid(pid, appid, sizeof(appid));
1979 if (0 >= strlen(appid)) {
1980 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No appid");
1983 SLOG(LOG_DEBUG, TAG_VCM, "[CHECK] Appid - %s", appid);
1985 GSList *iter = NULL;
1986 vc_demandable_client_s* temp_client;
1987 iter = g_slist_nth(g_demandable_client_list, 0);
1989 while (NULL != iter) {
1990 temp_client = iter->data;
1992 if (NULL != temp_client) {
1993 if (NULL != temp_client->appid) {
1994 if (!strcmp(temp_client->appid, appid)) {
1995 SLOG(LOG_DEBUG, TAG_VCM, "pid(%d) is available", pid);
2001 iter = g_slist_next(iter);
2008 int __vc_mgr_request_auth_enable(int pid)
2010 if (false == __vc_mgr_check_demandable_client(pid)) {
2011 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not demandable client");
2012 return VC_ERROR_INVALID_PARAMETER;
2015 /* check already authorized */
2016 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2017 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already authorized");
2018 return VC_ERROR_INVALID_PARAMETER;
2021 /* add authorized list */
2022 if (0 != vc_mgr_client_add_authorized_client(g_vc_m, pid)) {
2023 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add authorized client");
2024 return VC_ERROR_OPERATION_FAILED;
2027 /* foreground check */
2029 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fore_pid)) {
2030 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get foreground");
2031 return VC_ERROR_OPERATION_FAILED;
2034 if (pid == fore_pid) {
2035 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
2041 int __vc_mgr_request_auth_disable(int pid)
2043 /* check authorized */
2044 if (false == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2045 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No authorized");
2046 return VC_ERROR_INVALID_PARAMETER;
2049 /* remove authorized list */
2050 if (0 != vc_mgr_client_remove_authorized_client(g_vc_m, pid)) {
2051 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to remove authorized client");
2052 return VC_ERROR_OPERATION_FAILED;
2055 /* check authority valid */
2056 if (true == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2057 SLOG(LOG_DEBUG, TAG_VCM, "Valid authorized client is removed");
2058 if (0 != vc_mgr_client_set_valid_authorized_client(g_vc_m, -1)) {
2059 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set valid authorized client");
2060 return VC_ERROR_OPERATION_FAILED;
2067 static Eina_Bool __request_auth_start(void* data)
2069 SLOG(LOG_DEBUG, TAG_VCM, "Request Start");
2071 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, true)) {
2072 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2075 if (0 != vc_mgr_start(false)) {
2076 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request start is failed");
2077 /* TODO - Error handling? */
2080 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, false)) {
2081 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2088 int __vc_mgr_request_auth_start(int pid)
2090 /* check authorized */
2091 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2092 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2093 return VC_ERROR_INVALID_PARAMETER;
2096 /* add timer for start recording */
2097 ecore_timer_add(0, __request_auth_start, NULL);
2102 static Eina_Bool __request_auth_stop(void* data)
2104 SLOG(LOG_DEBUG, TAG_VCM, "Request Stop");
2106 if (0 != vc_mgr_stop()) {
2107 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request stop is failed");
2108 /* TODO - Error handling? */
2114 int __vc_mgr_request_auth_stop(int pid)
2116 /* check authorized */
2117 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2118 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2119 return VC_ERROR_INVALID_PARAMETER;
2122 /* add timer for start recording */
2123 ecore_timer_add(0, __request_auth_stop, NULL);
2128 static Eina_Bool __request_auth_cancel(void* data)
2130 SLOG(LOG_DEBUG, TAG_VCM, "Request Cancel");
2132 if (0 != vc_mgr_cancel()) {
2133 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request cancel is failed");
2134 /* TODO - Error handling? */
2140 int __vc_mgr_request_auth_cancel(int pid)
2142 /* check authorized */
2143 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2144 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2145 return VC_ERROR_INVALID_PARAMETER;
2148 /* add timer for start recording */
2149 ecore_timer_add(0, __request_auth_cancel, NULL);