Release version 0.15.0
[platform/core/appfw/slp-pkgmgr.git] / client / src / pkgmgr_client_connection.c
index 17372fd..0c7d471 100644 (file)
@@ -103,9 +103,31 @@ struct signal_map map[] = {
                PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN},
        {PKGMGR_INSTALLER_APP_DISABLE_SPLASH_SCREEN_EVENT_STR,
                PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN},
+       {PKGMGR_INSTALLER_RES_COPY_EVENT_STR, PKGMGR_CLIENT_STATUS_RES_COPY},
+       {PKGMGR_INSTALLER_RES_CREATE_DIR_EVENT_STR,
+               PKGMGR_CLIENT_STATUS_RES_CREATE_DIR},
+       {PKGMGR_INSTALLER_RES_REMOVE_EVENT_STR,
+               PKGMGR_CLIENT_STATUS_RES_REMOVE},
+       {PKGMGR_INSTALLER_RES_UNINSTALL_EVENT_STR,
+               PKGMGR_CLIENT_STATUS_RES_UNINSTALL},
        {NULL, -1}
 };
 
+static int __get_signal_type(const char *name)
+{
+       int i;
+
+       if (name == NULL)
+               return -1;
+
+       for (i = 0; map[i].signal_str != NULL; i++) {
+               if (strcmp(map[i].signal_str, name) == 0)
+                       return map[i].signal_type;
+       }
+
+       return -1;
+}
+
 static void __handle_size_info_callback(struct cb_info *cb_info,
                const char *pkgid, const char *val)
 {
@@ -172,68 +194,35 @@ static void __handle_size_info_callback(struct cb_info *cb_info,
        }
 }
 
-static void __convert_signal(char *event_type, char *event_status,
-               char *appid, int progress, char **key, char **val)
+static void __handle_pkg_signal(const gchar *signal_name,
+               GVariant *parameters, gpointer user_data)
 {
-       *key = event_status;
-       if (strcmp(event_status, PKGMGR_INSTALLER_START_KEY_STR) == 0) {
-               *val = event_type;
-       } else if (strcmp(event_status, PKGMGR_INSTALLER_OK_EVENT_STR) == 0 ||
-                       strcmp(event_status, PKGMGR_INSTALLER_FAIL_EVENT_STR) == 0) {
-               *key = PKGMGR_INSTALLER_END_KEY_STR;
-               *val = event_status;
-       } else if (strcmp(event_status, PKGMGR_INSTALLER_APPID_KEY_STR) == 0) {
-               if (!appid) {
-                       ERR("appid is empty");
-                       return;
-               }
-               *val = appid;
-       } else if (strcmp(event_type, PKGMGR_INSTALLER_GET_SIZE_KEY_STR) == 0) {
-               *key = event_type;
-               *val = event_status;
-       }
-       // TODO: should handle cleardata / clearacache signal
-}
-
-static void __signal_handler(GDBusConnection *conn, const gchar *sender_name,
-               const gchar *object_path, const gchar *interface_name,
-               const gchar *signal_name, GVariant *parameters,
-               gpointer user_data)
-{
-       int progress = 0;
        uid_t target_uid;
-       char buf[BUFMAX];
        char *req_id;
        char *pkg_type = NULL;
        char *appid = NULL;
        char *pkgid = NULL;
-       char *event_type = NULL;
-       char *event_status = NULL;
        char *key = NULL;
        char *val = NULL;
        struct cb_info *cb_info = (struct cb_info *)user_data;
        GVariantIter *iter = NULL;
+       int signal_type;
 
-       g_variant_get(parameters, "(u&sa(sss)&s&si)", &target_uid, &req_id, &iter,
-                       &event_type, &event_status, &progress);
+       g_variant_get(parameters, "(u&sa(sss)&s&s)", &target_uid, &req_id, &iter,
+                       &key, &val);
        while (g_variant_iter_loop(iter, "(&s&s&s)", &pkgid, &appid, &pkg_type)) {
                if (cb_info->req_key) {
                        if (strcmp(cb_info->req_key, req_id) != 0)
                                continue;
+               } else {
+                       signal_type = __get_signal_type(signal_name);
+                       if (signal_type < 0 || !(cb_info->status_type & signal_type)) {
+                               g_variant_iter_free(iter);
+                               return;
+                       }
                }
 
-               /* convert event_type and event_status into key-val pair */
-               __convert_signal(event_type, event_status, appid,
-                               progress, &key, &val);
-               if (strcmp(event_status,
-                                       PKGMGR_INSTALLER_INSTALL_PERCENT_KEY_STR) == 0 ||
-                               strcmp(event_status, PKGMGR_INSTALLER_ERROR_KEY_STR) == 0) {
-                       snprintf(buf, BUFMAX - 1, "%d", progress);
-                       val = buf;
-               }
-               /* TODO: progress should be set properly when installation has
-                * completed or failed */
-
+               /* each cb_data can only has one callback */
                if (cb_info->event_cb) {
                        cb_info->event_cb(target_uid, cb_info->req_id,
                                        pkg_type, pkgid, key, val, NULL, cb_info->data);
@@ -241,11 +230,112 @@ static void __signal_handler(GDBusConnection *conn, const gchar *sender_name,
                        cb_info->app_event_cb(target_uid, cb_info->req_id,
                                        pkg_type, pkgid, appid, key, val, NULL,
                                        cb_info->data);
-               } else if (cb_info->size_info_cb)
+               } else if (cb_info->size_info_cb) {
                        __handle_size_info_callback(cb_info, pkgid, val);
+               }
 
                /* TODO: unsubscribe request callback */
        }
+       g_variant_iter_free(iter);
+}
+
+static void __handle_res_event_signal(const gchar *signal_name,
+               GVariant *parameters, gpointer user_data)
+{
+       uid_t target_uid;
+       char *req_id;
+       char *pkgid = NULL;
+       char *status = NULL;
+       char *path = NULL;
+       pkgmgr_res_event_path_state state;
+       struct cb_info *cb_info = (struct cb_info *)user_data;
+       int signal_type;
+       GVariant *extra_param = NULL;
+       pkgmgr_res_event_info_t *event_info;
+       GVariantIter *iter;
+
+       if (!cb_info->res_event_cb)
+               return;
+
+       g_variant_get(parameters, "(u&s&s&sv)", &target_uid, &req_id, &pkgid, &status, &extra_param);
+       if (!g_variant_type_equal(G_VARIANT_TYPE("(ia(si))"),
+                       g_variant_get_type(extra_param))) {
+               ERR("invalid extra parameter");
+               g_variant_unref(extra_param);
+               return;
+       }
+       if (cb_info->req_key) {
+               if (strcmp(cb_info->req_key, req_id) != 0) {
+                       g_variant_unref(extra_param);
+                       return;
+               }
+       } else {
+               signal_type = __get_signal_type(signal_name);
+               if (signal_type < 0 || !(cb_info->status_type & signal_type)) {
+                       g_variant_unref(extra_param);
+                       return;
+               }
+       }
+
+       event_info = pkgmgr_res_event_info_new();
+       if (event_info == NULL) {
+               ERR("out of memory");
+               g_variant_unref(extra_param);
+               return;
+       }
+
+       g_variant_get(extra_param, "(ia(si))", &event_info->error_code, &iter);
+
+       while (g_variant_iter_loop(iter, "(&si)", &path, &state)) {
+               if (pkgmgr_res_event_info_add_path_state(event_info,
+                               path, state) != PKGMGR_R_OK) {
+                       ERR("Fail to add path state");
+                       g_variant_unref(extra_param);
+                       g_variant_iter_free(iter);
+                       pkgmgr_res_event_info_free(event_info);
+                       return;
+               }
+       }
+       cb_info->res_event_cb(target_uid, cb_info->req_id, pkgid, signal_name,
+                       status, event_info, cb_info->data);
+       g_variant_unref(extra_param);
+       g_variant_iter_free(iter);
+       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,
+               gpointer user_data)
+{
+       if (g_variant_type_equal(G_VARIANT_TYPE("(usa(sss)ss)"),
+                       g_variant_get_type(parameters))) {
+               __handle_pkg_signal(signal_name, parameters, user_data);
+       } else if (!strcmp(signal_name, PKGMGR_INSTALLER_RES_COPY_EVENT_STR) ||
+                       !strcmp(signal_name, PKGMGR_INSTALLER_RES_REMOVE_EVENT_STR) ||
+                       !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);
+       }
 }
 
 static void __set_signal_list(int event, GList **signal_list)