summaryrefslogtreecommitdiffstats
path: root/src/lib/abrt_dbus.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/abrt_dbus.c')
-rw-r--r--src/lib/abrt_dbus.c248
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;