telepathy-logger: log-walker: Add get_events skeleton

Nicolas Dufresne nicolasd at kemper.freedesktop.org
Tue Aug 28 13:01:04 PDT 2012


Module: telepathy-logger
Branch: master
Commit: 649a5a1e59c0f29424b08e36af20bf9338c586c5
URL:    http://cgit.freedesktop.org/telepathy/telepathy-logger/commit/?id=649a5a1e59c0f29424b08e36af20bf9338c586c5

Author: Debarshi Ray <debarshir at freedesktop.org>
Date:   Fri Jun 29 19:00:53 2012 +0200

log-walker: Add get_events skeleton

Fixes: https://bugs.freedesktop.org/41772

---

 telepathy-logger/log-walker.c |  143 +++++++++++++++++++++++++++++++++++++++++
 telepathy-logger/log-walker.h |   11 +++
 2 files changed, 154 insertions(+), 0 deletions(-)

diff --git a/telepathy-logger/log-walker.c b/telepathy-logger/log-walker.c
index a22b614..6bc4a58 100644
--- a/telepathy-logger/log-walker.c
+++ b/telepathy-logger/log-walker.c
@@ -48,6 +48,77 @@ struct _TplLogWalkerPriv
 G_DEFINE_TYPE (TplLogWalker, tpl_log_walker, G_TYPE_OBJECT);
 
 
+typedef struct
+{
+  GAsyncReadyCallback cb;
+  gpointer user_data;
+  guint num_events;
+} TplLogWalkerAsyncData;
+
+
+static TplLogWalkerAsyncData *
+tpl_log_walker_async_data_new (void)
+{
+  return g_slice_new0 (TplLogWalkerAsyncData);
+}
+
+
+static void
+tpl_log_walker_async_data_free (TplLogWalkerAsyncData *data)
+{
+  g_slice_free (TplLogWalkerAsyncData, data);
+}
+
+
+static void
+tpl_log_walker_async_operation_cb (GObject *source_object,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  TplLogWalkerAsyncData *async_data = (TplLogWalkerAsyncData *) user_data;
+
+  if (async_data->cb)
+    async_data->cb (source_object, result, async_data->user_data);
+
+  tpl_log_walker_async_data_free (async_data);
+}
+
+
+static GList *
+tpl_log_walker_get_events (TplLogWalker *walker,
+    guint num_events,
+    GError **error)
+{
+  g_return_val_if_fail (TPL_IS_LOG_WALKER (walker), NULL);
+  return NULL;
+}
+
+
+static void
+tpl_log_walker_get_events_async_thread (GSimpleAsyncResult *simple,
+    GObject *object,
+    GCancellable *cancellable)
+{
+  GError *error = NULL;
+  GList *events;
+  TplLogWalkerAsyncData *async_data;
+
+  async_data = (TplLogWalkerAsyncData *) g_async_result_get_user_data (
+      G_ASYNC_RESULT (simple));
+
+  events = tpl_log_walker_get_events (TPL_LOG_WALKER (object),
+      async_data->num_events, &error);
+
+  if (error != NULL)
+    {
+      g_simple_async_result_set_from_error (simple, error);
+      g_error_free (error);
+    }
+
+  g_simple_async_result_set_op_res_gpointer (simple, events, NULL);
+}
+
+
 static void
 tpl_log_walker_dispose (GObject *object)
 {
@@ -108,3 +179,75 @@ tpl_log_walker_add_iter (TplLogWalker *walker, TplLogIter *iter)
 
   priv->iters = g_list_prepend (priv->iters, g_object_ref (iter));
 }
+
+
+/**
+ * tpl_log_walker_get_events_async:
+ * @walker: a #TplLogWalker
+ * @num_events: number of maximum events to fetch
+ * @callback: (scope async) (allow-none): a callback to call when
+ * the request is satisfied
+ * @user_data: data to pass to @callback
+ *
+ * Walk the logs to retrieve the next most recent @num_event events.
+ */
+void
+tpl_log_walker_get_events_async (TplLogWalker *walker,
+    guint num_events,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  GSimpleAsyncResult *simple;
+  TplLogWalkerAsyncData *async_data;
+
+  g_return_if_fail (TPL_IS_LOG_WALKER (walker));
+
+  async_data = tpl_log_walker_async_data_new ();
+  async_data->cb = callback;
+  async_data->user_data = user_data;
+  async_data->num_events = num_events;
+
+  simple = g_simple_async_result_new (G_OBJECT (walker),
+      tpl_log_walker_async_operation_cb, async_data,
+      tpl_log_walker_get_events_async);
+
+  g_simple_async_result_run_in_thread (simple,
+      tpl_log_walker_get_events_async_thread, G_PRIORITY_DEFAULT,
+      NULL);
+
+  g_object_unref (simple);
+}
+
+
+/**
+ * tpl_log_walker_get_events_finish:
+ * @walker: a #TplLogWalker
+ * @result: a #GAsyncResult
+ * @events: (out) (transfer full) (element-type TelepathyLogger.Event):
+ *  a pointer to a #GList used to return the list #TplEvent
+ * @error: a #GError to fill
+ *
+ * Returns: #TRUE if the operation was successful, otherwise #FALSE.
+ */
+gboolean
+tpl_log_walker_get_events_finish (TplLogWalker *walker,
+    GAsyncResult *result,
+    GList **events,
+    GError **error)
+{
+  GSimpleAsyncResult *simple;
+
+  g_return_val_if_fail (TPL_IS_LOG_WALKER (walker), FALSE);
+  g_return_val_if_fail (g_simple_async_result_is_valid (result,
+        G_OBJECT (walker), tpl_log_walker_get_events_async), FALSE);
+
+  simple = G_SIMPLE_ASYNC_RESULT (result);
+
+  if (g_simple_async_result_propagate_error (simple, error))
+    return FALSE;
+
+  if (events != NULL)
+    *events = (GList *) g_simple_async_result_get_op_res_gpointer (simple);
+
+  return TRUE;
+}
diff --git a/telepathy-logger/log-walker.h b/telepathy-logger/log-walker.h
index e10fdca..b26b5dd 100644
--- a/telepathy-logger/log-walker.h
+++ b/telepathy-logger/log-walker.h
@@ -22,6 +22,7 @@
 #define __TPL_LOG_WALKER_H__
 
 #include <glib-object.h>
+#include <gio/gio.h>
 
 G_BEGIN_DECLS
 
@@ -64,6 +65,16 @@ struct _TplLogWalkerClass
 
 GType tpl_log_walker_get_type (void) G_GNUC_CONST;
 
+void tpl_log_walker_get_events_async (TplLogWalker *walker,
+    guint num_events,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean tpl_log_walker_get_events_finish (TplLogWalker *walker,
+    GAsyncResult *result,
+    GList **events,
+    GError **error);
+
 G_END_DECLS
 
 #endif /* __TPL_LOG_WALKER_H__ */



More information about the telepathy-commits mailing list