summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-04-13 14:35:09 +0200
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-04-18 08:57:32 +0200
commit8c1aa2f67d0013507da8c0205df1054e673c8552 (patch)
tree5e3dda7817e9b46dc1e2fd63869b5f64d51dab9e
parent99341b830f11761fbf3c52b05e42564defbde7bd (diff)
Add tp_debug_client_get_messages_async()
-rw-r--r--telepathy-glib/debug-client.c89
-rw-r--r--telepathy-glib/debug-client.h10
-rw-r--r--tests/dbus/debug-client.c66
3 files changed, 165 insertions, 0 deletions
diff --git a/telepathy-glib/debug-client.c b/telepathy-glib/debug-client.c
index a0f129fcd..1fcf25728 100644
--- a/telepathy-glib/debug-client.c
+++ b/telepathy-glib/debug-client.c
@@ -19,6 +19,7 @@
*/
#include <telepathy-glib/debug-client.h>
+#include <telepathy-glib/debug-message-internal.h>
#include <telepathy-glib/dbus.h>
#include <telepathy-glib/errors.h>
#include <telepathy-glib/interfaces.h>
@@ -408,3 +409,91 @@ tp_debug_client_is_enabled (TpDebugClient *self)
{
return self->priv->enabled;
}
+
+static void
+get_messages_cb (TpDebugClient *self,
+ const GPtrArray *messages,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ GSimpleAsyncResult *result = user_data;
+ guint i;
+ GPtrArray *messages_arr;
+
+ if (error != NULL)
+ {
+ DEBUG ("GetMessages() failed: %s", error->message);
+ goto out;
+ }
+
+ messages_arr = g_ptr_array_new_with_free_func (g_object_unref);
+
+ for (i = 0; i < messages->len; i++)
+ {
+ TpDebugMessage *msg;
+ gdouble timestamp;
+ const gchar *domain, *message;
+ TpDebugLevel level;
+
+ tp_value_array_unpack (g_ptr_array_index (messages, i), 4,
+ &timestamp, &domain, &level, &message);
+
+ msg = _tp_debug_message_new (timestamp, domain, level, message);
+
+ g_ptr_array_add (messages_arr, msg);
+ }
+
+ g_simple_async_result_set_op_res_gpointer (result, messages_arr,
+ (GDestroyNotify) g_ptr_array_unref);
+
+out:
+ g_simple_async_result_complete (result);
+}
+
+/**
+ * tp_debug_client_get_messages_async:
+ * @self: a #TpDebugClient
+ * @callback: callback to call when the messages have been retrieved
+ * @user_data: data to pass to @callback
+ *
+ * Retrieve buffered messages from @self. Once @callback is called,
+ * use tp_debug_client_get_messages_finish() to retrieve the #TpDebugMessage
+ * objects.
+ *
+ * Since: UNRELEASED
+ */
+void
+tp_debug_client_get_messages_async (
+ TpDebugClient *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *result = g_simple_async_result_new (G_OBJECT (self),
+ callback, user_data, tp_debug_client_set_enabled_async);
+
+ tp_cli_debug_call_get_messages (self, -1, get_messages_cb,
+ result, g_object_unref, NULL);
+}
+
+/**
+ * tp_debug_client_get_messages_finish:
+ * @self: a #TpDebugClient
+ * @result: a #GAsyncResult
+ * @error: a #GError to fill
+ *
+ * Finishes tp_debug_client_set_enabled_async().
+ *
+ * Returns: (transfer full) (type GLib.PtrArray) (element-type TelepathyGLib.DebugMessage):
+ * a #GPtrArray of #TpDebugMessage
+ *
+ * Since: UNRELEASED
+ */
+GPtrArray *
+tp_debug_client_get_messages_finish (TpDebugClient *self,
+ GAsyncResult *result,
+ GError **error)
+{
+ _tp_implement_finish_return_copy_pointer (self,
+ tp_debug_client_set_enabled_async, g_ptr_array_ref)
+}
diff --git a/telepathy-glib/debug-client.h b/telepathy-glib/debug-client.h
index 9a38b4b67..861be0370 100644
--- a/telepathy-glib/debug-client.h
+++ b/telepathy-glib/debug-client.h
@@ -23,6 +23,7 @@
#include <telepathy-glib/defs.h>
#include <telepathy-glib/proxy.h>
+#include <telepathy-glib/debug-message.h>
G_BEGIN_DECLS
@@ -74,6 +75,15 @@ GType tp_debug_client_get_type (void);
void tp_debug_client_init_known_interfaces (void);
+void tp_debug_client_get_messages_async (
+ TpDebugClient *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+GPtrArray * tp_debug_client_get_messages_finish (TpDebugClient *self,
+ GAsyncResult *result,
+ GError **error) G_GNUC_WARN_UNUSED_RESULT;
+
G_END_DECLS
#include <telepathy-glib/_gen/tp-cli-debug.h>
diff --git a/tests/dbus/debug-client.c b/tests/dbus/debug-client.c
index c490c4a2d..c528e6103 100644
--- a/tests/dbus/debug-client.c
+++ b/tests/dbus/debug-client.c
@@ -26,6 +26,7 @@ typedef struct {
/* Client side object */
TpDebugClient *client;
+ GPtrArray *messages;
GError *error /* initialized where needed */;
gint wait;
} Test;
@@ -59,6 +60,8 @@ teardown (Test *test,
tp_clear_object (&test->sender);
tp_clear_object (&test->client);
+
+ tp_clear_pointer (&test->messages, g_ptr_array_unref);
}
static void
@@ -173,6 +176,67 @@ test_set_enabled (Test *test,
g_assert (!enabled);
}
+static void
+get_messages_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ Test *test = user_data;
+
+ tp_clear_pointer (&test->messages, g_ptr_array_unref);
+
+ test->messages = tp_debug_client_get_messages_finish (
+ TP_DEBUG_CLIENT (source), result, &test->error);
+
+ test->wait--;
+ if (test->wait <= 0)
+ g_main_loop_quit (test->mainloop);
+}
+
+static void
+test_get_messages (Test *test,
+ gconstpointer data G_GNUC_UNUSED)
+{
+ GDateTime *time1, *time2, *t;
+ GTimeVal time_val;
+ TpDebugMessage *msg;
+
+ time1 = g_date_time_new_now_utc ();
+ g_date_time_to_timeval (time1, &time_val);
+
+ tp_debug_sender_add_message (test->sender, &time_val, "domain1",
+ G_LOG_LEVEL_MESSAGE, "message1");
+
+ time2 = g_date_time_new_now_local ();
+ g_date_time_to_timeval (time2, &time_val);
+
+ tp_debug_sender_add_message (test->sender, &time_val, "domain2",
+ G_LOG_LEVEL_DEBUG, "message2");
+
+ tp_debug_client_get_messages_async (test->client, get_messages_cb, test);
+
+ test->wait = 1;
+ g_main_loop_run (test->mainloop);
+ g_assert_no_error (test->error);
+
+ g_assert (test->messages != NULL);
+ g_assert_cmpuint (test->messages->len, ==, 2);
+
+ msg = g_ptr_array_index (test->messages, 0);
+ g_assert (TP_IS_DEBUG_MESSAGE (msg));
+
+ t = tp_debug_message_get_time (msg);
+ g_assert (t != NULL);
+ /* Don't use g_date_time_equal() as the gouble -> GDateTime conversion in
+ * _tp_debug_message_new() may result in a difference of one (!)
+ * millisecond */
+ g_assert_cmpuint (g_date_time_to_unix (t), ==, g_date_time_to_unix (time1));
+
+ g_assert_cmpstr (tp_debug_message_get_domain (msg), ==, "domain1");
+ g_assert_cmpuint (tp_debug_message_get_level (msg), ==, G_LOG_LEVEL_MESSAGE);
+ g_assert_cmpstr (tp_debug_message_get_message (msg), ==, "message1");
+}
+
int
main (int argc,
char **argv)
@@ -188,6 +252,8 @@ main (int argc,
test_core_feature, teardown);
g_test_add ("/debug-client/set-enabled", Test, NULL, setup,
test_set_enabled, teardown);
+ g_test_add ("/debug-client/get-messages", Test, NULL, setup,
+ test_get_messages, teardown);
return g_test_run ();
}