From 7faf70df88b730f6f77004829e8565fadd8c716c Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Mon, 25 Jan 2016 15:15:11 +0900 Subject: [PATCH] Implement app signal related with app disable/enable Changes applied at [pkgmgr-tool][pkgmgr-info][slp-pkgmgr][pkgmgr-server] Change-Id: I0e7af16a23329fd4f364e6d5932e8bc24d43ef0a Signed-off-by: Junghyun Yeon --- client/include/package-manager.h | 54 ++++-- client/src/pkgmgr.c | 302 ++++++++++++++++++++++++++----- comm/comm_client.h | 3 +- comm/comm_client_gdbus.c | 9 +- comm/comm_config.h | 2 + comm/pkgmgr_installer.c | 80 +++++++- comm/pkgmgr_installer.h | 24 ++- packaging/pkgmgr.spec | 3 +- 8 files changed, 410 insertions(+), 67 deletions(-) diff --git a/client/include/package-manager.h b/client/include/package-manager.h index 4b0459f..392b9b8 100644 --- a/client/include/package-manager.h +++ b/client/include/package-manager.h @@ -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. @@ -615,6 +628,21 @@ int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type); 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 * diff --git a/client/src/pkgmgr.c b/client/src/pkgmgr.c index 77ad68c..e82154e 100644 --- a/client/src/pkgmgr.c +++ b/client/src/pkgmgr.c @@ -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) diff --git a/comm/comm_client.h b/comm/comm_client.h index 1782e9e..7e3d039 100644 --- a/comm/comm_client.h +++ b/comm/comm_client.h @@ -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); diff --git a/comm/comm_client_gdbus.c b/comm/comm_client_gdbus.c index 71e467d..a332dd9 100644 --- a/comm/comm_client_gdbus.c +++ b/comm/comm_client_gdbus.c @@ -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; } diff --git a/comm/comm_config.h b/comm/comm_config.h index 8260b5a..b61d2d3 100644 --- a/comm/comm_config.h +++ b/comm/comm_config.h @@ -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__ */ diff --git a/comm/pkgmgr_installer.c b/comm/pkgmgr_installer.c index 6f8dfb2..a71cce9 100644 --- a/comm/pkgmgr_installer.c +++ b/comm/pkgmgr_installer.c @@ -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); @@ -432,6 +468,28 @@ API int pkgmgr_installer_send_app_uninstall_signal(pkgmgr_installer *pi, return ret; } +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, @@ -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; diff --git a/comm/pkgmgr_installer.h b/comm/pkgmgr_installer.h index 35ec690..e3020c4 100644 --- a/comm/pkgmgr_installer.h +++ b/comm/pkgmgr_installer.h @@ -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. diff --git a/packaging/pkgmgr.spec b/packaging/pkgmgr.spec index a32d345..f549ec3 100644 --- a/packaging/pkgmgr.spec +++ b/packaging/pkgmgr.spec @@ -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} -- 2.34.1