pkg_upgrade sends pkg upgrade signal.
Change-Id: I9c9e32b3762c09cfd2f6c70d4d7fd30019eecf27
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
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,
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
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,
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;
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,
!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);
}
}
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;
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;
+}
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__ */
-
#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"
#endif
#endif /* __PKGMGR_INSTALLER_TYPE_H__ */
-