Add 3.0 APIs and sync APIs same as 2.4
[platform/core/convergence/service-adaptor.git] / common / ipc-server / sal_ipc_server_core.c
1 /*
2  * Service Adaptor IPC Server
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 <stdint.h>
21 #include <glib.h>
22 #include <gio/gio.h>
23
24 #include "service_adaptor_errors.h"
25 #include "service_adaptor_internal.h"
26 #include "sal.h"
27 #include "sal_ipc_server.h"
28 #include "sal_ipc_server_core.h"
29
30 //******************************************************************************
31 //* Global variables and defines
32 //******************************************************************************
33
34 //******************************************************************************
35 //* Private interface
36 //******************************************************************************
37
38 //******************************************************************************
39 //* Private interface definition
40 //******************************************************************************
41
42 //******************************************************************************
43 //* Public interface definition
44 //******************************************************************************
45
46 API void service_adaptor_method_call(GDBusConnection *connection,
47                 const gchar *sender,
48                 const gchar *object_path,
49                 const gchar *interface_name,
50                 const gchar *method_name,
51                 GVariant *parameters,
52                 GDBusMethodInvocation *invocation,
53                 gpointer user_data)
54 {
55         SAL_FN_CALL;
56
57         int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE;
58         char *ipc_msg = NULL;
59         char *ipc_type = NULL;
60         GVariant *ipc_data = NULL;
61
62         char *uri = NULL;
63
64         GVariant *in_parameters = g_variant_get_child_value(parameters, 0);
65
66         if (0 == g_strcmp0(method_name, DBUS_SERVICE_ADAPTOR_CONNECT_METHOD))
67         {
68                 int idx = 0;
69                 int size = service_adaptor_connect_req_s_type_length;
70                 GVariant *req_info[size];
71
72                 ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info);
73
74                 char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]);
75
76                 SAL_INFO("uri: %s", uri);
77
78                 ipc_type = strdup(service_adaptor_connect_res_s_type);
79                 ipc_ret = sal_adaptor_connect(uri);
80
81                 int plugins_size = 0;
82                 char **plugins = NULL;
83                 GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE(plugin_list_type));
84
85                 ipc_ret = sal_adaptor_get_plugins(&plugins, &plugins_size);
86
87                 for (gsize i = 0; i < plugins_size; i++)
88                 {
89                         ipc_insure_g_variant_builder_add_array_string(builder, plugins[i]);
90                 }
91
92                 ipc_create_error_msg(ipc_ret, &ipc_msg);
93                 ipc_data = g_variant_new(ipc_make_return_type(ipc_type), builder, ipc_ret, SAL_IPC_STR(ipc_msg));
94
95                 g_variant_builder_unref(builder);
96                 ipc_destroy_variant_info(req_info, size);
97         }
98         else if (0 == g_strcmp0(method_name, DBUS_SERVICE_ADAPTOR_DISCONNECT_METHOD))
99         {
100                 int idx = 0;
101                 int size = service_adaptor_disconnect_s_type_length;
102                 GVariant *req_info[size];
103
104                 ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info);
105
106                 char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]);
107
108                 SAL_INFO("uri: %s", uri);
109
110                 ipc_ret = sal_adaptor_disconnect(uri);
111
112                 ipc_create_error_msg(ipc_ret, &ipc_msg);
113                 ipc_data = g_variant_new(ipc_make_return_type(ipc_type), ipc_ret, SAL_IPC_STR(ipc_msg));
114
115                 ipc_destroy_variant_info(req_info, size);
116         }
117
118         g_dbus_method_invocation_return_value(invocation, ipc_data);
119
120         SAL_FREE(uri);
121         SAL_FREE(ipc_msg);
122         SAL_FREE(ipc_type);
123
124         SAL_FN_END;
125 }
126
127 API void service_plugin_method_call(GDBusConnection *connection,
128                 const gchar *sender,
129                 const gchar *object_path,
130                 const gchar *interface_name,
131                 const gchar *method_name,
132                 GVariant *parameters,
133                 GDBusMethodInvocation *invocation,
134                 gpointer user_data)
135 {
136         SAL_FN_CALL;
137
138         int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE;
139         char *ipc_msg = NULL;
140         char *ipc_type = NULL;
141         GVariant *ipc_data = NULL;
142
143         char *uri = NULL;
144
145         GVariant *in_parameters = g_variant_get_child_value(parameters, 0);
146
147         if (0 == g_strcmp0(method_name, DBUS_SERVICE_PLUGIN_CREATE_METHOD))
148         {
149                 int idx = 0;
150                 int size = service_plugin_create_s_type_length;
151                 GVariant *req_info[size];
152
153                 ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info);
154
155                 char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]);
156
157                 SAL_INFO("uri: %s", uri);
158
159                 ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL;
160
161                 sal_h sal = sal_get_handle();
162
163                 if (NULL != sal)
164                 {
165                         ipc_ret = auth_adaptor_ref_plugin(sal->auth, uri);
166                 }
167
168                 ipc_create_error_msg(ipc_ret, &ipc_msg);
169                 ipc_data = g_variant_new(ipc_make_return_type(ipc_type), ipc_ret, SAL_IPC_STR(ipc_msg));
170
171                 ipc_destroy_variant_info(req_info, size);
172         }
173         else if (0 == g_strcmp0(method_name, DBUS_SERVICE_PLUGIN_DESTROY_METHOD))
174         {
175                 int idx = 0;
176                 int size = service_plugin_destroy_s_type_length;
177                 GVariant *req_info[size];
178
179                 ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info);
180
181                 char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]);
182
183                 SAL_INFO("uri: %s", uri);
184
185                 ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL;
186
187                 sal_h sal = sal_get_handle();
188
189                 if (NULL != sal)
190                 {
191                         ipc_ret = auth_adaptor_unref_plugin(sal->auth, uri);
192                 }
193
194                 ipc_create_error_msg(ipc_ret, &ipc_msg);
195                 ipc_data = g_variant_new(ipc_make_return_type(ipc_type), ipc_ret, SAL_IPC_STR(ipc_msg));
196
197                 ipc_destroy_variant_info(req_info, size);
198         }
199
200         g_dbus_method_invocation_return_value(invocation, ipc_data);
201
202         SAL_FREE(uri);
203         SAL_FREE(ipc_msg);
204         SAL_FREE(ipc_type);
205
206         SAL_FN_END;
207 }
208 /*
209 service_adaptor_internal_error_code_e dbus_service_adaptor_signal_callback(service_adaptor_internal_signal_code_e signal_code,
210                                                 const char *signal_msg)
211 {
212         SAL_FN_CALL;
213
214         GError* error = NULL;
215         GDBusConnection *dbus_connection = dbus_get_connection();
216
217         if (NULL != dbus_connection)
218         {
219                 GVariant *response = g_variant_new("(ts)", (uint64_t) signal_code, signal_msg);
220
221                 g_dbus_connection_emit_signal(dbus_connection,
222                                 NULL,
223                                 SERVICE_ADAPTOR_OBJECT_PATH,
224                                 SERVICE_ADAPTOR_INTERFACE,
225                                 DBUS_SERVICE_ADAPTOR_SIGNAL,
226                                 response,
227                                 &error );
228
229                 if (NULL != error)
230                 {
231                         service_adaptor_debug("Unable to send msg: %s", error->message);
232                         return SERVICE_ADAPTOR_INTERNAL_ERROR_DBUS;
233                 }
234         }
235
236         return SERVICE_ADAPTOR_INTERNAL_ERROR_NONE;
237 }
238 */