---
src/gui-gtk/Makefile.am | 6 +-
src/gui-gtk/main.c | 206 +++++++++++++++++++++++++++++++++--------------
2 files changed, 151 insertions(+), 61 deletions(-)
diff --git a/src/gui-gtk/Makefile.am b/src/gui-gtk/Makefile.am
index 734899e..2ce69c5 100644
--- a/src/gui-gtk/Makefile.am
+++ b/src/gui-gtk/Makefile.am
@@ -10,6 +10,7 @@ abrt_gui_CFLAGS = \
$(GTK_CFLAGS) \
$(LIBREPORT_GTK_CFLAGS) \
-D_GNU_SOURCE \
+ $(GIO_CFLAGS) \
-Wall -Wwrite-strings -Werror
# -I/usr/include/glib-2.0
# -I/usr/lib/glib-2.0/include
@@ -18,9 +19,10 @@ abrt_gui_CFLAGS = \
abrt_gui_LDADD = \
-lglib-2.0 \
-lgthread-2.0 \
- $(GTK_LIBS) \
+ $(GIO_LIBS) \
$(LIBREPORT_GTK_LIBS) \
- ../lib/libabrt.la
+ ../lib/libabrt.la \
+ $(GTK_LIBS)
# $(LIBNOTIFY_LIBS)
#test_report_SOURCES = \
diff --git a/src/gui-gtk/main.c b/src/gui-gtk/main.c
index f34ff3f..777d9df 100644
--- a/src/gui-gtk/main.c
+++ b/src/gui-gtk/main.c
@@ -19,11 +19,13 @@
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <sys/inotify.h>
+#include <gio/gio.h> //dbus
#if HAVE_LOCALE_H
# include <locale.h>
#endif
#include <internal_libreport_gtk.h>
#include "libabrt.h"
+#include "abrt-dbus.h"
#if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 22
# define GDK_KEY_Delete GDK_Delete
@@ -31,6 +33,7 @@
#endif
static void scan_dirs_and_add_to_dirlist(void);
+static void rescan_and_refresh(void);
static const char help_uri[] = "http://docs.fedoraproject.org/en-US/"
@@ -59,6 +62,8 @@ enum
NUM_COLUMNS
};
+gint g_authorize; /* wheter to try to authorize when getting list of problems */
+
//FIXME: maybe we can use strrchr and make this faster...
static char *get_last_line(const char* msg)
{
@@ -84,22 +89,60 @@ static char *get_last_line(const char* msg)
return xstrndup(start, end - start);
}
-static void add_directory_to_dirlist(const char *dirname)
+static problem_data_t* get_problem_data_dbus(const char *problem_dir_path, GError
*error)
+{
+ problem_data_t *pd;
+ char *key, *val;
+
+ 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);
+
+ GVariant *result = g_dbus_proxy_call_sync(proxy,
+ "GetInfo",
+ g_variant_new("(s)",
problem_dir_path),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ pd = new_problem_data();
+
+ GVariantIter *iter;
+ g_variant_get(result, "(a{ss})", &iter);
+ while (g_variant_iter_loop(iter, "{ss}", &key, &val))
+ {
+ add_to_problem_data(pd, key, val);
+ }
+ return pd;
+}
+
+static void add_directory_to_dirlist(gpointer dir, gpointer data)
{
+ const char *dirname = (const char *)dir;
/* Silently ignore *any* errors, not only EACCES.
* We saw "lock file is locked by process PID" error
* when we raced with wizard.
*/
int sv_logmode = logmode;
logmode = 0;
- struct dump_dir *dd = dd_opendir(dirname, DD_OPEN_READONLY |
DD_FAIL_QUIETLY_EACCES);
logmode = sv_logmode;
+ /*
+ struct dump_dir *dd = dd_opendir(dirname, DD_OPEN_READONLY |
DD_FAIL_QUIETLY_EACCES);
+
if (!dd)
return;
+ */
+ problem_data_t *pd = get_problem_data_dbus(dir, NULL);
char time_buf[sizeof("YYYY-MM-DD hh:mm:ss")];
time_buf[0] = '\0';
- char *time_str = dd_load_text(dd, FILENAME_TIME);
+ const char *time_str = get_problem_item_content_or_NULL(pd, FILENAME_TIME);
time_t t = 0;
if (time_str && time_str[0])
{
@@ -108,40 +151,18 @@ static void add_directory_to_dirlist(const char *dirname)
size_t time_len = strftime(time_buf, sizeof(time_buf)-1, "%Y-%m-%d
%H:%M", ptm);
time_buf[time_len] = '\0';
}
- free(time_str);
-
- char *not_reportable_reason = dd_load_text_ext(dd, FILENAME_NOT_REPORTABLE, 0
- | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
- | DD_FAIL_QUIETLY_ENOENT
- | DD_FAIL_QUIETLY_EACCES);
- char *reason = NULL;
- if (!not_reportable_reason)
- reason = dd_load_text(dd, FILENAME_REASON);
+ const char *not_reportable_reason = get_problem_item_content_or_NULL(pd,
FILENAME_NOT_REPORTABLE);
+ const char *reason = get_problem_item_content_or_NULL(pd, FILENAME_REASON);
+ //if (!not_reportable_reason)
+ // reason = get_problem_item_content_or_NULL(pd, FILENAME_REASON);
/* the source of the problem:
* - first we try to load component, as we use it on Fedora
*/
- char *source = dd_load_text_ext(dd, FILENAME_COMPONENT, 0
- | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
- | DD_FAIL_QUIETLY_ENOENT
- | DD_FAIL_QUIETLY_EACCES
- );
- /* if we don't have component, we fallback to executable */
- if (!source)
- {
- source = dd_load_text_ext(dd, FILENAME_EXECUTABLE, 0
- | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
- | DD_FAIL_QUIETLY_ENOENT
- | DD_FAIL_QUIETLY_EACCES
- );
- }
+ const char *source = get_problem_item_content_or_NULL(pd, "source");
- char *msg = dd_load_text_ext(dd, FILENAME_REPORTED_TO, 0
- | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE
- | DD_FAIL_QUIETLY_ENOENT
- | DD_FAIL_QUIETLY_EACCES
- );
+ const char *msg = get_problem_item_content_or_NULL(pd, FILENAME_REPORTED_TO);
GtkListStore *list_store;
@@ -166,16 +187,55 @@ static void add_directory_to_dirlist(const char *dirname)
COLUMN_DUMP_DIR, dirname,
COLUMN_REPORTED_TO, msg ? subm_status : NULL,
-1);
- /* this is safe, subm_status is either null or malloced string from get_last_line */
- free(not_reportable_reason);
- free(subm_status);
- free(msg);
- free(reason);
- dd_close(dd);
+ free_problem_data(pd);
+
VERB1 log("added: %s", dirname);
}
+GList *get_problems_over_dbus(const char *dump_location, GError *error)
+{
+ 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);
+
+/*
+ GDBusProxy * proxy = g_dbus_proxy_new_sync(connection,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.problems",
+ "/org/freedesktop/problems",
+ "org.freedesktop.problems",
+ NULL,
+ &error);
+*/
+
+ GVariant *result = g_dbus_proxy_call_sync(proxy,
+ g_authorize ? "GetAllProblems" :
"GetProblems",
+ g_variant_new("(s)", dump_location),
+ G_DBUS_CALL_FLAGS_NONE,
+ -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);
+
+ return list;
+}
+
static void rescan_dirs_and_add_to_dirlist(void)
{
gtk_list_store_clear(s_dumps_list_store);
@@ -344,6 +404,35 @@ static gboolean on_focus_cb(
return false; /* propagate the event further */
}
+static int chown_dir_over_dbus(const char *problem_dir_path)
+{
+ GError *error;
+ 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,
+ "ChownProblemDir",
+ g_variant_new("(s)", problem_dir_path),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ if (error)
+ {
+ //TODO show a warning dialog here or on the higher level?
+ error_msg(_("Can't chown '%s': %s"),problem_dir_path,
error->message);
+ return 1;
+ }
+ return 0;
+}
+
static void on_row_activated_cb(GtkTreeView *treeview, GtkTreePath *path,
GtkTreeViewColumn *column, gpointer user_data)
{
GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
@@ -358,8 +447,13 @@ static void on_row_activated_cb(GtkTreeView *treeview, GtkTreePath
*path, GtkTre
const char *dirname = g_value_get_string(&d_dir);
- report_problem_in_dir(dirname,
+ if (chown_dir_over_dbus(dirname) == 0)
+ {
+ report_problem_in_dir(dirname,
LIBREPORT_ANALYZE | LIBREPORT_NOWAIT |
LIBREPORT_GETPID);
+ }
+ //else
+ // TODO: show a warning dialog
}
}
}
@@ -392,6 +486,12 @@ static void on_column_change_cb(GtkTreeSortable *sortable, gpointer
user_data)
free(value);
}
+static void on_show_all_cb(GtkToggleButton *togglebutton, gpointer data)
+{
+ g_authorize = gtk_toggle_button_get_active(togglebutton);
+ rescan_and_refresh();
+}
+
static void load_sort_setting(GtkTreeSortable *sortable)
{
const char *name, *value;
@@ -754,10 +854,14 @@ static GtkWidget *create_main_window(void)
gtk_misc_set_alignment(GTK_MISC(not_subm_lbl), 0, 0);
gtk_label_set_markup(GTK_LABEL(not_subm_lbl), _("<b>Not submitted
reports</b>"));
+ GtkWidget *show_all_btn = gtk_check_button_new_with_label(_("Show all
problems"));
+ g_signal_connect(show_all_btn, "toggled", G_CALLBACK(on_show_all_cb),
NULL);
+
/* add label for not submitted tree view */
gtk_box_pack_start(GTK_BOX(not_subm_vbox), not_subm_lbl, false, false, 0);
gtk_box_pack_start(GTK_BOX(not_subm_vbox), new_problems_scroll_win, true, true, 0);
gtk_box_pack_start(GTK_BOX(main_vbox), not_subm_vbox, true, true, 0);
+ gtk_box_pack_start(GTK_BOX(main_vbox), show_all_btn, false, false, 0);
/* Two tree views */
s_treeview = gtk_tree_view_new();
@@ -988,27 +1092,11 @@ static gboolean handle_inotify_cb(GIOChannel *gio, GIOCondition
condition, gpoin
static void scan_directory_and_add_to_dirlist(const char *path)
{
- DIR *dp = opendir(path);
- if (!dp)
- {
- /* We don't want to yell if, say, $HOME/.abrt/spool doesn't exist */
- //perror_msg("Can't open directory '%s'", path);
- return;
- }
-
- struct dirent *dent;
- while ((dent = readdir(dp)) != NULL)
- {
- if (dot_or_dotdot(dent->d_name))
- continue; /* skip "." and ".." */
-
- char *full_name = concat_path_file(path, dent->d_name);
- struct stat statbuf;
- if (stat(full_name, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))
- add_directory_to_dirlist(full_name);
- free(full_name);
- }
- closedir(dp);
+ GList *problem_dirs = get_problems_over_dbus(path, NULL);
+ 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"));
if (inotify_fd >= 0 && inotify_add_watch(inotify_fd, path, 0
// | IN_ATTRIB // Metadata changed
--
1.7.7.6