Support legacy image for backward-compatibility 46/108346/10 accepted/tizen/3.0/common/20170109.195932 accepted/tizen/3.0/ivi/20170109.073434 accepted/tizen/3.0/tv/20170110.055309 accepted/tizen/3.0/wearable/20170109.073236 accepted/tizen/common/20170112.174519 accepted/tizen/ivi/20170112.222544 accepted/tizen/mobile/20170112.222435 accepted/tizen/tv/20170112.222501 accepted/tizen/wearable/20170112.222523 submit/tizen/20170112.013301 submit/tizen_3.0/20170106.072144 submit/tizen_3.0/20170106.102334
authorjongmyeongko <jongmyeong.ko@samsung.com>
Wed, 4 Jan 2017 06:25:14 +0000 (15:25 +0900)
committerjongmyeong ko <jongmyeong.ko@samsung.com>
Thu, 5 Jan 2017 11:51:32 +0000 (03:51 -0800)
Refer to:
https://review.tizen.org/gerrit/#/c/104823/

Change-Id: I79f4ae9e75e728f20e3d079b3d63f1ba1a8f3c6a
Signed-off-by: jongmyeongko <jongmyeong.ko@samsung.com>
include/pkgmgr-server.h
org.tizen.pkgmgr.conf
src/pkgmgr-server.c
src/request.c

index 0180fcb..7b2fe5a 100644 (file)
@@ -81,6 +81,7 @@ enum request_type {
        REQUEST_TYPE_UNSET_RESTRICTION_MODE,
        REQUEST_TYPE_GET_RESTRICTION_MODE,
        REQUEST_TYPE_SET_APP_LABEL,
+       REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE,
 };
 
 gboolean queue_job(void *data);
index 7ad7a4b..306f578 100644 (file)
@@ -43,5 +43,6 @@
                <check send_destination="org.tizen.pkgmgr" send_interface="org.tizen.pkgmgr" send_member="disable_app" privilege="http://tizen.org/privilege/packagemanager.admin"/>
                <check send_destination="org.tizen.pkgmgr" send_interface="org.tizen.pkgmgr" send_member="enable_global_app_for_uid" privilege="http://tizen.org/privilege/packagemanager.admin"/>
                <check send_destination="org.tizen.pkgmgr" send_interface="org.tizen.pkgmgr" send_member="disable_global_app_for_uid" privilege="http://tizen.org/privilege/packagemanager.admin"/>
+               <check send_destination="org.tizen.pkgmgr" send_interface="org.tizen.pkgmgr" send_member="migrate_external_image" privilege="http://tizen.org/privilege/packagemanager.admin"/>
        </policy>
 </busconfig>
index e4653a2..b0cf052 100644 (file)
@@ -1449,6 +1449,29 @@ static int __process_set_app_label(struct backend_job *job)
        return ret;
 }
 
+static int __process_migrate_external_image(struct backend_job *job)
+{
+       char *backend_cmd;
+       char **argv;
+       char args[MAX_PKG_ARGS_LEN];
+       int pid;
+
+       backend_cmd = job->backend_path;
+       if (backend_cmd == NULL)
+               return -1;
+
+       snprintf(args, sizeof(args), "%s -k %s --migrate-extimg %s -u %d %s",
+                       backend_cmd, job->req_id, job->pkgid,
+                       (int)job->target_uid, job->args);
+
+       argv = __generate_argv(args);
+
+       pid = __fork_and_exec_with_args(argv, APPFW_UID);
+       g_strfreev(argv);
+
+       return pid;
+}
+
 static int __post_process(int ret, int x, struct backend_job *job)
 {
        if (ret < 0) {
@@ -1622,6 +1645,11 @@ gboolean queue_job(void *data)
                ret = __process_set_app_label(job);
                _free_backend_job(job);
                break;
+       case REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE:
+               __set_backend_busy(x);
+               ret = __process_migrate_external_image(job);
+               __post_process(ret, x, job);
+               break;
        default:
                ret = -1;
                break;
index 073be8e..8e3793e 100644 (file)
@@ -175,6 +175,11 @@ static const char instropection_xml[] =
        "      <arg type='s' name='label' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "    </method>"
+       "    <method name='migrate_external_image'>"
+       "      <arg type='u' name='uid' direction='in'/>"
+       "      <arg type='s' name='pkgid' direction='in'/>"
+       "      <arg type='i' name='ret' direction='out'/>"
+       "    </method>"
        "  </interface>"
        "</node>";
 static GDBusNodeInfo *instropection_data;
@@ -1432,6 +1437,55 @@ static int __handle_request_set_app_label(uid_t uid,
        return 0;
 }
 
+static int __handle_request_migrate_external_image(uid_t uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       uid_t target_uid = (uid_t)-1;
+       char *pkgid = NULL;
+       char *pkgtype;
+       char *reqkey;
+
+       g_variant_get(parameters, "(us)", &target_uid, &pkgid);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ECOMM));
+               return -1;
+       }
+
+       pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+       if (pkgtype == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ENOPKG));
+               return -1;
+       }
+
+       reqkey = __generate_reqkey(pkgid);
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ENOMEM));
+               free(pkgtype);
+               return -1;
+       }
+
+       if (_push_queue(target_uid, uid, reqkey,
+                               REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE,
+                               pkgtype, pkgid, NULL)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+               free(reqkey);
+               free(pkgtype);
+               return -1;
+       }
+
+       g_dbus_method_invocation_return_value(invocation,
+                       g_variant_new("(i)", PKGMGR_R_OK));
+
+       free(reqkey);
+       free(pkgtype);
+
+       return 0;
+}
+
 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
 {
        GError *err = NULL;
@@ -1535,6 +1589,9 @@ static void __handle_method_call(GDBusConnection *connection,
                                parameters);
        else if (g_strcmp0(method_name, "set_app_label") == 0)
                ret = __handle_request_set_app_label(uid, invocation, parameters);
+       else if (g_strcmp0(method_name, "migrate_external_image") == 0)
+               ret = __handle_request_migrate_external_image(uid, invocation,
+                               parameters);
        else
                ret = -1;