- + fixed few things pointed out by Denys
---
 src/gui-gtk/main.c |   89 +++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 71 insertions(+), 18 deletions(-)

diff --git a/src/gui-gtk/main.c b/src/gui-gtk/main.c
index 51fce15..3d6b177 100644
--- a/src/gui-gtk/main.c
+++ b/src/gui-gtk/main.c
@@ -89,6 +89,20 @@ static char *get_last_line(const char* msg)
     return xstrndup(start, end - start);
 }
 
+static void show_warning_dialog(const char* message, GtkWidget *parent)
+{
+    if (!parent)
+        parent = g_main_window;
+
+    GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
+                                        GTK_DIALOG_DESTROY_WITH_PARENT,
+                                        GTK_MESSAGE_WARNING,
+                                        GTK_BUTTONS_OK,
+                                        message
+                                        );
+    gtk_dialog_run(GTK_DIALOG(dialog));
+}
+
 static problem_data_t* get_problem_data_dbus(const char *problem_dir_path, 
GError *error)
 {
     problem_data_t *pd;
@@ -119,6 +133,7 @@ static problem_data_t* get_problem_data_dbus(const char 
*problem_dir_path, GErro
     {
         add_to_problem_data(pd, key, val);
     }
+    g_variant_unref(result);
     return pd;
 }
 
@@ -202,17 +217,7 @@ GList *get_problems_over_dbus(const char *dump_location, 
GError *error)
                                      -1,
                                      NULL,
                                      &error);
-    GList *list = NULL;
-    GVariantIter *iter;
-    gchar *str;
-    g_variant_get(result, "(as)", &iter);
-    while (g_variant_iter_loop(iter, "s", &str))
-    {
-        VERB1 log("adding: %s\n", str);
-        list = g_list_prepend(list, xstrdup(str));
-    }
-    g_variant_iter_free(iter);
-
+    GList *list = string_list_from_variant(result);
     return list;
 }
 
@@ -408,8 +413,41 @@ static int chown_dir_over_dbus(const char 
*problem_dir_path)
     {
         //TODO show a warning dialog here or on the higher level?
         error_msg(_("Can't chown '%s': %s"),problem_dir_path, error->message);
+        g_error_free(error);
         return 1;
+    }
+    return 0;
+}
+
+static int delete_problem_dirs_over_dbus(GList *problem_dir_paths)
+{
+    GError *error = NULL;
+
+    GVariant *parameters = variant_from_string_list(problem_dir_paths);
+
+    GDBusProxy * proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
+                                         G_DBUS_PROXY_FLAGS_NONE,
+                                         NULL,
+                                         ABRT_DBUS_NAME,
+                                         ABRT_DBUS_OBJECT,
+                                         ABRT_DBUS_IFACE,
+                                         NULL,
+                                         &error);
+
+    g_dbus_proxy_call_sync(proxy,
+                    "DeleteProblem",
+                    parameters,
+                    G_DBUS_CALL_FLAGS_NONE,
+                    -1,
+                    NULL,
+                    &error);
+
+    if (error)
+    {
+        //TODO show a warning dialog here or on the higher level?
+        error_msg(_("Deleting problem directory failed: %s"), error->message);
         g_error_free(error);
+        return 1;
     }
     return 0;
 }
@@ -524,11 +562,12 @@ static void delete_report(GtkTreeView *treeview)
             const char *dump_dir_name = g_value_get_string(&d_dir);
 
             VERB1 log("Deleting '%s'", dump_dir_name);
-            if (delete_dump_dir_possibly_using_abrtd(dump_dir_name) == 0)
-            {
-                gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
-            }
-            else
+
+            //TODO: I plan to implement deleting multiple items at once 
rhbz#541928
+            GList *problem_dir_paths = NULL;
+            problem_dir_paths = g_list_append(problem_dir_paths, 
xstrdup(dump_dir_name));
+
+            if (delete_problem_dirs_over_dbus(problem_dir_paths) != 0)
             {
                 /* Strange. Deletion did not succeed. Someone else deleted it?
                  * Rescan the whole list */
@@ -1073,11 +1112,25 @@ static gboolean handle_inotify_cb(GIOChannel *gio, 
GIOCondition condition, gpoin
 
 static void scan_directory_and_add_to_dirlist(const char *path)
 {
-    GList *problem_dirs = get_problems_over_dbus(path, NULL);
+    GError *error = NULL;
+    GList *problem_dirs = get_problems_over_dbus(path, error);
+
+    if (error)
+    {
+        char *message = xasprintf(_("Can't get problem list from abrt-dbus: 
%s"), error->message);
+        show_warning_dialog(message, NULL);
+        g_error_free(error);
+        free(message);
+        gtk_main_quit();
+    }
+
     if (problem_dirs)
        g_list_foreach(problem_dirs, (GFunc)add_directory_to_dirlist, NULL);
     else
-       error_msg_and_die(_("Can't get problem list from abrt-dbus"));
+       /* we can't die here, NULL == empty list which means there might be no
+        * problems in the given directory
+        */
+       VERB1 log("directory %s doesn't contain any problem directories", path);
 
     if (inotify_fd >= 0 && inotify_add_watch(inotify_fd, path, 0
     //      | IN_ATTRIB         // Metadata changed
-- 
1.7.7.6

Reply via email to