2 * Service Adaptor IPC Client
4 * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
23 #include "service_adaptor_errors.h"
24 #include "service_adaptor_internal.h"
25 #include "sal_ipc_client.h"
26 #include "sal_ipc_client_core.h"
28 //******************************************************************************
29 //* Global variables and defines
30 //******************************************************************************
32 //******************************************************************************
34 //******************************************************************************
36 //******************************************************************************
37 //* Private interface definition
38 //******************************************************************************
40 //******************************************************************************
41 //* Public interface definition
42 //******************************************************************************
44 API int ipc_service_adaptor_connect(const char *uri, GList **plugins)
48 RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
50 int ret = SERVICE_ADAPTOR_ERROR_NONE;
52 char *request_method = DBUS_SERVICE_ADAPTOR_CONNECT_METHOD;
53 GVariant *request_data = g_variant_new("(" service_adaptor_connect_req_s_type ")", uri);
55 char *reply_type = service_adaptor_connect_res_s_type;
56 int reply_size = RETURN_LENGTH + 1;
57 GVariant *reply = NULL;
59 ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply);
60 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret);
62 GVariant *reply_info[reply_size];
63 ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info);
66 int info_size = service_adaptor_connect_res_s_type_length;
67 GVariant *info[info_size];
68 ipc_create_variant_info(reply_info[idx++], info_size, (GVariant ***) &info);
71 GList *plugin_list = NULL;
72 gsize uri_info_size = g_variant_n_children(info[idx2]);
74 for (gsize i = 0; i < uri_info_size; i++)
76 GVariant *uri_info_struct;
77 GVariant *uri_info_entry_v = g_variant_get_child_value(info[idx2], i);
78 uri_info_struct = g_variant_get_child_value(uri_info_entry_v, 0);
80 plugin_list = g_list_append(plugin_list, ipc_insure_g_variant_dup_string(uri_info_struct));
82 g_variant_unref(uri_info_struct);
85 *plugins = plugin_list;
87 int ipc_ret = g_variant_get_int32(reply_info[idx++]);
88 char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]);
90 ipc_destroy_variant_info(reply_info, reply_size);
92 g_variant_unref(reply);
94 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg);
98 return SERVICE_ADAPTOR_ERROR_NONE;
101 API int ipc_service_adaptor_disconnect(const char *uri)
105 RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
107 int ret = SERVICE_ADAPTOR_ERROR_NONE;
109 char *request_method = DBUS_SERVICE_ADAPTOR_DISCONNECT_METHOD;
110 GVariant *request_data = g_variant_new("(" service_adaptor_disconnect_s_type ")", uri);
112 char *reply_type = NULL;
113 int reply_size = RETURN_LENGTH;
114 GVariant *reply = NULL;
116 ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply);
117 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret);
119 GVariant *reply_info[reply_size];
120 ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info);
123 int ipc_ret = g_variant_get_int32(reply_info[idx++]);
124 char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]);
126 ipc_destroy_variant_info(reply_info, reply_size);
128 g_variant_unref(reply);
130 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg);
134 return SERVICE_ADAPTOR_ERROR_NONE;
137 API int ipc_service_plugin_create(const char *uri)
141 RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
143 int ret = SERVICE_ADAPTOR_ERROR_NONE;
145 char *request_method = DBUS_SERVICE_PLUGIN_CREATE_METHOD;
146 GVariant *request_data = g_variant_new("(" service_plugin_create_s_type ")", uri);
148 char *reply_type = NULL;
149 int reply_size = RETURN_LENGTH;
150 GVariant *reply = NULL;
152 ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply);
153 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret);
155 GVariant *reply_info[reply_size];
156 ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info);
159 int ipc_ret = g_variant_get_int32(reply_info[idx++]);
160 char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]);
162 ipc_destroy_variant_info(reply_info, reply_size);
164 g_variant_unref(reply);
166 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg);
170 return SERVICE_ADAPTOR_ERROR_NONE;
173 API int ipc_service_plugin_destroy(const char *uri)
177 RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
179 int ret = SERVICE_ADAPTOR_ERROR_NONE;
181 char *request_method = DBUS_SERVICE_PLUGIN_DESTROY_METHOD;
182 GVariant *request_data = g_variant_new("(" service_plugin_destroy_s_type ")", uri);
184 char *reply_type = NULL;
185 int reply_size = RETURN_LENGTH;
186 GVariant *reply = NULL;
188 ret = sal_ipc_client_call_request(request_method, request_data, reply_type, &reply);
189 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "ipc_client_call_request() Failed(%d)", ret);
191 GVariant *reply_info[reply_size];
192 ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info);
195 int ipc_ret = g_variant_get_int32(reply_info[idx++]);
196 char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]);
198 ipc_destroy_variant_info(reply_info, reply_size);
200 g_variant_unref(reply);
202 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg);
206 return SERVICE_ADAPTOR_ERROR_NONE;