2 * Service Adaptor IPC Server
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.
24 #include "service_adaptor_errors.h"
25 #include "service_adaptor_internal.h"
27 #include "sal_ipc_server.h"
28 #include "sal_ipc_server_core.h"
30 //******************************************************************************
31 //* Global variables and defines
32 //******************************************************************************
34 //******************************************************************************
36 //******************************************************************************
38 //******************************************************************************
39 //* Private interface definition
40 //******************************************************************************
42 //******************************************************************************
43 //* Public interface definition
44 //******************************************************************************
46 API void service_adaptor_method_call(GDBusConnection *connection,
48 const gchar *object_path,
49 const gchar *interface_name,
50 const gchar *method_name,
52 GDBusMethodInvocation *invocation,
57 int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE;
59 char *ipc_type = NULL;
60 GVariant *ipc_data = NULL;
64 GVariant *in_parameters = g_variant_get_child_value(parameters, 0);
66 if (0 == g_strcmp0(method_name, DBUS_SERVICE_ADAPTOR_CONNECT_METHOD))
69 int size = service_adaptor_connect_req_s_type_length;
70 GVariant *req_info[size];
72 ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info);
74 char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]);
76 SAL_INFO("uri: %s", uri);
78 ipc_type = strdup(service_adaptor_connect_res_s_type);
79 ipc_ret = sal_adaptor_connect(uri);
82 char **plugins = NULL;
83 GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE(plugin_list_type));
85 ipc_ret = sal_adaptor_get_plugins(&plugins, &plugins_size);
87 for (gsize i = 0; i < plugins_size; i++)
89 ipc_insure_g_variant_builder_add_array_string(builder, plugins[i]);
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));
95 g_variant_builder_unref(builder);
96 ipc_destroy_variant_info(req_info, size);
98 else if (0 == g_strcmp0(method_name, DBUS_SERVICE_ADAPTOR_DISCONNECT_METHOD))
101 int size = service_adaptor_disconnect_s_type_length;
102 GVariant *req_info[size];
104 ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info);
106 char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]);
108 SAL_INFO("uri: %s", uri);
110 ipc_ret = sal_adaptor_disconnect(uri);
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));
115 ipc_destroy_variant_info(req_info, size);
118 g_dbus_method_invocation_return_value(invocation, ipc_data);
127 API void service_plugin_method_call(GDBusConnection *connection,
129 const gchar *object_path,
130 const gchar *interface_name,
131 const gchar *method_name,
132 GVariant *parameters,
133 GDBusMethodInvocation *invocation,
138 int ipc_ret = SERVICE_ADAPTOR_ERROR_NONE;
139 char *ipc_msg = NULL;
140 char *ipc_type = NULL;
141 GVariant *ipc_data = NULL;
145 GVariant *in_parameters = g_variant_get_child_value(parameters, 0);
147 if (0 == g_strcmp0(method_name, DBUS_SERVICE_PLUGIN_CREATE_METHOD))
150 int size = service_plugin_create_s_type_length;
151 GVariant *req_info[size];
153 ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info);
155 char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]);
157 SAL_INFO("uri: %s", uri);
159 ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL;
161 sal_h sal = sal_get_handle();
165 ipc_ret = auth_adaptor_ref_plugin(sal->auth, uri);
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));
171 ipc_destroy_variant_info(req_info, size);
173 else if (0 == g_strcmp0(method_name, DBUS_SERVICE_PLUGIN_DESTROY_METHOD))
176 int size = service_plugin_destroy_s_type_length;
177 GVariant *req_info[size];
179 ipc_create_variant_info(in_parameters, size, (GVariant ***) &req_info);
181 char *uri = ipc_insure_g_variant_dup_string(req_info[idx++]);
183 SAL_INFO("uri: %s", uri);
185 ipc_ret = SERVICE_ADAPTOR_ERROR_INTERNAL;
187 sal_h sal = sal_get_handle();
191 ipc_ret = auth_adaptor_unref_plugin(sal->auth, uri);
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));
197 ipc_destroy_variant_info(req_info, size);
200 g_dbus_method_invocation_return_value(invocation, ipc_data);
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)
214 GError* error = NULL;
215 GDBusConnection *dbus_connection = dbus_get_connection();
217 if (NULL != dbus_connection)
219 GVariant *response = g_variant_new("(ts)", (uint64_t) signal_code, signal_msg);
221 g_dbus_connection_emit_signal(dbus_connection,
223 SERVICE_ADAPTOR_OBJECT_PATH,
224 SERVICE_ADAPTOR_INTERFACE,
225 DBUS_SERVICE_ADAPTOR_SIGNAL,
231 service_adaptor_debug("Unable to send msg: %s", error->message);
232 return SERVICE_ADAPTOR_INTERNAL_ERROR_DBUS;
236 return SERVICE_ADAPTOR_INTERNAL_ERROR_NONE;