Sync to the latest code
authorjunsuk77.oh <junsuk77.oh@samsung.com>
Mon, 9 Sep 2013 03:14:11 +0000 (12:14 +0900)
committerjunsuk77.oh <junsuk77.oh@samsung.com>
Mon, 9 Sep 2013 03:14:11 +0000 (12:14 +0900)
Change-Id: I4c161cda84ce8c7b23a86ba443d3d2a2ac5869e0
Signed-off-by: junsuk77.oh <junsuk77.oh@samsung.com>
27 files changed:
client/include/package-manager.h
client/include/pkgmgr-debug.h
client/src/pkgmgr.c
comm/CMakeLists.txt
comm/SLP_package_manager_frontend_backend_PG.h
comm/comm_client.h
comm/comm_client_dbus.c
comm/comm_client_gdbus.c [new file with mode: 0755]
comm/comm_config.h
comm/comm_status_broadcast_server.h
comm/comm_status_broadcast_server_dbus.c
comm/pkgmgr_installer.c
comm/pkgmgr_installer.h
comm/test/test_comm_client.c
comm/test/test_comm_status_broadcast_server.c
comm/test/test_pkgmgr_installer.c
packaging/pkgmgr.spec
pkgmgr.manifest
pkgmgr.patch.sh.in
server/src/pkgmgr-server.c
tool/pkg_cmd.c
tool/pkg_fota.c
tool/pkg_getsize.c
tool/pkg_info.c
tool/pkg_initdb.c
tool/pkg_recovery.sh.in
tool/pkg_smack.c

index f32f379..b4b61bb 100755 (executable)
@@ -97,6 +97,17 @@ extern "C" {
 #define PKGMGR_INFO_STR_DATA_SIZE      "data_size"
 #define PKGMGR_INFO_STR_APP_SIZE       "app_size"
 #define PKGMGR_INFO_STR_INSTALLED_TIME "installed_time"
+
+/**
+ * @brief listening status type in pkgmgr.
+ */
+#define PKGMGR_CLIENT_STATUS_ALL                                               0x00
+#define PKGMGR_CLIENT_STATUS_INSTALL                                   0x01
+#define PKGMGR_CLIENT_STATUS_UNINSTALL                                 0x02
+#define PKGMGR_CLIENT_STATUS_UPGRADE                                   0x04
+#define PKGMGR_CLIENT_STATUS_MOVE                                              0x08
+#define PKGMGR_CLIENT_STATUS_CLEAR_DATA                                        0x10
+#define PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS                  0x20
 /** @} */
 
 /* 1 -100 : Package command errors */
@@ -265,6 +276,8 @@ typedef enum {
 typedef enum {
        PM_GET_TOTAL_SIZE= 0,
        PM_GET_DATA_SIZE = 1,
+       PM_GET_ALL_PKGS = 2,
+       PM_GET_MAX
 }pkgmgr_getsize_type;
 
 /**
@@ -485,6 +498,19 @@ int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
                                const char *appid, pkgmgr_mode mode);
 
 /**
+ * @brief      This API set status type to listen for the pkgmgr's broadcasting
+ *
+ * This API is for package-manager client application.\n
+ *
+ * @param[in]  pc      pkgmgr_client
+ * @param[in]  status_type     status type to listen
+ * @return     request_id (>0) if success, error code(<0) if fail\n
+ * @retval     PKGMGR_R_OK     success
+ * @retval     PKGMGR_R_EINVAL invalid argument
+*/
+int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type);
+
+/**
  * @brief      This API request to listen the pkgmgr's broadcasting
  *
  * This API is for package-manager client application.\n
index 3040e7e..7ec0523 100644 (file)
        } \
 } while (0)
 
+#define trym_if(expr, fmt, arg...) do { \
+                        if (expr) { \
+                                PKGMGR_DEBUG_ERR("(%s) "fmt, #expr, ##arg); \
+                                goto catch; \
+                        } \
+                } while (0)
+
 #define tryvm_if(expr, val, fmt, arg...) do { \
                         if (expr) { \
                                 PKGMGR_DEBUG_ERR("(%s) "fmt, #expr, ##arg); \
index abbf993..85cf14d 100755 (executable)
@@ -80,6 +80,7 @@ typedef struct _listen_cb_info {
 
 typedef struct _pkgmgr_client_t {
        client_type ctype;
+       int status_type;
        union {
                struct _request {
                        comm_client *cc;
@@ -814,11 +815,8 @@ catch:
 static int __get_size_process(pkgmgr_client * pc, const char *pkgid, pkgmgr_getsize_type get_type, pkgmgr_handler event_cb, void *data)
 {
        char *req_key = NULL;
-       int req_id = 0;
        int ret =0;
-       pkgmgrinfo_pkginfo_h handle;
-       char *pkgtype = NULL;
-       char *installer_path = NULL;
+       char *pkgtype = "rpm";
        char *argv[PKG_ARGC_MAX] = { NULL, };
        char *args = NULL;
        int argcnt = 0;
@@ -831,29 +829,10 @@ static int __get_size_process(pkgmgr_client * pc, const char *pkgid, pkgmgr_gets
        pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
        retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
 
-       ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
-       retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgr_pkginfo_get_pkginfo failed");
-
-       ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
-       tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "pkgmgr_pkginfo_get_type failed");
-
-       installer_path = _get_backend_path_with_type(pkgtype);
        req_key = __get_req_key(pkgid);
-       req_id = _get_request_id();
 
        snprintf(buf, 128, "%d", get_type);
-       argv[argcnt++] = installer_path;
-       /* argv[1] */
-       argv[argcnt++] = strdup("-k");
-       /* argv[2] */
-       argv[argcnt++] = req_key;
-       /* argv[3] */
-       argv[argcnt++] = strdup("-d");
-       /* argv[4] */
        argv[argcnt++] = strdup(pkgid);
-       /* argv[5] */
-       argv[argcnt++] = strdup("-t");
-       /* argv[6] */
        argv[argcnt++] = strdup(buf);
 
        /*** add quote in all string for special charactor like '\n'***   FIX */
@@ -898,7 +877,6 @@ catch:
        if (cookie)
                free(cookie);
 
-       pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
        return ret;
 }
 
@@ -1045,58 +1023,36 @@ API pkgmgr_client *pkgmgr_client_new(client_type ctype)
        pkgmgr_client_t *pc = NULL;
        int ret = -1;
 
-       if (ctype != PC_REQUEST && ctype != PC_LISTENING
-           && ctype != PC_BROADCAST)
-               return NULL;
+       retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING && ctype != PC_BROADCAST, NULL, "ctype is not client_type");
 
        /* Allocate memory for ADT:pkgmgr_client */
        pc = calloc(1, sizeof(pkgmgr_client_t));
-       if (pc == NULL) {
-               _LOGE("No memory");
-               return NULL;
-       }
+       retvm_if(pc == NULL, NULL, "No memory");
 
        /* Manage pc */
        pc->ctype = ctype;
+       pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
 
        if (pc->ctype == PC_REQUEST) {
                pc->info.request.cc = comm_client_new();
-               if (pc->info.request.cc == NULL) {
-                       _LOGE("client creation failed");
-                       goto err;
-               }
-               ret = comm_client_set_status_callback(pc->info.request.cc,
-                                                     __operation_callback, pc);
-               if (ret < 0) {
-                       _LOGE("comm_client_set_status_callback() failed - %d",
-                             ret);
-                       goto err;
-               }
+               trym_if(pc->info.request.cc == NULL, "client creation failed");
+
+               ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.request.cc, __operation_callback, pc);
+               trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
        } else if (pc->ctype == PC_LISTENING) {
                pc->info.listening.cc = comm_client_new();
-               if (pc->info.listening.cc == NULL) {
-                       _LOGE("client creation failed");
-                       goto err;
-               }
-               ret = comm_client_set_status_callback(pc->info.listening.cc,
-                                                     __status_callback, pc);
-               if (ret < 0) {
-                       _LOGE("comm_client_set_status_callback() failed - %d",
-                             ret);
-                       goto err;
-               }
+               trym_if(pc->info.listening.cc == NULL, "client creation failed");
+
+               ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.listening.cc, __status_callback, pc);
+               trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
        } else if (pc->ctype == PC_BROADCAST) {
-               pc->info.broadcast.bc = comm_status_broadcast_server_connect();
-               if (pc->info.broadcast.bc == NULL) {
-                       _LOGE("client creation failed");
-                       goto err;
-               }
-               ret = 0;
+               pc->info.broadcast.bc = comm_status_broadcast_server_connect(COMM_STATUS_BROADCAST_ALL);
+               trym_if(pc->info.broadcast.bc == NULL, "client creation failed");
        }
 
        return (pkgmgr_client *) pc;
 
err:
catch:
        if (pc)
                free(pc);
        return NULL;
@@ -1106,11 +1062,7 @@ API int pkgmgr_client_free(pkgmgr_client *pc)
 {
        int ret = -1;
        pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
-
-       if (mpc == NULL) {
-               _LOGE("Invalid argument");
-               return PKGMGR_R_EINVAL;
-       }
+       retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
 
        if (mpc->ctype == PC_REQUEST) {
                req_cb_info *tmp;
@@ -1122,24 +1074,18 @@ API int pkgmgr_client_free(pkgmgr_client *pc)
                }
 
                ret = comm_client_free(mpc->info.request.cc);
-               if (ret < 0) {
-                       _LOGE("comm_client_free() failed - %d", ret);
-                       goto err;
-               }
+               tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
        } else if (mpc->ctype == PC_LISTENING) {
-               listen_cb_info *tmp;
-               listen_cb_info *prev;
-               for (tmp = mpc->info.listening.lhead; tmp;) {
-                       prev = tmp;
-                       tmp = tmp->next;
-                       free(prev);
-               }
+                       listen_cb_info *tmp;
+                       listen_cb_info *prev;
+                       for (tmp = mpc->info.listening.lhead; tmp;) {
+                               prev = tmp;
+                               tmp = tmp->next;
+                               free(prev);
+                       }
 
-               ret = comm_client_free(mpc->info.listening.cc);
-               if (ret < 0) {
-                       _LOGE("comm_client_free() failed - %d", ret);
-                       goto err;
-               }
+                       ret = comm_client_free(mpc->info.listening.cc);
+                       tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
        } else if (mpc->ctype == PC_BROADCAST) {
                comm_status_broadcast_server_disconnect(mpc->info.broadcast.bc);
                ret = 0;
@@ -1152,7 +1098,7 @@ API int pkgmgr_client_free(pkgmgr_client *pc)
        mpc = NULL;
        return PKGMGR_R_OK;
 
err:
catch:
        if (mpc) {
                free(mpc);
                mpc = NULL;
@@ -1813,46 +1759,36 @@ API int pkgmgr_client_activate(pkgmgr_client * pc, const char *pkg_type,
        char *cookie = NULL;
        int ret;
        /* Check for NULL value of pc */
-       if (pc == NULL) {
-               _LOGD("package manager client handle is NULL\n");
-               return PKGMGR_R_EINVAL;
-       }
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
+
        pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
 
        /* 0. check the pc type */
-       if (mpc->ctype != PC_REQUEST)
-               return PKGMGR_R_EINVAL;
+       retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
 
        /* 1. check argument */
-       if (pkgid == NULL)
-               return PKGMGR_R_EINVAL;
+       retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
+       retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
 
        if (pkg_type == NULL) {
                pkgtype = _get_pkg_type_from_desktop_file(pkgid);
-               if (pkgtype == NULL)
-                       return PKGMGR_R_EINVAL;
+               retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
        } else
                pkgtype = pkg_type;
 
-       if (strlen(pkgid) >= PKG_STRING_LEN_MAX)
-               return PKGMGR_R_EINVAL;
-
        /* 2. generate req_key */
        req_key = __get_req_key(pkgid);
+       retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
 
        /* 3. request activate */
-       ret = comm_client_request(mpc->info.request.cc, req_key,
-                                 COMM_REQ_TO_ACTIVATOR, pkgtype,
-                                 pkgid, "1 PKG", cookie, 1);
-       if (ret < 0) {
-               _LOGE("request failed, ret=%d\n", ret);
-               free(req_key);
-               return PKGMGR_R_ECOMM;
-       }
+       ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, pkgid, "1 PKG", cookie, 1);
+       tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
 
-       free(req_key);
+       ret = PKGMGR_R_OK;
 
-       return PKGMGR_R_OK;
+catch:
+       free(req_key);
+       return ret;
 }
 
 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
@@ -1863,19 +1799,16 @@ API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
        char *cookie = NULL;
        int ret;
        /* Check for NULL value of pc */
-       if (pc == NULL) {
-               _LOGD("package manager client handle is NULL\n");
-               return PKGMGR_R_EINVAL;
-       }
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
+
        pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
 
        /* 0. check the pc type */
-       if (mpc->ctype != PC_REQUEST)
-               return PKGMGR_R_EINVAL;
+       retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
 
        /* 1. check argument */
-       if (pkgid == NULL)
-               return PKGMGR_R_EINVAL;
+       retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
+       retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
 
        if (pkg_type == NULL) {
                pkgtype = _get_pkg_type_from_desktop_file(pkgid);
@@ -1884,25 +1817,19 @@ API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
        } else
                pkgtype = pkg_type;
 
-       if (strlen(pkgid) >= PKG_STRING_LEN_MAX)
-               return PKGMGR_R_EINVAL;
-
        /* 2. generate req_key */
        req_key = __get_req_key(pkgid);
+       retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
 
        /* 3. request activate */
-       ret = comm_client_request(mpc->info.request.cc, req_key,
-                                 COMM_REQ_TO_ACTIVATOR, pkgtype,
-                                 pkgid, "0 PKG", cookie, 1);
-       if (ret < 0) {
-               _LOGE("request failed, ret=%d\n", ret);
-               free(req_key);
-               return PKGMGR_R_ECOMM;
-       }
+       ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, pkgid, "0 PKG", cookie, 1);
+       tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
 
-       free(req_key);
+       ret = PKGMGR_R_OK;
 
-       return PKGMGR_R_OK;
+catch:
+       free(req_key);
+       return ret;
 }
 
 API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid)
@@ -1912,41 +1839,33 @@ API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid)
        char *cookie = NULL;
        int ret;
        /* Check for NULL value of pc */
-       if (pc == NULL) {
-               _LOGD("package manager client handle is NULL\n");
-               return PKGMGR_R_EINVAL;
-       }
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
+
        pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
 
        /* 0. check the pc type */
-       if (mpc->ctype != PC_REQUEST)
-               return PKGMGR_R_EINVAL;
+       retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
 
        /* 1. check argument */
-       if (appid == NULL)
-               return PKGMGR_R_EINVAL;
-
-       if (strlen(appid) >= PKG_STRING_LEN_MAX)
-               return PKGMGR_R_EINVAL;
+       retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
+       retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
 
        pkgtype = _get_pkg_type_from_desktop_file(appid);
+       retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
 
        /* 2. generate req_key */
        req_key = __get_req_key(appid);
+       retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
 
        /* 3. request activate */
-       ret = comm_client_request(mpc->info.request.cc, req_key,
-                                 COMM_REQ_TO_ACTIVATOR, pkgtype,
-                                 appid, "1 APP", cookie, 1);
-       if (ret < 0) {
-               _LOGE("request failed, ret=%d\n", ret);
-               free(req_key);
-               return PKGMGR_R_ECOMM;
-       }
+       ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, "1 APP", cookie, 1);
+       tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
 
-       free(req_key);
+       ret = PKGMGR_R_OK;
 
-       return PKGMGR_R_OK;
+catch:
+       free(req_key);
+       return ret;
 }
 
 API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[])
@@ -1962,27 +1881,23 @@ API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char
        char *args = NULL;
        char *argsr = NULL;
        /* Check for NULL value of pc */
-       if (pc == NULL) {
-               _LOGD("package manager client handle is NULL\n");
-               return PKGMGR_R_EINVAL;
-       }
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
+
        pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
 
        /* 0. check the pc type */
-       if (mpc->ctype != PC_REQUEST)
-               return PKGMGR_R_EINVAL;
+       retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
 
        /* 1. check argument */
-       if (appid == NULL)
-               return PKGMGR_R_EINVAL;
-
-       if (strlen(appid) >= PKG_STRING_LEN_MAX)
-               return PKGMGR_R_EINVAL;
+       retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
+       retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
 
        pkgtype = _get_pkg_type_from_desktop_file(appid);
+       retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
 
        /* 2. generate req_key */
        req_key = __get_req_key(appid);
+       retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
 
        /*** add quote in all string for special charactor like '\n'***   FIX */
        if (argv) {
@@ -1995,11 +1910,7 @@ API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char
 
                if (argcnt) {
                        args = (char *)calloc(len, sizeof(char));
-                       if (args == NULL) {
-                               _LOGE("calloc failed");
-                               free(req_key);
-                               return PKGMGR_R_ERROR;
-                       }
+                       tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
                        strncpy(args, argv[0], len - 1);
 
                        for (i = 1; i < argcnt; i++) {
@@ -2012,12 +1923,8 @@ API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char
        }
 
        argsr = (char *)calloc(strlen("1 APP")+2+len, sizeof(char));
-       if (argsr == NULL) {
-               _LOGE("calloc failed");
-               free(req_key);
-               free(args);
-               return PKGMGR_R_ERROR;
-       }
+       tryvm_if(argsr == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
+
        strncpy(argsr, "1 APP", strlen("1 APP"));
        if (argcnt) {
                strncat(argsr, " ", strlen(" "));
@@ -2028,22 +1935,18 @@ API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char
        /******************* end of quote ************************/
 
        /* 3. request activate */
-       ret = comm_client_request(mpc->info.request.cc, req_key,
-                                 COMM_REQ_TO_ACTIVATOR, pkgtype,
-                                 appid, argsr, cookie, 1);
-       if (ret < 0) {
-               _LOGE("request failed, ret=%d\n", ret);
-               free(req_key);
-               free(args);
-               free(argsr);
-               return PKGMGR_R_ECOMM;
-       }
+       ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, argsr, cookie, 1);
+       tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
+
+       ret = PKGMGR_R_OK;
+
+catch:
 
        free(req_key);
        free(args);
        free(argsr);
 
-       return PKGMGR_R_OK;
+       return ret;
 }
 
 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid)
@@ -2053,41 +1956,33 @@ API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid)
        char *cookie = NULL;
        int ret;
        /* Check for NULL value of pc */
-       if (pc == NULL) {
-               _LOGD("package manager client handle is NULL\n");
-               return PKGMGR_R_EINVAL;
-       }
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
+
        pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
 
        /* 0. check the pc type */
-       if (mpc->ctype != PC_REQUEST)
-               return PKGMGR_R_EINVAL;
+       retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
 
        /* 1. check argument */
-       if (appid == NULL)
-               return PKGMGR_R_EINVAL;
-
-       if (strlen(appid) >= PKG_STRING_LEN_MAX)
-               return PKGMGR_R_EINVAL;
+       retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
+       retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
 
        pkgtype = _get_pkg_type_from_desktop_file(appid);
+       retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
 
        /* 2. generate req_key */
        req_key = __get_req_key(appid);
+       retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
 
        /* 3. request activate */
-       ret = comm_client_request(mpc->info.request.cc, req_key,
-                                 COMM_REQ_TO_ACTIVATOR, pkgtype,
-                                 appid, "0 APP", cookie, 1);
-       if (ret < 0) {
-               _LOGE("request failed, ret=%d\n", ret);
-               free(req_key);
-               return PKGMGR_R_ECOMM;
-       }
+       ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, "0 APP", cookie, 1);
+       tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
 
-       free(req_key);
+       ret = PKGMGR_R_OK;
 
-       return PKGMGR_R_OK;
+catch:
+       free(req_key);
+       return ret;
 }
 
 
@@ -2205,29 +2100,80 @@ API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
        return PKGMGR_R_OK;
 }
 
+
+API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
+{
+       int ret = -1;
+
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
+       retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
+       pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
+
+       /*  free listening head */
+       listen_cb_info *tmp = NULL;
+       listen_cb_info *prev = NULL;
+       for (tmp = mpc->info.listening.lhead; tmp;) {
+               prev = tmp;
+               tmp = tmp->next;
+               free(prev);
+       }
+
+       /* free dbus connection */
+       ret = comm_client_free(mpc->info.listening.cc);
+       retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
+
+       /* Manage pc for seperated event */
+       mpc->ctype = PC_LISTENING;
+       mpc->status_type = status_type;
+
+       mpc->info.listening.cc = comm_client_new();
+       retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
+
+       if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL) == PKGMGR_CLIENT_STATUS_INSTALL) {
+               ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL, mpc->info.listening.cc, __status_callback, pc);
+               retvm_if(ret < 0, PKGMGR_R_ECOMM, "PKGMGR_CLIENT_STATUS_INSTALL failed - %d", ret);
+       }
+
+       if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UNINSTALL) == PKGMGR_CLIENT_STATUS_UNINSTALL) {
+               ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UNINSTALL, mpc->info.listening.cc, __status_callback, pc);
+               retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UNINSTALL failed - %d", ret);
+       }
+
+       if ((mpc->status_type & PKGMGR_CLIENT_STATUS_MOVE) == PKGMGR_CLIENT_STATUS_MOVE) {
+               ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_MOVE, mpc->info.listening.cc, __status_callback, pc);
+               retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_MOVE failed - %d", ret);
+       }
+
+       if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) == PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) {
+               ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, mpc->info.listening.cc, __status_callback, pc);
+               retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_INSTALL_PROGRESS failed - %d", ret);
+       }
+
+   if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UPGRADE) == PKGMGR_CLIENT_STATUS_UPGRADE) {
+          ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UPGRADE, mpc->info.listening.cc, __status_callback, pc);
+          retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UPGRADE failed - %d", ret);
+   }
+
+   return PKGMGR_R_OK;
+}
+
 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
                                    void *data)
 {
        int req_id;
        /* Check for NULL value of pc */
-       if (pc == NULL) {
-               _LOGD("package manager client handle is NULL\n");
-               return PKGMGR_R_EINVAL;
-       }
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
        pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
 
-       /* 0. check the pc type */
-       if (mpc->ctype != PC_LISTENING)
-               return PKGMGR_R_EINVAL;
+       /* 0. check input */
+       retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
+       retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
 
-       /* 1. check argument */
-       if (event_cb == NULL)
-               return PKGMGR_R_EINVAL;
+       /* 1. get id */
+       req_id = _get_request_id();
 
        /* 2. add callback info to pkgmgr_client */
-       req_id = _get_request_id();
        __add_stat_cbinfo(mpc, req_id, event_cb, data);
-
        return req_id;
 }
 
@@ -2251,7 +2197,7 @@ API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
        if (mpc->ctype != PC_BROADCAST)
                return PKGMGR_R_EINVAL;
 
-       comm_status_broadcast_server_send_signal(mpc->info.broadcast.bc,
+       comm_status_broadcast_server_send_signal(COMM_STATUS_BROADCAST_ALL, mpc->info.broadcast.bc,
                                                 PKG_STATUS, pkg_type,
                                                 pkgid, key, val);
 
@@ -2315,7 +2261,7 @@ API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type,
        case PM_REQUEST_GET_SIZE:
                tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
                tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
-               tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode > PM_GET_DATA_SIZE), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
+               tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
 
                ret = __get_size_process(pc, pkgid, (pkgmgr_getsize_type)service_mode, event_cb, data);
                break;
index 361017e..5ab21ca 100755 (executable)
@@ -25,7 +25,7 @@ message(STATUS "version/major : ${VERSION} / ${VERSION_MAJOR}")
 ### Get required CFLAGS, LDFLAGS from pkg-config
 
 include(FindPkgConfig)
-pkg_check_modules(comm_pkgs REQUIRED dbus-1 dbus-glib-1 dlog pkgmgr-info)
+pkg_check_modules(comm_pkgs REQUIRED dbus-1 glib-2.0 dbus-glib-1 gio-2.0 gio-unix-2.0 dlog pkgmgr-info)
 
 foreach(flag ${comm_pkgs_CFLAGS})
        set(comm_pkgs_CFLAGS_str "${comm_pkgs_CFLAGS_str} ${flag}")
@@ -87,6 +87,7 @@ set_target_properties(pkgmgr_installer_client PROPERTIES VERSION ${VERSION})
 set_target_properties(pkgmgr_installer_client PROPERTIES COMPILE_FLAGS "${comm_pkgs_CFLAGS_str}")
 target_link_libraries(pkgmgr_installer_client ${comm_pkgs_LDFLAGS})
 add_dependencies(pkgmgr_installer_client comm_pkg_mgr_client_dbus_bindings.h comm_status_broadcast_client_dbus_bindings.h comm_status_broadcast_signal_marshaller.h comm_status_broadcast_signal_marshaller.c)
+#add_dependencies(pkgmgr_installer_client comm_pkg_mgr_client_gdbus_generated.h comm_pkg_mgr_client_gdbus_generated.c)
 
 ## pkg-mgr server for PMS
 # Get request
index ad88222..bc072b8 100755 (executable)
@@ -316,13 +316,13 @@ Backend must broadcast its installing status. You can broadcast your status by u
 /* ... */
 
 DBusConnection *conn;
-conn = comm_status_broadcast_server_connect();
+conn = comm_status_broadcast_server_connect(COMM_STATUS_BROADCAST_ALL);
 
-comm_status_broadcast_server_send_signal(conn, req_id, pkg_type, pkgid, "start", "0");
+comm_status_broadcast_server_send_signal(COMM_STATUS_BROADCAST_ALL, conn, req_id, pkg_type, pkgid, "start", "0");
 /* ... */
-comm_status_broadcast_server_send_signal(conn, req_id, pkg_type, pkgid, "install_percent", "60");
+comm_status_broadcast_server_send_signal(COMM_STATUS_BROADCAST_ALL,conn,  req_id, pkg_type, pkgid, "install_percent", "60");
 /* ... */
-comm_status_broadcast_server_send_signal(conn, req_id, pkg_type, pkgid, "end", "0");
+comm_status_broadcast_server_send_signal(COMM_STATUS_BROADCAST_ALL, conn, req_id, pkg_type, pkgid, "end", "0");
 
 /* ... */
 @endcode
index 7ab448b..13b62e4 100755 (executable)
@@ -48,7 +48,5 @@ API int comm_client_request(comm_client *cc, const char *req_id,
                            const char *pkgid, const char *args,
                            const char *cookie, int is_block);
 
-API int comm_client_set_status_callback(comm_client *cc, status_cb cb,
-                                       void *cb_data);
-
+API int comm_client_set_status_callback(int comm_status_type, comm_client *cc, status_cb cb, void *cb_data);
 #endif                         /* __COMM_CLIENT_H__ */
index be00470..60e29a9 100755 (executable)
@@ -56,6 +56,40 @@ struct comm_client {
 /*********************************
  * Internal function description
  */
+static char *__get_interface(int status_type)
+{
+       char *interface = NULL;
+
+       switch (status_type) {
+               case COMM_STATUS_BROADCAST_ALL:
+                       interface = COMM_STATUS_BROADCAST_DBUS_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL:
+                       interface = COMM_STATUS_BROADCAST_DBUS_INSTALL_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UNINSTALL:
+                       interface = COMM_STATUS_BROADCAST_DBUS_UNINSTALL_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_MOVE:
+                       interface = COMM_STATUS_BROADCAST_DBUS_MOVE_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL_PROGRESS:
+                       interface = COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UPGRADE:
+                       interface = COMM_STATUS_BROADCAST_DBUS_UPGRADE_INTERFACE;
+                       break;
+
+               default:
+                       interface = NULL;
+       }
+       return interface;
+}
 
 /**
  * signal handler filter
@@ -83,9 +117,12 @@ _on_signal_handle_filter(DBusConnection *conn,
        sig_cb_data = (struct signal_callback_data *)user_data;
 
        /* Signal check */
-       if (dbus_message_is_signal(msg,
-                                  COMM_STATUS_BROADCAST_DBUS_INTERFACE,
-                                  COMM_STATUS_BROADCAST_SIGNAL_STATUS)) {
+       if ((dbus_message_is_signal(msg, COMM_STATUS_BROADCAST_DBUS_INTERFACE, COMM_STATUS_BROADCAST_SIGNAL_STATUS)) ||
+               (dbus_message_is_signal(msg, COMM_STATUS_BROADCAST_DBUS_INSTALL_INTERFACE, COMM_STATUS_BROADCAST_EVENT_INSTALL)) ||
+               (dbus_message_is_signal(msg, COMM_STATUS_BROADCAST_DBUS_UNINSTALL_INTERFACE, COMM_STATUS_BROADCAST_EVENT_UNINSTALL)) ||
+               (dbus_message_is_signal(msg, COMM_STATUS_BROADCAST_DBUS_MOVE_INTERFACE, COMM_STATUS_BROADCAST_EVENT_MOVE)) ||
+               (dbus_message_is_signal(msg, COMM_STATUS_BROADCAST_DBUS_UPGRADE_INTERFACE, COMM_STATUS_BROADCAST_EVENT_UPGRADE)) ||
+               (dbus_message_is_signal(msg, COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_INTERFACE, COMM_STATUS_BROADCAST_EVENT_INSTALL_PROGRESS))) {
 
                /* Signal type check */
                if (dbus_message_get_args(msg, &err,
@@ -309,7 +346,7 @@ comm_client_request(
  * Set a callback for status signal
  */
 int
-comm_client_set_status_callback(comm_client *cc, status_cb cb, void *cb_data)
+comm_client_set_status_callback(int comm_status_type, comm_client *cc, status_cb cb, void *cb_data)
 {
        DBusError err;
        char buf[256] = { 0, };
@@ -321,8 +358,7 @@ comm_client_set_status_callback(comm_client *cc, status_cb cb, void *cb_data)
                goto ERROR_CLEANUP;
 
        /* Add a rule for signal */
-       snprintf(buf, 255, "type='signal',interface='%s'",
-                COMM_STATUS_BROADCAST_DBUS_INTERFACE);
+       snprintf(buf, 255, "type='signal',interface='%s'",      __get_interface(comm_status_type));
        dbus_bus_add_match(cc->conn, buf, &err);
        if (dbus_error_is_set(&err)) {
                ERR("dbus error:%s", err.message);
diff --git a/comm/comm_client_gdbus.c b/comm/comm_client_gdbus.c
new file mode 100755 (executable)
index 0000000..91f3e02
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ * slp-pkgmgr
+ *
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+/*
+ * comm_client_gdbus.c
+ * comm_client library using gdbus
+ */
+
+#include <glib.h>
+#include <gio/gio.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include "comm_config.h"
+#include "comm_client.h"
+#include "comm_pkg_mgr_client_gdbus_generated.h"
+
+/*******************
+ * ADT description
+ */
+
+/* Storing status_cb */
+struct signal_callback_data {
+       status_cb cb;
+       void *cb_data;
+};
+
+/* comm_client ADT */
+struct comm_client {
+       guint subscription_id;
+       GDBusConnection *conn;
+       struct signal_callback_data *sig_cb_data;
+};
+
+static char *__get_interface(int status_type)
+{
+       char *ifc = NULL;
+
+       switch (status_type) {
+               case COMM_STATUS_BROADCAST_ALL:
+                       ifc = COMM_STATUS_BROADCAST_DBUS_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL:
+                       ifc = COMM_STATUS_BROADCAST_DBUS_INSTALL_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UNINSTALL:
+                       ifc = COMM_STATUS_BROADCAST_DBUS_UNINSTALL_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_MOVE:
+                       ifc = COMM_STATUS_BROADCAST_DBUS_MOVE_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL_PROGRESS:
+                       ifc = COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_INTERFACE;
+                       break;
+
+               default:
+                       break;
+       }
+       return ifc;
+}
+
+/**
+ * signal handler filter
+ * Filter signal, and run user callback
+ */
+void _on_signal_handle_filter(GDBusConnection *conn,
+               const gchar *sender_name,
+               const gchar *object_path,
+               const gchar *interface_name,
+               const gchar *signal_name,
+               GVariant *parameters,
+               gpointer user_data)
+{
+       if (interface_name && strcmp(interface_name, COMM_STATUS_BROADCAST_DBUS_INTERFACE) &&
+               strcmp(interface_name, COMM_STATUS_BROADCAST_DBUS_INSTALL_INTERFACE) &&
+               strcmp(interface_name, COMM_STATUS_BROADCAST_DBUS_UNINSTALL_INTERFACE) &&
+               strcmp(interface_name, COMM_STATUS_BROADCAST_DBUS_MOVE_INTERFACE) &&
+               strcmp(interface_name, COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_INTERFACE)) {
+               dbg("Interface name did not match. Drop the message");
+               return;
+       }
+       if (signal_name && strcmp(signal_name, COMM_STATUS_BROADCAST_SIGNAL_STATUS) &&
+               strcmp(signal_name, COMM_STATUS_BROADCAST_EVENT_INSTALL) &&
+               strcmp(signal_name, COMM_STATUS_BROADCAST_EVENT_UNINSTALL) &&
+               strcmp(signal_name, COMM_STATUS_BROADCAST_EVENT_MOVE) &&
+               strcmp(signal_name, COMM_STATUS_BROADCAST_EVENT_INSTALL_PROGRESS)) {
+               dbg("Signal name did not match. Drop the message");
+               return;
+       }
+       /* Values to be received by signal */
+       char *req_id = NULL;
+       char *pkg_type = NULL;
+       char *pkgid = NULL;
+       char *key = NULL;
+       char *val = NULL;
+
+       /* User's signal handler */
+       struct signal_callback_data *sig_cb_data;
+       if (user_data)
+               sig_cb_data = (struct signal_callback_data *)user_data;
+       else
+               return;
+
+       g_variant_get(parameters, "(&s&s&s&s&s)",
+                               &req_id, &pkg_type, &pkgid, &key, &val);
+       /* Got signal! */
+       dbg("Got signal: [%s] %s / %s / %s / %s / %s", signal_name, req_id,
+           pkg_type, pkgid, key, val);
+
+       /* Run signal callback if exist */
+       if (sig_cb_data && sig_cb_data->cb) {
+               sig_cb_data->cb(sig_cb_data->cb_data, req_id,
+                               pkg_type, pkgid, key, val);
+               dbg("callback function is end");
+       }
+       dbg("Handled signal. Exit function");
+       return;
+}
+
+/**
+ * signal_callback_data free function
+ * Just free it!
+ */
+void _free_sig_cb_data(void *data)
+{
+       struct signal_callback_data *sig_cb_data = NULL;
+       if (data)
+               sig_cb_data = (struct signal_callback_data *)data;
+       if (!sig_cb_data)
+               return;
+       free(sig_cb_data);
+}
+
+/*******************
+ * API description
+ */
+
+/**
+ * Create a new comm_client object
+ */
+comm_client *comm_client_new(void)
+{
+       GError *error = NULL;
+       comm_client *cc = NULL;
+
+       /* Allocate memory for ADT:comm_client */
+       g_type_init();
+       cc = calloc(1, sizeof(comm_client));
+       if (NULL == cc) {
+               ERR("No memory");
+               goto ERROR_CLEANUP;
+       }
+
+       /* Connect to gdbus */
+       cc->conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (error) {
+               ERR("gdbus connection error (%s)", error->message);
+               g_error_free(error);
+               goto ERROR_CLEANUP;
+       }
+       if (NULL == cc->conn) {
+               ERR("gdbus connection is not set, even gdbus error isn't raised");
+               goto ERROR_CLEANUP;
+       }
+       return cc;
+
+ ERROR_CLEANUP:
+       if (cc)
+               free(cc);
+       return NULL;
+}
+
+/**
+ * Free comm_client object
+ */
+int comm_client_free(comm_client *cc)
+{
+       if (!cc)
+               return -1;
+       if (!(cc->conn) || g_dbus_connection_is_closed(cc->conn)) {
+               ERR("Invalid gdbus connection");
+               return -2;
+       }
+
+       /* Cleanup ADT */
+       /* flush remaining buffer: blocking mode */
+       g_dbus_connection_flush_sync(cc->conn, NULL, NULL);
+
+       /* Free signal filter if signal callback is exist */
+       if (cc->sig_cb_data) {
+               g_dbus_connection_signal_unsubscribe(cc->conn, cc->subscription_id);
+               /* TODO: Is it needed to free cc->sig_cb_data here? */
+               /* _free_sig_cb_data(cc->sig_cb_data); */
+       }
+
+       g_dbus_connection_close_sync(cc->conn, NULL, NULL);
+       g_object_unref(cc->conn);
+       free(cc);
+
+       return 0;
+}
+
+/**
+ * Request a message
+ */
+
+int
+comm_client_request(
+               comm_client *cc,
+               const char *req_id,
+               const int req_type,
+               const char *pkg_type,
+               const char *pkgid,
+               const char *args,
+               const char *cookie,
+               int is_block)
+{
+       GError *error = NULL;
+       int ret = 0;
+       int rc = 0;
+       ComSamsungSlpPkgmgr *proxy;
+       if (!cc){
+               ERR("Invalid gdbus input");
+               return COMM_RET_ERROR;
+       }
+       proxy = com_samsung_slp_pkgmgr_proxy_new_sync(cc->conn,
+                       G_DBUS_PROXY_FLAGS_NONE, COMM_PKG_MGR_DBUS_SERVICE,
+                       COMM_PKG_MGR_DBUS_PATH,
+                       NULL, &error);
+       if (proxy == NULL) {
+               ERR("Unable to create proxy\n");
+               return COMM_RET_ERROR;
+       }
+       rc = com_samsung_slp_pkgmgr_call_request_sync(proxy,
+                       req_id, req_type, pkg_type, pkgid, args, cookie, &ret, NULL, &error);
+       if (!rc) {
+               ERR("Failed to send request\n");
+               return COMM_RET_ERROR;
+       }
+       return COMM_RET_OK;
+}
+
+/**
+ * Set a callback for status signal
+ */
+int
+comm_client_set_status_callback(int comm_status_type, comm_client *cc, status_cb cb, void *cb_data)
+{
+       int r = COMM_RET_ERROR;
+       char *ifc = NULL;
+
+       if (NULL == cc)
+               goto ERROR_CLEANUP;
+
+       ifc = __get_interface(comm_status_type);
+       if (ifc == NULL) {
+               ERR("Invalid interface name\n");
+               return COMM_RET_ERROR;
+       }
+       /* If previous signal handler is set already, remove filter first */
+       if (cc->sig_cb_data) {
+               g_dbus_connection_signal_unsubscribe(cc->conn, cc->subscription_id);
+               /* TODO: Is it needed to free cc->sig_cb_data here? */
+       }
+
+       /* Create new sig_cb_data */
+       cc->sig_cb_data = calloc(1, sizeof(struct signal_callback_data));
+       (cc->sig_cb_data)->cb = cb;
+       (cc->sig_cb_data)->cb_data = cb_data;
+
+       /* Add a filter for signal */
+       cc->subscription_id = g_dbus_connection_signal_subscribe(cc->conn, NULL, ifc,
+               NULL, NULL, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
+               _on_signal_handle_filter, (gpointer)cc->sig_cb_data, _free_sig_cb_data);
+       if (!cc->subscription_id) {
+               ERR("Failed to add filter\n");
+               r = COMM_RET_ERROR;
+               goto ERROR_CLEANUP;
+       }
+
+       return COMM_RET_OK;
+
+ ERROR_CLEANUP:
+       ERR("General error");
+       return r;
+}
+
index 90ba69f..6fa50a9 100755 (executable)
 #define LOG_TAG "PKGMGR"
 #endif                         /* LOG_TAG */
 #include <dlog.h>
-#define dbg(fmtstr, args...) \
-       do { SLOGI("[comm]%s:%d:%s(): " \
-       fmtstr "\n", basename(__FILE__), __LINE__, __func__, ##args); } \
-       while (0)
-#define ERR(fmtstr, args...) \
-       do { SLOGE("[comm]%s:%d:%s(): " \
-       fmtstr "\n", basename(__FILE__), __LINE__, __func__, ##args); } \
-       while (0)
+
+#define dbg(fmt, arg...) LOGD(fmt, ##arg)
+#define ERR(fmt, arg...) LOGE(fmt, ##arg)
+
 #else
 #include <stdio.h>
 #include <sys/types.h>
        "org.tizen.slp.pkgmgr_status"
 #define COMM_STATUS_BROADCAST_SIGNAL_STATUS "status"
 
+#define COMM_STATUS_BROADCAST_DBUS_INSTALL_SERVICE_PREFIX "org.tizen.slp.pkgmgr.install"
+#define COMM_STATUS_BROADCAST_DBUS_INSTALL_PATH        "/org/tizen/slp/pkgmgr/install"
+#define COMM_STATUS_BROADCAST_DBUS_INSTALL_INTERFACE "org.tizen.slp.pkgmgr.install"
+#define COMM_STATUS_BROADCAST_EVENT_INSTALL "install"
+
+#define COMM_STATUS_BROADCAST_DBUS_UNINSTALL_SERVICE_PREFIX "org.tizen.slp.pkgmgr.uninstall"
+#define COMM_STATUS_BROADCAST_DBUS_UNINSTALL_PATH      "/org/tizen/slp/pkgmgr/uninstall"
+#define COMM_STATUS_BROADCAST_DBUS_UNINSTALL_INTERFACE "org.tizen.slp.pkgmgr.uninstall"
+#define COMM_STATUS_BROADCAST_EVENT_UNINSTALL "uninstall"
+
+#define COMM_STATUS_BROADCAST_DBUS_MOVE_SERVICE_PREFIX "org.tizen.slp.pkgmgr.move"
+#define COMM_STATUS_BROADCAST_DBUS_MOVE_PATH   "/org/tizen/slp/pkgmgr/move"
+#define COMM_STATUS_BROADCAST_DBUS_MOVE_INTERFACE "org.tizen.slp.pkgmgr.move"
+#define COMM_STATUS_BROADCAST_EVENT_MOVE "move"
+
+#define COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_SERVICE_PREFIX "org.tizen.slp.pkgmgr.install.progress"
+#define COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_PATH       "/org/tizen/slp/pkgmgr/install/progress"
+#define COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_INTERFACE "org.tizen.slp.pkgmgr.install.progress"
+#define COMM_STATUS_BROADCAST_EVENT_INSTALL_PROGRESS "install_progress"
+
+#define COMM_STATUS_BROADCAST_DBUS_UPGRADE_SERVICE_PREFIX "org.tizen.slp.pkgmgr.upgrade"
+#define COMM_STATUS_BROADCAST_DBUS_UPGRADE_PATH        "/org/tizen/slp/pkgmgr/upgrade"
+#define COMM_STATUS_BROADCAST_DBUS_UPGRADE_INTERFACE "org.tizen.slp.pkgmgr.upgrade"
+#define COMM_STATUS_BROADCAST_EVENT_UPGRADE "upgrade"
+
 /********
  * enums
  ********/
@@ -136,4 +157,15 @@ enum {
        COMM_RET_MAX_SENTINEL
 };
 
+/* broadcast type */
+enum {
+       COMM_STATUS_BROADCAST_ALL = 1,
+       COMM_STATUS_BROADCAST_INSTALL,
+       COMM_STATUS_BROADCAST_UNINSTALL,
+       COMM_STATUS_BROADCAST_MOVE,
+       COMM_STATUS_BROADCAST_INSTALL_PROGRESS,
+       COMM_STATUS_BROADCAST_UPGRADE,
+       COMM_STATUS_BROADCAST_MAX
+};
+
 #endif                         /* __COMM_CONFIG_H__ */
index bfc489a..3b74397 100755 (executable)
@@ -31,8 +31,8 @@
 #include <dbus/dbus.h>
 
 /* pure dbus api */
-API DBusConnection *comm_status_broadcast_server_connect(void);
-API void comm_status_broadcast_server_send_signal(DBusConnection *conn,
+API DBusConnection *comm_status_broadcast_server_connect(int comm_status_type);
+API void comm_status_broadcast_server_send_signal(int comm_status_type, DBusConnection *conn,
                                                  const char *req_id,
                                                  const char *pkg_type,
                                                  const char *pkgid,
index 14a849e..ef1f938 100755 (executable)
 /********************************************
  * pure dbus signal service for internal use
  ********************************************/
+static char *__get_prifix(int status_type)
+{
+       char *prifix = NULL;
+
+       switch (status_type) {
+               case COMM_STATUS_BROADCAST_ALL:
+                       prifix = COMM_STATUS_BROADCAST_DBUS_SERVICE_PREFIX;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL:
+                       prifix = COMM_STATUS_BROADCAST_DBUS_INSTALL_SERVICE_PREFIX;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UNINSTALL:
+                       prifix = COMM_STATUS_BROADCAST_DBUS_UNINSTALL_SERVICE_PREFIX;
+                       break;
+
+               case COMM_STATUS_BROADCAST_MOVE:
+                       prifix = COMM_STATUS_BROADCAST_DBUS_MOVE_SERVICE_PREFIX;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL_PROGRESS:
+                       prifix = COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_SERVICE_PREFIX;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UPGRADE:
+                       prifix = COMM_STATUS_BROADCAST_DBUS_UPGRADE_SERVICE_PREFIX;
+                       break;
+
+               default:
+                       prifix = NULL;
+       }
+       return prifix;
+}
+
+static char *__get_path(int status_type)
+{
+       char *path = NULL;
+
+       switch (status_type) {
+               case COMM_STATUS_BROADCAST_ALL:
+                       path = COMM_STATUS_BROADCAST_DBUS_PATH;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL:
+                       path = COMM_STATUS_BROADCAST_DBUS_INSTALL_PATH;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UNINSTALL:
+                       path = COMM_STATUS_BROADCAST_DBUS_UNINSTALL_PATH;
+                       break;
+
+               case COMM_STATUS_BROADCAST_MOVE:
+                       path = COMM_STATUS_BROADCAST_DBUS_MOVE_PATH;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL_PROGRESS:
+                       path = COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_PATH;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UPGRADE:
+                       path = COMM_STATUS_BROADCAST_DBUS_UPGRADE_PATH;
+                       break;
+
+               default:
+                       path = NULL;
+       }
+       return path;
+}
+
+static char *__get_interface(int status_type)
+{
+       char *interface = NULL;
+
+       switch (status_type) {
+               case COMM_STATUS_BROADCAST_ALL:
+                       interface = COMM_STATUS_BROADCAST_DBUS_INTERFACE;
+                       break;
 
-API DBusConnection *comm_status_broadcast_server_connect(void)
+               case COMM_STATUS_BROADCAST_INSTALL:
+                       interface = COMM_STATUS_BROADCAST_DBUS_INSTALL_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UNINSTALL:
+                       interface = COMM_STATUS_BROADCAST_DBUS_UNINSTALL_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_MOVE:
+                       interface = COMM_STATUS_BROADCAST_DBUS_MOVE_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL_PROGRESS:
+                       interface = COMM_STATUS_BROADCAST_DBUS_INSTALL_PROGRESS_INTERFACE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UPGRADE:
+                       interface = COMM_STATUS_BROADCAST_DBUS_UPGRADE_INTERFACE;
+                       break;
+
+               default:
+                       interface = NULL;
+       }
+       return interface;
+}
+
+static char *__get_name(int status_type)
+{
+       char *name = NULL;
+
+       switch (status_type) {
+               case COMM_STATUS_BROADCAST_ALL:
+                       name = COMM_STATUS_BROADCAST_SIGNAL_STATUS;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL:
+                       name = COMM_STATUS_BROADCAST_EVENT_INSTALL;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UNINSTALL:
+                       name = COMM_STATUS_BROADCAST_EVENT_UNINSTALL;
+                       break;
+
+               case COMM_STATUS_BROADCAST_MOVE:
+                       name = COMM_STATUS_BROADCAST_EVENT_MOVE;
+                       break;
+
+               case COMM_STATUS_BROADCAST_INSTALL_PROGRESS:
+                       name = COMM_STATUS_BROADCAST_EVENT_INSTALL_PROGRESS;
+                       break;
+
+               case COMM_STATUS_BROADCAST_UPGRADE:
+                       name = COMM_STATUS_BROADCAST_EVENT_UPGRADE;
+                       break;
+
+               default:
+                       name = NULL;
+       }
+       return name;
+}
+
+API DBusConnection *comm_status_broadcast_server_connect(int status_type)
 {
        DBusError err;
        DBusConnection *conn;
@@ -45,22 +184,23 @@ API DBusConnection *comm_status_broadcast_server_connect(void)
                dbus_error_free(&err);
        }
        dbus_error_free(&err);
-       if (NULL == conn)
-               exit(1);
-       dbus_bus_request_name(conn,
-                             COMM_STATUS_BROADCAST_DBUS_SERVICE_PREFIX,
-                             DBUS_NAME_FLAG_ALLOW_REPLACEMENT, &err);
+       if (NULL == conn) {
+               dbg("conn is NULL");
+               return NULL;
+       }
+
+       dbus_bus_request_name(conn, __get_prifix(status_type), DBUS_NAME_FLAG_ALLOW_REPLACEMENT, &err);
        if (dbus_error_is_set(&err)) {
                dbg("Failed to request name: %s", err.message);
                dbus_error_free(&err);
-               exit(1);
+               return NULL;
        }
 
        return conn;
 }
 
 API void
-comm_status_broadcast_server_send_signal(DBusConnection *conn,
+comm_status_broadcast_server_send_signal(int comm_status_type, DBusConnection *conn,
                                         const char *req_id,
                                         const char *pkg_type,
                                         const char *pkgid, const char *key,
@@ -79,12 +219,10 @@ comm_status_broadcast_server_send_signal(DBusConnection *conn,
        };
        int i;
 
-       msg = dbus_message_new_signal(COMM_STATUS_BROADCAST_DBUS_PATH,
-                                     COMM_STATUS_BROADCAST_DBUS_INTERFACE,
-                                     COMM_STATUS_BROADCAST_SIGNAL_STATUS);
+       msg = dbus_message_new_signal(__get_path(comm_status_type), __get_interface(comm_status_type), __get_name(comm_status_type));
        if (NULL == msg) {
                dbg("msg NULL");
-               exit(1);
+               return;
        }
 
        dbus_message_iter_init_append(msg, &args);
@@ -94,12 +232,12 @@ comm_status_broadcast_server_send_signal(DBusConnection *conn,
                    (&args, DBUS_TYPE_STRING, &(values[i]))) {
                        dbg("dbus_message_iter_append_basic failed:"
                        " Out of memory");
-                       exit(1);
+                       return;
                }
        }
        if (!dbus_connection_send(conn, msg, &serial)) {
                dbg("dbus_connection_send failed: Out of memory");
-               exit(1);
+               return;
        }
        dbus_connection_flush(conn);
        dbus_message_unref(msg);
@@ -111,4 +249,3 @@ API void comm_status_broadcast_server_disconnect(DBusConnection *conn)
                return;
        dbus_connection_unref(conn);
 }
-
index 387630a..e2ad540 100755 (executable)
@@ -67,6 +67,57 @@ struct pkgmgr_installer {
 
 /* API */
 
+static int __send_signal_for_event(int comm_status_type, pkgmgr_installer *pi,
+                            const char *pkg_type,
+                            const char *pkgid,
+                            const char *key, const char *val)
+{
+       if (!pi)
+               return -1;
+
+       if (!pi->conn)
+               pi->conn = comm_status_broadcast_server_connect(comm_status_type);
+
+       char *sid = pi->session_id;
+       if (!sid)
+               sid = "";
+       comm_status_broadcast_server_send_signal(comm_status_type, pi->conn, sid, pkg_type, pkgid, key, val);
+
+       return 0;
+}
+
+API int __send_event(pkgmgr_installer *pi,
+                            const char *pkg_type,
+                            const char *pkgid,
+                            const char *key, const char *val)
+{
+       int r = -1;
+
+       if (strcmp(key,PKGMGR_INSTALLER_START_KEY_STR) == 0) {
+               if(strcmp(key,PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0) {
+                       pi->request_type = PKGMGR_REQ_UPGRADE;
+                       r = __send_signal_for_event(COMM_STATUS_BROADCAST_UPGRADE, pi, pkg_type, pkgid, key, val);
+               }
+               if(pi->request_type == PKGMGR_REQ_INSTALL) {
+                       r = __send_signal_for_event(COMM_STATUS_BROADCAST_INSTALL, pi, pkg_type, pkgid, key, val);
+               } else if (pi->request_type == PKGMGR_REQ_UNINSTALL){
+                       r = __send_signal_for_event(COMM_STATUS_BROADCAST_UNINSTALL, pi, pkg_type, pkgid, key, val);
+               }
+       } else if (strcmp(key,PKGMGR_INSTALLER_END_KEY_STR) == 0) {
+               if(pi->request_type == PKGMGR_REQ_INSTALL) {
+                       r = __send_signal_for_event(COMM_STATUS_BROADCAST_INSTALL, pi, pkg_type, pkgid, key, val);
+               } else if (pi->request_type == PKGMGR_REQ_UNINSTALL){
+                       r = __send_signal_for_event(COMM_STATUS_BROADCAST_UNINSTALL, pi, pkg_type, pkgid, key, val);
+               } else if (pi->request_type == PKGMGR_REQ_UPGRADE){
+                       r = __send_signal_for_event(COMM_STATUS_BROADCAST_UPGRADE, pi, pkg_type, pkgid, key, val);
+               }
+       } else if (strcmp(key,PKGMGR_INSTALLER_INSTALL_PERCENT_KEY_STR) == 0) {
+               r = __send_signal_for_event(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, pi, pkg_type, pkgid, key, val);
+       }
+
+       return r;
+}
+
 API pkgmgr_installer *pkgmgr_installer_new(void)
 {
        pkgmgr_installer *pi = NULL;
@@ -295,14 +346,16 @@ pkgmgr_installer_send_signal(pkgmgr_installer *pi,
        int r = 0;
 
        if (!pi->conn)
-               pi->conn = comm_status_broadcast_server_connect();
+               pi->conn = comm_status_broadcast_server_connect(COMM_STATUS_BROADCAST_ALL);
 
        char *sid = pi->session_id;
        if (!sid)
                sid = "";
-       comm_status_broadcast_server_send_signal(pi->conn, sid, pkg_type,
+       comm_status_broadcast_server_send_signal(COMM_STATUS_BROADCAST_ALL, pi->conn, sid, pkg_type,
                                                 pkgid, key, val);
 
+       __send_event(pi, pkg_type, pkgid, key, val);
+
        return r;
 }
 
index 5e02a17..7bd7208 100755 (executable)
@@ -51,6 +51,21 @@ typedef struct pkgmgr_installer pkgmgr_installer;
 typedef void* pkgmgr_instcertinfo_h;
 
 /**
+ * @brief listening event type in pkgmgr.
+ */
+#define PKGMGR_INSTALLER_START_KEY_STR                                                         "start"
+#define PKGMGR_INSTALLER_END_KEY_STR                                                           "end"
+#define PKGMGR_INSTALLER_INSTALL_PERCENT_KEY_STR                                       "install_percent"
+
+#define PKGMGR_INSTALLER_INSTALL_EVENT_STR                                                     "install"
+#define PKGMGR_INSTALLER_UNINSTALL_EVENT_STR                                           "uninstall"
+#define PKGMGR_INSTALLER_MOVE_EVENT_STR                                                                "move"
+#define PKGMGR_INSTALLER_UPGRADE_EVENT_STR                                                     "upgrade"
+
+
+
+
+/**
  * Request type.
  */
 enum {
@@ -62,7 +77,8 @@ enum {
        PKGMGR_REQ_MOVE = 4,
        PKGMGR_REQ_RECOVER = 5,
        PKGMGR_REQ_REINSTALL = 6,
-       PKGMGR_REQ_GETSIZE = 7
+       PKGMGR_REQ_GETSIZE = 7,
+       PKGMGR_REQ_UPGRADE = 8
 };
 
 enum {
index e2dc2fe..d87771b 100755 (executable)
@@ -50,7 +50,7 @@ int main(int argc, char **argv)
                                  "this_is_a_cookie", 0);
 
        printf("client: waiting signal...\n");
-       comm_client_set_status_callback(cc, stat_cb, NULL);
+       comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, cc, stat_cb, NULL);
 
        g_main_loop_run(mainloop);
 
index 3eb488e..4d3c6eb 100755 (executable)
 static int _main_dbus(int argc, char **argv);
 static int _main_dbus(int argc, char **argv)
 {
-       DBusConnection *conn = comm_status_broadcast_server_connect();
+       DBusConnection *conn = comm_status_broadcast_server_connect(COMM_STATUS_BROADCAST_ALL);
        int i;
        for (i = 0; i < 100; i++) {
-               comm_status_broadcast_server_send_signal(conn, "test_id",
+               comm_status_broadcast_server_send_signal(COMM_STATUS_BROADCAST_ALL, conn, "test_id",
                                                         "test", "test_pkgid",
                                                         "test_key",
                                                         "test_val");
index 1d813a9..9557a61 100755 (executable)
@@ -149,7 +149,7 @@ static void __test_pi_send_signal(void)
        struct signal_counter counter = { 0, };
        comm_client *cc;
        cc = comm_client_new();
-       comm_client_set_status_callback(cc, get_signal_cb, &counter);
+       comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, cc, get_signal_cb, &counter);
 
        /* sender */
        g_timeout_add_seconds(1, timer_send_signal, pi);
index 0655550..70ef9dc 100755 (executable)
@@ -1,7 +1,7 @@
 #sbs-git:slp/pkgs/s/slp-pkgmgr pkgmgr 0.1.103 29b53909a5d6e8728429f0a188177eac691cb6ce
 Name:       pkgmgr
 Summary:    Packager Manager client library package
-Version:    0.2.112
+Version:    0.2.119
 Release:    1
 Group:      System/Libraries
 License:    Apache License, Version 2.0
@@ -12,6 +12,9 @@ BuildRequires:  unzip
 BuildRequires:  gettext-tools
 BuildRequires:  pkgconfig(ecore)
 BuildRequires:  pkgconfig(security-server)
+BuildRequires:  pkgconfig(glib-2.0)
+BuildRequires:  pkgconfig(gio-unix-2.0)
+BuildRequires:  pkgconfig(gio-2.0)
 BuildRequires:  pkgconfig(dbus-1)
 BuildRequires:  pkgconfig(dbus-glib-1)
 BuildRequires:  pkgconfig(dlog)
@@ -22,6 +25,7 @@ BuildRequires:  pkgconfig(pkgmgr-info)
 BuildRequires:  pkgconfig(iniparser)
 BuildRequires:  pkgmgr-info-parser-devel
 BuildRequires:  pkgmgr-info-parser
+BuildRequires:  python-xml
 
 
 %description
@@ -89,11 +93,18 @@ Package Manager client types develpoment package for packaging
 %prep
 %setup -q
 
+%if 0%{?tizen_build_binary_release_type_eng}
+export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE"
+export CXXFLAGS="$CXXFLAGS ?DTIZEN_ENGINEER_MODE"
+export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE"
+%endif
+
 cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}
 
 %build
 
 make %{?jobs:-j%jobs}
+
 %install
 rm -rf %{buildroot}
 %make_install
@@ -119,7 +130,9 @@ update-mime-database /usr/share/mime
 #init DB
 mkdir -p /usr/share/packages
 mkdir -p /opt/share/packages
-mkdir -p /opt/share/packages/.recovery
+mkdir -p /opt/share/packages/.recovery/pkgmgr
+mkdir -p /opt/share/packages/.recovery/tpk
+mkdir -p /opt/share/packages/.recovery/wgt
 
 mkdir -p /usr/share/applications
 mkdir -p /opt/share/applications
index c33781f..ea89fe8 100755 (executable)
@@ -13,6 +13,7 @@
                        <smack request="system::media" type="rwxat"/>
                        <smack request="ail::db" type="rwx"/>
                        <smack request="system::vconf" type="rwxat"/>
+                       <smack request="system::vconf_inhouse" type="rwxat"/>
                        <smack request="pkgmgr::db" type="rwx"/>
                </request>
        </define>
index 8f2fc9f..51c3508 100644 (file)
@@ -9,4 +9,4 @@ echo "--------------------------------------"
 /bin/rm /opt/dbspace/.pkgmgr_parser.db
 /bin/rm /opt/dbspace/.pkgmgr_parser.db-journal
 /usr/bin/pkg_fota
-/usr/bin/ail_initdb
+/usr/bin/ail_fota
index 6347f5c..7a10822 100755 (executable)
@@ -82,7 +82,7 @@ FILE *___log = NULL;
 #define LOCALEDIR "/usr/share/locale"
 #endif
 
-#define PACKAGE_RECOVERY_DIR "/opt/share/packages/.recovery"
+#define PACKAGE_RECOVERY_DIR "/opt/share/packages/.recovery/pkgmgr"
 
 #define DESKTOP_W   720.0
 
@@ -1685,8 +1685,39 @@ pop:
                                }
                                DBGE("manifest : %s\n", manifest);
 
-                               if (val)
-                                       ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL);
+                               if (val) {
+                                       pkgmgrinfo_pkginfo_h handle;
+                                       ret = pkgmgrinfo_pkginfo_get_pkginfo(item->pkgid, &handle);
+                                       if (ret < 0) {
+                                               ret = pkgmgr_parser_parse_manifest_for_installation(manifest, NULL);
+                                               if (ret < 0) {
+                                                       DBGE("insert in db failed\n");
+                                                       exit(1);
+                                               }
+
+                                               ret = ail_desktop_add(item->pkgid);
+                                               if (ret != AIL_ERROR_OK) {
+                                                       perror("fail to ail_desktop_add");
+                                                       exit(1);
+                                               }
+                                       } else {
+                                               pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+                                       }
+
+                                       ret = pkgmgrinfo_appinfo_set_state_enabled(item->pkgid, val);
+                                       if (ret != PMINFO_R_OK) {
+                                               perror("fail to activate/deactivte package");
+                                               exit(1);
+                                       }
+
+                                       ret = ail_desktop_appinfo_modify_bool(item->pkgid,
+                                                               AIL_PROP_X_SLP_ENABLED_BOOL,
+                                                               val, TRUE);
+                                       if (ret != AIL_ERROR_OK) {
+                                               perror("fail to ail_desktop_appinfo");
+                                               exit(1);
+                                       }
+                               }
                                else
                                        ret = pkgmgr_parser_parse_manifest_for_uninstallation(manifest, NULL);
 
index 0d889e6..ce5461a 100755 (executable)
@@ -482,6 +482,28 @@ static int __pkgmgr_list_cb (const pkgmgr_pkginfo_h handle, void *user_data)
        return ret;
 }
 
+static int __pkg_list_cb (const pkgmgrinfo_pkginfo_h handle, void *user_data)
+{
+       int ret = -1;
+       int size = 0;
+       char *pkgid;
+
+       ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
+       if(ret < 0) {
+               printf("pkgmgr_pkginfo_get_pkgid() failed\n");
+       }
+
+       ret = pkgmgr_client_request_service(PM_REQUEST_GET_SIZE, PM_GET_TOTAL_SIZE, (pkgmgr_client *)user_data, NULL, pkgid, NULL, NULL, NULL);
+       if (ret < 0){
+               printf("pkgmgr_client_request_service Failed\n");
+               return -1;
+       }
+
+       printf("pkg[%s] size = %d\n", pkgid, ret);
+
+       return 0;
+}
+
 static int __process_request()
 {
        int ret = -1;
@@ -876,11 +898,6 @@ static int __process_request()
                if (data.pkgid[0] == '\0') {
                        printf("Please provide the arguments.\n");
                        printf("use -h option to see usage\n");
-                       data.result = PKGCMD_ERR_ARGUMENT_INVALID;
-                       break;
-               }
-               if (data.type < 0 || data.type > 1) {
-                       printf("Invalid get type...See usage\n");
                        ret = -1;
                        break;
                }
@@ -892,6 +909,11 @@ static int __process_request()
                        break;
                }
 
+               if (data.type == 9) {
+                       ret = pkgmgrinfo_pkginfo_get_list(__pkg_list_cb, (void *)pc);
+                       break;
+               }
+
                ret = pkgmgr_client_request_service(PM_REQUEST_GET_SIZE, data.type, pc, NULL, data.pkgid, NULL, NULL, NULL);
                if (ret < 0){
                        data.result = PKGCMD_ERR_FATAL_ERROR;
index cbfdb04..8c274a2 100644 (file)
@@ -166,7 +166,7 @@ int pkg_fota_load_directory(const char *directory)
                // pkgmgr_parser_parse_manifest_for_installation(buf, NULL);
 
                char buf2[BUFSZE];
-               snprintf(buf2, sizeof(buf2), "/usr/bin/pkginfo --imd %s", buf);
+               snprintf(buf2, sizeof(buf2), "/usr/bin/pkginfo --fota %s", buf);
                system(buf2);
 
                free(manifest);
index 7177c05..9b229f9 100644 (file)
 
 #include <pkgmgr-info.h>
 #include <vconf.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <unistd.h>
 
-#include "pkgmgr_installer.h"
 #include "pkgmgr-debug.h"
+#include "package-manager.h"
 
 #undef LOG_TAG
 #ifndef LOG_TAG
 #endif                         /* LOG_TAG */
 
 #define MAX_PKG_BUF_LEN        1024
+#define BLOCK_SIZE      4096 /*in bytes*/
+
 #define PKG_TMP_PATH "/opt/usr/apps/tmp"
+#define PKG_RW_PATH "/opt/usr/apps/"
+#define PKG_RO_PATH "/usr/apps/"
 
-static int _pkg_getsize(int argc, char **argv)
+long long __calculate_dir_size(char *dirname)
 {
-       int ret = 0;
-       char *pkgid = NULL;
-       char *type = NULL;
-       pkgmgr_installer *pi = NULL;
-       pkgmgrinfo_pkginfo_h handle = NULL;
-       int size = -1;
-       int get_type = -1;
-       char *pkeyid = NULL;
-
-       /*make new pkgmgr_installer handle*/
-       pi = pkgmgr_installer_new();
-       retvm_if(!pi, PMINFO_R_ERROR, "service type is error\n");
-
-       /*get args*/
-       ret = pkgmgr_installer_receive_request(pi, argc, argv);
-       tryvm_if(ret < 0, PMINFO_R_ERROR, "pkgmgr_installer_receive_request failed");
-
-       /*get pkgid from installer handle*/
-       pkgid = pkgmgr_installer_get_request_info(pi);
-       tryvm_if(pkgid == NULL, ret = PMINFO_R_ERROR, "pkgmgr_installer_get_request_info failed");
-
-       pkeyid = pkgmgr_installer_get_session_id(pi);
-       tryvm_if(pkeyid == NULL, ret = PMINFO_R_ERROR, "pkgmgr_installer_get_session_id failed");
-
-       get_type = pkgmgr_installer_get_move_type(pi);
-       tryvm_if(pkgid < 0, ret = PMINFO_R_ERROR, "pkgmgr_installer_get_request_info failed");
-
-       /*get pkgmgr handle from pkgid*/
-       ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
-       tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo[pkgid=%s] failed", pkgid);
-
-       /*get type info from handle*/
-       ret = pkgmgrinfo_pkginfo_get_type(handle, &type);
-       tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "pkgmgrinfo_pkginfo_get_type[pkgid=%s] failed", pkgid);
-
-       /*get size info from handle
-       typedef enum {
-               PM_GET_TOTAL_SIZE= 0,
-               PM_GET_DATA_SIZE = 1,
-       }pkgmgr_getsize_type;
-
-       */
-       if (get_type == 0) {
-               ret = pkgmgrinfo_pkginfo_get_total_size(handle, &size);
-               tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "pkgmgrinfo_pkginfo_get_total_size[pkgid=%s] failed", pkgid);
+       long long total = 0;
+       long long ret = 0;
+       int q = 0; /*quotient*/
+       int r = 0; /*remainder*/
+       DIR *dp = NULL;
+       struct dirent *ep = NULL;
+       struct stat fileinfo;
+       char abs_filename[FILENAME_MAX] = { 0, };
+       if(dirname == NULL) {
+               _LOGE("dirname is NULL");
+               return PMINFO_R_ERROR;
+       }
+       dp = opendir(dirname);
+       if (dp != NULL) {
+               while ((ep = readdir(dp)) != NULL) {
+                       if (!strcmp(ep->d_name, ".") ||
+                               !strcmp(ep->d_name, "..")) {
+                               continue;
+                       }
+                       snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname,
+                                ep->d_name);
+                       if (lstat(abs_filename, &fileinfo) < 0)
+                               perror(abs_filename);
+                       else {
+                               if (S_ISDIR(fileinfo.st_mode)) {
+                                       total += fileinfo.st_size;
+                                       if (strcmp(ep->d_name, ".")
+                                           && strcmp(ep->d_name, "..")) {
+                                               ret = __calculate_dir_size
+                                                   (abs_filename);
+                                               total = total + ret;
+                                       }
+                               } else if (S_ISLNK(fileinfo.st_mode)) {
+                                       continue;
+                               } else {
+                                       /*It is a file. Calculate the actual
+                                       size occupied (in terms of 4096 blocks)*/
+                               q = (fileinfo.st_size / BLOCK_SIZE);
+                               r = (fileinfo.st_size % BLOCK_SIZE);
+                               if (r) {
+                                       q = q + 1;
+                               }
+                               total += q * BLOCK_SIZE;
+                               }
+                       }
+               }
+               (void)closedir(dp);
        } else {
-               ret = pkgmgrinfo_pkginfo_get_data_size(handle, &size);
-               tryvm_if(ret < 0, ret = PMINFO_R_ERROR, "pkgmgrinfo_pkginfo_get_data_size[pkgid=%s] failed", pkgid);
+               _LOGE("Couldn't open the directory\n");
+               return -1;
        }
+       return total;
 
-       vconf_set_int(VCONFKEY_PKGMGR_STATUS, size);
+}
 
-catch:
+static int __get_total_size(char *pkgid, int *size)
 
-       pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
-       pkgmgr_installer_free(pi);
+{
+       char device_path[MAX_PKG_BUF_LEN] = { '\0', };
+       long long rw_size = 0;
+       long long ro_size= 0;
+       long long tmp_size= 0;
+       long long total_size= 0;
+       struct stat fileinfo;
+       int ret = -1;
+
+       /* RW area */
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/bin", PKG_RW_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               rw_size += tmp_size;
+               }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/info", PKG_RW_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                       rw_size += tmp_size;
+               }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/res", PKG_RW_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                       rw_size += tmp_size;
+               }
+       }
 
-       return ret;
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/data", PKG_RW_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               rw_size += tmp_size;
+               }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/shared", PKG_RW_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               rw_size += tmp_size;
+       }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/setting", PKG_RW_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               rw_size += tmp_size;
+               }
+       }
+#if 1
+       /* RO area */
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/bin", PKG_RO_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               ro_size += tmp_size;
+               }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/info", PKG_RO_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               ro_size += tmp_size;
+               }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/res", PKG_RO_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               ro_size += tmp_size;
+               }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/data", PKG_RO_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               ro_size += tmp_size;
+               }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/shared", PKG_RO_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               ro_size += tmp_size;
+       }
+       }
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/setting", PKG_RO_PATH, pkgid);
+       if (lstat(device_path, &fileinfo) == 0) {
+               if (!S_ISLNK(fileinfo.st_mode)) {
+                       tmp_size = __calculate_dir_size(device_path);
+                       if (tmp_size > 0)
+                               ro_size += tmp_size;
+               }
+       }
+#endif
+       /* Total size */
+       total_size = rw_size + ro_size;
+       *size = (int)total_size;
+
+       return PMINFO_R_OK;
+}
+
+static int __get_data_size(char *pkgid, int *size)
+{
+       char device_path[MAX_PKG_BUF_LEN] = { '\0', };
+       long long total_size= 0;
+
+       snprintf(device_path, MAX_PKG_BUF_LEN, "%s%s/data", PKG_RW_PATH, pkgid);
+       if (access(device_path, R_OK) == 0)
+               total_size = __calculate_dir_size(device_path);
+       if (total_size < 0)
+               return PMINFO_R_ERROR;
+
+       *size = (int)total_size;
+
+       return PMINFO_R_OK;
+}
+
+static int __pkg_list_cb (const pkgmgrinfo_pkginfo_h handle, void *user_data)
+{
+       int ret = -1;
+       char *pkgid;
+
+       int size = 0;
+
+       ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
+       if(ret < 0) {
+               printf("pkgmgr_pkginfo_get_pkgid() failed\n");
+       }
+
+       __get_total_size(pkgid, &size);
+
+       _LOGD("pkg=[%s], size=[%d]\n", pkgid, size);
+
+       return 0;
 }
 
 int main(int argc, char *argv[])
 {
        int ret = 0;
+       int size = 0;
+       int get_type = 0;
+       char *pkgid = NULL;
 
-       ret = _pkg_getsize(argc, argv);
-       if (ret < 0) {
-               _LOGE("_pkg_getsize failed \n");
-               return -1;
+       pkgid = argv[0];
+       get_type = atoi(argv[1]);
+
+       if (get_type == PM_GET_TOTAL_SIZE) {
+               ret = __get_total_size(pkgid, &size);
+       } else if(get_type == PM_GET_DATA_SIZE) {
+               ret = __get_data_size(pkgid, &size);
+       } else if(get_type == PM_GET_ALL_PKGS) {
+               ret = pkgmgrinfo_pkginfo_get_list(__pkg_list_cb, NULL);
        }
+       if (ret < 0)
+               _LOGD("_pkg_getsize fail \n");
+       else
+               _LOGD("_pkg_getsize success \n");
 
-       _LOGE("_pkg_getsize success \n");
+       vconf_set_int(VCONFKEY_PKGMGR_STATUS, size);
        return 0;
 }
index c7158e9..9693a1a 100755 (executable)
@@ -43,8 +43,6 @@ static int __get_app_list(char *pkgid);
 static int __get_app_category_list(char *appid);
 static int __get_app_metadata_list(char *appid);
 static int __get_app_control_list(char *appid);
-static int __get_app_visibility(char *appid);
-static int __set_app_visibility(char *appid);
 static int __get_pkg_list(void);
 static int __get_installed_app_list();
 static int __add_app_filter(void);
@@ -302,10 +300,6 @@ static void __print_usage()
        printf("\tpkginfo --pkg-flt\n\n");
        printf("To add metadata filter values\n");
        printf("\tpkginfo --metadata-flt\n\n");
-       printf("To get guest mode visibility of a particular application\n");
-       printf("\tpkginfo --getvisibility <appid>\n\n");
-       printf("To set guest mode visibility of a particular application\n");
-       printf("\tpkginfo --setvisibility <appid>\n\n");
 }
 
 static void __print_arg_filter_usage()
@@ -1564,6 +1558,23 @@ static int __insert_manifest_in_db(char *manifest)
        return 0;
 }
 
+static int __fota_insert_manifest_in_db(char *manifest)
+{
+       int ret = 0;
+       char *temp[] = {"fota=true", NULL};
+
+       if (manifest == NULL) {
+               printf("Manifest file is NULL\n");
+               return -1;
+       }
+       ret = pkgmgr_parser_parse_manifest_for_installation(manifest, temp);
+       if (ret < 0) {
+               printf("insert in db failed\n");
+               return -1;
+       }
+       return 0;
+}
+
 static int __remove_manifest_from_db(char *manifest)
 {
        int ret = 0;
@@ -1915,46 +1926,6 @@ static int __get_app_control_list(char *appid)
        return 0;
 }
 
-static int __get_app_visibility(char *appid)
-{
-       int ret = -1;
-       bool status = true;
-       pkgmgr_appinfo_h handle;
-       ret = pkgmgr_appinfo_get_appinfo(appid, &handle);
-       if (ret < 0) {
-               printf("Failed to get handle\n");
-               return -1;
-       }
-       ret = pkgmgrinfo_appinfo_is_guestmode_visibility(handle, &status);
-       if (ret < 0) {
-               printf("pkgmgrinfo_appinfo_is_guestmode_visibility failed\n");
-               pkgmgr_appinfo_destroy_appinfo(handle);
-               return -1;
-       }
-       pkgmgr_appinfo_destroy_appinfo(handle);
-       printf("visibility Status is %d\n",status);
-       return status;
-}
-
-static int __set_app_visibility(char *appid)
-{
-       int ret = 0;
-       int value = 0;
-       pkgmgrinfo_appinfo_h handle;
-       printf("Enter [0/1]: 0--Hide, 1-Show\n");
-       value = __get_integer_input_data();
-       ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
-       if (ret != PMINFO_R_OK)
-               return -1;
-       ret = pkgmgrinfo_appinfo_set_guestmode_visibility(handle, value);
-       if (ret != PMINFO_R_OK) {
-               pkgmgrinfo_appinfo_destroy_appinfo(handle);
-               return -1;
-       }
-       pkgmgrinfo_appinfo_destroy_appinfo(handle);
-       return 0;
-}
-
 static int __set_app_enabled(char *appid, bool enabled)
 {
        int ret = -1;
@@ -2312,6 +2283,12 @@ int main(int argc, char *argv[])
                        printf("insert in db failed\n");
                        goto end;
                }
+       } else if (strcmp(argv[1], "--fota") == 0) {
+               ret = __fota_insert_manifest_in_db(argv[2]);
+               if (ret == -1) {
+                       printf("insert in db failed\n");
+                       goto end;
+               }
        } else if (strcmp(argv[1], "--rmd") == 0) {
                ret = __remove_manifest_from_db(argv[2]);
                if (ret == -1) {
@@ -2366,18 +2343,6 @@ int main(int argc, char *argv[])
                        printf("get app control list failed\n");
                        goto end;
                }
-       } else if (strcmp(argv[1], "--getvisibility") == 0) {
-               ret = __get_app_visibility(argv[2]);
-               if (ret == -1) {
-                       printf("get app visibility failed\n");
-                       goto end;
-               }
-       } else if (strcmp(argv[1], "--setvisibility") == 0) {
-               ret = __set_app_visibility(argv[2]);
-               if (ret == -1) {
-                       printf("set app visibility failed\n");
-                       goto end;
-               }
        } else
                __print_usage();
 
index bbd4939..f1a6d6c 100755 (executable)
@@ -124,7 +124,7 @@ int initdb_load_directory(const char *directory)
        int ret;
        char buf[BUFSZE];
        int total_cnt = 0;
-//     int ok_cnt = 0;
+       int ok_cnt = 0;
 
        // desktop file
        dir = opendir(directory);
index e9b2ad1..a7870c3 100644 (file)
@@ -1,14 +1,14 @@
 #!/bin/sh
 #
 
-_pkg_recovery_path="/opt/share/packages/.recovery"
-_pkg_recovery_file="/opt/share/packages/.recovery/*"
+_pkg_recovery_path="/opt/share/packages/.recovery/pkgmgr"
+_pkg_recovery_file="/opt/share/packages/.recovery/pkgmgr/*"
 
 FILE_LIST=`ls $_pkg_recovery_path`
 if [ -n "$FILE_LIST" ]; then
        echo "There are packages to recovery"
-       /usr/bin/wrt-installer -v
-       /usr/bin/osp-installer -v
+       /usr/bin/wrt-installer -b
+       /usr/bin/osp-installer -b
 
        echo "delete recovery files"
        rm $_pkg_recovery_file
index bfc12ed..3ffffe5 100755 (executable)
@@ -336,7 +336,7 @@ static void __apply_shared_privileges(char *pkgname, int flag)
        else
                snprintf(dirpath, BUFF_SIZE, "/opt/usr/apps/%s/shared/res", pkgname);
        if (__is_dir(dirpath))
-               __pkg_smack_change_smack_label(dirpath, "_", 0);/*0 is SMACK_LABEL_ACCESS*/
+               __pkg_smack_setup_path(pkgname, dirpath, RPM_PATH_ANY_LABEL, "_");
        memset(dirpath, '\0', BUFF_SIZE);
 
        /*/shared/data dir. setup path and change group to 'app'*/