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;
209 int vc_client_get_service_state_changed_cb(vc_service_state_changed_cb* callback, void** user_data)
212 if (NULL == g_client)
213 return VC_ERROR_INVALID_PARAMETER;
215 *callback = g_client->service_state_changed_cb;
216 *user_data = g_client->service_state_changed_user_data;
218 return VC_ERROR_NONE;
222 int vc_client_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
225 if (NULL == g_client)
226 return VC_ERROR_INVALID_PARAMETER;
228 g_client->state_changed_cb = callback;
229 g_client->state_changed_user_data = user_data;
231 return VC_ERROR_NONE;
235 int vc_client_get_state_changed_cb(vc_state_changed_cb* callback, void** user_data)
238 if (NULL == g_client)
239 return VC_ERROR_INVALID_PARAMETER;
241 *callback = g_client->state_changed_cb;
242 *user_data = g_client->state_changed_user_data;
244 return VC_ERROR_NONE;
248 int vc_client_set_current_lang_changed_cb(vc_current_language_changed_cb callback, void* user_data)
251 if (NULL == g_client)
252 return VC_ERROR_INVALID_PARAMETER;
254 g_client->current_lang_changed_cb = callback;
255 g_client->current_lang_changed_user_data = user_data;
257 return VC_ERROR_NONE;
261 int vc_client_get_current_lang_changed_cb(vc_current_language_changed_cb* callback, void** user_data)
264 if (NULL == g_client)
265 return VC_ERROR_INVALID_PARAMETER;
267 *callback = g_client->current_lang_changed_cb;
268 *user_data = g_client->current_lang_changed_user_data;
270 return VC_ERROR_NONE;
274 int vc_client_set_error_cb(vc_error_cb callback, void* user_data)
277 if (NULL == g_client)
278 return VC_ERROR_INVALID_PARAMETER;
280 g_client->error_cb = callback;
281 g_client->error_user_data = user_data;
283 return VC_ERROR_NONE;
287 int vc_client_get_error_cb(vc_error_cb* callback, void** user_data)
290 if (NULL == g_client)
291 return VC_ERROR_INVALID_PARAMETER;
293 *callback = g_client->error_cb;
294 *user_data = g_client->error_user_data;
296 return VC_ERROR_NONE;
301 int vc_client_set_service_state(vc_service_state_e state)
304 if (NULL == g_client)
305 return VC_ERROR_INVALID_PARAMETER;
307 g_client->service_state = state;
309 return VC_ERROR_NONE;
312 int vc_client_get_service_state(vc_service_state_e* state)
315 if (NULL == g_client)
316 return VC_ERROR_INVALID_PARAMETER;
318 *state = g_client->service_state;
320 return VC_ERROR_NONE;
323 int vc_client_set_client_state(vc_state_e state)
326 if (NULL == g_client)
327 return VC_ERROR_INVALID_PARAMETER;
329 g_client->previous_state = g_client->current_state;
330 g_client->current_state = state;
332 return VC_ERROR_NONE;
335 int vc_client_get_client_state(vc_state_e* state)
338 if (NULL == g_client)
339 return VC_ERROR_INVALID_PARAMETER;
341 *state = g_client->current_state;
343 return VC_ERROR_NONE;
346 int vc_client_get_previous_state(vc_state_e* state, vc_state_e* previous_state)
349 if (NULL == g_client)
350 return VC_ERROR_INVALID_PARAMETER;
352 *previous_state = g_client->previous_state;
353 *state = g_client->current_state;
355 return VC_ERROR_NONE;
358 int vc_client_set_invocation_name(const char* invocation_name)
361 if (NULL == g_client)
362 return VC_ERROR_INVALID_PARAMETER;
364 if (NULL != g_client->invocation_name) {
365 free(g_client->invocation_name);
366 g_client->invocation_name = NULL;
369 if (NULL != invocation_name) {
370 g_client->invocation_name = strdup(invocation_name);
372 return VC_ERROR_NONE;
375 int vc_client_get_invocation_name(char** invocation_name)
378 if (NULL == g_client)
379 return VC_ERROR_INVALID_PARAMETER;
381 if (NULL != g_client->invocation_name)
382 *invocation_name = strdup(g_client->invocation_name);
383 return VC_ERROR_NONE;
386 int vc_client_set_is_foreground(bool value)
389 if (NULL == g_client)
390 return VC_ERROR_INVALID_PARAMETER;
392 g_client->is_foreground = value;
393 return VC_ERROR_NONE;
396 int vc_client_get_is_foreground(bool* value)
399 if (NULL == g_client)
400 return VC_ERROR_INVALID_PARAMETER;
402 *value = g_client->is_foreground;
404 return VC_ERROR_NONE;
409 int vc_client_set_exclusive_cmd(vc_h vc, bool value)
411 vc_client_s* client = __client_get(vc);
415 return VC_ERROR_INVALID_PARAMETER;
417 client->exclusive_cmd = value;
419 return VC_ERROR_NONE;
422 int vc_client_get_exclusive_cmd(vc_h vc, bool* value)
424 vc_client_s* client = __client_get(vc);
428 return VC_ERROR_INVALID_PARAMETER;
430 *value = client->exclusive_cmd;
432 return VC_ERROR_NONE;
437 int vc_client_set_error(int reason)
440 if (NULL == g_client)
441 return VC_ERROR_INVALID_PARAMETER;
443 g_client->reason = reason;
445 return VC_ERROR_NONE;
448 int vc_client_get_error(int* reason)
451 if (NULL == g_client)
452 return VC_ERROR_INVALID_PARAMETER;
454 *reason = g_client->reason;
456 return VC_ERROR_NONE;
461 int vc_client_use_callback(void)
464 if (NULL == g_client)
465 return VC_ERROR_INVALID_PARAMETER;
467 g_client->cb_ref_count++;
468 return VC_ERROR_NONE;
471 int vc_client_not_use_callback(void)
474 if (NULL == g_client)
475 return VC_ERROR_INVALID_PARAMETER;
477 g_client->cb_ref_count--;
478 return VC_ERROR_NONE;
483 int vc_client_set_auth_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
486 if (NULL == g_client)
487 return VC_ERROR_INVALID_PARAMETER;
489 g_client->auth_state_changed_cb = callback;
490 g_client->auth_state_changed_user_data = user_data;
492 return VC_ERROR_NONE;
495 int vc_client_get_auth_state_changed_cb(vc_auth_state_changed_cb* callback, void** user_data)
498 if (NULL == g_client)
499 return VC_ERROR_INVALID_PARAMETER;
501 *callback = g_client->auth_state_changed_cb;
502 *user_data = g_client->auth_state_changed_user_data;
504 return VC_ERROR_NONE;
507 int vc_client_unset_auth_state_changed_cb(void)
510 if (NULL == g_client)
511 return VC_ERROR_INVALID_PARAMETER;
513 g_client->auth_state_changed_cb = NULL;
514 g_client->auth_state_changed_user_data = NULL;
516 return VC_ERROR_NONE;
519 int vc_client_set_auth_state(vc_auth_state_e state)
522 if (NULL == g_client)
523 return VC_ERROR_INVALID_PARAMETER;
525 g_client->auth_previous_state = g_client->auth_current_state;
526 g_client->auth_current_state = state;
528 return VC_ERROR_NONE;
531 int vc_client_get_auth_state(vc_auth_state_e* state)
534 if (NULL == g_client)
535 return VC_ERROR_INVALID_PARAMETER;
537 *state = g_client->auth_current_state;
539 return VC_ERROR_NONE;
542 int vc_client_get_previous_auth_state(vc_auth_state_e* previous, vc_auth_state_e* current)
545 if (NULL == g_client)
546 return VC_ERROR_INVALID_PARAMETER;
548 *previous = g_client->auth_previous_state;
549 *current = g_client->auth_current_state;
551 return VC_ERROR_NONE;
555 int vc_client_set_mgr_pid(int mgr_pid)
558 if (NULL == g_client)
559 return VC_ERROR_INVALID_PARAMETER;
561 g_client->mgr_pid = mgr_pid;
563 return VC_ERROR_NONE;
566 int vc_client_get_mgr_pid(int* mgr_pid)
569 if (NULL == g_client)
570 return VC_ERROR_INVALID_PARAMETER;
572 *mgr_pid = g_client->mgr_pid;
574 return VC_ERROR_NONE;
577 int vc_client_set_tts_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
580 if (NULL == g_client)
581 return VC_ERROR_INVALID_PARAMETER;
583 g_client->tts_streaming_cb = callback;
584 g_client->tts_streaming_user_data = user_data;
586 return VC_ERROR_NONE;
589 int vc_client_get_tts_streaming_cb(vc_tts_streaming_cb* callback, void** user_data)
592 if (NULL == g_client)
593 return VC_ERROR_INVALID_PARAMETER;
595 *callback = g_client->tts_streaming_cb;
596 *user_data = g_client->tts_streaming_user_data;
598 return VC_ERROR_NONE;
601 int vc_client_set_tts_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
604 if (NULL == g_client)
605 return VC_ERROR_INVALID_PARAMETER;
607 g_client->tts_utterance_status_cb = callback;
608 g_client->tts_utterance_status_user_data = user_data;
610 return VC_ERROR_NONE;
613 int vc_client_get_tts_utterance_status_cb(vc_tts_utterance_status_cb* callback, void** user_data)
616 if (NULL == g_client)
617 return VC_ERROR_INVALID_PARAMETER;
619 *callback = g_client->tts_utterance_status_cb;
620 *user_data = g_client->tts_utterance_status_user_data;
622 return VC_ERROR_NONE;
625 int vc_client_set_start_listening(bool is_listening_started)
627 if (NULL == g_client)
628 return VC_ERROR_INVALID_PARAMETER;
630 g_client->start_listening = is_listening_started;
631 return VC_ERROR_NONE;
634 bool vc_client_is_listening_started()
636 if (NULL == g_client)
639 return g_client->start_listening;