X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=client%2Fsrc%2Fpkgmgr_client_connection.c;h=0c7d47148f2dcd64db9c559f84abacf14ae7e05f;hb=bebaf7844a20d4698caefecafceccac55dad62c3;hp=17372fd4c1ec653f0ec2468c40ea8e75493c275e;hpb=65be0a75c06c297f36561c459be5b3110e1c1c02;p=platform%2Fcore%2Fappfw%2Fslp-pkgmgr.git diff --git a/client/src/pkgmgr_client_connection.c b/client/src/pkgmgr_client_connection.c index 17372fd..0c7d471 100644 --- a/client/src/pkgmgr_client_connection.c +++ b/client/src/pkgmgr_client_connection.c @@ -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)