Implement pkg upgrade signal 73/300373/7
authorSangyoon Jang <jeremy.jang@samsung.com>
Mon, 23 Oct 2023 06:34:50 +0000 (15:34 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Tue, 5 Dec 2023 01:13:06 +0000 (10:13 +0900)
pkg_upgrade sends pkg upgrade signal.

Change-Id: I9c9e32b3762c09cfd2f6c70d4d7fd30019eecf27
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
client/include/package-manager.h
client/src/pkgmgr.c
client/src/pkgmgr_client_connection.c
client/src/pkgmgr_client_internal.h
installer/pkgmgr_installer.c
installer/pkgmgr_installer.h
installer/pkgmgr_installer_type.h

index 6e334a5..9c0604a 100644 (file)
@@ -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
index de6dfe6..3887f55 100644 (file)
@@ -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;
index 4600907..0c7d471 100644 (file)
@@ -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);
        }
 }
 
index cb6b147..db659d4 100644 (file)
@@ -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;
index 82285e0..fd8a09f 100644 (file)
@@ -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;
+}
index a6848f5..07b2e5e 100644 (file)
@@ -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 <pkgmgr_installer.h>
+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__ */
-
index 9463fce..074ae2e 100644 (file)
@@ -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__ */
-