diff options
Diffstat (limited to 'src/lib/abrt_dbus.c')
-rw-r--r-- | src/lib/abrt_dbus.c | 248 |
1 files changed, 3 insertions, 245 deletions
diff --git a/src/lib/abrt_dbus.c b/src/lib/abrt_dbus.c index 51962243..c3cb9ba4 100644 --- a/src/lib/abrt_dbus.c +++ b/src/lib/abrt_dbus.c @@ -155,99 +155,6 @@ void store_string(DBusMessageIter* iter, const char* val) free((char*)sanitized); } -/* Helper for storing map_string */ -void store_map_string(DBusMessageIter* dbus_iter, map_string_h *val) -{ - DBusMessageIter sub_iter; - /* map_string is a map. map in dbus is an array of two element structs "({...})": - * "s" (string) for key and "s" for value (in this case, also string) */ - if (!dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY, "{ss}", &sub_iter)) - die_out_of_memory(); - - GHashTableIter iter; - char *name; - char *value; - g_hash_table_iter_init(&iter, val); - while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value)) - { - DBusMessageIter sub_sub_iter; - if (!dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_sub_iter)) - die_out_of_memory(); - store_string(&sub_sub_iter, name); - store_string(&sub_sub_iter, value); - if (!dbus_message_iter_close_container(&sub_iter, &sub_sub_iter)) - die_out_of_memory(); - } - - if (!dbus_message_iter_close_container(dbus_iter, &sub_iter)) - die_out_of_memory(); -} - -/* Helpers for storing crash_data */ - -static void store_crash_item(DBusMessageIter* iter, struct crash_item *val) -{ - DBusMessageIter sub_iter; - if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "s", &sub_iter)) - die_out_of_memory(); - - /* Compat with python/cli: - * Crash item is represented in dbus as 3-element vector of strings: - * type, editable, content. - * This doesn't match daemon-side representation: { content, flags } struct - */ - store_string(&sub_iter, (val->flags & CD_FLAG_BIN ? "b" : "t")); - store_string(&sub_iter, (val->flags & CD_FLAG_ISEDITABLE ? "y" : "n")); - store_string(&sub_iter, val->content); - - if (!dbus_message_iter_close_container(iter, &sub_iter)) - die_out_of_memory(); -} -void store_crash_data(DBusMessageIter* dbus_iter, crash_data_t *val) -{ - DBusMessageIter sub_iter; - /* crash_data is a map. map in dbus is an array of two element structs "({...})": - * "s" (string) for key and "as" for value (in this case, array of strings) */ - if (!dbus_message_iter_open_container(dbus_iter, DBUS_TYPE_ARRAY, "{sas}", &sub_iter)) - die_out_of_memory(); - - GHashTableIter iter; - char *name; - struct crash_item *value; - g_hash_table_iter_init(&iter, val); - while (g_hash_table_iter_next(&iter, (void**)&name, (void**)&value)) - { - DBusMessageIter sub_sub_iter; - if (!dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_sub_iter)) - die_out_of_memory(); - store_string(&sub_sub_iter, name); - store_crash_item(&sub_sub_iter, value); - if (!dbus_message_iter_close_container(&sub_iter, &sub_sub_iter)) - die_out_of_memory(); - } - - if (!dbus_message_iter_close_container(dbus_iter, &sub_iter)) - die_out_of_memory(); -} -void store_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t *val) -{ - DBusMessageIter sub_iter; - unsigned i; - /* "array of maps". map in dbus is an array ("a") of two element structs "({...})": - * "s" (string) for key and "as" for value (in this case, array of strings) */ - if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "a{sas}", &sub_iter)) - die_out_of_memory(); - - for (i = 0; i < val->len; i++) - { - crash_data_t *crash_data = get_crash_data(val, i); - store_crash_data(&sub_iter, crash_data); - } - - if (!dbus_message_iter_close_container(iter, &sub_iter)) - die_out_of_memory(); -} - /* * Helpers for parsing DBus messages @@ -322,157 +229,6 @@ int load_charp(DBusMessageIter* iter, const char** val) return dbus_message_iter_next(iter); } -/* Helpers for loading crash_data */ - -static int load_crash_item(DBusMessageIter* iter, struct crash_item *item) -{ - int type = dbus_message_iter_get_arg_type(iter); - if (type != DBUS_TYPE_ARRAY) - { - error_msg("array expected in dbus message, but not found ('%c')", type); - return -1; - } - - /* Compat with python/cli: - * Crash item is represented in dbus as 3-element vector of strings: - * type, editable, content. - * This doesn't match daemon-side representation: { content, flags } struct - */ - - DBusMessageIter sub_iter; - dbus_message_iter_recurse(iter, &sub_iter); - - const char *typestr; - int r = load_charp(&sub_iter, &typestr); - if (r != ABRT_DBUS_MORE_FIELDS) - { - error_msg("malformed crash_item element in dbus message"); - return -1; - } - const char *editable; - r = load_charp(&sub_iter, &editable); - if (r != ABRT_DBUS_MORE_FIELDS) - { - error_msg("malformed crash_item element in dbus message"); - return -1; - } - const char *content; - r = load_charp(&sub_iter, &content); - if (r != ABRT_DBUS_LAST_FIELD) - { - error_msg("malformed crash_item element in dbus message"); - return -1; - } - item->flags = 0; - if (typestr[0] == 'b') item->flags |= CD_FLAG_BIN; - if (typestr[0] == 't') item->flags |= CD_FLAG_TXT; - if (editable[0] == 'y') item->flags |= CD_FLAG_ISEDITABLE; - if (editable[0] == 'n') item->flags |= CD_FLAG_ISNOTEDITABLE; - item->content = xstrdup(content); - return 0; -} -int load_crash_data(DBusMessageIter* iter, crash_data_t **val) -{ - *val = NULL; - - int type = dbus_message_iter_get_arg_type(iter); - if (type != DBUS_TYPE_ARRAY) - { - error_msg("array expected in dbus message, but not found ('%c')", type); - return -1; - } - - crash_data_t *result = new_crash_data(); - - DBusMessageIter sub_iter; - dbus_message_iter_recurse(iter, &sub_iter); - - bool next_exists; - int r; -//int cnt = 0; - do { - type = dbus_message_iter_get_arg_type(&sub_iter); - if (type != DBUS_TYPE_DICT_ENTRY) - { - /* When the map has 0 elements, we see DBUS_TYPE_INVALID (on the first iteration) */ - if (type == DBUS_TYPE_INVALID) - break; - error_msg("sub_iter type is not DBUS_TYPE_DICT_ENTRY (%c)!", type); - free_crash_data(result); - return -1; - } - - DBusMessageIter sub_sub_iter; - dbus_message_iter_recurse(&sub_iter, &sub_sub_iter); - - const char *key; - r = load_charp(&sub_sub_iter, &key); - if (r != ABRT_DBUS_MORE_FIELDS) - { - if (r == ABRT_DBUS_LAST_FIELD) - error_msg("malformed map element in dbus message"); - free_crash_data(result); - return -1; - } - struct crash_item *value = xzalloc(sizeof(*value)); - r = load_crash_item(&sub_sub_iter, value); - if (r != ABRT_DBUS_LAST_FIELD) - { - if (r == ABRT_DBUS_MORE_FIELDS) - error_msg("malformed map element in dbus message"); - free(value); - free_crash_data(result); - return -1; - } - g_hash_table_replace(result, xstrdup(key), value); -//cnt++; - next_exists = dbus_message_iter_next(&sub_iter); - } while (next_exists); -//log("%s: %d elems", __func__, cnt); - - *val = result; - return dbus_message_iter_next(iter); /* note: this can't fail (returns bool, thus never < 0) */ -} -int load_vector_of_crash_data(DBusMessageIter* iter, vector_of_crash_data_t **val) -{ - *val = NULL; - - int type = dbus_message_iter_get_arg_type(iter); - if (type != DBUS_TYPE_ARRAY) - { - error_msg("array expected in dbus message, but not found ('%c')", type); - return -1; - } - - DBusMessageIter sub_iter; - dbus_message_iter_recurse(iter, &sub_iter); - - vector_of_crash_data_t *result = new_vector_of_crash_data(); - - int r; -//int cnt = 0; - /* When the vector has 0 elements, we see DBUS_TYPE_INVALID here */ - type = dbus_message_iter_get_arg_type(&sub_iter); - if (type != DBUS_TYPE_INVALID) - { - do { - crash_data_t *cd = NULL; -//cnt++; - r = load_crash_data(&sub_iter, &cd); - if (r < 0) - { - free_vector_of_crash_data(result); - return r; - } - g_ptr_array_add(result, cd); - } while (r == ABRT_DBUS_MORE_FIELDS); - } -//log("%s: %d elems", __func__, cnt); - - *val = result; - return dbus_message_iter_next(iter); /* note: this can't fail (returns bool, thus never < 0) */ -} - /* * Glib integration machinery @@ -535,7 +291,9 @@ static void toggled_watch(DBusWatch *watch, void* data) app_info->event_source_id = g_io_add_watch(app_info->channel, (GIOCondition)glib_flags, handle_dbus_fd, watch); } /* else: it was already enabled */ - } else { + } + else + { if (app_info->watch_enabled) { app_info->watch_enabled = false; |