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.
27 #include "service_adaptor_errors.h"
28 #include "service_adaptor_internal.h"
29 #include "sal_service_adaptor.h"
30 #include "sal_service_task.h"
31 #include "sal_service_task_internal.h"
32 #include "sal_ipc_client.h"
33 #include "sal_ipc_client_core.h"
34 #include "sal_ipc_client_auth.h"
36 //******************************************************************************
37 //* Global variables and defines
38 //******************************************************************************
41 * @brief Describes infromation about Adaptor Handle
43 typedef struct _service_adaptor_s
47 GList *plugins; /* char **plugins (uri) */
48 GList *started_plugins; /* service_plugin_h **started_plugins */
50 typedef struct _service_adaptor_s *service_adaptor_h;
53 * @brief Describes infromation about Plugin Handle
55 typedef struct _service_plugin_s
60 service_adaptor_h service_adaptor = NULL;
62 //******************************************************************************
64 //******************************************************************************
66 //******************************************************************************
67 //* Private interface definition
68 //******************************************************************************
70 //******************************************************************************
71 //* Public interface definition
72 //******************************************************************************
74 API int service_adaptor_connect()
78 service_adaptor = (service_adaptor_h) g_malloc0(sizeof(service_adaptor_s));
86 char path[1024] = {0,};
89 path_len = readlink("/proc/self/exe", path, 1024);
90 RETV_IF(0 == path_len, SERVICE_ADAPTOR_ERROR_SYSTEM);
92 uri = strndup(path, path_len);
95 service_adaptor->uri = strdup(uri);
97 int ret = SERVICE_ADAPTOR_ERROR_NONE;
98 ret = sal_ipc_client_init();
99 RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL);
101 GList *plugins = NULL;
102 ret = ipc_service_adaptor_connect(uri, &plugins);
103 RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL);
105 ret = service_task_connect();
106 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "service_task_connect() Failed");
108 service_adaptor->plugins = plugins;
112 return SERVICE_ADAPTOR_ERROR_NONE;
115 API int service_adaptor_disconnect()
119 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
121 int ret = SERVICE_ADAPTOR_ERROR_NONE;
122 ret = service_task_disconnect();
123 RETVM_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, ret, "service_task_disconnect() Failed");
125 ret = ipc_service_adaptor_disconnect(service_adaptor->uri);
126 RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL);
128 ret = sal_ipc_client_deinit();
129 RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INTERNAL);
131 // TODO: free memory in adaptor
132 SAL_FREE(service_adaptor);
134 return SERVICE_ADAPTOR_ERROR_NONE;
137 API int service_adaptor_foreach_plugin(service_adaptor_plugin_cb callback, void *user_data)
141 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
142 RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
144 RETV_IF(0 == g_list_length(service_adaptor->plugins), SERVICE_ADAPTOR_ERROR_NO_DATA);
146 for (GList *list = g_list_first(service_adaptor->plugins); list != NULL; list = list->next)
148 char * uri = (char *) list->data;
150 bool ret = callback(uri, 0, user_data);
151 RETV_IF(false == ret, SERVICE_ADAPTOR_ERROR_NONE);
154 return SERVICE_ADAPTOR_ERROR_NONE;
157 API int service_adaptor_get_last_result(int *err)
161 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
162 RETV_IF(NULL == err, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
164 return SERVICE_ADAPTOR_ERROR_NONE;
167 API int service_adaptor_get_last_error_message(char **message)
171 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
172 RETV_IF(NULL == message, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
174 return SERVICE_ADAPTOR_ERROR_NONE;
177 API int service_plugin_create(const char *uri, service_plugin_h *plugin)
181 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
182 RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
183 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
185 int ret = ipc_service_plugin_create(uri);
186 RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
188 service_plugin_h service_plugin = (service_plugin_h) g_malloc0(sizeof(service_plugin_s));
190 service_plugin->uri = strdup(uri);
192 *plugin = service_plugin;
194 return SERVICE_ADAPTOR_ERROR_NONE;
197 API int service_plugin_destroy(service_plugin_h plugin)
201 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
202 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
204 int ret = ipc_service_plugin_destroy(plugin->uri);
205 RETV_IF(SERVICE_ADAPTOR_ERROR_NONE != ret, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
207 // TODO: free memeory of plugin
210 return SERVICE_ADAPTOR_ERROR_NONE;
213 API int service_plugin_add_property(service_plugin_h plugin, const char *key, const char *value)
215 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
216 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
217 RETV_IF(NULL == key, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
218 RETV_IF(NULL == value, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
220 return SERVICE_ADAPTOR_ERROR_NONE;
223 API int service_plugin_remove_property(service_plugin_h plugin, const char *key)
225 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
226 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
227 RETV_IF(NULL == key, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
229 return SERVICE_ADAPTOR_ERROR_NONE;
232 API int service_plugin_get_property(service_plugin_h plugin, const char *key, char **value)
234 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
235 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
236 RETV_IF(NULL == key, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
237 RETV_IF(NULL == value, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
239 return SERVICE_ADAPTOR_ERROR_NONE;
242 API int service_plugin_login(service_plugin_h plugin, service_plugin_login_cb callback, void *user_data)
246 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
247 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
248 RETV_IF(NULL == callback, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
250 // TODO: login this plugin via service adaptor (dbus)
252 callback(SERVICE_ADAPTOR_ERROR_NONE, user_data);
254 return SERVICE_ADAPTOR_ERROR_NONE;
257 API int service_plugin_start(service_plugin_h plugin)
261 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
262 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
264 // TODO: check this plugin via service adaptor (dbus), use or not use?, must be logined.
266 service_adaptor->started_plugins = g_list_append(service_adaptor->started_plugins, plugin);
268 return SERVICE_ADAPTOR_ERROR_NONE;
271 API int service_plugin_stop(service_plugin_h plugin)
275 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
276 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
278 // TODO: notify to stop this plugin to service adaptor (dbus)
280 for (GList *list = g_list_first(service_adaptor->started_plugins); list != NULL; list = list->next)
282 service_plugin_h service_plugin = (service_plugin_h) list->data;
284 if (0 == strcmp(service_plugin->uri, plugin->uri))
286 service_adaptor->started_plugins = g_list_remove(service_adaptor->started_plugins, list);
288 return SERVICE_ADAPTOR_ERROR_NONE;
292 return SERVICE_ADAPTOR_ERROR_NONE;
295 int service_plugin_get_uri(service_plugin_h plugin, char **uri)
299 RETV_IF(NULL == service_adaptor, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
300 RETV_IF(NULL == plugin, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
301 RETV_IF(NULL == uri, SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
302 RETV_IF(NULL == g_list_find(service_adaptor->started_plugins, plugin), SERVICE_ADAPTOR_ERROR_INVALID_PARAMETER);
304 *uri = strdup(plugin->uri);
306 return SERVICE_ADAPTOR_ERROR_NONE;