Matej Habrnal fa1950
From 6ba08b9f28343da5c6102833d1a5062475f09468 Mon Sep 17 00:00:00 2001
Matej Habrnal fa1950
From: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
Date: Tue, 24 Mar 2015 19:03:52 +0100
Matej Habrnal fa1950
Subject: [PATCH] libabrt: add new function fetching full problem data over
Matej Habrnal fa1950
 DBus
Matej Habrnal fa1950
Matej Habrnal fa1950
This function is required because users may not have direct file system
Matej Habrnal fa1950
access to the problem data.
Matej Habrnal fa1950
Matej Habrnal fa1950
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Matej Habrnal fa1950
---
Matej Habrnal fa1950
 src/include/libabrt.h      |  7 +++++++
Matej Habrnal fa1950
 src/lib/problem_api_dbus.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
Matej Habrnal fa1950
 2 files changed, 51 insertions(+)
Matej Habrnal fa1950
Matej Habrnal fa1950
diff --git a/src/include/libabrt.h b/src/include/libabrt.h
Matej Habrnal fa1950
index 37704dd..5a019fb 100644
Matej Habrnal fa1950
--- a/src/include/libabrt.h
Matej Habrnal fa1950
+++ b/src/include/libabrt.h
Matej Habrnal fa1950
@@ -169,6 +169,13 @@ int delete_problem_dirs_over_dbus(const GList *problem_dir_paths);
Matej Habrnal fa1950
 problem_data_t *get_problem_data_dbus(const char *problem_dir_path);
Matej Habrnal fa1950
 
Matej Habrnal fa1950
 /**
Matej Habrnal fa1950
+  @brief Fetches full problem data for specified problem id
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+  @return problem_data_t or ERR_PTR on failure
Matej Habrnal fa1950
+*/
Matej Habrnal fa1950
+problem_data_t *get_full_problem_data_over_dbus(const char *problem_dir_path);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+/**
Matej Habrnal fa1950
   @brief Fetches all problems from problem database
Matej Habrnal fa1950
 
Matej Habrnal fa1950
   @param authorize If set to true will try to fetch even problems owned by other users (will require root authorization over policy kit)
Matej Habrnal fa1950
diff --git a/src/lib/problem_api_dbus.c b/src/lib/problem_api_dbus.c
Matej Habrnal fa1950
index 2d77898..549175c 100644
Matej Habrnal fa1950
--- a/src/lib/problem_api_dbus.c
Matej Habrnal fa1950
+++ b/src/lib/problem_api_dbus.c
Matej Habrnal fa1950
@@ -183,3 +183,47 @@ GList *get_problems_over_dbus(bool authorize)
Matej Habrnal fa1950
 
Matej Habrnal fa1950
     return list;
Matej Habrnal fa1950
 }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+problem_data_t *get_full_problem_data_over_dbus(const char *problem_dir_path)
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 ERR_PTR;
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    GError *error = NULL;
Matej Habrnal fa1950
+    GVariant *result = g_dbus_proxy_call_sync(proxy,
Matej Habrnal fa1950
+                                    "GetProblemData",
Matej Habrnal fa1950
+                                    g_variant_new("(s)", problem_dir_path),
Matej Habrnal fa1950
+                                    G_DBUS_CALL_FLAGS_NONE,
Matej Habrnal fa1950
+                                    -1,
Matej Habrnal fa1950
+                                    NULL,
Matej Habrnal fa1950
+                                    &error);
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
+        g_error_free(error);
Matej Habrnal fa1950
+        return ERR_PTR;
Matej Habrnal fa1950
+    }
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    GVariantIter *iter = NULL;
Matej Habrnal fa1950
+    g_variant_get(result, "(a{s(its)})", &iter);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    gchar *name = NULL;
Matej Habrnal fa1950
+    gint flags;
Matej Habrnal fa1950
+    gulong size;
Matej Habrnal fa1950
+    gchar *value = NULL;
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    problem_data_t *pd = problem_data_new();
Matej Habrnal fa1950
+    while (g_variant_iter_loop(iter, "{&s(it&s)}", &name, &flags, &size, &value))
Matej Habrnal fa1950
+        problem_data_add_ext(pd, name, value, flags, size);
Matej Habrnal fa1950
+
Matej Habrnal fa1950
+    problem_data_add(pd, CD_DUMPDIR, problem_dir_path,
Matej Habrnal fa1950
+            CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE + CD_FLAG_LIST);
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
2.1.0
Matej Habrnal fa1950