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 */
147 if (NULL != g_client->invocation_name) {
148 free(g_client->invocation_name);
149 g_client->invocation_name = NULL;
154 return VC_ERROR_NONE;
157 bool vc_client_is_valid(void)
160 if (NULL == g_client) {
161 SLOG(LOG_DEBUG, TAG_VCC, "[DEBUG] The current client is not valid");
168 /* set/get callback function */
169 int vc_client_set_result_cb(vc_result_cb callback, void* user_data)
172 if (NULL == g_client)
173 return VC_ERROR_INVALID_PARAMETER;
175 g_client->result_cb = callback;
176 g_client->result_user_data = user_data;
178 return VC_ERROR_NONE;
182 int vc_client_get_result_cb(vc_result_cb* callback, void** user_data)
185 if (NULL == g_client)
186 return VC_ERROR_INVALID_PARAMETER;
188 *callback = g_client->result_cb;
189 *user_data = g_client->result_user_data;
191 return VC_ERROR_NONE;
195 int vc_client_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
198 if (NULL == g_client)
199 return VC_ERROR_INVALID_PARAMETER;
201 g_client->service_state_changed_cb = callback;
202 g_client->service_state_changed_user_data = user_data;
204 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;
221 int vc_client_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
224 if (NULL == g_client)
225 return VC_ERROR_INVALID_PARAMETER;
227 g_client->state_changed_cb = callback;
228 g_client->state_changed_user_data = user_data;
230 return VC_ERROR_NONE;
234 int vc_client_get_state_changed_cb(vc_state_changed_cb* callback, void** user_data)
237 if (NULL == g_client)
238 return VC_ERROR_INVALID_PARAMETER;
240 *callback = g_client->state_changed_cb;
241 *user_data = g_client->state_changed_user_data;
243 return VC_ERROR_NONE;
247 int vc_client_set_current_lang_changed_cb(vc_current_language_changed_cb callback, void* user_data)
250 if (NULL == g_client)
251 return VC_ERROR_INVALID_PARAMETER;
253 g_client->current_lang_changed_cb = callback;
254 g_client->current_lang_changed_user_data = user_data;
256 return VC_ERROR_NONE;
260 int vc_client_get_current_lang_changed_cb(vc_current_language_changed_cb* callback, void** user_data)
263 if (NULL == g_client)
264 return VC_ERROR_INVALID_PARAMETER;
266 *callback = g_client->current_lang_changed_cb;
267 *user_data = g_client->current_lang_changed_user_data;
269 return VC_ERROR_NONE;
273 int vc_client_set_error_cb(vc_error_cb callback, void* user_data)
276 if (NULL == g_client)
277 return VC_ERROR_INVALID_PARAMETER;
279 g_client->error_cb = callback;
280 g_client->error_user_data = user_data;
282 return VC_ERROR_NONE;
286 int vc_client_get_error_cb(vc_error_cb* callback, void** user_data)
289 if (NULL == g_client)
290 return VC_ERROR_INVALID_PARAMETER;
292 *callback = g_client->error_cb;
293 *user_data = g_client->error_user_data;
295 return VC_ERROR_NONE;
300 int vc_client_set_service_state(vc_service_state_e state)
303 if (NULL == g_client)
304 return VC_ERROR_INVALID_PARAMETER;
306 g_client->service_state = state;
308 return VC_ERROR_NONE;
311 int vc_client_get_service_state(vc_service_state_e* state)
314 if (NULL == g_client)
315 return VC_ERROR_INVALID_PARAMETER;
317 *state = g_client->service_state;
319 return VC_ERROR_NONE;
322 int vc_client_set_client_state(vc_state_e state)
325 if (NULL == g_client)
326 return VC_ERROR_INVALID_PARAMETER;
328 g_client->previous_state = g_client->current_state;
329 g_client->current_state = state;
331 return VC_ERROR_NONE;
334 int vc_client_get_client_state(vc_state_e* state)
337 if (NULL == g_client)
338 return VC_ERROR_INVALID_PARAMETER;
340 *state = g_client->current_state;
342 return VC_ERROR_NONE;
345 int vc_client_get_previous_state(vc_state_e* state, vc_state_e* previous_state)
348 if (NULL == g_client)
349 return VC_ERROR_INVALID_PARAMETER;
351 *previous_state = g_client->previous_state;
352 *state = g_client->current_state;
354 return VC_ERROR_NONE;
357 int vc_client_set_invocation_name(const char* invocation_name)
360 if (NULL == g_client)
361 return VC_ERROR_INVALID_PARAMETER;
363 if (NULL != g_client->invocation_name) {
364 free(g_client->invocation_name);
365 g_client->invocation_name = NULL;
368 if (NULL != invocation_name) {
369 g_client->invocation_name = strdup(invocation_name);
371 return VC_ERROR_NONE;
374 int vc_client_get_invocation_name(char** invocation_name)
377 if (NULL == g_client)
378 return VC_ERROR_INVALID_PARAMETER;
380 if (NULL != g_client->invocation_name)
381 *invocation_name = strdup(g_client->invocation_name);
382 return VC_ERROR_NONE;
385 int vc_client_set_is_foreground(bool value)
388 if (NULL == g_client)
389 return VC_ERROR_INVALID_PARAMETER;
391 g_client->is_foreground = value;
392 return VC_ERROR_NONE;
395 int vc_client_get_is_foreground(bool* value)
398 if (NULL == g_client)
399 return VC_ERROR_INVALID_PARAMETER;
401 *value = g_client->is_foreground;
403 return VC_ERROR_NONE;
408 int vc_client_set_exclusive_cmd(vc_h vc, bool value)
410 vc_client_s* client = __client_get(vc);
414 return VC_ERROR_INVALID_PARAMETER;
416 client->exclusive_cmd = value;
418 return VC_ERROR_NONE;
421 int vc_client_get_exclusive_cmd(vc_h vc, bool* value)
423 vc_client_s* client = __client_get(vc);
427 return VC_ERROR_INVALID_PARAMETER;
429 *value = client->exclusive_cmd;
431 return VC_ERROR_NONE;
436 int vc_client_set_error(int reason)
439 if (NULL == g_client)
440 return VC_ERROR_INVALID_PARAMETER;
442 g_client->reason = reason;
444 return VC_ERROR_NONE;
447 int vc_client_get_error(int* reason)
450 if (NULL == g_client)
451 return VC_ERROR_INVALID_PARAMETER;
453 *reason = g_client->reason;
455 return VC_ERROR_NONE;
460 int vc_client_use_callback(void)
463 if (NULL == g_client)
464 return VC_ERROR_INVALID_PARAMETER;
466 g_client->cb_ref_count++;
467 return VC_ERROR_NONE;
470 int vc_client_not_use_callback(void)
473 if (NULL == g_client)
474 return VC_ERROR_INVALID_PARAMETER;
476 g_client->cb_ref_count--;
477 return VC_ERROR_NONE;
482 int vc_client_set_auth_state_changed_cb(vc_auth_state_changed_cb callback, void* user_data)
485 if (NULL == g_client)
486 return VC_ERROR_INVALID_PARAMETER;
488 g_client->auth_state_changed_cb = callback;
489 g_client->auth_state_changed_user_data = user_data;
491 return VC_ERROR_NONE;
494 int vc_client_get_auth_state_changed_cb(vc_auth_state_changed_cb* callback, void** user_data)
497 if (NULL == g_client)
498 return VC_ERROR_INVALID_PARAMETER;
500 *callback = g_client->auth_state_changed_cb;
501 *user_data = g_client->auth_state_changed_user_data;
503 return VC_ERROR_NONE;
506 int vc_client_unset_auth_state_changed_cb(void)
509 if (NULL == g_client)
510 return VC_ERROR_INVALID_PARAMETER;
512 g_client->auth_state_changed_cb = NULL;
513 g_client->auth_state_changed_user_data = NULL;
515 return VC_ERROR_NONE;
518 int vc_client_set_auth_state(vc_auth_state_e state)
521 if (NULL == g_client)
522 return VC_ERROR_INVALID_PARAMETER;
524 g_client->auth_previous_state = g_client->auth_current_state;
525 g_client->auth_current_state = state;
527 return VC_ERROR_NONE;
530 int vc_client_get_auth_state(vc_auth_state_e* state)
533 if (NULL == g_client)
534 return VC_ERROR_INVALID_PARAMETER;
536 *state = g_client->auth_current_state;
538 return VC_ERROR_NONE;
541 int vc_client_get_previous_auth_state(vc_auth_state_e* previous, vc_auth_state_e* current)
544 if (NULL == g_client)
545 return VC_ERROR_INVALID_PARAMETER;
547 *previous = g_client->auth_previous_state;
548 *current = g_client->auth_current_state;
550 return VC_ERROR_NONE;
554 int vc_client_set_mgr_pid(int mgr_pid)
557 if (NULL == g_client)
558 return VC_ERROR_INVALID_PARAMETER;
560 g_client->mgr_pid = mgr_pid;
562 return VC_ERROR_NONE;
565 int vc_client_get_mgr_pid(int* mgr_pid)
568 if (NULL == g_client)
569 return VC_ERROR_INVALID_PARAMETER;
571 *mgr_pid = g_client->mgr_pid;
573 return VC_ERROR_NONE;
576 int vc_client_set_tts_streaming_cb(vc_tts_streaming_cb callback, void* user_data)
579 if (NULL == g_client)
580 return VC_ERROR_INVALID_PARAMETER;
582 g_client->tts_streaming_cb = callback;
583 g_client->tts_streaming_user_data = user_data;
585 return VC_ERROR_NONE;
588 int vc_client_get_tts_streaming_cb(vc_tts_streaming_cb* callback, void** user_data)
591 if (NULL == g_client)
592 return VC_ERROR_INVALID_PARAMETER;
594 *callback = g_client->tts_streaming_cb;
595 *user_data = g_client->tts_streaming_user_data;
597 return VC_ERROR_NONE;
600 int vc_client_set_tts_utterance_status_cb(vc_tts_utterance_status_cb callback, void* user_data)
603 if (NULL == g_client)
604 return VC_ERROR_INVALID_PARAMETER;
606 g_client->tts_utterance_status_cb = callback;
607 g_client->tts_utterance_status_user_data = user_data;
609 return VC_ERROR_NONE;
612 int vc_client_get_tts_utterance_status_cb(vc_tts_utterance_status_cb* callback, void** user_data)
615 if (NULL == g_client)
616 return VC_ERROR_INVALID_PARAMETER;
618 *callback = g_client->tts_utterance_status_cb;
619 *user_data = g_client->tts_utterance_status_user_data;
621 return VC_ERROR_NONE;
624 int vc_client_set_start_listening(bool is_listening_started)
626 if (NULL == g_client)
627 return VC_ERROR_INVALID_PARAMETER;
629 g_client->start_listening = is_listening_started;
630 return VC_ERROR_NONE;
633 bool vc_client_is_listening_started()
635 if (NULL == g_client)
638 return g_client->start_listening;