4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Garima Shrivastava<garima.s@samsung.com>
7 * Jyotsna Dhumale <jyotsna.a@samsung.com>
8 * Venkatesha Sarpangala <sarpangala.v@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
25 #include <sys/types.h>
29 #include <app2sd_client_interface.h>
31 static int app2sd_gdbus_shared_connection(GDBusConnection **connection)
35 #if (GLIB_MAJOR_VERSION <= 2 && GLIB_MINOR_VERSION < 36)
39 *connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
40 if (*connection == NULL) {
42 _E("app2sd error : failed to get "
43 "system dbus [%s]", error->message);
46 return APP2EXT_ERROR_DBUS_FAILED;
49 return APP2EXT_SUCCESS;
52 static int __app2sd_call_server_method(const gchar *method_name,
55 int ret = APP2EXT_SUCCESS;
57 GDBusConnection *conn = NULL;
58 GDBusProxy *proxy = NULL;
60 GVariant *value = NULL;
62 /* get gdbus connection */
63 ret = app2sd_gdbus_shared_connection(&conn);
65 _E("app2sd error : dbus connection error");
70 proxy = g_dbus_proxy_new_sync(conn,
71 G_DBUS_PROXY_FLAGS_NONE, NULL,
72 APP2SD_BUS_NAME, APP2SD_OBJECT_PATH, APP2SD_INTERFACE_NAME,
75 _E("failed to create new proxy, error(%s)", error->message);
77 ret = APP2EXT_ERROR_DBUS_FAILED;
81 value = g_dbus_proxy_call_sync(proxy, method_name, param,
82 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
84 _E("proxy call sync error(%s)", error->message);
86 ret = APP2EXT_ERROR_DBUS_FAILED;
90 g_variant_get(value, "(i)", &result);
91 g_variant_unref(value);
93 _D("result(%d)", result);
104 static void __app2sd_create_dir_list_builder(gpointer data, gpointer user_data)
106 app2ext_dir_details *item = (app2ext_dir_details *)data;
107 GVariantBuilder *builder = (GVariantBuilder *)user_data;
109 g_variant_builder_add(builder, "(si)", item->name, item->type);
112 int app2sd_client_usr_pre_app_install(const char *pkgid, GList* dir_list,
116 GVariantBuilder *builder = NULL;
117 GVariant *param = NULL;
119 /* validate the function parameter recieved */
120 if (pkgid == NULL || dir_list == NULL || size <= 0) {
121 _E("invalid function arguments");
122 return APP2EXT_ERROR_INVALID_ARGUMENTS;
125 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
126 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
128 param = g_variant_new("(sia(si)i)", pkgid, size, builder, uid);
129 ret = __app2sd_call_server_method("PreAppInstall", param);
132 g_variant_builder_unref(builder);
136 int app2sd_client_pre_app_install(const char *pkgid, GList* dir_list,
141 ret = app2sd_client_usr_pre_app_install(pkgid,
142 dir_list, size, getuid());
147 int app2sd_client_usr_post_app_install(const char *pkgid,
148 app2ext_status install_status, uid_t uid)
151 GVariant *param = NULL;
153 /* validate the function parameter recieved */
154 if (pkgid == NULL || install_status < APP2EXT_STATUS_FAILED
155 || install_status > APP2EXT_STATUS_SUCCESS) {
156 _E("invalid func parameters");
157 return APP2EXT_ERROR_INVALID_ARGUMENTS;
160 param = g_variant_new("(sii)", pkgid, install_status, uid);
161 ret = __app2sd_call_server_method("PostAppInstall", param);
165 int app2sd_client_post_app_install(const char *pkgid,
166 app2ext_status install_status)
170 ret = app2sd_client_usr_post_app_install(pkgid,
171 install_status, getuid());
176 int app2sd_client_usr_pre_app_upgrade(const char *pkgid, GList* dir_list,
180 GVariantBuilder *builder = NULL;
181 GVariant *param = NULL;
183 /* validate the function parameter recieved */
184 if (pkgid == NULL || dir_list == NULL || size <= 0) {
185 _E("invalid function arguments");
186 return APP2EXT_ERROR_INVALID_ARGUMENTS;
189 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
190 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
192 param = g_variant_new("(sia(si)i)", pkgid, size, builder, uid);
193 ret = __app2sd_call_server_method("PreAppUpgrade", param);
196 g_variant_builder_unref(builder);
200 int app2sd_client_pre_app_upgrade(const char *pkgid, GList* dir_list,
205 ret = app2sd_client_usr_pre_app_upgrade(pkgid,
206 dir_list, size, getuid());
211 int app2sd_client_usr_post_app_upgrade(const char *pkgid,
212 app2ext_status install_status, uid_t uid)
215 GVariant *param = NULL;
217 /* validate the function parameter recieved */
218 if (pkgid == NULL || install_status < APP2EXT_STATUS_FAILED
219 || install_status > APP2EXT_STATUS_SUCCESS) {
220 _E("invalid func parameters");
221 return APP2EXT_ERROR_INVALID_ARGUMENTS;
224 param = g_variant_new("(sii)", pkgid, install_status, uid);
225 ret = __app2sd_call_server_method("PostAppUpgrade", param);
229 int app2sd_client_post_app_upgrade(const char *pkgid,
230 app2ext_status install_status)
234 ret = app2sd_client_usr_post_app_upgrade(pkgid,
235 install_status, getuid());
240 int app2sd_client_usr_pre_app_uninstall(const char *pkgid, uid_t uid)
243 GVariant *param = NULL;
245 /* validate the function parameter recieved */
247 _E("invalid func parameters");
248 return APP2EXT_ERROR_INVALID_ARGUMENTS;
251 param = g_variant_new("(si)", pkgid, uid);
252 ret = __app2sd_call_server_method("PreAppUninstall", param);
256 int app2sd_client_pre_app_uninstall(const char *pkgid)
260 ret = app2sd_client_usr_pre_app_uninstall(pkgid,
266 int app2sd_client_usr_post_app_uninstall(const char *pkgid, uid_t uid)
269 GVariant *param = NULL;
271 /* validate the function parameter recieved */
273 _E("invalid func parameters");
274 return APP2EXT_ERROR_INVALID_ARGUMENTS;
277 param = g_variant_new("(si)", pkgid, uid);
278 ret = __app2sd_call_server_method("PostAppUninstall", param);
282 int app2sd_client_post_app_uninstall(const char *pkgid)
286 ret = app2sd_client_usr_post_app_uninstall(pkgid,
292 int app2sd_client_usr_force_clean(const char *pkgid, uid_t uid)
295 GVariant *param = NULL;
297 /* validate the function parameter recieved */
299 _E("invalid func parameters");
300 return APP2EXT_ERROR_INVALID_ARGUMENTS;
303 param = g_variant_new("(si)", pkgid, uid);
304 ret = __app2sd_call_server_method("ForceClean", param);
308 int app2sd_client_force_clean(const char *pkgid)
312 ret = app2sd_client_usr_force_clean(pkgid, getuid());
317 int app2sd_client_usr_on_demand_setup_init(const char *pkgid, uid_t uid)
320 GVariant *param = NULL;
322 /* validate the function parameter recieved */
324 _E("invalid func parameters");
325 return APP2EXT_ERROR_INVALID_ARGUMENTS;
328 param = g_variant_new("(si)", pkgid, uid);
329 ret = __app2sd_call_server_method("OndemandSetupInit", param);
333 int app2sd_client_on_demand_setup_init(const char *pkgid)
337 ret = app2sd_client_usr_on_demand_setup_init(pkgid,
343 int app2sd_client_usr_on_demand_setup_exit(const char *pkgid, uid_t uid)
346 GVariant *param = NULL;
348 /* validate the function parameter recieved */
350 _E("invalid func parameters");
351 return APP2EXT_ERROR_INVALID_ARGUMENTS;
354 param = g_variant_new("(si)", pkgid, uid);
355 ret = __app2sd_call_server_method("OndemandSetupExit", param);
359 int app2sd_client_on_demand_setup_exit(const char *pkgid)
363 ret = app2sd_client_usr_on_demand_setup_exit(pkgid,
369 int app2sd_client_usr_move_installed_app(const char *pkgid, GList* dir_list,
370 app2ext_move_type move_type, uid_t uid)
373 GVariantBuilder *builder = NULL;
374 GVariant *param = NULL;
376 /* validate the function parameter recieved */
377 if (pkgid == NULL || dir_list == NULL
378 || move_type < APP2EXT_MOVE_TO_EXT
379 || move_type > APP2EXT_MOVE_TO_PHONE) {
380 _E("invalid function arguments");
381 return APP2EXT_ERROR_INVALID_ARGUMENTS;
384 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
385 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
387 param = g_variant_new("(sia(si)i)", pkgid, move_type, builder, uid);
388 ret = __app2sd_call_server_method("MoveInstalledApp", param);
391 g_variant_builder_unref(builder);
395 int app2sd_client_move_installed_app(const char *pkgid, GList* dir_list,
396 app2ext_move_type move_type)
400 ret = app2sd_client_usr_move_installed_app(pkgid,
401 dir_list, move_type, getuid());
406 void app2ext_on_load(app2ext_interface *interface)
408 /* Plug-in Binding.*/
409 interface->client_pre_install = app2sd_client_pre_app_install;
410 interface->client_post_install = app2sd_client_post_app_install;
411 interface->client_pre_upgrade = app2sd_client_pre_app_upgrade;
412 interface->client_post_upgrade = app2sd_client_post_app_upgrade;
413 interface->client_pre_uninstall = app2sd_client_pre_app_uninstall;
414 interface->client_post_uninstall = app2sd_client_post_app_uninstall;
415 interface->client_force_clean = app2sd_client_force_clean;
416 interface->client_enable = app2sd_client_on_demand_setup_init;
417 interface->client_disable = app2sd_client_on_demand_setup_exit;
418 interface->client_move = app2sd_client_move_installed_app;
420 interface->client_usr_pre_install = app2sd_client_usr_pre_app_install;
421 interface->client_usr_post_install = app2sd_client_usr_post_app_install;
422 interface->client_usr_pre_upgrade = app2sd_client_usr_pre_app_upgrade;
423 interface->client_usr_post_upgrade = app2sd_client_usr_post_app_upgrade;
424 interface->client_usr_pre_uninstall = app2sd_client_usr_pre_app_uninstall;
425 interface->client_usr_post_uninstall = app2sd_client_usr_post_app_uninstall;
426 interface->client_usr_force_clean = app2sd_client_usr_force_clean;
427 interface->client_usr_enable = app2sd_client_usr_on_demand_setup_init;
428 interface->client_usr_disable = app2sd_client_usr_on_demand_setup_exit;
429 interface->client_usr_move = app2sd_client_usr_move_installed_app;