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 <pkgmgr-info.h>
32 #include "app2sd_client_interface.h"
33 #include "app2ext_utils.h"
35 static int app2sd_gdbus_shared_connection(GDBusConnection **connection)
39 #if (GLIB_MAJOR_VERSION <= 2 && GLIB_MINOR_VERSION < 36)
43 *connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
44 if (*connection == NULL) {
46 _E("app2sd error : failed to get "
47 "system dbus [%s]", error->message);
50 return APP2EXT_ERROR_DBUS_FAILED;
53 return APP2EXT_SUCCESS;
56 static int __app2sd_call_server_method(const gchar *method_name,
59 int ret = APP2EXT_SUCCESS;
61 GDBusConnection *conn = NULL;
62 GDBusProxy *proxy = NULL;
64 GVariant *value = NULL;
66 /* get gdbus connection */
67 ret = app2sd_gdbus_shared_connection(&conn);
69 _E("app2sd error : dbus connection error");
74 proxy = g_dbus_proxy_new_sync(conn,
75 G_DBUS_PROXY_FLAGS_NONE, NULL,
76 APP2SD_BUS_NAME, APP2SD_OBJECT_PATH, APP2SD_INTERFACE_NAME,
79 _E("failed to create new proxy, error(%s)", error->message);
81 ret = APP2EXT_ERROR_DBUS_FAILED;
85 value = g_dbus_proxy_call_sync(proxy, method_name, param,
86 G_DBUS_CALL_FLAGS_NONE, G_MAXINT, NULL, &error);
88 _E("proxy call sync error(%s)", error->message);
90 ret = APP2EXT_ERROR_DBUS_FAILED;
94 g_variant_get(value, "(i)", &result);
95 g_variant_unref(value);
97 _D("result(%d)", result);
103 g_object_unref(conn);
108 static void __app2sd_create_dir_list_builder(gpointer data, gpointer user_data)
110 app2ext_dir_details *item = (app2ext_dir_details *)data;
111 GVariantBuilder *builder = (GVariantBuilder *)user_data;
113 g_variant_builder_add(builder, "(si)", item->name, item->type);
116 static int __app2sd_delete_temp_directories(const char *pkgid,
117 app2sd_cmd cmd, uid_t uid)
120 char temp_path[FILENAME_MAX] = { 0, };
122 if (cmd != APP2SD_PRE_UPGRADE)
123 return APP2EXT_SUCCESS;
125 if (_is_global(uid)) {
126 snprintf(temp_path, FILENAME_MAX - 1, "%s/%s.new",
127 tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
129 tzplatform_set_user(uid);
130 snprintf(temp_path, FILENAME_MAX - 1, "%s/%s.new",
131 tzplatform_getenv(TZ_USER_APP), pkgid);
132 tzplatform_reset_user();
135 /* this will delete all files under temp_path */
136 ret = _app2sd_delete_directory(temp_path);
138 _E("unable to delete (%s)", temp_path);
139 return APP2EXT_ERROR_DELETE_DIRECTORY;
142 return APP2EXT_SUCCESS;
145 static int __app2sd_create_default_directories(const char *pkgid,
146 app2sd_cmd cmd, uid_t uid)
149 mode_t mode = DIR_PERMS;
150 char application_path[FILENAME_MAX] = { 0, };
151 char application_mmc_path[FILENAME_MAX] = { 0, };
152 char temp_path[FILENAME_MAX] = { 0, };
154 if (_is_global(uid)) {
155 snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
156 tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
158 tzplatform_set_user(uid);
159 snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
160 tzplatform_getenv(TZ_USER_APP), pkgid);
161 tzplatform_reset_user();
164 ret = mkdir(application_path, mode);
166 if (errno != EEXIST) {
167 _E("create directory failed," \
168 " error no is (%d)", errno);
169 return APP2EXT_ERROR_CREATE_DIRECTORY;
173 snprintf(application_mmc_path, FILENAME_MAX - 1, "%s/.mmc",
176 ret = mkdir(application_mmc_path, mode);
178 if (errno != EEXIST) {
179 _E("create directory failed," \
180 " error no is (%d)", errno);
181 return APP2EXT_ERROR_CREATE_DIRECTORY;
185 if (cmd == APP2SD_PRE_UPGRADE) {
186 /* application_path for {pkgid}.new */
187 snprintf(temp_path, FILENAME_MAX - 1, "%s.new",
189 ret = mkdir(temp_path, mode);
191 if (errno != EEXIST) {
192 _E("create directory failed," \
193 " error no is (%d)", errno);
194 return APP2EXT_ERROR_CREATE_DIRECTORY;
197 /* application_mmc_path for {pkgid}.new */
198 snprintf(application_mmc_path, FILENAME_MAX - 1, "%s/.mmc",
200 ret = mkdir(application_mmc_path, mode);
202 if (errno != EEXIST) {
203 _E("create directory failed," \
204 " error no is (%d)", errno);
205 return APP2EXT_ERROR_CREATE_DIRECTORY;
210 return APP2EXT_SUCCESS;
213 int app2sd_client_usr_pre_app_install(const char *pkgid, GList *dir_list,
217 GVariantBuilder *builder = NULL;
218 GVariant *param = NULL;
220 /* validate the function parameter recieved */
221 if (pkgid == NULL || dir_list == NULL || size <= 0) {
222 _E("invalid function arguments");
223 return APP2EXT_ERROR_INVALID_ARGUMENTS;
226 ret = __app2sd_create_default_directories(pkgid,
227 APP2SD_PRE_INSTALL, uid);
231 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
232 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
234 param = g_variant_new("(sia(si)i)", pkgid, size, builder, uid);
235 ret = __app2sd_call_server_method("PreAppInstall", param);
238 g_variant_builder_unref(builder);
242 int app2sd_client_pre_app_install(const char *pkgid, GList *dir_list,
247 ret = app2sd_client_usr_pre_app_install(pkgid,
248 dir_list, size, getuid());
253 int app2sd_client_usr_post_app_install(const char *pkgid,
254 app2ext_status install_status, uid_t uid)
257 GVariant *param = NULL;
259 /* validate the function parameter recieved */
260 if (pkgid == NULL || install_status < APP2EXT_STATUS_FAILED
261 || install_status > APP2EXT_STATUS_SUCCESS) {
262 _E("invalid func parameters");
263 return APP2EXT_ERROR_INVALID_ARGUMENTS;
266 param = g_variant_new("(sii)", pkgid, install_status, uid);
267 ret = __app2sd_call_server_method("PostAppInstall", param);
271 int app2sd_client_post_app_install(const char *pkgid,
272 app2ext_status install_status)
276 ret = app2sd_client_usr_post_app_install(pkgid,
277 install_status, getuid());
282 int app2sd_client_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
286 GVariantBuilder *builder = NULL;
287 GVariant *param = NULL;
289 /* validate the function parameter recieved */
290 if (pkgid == NULL || dir_list == NULL || size <= 0) {
291 _E("invalid function arguments");
292 return APP2EXT_ERROR_INVALID_ARGUMENTS;
295 ret = __app2sd_create_default_directories(pkgid,
296 APP2SD_PRE_UPGRADE, uid);
300 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
301 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
303 param = g_variant_new("(sia(si)i)", pkgid, size, builder, uid);
304 ret = __app2sd_call_server_method("PreAppUpgrade", param);
307 g_variant_builder_unref(builder);
309 ret = __app2sd_delete_temp_directories(pkgid,
310 APP2SD_PRE_UPGRADE, uid);
314 int app2sd_client_pre_app_upgrade(const char *pkgid, GList *dir_list,
319 ret = app2sd_client_usr_pre_app_upgrade(pkgid,
320 dir_list, size, getuid());
325 int app2sd_client_usr_post_app_upgrade(const char *pkgid,
326 app2ext_status install_status, uid_t uid)
329 GVariant *param = NULL;
331 /* validate the function parameter recieved */
332 if (pkgid == NULL || install_status < APP2EXT_STATUS_FAILED
333 || install_status > APP2EXT_STATUS_SUCCESS) {
334 _E("invalid func parameters");
335 return APP2EXT_ERROR_INVALID_ARGUMENTS;
338 param = g_variant_new("(sii)", pkgid, install_status, uid);
339 ret = __app2sd_call_server_method("PostAppUpgrade", param);
343 int app2sd_client_post_app_upgrade(const char *pkgid,
344 app2ext_status install_status)
348 ret = app2sd_client_usr_post_app_upgrade(pkgid,
349 install_status, getuid());
354 int app2sd_client_usr_pre_app_uninstall(const char *pkgid, uid_t uid)
357 GVariant *param = NULL;
359 /* validate the function parameter recieved */
361 _E("invalid func parameters");
362 return APP2EXT_ERROR_INVALID_ARGUMENTS;
365 param = g_variant_new("(si)", pkgid, uid);
366 ret = __app2sd_call_server_method("PreAppUninstall", param);
370 int app2sd_client_pre_app_uninstall(const char *pkgid)
374 ret = app2sd_client_usr_pre_app_uninstall(pkgid,
380 int app2sd_client_usr_post_app_uninstall(const char *pkgid, uid_t uid)
383 GVariant *param = NULL;
385 /* validate the function parameter recieved */
387 _E("invalid func parameters");
388 return APP2EXT_ERROR_INVALID_ARGUMENTS;
391 param = g_variant_new("(si)", pkgid, uid);
392 ret = __app2sd_call_server_method("PostAppUninstall", param);
396 int app2sd_client_post_app_uninstall(const char *pkgid)
400 ret = app2sd_client_usr_post_app_uninstall(pkgid,
406 int app2sd_client_usr_force_clean(const char *pkgid, uid_t uid)
409 GVariant *param = NULL;
411 /* validate the function parameter recieved */
413 _E("invalid func parameters");
414 return APP2EXT_ERROR_INVALID_ARGUMENTS;
417 param = g_variant_new("(si)", pkgid, uid);
418 ret = __app2sd_call_server_method("ForceClean", param);
422 int app2sd_client_force_clean(const char *pkgid)
426 ret = app2sd_client_usr_force_clean(pkgid, getuid());
431 int app2sd_client_enable_full_pkg(void)
435 ret = __app2sd_call_server_method("EnableFullPkg", NULL);
440 int app2sd_client_disable_full_pkg(void)
444 ret = __app2sd_call_server_method("DisableFullPkg", NULL);
449 int app2sd_client_usr_on_demand_setup_init(const char *pkgid, uid_t uid)
452 GVariant *param = NULL;
454 /* validate the function parameter recieved */
456 _E("invalid func parameters");
457 return APP2EXT_ERROR_INVALID_ARGUMENTS;
460 param = g_variant_new("(si)", pkgid, uid);
461 ret = __app2sd_call_server_method("OndemandSetupInit", param);
465 int app2sd_client_on_demand_setup_init(const char *pkgid)
469 ret = app2sd_client_usr_on_demand_setup_init(pkgid,
475 int app2sd_client_usr_on_demand_setup_exit(const char *pkgid, uid_t uid)
478 GVariant *param = NULL;
480 /* validate the function parameter recieved */
482 _E("invalid func parameters");
483 return APP2EXT_ERROR_INVALID_ARGUMENTS;
486 param = g_variant_new("(si)", pkgid, uid);
487 ret = __app2sd_call_server_method("OndemandSetupExit", param);
491 int app2sd_client_on_demand_setup_exit(const char *pkgid)
495 ret = app2sd_client_usr_on_demand_setup_exit(pkgid,
501 int app2sd_client_usr_pre_move_installed_app(const char *pkgid, GList *dir_list,
502 app2ext_move_type move_type, uid_t uid)
505 GVariantBuilder *builder = NULL;
506 GVariant *param = NULL;
507 app2sd_cmd cmd = APP2SD_MOVE_APP_TO_PHONE;
508 pkgmgrinfo_pkginfo_h info_handle = NULL;
509 pkgmgrinfo_installed_storage storage = PMINFO_INTERNAL_STORAGE;
511 /* validate the function parameter recieved */
512 if (pkgid == NULL || dir_list == NULL
513 || move_type < APP2EXT_MOVE_TO_EXT
514 || move_type > APP2EXT_MOVE_TO_PHONE) {
515 _E("invalid function arguments");
516 return APP2EXT_ERROR_INVALID_ARGUMENTS;
519 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &info_handle);
521 _E("failed to get pkginfo for pkg(%s), uid(%d), ret(%d)",
523 return APP2EXT_ERROR_PKGMGR_ERROR;
525 ret = pkgmgrinfo_pkginfo_get_installed_storage(info_handle, &storage);
527 _E("failed to get installed storage for pkg(%s) of uid(%d), ret(%d)",
529 pkgmgrinfo_pkginfo_destroy_pkginfo(info_handle);
530 return APP2EXT_ERROR_PKGMGR_ERROR;
533 if ((move_type == APP2EXT_MOVE_TO_EXT && storage == PMINFO_EXTERNAL_STORAGE)
534 || (move_type == APP2EXT_MOVE_TO_PHONE && storage == PMINFO_INTERNAL_STORAGE)) {
535 _E("PKG_EXISTS in [%d] STORAGE", storage);
536 pkgmgrinfo_pkginfo_destroy_pkginfo(info_handle);
537 return APP2EXT_ERROR_PKG_EXISTS;
539 _D("pkgid[%s] move to STORAGE [%d]", pkgid, storage);
541 pkgmgrinfo_pkginfo_destroy_pkginfo(info_handle);
543 if (move_type == APP2EXT_MOVE_TO_EXT)
544 cmd = APP2SD_MOVE_APP_TO_MMC;
546 if (cmd == APP2SD_MOVE_APP_TO_MMC) {
547 ret = __app2sd_create_default_directories(pkgid, cmd, uid);
552 builder = g_variant_builder_new(G_VARIANT_TYPE("a(si)"));
553 g_list_foreach(dir_list, __app2sd_create_dir_list_builder, builder);
555 param = g_variant_new("(sia(si)i)", pkgid, move_type, builder, uid);
556 ret = __app2sd_call_server_method("PreMoveInstalledApp", param);
559 g_variant_builder_unref(builder);
563 int app2sd_client_pre_move_installed_app(const char *pkgid, GList *dir_list,
564 app2ext_move_type move_type)
568 ret = app2sd_client_usr_pre_move_installed_app(pkgid,
569 dir_list, move_type, getuid());
574 int app2sd_client_usr_post_move_installed_app(const char *pkgid,
575 app2ext_move_type move_type, uid_t uid)
578 GVariant *param = NULL;
580 /* validate the function parameter recieved */
581 if (pkgid == NULL || move_type < APP2EXT_MOVE_TO_EXT
582 || move_type > APP2EXT_MOVE_TO_PHONE) {
583 _E("invalid function arguments");
584 return APP2EXT_ERROR_INVALID_ARGUMENTS;
587 param = g_variant_new("(sii)", pkgid, move_type, uid);
588 ret = __app2sd_call_server_method("PostMoveInstalledApp", param);
592 int app2sd_client_post_move_installed_app(const char *pkgid,
593 app2ext_move_type move_type)
597 ret = app2sd_client_usr_post_move_installed_app(pkgid,
598 move_type, getuid());
603 void app2ext_on_load(app2ext_interface *interface)
605 /* Plug-in Binding.*/
606 interface->client_pre_install = app2sd_client_pre_app_install;
607 interface->client_post_install = app2sd_client_post_app_install;
608 interface->client_pre_upgrade = app2sd_client_pre_app_upgrade;
609 interface->client_post_upgrade = app2sd_client_post_app_upgrade;
610 interface->client_pre_uninstall = app2sd_client_pre_app_uninstall;
611 interface->client_post_uninstall = app2sd_client_post_app_uninstall;
612 interface->client_force_clean = app2sd_client_force_clean;
613 interface->client_enable = app2sd_client_on_demand_setup_init;
614 interface->client_disable = app2sd_client_on_demand_setup_exit;
615 interface->client_enable_full_pkg = app2sd_client_enable_full_pkg;
616 interface->client_disable_full_pkg = app2sd_client_disable_full_pkg;
617 interface->client_pre_move = app2sd_client_pre_move_installed_app;
618 interface->client_post_move = app2sd_client_post_move_installed_app;
620 interface->client_usr_pre_install = app2sd_client_usr_pre_app_install;
621 interface->client_usr_post_install = app2sd_client_usr_post_app_install;
622 interface->client_usr_pre_upgrade = app2sd_client_usr_pre_app_upgrade;
623 interface->client_usr_post_upgrade = app2sd_client_usr_post_app_upgrade;
624 interface->client_usr_pre_uninstall = app2sd_client_usr_pre_app_uninstall;
625 interface->client_usr_post_uninstall = app2sd_client_usr_post_app_uninstall;
626 interface->client_usr_force_clean = app2sd_client_usr_force_clean;
627 interface->client_usr_enable = app2sd_client_usr_on_demand_setup_init;
628 interface->client_usr_disable = app2sd_client_usr_on_demand_setup_exit;
629 interface->client_usr_pre_move = app2sd_client_usr_pre_move_installed_app;
630 interface->client_usr_post_move = app2sd_client_usr_post_move_installed_app;