2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "vc_client.h"
24 vc_result_cb result_cb;
25 void* result_user_data;
27 void* error_user_data;
28 vc_service_state_changed_cb service_state_changed_cb;
29 void* service_state_changed_user_data;
30 vc_state_changed_cb state_changed_cb;
31 void* state_changed_user_data;
32 vc_current_language_changed_cb current_lang_changed_cb;
33 void* current_lang_changed_user_data;
36 vc_tts_streaming_cb tts_streaming_cb;
37 void* tts_streaming_user_data;
38 vc_tts_utterance_status_cb tts_utterance_status_cb;
39 void* tts_utterance_status_user_data;
42 /* exclusive option */
47 vc_service_state_e service_state;
50 vc_state_e previous_state;
51 vc_state_e current_state;
60 vc_auth_state_e auth_previous_state;
61 vc_auth_state_e auth_current_state;
62 vc_auth_state_changed_cb auth_state_changed_cb;
63 void* auth_state_changed_user_data;
71 char* invocation_name;
73 /* Listening IPC message from service */
77 static vc_client_s *g_client = NULL;
80 int vc_client_create(void)
82 if (NULL != g_client) {
83 SLOG(LOG_WARN, TAG_VCC, "[WARNING] A client is already exist.");
87 g_client = (vc_client_s*)calloc(1, sizeof(vc_client_s));
88 if (NULL == g_client) {
89 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to allocate memory"); //LCOV_EXCL_LINE
90 return VC_ERROR_OUT_OF_MEMORY;
93 /* initialize client data */
94 g_client->pid = getpid();
96 g_client->result_cb = NULL;
97 g_client->result_user_data = NULL;
98 g_client->service_state_changed_cb = NULL;
99 g_client->service_state_changed_user_data = NULL;
100 g_client->state_changed_cb = NULL;
101 g_client->state_changed_user_data = NULL;
102 g_client->current_lang_changed_cb = NULL;
103 g_client->current_lang_changed_user_data = NULL;
104 g_client->error_cb = NULL;
105 g_client->error_user_data = NULL;
106 g_client->tts_streaming_cb = NULL;
107 g_client->tts_streaming_user_data = NULL;
108 g_client->tts_utterance_status_cb = NULL;
109 g_client->tts_utterance_status_user_data = NULL;
112 g_client->exclusive_cmd = false;
115 g_client->service_state = VC_RUNTIME_INFO_NO_FOREGROUND;
117 g_client->previous_state = VC_STATE_INITIALIZED;
118 g_client->current_state = VC_STATE_INITIALIZED;
120 g_client->cb_ref_count = 0;
123 g_client->auth_previous_state = VC_AUTH_STATE_NONE;
124 g_client->auth_current_state = VC_AUTH_STATE_NONE;
125 g_client->auth_state_changed_cb = NULL;
126 g_client->auth_state_changed_user_data = NULL;
128 g_client->is_foreground = false;
129 g_client->invocation_name = NULL;
130 g_client->start_listening = false;
132 SLOG(LOG_INFO, TAG_VCC, "[INFO] client create. pid(%u)", g_client->pid);
134 return VC_ERROR_NONE;
137 int vc_client_destroy(void)
139 if (NULL == g_client) {
140 SLOG(LOG_ERROR, TAG_VCC, "A client is already NULL"); //LCOV_EXCL_LINE
141 return VC_ERROR_NONE;
144 while (0 != g_client->cb_ref_count) {
145 /* wait for release callback function */
148 if (NULL != g_client->invocation_name) {
149 free(g_client->invocation_name);
150 g_client->invocation_name = NULL;
155 return VC_ERROR_NONE;
158 bool vc_client_is_valid(void)
161 if (NULL == g_client) {
162 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] The current client is not valid");
169 /* set/get callback function */
170 int vc_client_set_result_cb(vc_result_cb callback, void* user_data)
173 if (NULL == g_client)
174 return VC_ERROR_INVALID_PARAMETER;
176 g_client->result_cb = callback;
177 g_client->result_user_data = user_data;
179 return VC_ERROR_NONE;
183 int vc_client_get_result_cb(vc_result_cb* callback, void** user_data)
186 if (NULL == g_client)
187 return VC_ERROR_INVALID_PARAMETER;
189 *callback = g_client->result_cb;
190 *user_data = g_client->result_user_data;
192 return VC_ERROR_NONE;
196 int vc_client_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
199 if (NULL == g_client)
200 return VC_ERROR_INVALID_PARAMETER;
202 g_client->service_state_changed_cb = callback;
203 g_client->service_state_changed_user_data = user_data;
205 return VC_ERROR_NONE;
208 int vc_client_get_service_state_changed_cb(vc_service_state_changed_cb* callback, void** user_data)
211 if (NULL == g_client)
212 return VC_ERROR_INVALID_PARAMETER;
214 *callback = g_client->service_state_changed_cb;
215 *user_data = g_client->service_state_changed_user_data;
217 return VC_ERROR_NONE;
220 int vc_client_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
223 if (NULL == g_client)
224 return VC_ERROR_INVALID_PARAMETER;
226 g_client->state_changed_cb = callback;
227 g_client->state_changed_user_data = user_data;
229 return VC_ERROR_NONE;
232 int vc_client_get_state_changed_cb(vc_state_changed_cb* callback, void** user_data)
235 if (NULL == g_client)
236 return VC_ERROR_INVALID_PARAMETER;
238 *callback = g_client->state_changed_cb;
239 *user_data = g_client->state_changed_user_data;
241 return VC_ERROR_NONE;
244 int vc_client_set_current_lang_changed_cb(vc_current_language_changed_cb callback, void* user_data)
247 if (NULL == g_client)
248 return VC_ERROR_INVALID_PARAMETER;
250 g_client->current_lang_changed_cb = callback;
251 g_client->current_lang_changed_user_data = user_data;
253 return VC_ERROR_NONE;
257 int vc_client_get_current_lang_changed_cb(vc_current_language_changed_cb* callback, void** user_data)
260 if (NULL == g_client)
261 return VC_ERROR_INVALID_PARAMETER;
263 *callback = g_client->current_lang_changed_cb;
264 *user_data = g_client->current_lang_changed_user_data;
266 return VC_ERROR_NONE;
270 int vc_client_set_error_cb(vc_error_cb callback, void* user_data)
273 if (NULL == g_client)
274 return VC_ERROR_INVALID_PARAMETER;
276 g_client->error_cb = callback;
277 g_client->error_user_data = user_data;
279 return VC_ERROR_NONE;
282 int vc_client_get_error_cb(vc_error_cb* callback, void** user_data)
285 if (NULL == g_client)
286 return VC_ERROR_INVALID_PARAMETER;
288 *callback = g_client->error_cb;
289 *user_data = g_client->error_user_data;
291 return VC_ERROR_NONE;
295 int vc_client_set_service_state(vc_service_state_e state)
298 if (NULL == g_client)
299 return VC_ERROR_INVALID_PARAMETER;
301 g_client->service_state = state;
303 return VC_ERROR_NONE;
306 int vc_client_get_service_state(vc_service_state_e* state)
309 if (NULL == g_client)
310 return VC_ERROR_INVALID_PARAMETER;
312 *state = g_client->service_state;
314 return VC_ERROR_NONE;
317 int vc_client_set_client_state(vc_state_e state)
320 if (NULL == g_client)
321 return VC_ERROR_INVALID_PARAMETER;
323 g_client->previous_state = g_client->current_state;
324 g_client->current_state = state;
326 return VC_ERROR_NONE;
329 int vc_client_get_client_state(vc_state_e* state)
332 if (NULL == g_client)
333 return VC_ERROR_INVALID_PARAMETER;
335 *state = g_client->current_state;
337 return VC_ERROR_NONE;
340 int vc_client_get_previous_state(vc_state_e* state, vc_state_e* previous_state)
343 if (NULL == g_client)
344 return VC_ERROR_INVALID_PARAMETER;
346 *previous_state = g_client->previous_state;
347 *state = g_client->current_state;
349 return VC_ERROR_NONE;
352 int vc_client_set_invocation_name(const char* invocation_name)
355 if (NULL == g_client)
356 return VC_ERROR_INVALID_PARAMETER;
358 if (NULL != g_client->invocation_name) {
359 free(g_client->invocation_name);
360 g_client->invocation_name = NULL;
363 if (NULL != invocation_name) {
364 g_client->invocation_name = strdup(invocation_name);
366 return VC_ERROR_NONE;
369 int vc_client_get_invocation_name(char** invocation_name)
372 if (NULL == g_client)
373 return VC_ERROR_INVALID_PARAMETER;
375 if (NULL != g_client->invocation_name)
376 *invocation_name = strdup(g_client->invocation_name);
377 return VC_ERROR_NONE;
381 int vc_client_set_is_foreground(bool value)
384 if (NULL == g_client)
385 return VC_ERROR_INVALID_PARAMETER;
387 g_client->is_foreground = value;
388 return VC_ERROR_NONE;
391 int vc_client_get_is_foreground(bool* value)
394 if (NULL == g_client)
395 return VC_ERROR_INVALID_PARAMETER;
397 *value = g_client->is_foreground;
399 return VC_ERROR_NONE;
403 int vc_client_set_exclusive_cmd(vc_h vc, bool value)
405 vc_client_s* client = __client_get(vc);
409 return VC_ERROR_INVALID_PARAMETER;
411 client->exclusive_cmd = value;
413 return VC_ERROR_NONE;
416 int vc_client_get_exclusive_cmd(vc_h vc, bool* value)
418 vc_client_s* client = __client_get(vc);
422 return VC_ERROR_INVALID_PARAMETER;
424 *value = client->exclusive_cmd;
426 return VC_ERROR_NONE;
431 int vc_client_set_error(int reason)
434 if (NULL == g_client)
435 return VC_ERROR_INVALID_PARAMETER;
437 g_client->reason = reason;
439 return VC_ERROR_NONE;
442 int vc_client_get_error(int* reason)
445 if (NULL == g_client)
446 return VC_ERROR_INVALID_PARAMETER;
448 *reason = g_client->reason;
450 return VC_ERROR_NONE;
455 int vc_client_use_callback(void)
458 if (NULL == g_client)
459 return VC_ERROR_INVALID_PARAMETER;
461 g_client->cb_ref_count++;
462 return VC_ERROR_NONE;
465 int vc_client_not_use_callback(void)
468 if (NULL == g_client)
469 return VC_ERROR_INVALID_PARAMETER;
471 g_client->cb_ref_count--;
472 return VC_ERROR_NONE;
477 int vc_client_set_auth_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
480 if (NULL == g_client)
481 return VC_ERROR_INVALID_PARAMETER;
483 g_client->auth_state_changed_cb = callback;
484 g_client->auth_state_changed_user_data = user_data;
486 return VC_ERROR_NONE;
489 int vc_client_get_auth_state_changed_cb(vc_auth_state_changed_cb* callback, void** user_data)
492 if (NULL == g_client)
493 return VC_ERROR_INVALID_PARAMETER;
495 *callback = g_client->auth_state_changed_cb;
496 *user_data = g_client->auth_state_changed_user_data;
498 return VC_ERROR_NONE;
501 int vc_client_unset_auth_state_changed_cb(void)
504 if (NULL == g_client)
505 return VC_ERROR_INVALID_PARAMETER;
507 g_client->auth_state_changed_cb = NULL;
508 g_client->auth_state_changed_user_data = NULL;
510 return VC_ERROR_NONE;
513 int vc_client_set_auth_state(vc_auth_state_e state)
516 if (NULL == g_client)
517 return VC_ERROR_INVALID_PARAMETER;
519 g_client->auth_previous_state = g_client->auth_current_state;
520 g_client->auth_current_state = state;
522 return VC_ERROR_NONE;
525 int vc_client_get_auth_state(vc_auth_state_e* state)
528 if (NULL == g_client)
529 return VC_ERROR_INVALID_PARAMETER;
531 *state = g_client->auth_current_state;
533 return VC_ERROR_NONE;
536 int vc_client_get_previous_auth_state(vc_auth_state_e* previous, vc_auth_state_e* current)
539 if (NULL == g_client)
540 return VC_ERROR_INVALID_PARAMETER;
542 *previous = g_client->auth_previous_state;
543 *current = g_client->auth_current_state;
545 return VC_ERROR_NONE;
549 int vc_client_set_mgr_pid(int mgr_pid)
552 if (NULL == g_client)
553 return VC_ERROR_INVALID_PARAMETER;
555 g_client->mgr_pid = mgr_pid;
557 return VC_ERROR_NONE;
560 int vc_client_get_mgr_pid(int* mgr_pid)
563 if (NULL == g_client)
564 return VC_ERROR_INVALID_PARAMETER;
566 *mgr_pid = g_client->mgr_pid;
568 return VC_ERROR_NONE;
571 int vc_client_set_tts_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
574 if (NULL == g_client)
575 return VC_ERROR_INVALID_PARAMETER;
577 g_client->tts_streaming_cb = callback;
578 g_client->tts_streaming_user_data = user_data;
580 return VC_ERROR_NONE;
584 int vc_client_get_tts_streaming_cb(vc_tts_streaming_cb* callback, void** user_data)
587 if (NULL == g_client)
588 return VC_ERROR_INVALID_PARAMETER;
590 *callback = g_client->tts_streaming_cb;
591 *user_data = g_client->tts_streaming_user_data;
593 return VC_ERROR_NONE;
597 int vc_client_set_tts_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
600 if (NULL == g_client)
601 return VC_ERROR_INVALID_PARAMETER;
603 g_client->tts_utterance_status_cb = callback;
604 g_client->tts_utterance_status_user_data = user_data;
606 return VC_ERROR_NONE;
610 int vc_client_get_tts_utterance_status_cb(vc_tts_utterance_status_cb* callback, void** user_data)
613 if (NULL == g_client)
614 return VC_ERROR_INVALID_PARAMETER;
616 *callback = g_client->tts_utterance_status_cb;
617 *user_data = g_client->tts_utterance_status_user_data;
619 return VC_ERROR_NONE;
623 int vc_client_set_start_listening(bool is_listening_started)
625 if (NULL == g_client)
626 return VC_ERROR_INVALID_PARAMETER;
628 g_client->start_listening = is_listening_started;
629 return VC_ERROR_NONE;
632 bool vc_client_is_listening_started()
634 if (NULL == g_client)
637 return g_client->start_listening;