Implement app signal related with app disable/enable 32/57832/8 accepted/tizen/mobile/20160202.114604 accepted/tizen/mobile/20160203.051928 accepted/tizen/tv/20160202.114652 accepted/tizen/tv/20160203.051945 accepted/tizen/wearable/20160202.114731 accepted/tizen/wearable/20160203.052014 submit/tizen/20160201.060916 submit/tizen/20160202.002216 submit/tizen/20160202.010556 submit/tizen/20160202.023804 submit/tizen/20160203.003555
authorJunghyun Yeon <jungh.yeon@samsung.com>
Mon, 25 Jan 2016 06:15:11 +0000 (15:15 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Mon, 1 Feb 2016 05:17:42 +0000 (14:17 +0900)
Changes applied at
[pkgmgr-tool][pkgmgr-info][slp-pkgmgr][pkgmgr-server]

Change-Id: I0e7af16a23329fd4f364e6d5932e8bc24d43ef0a
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
client/include/package-manager.h
client/src/pkgmgr.c
comm/comm_client.h
comm/comm_client_gdbus.c
comm/comm_config.h
comm/pkgmgr_installer.c
comm/pkgmgr_installer.h
packaging/pkgmgr.spec

index 4b0459f..392b9b8 100644 (file)
@@ -110,6 +110,7 @@ extern "C" {
 #define PKGMGR_CLIENT_STATUS_CLEAR_DATA                                        0x10
 #define PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS                  0x20
 #define PKGMGR_CLIENT_STATUS_GET_SIZE                          0x40
+#define PKGMGR_CLIENT_STATUS_ENABLE_DISABLE_APP                                0x80
 /** @} */
 
 /* new common error codes */
@@ -273,6 +274,10 @@ typedef int (*pkgmgr_handler)(uid_t target_uid, int req_id, const char *pkg_type
                                const char *pkgid, const char *key,
                                const char *val, const void *pmsg, void *data);
 
+typedef int (*pkgmgr_app_handler)(uid_t target_uid, int req_id, const char *pkg_type,
+                               const char *pkgid, const char *appid, const char *key,
+                               const char *val, const void *pmsg, void *data);
+
 typedef void (*pkgmgr_pkg_size_info_receive_cb)(pkgmgr_client *pc, const char *pkgid,
                const pkg_size_info_t *size_info, void *user_data);
 
@@ -495,6 +500,7 @@ int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
                                 const char *pkgid);
 int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
                                 const char *pkgid, uid_t uid);
+
 /**
  * @brief      This API activates package.
  *
@@ -502,72 +508,79 @@ int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
  *
  * @param[in]  pc      pkgmgr_client
  * @param[in]  appid   applicaiton id
+ * @param[in]  argv    argument vector
  * @return     request_id (>0) if success, error code(<0) if fail\n
  * @retval     PKGMGR_R_OK     success
  * @retval     PKGMGR_R_EINVAL invalid argument
  * @retval     PKGMGR_R_ECOMM  communication error
 */
-int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid);
-int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid, uid_t uid);
+int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[]);
+int pkgmgr_client_usr_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[], uid_t uid);
+
 /**
- * @brief      This API activates package.
+ * @brief      This API deactivates app.
  *
  * This API is for package-manager client application.\n
  *
  * @param[in]  pc      pkgmgr_client
  * @param[in]  appid   applicaiton id
- * @param[in]  argv    argument vector
+ * @param[in]  app_event_cb    user callback
  * @return     request_id (>0) if success, error code(<0) if fail\n
  * @retval     PKGMGR_R_OK     success
  * @retval     PKGMGR_R_EINVAL invalid argument
  * @retval     PKGMGR_R_ECOMM  communication error
 */
-int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[]);
-int pkgmgr_client_usr_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[], uid_t uid);
+int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb);
+int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid);
+
 /**
- * @brief      This API deactivates package.
+ * @brief      This API deactivates global app for user specified by uid.
  *
  * This API is for package-manager client application.\n
  *
  * @param[in]  pc      pkgmgr_client
  * @param[in]  appid   applicaiton id
+ * @param[in]  app_event_cb    user callback
+ * @param[in]  uid     user id
  * @return     request_id (>0) if success, error code(<0) if fail\n
  * @retval     PKGMGR_R_OK     success
  * @retval     PKGMGR_R_EINVAL invalid argument
  * @retval     PKGMGR_R_ECOMM  communication error
 */
-int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid);
-int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, uid_t uid);
+int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid);
 
 /**
- * @brief      This API deactivates global app for user specified by uid.
+ * @brief      This API activates app.
  *
  * This API is for package-manager client application.\n
  *
  * @param[in]  pc      pkgmgr_client
  * @param[in]  appid   applicaiton id
+ * @param[in]  app_event_cb    user callback
  * @param[in]  uid     user id
  * @return     request_id (>0) if success, error code(<0) if fail\n
  * @retval     PKGMGR_R_OK     success
  * @retval     PKGMGR_R_EINVAL invalid argument
  * @retval     PKGMGR_R_ECOMM  communication error
 */
-int pkgmgr_client_usr_deactivate_global_app(pkgmgr_client *pc, const char *appid, uid_t uid);
+int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb);
+int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid);
 
 /**
- * @brief      This API deactivates global app for user specified by uid.
+ * @brief      This API activates global app for user specified by uid.
  *
  * This API is for package-manager client application.\n
  *
  * @param[in]  pc      pkgmgr_client
  * @param[in]  appid   applicaiton id
+ * @param[in]  app_event_cb    user callback
  * @param[in]  uid     user id
  * @return     request_id (>0) if success, error code(<0) if fail\n
  * @retval     PKGMGR_R_OK     success
  * @retval     PKGMGR_R_EINVAL invalid argument
  * @retval     PKGMGR_R_ECOMM  communication error
 */
-int pkgmgr_client_usr_activate_global_app(pkgmgr_client *pc, const char *appid, uid_t uid);
+int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid);
 
 /**
  * @brief      This API deletes application's private data.
@@ -616,6 +629,21 @@ int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
                                    void *data);
 
 /**
+ * @brief      This API request to listen the pkgmgr's broadcasting about apps
+ *
+ * This API is for package-manager client application.\n
+ *
+ * @param[in]  pc      pkgmgr_client
+ * @param[in]  event_cb        user callback
+ * @param[in]  data            user data
+ * @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_listen_app_status(pkgmgr_client *pc, pkgmgr_app_handler event_cb,
+                                   void *data);
+
+/**
  * @brief      This API broadcasts pkgmgr's status
  *
  * This API is for package-manager client application.\n
index 77ad68c..e82154e 100644 (file)
@@ -61,6 +61,7 @@ typedef struct _req_cb_info {
        int request_id;
        char *req_key;
        pkgmgr_handler event_cb;
+       pkgmgr_app_handler app_event_cb;
        void *data;
        struct _req_cb_info *next;
 } req_cb_info;
@@ -68,6 +69,7 @@ typedef struct _req_cb_info {
 typedef struct _listen_cb_info {
        int request_id;
        pkgmgr_handler event_cb;
+       pkgmgr_app_handler app_event_cb;
        void *data;
        struct _listen_cb_info *next;
 } listen_cb_info;
@@ -217,6 +219,7 @@ static void __add_op_cbinfo(pkgmgr_client_t * pc, int request_id,
        cb_info->event_cb = event_cb;
        cb_info->data = data;
        cb_info->next = NULL;
+       cb_info->app_event_cb = NULL;
        pc->new_event_cb = new_event_cb;
 
        if (pc->info.request.rhead == NULL)
@@ -232,6 +235,39 @@ static void __add_op_cbinfo(pkgmgr_client_t * pc, int request_id,
        }
 }
 
+static void __add_op_app_cbinfo(pkgmgr_client_t * pc, int request_id,
+                           const char *req_key, pkgmgr_app_handler app_event_cb, void *data)
+{
+       req_cb_info *cb_info;
+       req_cb_info *current;
+       req_cb_info *prev;
+
+       cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
+       if (cb_info == NULL) {
+               DBG("calloc failed");
+               return;
+       }
+       cb_info->request_id = request_id;
+       cb_info->req_key = strdup(req_key);
+       cb_info->event_cb = NULL;
+       cb_info->app_event_cb = app_event_cb;
+       cb_info->data = data;
+       cb_info->next = NULL;
+       pc->new_event_cb = NULL;
+
+       if (pc->info.request.rhead == NULL)
+               pc->info.request.rhead = cb_info;
+       else {
+               current = prev = pc->info.request.rhead;
+               while (current) {
+                       prev = current;
+                       current = current->next;
+               }
+
+               prev->next = cb_info;
+       }
+}
+
 static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
 {
        req_cb_info *tmp;
@@ -253,6 +289,36 @@ static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
        return NULL;
 }
 
+static void __add_app_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
+                             pkgmgr_app_handler event_cb, void *data)
+{
+       listen_cb_info *cb_info;
+       listen_cb_info *current;
+       listen_cb_info *prev;
+
+       cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
+       if (cb_info == NULL) {
+               DBG("calloc failed");
+               return;
+       }
+       cb_info->request_id = request_id;
+       cb_info->app_event_cb = event_cb;
+       cb_info->data = data;
+       cb_info->next = NULL;
+
+       if (pc->info.listening.lhead == NULL)
+               pc->info.listening.lhead = cb_info;
+       else {
+               current = prev = pc->info.listening.lhead;
+               while (current) {
+                       prev = current;
+                       current = current->next;
+               }
+
+               prev->next = cb_info;
+       }
+}
+
 static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
                              pkgmgr_handler event_cb, void *data)
 {
@@ -286,8 +352,8 @@ static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
 
 static void __operation_callback(void *cb_data, uid_t target_uid,
                                 const char *req_id, const char *pkg_type,
-                                const char *pkgid, const char *key,
-                                const char *val)
+                                const char *pkgid,  const char *appid,
+                                const char *key,    const char *val)
 {
        pkgmgr_client_t *pc;
        req_cb_info *cb_info;
@@ -302,7 +368,18 @@ static void __operation_callback(void *cb_data, uid_t target_uid,
        }
 
        /* call callback */
-       if (cb_info->event_cb) {
+       if (appid != NULL && strlen(appid) != 0) {
+               /* run app callback */
+               if (pc->new_event_cb)
+                       cb_info->app_event_cb(target_uid, cb_info->request_id,
+                                       pkg_type, pkgid, appid, key, val, pc,
+                                       cb_info->data);
+               else
+                       cb_info->app_event_cb(target_uid, cb_info->request_id,
+                                       pkg_type, pkgid, appid, key, val, NULL,
+                                       cb_info->data);
+       } else {
+               /* run pkg callback */
                if (pc->new_event_cb)
                        cb_info->event_cb(target_uid, cb_info->request_id,
                                        pkg_type, pkgid, key, val, pc,
@@ -318,8 +395,8 @@ static void __operation_callback(void *cb_data, uid_t target_uid,
 
 static void __status_callback(void *cb_data, uid_t target_uid,
                              const char *req_id, const char *pkg_type,
-                             const char *pkgid,  const char *key,
-                             const char *val)
+                             const char *pkgid,  const char *appid,
+                             const char *key,    const char *val)
 {
        pkgmgr_client_t *pc;
        listen_cb_info *tmp;
@@ -328,9 +405,17 @@ static void __status_callback(void *cb_data, uid_t target_uid,
 
        tmp = pc->info.listening.lhead;
        while (tmp) {
-               if (tmp->event_cb(target_uid, tmp->request_id, pkg_type, pkgid,
-                                 key, val, NULL, tmp->data) != 0)
-                       break;
+               if (appid != NULL && strlen(appid) != 0) {
+                       /* run app callback */
+                       if (tmp->app_event_cb(target_uid, tmp->request_id, pkg_type, pkgid,
+                                               appid, key, val, NULL, tmp->data) != 0)
+                               break;
+               } else {
+                       /* run pkg callback */
+                       if (tmp->event_cb(target_uid, tmp->request_id, pkg_type, pkgid,
+                                         key, val, NULL, tmp->data) != 0)
+                               break;
+               }
                tmp = tmp->next;
        }
 
@@ -726,6 +811,40 @@ static int __change_op_cb_for_getsize(pkgmgr_client *pc)
        return PKGMGR_R_OK;
 }
 
+static int __change_op_cb_for_enable_disable(pkgmgr_client *pc)
+{
+       int ret = -1;
+
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
+       pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
+
+       /*  free listening head */
+       req_cb_info *tmp = NULL;
+       req_cb_info *prev = NULL;
+       for (tmp = mpc->info.request.rhead; tmp;) {
+               prev = tmp;
+               tmp = tmp->next;
+               free(prev);
+       }
+
+       /* free dbus connection */
+       ret = comm_client_free(mpc->info.request.cc);
+       retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
+
+       /* Manage pc for seperated event */
+       mpc->ctype = PC_REQUEST;
+       mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_DISABLE_APP;
+
+
+       mpc->info.request.cc = comm_client_new();
+       retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
+
+       ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ENABLE_DISABLE_APP, mpc->info.request.cc, __operation_callback, pc);
+       retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
+
+       return PKGMGR_R_OK;
+}
+
 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
                const char *pkgid, const char *key,
                const char *value, const void *pc, void *user_data)
@@ -1231,11 +1350,26 @@ API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
        return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, GLOBAL_USER);
 }
 
+/* TODO: deprecate? */
+API int pkgmgr_client_usr_activate_appv(pkgmgr_client *pc, const char *appid,
+               char *const argv[], uid_t uid)
+{
+       return pkgmgr_client_usr_activate_app(pc, appid, NULL, uid);
+}
+
+API int pkgmgr_client_activate_appv(pkgmgr_client *pc, const char *appid,
+               char *const argv[])
+{
+       return pkgmgr_client_usr_activate_app(pc, appid, NULL, GLOBAL_USER);
+}
+
 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
-               uid_t uid)
+               pkgmgr_app_handler app_event_cb, uid_t uid)
 {
        GVariant *result;
        int ret = PKGMGR_R_ECOMM;
+       int req_id;
+       char *req_key = NULL;
        pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
 
        if (pc == NULL || appid == NULL) {
@@ -1243,39 +1377,43 @@ API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
                return PKGMGR_R_EINVAL;
        }
 
+       if (__change_op_cb_for_enable_disable(mpc) < 0) {
+               ERR("__change_op_cb_for_enable_disable failed");
+               return PKGMGR_R_ESYSTEM;
+       }
+
        result = comm_client_request(mpc->info.request.cc, "enable_app",
                        g_variant_new("(us)", uid, appid));
        if (result == NULL)
                return PKGMGR_R_ECOMM;
-       g_variant_get(result, "(i)", &ret);
-       g_variant_unref(result);
+       g_variant_get(result, "(i&s)", &ret, &req_key);
+       if (req_key == NULL) {
+               g_variant_unref(result);
+               return PKGMGR_R_ECOMM;
+       }
+       if (ret != PKGMGR_R_OK) {
+               g_variant_unref(result);
+               return ret;
+       }
 
+       req_id = _get_request_id();
+       __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
+       g_variant_unref(result);
        return ret;
 }
 
-API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid)
-{
-       return pkgmgr_client_usr_activate_app(pc, appid, GLOBAL_USER);
-}
-
-/* TODO: deprecate? */
-API int pkgmgr_client_usr_activate_appv(pkgmgr_client *pc, const char *appid,
-               char *const argv[], uid_t uid)
-{
-       return pkgmgr_client_usr_activate_app(pc, appid, uid);
-}
-
-API int pkgmgr_client_activate_appv(pkgmgr_client *pc, const char *appid,
-               char *const argv[])
+API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid, pkgmgr_app_handler app_event_cb)
 {
-       return pkgmgr_client_usr_activate_app(pc, appid, GLOBAL_USER);
+       return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb, GLOBAL_USER);
 }
 
-API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
-               uid_t uid)
+API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
+                                const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
 {
        GVariant *result;
        int ret = PKGMGR_R_ECOMM;
+       int req_id;
+       char *req_key = NULL;
        pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
 
        if (pc == NULL || appid == NULL) {
@@ -1283,48 +1421,85 @@ API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
                return PKGMGR_R_EINVAL;
        }
 
-       result = comm_client_request(mpc->info.request.cc, "disable_app",
+       if (__change_op_cb_for_enable_disable(mpc) < 0) {
+               ERR("__change_op_cb_for_enable_disable failed");
+               return PKGMGR_R_ESYSTEM;
+       }
+
+       result = comm_client_request(mpc->info.request.cc, "enable_global_app_for_uid",
                        g_variant_new("(us)", uid, appid));
        if (result == NULL)
                return PKGMGR_R_ECOMM;
-       g_variant_get(result, "(i)", &ret);
-       g_variant_unref(result);
+       g_variant_get(result, "(i&s)", &ret, &req_key);
+       if (req_key == NULL) {
+               g_variant_unref(result);
+               return PKGMGR_R_ECOMM;
+       }
+       if (ret != PKGMGR_R_OK) {
+               g_variant_unref(result);
+               return ret;
+       }
 
-       return ret;
-}
+       req_id = _get_request_id();
+       __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
 
-API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid)
-{
-       return pkgmgr_client_usr_deactivate_app(pc, appid, GLOBAL_USER);
+       return ret;
 }
 
-API int pkgmgr_client_usr_deactivate_global_app(pkgmgr_client *pc,
-                                const char *appid, uid_t uid)
+API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
+               pkgmgr_app_handler app_event_cb, uid_t uid)
 {
        GVariant *result;
        int ret = PKGMGR_R_ECOMM;
        pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
+       int req_id;
+       char *req_key = NULL;
 
        if (pc == NULL || appid == NULL) {
                ERR("invalid parameter");
                return PKGMGR_R_EINVAL;
        }
 
-       result = comm_client_request(mpc->info.request.cc, "disable_global_app",
+       /* FIXME */
+       if (__change_op_cb_for_enable_disable(mpc) < 0) {
+               ERR("__change_op_cb_for_enable_disable failed");
+               return PKGMGR_R_ESYSTEM;
+       }
+
+       result = comm_client_request(mpc->info.request.cc, "disable_app",
                        g_variant_new("(us)", uid, appid));
+
        if (result == NULL)
                return PKGMGR_R_ECOMM;
-       g_variant_get(result, "(i)", &ret);
-       g_variant_unref(result);
+       g_variant_get(result, "(i&s)", &ret, &req_key);
+       if (req_key == NULL) {
+               g_variant_unref(result);
+               return PKGMGR_R_ECOMM;
+       }
+       if (ret != PKGMGR_R_OK) {
+               g_variant_unref(result);
+               return ret;
+       }
 
+       req_id = _get_request_id();
+       __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
+
+       g_variant_unref(result);
        return ret;
 }
 
-API int pkgmgr_client_usr_activate_global_app(pkgmgr_client *pc,
-                                const char *appid, uid_t uid)
+API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
+{
+       return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, GLOBAL_USER);
+}
+
+API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
+                                const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
 {
        GVariant *result;
        int ret = PKGMGR_R_ECOMM;
+       int req_id;
+       char *req_key = NULL;
        pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
 
        if (pc == NULL || appid == NULL) {
@@ -1332,13 +1507,28 @@ API int pkgmgr_client_usr_activate_global_app(pkgmgr_client *pc,
                return PKGMGR_R_EINVAL;
        }
 
-       result = comm_client_request(mpc->info.request.cc, "enable_global_app",
+       if (__change_op_cb_for_enable_disable(mpc) < 0) {
+               ERR("__change_op_cb_for_enable_disable failed");
+               return PKGMGR_R_ESYSTEM;
+       }
+
+       result = comm_client_request(mpc->info.request.cc, "disable_global_app_for_uid",
                        g_variant_new("(us)", uid, appid));
+
        if (result == NULL)
                return PKGMGR_R_ECOMM;
-       g_variant_get(result, "(i)", &ret);
-       g_variant_unref(result);
+       g_variant_get(result, "(i&s)", &ret, &req_key);
+       if (req_key == NULL) {
+               g_variant_unref(result);
+               return PKGMGR_R_ECOMM;
+       }
+       if (ret != PKGMGR_R_OK) {
+               g_variant_unref(result);
+               return ret;
+       }
 
+       req_id = _get_request_id();
+       __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
        return ret;
 }
 
@@ -1454,6 +1644,26 @@ API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
        return req_id;
 }
 
+API int pkgmgr_client_listen_app_status(pkgmgr_client *pc, pkgmgr_app_handler event_cb,
+                                   void *data)
+{
+       int req_id;
+       /* Check for NULL value of pc */
+       retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
+       pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
+
+       /* 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. get id */
+       req_id = _get_request_id();
+
+       /* 2. add app callback info to pkgmgr_client */
+       __add_app_stat_cbinfo(mpc, req_id, event_cb, data);
+       return req_id;
+}
+
 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
                                       const char *pkgid, const char *key,
                                       const char *val)
index 1782e9e..7e3d039 100644 (file)
@@ -37,7 +37,8 @@ enum {
 typedef struct comm_client comm_client;
 typedef void (*status_cb) (void *cb_data, uid_t target_uid, const char *req_id,
                           const char *pkg_type, const char *pkgid,
-                          const char *key, const char *val);
+                          const char *appid,    const char *key,
+                          const char *val);
 
 API comm_client *comm_client_new(void);
 API int comm_client_free(comm_client *cc);
index 71e467d..a332dd9 100644 (file)
@@ -79,6 +79,8 @@ static int __get_signal_type(const char *name)
                return COMM_STATUS_BROADCAST_UPGRADE;
        else if (strcmp(name, COMM_STATUS_BROADCAST_EVENT_GET_SIZE) == 0)
                return COMM_STATUS_BROADCAST_GET_SIZE;
+       else if (strcmp(name, COMM_STATUS_BROADCAST_EVENT_ENABLE_DISABLE_APP) == 0)
+               return COMM_STATUS_BROADCAST_ENABLE_DISABLE_APP;
        else
                return -1;
 }
@@ -108,6 +110,7 @@ void _on_signal_handle_filter(GDBusConnection *conn,
        char *pkgid = NULL;
        char *key = NULL;
        char *val = NULL;
+       char *appid = NULL;
 
        /* User's signal handler */
        struct signal_callback_data *sig_cb_data;
@@ -120,13 +123,13 @@ void _on_signal_handle_filter(GDBusConnection *conn,
        if (status_type < 0 || !(status_type & sig_cb_data->type))
                return;
 
-       g_variant_get(parameters, "(u&s&s&s&s&s)",
-                               &target_uid, &req_id, &pkg_type, &pkgid, &key, &val);
+       g_variant_get(parameters, "(u&s&s&s&s&s&s)",
+                               &target_uid, &req_id, &pkg_type, &pkgid, &appid, &key, &val);
 
        /* Run signal callback if exist */
        if (sig_cb_data && sig_cb_data->cb)
                sig_cb_data->cb(sig_cb_data->cb_data, target_uid, req_id,
-                               pkg_type, pkgid, key, val);
+                               pkg_type, pkgid, appid, key, val);
 
        return;
 }
index 8260b5a..b61d2d3 100644 (file)
@@ -48,6 +48,7 @@
 #define COMM_STATUS_BROADCAST_EVENT_INSTALL_PROGRESS "install_progress"
 #define COMM_STATUS_BROADCAST_EVENT_UPGRADE "upgrade"
 #define COMM_STATUS_BROADCAST_EVENT_GET_SIZE "get_size"
+#define COMM_STATUS_BROADCAST_EVENT_ENABLE_DISABLE_APP "enable_disable_app"
 
 /********
  * enums
@@ -104,6 +105,7 @@ enum {
        COMM_STATUS_BROADCAST_INSTALL_PROGRESS = 0x08,
        COMM_STATUS_BROADCAST_UPGRADE = 0x10,
        COMM_STATUS_BROADCAST_GET_SIZE = 0x20,
+       COMM_STATUS_BROADCAST_ENABLE_DISABLE_APP = 0x40,
 };
 
 #endif                         /* __COMM_CONFIG_H__ */
index 6f8dfb2..a71cce9 100644 (file)
@@ -81,6 +81,8 @@ static const char *__get_signal_name(pkgmgr_installer *pi, const char *key)
                return COMM_STATUS_BROADCAST_EVENT_UPGRADE;
        case PKGMGR_REQ_MOVE:
                return COMM_STATUS_BROADCAST_EVENT_MOVE;
+       case PKGMGR_REQ_ENABLE_DISABLE_APP:
+               return COMM_STATUS_BROADCAST_EVENT_ENABLE_DISABLE_APP;
        }
 
        ERR("cannot find type, send signal with type SIGNAL_STATUS");
@@ -88,6 +90,40 @@ static const char *__get_signal_name(pkgmgr_installer *pi, const char *key)
        return COMM_STATUS_BROADCAST_SIGNAL_STATUS;
 }
 
+static int __send_signal_for_app_event(pkgmgr_installer *pi, const char *pkg_type,
+               const char *pkgid, const char *appid, const char *key, const char *val)
+{
+       char *sid;
+       const char *name;
+       GError *err = NULL;
+
+       if (!pi || pi->conn == NULL || appid == NULL)
+               return -1;
+
+       sid = pi->session_id;
+       if (!sid)
+               sid = "";
+
+       name = __get_signal_name(pi, key);
+       if (name == NULL) {
+               ERR("unknown signal type");
+               return -1;
+       }
+
+       if (g_dbus_connection_emit_signal(pi->conn, NULL,
+                               COMM_STATUS_BROADCAST_OBJECT_PATH,
+                               COMM_STATUS_BROADCAST_INTERFACE, name,
+                               g_variant_new("(ussssss)", getuid(), sid,
+                                       pkg_type, pkgid, appid, key, val), &err)
+                       != TRUE) {
+               ERR("failed to send dbus signal: %s", err->message);
+               g_error_free(err);
+               return -1;
+       }
+
+       return 0;
+}
+
 static int __send_signal_for_event(pkgmgr_installer *pi, const char *pkg_type,
                const char *pkgid, const char *key, const char *val)
 {
@@ -111,8 +147,8 @@ static int __send_signal_for_event(pkgmgr_installer *pi, const char *pkg_type,
        if (g_dbus_connection_emit_signal(pi->conn, NULL,
                                COMM_STATUS_BROADCAST_OBJECT_PATH,
                                COMM_STATUS_BROADCAST_INTERFACE, name,
-                               g_variant_new("(usssss)", getuid(), sid,
-                                       pkg_type, pkgid, key, val), &err)
+                               g_variant_new("(ussssss)", getuid(), sid,
+                                       pkg_type, pkgid, "", key, val), &err)
                        != TRUE) {
                ERR("failed to send dbus signal: %s", err->message);
                g_error_free(err);
@@ -433,6 +469,28 @@ API int pkgmgr_installer_send_app_uninstall_signal(pkgmgr_installer *pi,
 }
 
 API int
+pkgmgr_installer_send_app_signal(pkgmgr_installer *pi,
+                            const char *pkg_type,
+                            const char *pkgid,
+                            const char *appid,
+                            const char *key, const char *val)
+{
+       int r = 0;
+
+       if (!pi->conn) {
+               ERR("connection is NULL");
+               return -1;
+       }
+
+       if (strcmp(key, PKGMGR_INSTALLER_UPGRADE_EVENT_STR) == 0)
+               pi->request_type = PKGMGR_REQ_UPGRADE;
+
+       r = __send_signal_for_app_event(pi, pkg_type, pkgid, appid, key, val);
+
+       return r;
+}
+
+API int
 pkgmgr_installer_send_signal(pkgmgr_installer *pi,
                             const char *pkg_type,
                             const char *pkgid,
@@ -453,6 +511,24 @@ pkgmgr_installer_send_signal(pkgmgr_installer *pi,
        return r;
 }
 
+API int pkgmgr_installer_set_request_type(pkgmgr_installer *pi, int request_type)
+{
+       if (pi == NULL)
+               return -1;
+
+       pi->request_type = request_type;
+       return 0;
+}
+
+API int pkgmgr_installer_set_session_id(pkgmgr_installer *pi, char *session_id)
+{
+       if (pi == NULL || session_id == NULL)
+               return -1;
+
+       pi->session_id = strndup(session_id, MAX_STRLEN);
+       return 0;
+}
+
 API int pkgmgr_installer_create_certinfo_set_handle(pkgmgr_instcertinfo_h *handle)
 {
        int ret = 0;
index 35ec690..e3020c4 100644 (file)
@@ -79,7 +79,8 @@ enum {
        PKGMGR_REQ_GETSIZE = 7,
        PKGMGR_REQ_UPGRADE = 8,
        PKGMGR_REQ_SMACK = 9,
-       PKGMGR_REQ_MANIFEST_DIRECT_INSTALL = 10
+       PKGMGR_REQ_MANIFEST_DIRECT_INSTALL = 10,
+       PKGMGR_REQ_ENABLE_DISABLE_APP = 11
 };
 
 enum {
@@ -629,6 +630,27 @@ int pkgmgr_installer_send_app_uninstall_signal(pkgmgr_installer *pi,
                             const char *pkgid,
                             const char *val);
 
+/**
+ * @brief      This API sets the requst info of given pkgmgr_installer.
+ *
+ *              This API is for package-manager client application.\n
+ *
+ * @param[in]pi                                pointer to pkgmgr_installer
+ * @param[in]  request_type                            request type
+ * @return     0 if success, error code(<0) if fail\n
+*/
+int pkgmgr_installer_set_request_type(pkgmgr_installer *pi, int request_type);
+
+/**
+ * @brief      This API sets the session ID.
+ *
+ *              This API is for package-manager client application.\n
+ *
+ * @param[in]  pi                              pointer to pkgmgr_installer
+ * @param[in]  session_id                              session ID to be set
+ * @return     0 if success, error code(<0) if fail\n
+*/
+int pkgmgr_installer_set_session_id(pkgmgr_installer *pi, char *session_id);
 
 /**
  * @brief      This API creates the certinfo handle.
index a32d345..f549ec3 100644 (file)
@@ -111,7 +111,8 @@ touch  %{buildroot}%{_sysconfdir}/package-manager/backend/getsize
 chmod 755 %{buildroot}%{_sysconfdir}/package-manager/backend/getsize
 touch  %{buildroot}%{_sysconfdir}/package-manager/backend/clearcache
 chmod 755 %{buildroot}%{_sysconfdir}/package-manager/backend/clearcache
-
+touch  %{buildroot}%{_sysconfdir}/package-manager/backend/app
+chmod 755 %{buildroot}%{_sysconfdir}/package-manager/backend/app
 
 %fdupes %{buildroot}