From 9cc52bd02a6470a9eac2719fdfd57d06691c08b9 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Mon, 23 Oct 2023 15:34:50 +0900 Subject: [PATCH] Implement pkg upgrade signal pkg_upgrade sends pkg upgrade signal. Change-Id: I9c9e32b3762c09cfd2f6c70d4d7fd30019eecf27 Signed-off-by: Sangyoon Jang --- client/include/package-manager.h | 18 +++++++++++ client/src/pkgmgr.c | 61 +++++++++++++++++++++++++++++++++++ client/src/pkgmgr_client_connection.c | 19 +++++++++++ client/src/pkgmgr_client_internal.h | 1 + installer/pkgmgr_installer.c | 28 ++++++++++++++++ installer/pkgmgr_installer.h | 27 +++++++++++++++- installer/pkgmgr_installer_type.h | 2 +- 7 files changed, 154 insertions(+), 2 deletions(-) diff --git a/client/include/package-manager.h b/client/include/package-manager.h index 6e334a5..9c0604a 100644 --- a/client/include/package-manager.h +++ b/client/include/package-manager.h @@ -225,6 +225,8 @@ typedef void (*pkgmgr_res_handler)(uid_t target_uid, int req_id, typedef int (*pkgmgr_res_event_path_cb)(const char *path, pkgmgr_res_event_path_state state, void *user_data); +typedef void (*pkgmgr_pkg_upgrade_handler)(unsigned int progress, void *user_data); + typedef enum { PC_REQUEST = 0, PC_LISTENING, @@ -847,6 +849,22 @@ int pkgmgr_client_listen_res_status(pkgmgr_client *pc, pkgmgr_res_handler event_cb, void *data); /** + * @brief This API request to listen the pkgmgr's broadcasting about upgrade event + * + * 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 + * @retval PKGMGR_R_ENOMEM out of memory +*/ +int pkgmgr_client_listen_pkg_upgrade_status(pkgmgr_client *pc, + pkgmgr_pkg_upgrade_handler event_cb, void *data); + +/** * @brief This API request to stop listen the pkgmgr's broadcasting * * This API is for package-manager client application.\n diff --git a/client/src/pkgmgr.c b/client/src/pkgmgr.c index de6dfe6..3887f55 100644 --- a/client/src/pkgmgr.c +++ b/client/src/pkgmgr.c @@ -172,6 +172,36 @@ static struct cb_info *__create_res_event_cb_info( return cb_info; } +static struct cb_info *__create_upgrade_event_cb_info( + struct pkgmgr_client_t *client, + pkgmgr_pkg_upgrade_handler upgrade_event_cb, + void *data, const char *req_key) +{ + struct cb_info *cb_info; + + cb_info = calloc(1, sizeof(struct cb_info)); + if (cb_info == NULL) { + ERR("out of memory"); + return NULL; + } + + cb_info->client = client; + cb_info->upgrade_event_cb = upgrade_event_cb; + cb_info->data = data; + cb_info->req_id = _get_internal_request_id(); + if (req_key == NULL) + return cb_info; + + cb_info->req_key = strdup(req_key); + if (cb_info->req_key == NULL) { + ERR("out of memory"); + free(cb_info); + return NULL; + } + + return cb_info; +} + static struct cb_info *__create_size_info_cb_info( struct pkgmgr_client_t *client, pkgmgr_pkg_size_info_receive_cb size_info_cb, @@ -1954,6 +1984,37 @@ API int pkgmgr_client_listen_res_status(pkgmgr_client *pc, return cb_info->req_id; } +API int pkgmgr_client_listen_pkg_upgrade_status(pkgmgr_client *pc, + pkgmgr_pkg_upgrade_handler event_cb, void *data) +{ + int ret; + struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc; + struct cb_info *cb_info; + + if (pc == NULL || event_cb == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; + } + + if (client->pc_type != PC_LISTENING) { + ERR("client->pc_type is not PC_LISTENING"); + return PKGMGR_R_EINVAL; + } + + cb_info = __create_upgrade_event_cb_info(client, event_cb, data, NULL); + if (cb_info == NULL) + return PKGMGR_R_ENOMEM; + cb_info->status_type = client->status_type; + ret = pkgmgr_client_connection_set_callback(client, cb_info); + if (ret != PKGMGR_R_OK) { + __free_cb_info(cb_info); + return ret; + } + client->cb_info_list = g_list_append(client->cb_info_list, cb_info); + + return cb_info->req_id; +} + API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc) { struct pkgmgr_client_t *client = (struct pkgmgr_client_t *)pc; diff --git a/client/src/pkgmgr_client_connection.c b/client/src/pkgmgr_client_connection.c index 4600907..0c7d471 100644 --- a/client/src/pkgmgr_client_connection.c +++ b/client/src/pkgmgr_client_connection.c @@ -303,6 +303,23 @@ static void __handle_res_event_signal(const gchar *signal_name, pkgmgr_res_event_info_free(event_info); } +static void __handle_pkg_upgrade_event_signal(const gchar *signal_name, + GVariant *parameters, gpointer user_data) +{ + guint32 progress; + struct cb_info *cb_info = (struct cb_info *)user_data; + + if (!cb_info->upgrade_event_cb) + return; + + if (strcmp(signal_name, PKGMGR_INSTALLER_PKG_UPGRADE_EVENT_STR) != 0) { + return; + } + + g_variant_get(parameters, "(u)", &progress); + cb_info->upgrade_event_cb(progress, cb_info->data); +} + static void __signal_handler(GDBusConnection *conn, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, @@ -316,6 +333,8 @@ static void __signal_handler(GDBusConnection *conn, const gchar *sender_name, !strcmp(signal_name, PKGMGR_INSTALLER_RES_UNINSTALL_EVENT_STR) || !strcmp(signal_name, PKGMGR_INSTALLER_RES_CREATE_DIR_EVENT_STR)) { __handle_res_event_signal(signal_name, parameters, user_data); + } else if (!strcmp(signal_name, PKGMGR_INSTALLER_PKG_UPGRADE_EVENT_STR)) { + __handle_pkg_upgrade_event_signal(signal_name, parameters, user_data); } } diff --git a/client/src/pkgmgr_client_internal.h b/client/src/pkgmgr_client_internal.h index cb6b147..db659d4 100644 --- a/client/src/pkgmgr_client_internal.h +++ b/client/src/pkgmgr_client_internal.h @@ -42,6 +42,7 @@ struct cb_info { pkgmgr_app_handler app_event_cb; pkgmgr_pkg_size_info_receive_cb size_info_cb; pkgmgr_res_handler res_event_cb; + pkgmgr_pkg_upgrade_handler upgrade_event_cb; void *data; struct pkgmgr_client_t *client; GList *sid_list; diff --git a/installer/pkgmgr_installer.c b/installer/pkgmgr_installer.c index 82285e0..fd8a09f 100644 --- a/installer/pkgmgr_installer.c +++ b/installer/pkgmgr_installer.c @@ -1416,3 +1416,31 @@ API int pkgmgr_installer_send_res_signal_for_uid(pkgmgr_installer *pi, return 0; } + +API int pkgmgr_installer_send_pkg_upgrade_signal(pkgmgr_installer *pi, + unsigned int progress) +{ + const char *signal_name; + GError *err = NULL; + + if (!pi) { + ERR("invalid argument"); + return -1; + } + + signal_name = PKGMGR_INSTALLER_PKG_UPGRADE_EVENT_STR; + if (g_dbus_connection_emit_signal(pi->conn, NULL, + PKGMGR_INSTALLER_DBUS_OBJECT_PATH, + PKGMGR_INSTALLER_DBUS_INTERFACE, signal_name, + g_variant_new("(u)", progress), + &err) != TRUE) { + ERR("failed to send dbus signal"); + if (err) { + ERR("err: %s", err->message); + g_error_free(err); + } + return -1; + } + + return 0; +} diff --git a/installer/pkgmgr_installer.h b/installer/pkgmgr_installer.h index a6848f5..07b2e5e 100644 --- a/installer/pkgmgr_installer.h +++ b/installer/pkgmgr_installer.h @@ -1276,9 +1276,34 @@ int pkgmgr_installer_send_res_signal_for_uid(pkgmgr_installer *pi, uid_t uid, const char *pkgid, const char *status, pkgmgr_res_event_info *event_info); +/** + @brief Send a signal of the upgrade event status + @pre None + @post None + @see None + @param[in] pi pkgmgr_installer object + @param[in] progress progress of upgrade + @return Operation result + @retval 0 on success, otherwise -1 + @code +#include +void send_upgrade_singal(int progress) +{ + pkgmgr_installer *pi; + int r = 0; + + pi = pkgmgr_installer_new(); + if(!pi) return -1; + + pkgmgr_installer_send_pkg_upgrade_signal(pi, progress); +} + @endcode + */ +int pkgmgr_installer_send_pkg_upgrade_signal(pkgmgr_installer *pi, + unsigned int progress); + #ifdef __cplusplus } #endif #endif /* __PKGMGR_INSTALLER_H__ */ - diff --git a/installer/pkgmgr_installer_type.h b/installer/pkgmgr_installer_type.h index 9463fce..074ae2e 100644 --- a/installer/pkgmgr_installer_type.h +++ b/installer/pkgmgr_installer_type.h @@ -52,6 +52,7 @@ extern "C" { #define PKGMGR_INSTALLER_RES_CREATE_DIR_EVENT_STR "res_create_dir" #define PKGMGR_INSTALLER_RES_REMOVE_EVENT_STR "res_remove" #define PKGMGR_INSTALLER_RES_UNINSTALL_EVENT_STR "res_uninstall" +#define PKGMGR_INSTALLER_PKG_UPGRADE_EVENT_STR "pkg_upgrade" #define PKGMGR_INSTALLER_UNKNOWN_EVENT_STR "" #define PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR "disable_app" @@ -122,4 +123,3 @@ typedef enum { #endif #endif /* __PKGMGR_INSTALLER_TYPE_H__ */ - -- 2.7.4