Add 3.0 APIs and sync APIs same as 2.4
[platform/core/convergence/service-adaptor.git] / common / ipc-client / sal_ipc_client_core.c
1 /*
2  * Service Adaptor IPC Client
3  *
4  * Copyright (c) 2014 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 #include <glib.h>
21 #include <gio/gio.h>
22
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"
27
28 //******************************************************************************
29 //* Global variables and defines
30 //******************************************************************************
31
32 //******************************************************************************
33 //* Private interface
34 //******************************************************************************
35
36 //******************************************************************************
37 //* Private interface definition
38 //******************************************************************************
39
40 //******************************************************************************
41 //* Public interface definition
42 //******************************************************************************
43
44 API int ipc_service_adaptor_connect(const char *uri, GList **plugins)
45 {
46         SAL_FN_CALL;
47
48         RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
49
50         int ret = SERVICE_ADAPTOR_ERROR_NONE;
51
52         char *request_method = DBUS_SERVICE_ADAPTOR_CONNECT_METHOD;
53         GVariant *request_data = g_variant_new("(" service_adaptor_connect_req_s_type ")", uri);
54
55         char *reply_type = service_adaptor_connect_res_s_type;
56         int reply_size = RETURN_LENGTH + 1;
57         GVariant *reply = NULL;
58
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);
61
62         GVariant *reply_info[reply_size];
63         ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info);
64
65         int idx = 0;
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);
69
70         int idx2 = 0;
71         GList *plugin_list = NULL;
72         gsize uri_info_size = g_variant_n_children(info[idx2]);
73
74         for (gsize i = 0; i < uri_info_size; i++)
75         {
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);
79
80                 plugin_list = g_list_append(plugin_list, ipc_insure_g_variant_dup_string(uri_info_struct));
81
82                 g_variant_unref(uri_info_struct);
83         }
84
85         *plugins = plugin_list;
86
87         int ipc_ret = g_variant_get_int32(reply_info[idx++]);
88         char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]);
89
90         ipc_destroy_variant_info(reply_info, reply_size);
91
92         g_variant_unref(reply);
93
94         RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg);
95
96         SAL_FREE(ipc_msg);
97
98         return SERVICE_ADAPTOR_ERROR_NONE;
99 }
100
101 API int ipc_service_adaptor_disconnect(const char *uri)
102 {
103         SAL_FN_CALL;
104
105         RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
106
107         int ret = SERVICE_ADAPTOR_ERROR_NONE;
108
109         char *request_method = DBUS_SERVICE_ADAPTOR_DISCONNECT_METHOD;
110         GVariant *request_data = g_variant_new("(" service_adaptor_disconnect_s_type ")", uri);
111
112         char *reply_type = NULL;
113         int reply_size = RETURN_LENGTH;
114         GVariant *reply = NULL;
115
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);
118
119         GVariant *reply_info[reply_size];
120         ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info);
121
122         int idx = 0;
123         int ipc_ret = g_variant_get_int32(reply_info[idx++]);
124         char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]);
125
126         ipc_destroy_variant_info(reply_info, reply_size);
127
128         g_variant_unref(reply);
129
130         RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg);
131
132         SAL_FREE(ipc_msg);
133
134         return SERVICE_ADAPTOR_ERROR_NONE;
135 }
136
137 API int ipc_service_plugin_create(const char *uri)
138 {
139         SAL_FN_CALL;
140
141         RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
142
143         int ret = SERVICE_ADAPTOR_ERROR_NONE;
144
145         char *request_method = DBUS_SERVICE_PLUGIN_CREATE_METHOD;
146         GVariant *request_data = g_variant_new("(" service_plugin_create_s_type ")", uri);
147
148         char *reply_type = NULL;
149         int reply_size = RETURN_LENGTH;
150         GVariant *reply = NULL;
151
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);
154
155         GVariant *reply_info[reply_size];
156         ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info);
157
158         int idx = 0;
159         int ipc_ret = g_variant_get_int32(reply_info[idx++]);
160         char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]);
161
162         ipc_destroy_variant_info(reply_info, reply_size);
163
164         g_variant_unref(reply);
165
166         RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg);
167
168         SAL_FREE(ipc_msg);
169
170         return SERVICE_ADAPTOR_ERROR_NONE;
171 }
172
173 API int ipc_service_plugin_destroy(const char *uri)
174 {
175         SAL_FN_CALL;
176
177         RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
178
179         int ret = SERVICE_ADAPTOR_ERROR_NONE;
180
181         char *request_method = DBUS_SERVICE_PLUGIN_DESTROY_METHOD;
182         GVariant *request_data = g_variant_new("(" service_plugin_destroy_s_type ")", uri);
183
184         char *reply_type = NULL;
185         int reply_size = RETURN_LENGTH;
186         GVariant *reply = NULL;
187
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);
190
191         GVariant *reply_info[reply_size];
192         ipc_create_variant_info(reply, reply_size, (GVariant ***) &reply_info);
193
194         int idx = 0;
195         int ipc_ret = g_variant_get_int32(reply_info[idx++]);
196         char *ipc_msg = ipc_insure_g_variant_dup_string(reply_info[idx++]);
197
198         ipc_destroy_variant_info(reply_info, reply_size);
199
200         g_variant_unref(reply);
201
202         RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ipc_ret, SERVICE_ADAPTOR_ERROR_INTERNAL, "IPC Result Failed(%d): %s", ipc_ret, ipc_msg);
203
204         SAL_FREE(ipc_msg);
205
206         return SERVICE_ADAPTOR_ERROR_NONE;
207 }
208