refactor getsize sync function
[platform/core/appfw/pkgmgr-server.git] / src / request.c
index ba79911..fce8210 100644 (file)
@@ -1,14 +1,20 @@
+#include <stdlib.h>
 #include <sys/types.h>
 #include <sys/time.h>
 
 #include <glib.h>
 #include <gio/gio.h>
+#include <gum/gum-user.h>
+#include <gum/common/gum-user-types.h>
 
-#include "comm_config.h"
-#include "pm-queue.h"
+#include "queue.h"
 #include "pkgmgr-server.h"
 #include "package-manager.h"
-#include "package-manager-debug.h"
+
+#define RETRY_MAX 5
+#define RETRY_WAIT_USEC (1000000 / 2) /* 0.5 sec */
+#define PKGMGR_DBUS_SERVICE "org.tizen.pkgmgr"
+#define PKGMGR_DBUS_OBJECT_PATH "/org/tizen/pkgmgr"
 
 static const char instropection_xml[] =
        "<node>"
@@ -23,54 +29,66 @@ static const char instropection_xml[] =
        "    </method>"
        "    <method name='reinstall'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
-       "    <method name='uninstall'>"
+       "    <method name='mount_install'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='pkgtype' direction='in'/>"
+       "      <arg type='s' name='pkgpath' direction='in'/>"
+       "      <arg type='as' name='args' direction='in'/>"
+       "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='s' name='reqkey' direction='out'/>"
+       "    </method>"
+       "    <method name='uninstall'>"
+       "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
        "    <method name='move'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
+       "      <arg type='i' name='movetype' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
-       "    <method name='enable_pkg'>"
+       "    <method name='enable_pkgs'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgid' direction='in'/>"
+       "      <arg type='as' name='pkgids' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
-       "    <method name='disable_pkg'>"
+       "    <method name='disable_pkgs'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgid' direction='in'/>"
+       "      <arg type='as' name='pkgids' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
        "    <method name='enable_app'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='appid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
        "    <method name='disable_app'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='appid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
-       "    <method name='enable_global_app'>"
+       "    <method name='enable_global_app_for_uid'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='appid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
-       "    <method name='disable_global_app'>"
+       "    <method name='disable_global_app_for_uid'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='appid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
        "    <method name='getsize'>"
        "      <arg type='u' name='uid' direction='in'/>"
@@ -79,9 +97,15 @@ static const char instropection_xml[] =
        "      <arg type='i' name='ret' direction='out'/>"
        "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
+       "    <method name='getsize_sync'>"
+       "      <arg type='u' name='uid' direction='in'/>"
+       "      <arg type='s' name='pkgid' direction='in'/>"
+       "      <arg type='i' name='get_type' direction='in'/>"
+       "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='x' name='size_info' direction='out'/>"
+       "    </method>"
        "    <method name='cleardata'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "    </method>"
@@ -94,11 +118,13 @@ static const char instropection_xml[] =
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='i' name='pid' direction='out'/>"
        "    </method>"
        "    <method name='check'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
+       "      <arg type='i' name='pid' direction='out'/>"
        "    </method>"
        "    <method name='generate_license_request'>"
        "      <arg type='s' name='resp_data' direction='in'/>"
@@ -115,22 +141,40 @@ static const char instropection_xml[] =
        "      <arg type='s' name='decrypted_file_path' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "    </method>"
-       "    <method name='add_blacklist'>"
+       "    <method name='enable_app_splash_screen'>"
+       "      <arg type='u' name='uid' direction='in'/>"
+       "      <arg type='s' name='appid' direction='in'/>"
+       "      <arg type='i' name='ret' direction='out'/>"
+       "    </method>"
+       "    <method name='disable_app_splash_screen'>"
+       "      <arg type='u' name='uid' direction='in'/>"
+       "      <arg type='s' name='appid' direction='in'/>"
+       "      <arg type='i' name='ret' direction='out'/>"
+       "    </method>"
+       "    <method name='set_restriction_mode'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
+       "      <arg type='i' name='mode' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "    </method>"
-       "    <method name='remove_blacklist'>"
+       "    <method name='unset_restriction_mode'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
+       "      <arg type='i' name='mode' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "    </method>"
-       "    <method name='check_blacklist'>"
+       "    <method name='get_restriction_mode'>"
        "      <arg type='u' name='uid' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='result' direction='out'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "    </method>"
+       "    <method name='set_app_label'>"
+       "      <arg type='u' name='uid' direction='in'/>"
+       "      <arg type='s' name='appid' direction='in'/>"
+       "      <arg type='s' name='label' direction='in'/>"
+       "      <arg type='i' name='ret' direction='out'/>"
+       "    </method>"
        "  </interface>"
        "</node>";
 static GDBusNodeInfo *instropection_data;
@@ -161,11 +205,89 @@ static char *__generate_reqkey(const char *pkgid)
        return str_req_key;
 }
 
-static int __handle_request_install(uid_t uid,
+static int __is_admin_user(uid_t uid)
+{
+       GumUser *guser;
+       GumUserType ut = GUM_USERTYPE_NONE;
+       int retry_cnt = 0;
+
+       do {
+               guser = gum_user_get_sync(uid, FALSE);
+               if (guser == NULL) {
+                       ERR("cannot get user information from gumd, retry");
+                       retry_cnt++;
+                       usleep(RETRY_WAIT_USEC);
+                       continue;
+               }
+               break;
+       } while (retry_cnt <= RETRY_MAX);
+
+       if (guser == NULL) {
+               ERR("cannot get user information from gumd, failed");
+               return -1;
+       }
+
+       g_object_get(G_OBJECT(guser), "usertype", &ut, NULL);
+       if (ut == GUM_USERTYPE_NONE) {
+               ERR("cannot get user type");
+               g_object_unref(guser);
+               return -1;
+       } else if (ut != GUM_USERTYPE_ADMIN) {
+               g_object_unref(guser);
+               return 0;
+       }
+
+       g_object_unref(guser);
+
+       return 1;
+}
+
+static int __check_caller_permission(uid_t uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       GVariant *v;
+       uid_t target_uid;
+       int is_admin;
+
+       if (uid < REGULAR_USER)
+               return 0;
+
+       v = g_variant_get_child_value(parameters, 0);
+       if (v == NULL) {
+               g_dbus_method_invocation_return_error_literal(invocation,
+                               G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+                               "Internal error.");
+               return -1;
+       }
+
+       target_uid = g_variant_get_uint32(v);
+       g_variant_unref(v);
+       if (uid == target_uid)
+               return 0;
+
+       is_admin = __is_admin_user(uid);
+       if (is_admin == -1) {
+               g_dbus_method_invocation_return_error_literal(invocation,
+                               G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+                               "Internal error.");
+               return -1;
+       } else if (is_admin == 0) {
+               g_dbus_method_invocation_return_error_literal(invocation,
+                               G_DBUS_ERROR, G_DBUS_ERROR_ACCESS_DENIED,
+                               "Non-admin user cannot request operation to "
+                               "other users.");
+               return -1;
+       }
+
+       return 0;
+}
+
+static int __handle_request_install(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *arg_pkgtype = NULL;
+       const char *pkgtype;
        char *pkgpath = NULL;
        char *args = NULL;
        char *reqkey = NULL;
@@ -173,11 +295,11 @@ static int __handle_request_install(uid_t uid,
        gsize args_count;
        int ret = -1;
        GVariant *value;
-       gchar *str;
        int i = 0;
        int len = 0;
 
-       g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
+       g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
+                       &pkgpath, &value);
        tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
 
        for (i = 0; i < args_count; i++)
@@ -186,23 +308,29 @@ static int __handle_request_install(uid_t uid,
        args = (char *)calloc(len, sizeof(char));
        if (args == NULL) {
                ERR("calloc failed");
-               ret =  -1;
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               ret = -1;
                goto catch;
        }
 
        for (i = 0; i < args_count; i++) {
                strncat(args, tmp_args[i], strlen(tmp_args[i]));
-               strncat(args, " ", strlen(" "));
+               if (i != args_count - 1)
+                       strncat(args, " ", strlen(" "));
        }
 
-       if (target_uid == (uid_t)-1 || pkgtype == NULL) {
+       if (target_uid == (uid_t)-1 || pkgpath == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                ret = -1;
                goto catch;
        }
 
-       if (pkgpath == NULL) {
+       pkgtype = _get_pkgtype_from_file(pkgpath, caller_uid);
+       if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
+               pkgtype = (const char *)arg_pkgtype;
+       if (pkgtype == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                ret = -1;
@@ -211,12 +339,14 @@ static int __handle_request_install(uid_t uid,
 
        reqkey = __generate_reqkey(pkgpath);
        if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
                ret = -1;
                goto catch;
        }
 
-       if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype,
-                               pkgpath, args)) {
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_INSTALL,
+                               pkgtype, pkgpath, args)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                ret = -1;
@@ -235,213 +365,524 @@ catch:
        if (args)
                free(args);
 
+       if (tmp_args)
+               g_free(tmp_args);
+
        return ret;
 }
 
-static int __handle_request_reinstall(uid_t uid,
+static int __handle_request_mount_install(uid_t caller_uid,
+       GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       uid_t target_uid = (uid_t)-1;
+       char *arg_pkgtype = NULL;
+       const char *pkgtype;
+       char *pkgpath = NULL;
+       char *args = NULL;
+       char *reqkey = NULL;
+       gchar **tmp_args = NULL;
+       gsize args_count;
+       int ret = -1;
+       GVariant *value;
+       int i = 0;
+       int len = 0;
+
+       g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
+                       &pkgpath, &value);
+       tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
+
+       for (i = 0; i < args_count; i++)
+               len = len + strlen(tmp_args[i]) + 1;
+
+       args = (char *)calloc(len, sizeof(char));
+       if (args == NULL) {
+               ERR("calloc failed");
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       for (i = 0; i < args_count; i++) {
+               strncat(args, tmp_args[i], strlen(tmp_args[i]));
+               if (i != args_count - 1)
+                       strncat(args, " ", strlen(" "));
+       }
+
+       if (target_uid == (uid_t)-1 || pkgpath == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       pkgtype = _get_pkgtype_from_file(pkgpath, caller_uid);
+       if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
+               pkgtype = (const char *)arg_pkgtype;
+       if (pkgtype == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       reqkey = __generate_reqkey(pkgpath);
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_MOUNT_INSTALL,
+                               pkgtype, pkgpath, args)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       g_dbus_method_invocation_return_value(invocation,
+                       g_variant_new("(is)", PKGMGR_R_OK, reqkey));
+       ret = 0;
+
+catch:
+       if (reqkey)
+               free(reqkey);
+
+       if (args)
+               free(args);
+
+       if (tmp_args)
+               g_free(tmp_args);
+
+       return ret;
+}
+
+static int __handle_request_reinstall(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid = NULL;
        char *reqkey;
 
-       g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", 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("(is)", PKGMGR_R_ENOPKG, ""));
+               return -1;
+       }
+
        reqkey = __generate_reqkey(pkgid);
-       if (reqkey == NULL)
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               free(pkgtype);
                return -1;
-       if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype,
-                               pkgid, "")) {
+       }
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_REINSTALL,
+                               pkgtype, pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                free(reqkey);
+               free(pkgtype);
                return -1;
        }
 
        g_dbus_method_invocation_return_value(invocation,
                        g_variant_new("(is)", PKGMGR_R_OK, reqkey));
        free(reqkey);
+       free(pkgtype);
 
        return 0;
 }
 
-static int __handle_request_uninstall(uid_t uid,
+static int __handle_request_uninstall(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid = NULL;
        char *reqkey;
 
-       g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", 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("(is)", PKGMGR_R_ENOPKG, ""));
+               return -1;
+       }
+
        reqkey = __generate_reqkey(pkgid);
-       if (reqkey == NULL)
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               free(pkgtype);
                return -1;
-       if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype,
-                               pkgid, "")) {
+       }
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_UNINSTALL,
+                               pkgtype, pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                free(reqkey);
+               free(pkgtype);
                return -1;
        }
 
        g_dbus_method_invocation_return_value(invocation,
                        g_variant_new("(is)", PKGMGR_R_OK, reqkey));
        free(reqkey);
+       free(pkgtype);
 
        return 0;
 }
 
-static int __handle_request_move(uid_t uid,
+static int __handle_request_move(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid = NULL;
        char *reqkey;
+       int move_type = -1;
+       char buf[4] = { '\0' };
 
-       g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+       g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &move_type);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", 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("(is)", PKGMGR_R_ENOPKG, ""));
+               return -1;
+       }
+
        reqkey = __generate_reqkey(pkgid);
-       if (reqkey == NULL)
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               free(pkgtype);
                return -1;
-       if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype,
-                               pkgid, "")) {
+       }
+
+       snprintf(buf, sizeof(buf), "%d", move_type);
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_MOVE,
+                               pkgtype, pkgid, buf)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                free(reqkey);
+               free(pkgtype);
                return -1;
        }
 
        g_dbus_method_invocation_return_value(invocation,
                        g_variant_new("(is)", PKGMGR_R_OK, reqkey));
        free(reqkey);
+       free(pkgtype);
 
        return 0;
 }
 
-static int __handle_request_enable(uid_t uid,
+static int __handle_request_enable_pkgs(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgid = NULL;
+       char *pkgtype;
+       char *pkgid;
+       char *reqkey;
+       GVariantIter *iter;
 
-       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgid == NULL) {
+       g_variant_get(parameters, "(uas)", &target_uid, &iter);
+       if (target_uid == (uid_t)-1 || iter == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ECOMM));
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_ENABLE, "none",
-                               pkgid, "")) {
+       reqkey = __generate_reqkey("enable_pkgs");
+       if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
                return -1;
        }
 
+       while (g_variant_iter_next(iter, "&s", &pkgid)) {
+               pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+               if (pkgtype == NULL) {
+                       g_dbus_method_invocation_return_value(invocation,
+                                       g_variant_new("(is)",
+                                               PKGMGR_R_ENOPKG, ""));
+                       free(reqkey);
+                       return -1;
+               }
+               if (_push_queue(target_uid, caller_uid, reqkey,
+                                       REQUEST_TYPE_ENABLE_PKG,
+                                       pkgtype, pkgid, NULL)) {
+                       g_dbus_method_invocation_return_value(invocation,
+                                       g_variant_new("(is)",
+                                               PKGMGR_R_ESYSTEM, ""));
+                       free(pkgtype);
+                       free(reqkey);
+                       return -1;
+               }
+               free(pkgtype);
+       }
+
        g_dbus_method_invocation_return_value(invocation,
-                       g_variant_new("(i)", PKGMGR_R_OK));
+                       g_variant_new("(is)", PKGMGR_R_OK, reqkey));
+       free(reqkey);
 
        return 0;
 }
 
-static int __handle_request_disable(uid_t uid,
+static int __handle_request_disable_pkgs(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgid = NULL;
+       char *pkgtype;
+       char *pkgid;
+       char *reqkey;
+       GVariantIter *iter;
 
-       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgid == NULL) {
+       g_variant_get(parameters, "(uas)", &target_uid, &iter);
+       if (target_uid == (uid_t)-1 || iter == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ECOMM));
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_DISABLE, "none",
-                               pkgid, "")) {
+       reqkey = __generate_reqkey("disable_pkgs");
+       if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
                return -1;
        }
 
+       while (g_variant_iter_next(iter, "&s", &pkgid)) {
+               pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+               if (pkgtype == NULL) {
+                       g_dbus_method_invocation_return_value(invocation,
+                                       g_variant_new("(is)",
+                                               PKGMGR_R_ENOPKG, ""));
+                       free(reqkey);
+                       return -1;
+               }
+               if (_push_queue(target_uid, caller_uid, reqkey,
+                                       REQUEST_TYPE_DISABLE_PKG,
+                                       pkgtype, pkgid, NULL)) {
+                       g_dbus_method_invocation_return_value(invocation,
+                                       g_variant_new("(is)",
+                                               PKGMGR_R_ESYSTEM, ""));
+                       free(pkgtype);
+                       free(reqkey);
+                       return -1;
+               }
+               free(pkgtype);
+       }
+
        g_dbus_method_invocation_return_value(invocation,
-                       g_variant_new("(i)", PKGMGR_R_OK));
+                       g_variant_new("(is)", PKGMGR_R_OK, reqkey));
+       free(reqkey);
 
        return 0;
 }
 
-static int __handle_request_enable_global_app(uid_t uid,
+static int __handle_request_enable_app(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
        char *appid = NULL;
+       char *reqkey = NULL;
+       int ret = -1;
 
        g_variant_get(parameters, "(u&s)", &target_uid, &appid);
        if (target_uid == (uid_t)-1 || appid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ECOMM));
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP, "none",
-                               appid, "")) {
+       reqkey = __generate_reqkey(appid);
+       if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_ENABLE_APP, "default",
+                               appid, NULL)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       g_dbus_method_invocation_return_value(invocation,
+                       g_variant_new("(is)", PKGMGR_R_OK, reqkey));
+
+       ret = 0;
+
+catch:
+       if (reqkey)
+               free(reqkey);
+
+       return ret;
+}
+
+static int __handle_request_disable_app(uid_t caller_uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       uid_t target_uid = (uid_t)-1;
+       char *appid = NULL;
+       char *reqkey = NULL;
+       int ret = -1;
+
+       g_variant_get(parameters, "(u&s)", &target_uid, &appid);
+       if (target_uid == (uid_t)-1 || appid == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
+       reqkey = __generate_reqkey(appid);
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_DISABLE_APP, "default",
+                               appid, NULL)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
        g_dbus_method_invocation_return_value(invocation,
-                       g_variant_new("(i)", PKGMGR_R_OK));
+                       g_variant_new("(is)", PKGMGR_R_OK, reqkey));
 
-       return 0;
+       ret = 0;
+
+catch:
+       if (reqkey)
+               free(reqkey);
+
+       return ret;
 }
 
-static int __handle_request_disable_global_app(uid_t uid,
+static int __handle_request_enable_global_app_for_uid(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
        char *appid = NULL;
+       char *reqkey = NULL;
+       int ret = -1;
 
        g_variant_get(parameters, "(u&s)", &target_uid, &appid);
        if (target_uid == (uid_t)-1 || appid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ECOMM));
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP, "none",
-                               appid, "")) {
+       reqkey = __generate_reqkey(appid);
+       if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID,
+                               "default", appid, NULL)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       g_dbus_method_invocation_return_value(invocation,
+                       g_variant_new("(is)", PKGMGR_R_OK, reqkey));
+
+       ret = 0;
+
+catch:
+       if (reqkey)
+               free(reqkey);
+
+       return ret;
+}
+
+static int __handle_request_disable_global_app_for_uid(uid_t caller_uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       uid_t target_uid = (uid_t)-1;
+       char *appid = NULL;
+       char *reqkey = NULL;
+       int ret = -1;
+
+       g_variant_get(parameters, "(u&s)", &target_uid, &appid);
+       if (target_uid == (uid_t)-1 || appid == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
+       reqkey = __generate_reqkey(appid);
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID,
+                               "default", appid, NULL)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               ret = -1;
+               goto catch;
+       }
+
        g_dbus_method_invocation_return_value(invocation,
-                       g_variant_new("(i)", PKGMGR_R_OK));
+                       g_variant_new("(is)", PKGMGR_R_OK, reqkey));
 
-       return 0;
+       ret = 0;
+
+catch:
+       if (reqkey)
+               free(reqkey);
+
+       return ret;
 }
 
-static int __handle_request_getsize(uid_t uid,
+static int __handle_request_getsize(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -458,12 +899,15 @@ static int __handle_request_getsize(uid_t uid,
        }
 
        reqkey = __generate_reqkey(pkgid);
-       if (reqkey == NULL)
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
                return -1;
+       }
 
        snprintf(buf, sizeof(buf), "%d", get_type);
-       if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "getsize",
-                               pkgid, buf)) {
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE,
+                               "pkgtool", pkgid, buf)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                free(reqkey);
@@ -477,38 +921,52 @@ static int __handle_request_getsize(uid_t uid,
        return 0;
 }
 
-static int __handle_request_cleardata(uid_t uid,
+static int __handle_request_getsize_sync(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
        char *pkgid = NULL;
+       int get_type = -1;
+       char *reqkey;
+       char buf[4];
 
-       g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+       g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
+       if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ECOMM));
+                               g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype,
-                               pkgid, "")) {
+       reqkey = __generate_reqkey(pkgid);
+       if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+                               g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
                return -1;
        }
 
-       g_dbus_method_invocation_return_value(invocation,
-                       g_variant_new("(i)", PKGMGR_R_OK));
+       snprintf(buf, sizeof(buf), "%d", get_type);
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE_SYNC,
+                               "pkgtool", pkgid, buf)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               free(reqkey);
+               return -1;
+       }
+
+       if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+                               (gpointer)invocation))
+               ERR("reqkey already exists");
 
        return 0;
 }
 
-static int __handle_request_clearcache(uid_t uid,
+static int __handle_request_cleardata(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
+       char *pkgtype;
        char *pkgid = NULL;
+       char *reqkey = NULL;
 
        g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
        if (target_uid == (uid_t)-1 || pkgid == NULL) {
@@ -517,20 +975,40 @@ static int __handle_request_clearcache(uid_t uid,
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE,
-                               "clearcache", pkgid, "")) {
+       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, caller_uid, reqkey, REQUEST_TYPE_CLEARDATA,
+                               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 int __handle_request_kill(uid_t uid,
+static int __handle_request_clearcache(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -543,8 +1021,8 @@ static int __handle_request_kill(uid_t uid,
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_KILL, "pkg",
-                               pkgid, "")) {
+       if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARCACHE,
+                               "pkgtool",  pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
                return -1;
@@ -556,33 +1034,79 @@ static int __handle_request_kill(uid_t uid,
        return 0;
 }
 
-static int __handle_request_check(uid_t uid,
+static int __handle_request_kill(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
        char *pkgid = NULL;
+       char *reqkey = NULL;
 
        g_variant_get(parameters, "(u&s)", &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));
+                               g_variant_new("(ii)", PKGMGR_R_ECOMM, 0));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CHECK, "pkg",
-                               pkgid, "")) {
+       reqkey = __generate_reqkey(pkgid);
+       if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
-                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+                               g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
                return -1;
        }
 
-       g_dbus_method_invocation_return_value(invocation,
-                       g_variant_new("(i)", PKGMGR_R_OK));
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_KILL,
+                               "default", pkgid, NULL)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
+               free(reqkey);
+               return -1;
+       }
+
+       if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+                               (gpointer)invocation))
+               ERR("reqkey already exists");
+
+       return 0;
+}
+
+static int __handle_request_check(uid_t caller_uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       uid_t target_uid = (uid_t)-1;
+       char *pkgid = NULL;
+       char *reqkey = NULL;
+
+       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(ii)", PKGMGR_R_ECOMM, 0));
+               return -1;
+       }
+
+       reqkey = __generate_reqkey(pkgid);
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
+               return -1;
+       }
+
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CHECK,
+                               "default", pkgid, NULL)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
+               free(reqkey);
+               return -1;
+       }
+
+       if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+                               (gpointer)invocation))
+               ERR("reqkey already exists");
 
        return 0;
 }
 
-static int __handle_request_generate_license_request(uid_t uid,
+static int __handle_request_generate_license_request(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        char *reqkey;
@@ -603,9 +1127,9 @@ static int __handle_request_generate_license_request(uid_t uid,
                return -1;
        }
 
-       if (_pm_queue_push(uid, reqkey,
-                               PKGMGR_REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
-                               "pkg", "", resp_data)) {
+       if (_push_queue(caller_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
+                               "default", NULL, resp_data)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
                                        ""));
@@ -620,7 +1144,7 @@ static int __handle_request_generate_license_request(uid_t uid,
        return 0;
 }
 
-static int __handle_request_register_license(uid_t uid,
+static int __handle_request_register_license(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        char *reqkey;
@@ -640,8 +1164,9 @@ static int __handle_request_register_license(uid_t uid,
                return -1;
        }
 
-       if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REGISTER_LICENSE,
-                               "pkg", "", resp_data)) {
+       if (_push_queue(caller_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_REGISTER_LICENSE,
+                               "default", NULL, resp_data)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
                free(reqkey);
@@ -655,7 +1180,7 @@ static int __handle_request_register_license(uid_t uid,
        return 0;
 }
 
-static int __handle_request_decrypt_package(uid_t uid,
+static int __handle_request_decrypt_package(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        char *reqkey;
@@ -677,8 +1202,10 @@ static int __handle_request_decrypt_package(uid_t uid,
                return -1;
        }
 
-       if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_DECRYPT_PACKAGE,
-                               "pkg", drm_file_path, decrypted_file_path)) {
+       if (_push_queue(caller_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_DECRYPT_PACKAGE,
+                               "default", drm_file_path,
+                               decrypted_file_path)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
                free(reqkey);
@@ -692,32 +1219,92 @@ static int __handle_request_decrypt_package(uid_t uid,
        return 0;
 }
 
-static int __handle_request_add_blacklist(uid_t uid,
-               GDBusMethodInvocation *invocation, GVariant *parameters)
+static int __update_app_splash_screen(uid_t caller_uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters,
+               int req_type)
 {
        uid_t target_uid = (uid_t)-1;
+       char *appid = NULL;
        char *reqkey;
+
+       g_variant_get(parameters, "(u&s)", &target_uid, &appid);
+       if (target_uid == (uid_t)-1 || appid == NULL) {
+               ERR("target_uid: %d, appid: %s", target_uid, appid);
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ECOMM));
+               return -1;
+       }
+
+       reqkey = __generate_reqkey(appid);
+       if (reqkey == NULL) {
+               ERR("Failed to generate request key");
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ENOMEM));
+               return -1;
+       }
+
+       if (_push_queue(target_uid, caller_uid, reqkey, req_type, "default",
+                               appid, NULL)) {
+               ERR("Failed to push request");
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+               free(reqkey);
+               return -1;
+       }
+
+       g_dbus_method_invocation_return_value(invocation,
+                       g_variant_new("(i)", PKGMGR_R_OK));
+
+       if (reqkey)
+               free(reqkey);
+
+       return 0;
+}
+
+static int __handle_request_enable_app_splash_screen(uid_t caller_uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       return __update_app_splash_screen(caller_uid, invocation, parameters,
+                       REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
+}
+
+static int __handle_request_disable_app_splash_screen(uid_t caller_uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       return __update_app_splash_screen(caller_uid, invocation, parameters,
+                       REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
+}
+
+static int __handle_request_set_restriction_mode(uid_t caller_uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       uid_t target_uid = (uid_t)-1;
        char *pkgid = NULL;
+       char *reqkey;
+       int mode = -1;
+       char buf[4];
 
-       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgid == NULL) {
+       g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
+       if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ECOMM));
                return -1;
        }
 
-       reqkey = __generate_reqkey("blacklist");
+       reqkey = __generate_reqkey("restriction");
        if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ENOMEM));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, reqkey,
-                               PKGMGR_REQUEST_TYPE_ADD_BLACKLIST,
-                               "pkg", pkgid, "")) {
+       snprintf(buf, sizeof(buf), "%d", mode);
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_SET_RESTRICTION_MODE,
+                               "default", pkgid, buf)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+               free(reqkey);
                return -1;
        }
 
@@ -728,32 +1315,36 @@ static int __handle_request_add_blacklist(uid_t uid,
        return 0;
 }
 
-static int __handle_request_remove_blacklist(uid_t uid,
+static int __handle_request_unset_restriction_mode(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *reqkey;
        char *pkgid = NULL;
+       char *reqkey;
+       int mode = -1;
+       char buf[4];
 
-       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgid == NULL) {
+       g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
+       if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ECOMM));
                return -1;
        }
 
-       reqkey = __generate_reqkey("blacklist");
+       reqkey = __generate_reqkey("restriction");
        if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ENOMEM));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, reqkey,
-                               PKGMGR_REQUEST_TYPE_REMOVE_BLACKLIST,
-                               "pkg", pkgid, "")) {
+       snprintf(buf, sizeof(buf), "%d", mode);
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_UNSET_RESTRICTION_MODE,
+                               "default", pkgid, buf)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+               free(reqkey);
                return -1;
        }
 
@@ -764,32 +1355,71 @@ static int __handle_request_remove_blacklist(uid_t uid,
        return 0;
 }
 
-static int __handle_request_check_blacklist(uid_t uid,
+static int __handle_request_get_restriction_mode(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *reqkey;
        char *pkgid = NULL;
+       char *reqkey;
 
-       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+       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;
        }
 
-       reqkey = __generate_reqkey("blacklist");
+       reqkey = __generate_reqkey("restriction");
+       if (reqkey == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(ii)", -1, PKGMGR_R_ENOMEM));
+               return -1;
+       }
+
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_GET_RESTRICTION_MODE,
+                               "default", pkgid, NULL)) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(ii)", -1, PKGMGR_R_ESYSTEM));
+               free(reqkey);
+               return -1;
+       }
+
+       if (!g_hash_table_insert(req_table, (gpointer)reqkey,
+                               (gpointer)invocation))
+               ERR("reqkey already exists");
+
+       return 0;
+}
+
+static int __handle_request_set_app_label(uid_t uid,
+               GDBusMethodInvocation *invocation, GVariant *parameters)
+{
+       uid_t target_uid = (uid_t)-1;
+       char *appid = NULL;
+       char *label = NULL;
+       char *reqkey;
+
+       g_variant_get(parameters, "(uss)", &target_uid, &appid, &label);
+       if (target_uid == (uid_t)-1 || appid == NULL || label == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ECOMM));
+               return -1;
+       }
+
+       reqkey = __generate_reqkey("appid");
        if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ENOMEM));
                return -1;
        }
 
-       if (_pm_queue_push(target_uid, reqkey,
-                               PKGMGR_REQUEST_TYPE_CHECK_BLACKLIST,
-                               "pkg", pkgid, "")) {
+       if (_push_queue(target_uid, uid, reqkey,
+                               REQUEST_TYPE_SET_APP_LABEL,
+                               "default", appid, label)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+               free(reqkey);
                return -1;
        }
 
@@ -836,8 +1466,14 @@ static void __handle_method_call(GDBusConnection *connection,
        if (uid == (uid_t)-1)
                return;
 
+       if (__check_caller_permission(uid, invocation, parameters))
+               return;
+
        if (g_strcmp0(method_name, "install") == 0)
                ret = __handle_request_install(uid, invocation, parameters);
+       else if (g_strcmp0(method_name, "mount_install") == 0)
+               ret = __handle_request_mount_install(uid, invocation,
+                               parameters);
        else if (g_strcmp0(method_name, "reinstall") == 0)
                ret = __handle_request_reinstall(uid, invocation, parameters);
        else if (g_strcmp0(method_name, "uninstall") == 0)
@@ -846,18 +1482,26 @@ static void __handle_method_call(GDBusConnection *connection,
                ret = __handle_request_cleardata(uid, invocation, parameters);
        else if (g_strcmp0(method_name, "move") == 0)
                ret = __handle_request_move(uid, invocation, parameters);
-       else if (g_strcmp0(method_name, "enable") == 0)
-               ret = __handle_request_enable(uid, invocation, parameters);
-       else if (g_strcmp0(method_name, "disable") == 0)
-               ret = __handle_request_disable(uid, invocation, parameters);
+       else if (g_strcmp0(method_name, "enable_pkgs") == 0)
+               ret = __handle_request_enable_pkgs(uid, invocation, parameters);
+       else if (g_strcmp0(method_name, "disable_pkgs") == 0)
+               ret = __handle_request_disable_pkgs(uid, invocation, parameters);
        else if (g_strcmp0(method_name, "getsize") == 0)
                ret = __handle_request_getsize(uid, invocation, parameters);
+       else if (g_strcmp0(method_name, "getsize_sync") == 0)
+               ret = __handle_request_getsize_sync(uid, invocation, parameters);
        else if (g_strcmp0(method_name, "clearcache") == 0)
                ret = __handle_request_clearcache(uid, invocation, parameters);
-       else if (g_strcmp0(method_name, "enable_global_app") == 0)
-               ret = __handle_request_enable_global_app(uid, invocation, parameters);
-       else if (g_strcmp0(method_name, "disable_global_app") == 0)
-               ret = __handle_request_disable_global_app(uid, invocation, parameters);
+       else if (g_strcmp0(method_name, "enable_app") == 0)
+               ret = __handle_request_enable_app(uid, invocation, parameters);
+       else if (g_strcmp0(method_name, "disable_app") == 0)
+               ret = __handle_request_disable_app(uid, invocation, parameters);
+       else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
+               ret = __handle_request_enable_global_app_for_uid(uid,
+                               invocation, parameters);
+       else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
+               ret = __handle_request_disable_global_app_for_uid(uid,
+                               invocation, parameters);
        else if (g_strcmp0(method_name, "kill") == 0)
                ret = __handle_request_kill(uid, invocation, parameters);
        else if (g_strcmp0(method_name, "check") == 0)
@@ -871,15 +1515,23 @@ static void __handle_method_call(GDBusConnection *connection,
        else if (g_strcmp0(method_name, "decrypt_package") == 0)
                ret = __handle_request_decrypt_package(uid, invocation,
                                parameters);
-       else if (g_strcmp0(method_name, "add_blacklist") == 0)
-               ret = __handle_request_add_blacklist(uid, invocation,
+       else if (g_strcmp0(method_name, "disable_app_splash_screen") == 0)
+               ret = __handle_request_disable_app_splash_screen(uid,
+                               invocation, parameters);
+       else if (g_strcmp0(method_name, "enable_app_splash_screen") == 0)
+               ret = __handle_request_enable_app_splash_screen(uid,
+                               invocation, parameters);
+       else if (g_strcmp0(method_name, "set_restriction_mode") == 0)
+               ret = __handle_request_set_restriction_mode(uid, invocation,
                                parameters);
-       else if (g_strcmp0(method_name, "remove_blacklist") == 0)
-               ret = __handle_request_remove_blacklist(uid, invocation,
+       else if (g_strcmp0(method_name, "unset_restriction_mode") == 0)
+               ret = __handle_request_unset_restriction_mode(uid, invocation,
                                parameters);
-       else if (g_strcmp0(method_name, "check_blacklist") == 0)
-               ret = __handle_request_check_blacklist(uid, invocation,
+       else if (g_strcmp0(method_name, "get_restriction_mode") == 0)
+               ret = __handle_request_get_restriction_mode(uid, invocation,
                                parameters);
+       else if (g_strcmp0(method_name, "set_app_label") == 0)
+               ret = __handle_request_set_app_label(uid, invocation, parameters);
        else
                ret = -1;
 
@@ -887,7 +1539,7 @@ static void __handle_method_call(GDBusConnection *connection,
                g_idle_add(queue_job, NULL);
 }
 
-int __return_value_to_caller(const char *req_key, GVariant *result)
+int _return_value_to_caller(const char *req_key, GVariant *result)
 {
        GDBusMethodInvocation *invocation;
 
@@ -904,8 +1556,7 @@ int __return_value_to_caller(const char *req_key, GVariant *result)
        return 0;
 }
 
-static const GDBusInterfaceVTable interface_vtable =
-{
+static const GDBusInterfaceVTable interface_vtable = {
        __handle_method_call,
        NULL,
        NULL,
@@ -919,7 +1570,7 @@ static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
        DBG("on bus acquired");
 
        reg_id = g_dbus_connection_register_object(connection,
-                       COMM_PKGMGR_DBUS_OBJECT_PATH,
+                       PKGMGR_DBUS_OBJECT_PATH,
                        instropection_data->interfaces[0],
                        &interface_vtable, NULL, NULL, &err);
 
@@ -941,11 +1592,12 @@ static void __on_name_lost(GDBusConnection *connection, const gchar *name,
        DBG("on name lost: %s", name);
 }
 
-int __init_request_handler(void)
+int _init_request_handler(void)
 {
-       instropection_data = g_dbus_node_info_new_for_xml(instropection_xml, NULL);
+       instropection_data = g_dbus_node_info_new_for_xml(instropection_xml,
+                       NULL);
 
-       owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, COMM_PKGMGR_DBUS_SERVICE,
+       owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, PKGMGR_DBUS_SERVICE,
                        G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
                        __on_name_acquired, __on_name_lost, NULL, NULL);
 
@@ -957,7 +1609,7 @@ int __init_request_handler(void)
        return 0;
 }
 
-void __fini_request_handler(void)
+void _fini_request_handler(void)
 {
        g_hash_table_destroy(req_table);
        g_bus_unown_name(owner_id);