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.
26 #include <sys/types.h>
30 #include "app2sd_client_interface.h"
31 #include "app2ext_utils.h"
33 static int app2sd_gdbus_shared_connection(GDBusConnection **connection)
37 #if (GLIB_MAJOR_VERSION <= 2 && GLIB_MINOR_VERSION < 36)
41 *connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
42 if (*connection == NULL) {
44 _E("app2sd error : failed to get "
45 "system dbus [%s]", error->message);
48 return APP2EXT_ERROR_DBUS_FAILED;
51 return APP2EXT_SUCCESS;
54 static int __app2sd_call_server_method(const gchar *method_name,
57 int ret = APP2EXT_SUCCESS;
59 GDBusConnection *conn = NULL;
60 GDBusProxy *proxy = NULL;
62 GVariant *value = NULL;
64 /* get gdbus connection */
65 ret = app2sd_gdbus_shared_connection(&conn);
67 _E("app2sd error : dbus connection error");
72 proxy = g_dbus_proxy_new_sync(conn,
73 G_DBUS_PROXY_FLAGS_NONE, NULL,
74 APP2SD_BUS_NAME, APP2SD_OBJECT_PATH, APP2SD_INTERFACE_NAME,
77 _E("failed to create new proxy, error(%s)", error->message);
79 ret = APP2EXT_ERROR_DBUS_FAILED;
83 value = g_dbus_proxy_call_sync(proxy, method_name, param,
84 G_DBUS_CALL_FLAGS_NONE, G_MAXINT, NULL, &error);
86 _E("proxy call sync error(%s)", error->message);
88 ret = APP2EXT_ERROR_DBUS_FAILED;
92 g_variant_get(value, "(i)", &result);
93 g_variant_unref(value);
95 _D("result(%d)", result);
101 g_object_unref(conn);
106 static void __app2sd_create_dir_list_builder(gpointer data, gpointer user_data)
108 app2ext_dir_details *item = (app2ext_dir_details *)data;
109 GVariantBuilder *builder = (GVariantBuilder *)user_data;
111 g_variant_builder_add(builder, "(si)", item->name, item->type);
114 static int __app2sd_delete_temp_directories(const char *pkgid,
115 app2sd_cmd cmd, uid_t uid)
118 char temp_path[FILENAME_MAX] = { 0, };
120 if (cmd != APP2SD_PRE_UPGRADE)
121 return APP2EXT_SUCCESS;
123 if (_is_global(uid)) {
124 snprintf(temp_path, FILENAME_MAX - 1, "%s/%s.new",
125 tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
127 tzplatform_set_user(uid);
128 snprintf(temp_path, FILENAME_MAX - 1, "%s/%s.new",
129 tzplatform_getenv(TZ_USER_APP), pkgid);
130 tzplatform_reset_user();
133 /* this will delete all files under temp_path */
134 ret = _app2sd_delete_directory(temp_path);
136 _E("unable to delete (%s)", temp_path);
137 return APP2EXT_ERROR_DELETE_DIRECTORY;
140 return APP2EXT_SUCCESS;
143 static int __app2sd_create_default_directories(const char *pkgid,
144 app2sd_cmd cmd, uid_t uid)
147 mode_t mode = DIR_PERMS;
148 char application_path[FILENAME_MAX] = { 0, };
149 char application_mmc_path[FILENAME_MAX] = { 0, };
150 char temp_path[FILENAME_MAX] = { 0, };
152 if (_is_global(uid)) {
153 snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
154 tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
156 tzplatform_set_user(uid);
157 snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
158 tzplatform_getenv(TZ_USER_APP), pkgid);
159 tzplatform_reset_user();
162 ret = mkdir(application_path, mode);
164 if (errno != EEXIST) {
165 _E("create directory failed," \
166 " error no is (%d)", errno);
167 return APP2EXT_ERROR_CREATE_DIRECTORY;
171 snprintf(application_mmc_path, FILENAME_MAX - 1, "%s/.mmc",
174 ret = mkdir(application_mmc_path, mode);
176 if (errno != EEXIST) {
177 _E("create directory failed," \
178 " error no is (%d)", errno);
179 return APP2EXT_ERROR_CREATE_DIRECTORY;
183 if (cmd == APP2SD_PRE_UPGRADE) {
184 /* application_path for {pkgid}.new */
185 snprintf(temp_path, FILENAME_MAX - 1, "%s.new",
187 ret = mkdir(temp_path, mode);
189 if (errno != EEXIST) {
190 _E("create directory failed," \
191 " error no is (%d)", errno);
192 return APP2EXT_ERROR_CREATE_DIRECTORY;
195 /* application_mmc_path for {pkgid}.new */
196 snprintf(application_mmc_path, FILENAME_MAX - 1, "%s/.mmc",
198 ret = mkdir(application_mmc_path, mode);
200 if (errno != EEXIST) {
201 _E("create directory failed," \
202 " error no is (%d)", errno);
203 return APP2EXT_ERROR_CREATE_DIRECTORY;
208 return APP2EXT_SUCCESS;
211 int app2sd_client_usr_pre_app_install(const char *pkgid, GList *dir_list,
215 GVariantBuilder *builder = NULL;
216 GVariant *param = NULL;
218 /* validate the function parameter recieved */
219 if (pkgid == NULL || dir_list == NULL || size <= 0) {
220 _E("invalid function arguments");
221 return APP2EXT_ERROR_INVALID_ARGUMENTS;
224 ret = __app2sd_create_default_directories(pkgid,
225 APP2SD_PRE_INSTALL, uid);
229 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
230 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
232 param = g_variant_new("(sia(si)i)", pkgid, size, builder, uid);
233 ret = __app2sd_call_server_method("PreAppInstall", param);
236 g_variant_builder_unref(builder);
240 int app2sd_client_pre_app_install(const char *pkgid, GList *dir_list,
245 ret = app2sd_client_usr_pre_app_install(pkgid,
246 dir_list, size, getuid());
251 int app2sd_client_usr_post_app_install(const char *pkgid,
252 app2ext_status install_status, uid_t uid)
255 GVariant *param = NULL;
257 /* validate the function parameter recieved */
258 if (pkgid == NULL || install_status < APP2EXT_STATUS_FAILED
259 || install_status > APP2EXT_STATUS_SUCCESS) {
260 _E("invalid func parameters");
261 return APP2EXT_ERROR_INVALID_ARGUMENTS;
264 param = g_variant_new("(sii)", pkgid, install_status, uid);
265 ret = __app2sd_call_server_method("PostAppInstall", param);
269 int app2sd_client_post_app_install(const char *pkgid,
270 app2ext_status install_status)
274 ret = app2sd_client_usr_post_app_install(pkgid,
275 install_status, getuid());
280 int app2sd_client_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
284 GVariantBuilder *builder = NULL;
285 GVariant *param = NULL;
287 /* validate the function parameter recieved */
288 if (pkgid == NULL || dir_list == NULL || size <= 0) {
289 _E("invalid function arguments");
290 return APP2EXT_ERROR_INVALID_ARGUMENTS;
293 ret = __app2sd_create_default_directories(pkgid,
294 APP2SD_PRE_UPGRADE, uid);
298 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
299 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
301 param = g_variant_new("(sia(si)i)", pkgid, size, builder, uid);
302 ret = __app2sd_call_server_method("PreAppUpgrade", param);
305 g_variant_builder_unref(builder);
307 ret = __app2sd_delete_temp_directories(pkgid,
308 APP2SD_PRE_UPGRADE, uid);
312 int app2sd_client_pre_app_upgrade(const char *pkgid, GList *dir_list,
317 ret = app2sd_client_usr_pre_app_upgrade(pkgid,
318 dir_list, size, getuid());
323 int app2sd_client_usr_post_app_upgrade(const char *pkgid,
324 app2ext_status install_status, uid_t uid)
327 GVariant *param = NULL;
329 /* validate the function parameter recieved */
330 if (pkgid == NULL || install_status < APP2EXT_STATUS_FAILED
331 || install_status > APP2EXT_STATUS_SUCCESS) {
332 _E("invalid func parameters");
333 return APP2EXT_ERROR_INVALID_ARGUMENTS;
336 param = g_variant_new("(sii)", pkgid, install_status, uid);
337 ret = __app2sd_call_server_method("PostAppUpgrade", param);
341 int app2sd_client_post_app_upgrade(const char *pkgid,
342 app2ext_status install_status)
346 ret = app2sd_client_usr_post_app_upgrade(pkgid,
347 install_status, getuid());
352 int app2sd_client_usr_pre_app_uninstall(const char *pkgid, uid_t uid)
355 GVariant *param = NULL;
357 /* validate the function parameter recieved */
359 _E("invalid func parameters");
360 return APP2EXT_ERROR_INVALID_ARGUMENTS;
363 param = g_variant_new("(si)", pkgid, uid);
364 ret = __app2sd_call_server_method("PreAppUninstall", param);
368 int app2sd_client_pre_app_uninstall(const char *pkgid)
372 ret = app2sd_client_usr_pre_app_uninstall(pkgid,
378 int app2sd_client_usr_post_app_uninstall(const char *pkgid, uid_t uid)
381 GVariant *param = NULL;
383 /* validate the function parameter recieved */
385 _E("invalid func parameters");
386 return APP2EXT_ERROR_INVALID_ARGUMENTS;
389 param = g_variant_new("(si)", pkgid, uid);
390 ret = __app2sd_call_server_method("PostAppUninstall", param);
394 int app2sd_client_post_app_uninstall(const char *pkgid)
398 ret = app2sd_client_usr_post_app_uninstall(pkgid,
404 int app2sd_client_usr_force_clean(const char *pkgid, uid_t uid)
407 GVariant *param = NULL;
409 /* validate the function parameter recieved */
411 _E("invalid func parameters");
412 return APP2EXT_ERROR_INVALID_ARGUMENTS;
415 param = g_variant_new("(si)", pkgid, uid);
416 ret = __app2sd_call_server_method("ForceClean", param);
420 int app2sd_client_force_clean(const char *pkgid)
424 ret = app2sd_client_usr_force_clean(pkgid, getuid());
429 int app2sd_client_enable_full_pkg(void)
433 ret = __app2sd_call_server_method("EnableFullPkg", NULL);
438 int app2sd_client_disable_full_pkg(void)
442 ret = __app2sd_call_server_method("DisableFullPkg", NULL);
447 int app2sd_client_usr_on_demand_setup_init(const char *pkgid, uid_t uid)
450 GVariant *param = NULL;
452 /* validate the function parameter recieved */
454 _E("invalid func parameters");
455 return APP2EXT_ERROR_INVALID_ARGUMENTS;
458 param = g_variant_new("(si)", pkgid, uid);
459 ret = __app2sd_call_server_method("OndemandSetupInit", param);
463 int app2sd_client_on_demand_setup_init(const char *pkgid)
467 ret = app2sd_client_usr_on_demand_setup_init(pkgid,
473 int app2sd_client_usr_on_demand_setup_exit(const char *pkgid, uid_t uid)
476 GVariant *param = NULL;
478 /* validate the function parameter recieved */
480 _E("invalid func parameters");
481 return APP2EXT_ERROR_INVALID_ARGUMENTS;
484 param = g_variant_new("(si)", pkgid, uid);
485 ret = __app2sd_call_server_method("OndemandSetupExit", param);
489 int app2sd_client_on_demand_setup_exit(const char *pkgid)
493 ret = app2sd_client_usr_on_demand_setup_exit(pkgid,
499 int app2sd_client_usr_pre_move_installed_app(const char *pkgid, GList *dir_list,
500 app2ext_move_type move_type, uid_t uid)
503 GVariantBuilder *builder = NULL;
504 GVariant *param = NULL;
505 app2sd_cmd cmd = APP2SD_MOVE_APP_TO_PHONE;
507 /* validate the function parameter recieved */
508 if (pkgid == NULL || dir_list == NULL
509 || move_type < APP2EXT_MOVE_TO_EXT
510 || move_type > APP2EXT_MOVE_TO_PHONE) {
511 _E("invalid function arguments");
512 return APP2EXT_ERROR_INVALID_ARGUMENTS;
515 if (move_type == APP2EXT_MOVE_TO_EXT)
516 cmd = APP2SD_MOVE_APP_TO_MMC;
518 if (cmd == APP2SD_MOVE_APP_TO_MMC) {
519 ret = __app2sd_create_default_directories(pkgid, cmd, uid);
524 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
525 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
527 param = g_variant_new("(sia(si)i)", pkgid, move_type, builder, uid);
528 ret = __app2sd_call_server_method("PreMoveInstalledApp", param);
531 g_variant_builder_unref(builder);
535 int app2sd_client_pre_move_installed_app(const char *pkgid, GList *dir_list,
536 app2ext_move_type move_type)
540 ret = app2sd_client_usr_pre_move_installed_app(pkgid,
541 dir_list, move_type, getuid());
546 int app2sd_client_usr_post_move_installed_app(const char *pkgid,
547 app2ext_move_type move_type, uid_t uid)
550 GVariant *param = NULL;
552 /* validate the function parameter recieved */
553 if (pkgid == NULL || move_type < APP2EXT_MOVE_TO_EXT
554 || move_type > APP2EXT_MOVE_TO_PHONE) {
555 _E("invalid function arguments");
556 return APP2EXT_ERROR_INVALID_ARGUMENTS;
559 param = g_variant_new("(sii)", pkgid, move_type, uid);
560 ret = __app2sd_call_server_method("PostMoveInstalledApp", param);
564 int app2sd_client_post_move_installed_app(const char *pkgid,
565 app2ext_move_type move_type)
569 ret = app2sd_client_usr_post_move_installed_app(pkgid,
570 move_type, getuid());
575 void app2ext_on_load(app2ext_interface *interface)
577 /* Plug-in Binding.*/
578 interface->client_pre_install = app2sd_client_pre_app_install;
579 interface->client_post_install = app2sd_client_post_app_install;
580 interface->client_pre_upgrade = app2sd_client_pre_app_upgrade;
581 interface->client_post_upgrade = app2sd_client_post_app_upgrade;
582 interface->client_pre_uninstall = app2sd_client_pre_app_uninstall;
583 interface->client_post_uninstall = app2sd_client_post_app_uninstall;
584 interface->client_force_clean = app2sd_client_force_clean;
585 interface->client_enable = app2sd_client_on_demand_setup_init;
586 interface->client_disable = app2sd_client_on_demand_setup_exit;
587 interface->client_enable_full_pkg = app2sd_client_enable_full_pkg;
588 interface->client_disable_full_pkg = app2sd_client_disable_full_pkg;
589 interface->client_pre_move = app2sd_client_pre_move_installed_app;
590 interface->client_post_move = app2sd_client_post_move_installed_app;
592 interface->client_usr_pre_install = app2sd_client_usr_pre_app_install;
593 interface->client_usr_post_install = app2sd_client_usr_post_app_install;
594 interface->client_usr_pre_upgrade = app2sd_client_usr_pre_app_upgrade;
595 interface->client_usr_post_upgrade = app2sd_client_usr_post_app_upgrade;
596 interface->client_usr_pre_uninstall = app2sd_client_usr_pre_app_uninstall;
597 interface->client_usr_post_uninstall = app2sd_client_usr_post_app_uninstall;
598 interface->client_usr_force_clean = app2sd_client_usr_force_clean;
599 interface->client_usr_enable = app2sd_client_usr_on_demand_setup_init;
600 interface->client_usr_disable = app2sd_client_usr_on_demand_setup_exit;
601 interface->client_usr_pre_move = app2sd_client_usr_pre_move_installed_app;
602 interface->client_usr_post_move = app2sd_client_usr_post_move_installed_app;