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.
17 #include <app_manager.h>
19 #include <aul_window.h>
21 #include "vcd_client_data.h"
22 #include "vcd_config.h"
27 static GSList* g_client_list = NULL;
29 static GSList* g_widget_list = NULL;
31 static manager_info_s g_manager;
33 /* Client IPC info list */
34 static GSList* g_client_tidl_info_list = NULL;
36 /* Manager IPC info */
37 static manager_tidl_info_s* g_mgr_tidl_info = NULL;
40 static GSList* g_widget_tidl_info_list = NULL;
42 /* Setting IPC info list */
43 static GSList* g_setting_tidl_info_list = NULL;
46 static current_commands_list_s g_cur_cmd_list;
48 /* Demandable client list */
49 static GSList* g_demandable_client = NULL;
52 static bool g_silence_detection;
53 static vcd_recognition_mode_e g_recognition_mode;
54 static char* g_result_text = NULL;
55 static bool g_is_waiting_recording = false;
56 static int g_waiting_recording_pid = -1;
58 /* Function definitions */
59 widget_info_s* __widget_get_element(int pid);
61 vc_client_info_s* __client_get_element(int pid);
64 int vcd_client_manager_set(int pid)
66 // Get appid by pid using app control
68 int ret = app_manager_get_app_id(pid, &appid);
69 if (0 != ret || NULL == appid) {
70 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] fail to get app id, ret(%d), pid(%d)", ret, pid);
71 return VCD_ERROR_OPERATION_FAILED;
74 if (-1 != g_manager.pid && NULL != g_manager.appid && 0 == strncmp(g_manager.appid, appid, strlen(g_manager.appid))) {
75 SLOG(LOG_WARN, TAG_VCD, "Same manager has already registered. It doesn't need to set manager again.");
78 return VCD_ERROR_NONE;
82 g_manager.manager_cmd = false;
83 g_manager.exclusive_cmd_option = false;
84 g_manager.appid = NULL;
86 g_manager.appid = strdup(appid);
90 return VCD_ERROR_NONE;
93 int vcd_client_manager_unset()
96 g_manager.manager_cmd = false;
97 g_manager.exclusive_cmd_option = false;
99 return VCD_ERROR_NONE;
102 int vcd_client_manager_unset_appid()
104 if (NULL != g_manager.appid) {
105 free(g_manager.appid);
106 g_manager.appid = NULL;
108 return VCD_ERROR_NONE;
111 bool vcd_client_manager_is_valid(int pid)
113 if (-1 == g_manager.pid || pid == g_manager.pid) {
119 int vcd_client_manager_set_command(int pid)
121 if (pid != g_manager.pid) {
122 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
123 return VCD_ERROR_INVALID_PARAMETER;
125 g_manager.manager_cmd = true;
126 return VCD_ERROR_NONE;
129 int vcd_client_manager_unset_command(int pid)
131 if (pid != g_manager.pid) {
132 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
133 return VCD_ERROR_INVALID_PARAMETER;
135 g_manager.manager_cmd = false;
136 return VCD_ERROR_NONE;
139 bool vcd_client_manager_is_system_command_valid(int pid)
141 if (pid != g_manager.pid) {
142 SLOG(LOG_WARN, TAG_VCD, "[Client Data WARNING] pid(%d) is NOT valid", pid);
146 if (true == g_manager.manager_cmd)
152 int vcd_client_manager_set_demandable_client(int pid, GSList* client_list)
154 if (0 != g_slist_length(g_demandable_client)) {
157 vc_demandable_client_s* temp_client;
158 iter = g_slist_nth(g_demandable_client, 0);
160 while (NULL != iter) {
161 temp_client = iter->data;
163 if (NULL != temp_client) {
164 if (NULL != temp_client->appid) free(temp_client->appid);
168 iter = g_slist_next(iter);
170 g_demandable_client = NULL;
173 g_demandable_client = client_list;
175 return VCD_ERROR_NONE;
178 bool vcd_client_manager_check_demandable_client(int pid)
180 if (0 == g_slist_length(g_demandable_client)) {
181 SLOG(LOG_INFO, TAG_VCD, "[Client Data] All client is available to request start");
185 /* Check demandable appid */
186 char appid[1024] = {0, };
187 if (0 == aul_app_get_appid_bypid(pid, appid, sizeof(appid) - 1)) {
188 SLOG(LOG_INFO, TAG_VCD, "[Client Data] %s(%d) requests start", appid, pid);
190 SLOG(LOG_INFO, TAG_VCD, "[Client Data] daemon(%d) requests start", pid);
195 vc_demandable_client_s* temp_client;
196 iter = g_slist_nth(g_demandable_client, 0);
198 while (NULL != iter) {
199 temp_client = iter->data;
201 if (NULL != temp_client) {
203 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] demandable appid(%s)", temp_client->appid);
205 if (NULL != temp_client->appid) {
206 if (0 == strcmp(temp_client->appid, appid)) {
207 SLOG(LOG_INFO, TAG_VCD, "[Client Data] pid(%d) is available", pid);
211 if (0 == strlen(appid)) {
212 SLOG(LOG_INFO, TAG_VCD, "[Client Data] pid(%d) is available", pid);
218 iter = g_slist_next(iter);
224 bool vcd_client_manager_get_exclusive()
226 return g_manager.exclusive_cmd_option;
229 int vcd_client_manager_set_exclusive(bool value)
231 g_manager.exclusive_cmd_option = value;
232 return VCD_ERROR_NONE;
235 int vcd_client_manager_get_pid()
237 return g_manager.pid;
240 int vcd_client_manager_get_appid(char** appid)
242 if (NULL != g_manager.appid)
243 *appid = strdup(g_manager.appid);
245 return VCD_ERROR_NONE;
248 int vcd_client_manager_set_result_text(const char* result)
250 if (NULL != g_result_text) {
252 g_result_text = NULL;
255 if (NULL != result) {
256 g_result_text = strdup(result);
259 return VCD_ERROR_NONE;
262 char* vcd_client_manager_get_result_text()
264 return g_result_text;
267 int vcd_client_manager_create_tidl_info()
269 /*Check already created*/
270 if (NULL != g_mgr_tidl_info) {
271 SLOG(LOG_WARN, TAG_VCD, "[Client Data] Manager tidl info pid is already registered");
272 return VCD_ERROR_NONE;
275 SLOG(LOG_INFO, TAG_VCD, "[Client Data] There is no manager tidl info. Create new one.");
276 g_mgr_tidl_info = (manager_tidl_info_s*)calloc(1, sizeof(manager_tidl_info_s));
277 if (NULL == g_mgr_tidl_info) {
278 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
279 return VCD_ERROR_OUT_OF_MEMORY;
282 g_mgr_tidl_info->notify_cb = NULL;
283 g_mgr_tidl_info->notify_cb_user_data = NULL;
284 g_mgr_tidl_info->send_buffer_cb = NULL;
285 g_mgr_tidl_info->send_buffer_cb_user_data = NULL;
287 g_mgr_tidl_info->connected = false;
288 g_mgr_tidl_info->connection_requesting = false;
289 g_mgr_tidl_info->rpc_h = NULL;
291 SLOG(LOG_INFO, TAG_VCD, "[Client Data SUCCESS] Add new manager tidl info.");
293 return VCD_ERROR_NONE;
296 int vcd_client_manager_set_tidl_notify_cb(rpc_port_stub_vcd_mgr_stub_vc_mgr_notify_cb_h callback, void* user_data)
298 if (NULL == g_mgr_tidl_info) {
299 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no manager tidl info");
300 return VCD_ERROR_INVALID_PARAMETER;
304 ret = rpc_port_stub_vcd_mgr_stub_vc_mgr_notify_cb_clone(callback, &(g_mgr_tidl_info->notify_cb));
306 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to clone notify callback. ret(%d)", ret);
308 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to clone notify callback. ret(%d)", ret);
310 g_mgr_tidl_info->notify_cb_user_data = user_data;
312 return VCD_ERROR_NONE;
315 int vcd_client_manager_unset_tidl_notify_cb()
317 if (NULL == g_mgr_tidl_info) {
318 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no manager tidl info");
319 return VCD_ERROR_INVALID_PARAMETER;
323 ret = rpc_port_stub_vcd_mgr_stub_vc_mgr_notify_cb_destroy(g_mgr_tidl_info->notify_cb);
325 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to destroy notify callback. ret(%d)", ret);
327 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to destroy notify callback. ret(%d)", ret);
329 g_mgr_tidl_info->notify_cb = NULL;
330 g_mgr_tidl_info->notify_cb_user_data = NULL;
332 return VCD_ERROR_NONE;
335 int vcd_client_manager_set_tidl_send_buffer_cb(rpc_port_stub_vcd_mgr_stub_vc_mgr_send_buffer_cb_h callback, void* user_data)
337 if (NULL == g_mgr_tidl_info) {
338 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no manager tidl info");
339 return VCD_ERROR_INVALID_PARAMETER;
343 ret = rpc_port_stub_vcd_mgr_stub_vc_mgr_send_buffer_cb_clone(callback, &(g_mgr_tidl_info->send_buffer_cb));
345 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to clone feedback callback. ret(%d)", ret);
347 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to clone feedback callback. ret(%d)", ret);
349 g_mgr_tidl_info->send_buffer_cb_user_data = user_data;
351 return VCD_ERROR_NONE;
354 int vcd_client_manager_unset_tidl_send_buffer_cb()
356 if (NULL == g_mgr_tidl_info) {
357 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no manager tidl info");
358 return VCD_ERROR_INVALID_PARAMETER;
362 ret = rpc_port_stub_vcd_mgr_stub_vc_mgr_send_buffer_cb_destroy(g_mgr_tidl_info->send_buffer_cb);
364 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to destroy feedback callback. ret(%d)", ret);
366 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to destroy feedback callback. ret(%d)", ret);
368 g_mgr_tidl_info->send_buffer_cb = NULL;
369 g_mgr_tidl_info->send_buffer_cb_user_data = NULL;
371 return VCD_ERROR_NONE;
374 int vcd_client_manager_delete_tidl_info()
376 if (NULL == g_mgr_tidl_info) {
377 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no manager tidl info");
378 return VCD_ERROR_INVALID_PARAMETER;
381 if (0 != rpc_port_proxy_vcd_mgr_proxy_vcd_mgr_destroy(g_mgr_tidl_info->rpc_h)) {
382 SLOG(LOG_ERROR, TAG_VCD, "[TIDL ERROR] Fail to destroy tidl handle");
385 g_mgr_tidl_info->rpc_h = NULL;
386 free(g_mgr_tidl_info);
387 g_mgr_tidl_info = NULL;
389 return VCD_ERROR_NONE;
392 manager_tidl_info_s* vcd_client_manager_get_tidl_info()
394 return g_mgr_tidl_info;
397 static void __vcd_client_release_each_commands(GSList** cmds)
402 if (0 < g_slist_length(*cmds)) {
403 iter = g_slist_nth(*cmds, 0);
404 while (NULL != iter) {
405 temp_cmd = iter->data;
407 if (NULL != temp_cmd) {
408 if (NULL != temp_cmd->command) {
409 free(temp_cmd->command);
410 temp_cmd->command = NULL;
412 if (NULL != temp_cmd->appid) {
413 free(temp_cmd->appid);
414 temp_cmd->appid = NULL;
416 if (NULL != temp_cmd->parameter) {
417 free(temp_cmd->parameter);
418 temp_cmd->parameter = NULL;
420 if (NULL != temp_cmd->invocation_name) {
421 free(temp_cmd->invocation_name);
422 temp_cmd->invocation_name = NULL;
424 if (NULL != temp_cmd->fixed) {
425 free(temp_cmd->fixed);
426 temp_cmd->fixed = NULL;
431 *cmds = g_slist_remove_link(*cmds, iter);
433 iter = g_slist_nth(*cmds, 0);
439 int __vcd_client_release_commands()
441 g_cur_cmd_list.total_cmd_count = 0;
442 g_cur_cmd_list.foreground = VC_NO_FOREGROUND_PID;
444 __vcd_client_release_each_commands(&(g_cur_cmd_list.widget_cmds));
445 __vcd_client_release_each_commands(&(g_cur_cmd_list.system_cmds));
446 __vcd_client_release_each_commands(&(g_cur_cmd_list.system_background_cmds));
447 __vcd_client_release_each_commands(&(g_cur_cmd_list.exclusive_system_cmds));
448 __vcd_client_release_each_commands(&(g_cur_cmd_list.foreground_cmds));
449 __vcd_client_release_each_commands(&(g_cur_cmd_list.background_cmds));
451 return VCD_ERROR_NONE;
454 int vcd_client_command_collect_command()
456 /* 1. Get foreground pid */
459 if (0 != vcd_config_get_foreground(&fg_pid)) {
460 SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to get foreground pid");
461 /* There is no foreground app for voice control */
464 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Foreground pid(%d)", fg_pid);
466 /* 2. Clean up command list */
467 __vcd_client_release_commands();
469 /* Check exclusive system command */
470 if (true == g_manager.exclusive_cmd_option && 1 == vcd_config_get_command_type_enabled(VC_COMMAND_TYPE_EXCLUSIVE)) {
471 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Exclusive option of manager is ON");
473 GSList* ex_sys_cmd_list = NULL;
474 if (true == g_manager.manager_cmd) {
475 ret = vc_cmd_parser_get_commands(g_manager.pid, VC_COMMAND_TYPE_EXCLUSIVE, &ex_sys_cmd_list);
477 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to get the system command list");
479 g_cur_cmd_list.exclusive_system_cmds = ex_sys_cmd_list;
482 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No exclusive system commands");
485 return VCD_ERROR_NONE;
488 /* 3. Set system command */
489 GSList* sys_cmd_list = NULL;
490 if (true == g_manager.manager_cmd && 1 == vcd_config_get_command_type_enabled(VC_COMMAND_TYPE_SYSTEM)) {
491 ret = vc_cmd_parser_get_commands(g_manager.pid, VC_COMMAND_TYPE_SYSTEM, &sys_cmd_list);
493 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to get the system command list");
495 g_cur_cmd_list.system_cmds = sys_cmd_list;
498 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No system commands");
501 GSList* sys_back_cmd_list = NULL;
502 if (true == g_manager.manager_cmd && 1 == vcd_config_get_command_type_enabled(VC_COMMAND_TYPE_SYSTEM_BACKGROUND)) {
503 ret = vc_cmd_parser_get_commands(g_manager.pid, VC_COMMAND_TYPE_SYSTEM_BACKGROUND, &sys_back_cmd_list);
505 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to get the system command list");
507 g_cur_cmd_list.system_background_cmds = sys_back_cmd_list;
510 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No system background commands");
513 /* 4. Set foreground commands and widget */
514 GSList* fg_cmd_list = NULL;
515 if (VC_NO_FOREGROUND_PID != fg_pid) {
516 GSList* widget_cmd_list = NULL;
518 g_cur_cmd_list.foreground = fg_pid;
520 /* 4-1. Set widget command */
521 widget_info_s* widget_info = NULL;
522 widget_info = __widget_get_element(fg_pid);
523 if (NULL != widget_info && 1 == vcd_config_get_command_type_enabled(VC_COMMAND_TYPE_WIDGET)) {
524 if (true == widget_info->widget_cmd) {
525 ret = vc_cmd_parser_get_commands(fg_pid, VC_COMMAND_TYPE_WIDGET, &widget_cmd_list);
527 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to get the WIDGET command list");
529 g_cur_cmd_list.widget_cmds = widget_cmd_list;
533 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No widget commands");
536 /* 4-2. Set foreground command of foreground app */
537 if (1 == vcd_config_get_command_type_enabled(VC_COMMAND_TYPE_FOREGROUND)) {
538 ret = vc_cmd_parser_get_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, &fg_cmd_list);
540 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to get the fg command list");
542 g_cur_cmd_list.foreground_cmds = fg_cmd_list;
546 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No foreground app");
548 if (true == g_manager.manager_cmd && 1 == vcd_config_get_command_type_enabled(VC_COMMAND_TYPE_FOREGROUND)) {
549 /* 4-3. Set foreground command by manager */
550 ret = vc_cmd_parser_get_commands(g_manager.pid, VC_COMMAND_TYPE_FOREGROUND, &fg_cmd_list);
552 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No foreground commands of manager app");
554 g_cur_cmd_list.foreground_cmds = fg_cmd_list;
558 /* 5. Set background commands */
559 GSList* bg_cmd_list = NULL;
560 if (1 == vcd_config_get_command_type_enabled(VC_COMMAND_TYPE_BACKGROUND)) {
561 ret = vc_cmd_parser_get_commands(fg_pid, VC_COMMAND_TYPE_BACKGROUND, &bg_cmd_list);
563 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to get the bg command list");
565 /* Add item to global command list */
566 g_cur_cmd_list.background_cmds = bg_cmd_list;
569 return VCD_ERROR_NONE;
572 int vcd_client_get_length()
574 int command_count = 0;
575 command_count += g_slist_length(g_cur_cmd_list.widget_cmds);
576 command_count += g_slist_length(g_cur_cmd_list.system_cmds);
577 command_count += g_slist_length(g_cur_cmd_list.exclusive_system_cmds);
578 command_count += g_slist_length(g_cur_cmd_list.system_background_cmds);
579 command_count += g_slist_length(g_cur_cmd_list.foreground_cmds);
580 command_count += g_slist_length(g_cur_cmd_list.background_cmds);
582 g_cur_cmd_list.total_cmd_count = command_count;
584 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Command count : %d ", g_cur_cmd_list.total_cmd_count);
585 return command_count;
588 int vcd_client_foreach_command(client_foreach_command_cb callback, void* user_data)
590 if (NULL == callback) {
591 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] input parameter is NULL");
592 return VCD_ERROR_INVALID_PARAMETER;
595 if (0 != vcd_client_command_collect_command()) {
596 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to collect command");
597 return VCD_ERROR_OPERATION_FAILED;
600 if (0 >= vcd_client_get_length()) {
601 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] No current command");
602 return VCD_ERROR_OPERATION_FAILED;
609 if (0 < g_slist_length(g_cur_cmd_list.widget_cmds)) {
610 iter = g_slist_nth(g_cur_cmd_list.widget_cmds, 0);
611 while (NULL != iter) {
612 temp_cmd = iter->data;
614 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Widget : id(%d) type(%d) format(%d) command(%s) domain(%d)"
615 , temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->domain);
617 callback(temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain, user_data);
619 iter = g_slist_next(iter);
622 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No widget commands");
625 if (0 < g_slist_length(g_cur_cmd_list.foreground_cmds)) {
626 iter = g_slist_nth(g_cur_cmd_list.foreground_cmds, 0);
627 while (NULL != iter) {
628 temp_cmd = iter->data;
630 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Fore : id(%d) type(%d) format(%d) command(%s) param(%s) domain(%d) fixed(%s)"
631 , temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain, temp_cmd->fixed);
633 callback(temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain, user_data);
635 iter = g_slist_next(iter);
638 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No foreground commands");
641 if (0 < g_slist_length(g_cur_cmd_list.system_cmds)) {
642 iter = g_slist_nth(g_cur_cmd_list.system_cmds, 0);
643 while (NULL != iter) {
644 temp_cmd = iter->data;
646 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] System : id(%d) type(%d) format(%d) command(%s) param(%s) domain(%d)"
647 , temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain);
649 callback(temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain, user_data);
651 iter = g_slist_next(iter);
654 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No system commands");
657 if (0 < g_slist_length(g_cur_cmd_list.system_background_cmds)) {
658 iter = g_slist_nth(g_cur_cmd_list.system_background_cmds, 0);
659 while (NULL != iter) {
660 temp_cmd = iter->data;
662 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] System background : id(%d) type(%d) format(%d) command(%s) param(%s) domain(%d)"
663 , temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain);
665 callback(temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain, user_data);
667 iter = g_slist_next(iter);
670 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No system background commands");
673 if (0 < g_slist_length(g_cur_cmd_list.exclusive_system_cmds)) {
674 iter = g_slist_nth(g_cur_cmd_list.exclusive_system_cmds, 0);
675 while (NULL != iter) {
676 temp_cmd = iter->data;
678 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Exclusive system : id(%d) type(%d) format(%d) command(%s) param(%s) domain(%d)"
679 , temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain);
681 callback(temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain, user_data);
683 iter = g_slist_next(iter);
686 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No exclusive system commands");
689 if (0 < g_slist_length(g_cur_cmd_list.background_cmds)) {
690 iter = g_slist_nth(g_cur_cmd_list.background_cmds, 0);
691 while (NULL != iter) {
692 temp_cmd = iter->data;
694 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Back : id(%d) format(%d) type(%d) command(%s) param(%s) domain(%d) appid(%s) invocation(%s) fixed(%s)"
695 , temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain, temp_cmd->appid, temp_cmd->invocation_name, temp_cmd->fixed);
697 callback(temp_cmd->id, temp_cmd->type, temp_cmd->format, temp_cmd->command, temp_cmd->parameter, temp_cmd->domain, user_data);
699 iter = g_slist_next(iter);
702 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No background commands");
704 return VCD_ERROR_NONE;
707 static vc_cmd_s* __command_copy(vc_cmd_s* src_cmd)
709 if (NULL == src_cmd) {
710 SLOG(LOG_WARN, TAG_VCD, "[Client Data] Input command is NULL");
714 vc_cmd_s* temp_cmd = NULL;
715 temp_cmd = (vc_cmd_s*)calloc(sizeof(vc_cmd_s), 1);
716 if (NULL == temp_cmd) {
717 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
721 temp_cmd->id = src_cmd->id;
722 temp_cmd->pid = src_cmd->pid;
723 temp_cmd->index = src_cmd->index;
724 temp_cmd->type = src_cmd->type;
725 temp_cmd->format = src_cmd->format;
726 temp_cmd->domain = src_cmd->domain;
728 if (VC_COMMAND_TYPE_SYSTEM == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM;
729 else if (VC_COMMAND_TYPE_EXCLUSIVE == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_EXCLUSIVE;
730 else if (VC_COMMAND_TYPE_WIDGET == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_WIDGET;
731 else if (VC_COMMAND_TYPE_FOREGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_FOREGROUND;
732 else if (VC_COMMAND_TYPE_SYSTEM_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_SYSTEM_BACKGROUND;
733 else if (VC_COMMAND_TYPE_BACKGROUND == temp_cmd->type) temp_cmd->priority = VC_COMMAND_PRIORITY_BACKGROUND;
735 if (NULL != src_cmd->command) {
736 temp_cmd->command = strdup(src_cmd->command);
739 if (NULL != src_cmd->parameter) {
740 temp_cmd->parameter = strdup(src_cmd->parameter);
743 if (NULL != src_cmd->appid) {
744 temp_cmd->appid = strdup(src_cmd->appid);
747 if (NULL != src_cmd->invocation_name) {
748 temp_cmd->invocation_name = strdup(src_cmd->invocation_name);
751 if (NULL != src_cmd->fixed) {
752 temp_cmd->fixed = strdup(src_cmd->fixed);
755 temp_cmd->key = src_cmd->key;
756 temp_cmd->modifier = src_cmd->modifier;
761 int vcd_client_get_cmd_from_result_id(int result_id, vc_cmd_s** result)
766 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Result id(%d)", result_id);
768 if (0 < g_slist_length(g_cur_cmd_list.widget_cmds)) {
769 iter = g_slist_nth(g_cur_cmd_list.widget_cmds, 0);
770 while (NULL != iter) {
771 temp_cmd = iter->data;
773 if (result_id == temp_cmd->id) {
774 /**pid = g_cur_cmd_list.foreground; */
775 /**cmd_type = VCD_CLIENT_COMMAND_GROUP_TYPE_UI_CONTROL; */
776 /*SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Find result pid(%d) type(%d)", *pid, *cmd_type); */
778 *result = __command_copy(temp_cmd);
780 return VCD_ERROR_NONE;
783 iter = g_slist_next(iter);
786 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No widget commands");
789 if (0 < g_slist_length(g_cur_cmd_list.foreground_cmds)) {
790 iter = g_slist_nth(g_cur_cmd_list.foreground_cmds, 0);
792 while (NULL != iter) {
793 temp_cmd = iter->data;
795 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] command id (%d)", temp_cmd->id);
797 if (result_id == temp_cmd->id) {
798 /**pid = g_cur_cmd_list.foreground; */
799 /**cmd_type = VCD_CLIENT_COMMAND_GROUP_TYPE_FOREGROUND; */
800 /*SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Find result pid(%d) type(%d)", *pid, *cmd_type); */
802 *result = __command_copy(temp_cmd);
803 return VCD_ERROR_NONE;
806 iter = g_slist_next(iter);
809 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No foreground commands");
812 if (0 < g_slist_length(g_cur_cmd_list.system_cmds)) {
813 iter = g_slist_nth(g_cur_cmd_list.system_cmds, 0);
814 while (NULL != iter) {
815 temp_cmd = iter->data;
817 if (result_id == temp_cmd->id) {
818 /**pid = g_manager.pid; */
819 /**cmd_type = VCD_CLIENT_COMMAND_GROUP_TYPE_SYSTEM; */
820 /*SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Find result pid(%d) type(%d)", *pid, *cmd_type); */
822 *result = __command_copy(temp_cmd);
823 return VCD_ERROR_NONE;
826 iter = g_slist_next(iter);
829 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No system commands");
832 if (0 < g_slist_length(g_cur_cmd_list.system_background_cmds)) {
833 iter = g_slist_nth(g_cur_cmd_list.system_background_cmds, 0);
834 while (NULL != iter) {
835 temp_cmd = iter->data;
837 if (result_id == temp_cmd->id) {
838 /**pid = g_manager.pid; */
839 /**cmd_type = VCD_CLIENT_COMMAND_GROUP_TYPE_SYSTEM_BACKGROUND; */
840 /*SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Find result pid(%d) type(%d)", *pid, *cmd_type); */
842 *result = __command_copy(temp_cmd);
843 return VCD_ERROR_NONE;
846 iter = g_slist_next(iter);
849 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No system background commands");
852 if (0 < g_slist_length(g_cur_cmd_list.exclusive_system_cmds)) {
853 iter = g_slist_nth(g_cur_cmd_list.exclusive_system_cmds, 0);
854 while (NULL != iter) {
855 temp_cmd = iter->data;
857 if (result_id == temp_cmd->id) {
858 /**pid = g_manager.pid; */
859 /**cmd_type = VCD_CLIENT_COMMAND_GROUP_TYPE_SYSTEM_EXCLUSIVE; */
860 /*SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] Find result pid(%d) type(%d)", *pid, *cmd_type); */
862 *result = __command_copy(temp_cmd);
863 return VCD_ERROR_NONE;
866 iter = g_slist_next(iter);
869 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No exclusive system commands");
872 if (0 < g_slist_length(g_cur_cmd_list.background_cmds)) {
873 iter = g_slist_nth(g_cur_cmd_list.background_cmds, 0);
875 while (NULL != iter) {
876 temp_cmd = iter->data;
878 SLOG(LOG_DEBUG, TAG_VCD, "[Client Data] command id (%d)", temp_cmd->id);
880 if (result_id == temp_cmd->id) {
881 *result = __command_copy(temp_cmd);
882 return VCD_ERROR_NONE;
885 iter = g_slist_next(iter);
888 SLOG(LOG_INFO, TAG_VCD, "[Client Data] No background commands");
891 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Not find matched result");
892 return VCD_ERROR_INVALID_PARAMETER;
895 int vcd_client_set_slience_detection(bool value)
897 g_silence_detection = value;
898 return VCD_ERROR_NONE;
901 bool vcd_client_get_slience_detection()
903 return g_silence_detection;
906 int vcd_client_set_recognition_mode(vcd_recognition_mode_e mode)
908 g_recognition_mode = mode;
909 return VCD_ERROR_NONE;
912 vcd_recognition_mode_e vcd_client_get_recognition_mode()
914 return g_recognition_mode;
917 int vcd_client_set_server_dialog(int pid, bool is_server_dialog)
919 vc_client_info_s* client_info = NULL;
921 client_info = __client_get_element(pid);
922 if (NULL == client_info) {
923 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] vcd_client_get_pid : pid(%d) is not found", pid);
924 return VCD_ERROR_INVALID_PARAMETER;
927 client_info->server_dialog = is_server_dialog;
929 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Set server dialog, client pid(%d), server_dialog(%d)", pid, client_info->server_dialog);
930 return VCD_ERROR_NONE;
933 int vcd_client_get_server_dialog(int pid, bool* is_server_dialog)
935 vc_client_info_s* client_info = NULL;
937 client_info = __client_get_element(pid);
938 if (NULL == client_info) {
939 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] vcd_client_get_pid : pid(%d) is not found", pid);
940 return VCD_ERROR_INVALID_PARAMETER;
943 *is_server_dialog = client_info->server_dialog;
945 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Get server dialog, client pid(%d), server_dialog(%d)", pid, *is_server_dialog);
946 return VCD_ERROR_NONE;
949 int vcd_client_append_cmd_from_type(int type, vc_cmd_list_h list)
954 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Invalid list parameter");
955 return VCD_ERROR_INVALID_PARAMETER;
959 case VC_COMMAND_TYPE_SYSTEM:
960 item = g_cur_cmd_list.system_cmds;
962 case VC_COMMAND_TYPE_FOREGROUND:
963 item = g_cur_cmd_list.foreground_cmds;
965 case VC_COMMAND_TYPE_WIDGET:
966 item = g_cur_cmd_list.widget_cmds;
968 case VC_COMMAND_TYPE_SYSTEM_BACKGROUND:
969 item = g_cur_cmd_list.system_background_cmds;
971 case VC_COMMAND_TYPE_BACKGROUND:
972 item = g_cur_cmd_list.background_cmds;
974 case VC_COMMAND_TYPE_EXCLUSIVE:
975 item = g_cur_cmd_list.exclusive_system_cmds;
978 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Invalid type parameter");
979 return VCD_ERROR_INVALID_PARAMETER;
982 while (NULL != item) {
983 vc_cmd_h temp_cmd = NULL;
984 vc_cmd_h target_cmd = (vc_cmd_h)item->data;
986 temp_cmd = (vc_cmd_h)__command_copy((vc_cmd_s*)target_cmd);
988 if (NULL == temp_cmd) {
989 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to copy the command");
990 return VCD_ERROR_OUT_OF_MEMORY;
993 if (0 != vc_cmd_list_add(list, temp_cmd)) {
994 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to add the command in the list");
995 if (NULL != temp_cmd) {
996 vc_cmd_destroy(temp_cmd);
1000 return VCD_ERROR_OPERATION_FAILED;
1006 return VCD_ERROR_NONE;
1009 int __show_client_list()
1011 GSList *iter = NULL;
1012 vc_client_info_s *data = NULL;
1014 SLOG(LOG_DEBUG, TAG_VCD, "@@@ client list");
1016 int count = g_slist_length(g_client_list);
1020 SLOG(LOG_DEBUG, TAG_VCD, "No Client");
1022 iter = g_slist_nth(g_client_list, 0);
1023 for (i = 0; i < count; i++) {
1030 SLOG(LOG_DEBUG, TAG_VCD, "[%dth] pid(%d)", i, data->pid);
1032 iter = g_slist_next(iter);
1036 SLOG(LOG_DEBUG, TAG_VCD, "@@@");
1038 SLOG(LOG_DEBUG, TAG_VCD, "@@@ widget list");
1040 widget_info_s *widget_data = NULL;
1042 count = g_slist_length(g_widget_list);
1045 SLOG(LOG_DEBUG, TAG_VCD, "No widget");
1047 iter = g_slist_nth(g_widget_list, 0);
1048 for (i = 0; i < count; i++) {
1052 widget_data = iter->data;
1054 if (NULL != widget_data) {
1055 SLOG(LOG_DEBUG, TAG_VCD, "[%dth] pid(%d)", i, widget_data->pid);
1057 iter = g_slist_next(iter);
1061 SLOG(LOG_DEBUG, TAG_VCD, "@@@");
1063 return VCD_ERROR_NONE;
1066 int __show_command_list(GSList* cmd_group)
1068 GSList *iter = NULL;
1069 vc_cmd_s *data = NULL;
1071 SLOG(LOG_DEBUG, TAG_VCD, "@@@ command group");
1073 int count = g_slist_length(cmd_group);
1077 SLOG(LOG_DEBUG, TAG_VCD, "No command");
1079 iter = g_slist_nth(cmd_group, 0);
1080 for (i = 0; i < count; i++) {
1086 if (NULL != data->parameter) {
1087 SLOG(LOG_DEBUG, TAG_VCD, "[%dth] command(%s) parameter(%s) key(%d)", i, data->command, data->parameter, data->key);
1089 SLOG(LOG_DEBUG, TAG_VCD, "[%dth] command(%s) key(%d)", i, data->command, data->key);
1092 iter = g_slist_next(iter);
1096 SLOG(LOG_DEBUG, TAG_VCD, "@@@");
1098 return VCD_ERROR_NONE;
1101 GSList* __client_get_item(const int pid)
1103 GSList *iter = NULL;
1104 vc_client_info_s *data = NULL;
1106 int count = g_slist_length(g_client_list);
1110 iter = g_slist_nth(g_client_list, 0);
1111 for (i = 0; i < count; i++) {
1117 if (pid == data->pid)
1121 iter = g_slist_next(iter);
1128 vc_client_info_s* __client_get_element(int pid)
1130 GSList *iter = NULL;
1131 vc_client_info_s *data = NULL;
1133 int count = g_slist_length(g_client_list);
1137 iter = g_slist_nth(g_client_list, 0);
1138 for (i = 0; i < count; i++) {
1145 if (pid == data->pid)
1149 iter = g_slist_next(iter);
1156 int vcd_client_add(int pid)
1158 /*Check pid is duplicated*/
1160 tmp = __client_get_item(pid);
1163 SLOG(LOG_WARN, TAG_VCD, "[Client Data] Client pid is already registered");
1164 return VCD_ERROR_INVALID_PARAMETER;
1167 vc_client_info_s *info = (vc_client_info_s*)calloc(1, sizeof(vc_client_info_s));
1169 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
1170 return VCD_ERROR_OUT_OF_MEMORY;
1175 info->fg_cmd = false;
1176 info->bg_cmd = false;
1177 info->exclusive_cmd = false;
1178 info->server_dialog = false;
1180 /* Add item to global list */
1181 g_client_list = g_slist_append(g_client_list, info);
1183 if (NULL == g_client_list) {
1184 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to add new client");
1189 return VCD_ERROR_OUT_OF_MEMORY;
1191 SLOG(LOG_INFO, TAG_VCD, "[Client Data SUCCESS] Add new client");
1194 #ifdef CLIENT_DATA_DEBUG
1195 __show_client_list();
1197 return VCD_ERROR_NONE;
1200 int vcd_client_delete(int pid)
1203 vc_client_info_s* client_info = NULL;
1206 tmp = __client_get_item(pid);
1208 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
1209 return VCD_ERROR_INVALID_PARAMETER;
1212 /*Free client structure*/
1213 client_info = tmp->data;
1214 if (NULL != client_info) {
1218 /*Remove handle from list*/
1219 g_client_list = g_slist_remove_link(g_client_list, tmp);
1222 #ifdef CLIENT_DATA_DEBUG
1223 __show_client_list();
1226 return VCD_ERROR_NONE;
1229 GSList* __get_client_tidl_info_item(const int pid)
1231 GSList *iter = NULL;
1232 client_tidl_info_s *data = NULL;
1234 int count = g_slist_length(g_client_tidl_info_list);
1238 iter = g_slist_nth(g_client_tidl_info_list, 0);
1239 for (i = 0; i < count; i++) {
1245 if (pid == data->pid)
1249 iter = g_slist_next(iter);
1256 client_tidl_info_s* __get_client_tidl_info_element(int pid)
1258 GSList *iter = NULL;
1259 client_tidl_info_s *data = NULL;
1261 int count = g_slist_length(g_client_tidl_info_list);
1265 iter = g_slist_nth(g_client_tidl_info_list, 0);
1266 for (i = 0; i < count; i++) {
1273 if (pid == data->pid)
1277 iter = g_slist_next(iter);
1284 int vcd_client_add_tidl_info(int pid)
1286 /*Check pid is duplicated*/
1287 client_tidl_info_s* info = NULL;
1288 info = __get_client_tidl_info_element(pid);
1291 SLOG(LOG_WARN, TAG_VCD, "[Client Data] Client tidl info pid is already registered");
1292 return VCD_ERROR_NONE;
1295 SLOG(LOG_INFO, TAG_VCD, "[Client Data] There is no tidl info of pid(%d). Create new one.", pid);
1296 info = (client_tidl_info_s*)calloc(1, sizeof(client_tidl_info_s));
1298 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
1299 return VCD_ERROR_OUT_OF_MEMORY;
1303 info->notify_cb = NULL;
1304 info->notify_cb_user_data = NULL;
1305 info->feedback_cb = NULL;
1306 info->feedback_cb_user_data = NULL;
1308 g_client_tidl_info_list = g_slist_append(g_client_tidl_info_list, info);
1309 if (NULL == g_client_tidl_info_list) {
1310 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to add new client tidl info");
1315 return VCD_ERROR_OUT_OF_MEMORY;
1317 SLOG(LOG_INFO, TAG_VCD, "[Client Data SUCCESS] Add new client tidl info. pid(%d)", pid);
1320 return VCD_ERROR_NONE;
1323 int vcd_client_set_tidl_notify_cb(int pid, rpc_port_stub_vcd_stub_vc_notify_cb_h callback, void* user_data)
1326 client_tidl_info_s* info = NULL;
1327 info = __get_client_tidl_info_element(pid);
1330 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no tidl info in the list. pid(%d)", pid);
1331 return VCD_ERROR_INVALID_PARAMETER;
1335 ret = rpc_port_stub_vcd_stub_vc_notify_cb_clone(callback, &(info->notify_cb));
1337 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to clone notify callback. ret(%d)", ret);
1339 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to clone notify callback. ret(%d)", ret);
1341 info->notify_cb_user_data = user_data;
1343 return VCD_ERROR_NONE;
1346 int vcd_client_unset_tidl_notify_cb(int pid)
1349 client_tidl_info_s* info = NULL;
1350 info = __get_client_tidl_info_element(pid);
1353 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no tidl info in the list. pid(%d)", pid);
1354 return VCD_ERROR_INVALID_PARAMETER;
1358 ret = rpc_port_stub_vcd_stub_vc_notify_cb_destroy(info->notify_cb);
1360 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to destroy notify callback. ret(%d)", ret);
1362 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to destroy notify callback. ret(%d)", ret);
1364 info->notify_cb = NULL;
1365 info->notify_cb_user_data = NULL;
1367 return VCD_ERROR_NONE;
1370 int vcd_client_set_tidl_feedback_cb(int pid, rpc_port_stub_vcd_stub_vc_feedback_cb_h callback, void* user_data)
1373 client_tidl_info_s* info = NULL;
1374 info = __get_client_tidl_info_element(pid);
1377 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no tidl info in the list. pid(%d)", pid);
1378 return VCD_ERROR_INVALID_PARAMETER;
1382 ret = rpc_port_stub_vcd_stub_vc_feedback_cb_clone(callback, &(info->feedback_cb));
1384 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to clone feedback callback. ret(%d)", ret);
1386 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to clone feedback callback. ret(%d)", ret);
1388 info->feedback_cb_user_data = user_data;
1390 return VCD_ERROR_NONE;
1393 int vcd_client_unset_tidl_feedback_cb(int pid)
1396 client_tidl_info_s* info = NULL;
1397 info = __get_client_tidl_info_element(pid);
1400 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no tidl info in the list. pid(%d)", pid);
1401 return VCD_ERROR_INVALID_PARAMETER;
1405 ret = rpc_port_stub_vcd_stub_vc_feedback_cb_destroy(info->feedback_cb);
1407 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to destroy feedback callback. ret(%d)", ret);
1409 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to destroy feedback callback. ret(%d)", ret);
1411 info->feedback_cb = NULL;
1412 info->feedback_cb_user_data = NULL;
1414 return VCD_ERROR_NONE;
1417 int vcd_client_delete_tidl_info(int pid)
1420 client_tidl_info_s* client_tidl_info = NULL;
1423 tmp = __get_client_tidl_info_item(pid);
1425 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
1426 return VCD_ERROR_INVALID_PARAMETER;
1429 /*Free client structure*/
1430 client_tidl_info = tmp->data;
1431 if (NULL != client_tidl_info) {
1432 free(client_tidl_info);
1435 /*Delete handle from list*/
1436 g_client_tidl_info_list = g_slist_delete_link(g_client_tidl_info_list, tmp);
1438 return VCD_ERROR_NONE;
1441 client_tidl_info_s* vcd_client_get_tidl_info(int pid)
1443 return __get_client_tidl_info_element(pid);
1446 int vcd_client_get_tidl_list(int** pids, int* pid_count)
1448 if (NULL == pids || NULL == pid_count)
1449 return VCD_ERROR_INVALID_PARAMETER;
1451 int count = g_slist_length(g_client_tidl_info_list);
1454 return VCD_ERROR_OUT_OF_MEMORY;
1457 tmp = (int*)calloc(count, sizeof(int));
1459 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
1460 return VCD_ERROR_OUT_OF_MEMORY;
1463 GSList *iter = NULL;
1464 client_tidl_info_s *data = NULL;
1467 iter = g_slist_nth(g_client_tidl_info_list, 0);
1469 while (NULL != iter) {
1476 iter = g_slist_next(iter);
1483 return VCD_ERROR_NONE;
1486 bool vcd_client_is_available(int pid)
1488 vc_client_info_s* client_info = NULL;
1490 client_info = __client_get_element(pid);
1491 if (NULL == client_info) {
1492 SLOG(LOG_WARN, TAG_VCD, "[Client Data] pid(%d) is NOT valid", pid);
1499 int vcd_client_get_ref_count()
1503 count = g_slist_length(g_client_list) + g_slist_length(g_widget_list);
1504 if (0 < g_manager.pid) {
1508 SLOG(LOG_INFO, TAG_VCD, "[Client Data] client count : %d", count);
1513 int vcd_client_get_list(int** pids, int* pid_count)
1515 if (NULL == pids || NULL == pid_count)
1516 return VCD_ERROR_INVALID_PARAMETER;
1518 int count = g_slist_length(g_client_list);
1521 return VCD_ERROR_OUT_OF_MEMORY;
1524 tmp = (int*)calloc(count, sizeof(int));
1526 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
1527 return VCD_ERROR_OUT_OF_MEMORY;
1530 GSList *iter = NULL;
1531 vc_client_info_s *data = NULL;
1534 iter = g_slist_nth(g_client_list, 0);
1536 while (NULL != iter) {
1543 iter = g_slist_next(iter);
1550 return VCD_ERROR_NONE;
1553 int vcd_client_set_command_type(int pid, int type)
1555 vc_client_info_s* client_info = NULL;
1557 client_info = __client_get_element(pid);
1558 if (NULL == client_info) {
1559 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] vcd_client_get_pid : pid(%d) is not found", pid);
1560 return VCD_ERROR_INVALID_PARAMETER;
1564 case VC_COMMAND_TYPE_FOREGROUND:
1565 client_info->fg_cmd = true;
1567 case VC_COMMAND_TYPE_BACKGROUND:
1568 client_info->bg_cmd = true;
1571 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] not supported command type(%d)", type);
1572 return VCD_ERROR_INVALID_PARAMETER;
1575 return VCD_ERROR_NONE;
1578 int vcd_client_unset_command_type(int pid, int type)
1580 vc_client_info_s* client_info = NULL;
1582 client_info = __client_get_element(pid);
1583 if (NULL == client_info) {
1584 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] vcd_client_get_pid : pid(%d) is not found", pid);
1585 return VCD_ERROR_INVALID_PARAMETER;
1589 case VC_COMMAND_TYPE_FOREGROUND:
1590 client_info->fg_cmd = false;
1592 case VC_COMMAND_TYPE_BACKGROUND:
1593 client_info->bg_cmd = false;
1596 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] not supported command type(%d)", type);
1597 return VCD_ERROR_INVALID_PARAMETER;
1600 return VCD_ERROR_NONE;
1603 int vcd_client_set_exclusive_command(int pid)
1605 vc_client_info_s* client_info = NULL;
1607 client_info = __client_get_element(pid);
1608 if (NULL == client_info) {
1609 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is not found", pid);
1610 return VCD_ERROR_INVALID_PARAMETER;
1613 client_info->exclusive_cmd = true;
1615 return VCD_ERROR_NONE;
1618 int vcd_client_unset_exclusive_command(int pid)
1620 vc_client_info_s* client_info = NULL;
1622 client_info = __client_get_element(pid);
1623 if (NULL == client_info) {
1624 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is not found", pid);
1625 return VCD_ERROR_INVALID_PARAMETER;
1628 client_info->exclusive_cmd = false;
1630 return VCD_ERROR_NONE;
1633 int vcd_client_save_client_info()
1635 if (0 != vc_info_parser_set_client_info(g_client_list)) {
1636 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to save client info");
1637 return VCD_ERROR_OPERATION_FAILED;
1640 return VCD_ERROR_NONE;
1644 * Functions for widget
1646 GSList* __widget_get_item(int pid)
1648 GSList *iter = NULL;
1649 widget_info_s *data = NULL;
1651 int count = g_slist_length(g_widget_list);
1655 iter = g_slist_nth(g_widget_list, 0);
1656 for (i = 0; i < count; i++) {
1663 if (pid == data->pid)
1667 iter = g_slist_next(iter);
1674 widget_info_s* __widget_get_element(int pid)
1676 GSList *iter = NULL;
1677 widget_info_s *data = NULL;
1679 int count = g_slist_length(g_widget_list);
1683 iter = g_slist_nth(g_widget_list, 0);
1686 while (iter && i < count) {
1690 if (pid == data->pid)
1694 iter = g_slist_next(iter);
1703 int vcd_client_widget_get_list(int** pids, int* pid_count)
1705 if (NULL == pids || NULL == pid_count)
1706 return VCD_ERROR_INVALID_PARAMETER;
1708 int count = g_slist_length(g_widget_list);
1711 return VCD_ERROR_OUT_OF_MEMORY;
1714 tmp = (int*)calloc(count, sizeof(int));
1716 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
1717 return VCD_ERROR_OUT_OF_MEMORY;
1720 GSList *iter = NULL;
1721 widget_info_s *data = NULL;
1724 iter = g_slist_nth(g_widget_list, 0);
1725 while (NULL != iter) {
1732 iter = g_slist_next(iter);
1739 return VCD_ERROR_NONE;
1742 int vcd_client_widget_add(int pid)
1744 /*Check pid is duplicated*/
1746 tmp = __widget_get_item(pid);
1749 SLOG(LOG_WARN, TAG_VCD, "[Client Data] widget pid is already registered");
1750 return VCD_ERROR_INVALID_PARAMETER;
1753 widget_info_s *info = (widget_info_s*)calloc(1, sizeof(widget_info_s));
1755 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
1756 return VCD_ERROR_OUT_OF_MEMORY;
1760 info->widget_cmd = false;
1762 /* Add item to global list */
1763 g_widget_list = g_slist_append(g_widget_list, info);
1765 if (NULL == g_widget_list) {
1766 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to add new widget");
1771 return VCD_ERROR_OUT_OF_MEMORY;
1773 SLOG(LOG_INFO, TAG_VCD, "[Client Data SUCCESS] Add new widget");
1776 #ifdef CLIENT_DATA_DEBUG
1777 __show_client_list();
1779 return VCD_ERROR_NONE;
1782 int vcd_client_widget_delete(int pid)
1785 widget_info_s* widget_info = NULL;
1788 tmp = __widget_get_item(pid);
1790 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
1791 return VCD_ERROR_INVALID_PARAMETER;
1794 /*Free client structure*/
1795 widget_info = tmp->data;
1796 if (NULL != widget_info) {
1800 /*Remove handle from list*/
1801 g_widget_list = g_slist_remove_link(g_widget_list, tmp);
1804 #ifdef CLIENT_DATA_DEBUG
1805 __show_client_list();
1808 return VCD_ERROR_NONE;
1811 int vcd_client_widget_get_foreground_pid()
1813 /* 1. Get foreground pid */
1815 if (0 != vcd_config_get_foreground(&fg_pid)) {
1816 SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to get foreground pid");
1817 /* There is no foreground app for voice control */
1820 widget_info_s* widget = NULL;
1822 widget = __widget_get_element(fg_pid);
1823 if (NULL == widget) {
1824 SLOG(LOG_WARN, TAG_VCD, "[Client Data] Not found foreground pid of widget");
1832 bool vcd_client_widget_is_available(int pid)
1834 widget_info_s* widget_info = NULL;
1836 widget_info = __widget_get_element(pid);
1837 if (NULL == widget_info) {
1838 SLOG(LOG_WARN, TAG_VCD, "[Client Data] pid(%d) is NOT valid", pid);
1845 int vcd_client_widget_set_command(int pid)
1847 widget_info_s *info = NULL;
1848 info = __widget_get_element(pid);
1850 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
1851 return VCD_ERROR_INVALID_PARAMETER;
1854 info->widget_cmd = true;
1856 return VCD_ERROR_NONE;
1859 int vcd_client_widget_unset_command(int pid)
1861 widget_info_s *info = NULL;
1862 info = __widget_get_element(pid);
1864 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
1865 return VCD_ERROR_INVALID_PARAMETER;
1868 info->widget_cmd = false;
1870 return VCD_ERROR_NONE;
1873 int vcd_client_widget_set_asr_result_enabled(int pid, bool enable)
1875 widget_info_s *info = NULL;
1876 info = __widget_get_element(pid);
1878 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
1879 return VCD_ERROR_INVALID_PARAMETER;
1882 info->asr_result_enabled = enable;
1884 return VCD_ERROR_NONE;
1887 int vcd_client_widget_get_asr_result_enabled(int pid, bool* enable)
1889 widget_info_s *info = NULL;
1890 info = __widget_get_element(pid);
1892 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
1893 return VCD_ERROR_INVALID_PARAMETER;
1896 *enable = info->asr_result_enabled;
1898 return VCD_ERROR_NONE;
1901 int vcd_client_widget_set_waiting_for_recording(int pid, bool waiting)
1904 if (TRUE == waiting && pid != vcd_client_widget_get_foreground_pid()) {
1905 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT foreground pid", pid);
1906 return VCD_ERROR_INVALID_PARAMETER;
1909 g_is_waiting_recording = waiting;
1910 g_waiting_recording_pid = pid;
1911 SLOG(LOG_ERROR, TAG_VCD, "[INFO] Success to set waiting for recording, pid(%d), waiting(%d)", pid, waiting);
1912 return VCD_ERROR_NONE;
1915 int vcd_client_widget_get_waiting_for_recording(int pid, bool* waiting)
1917 if (pid != g_waiting_recording_pid) {
1918 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT waiting pid", pid);
1919 return VCD_ERROR_INVALID_PARAMETER;
1922 *waiting = g_is_waiting_recording;
1923 SLOG(LOG_ERROR, TAG_VCD, "[INFO] Success to get waiting for recording, waiting(%d)", *waiting);
1924 return VCD_ERROR_NONE;
1927 GSList* __get_widget_tidl_info_item(const int pid)
1929 GSList *iter = NULL;
1930 widget_tidl_info_s *data = NULL;
1932 int count = g_slist_length(g_widget_tidl_info_list);
1936 iter = g_slist_nth(g_widget_tidl_info_list, 0);
1937 for (i = 0; i < count; i++) {
1943 if (pid == data->pid)
1947 iter = g_slist_next(iter);
1954 widget_tidl_info_s* __get_widget_tidl_info_element(int pid)
1956 GSList *iter = NULL;
1957 widget_tidl_info_s *data = NULL;
1959 int count = g_slist_length(g_widget_tidl_info_list);
1963 iter = g_slist_nth(g_widget_tidl_info_list, 0);
1964 for (i = 0; i < count; i++) {
1971 if (pid == data->pid)
1975 iter = g_slist_next(iter);
1982 int vcd_client_widget_add_tidl_info(int pid)
1984 /*Check pid is duplicated*/
1985 widget_tidl_info_s* info = NULL;
1986 info = __get_widget_tidl_info_element(pid);
1989 SLOG(LOG_WARN, TAG_VCD, "[Client Data] Widget tidl info pid is already registered");
1990 return VCD_ERROR_NONE;
1993 SLOG(LOG_INFO, TAG_VCD, "[Client Data] There is no tidl info of pid(%d). Create new one.", pid);
1994 info = (widget_tidl_info_s*)calloc(1, sizeof(widget_tidl_info_s));
1996 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
1997 return VCD_ERROR_OUT_OF_MEMORY;
2001 info->notify_cb = NULL;
2002 info->notify_cb_user_data = NULL;
2004 info->connected = false;
2005 info->connection_requesting = false;
2008 g_widget_tidl_info_list = g_slist_append(g_widget_tidl_info_list, info);
2009 if (NULL == g_widget_tidl_info_list) {
2010 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to add new widget tidl info");
2015 return VCD_ERROR_OUT_OF_MEMORY;
2017 SLOG(LOG_INFO, TAG_VCD, "[Client Data SUCCESS] Add new widget tidl info. pid(%d)", pid);
2020 return VCD_ERROR_NONE;
2023 int vcd_client_widget_set_tidl_notify_cb(int pid, rpc_port_stub_vcd_widget_stub_vc_widget_notify_cb_h callback, void* user_data)
2026 widget_tidl_info_s* info = NULL;
2027 info = __get_widget_tidl_info_element(pid);
2030 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no tidl info in the list. pid(%d)", pid);
2031 return VCD_ERROR_INVALID_PARAMETER;
2035 ret = rpc_port_stub_vcd_widget_stub_vc_widget_notify_cb_clone(callback, &(info->notify_cb));
2037 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to clone notify callback. ret(%d)", ret);
2039 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to clone notify callback. ret(%d)", ret);
2041 info->notify_cb_user_data = user_data;
2043 return VCD_ERROR_NONE;
2046 int vcd_client_widget_unset_tidl_notify_cb(int pid)
2049 widget_tidl_info_s* info = NULL;
2050 info = __get_widget_tidl_info_element(pid);
2053 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] There is no tidl info in the list. pid(%d)", pid);
2054 return VCD_ERROR_INVALID_PARAMETER;
2058 ret = rpc_port_stub_vcd_widget_stub_vc_widget_notify_cb_destroy(info->notify_cb);
2060 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to destroy notify callback. ret(%d)", ret);
2062 SLOG(LOG_INFO, TAG_VCD, "[Client Data] Succeed to destroy notify callback. ret(%d)", ret);
2064 info->notify_cb = NULL;
2065 info->notify_cb_user_data = NULL;
2067 return VCD_ERROR_NONE;
2070 int vcd_client_widget_delete_tidl_info(int pid)
2073 widget_tidl_info_s* widget_tidl_info = NULL;
2076 tmp = __get_widget_tidl_info_item(pid);
2078 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] pid(%d) is NOT valid", pid);
2079 return VCD_ERROR_INVALID_PARAMETER;
2082 /*Free widget structure*/
2083 widget_tidl_info = tmp->data;
2084 if (NULL != widget_tidl_info) {
2085 free(widget_tidl_info);
2088 /*Delete handle from list*/
2089 g_widget_tidl_info_list = g_slist_delete_link(g_widget_tidl_info_list, tmp);
2091 return VCD_ERROR_NONE;
2094 widget_tidl_info_s* vcd_client_widget_get_tidl_info(int pid)
2096 return __get_widget_tidl_info_element(pid);
2099 GSList* vcd_client_widget_get_tidl_info_list()
2101 return g_widget_tidl_info_list;
2105 void vcd_client_update_foreground_pid()
2107 int tmp_pid = VC_RUNTIME_INFO_NO_FOREGROUND;
2108 vcd_config_get_foreground(&tmp_pid);
2110 int pid = VC_RUNTIME_INFO_NO_FOREGROUND;
2111 int ret = aul_window_get_focused_pid(&pid);
2113 SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to get focused pid, ret(%d)", ret);
2115 SLOG(LOG_INFO, TAG_VCD, "[INFO] Foreground pid (%d), Focused pid (%d)", tmp_pid, pid);
2117 GSList *iter = NULL;
2118 vc_client_info_s *data = NULL;
2120 int count = g_slist_length(g_client_list);
2124 SLOG(LOG_INFO, TAG_VCD, "No Client");
2126 iter = g_slist_nth(g_client_list, 0);
2127 for (i = 0; i < count; i++) {
2134 SLOG(LOG_INFO, TAG_VCD, "[%dth] pid(%d)", i, data->pid);
2135 if (pid == data->pid) {
2136 SLOG(LOG_INFO, TAG_VCD, "[INFO] foreground pid (%d)", data->pid);
2137 vcd_config_set_foreground(data->pid, true);
2138 if (tmp_pid != data->pid) {
2139 SLOG(LOG_INFO, TAG_VCD, "[INFO] foreground pid is different");
2144 iter = g_slist_next(iter);
2148 widget_info_s *widget_data = NULL;
2149 count = g_slist_length(g_widget_list);
2152 SLOG(LOG_INFO, TAG_VCD, "No widget");
2154 iter = g_slist_nth(g_widget_list, 0);
2155 for (i = 0; i < count; i++) {
2159 widget_data = iter->data;
2161 if (NULL != widget_data) {
2162 SLOG(LOG_INFO, TAG_VCD, "[%dth] pid(%d)", i, widget_data->pid);
2163 if (pid == widget_data->pid) {
2164 SLOG(LOG_INFO, TAG_VCD, "[INFO] foreground pid (%d)", widget_data->pid);
2165 vcd_config_set_foreground(widget_data->pid, true);
2166 if (tmp_pid != widget_data->pid) {
2167 SLOG(LOG_INFO, TAG_VCD, "[INFO] foreground pid is changed");
2172 iter = g_slist_next(iter);
2176 SLOG(LOG_INFO, TAG_VCD, "[INFO] No foreground");
2177 vcd_config_set_foreground(VC_RUNTIME_INFO_NO_FOREGROUND, true);
2184 GSList* __get_setting_tidl_info_item(const int pid)
2186 GSList *iter = NULL;
2187 setting_tidl_info_s *data = NULL;
2189 int count = g_slist_length(g_setting_tidl_info_list);
2193 iter = g_slist_nth(g_setting_tidl_info_list, 0);
2194 for (i = 0; i < count; i++) {
2200 if (pid == data->pid)
2204 iter = g_slist_next(iter);
2211 setting_tidl_info_s* __get_setting_tidl_info_element(int pid)
2213 GSList *iter = NULL;
2214 setting_tidl_info_s *data = NULL;
2216 int count = g_slist_length(g_setting_tidl_info_list);
2220 iter = g_slist_nth(g_setting_tidl_info_list, 0);
2221 for (i = 0; i < count; i++) {
2228 if (pid == data->pid)
2232 iter = g_slist_next(iter);
2239 int vcd_client_setting_add_tidl_info(int pid)
2241 /*Check pid is duplicated*/
2242 setting_tidl_info_s* info = NULL;
2243 info = __get_setting_tidl_info_element(pid);
2246 SLOG(LOG_WARN, TAG_VCD, "[Setting Data] Setting tidl info pid is already registered");
2247 return VCD_ERROR_NONE;
2250 SLOG(LOG_INFO, TAG_VCD, "[Setting Data] There is no tidl info of pid(%d). Create new one.", pid);
2251 info = (setting_tidl_info_s*)calloc(1, sizeof(setting_tidl_info_s));
2253 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
2254 return VCD_ERROR_OUT_OF_MEMORY;
2258 info->notify_cb = NULL;
2259 info->notify_cb_user_data = NULL;
2261 g_setting_tidl_info_list = g_slist_append(g_setting_tidl_info_list, info);
2262 if (NULL == g_setting_tidl_info_list) {
2263 SLOG(LOG_ERROR, TAG_VCD, "[Setting Data ERROR] Fail to add new setting client tidl info");
2268 return VCD_ERROR_OUT_OF_MEMORY;
2270 SLOG(LOG_INFO, TAG_VCD, "[Setting Data SUCCESS] Add new setting client tidl info. pid(%d)", pid);
2273 return VCD_ERROR_NONE;
2276 int vcd_client_setting_set_tidl_notify_cb(int pid, rpc_port_stub_vcd_setting_stub_vc_setting_notify_cb_h callback, void* user_data)
2279 setting_tidl_info_s* info = NULL;
2280 info = __get_setting_tidl_info_element(pid);
2283 SLOG(LOG_ERROR, TAG_VCD, "[Setting Data ERROR] There is no tidl info in the list. pid(%d)", pid);
2284 return VCD_ERROR_INVALID_PARAMETER;
2288 ret = rpc_port_stub_vcd_setting_stub_vc_setting_notify_cb_clone(callback, &(info->notify_cb));
2290 SLOG(LOG_ERROR, TAG_VCD, "[Setting Data ERROR] Fail to clone notify callback. ret(%d)", ret);
2292 SLOG(LOG_INFO, TAG_VCD, "[Setting Data] Succeed to clone notify callback. ret(%d)", ret);
2294 info->notify_cb_user_data = user_data;
2296 return VCD_ERROR_NONE;
2299 int vcd_client_setting_unset_tidl_notify_cb(int pid)
2302 setting_tidl_info_s* info = NULL;
2303 info = __get_setting_tidl_info_element(pid);
2306 SLOG(LOG_ERROR, TAG_VCD, "[Setting Data ERROR] There is no tidl info in the list. pid(%d)", pid);
2307 return VCD_ERROR_INVALID_PARAMETER;
2311 ret = rpc_port_stub_vcd_setting_stub_vc_setting_notify_cb_destroy(info->notify_cb);
2313 SLOG(LOG_ERROR, TAG_VCD, "[Setting Data ERROR] Fail to destroy notify callback. ret(%d)", ret);
2315 SLOG(LOG_INFO, TAG_VCD, "[Setting Data] Succeed to destroy notify callback. ret(%d)", ret);
2317 info->notify_cb = NULL;
2318 info->notify_cb_user_data = NULL;
2320 return VCD_ERROR_NONE;
2323 int vcd_client_setting_delete_tidl_info(int pid)
2326 setting_tidl_info_s* setting_tidl_info = NULL;
2329 tmp = __get_setting_tidl_info_item(pid);
2331 SLOG(LOG_ERROR, TAG_VCD, "[Setting Data ERROR] pid(%d) is NOT valid", pid);
2332 return VCD_ERROR_INVALID_PARAMETER;
2335 /*Free setting client structure*/
2336 setting_tidl_info = tmp->data;
2337 if (NULL != setting_tidl_info) {
2338 free(setting_tidl_info);
2341 /*Delete handle from list*/
2342 g_setting_tidl_info_list = g_slist_delete_link(g_setting_tidl_info_list, tmp);
2344 return VCD_ERROR_NONE;
2347 setting_tidl_info_s* vcd_client_setting_get_tidl_info(int pid)
2349 return __get_setting_tidl_info_element(pid);
2352 int vcd_client_setting_get_tidl_list(int** pids, int* pid_count)
2354 if (NULL == pids || NULL == pid_count)
2355 return VCD_ERROR_INVALID_PARAMETER;
2357 int count = g_slist_length(g_setting_tidl_info_list);
2360 return VCD_ERROR_OUT_OF_MEMORY;
2363 tmp = (int*)calloc(count, sizeof(int));
2365 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
2366 return VCD_ERROR_OUT_OF_MEMORY;
2369 GSList *iter = NULL;
2370 setting_tidl_info_s *data = NULL;
2373 iter = g_slist_nth(g_setting_tidl_info_list, 0);
2375 while (NULL != iter) {
2382 iter = g_slist_next(iter);
2389 return VCD_ERROR_NONE;