|
Matej Habrnal |
fa1950 |
From b1d43d73cce12980017dc5fa773d88ef72ec432b Mon Sep 17 00:00:00 2001
|
|
Matej Habrnal |
fa1950 |
From: Jakub Filak <jfilak@redhat.com>
|
|
Matej Habrnal |
fa1950 |
Date: Wed, 8 Apr 2015 08:23:03 +0200
|
|
Matej Habrnal |
fa1950 |
Subject: [PATCH] applet: switch to D-Bus methods
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
This patch is a part of our efforts to make abrt-applet independent on
|
|
Matej Habrnal |
fa1950 |
the backend.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
This patch converts all data manipulation functions to D-Bus calls, so
|
|
Matej Habrnal |
fa1950 |
the notifications are made of data obtained through D-Bus.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
The reporting still relies on file system access, though.
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Signed-off-by: Jakub Filak <jfilak@redhat.com>
|
|
Matej Habrnal |
fa1950 |
---
|
|
Matej Habrnal |
fa1950 |
src/applet/applet.c | 130 ++++++++++++++++++++++++++-------------------
|
|
Matej Habrnal |
fa1950 |
src/include/libabrt.h | 16 ++++++
|
|
Matej Habrnal |
fa1950 |
src/lib/problem_api_dbus.c | 61 +++++++++++++++------
|
|
Matej Habrnal |
fa1950 |
3 files changed, 137 insertions(+), 70 deletions(-)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/applet/applet.c b/src/applet/applet.c
|
|
Matej Habrnal |
fa1950 |
index 3198ae5..6474f6f 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/applet/applet.c
|
|
Matej Habrnal |
fa1950 |
+++ b/src/applet/applet.c
|
|
Matej Habrnal |
fa1950 |
@@ -170,11 +170,6 @@ static bool is_silent_shortened_reporting_enabled(void)
|
|
Matej Habrnal |
fa1950 |
return get_configured_bool_or_default("SilentShortenedReporting", 0);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
-static bool is_notification_of_incomplete_problems_enabled(void)
|
|
Matej Habrnal |
fa1950 |
-{
|
|
Matej Habrnal |
fa1950 |
- return get_configured_bool_or_default("NotifyIncompleteProblems", 0);
|
|
Matej Habrnal |
fa1950 |
-}
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
/*
|
|
Matej Habrnal |
fa1950 |
* Converts a NM state value stored in GVariant to boolean.
|
|
Matej Habrnal |
fa1950 |
*
|
|
Matej Habrnal |
fa1950 |
@@ -307,6 +302,7 @@ typedef struct problem_info {
|
|
Matej Habrnal |
fa1950 |
bool reported;
|
|
Matej Habrnal |
fa1950 |
bool was_announced;
|
|
Matej Habrnal |
fa1950 |
bool is_writable;
|
|
Matej Habrnal |
fa1950 |
+ int time;
|
|
Matej Habrnal |
fa1950 |
} problem_info_t;
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
static void push_to_deferred_queue(problem_info_t *pi)
|
|
Matej Habrnal |
fa1950 |
@@ -319,6 +315,26 @@ static const char *problem_info_get_dir(problem_info_t *pi)
|
|
Matej Habrnal |
fa1950 |
return problem_data_get_content_or_NULL(pi->problem_data, CD_DUMPDIR);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+static int problem_info_get_time(problem_info_t *pi)
|
|
Matej Habrnal |
fa1950 |
+{
|
|
Matej Habrnal |
fa1950 |
+ if (pi->time == -1)
|
|
Matej Habrnal |
fa1950 |
+ {
|
|
Matej Habrnal |
fa1950 |
+ const char *time_str = problem_data_get_content_or_NULL(pi->problem_data, FILENAME_TIME);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ if (time_str == NULL)
|
|
Matej Habrnal |
fa1950 |
+ error_msg_and_die("BUG: Problem info has data without the element time");
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ pi->time = atoi(time_str);
|
|
Matej Habrnal |
fa1950 |
+ }
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ return pi->time;
|
|
Matej Habrnal |
fa1950 |
+}
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+static bool problem_info_is_reported(problem_info_t *pi)
|
|
Matej Habrnal |
fa1950 |
+{
|
|
Matej Habrnal |
fa1950 |
+ return problem_data_get_content_or_NULL(pi->problem_data, FILENAME_REPORTED_TO) != NULL;
|
|
Matej Habrnal |
fa1950 |
+}
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
static void problem_info_set_dir(problem_info_t *pi, const char *dir)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
problem_data_add_text_noteditable(pi->problem_data, CD_DUMPDIR, dir);
|
|
Matej Habrnal |
fa1950 |
@@ -358,6 +374,7 @@ static problem_info_t *problem_info_new(const char *dir)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
problem_info_t *pi = xzalloc(sizeof(*pi));
|
|
Matej Habrnal |
fa1950 |
pi->problem_data = problem_data_new();
|
|
Matej Habrnal |
fa1950 |
+ pi->time = -1;
|
|
Matej Habrnal |
fa1950 |
problem_info_set_dir(pi, dir);
|
|
Matej Habrnal |
fa1950 |
return pi;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
@@ -1245,6 +1262,7 @@ static void show_problem_notification(problem_info_t *pi, int flags)
|
|
Matej Habrnal |
fa1950 |
static void Crash(DBusMessage* signal)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
log_debug("Crash recorded");
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
DBusMessageIter in_iter;
|
|
Matej Habrnal |
fa1950 |
dbus_message_iter_init(signal, &in_iter);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
@@ -1316,12 +1334,20 @@ static void Crash(DBusMessage* signal)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
problem_info_t *pi = problem_info_new(dir);
|
|
Matej Habrnal |
fa1950 |
- if (uuid != NULL && uuid[0] != '\0')
|
|
Matej Habrnal |
fa1950 |
- problem_data_add_text_noteditable(pi->problem_data, FILENAME_UUID, uuid);
|
|
Matej Habrnal |
fa1950 |
- if (duphash != NULL && duphash[0] != '\0')
|
|
Matej Habrnal |
fa1950 |
- problem_data_add_text_noteditable(pi->problem_data, FILENAME_DUPHASH, duphash);
|
|
Matej Habrnal |
fa1950 |
- if (package_name != NULL && package_name[0] != '\0')
|
|
Matej Habrnal |
fa1950 |
- problem_data_add_text_noteditable(pi->problem_data, FILENAME_COMPONENT, package_name);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ static const char *elements[] = {
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_CMDLINE,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_COUNT,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_UUID,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_DUPHASH,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_COMPONENT,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_ENVIRON,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_PID,
|
|
Matej Habrnal |
fa1950 |
+ NULL,
|
|
Matej Habrnal |
fa1950 |
+ };
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ fill_problem_data_over_dbus(dir, elements, pi->problem_data);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
pi->foreign = foreign_problem;
|
|
Matej Habrnal |
fa1950 |
show_problem_notification(pi, flags);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
@@ -1558,6 +1584,20 @@ xsmp_client_connect(void)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
+ static const char *elements[] = {
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_CMDLINE,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_COUNT,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_UUID,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_DUPHASH,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_COMPONENT,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_UID,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_TIME,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_REPORTED_TO,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_NOT_REPORTABLE,
|
|
Matej Habrnal |
fa1950 |
+ NULL
|
|
Matej Habrnal |
fa1950 |
+ };
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
/* I18n */
|
|
Matej Habrnal |
fa1950 |
setlocale(LC_ALL, "");
|
|
Matej Habrnal |
fa1950 |
#if ENABLE_NLS
|
|
Matej Habrnal |
fa1950 |
@@ -1675,63 +1715,45 @@ int main(int argc, char** argv)
|
|
Matej Habrnal |
fa1950 |
/* Age limit = now - 3 days */
|
|
Matej Habrnal |
fa1950 |
const unsigned long min_born_time = (unsigned long)(time_before_ndays(3));
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- const bool notify_incomplete = is_notification_of_incomplete_problems_enabled();
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
- while (new_dirs)
|
|
Matej Habrnal |
fa1950 |
+ for ( ; new_dirs != NULL; new_dirs = g_list_next(new_dirs))
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- struct dump_dir *dd = dd_opendir((char *)new_dirs->data, DD_OPEN_READONLY);
|
|
Matej Habrnal |
fa1950 |
- if (dd == NULL)
|
|
Matej Habrnal |
fa1950 |
+ const char *problem_id = (const char *)new_dirs->data;
|
|
Matej Habrnal |
fa1950 |
+ problem_info_t *pi = problem_info_new(problem_id);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ if (fill_problem_data_over_dbus(problem_id, elements, pi->problem_data) != 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- log_notice("'%s' is not a dump dir - ignoring\n", (char *)new_dirs->data);
|
|
Matej Habrnal |
fa1950 |
- new_dirs = g_list_next(new_dirs);
|
|
Matej Habrnal |
fa1950 |
+ log_notice("'%s' is not a dump dir - ignoring\n", problem_id);
|
|
Matej Habrnal |
fa1950 |
+ problem_info_free(pi);
|
|
Matej Habrnal |
fa1950 |
continue;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- if (dd->dd_time < min_born_time)
|
|
Matej Habrnal |
fa1950 |
+ /* TODO: add a filter for only complete problems to GetProblems D-Bus method */
|
|
Matej Habrnal |
fa1950 |
+ if (!dbus_problem_is_complete(problem_id))
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- log_notice("Ignoring outdated problem '%s'", (char *)new_dirs->data);
|
|
Matej Habrnal |
fa1950 |
- goto next;
|
|
Matej Habrnal |
fa1950 |
+ log_notice("Ignoring incomplete problem '%s'", problem_id);
|
|
Matej Habrnal |
fa1950 |
+ problem_info_free(pi);
|
|
Matej Habrnal |
fa1950 |
+ continue;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- const bool incomplete = !problem_dump_dir_is_complete(dd);
|
|
Matej Habrnal |
fa1950 |
- if (!notify_incomplete && incomplete)
|
|
Matej Habrnal |
fa1950 |
+ /* TODO: add a filter for max-old reported problems to GetProblems D-Bus method */
|
|
Matej Habrnal |
fa1950 |
+ if (problem_info_get_time(pi) < min_born_time)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- log_notice("Ignoring incomplete problem '%s'", (char *)new_dirs->data);
|
|
Matej Habrnal |
fa1950 |
- goto next;
|
|
Matej Habrnal |
fa1950 |
+ log_notice("Ignoring outdated problem '%s'", problem_id);
|
|
Matej Habrnal |
fa1950 |
+ problem_info_free(pi);
|
|
Matej Habrnal |
fa1950 |
+ continue;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- if (!dd_exist(dd, FILENAME_REPORTED_TO))
|
|
Matej Habrnal |
fa1950 |
- {
|
|
Matej Habrnal |
fa1950 |
- problem_info_t *pi = problem_info_new(new_dirs->data);
|
|
Matej Habrnal |
fa1950 |
- const char *elements[] = {FILENAME_UUID, FILENAME_DUPHASH, FILENAME_COMPONENT, FILENAME_NOT_REPORTABLE};
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
- for (size_t i = 0; i < sizeof(elements)/sizeof(*elements); ++i)
|
|
Matej Habrnal |
fa1950 |
- {
|
|
Matej Habrnal |
fa1950 |
- char * const value = dd_load_text_ext(dd, elements[i],
|
|
Matej Habrnal |
fa1950 |
- DD_FAIL_QUIETLY_ENOENT | DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE);
|
|
Matej Habrnal |
fa1950 |
- if (value)
|
|
Matej Habrnal |
fa1950 |
- problem_data_add_text_noteditable(pi->problem_data, elements[i], value);
|
|
Matej Habrnal |
fa1950 |
- free(value);
|
|
Matej Habrnal |
fa1950 |
- }
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
- pi->incomplete = incomplete;
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
- /* Can't be foreign because if the problem is foreign then the
|
|
Matej Habrnal |
fa1950 |
- * dd_opendir() call failed few lines above and the problem is ignored.
|
|
Matej Habrnal |
fa1950 |
- * */
|
|
Matej Habrnal |
fa1950 |
- pi->foreign = false;
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
- notify_list = g_list_prepend(notify_list, pi);
|
|
Matej Habrnal |
fa1950 |
- }
|
|
Matej Habrnal |
fa1950 |
- else
|
|
Matej Habrnal |
fa1950 |
+ /* TODO: add a filter for not-yet reported problems to GetProblems D-Bus method */
|
|
Matej Habrnal |
fa1950 |
+ if (problem_info_is_reported(pi))
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- log_notice("Ignoring already reported problem '%s'", (char *)new_dirs->data);
|
|
Matej Habrnal |
fa1950 |
+ log_notice("Ignoring already reported problem '%s'", problem_id);
|
|
Matej Habrnal |
fa1950 |
+ problem_info_free(pi);
|
|
Matej Habrnal |
fa1950 |
+ continue;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
-next:
|
|
Matej Habrnal |
fa1950 |
- dd_close(dd);
|
|
Matej Habrnal |
fa1950 |
-
|
|
Matej Habrnal |
fa1950 |
- new_dirs = g_list_next(new_dirs);
|
|
Matej Habrnal |
fa1950 |
+ /* Can't be foreig because new_dir_exists() returns only own problems */
|
|
Matej Habrnal |
fa1950 |
+ pi->foreign = false;
|
|
Matej Habrnal |
fa1950 |
+ notify_list = g_list_prepend(notify_list, pi);
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
g_ignore_set = ignored_problems_new(concat_path_file(g_get_user_cache_dir(), "abrt/ignored_problems"));
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/include/libabrt.h b/src/include/libabrt.h
|
|
Matej Habrnal |
fa1950 |
index 0171cb7..65d30a1 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/include/libabrt.h
|
|
Matej Habrnal |
fa1950 |
+++ b/src/include/libabrt.h
|
|
Matej Habrnal |
fa1950 |
@@ -162,6 +162,15 @@ int chown_dir_over_dbus(const char *problem_dir_path);
|
|
Matej Habrnal |
fa1950 |
int test_exist_over_dbus(const char *problem_id, const char *element_name);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/**
|
|
Matej Habrnal |
fa1950 |
+ @brief Checks whether the problem corresponding to the given ID is complete
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ Might require authorization
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ @return Positive number if such the proble is complete, 0 if doesn't and negative number if an error occurs.
|
|
Matej Habrnal |
fa1950 |
+ */
|
|
Matej Habrnal |
fa1950 |
+int dbus_problem_is_complete(const char *problem_id);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+/**
|
|
Matej Habrnal |
fa1950 |
@ Returns value of the given element name
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
Might require authorization
|
|
Matej Habrnal |
fa1950 |
@@ -180,6 +189,13 @@ char *load_text_over_dbus(const char *problem_id, const char *element_name);
|
|
Matej Habrnal |
fa1950 |
int delete_problem_dirs_over_dbus(const GList *problem_dir_paths);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
/**
|
|
Matej Habrnal |
fa1950 |
+ @brief Fetches given problem elements for specified problem id
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ @return on failures returns non zero value and emits error message
|
|
Matej Habrnal |
fa1950 |
+*/
|
|
Matej Habrnal |
fa1950 |
+int fill_problem_data_over_dbus(const char *problem_dir_path, const char **elements, problem_data_t *problem_data);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+/**
|
|
Matej Habrnal |
fa1950 |
@brief Fetches problem information for specified problem id
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
@return problem_data_t or NULL on failure
|
|
Matej Habrnal |
fa1950 |
diff --git a/src/lib/problem_api_dbus.c b/src/lib/problem_api_dbus.c
|
|
Matej Habrnal |
fa1950 |
index 5148932..ce5c47b 100644
|
|
Matej Habrnal |
fa1950 |
--- a/src/lib/problem_api_dbus.c
|
|
Matej Habrnal |
fa1950 |
+++ b/src/lib/problem_api_dbus.c
|
|
Matej Habrnal |
fa1950 |
@@ -101,23 +101,21 @@ int delete_problem_dirs_over_dbus(const GList *problem_dir_paths)
|
|
Matej Habrnal |
fa1950 |
return 0;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
-problem_data_t *get_problem_data_dbus(const char *problem_dir_path)
|
|
Matej Habrnal |
fa1950 |
+int fill_problem_data_over_dbus(const char *problem_id, const char **elements, problem_data_t *problem_data)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
INITIALIZE_LIBABRT();
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
GDBusProxy *proxy = get_dbus_proxy();
|
|
Matej Habrnal |
fa1950 |
if (!proxy)
|
|
Matej Habrnal |
fa1950 |
- return NULL;
|
|
Matej Habrnal |
fa1950 |
+ return -1;
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- GVariantBuilder *builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
|
|
Matej Habrnal |
fa1950 |
- g_variant_builder_add(builder, "s", FILENAME_TIME );
|
|
Matej Habrnal |
fa1950 |
- g_variant_builder_add(builder, "s", FILENAME_REASON );
|
|
Matej Habrnal |
fa1950 |
- g_variant_builder_add(builder, "s", FILENAME_NOT_REPORTABLE);
|
|
Matej Habrnal |
fa1950 |
- g_variant_builder_add(builder, "s", FILENAME_COMPONENT );
|
|
Matej Habrnal |
fa1950 |
- g_variant_builder_add(builder, "s", FILENAME_EXECUTABLE );
|
|
Matej Habrnal |
fa1950 |
- g_variant_builder_add(builder, "s", FILENAME_REPORTED_TO );
|
|
Matej Habrnal |
fa1950 |
- GVariant *params = g_variant_new("(sas)", problem_dir_path, builder);
|
|
Matej Habrnal |
fa1950 |
- g_variant_builder_unref(builder);
|
|
Matej Habrnal |
fa1950 |
+ GVariantBuilder *args_builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ for (const char **iter = elements; *iter; ++iter)
|
|
Matej Habrnal |
fa1950 |
+ g_variant_builder_add(args_builder, "s", *iter);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ GVariant *params = g_variant_new("(sas)", problem_id, args_builder);
|
|
Matej Habrnal |
fa1950 |
+ g_variant_builder_unref(args_builder);
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
GError *error = NULL;
|
|
Matej Habrnal |
fa1950 |
GVariant *result = g_dbus_proxy_call_sync(proxy,
|
|
Matej Habrnal |
fa1950 |
@@ -130,20 +128,46 @@ problem_data_t *get_problem_data_dbus(const char *problem_dir_path)
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
if (error)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- error_msg(_("Can't get problem data from abrt-dbus: %s"), error->message);
|
|
Matej Habrnal |
fa1950 |
+ error_msg(_("D-Bus GetInfo method call failed: %s"), error->message);
|
|
Matej Habrnal |
fa1950 |
g_error_free(error);
|
|
Matej Habrnal |
fa1950 |
- return NULL;
|
|
Matej Habrnal |
fa1950 |
+ return -2;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
- problem_data_t *pd = problem_data_new();
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
char *key, *val;
|
|
Matej Habrnal |
fa1950 |
GVariantIter *iter;
|
|
Matej Habrnal |
fa1950 |
g_variant_get(result, "(a{ss})", &iter);
|
|
Matej Habrnal |
fa1950 |
while (g_variant_iter_loop(iter, "{ss}", &key, &val))
|
|
Matej Habrnal |
fa1950 |
+ problem_data_add_text_noteditable(problem_data, key, val);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ g_variant_unref(result);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ return 0;
|
|
Matej Habrnal |
fa1950 |
+}
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+problem_data_t *get_problem_data_dbus(const char *problem_dir_path)
|
|
Matej Habrnal |
fa1950 |
+{
|
|
Matej Habrnal |
fa1950 |
+ INITIALIZE_LIBABRT();
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ static const char *elements[] = {
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_TIME,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_REASON,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_NOT_REPORTABLE,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_COMPONENT,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_EXECUTABLE,
|
|
Matej Habrnal |
fa1950 |
+ FILENAME_REPORTED_TO,
|
|
Matej Habrnal |
fa1950 |
+ NULL,
|
|
Matej Habrnal |
fa1950 |
+ };
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ problem_data_t *pd = problem_data_new();
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
+ if (fill_problem_data_over_dbus(problem_dir_path, elements, pd) != 0)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
- problem_data_add_text_noteditable(pd, key, val);
|
|
Matej Habrnal |
fa1950 |
+ error_msg(_("Can't get problem data from abrt-dbus"));
|
|
Matej Habrnal |
fa1950 |
+ problem_data_free(pd);
|
|
Matej Habrnal |
fa1950 |
+ return NULL;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
- g_variant_unref(result);
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
return pd;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
@@ -259,6 +283,11 @@ int test_exist_over_dbus(const char *problem_id, const char *element_name)
|
|
Matej Habrnal |
fa1950 |
return retval;
|
|
Matej Habrnal |
fa1950 |
}
|
|
Matej Habrnal |
fa1950 |
|
|
Matej Habrnal |
fa1950 |
+int dbus_problem_is_complete(const char *problem_id)
|
|
Matej Habrnal |
fa1950 |
+{
|
|
Matej Habrnal |
fa1950 |
+ return test_exist_over_dbus(problem_id, FILENAME_COUNT);
|
|
Matej Habrnal |
fa1950 |
+}
|
|
Matej Habrnal |
fa1950 |
+
|
|
Matej Habrnal |
fa1950 |
char *load_text_over_dbus(const char *problem_id, const char *element_name)
|
|
Matej Habrnal |
fa1950 |
{
|
|
Matej Habrnal |
fa1950 |
INITIALIZE_LIBABRT();
|
|
Matej Habrnal |
fa1950 |
--
|
|
Matej Habrnal |
fa1950 |
2.1.0
|
|
Matej Habrnal |
fa1950 |
|