[walker] telepathy-logger: log-manager: Implement walk_filtered_events

Debarshi Ray debarshir at kemper.freedesktop.org
Thu Jun 28 08:23:58 PDT 2012


Module: telepathy-logger
Branch: walker
Commit: 7698753feab6ffa414b21b9c36ab0c01764d64fb
URL:    http://cgit.freedesktop.org/telepathy/telepathy-logger/commit/?id=7698753feab6ffa414b21b9c36ab0c01764d64fb

Author: Debarshi Ray <debarshir at freedesktop.org>
Date:   Thu Jun 28 16:03:15 2012 +0200

log-manager: Implement walk_filtered_events

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

---

 telepathy-logger/log-manager-internal.h |    7 ++
 telepathy-logger/log-manager.c          |  152 +++++++++++++++++++++++++++++++
 telepathy-logger/log-manager.h          |   15 +++
 3 files changed, 174 insertions(+), 0 deletions(-)

diff --git a/telepathy-logger/log-manager-internal.h b/telepathy-logger/log-manager-internal.h
index 4a60d90..98b457f 100644
--- a/telepathy-logger/log-manager-internal.h
+++ b/telepathy-logger/log-manager-internal.h
@@ -52,6 +52,13 @@ GList * _tpl_log_manager_get_filtered_events (TplLogManager *manager,
     TplLogEventFilter filter,
     gpointer user_data);
 
+TplLogWalker * _tpl_log_manager_walk_filtered_events (TplLogManager *manager,
+    TpAccount *account,
+    TplEntity *target,
+    gint type_mask,
+    TplLogEventFilter filter,
+    gpointer user_data);
+
 GList * _tpl_log_manager_get_entities (TplLogManager *manager,
     TpAccount *account);
 
diff --git a/telepathy-logger/log-manager.c b/telepathy-logger/log-manager.c
index f11a58e..06bf322 100644
--- a/telepathy-logger/log-manager.c
+++ b/telepathy-logger/log-manager.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2003-2007 Imendio AB
  * Copyright (C) 2007-2011 Collabora Ltd.
+ * Copyright (C) 2012 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -44,6 +45,7 @@
 
 #define DEBUG_FLAG TPL_DEBUG_LOG_MANAGER
 #include <telepathy-logger/debug-internal.h>
+#include <telepathy-logger/log-walker-internal.h>
 #include <telepathy-logger/util-internal.h>
 
 /**
@@ -609,6 +611,40 @@ _tpl_log_manager_get_filtered_events (TplLogManager *manager,
 }
 
 
+TplLogWalker *
+_tpl_log_manager_walk_filtered_events (TplLogManager *manager,
+    TpAccount *account,
+    TplEntity *target,
+    gint type_mask,
+    TplLogEventFilter filter,
+    gpointer user_data)
+{
+  TplLogManagerPriv *priv;
+  TplLogWalker *walker;
+  GList *l;
+
+  g_return_val_if_fail (TPL_IS_LOG_MANAGER (manager), NULL);
+  g_return_val_if_fail (TPL_IS_ENTITY (target), NULL);
+
+  priv = manager->priv;
+  walker = tpl_log_walker_new ();
+
+  for (l = priv->readable_stores; l != NULL; l = g_list_next (l))
+    {
+      TplLogStore *store = TPL_LOG_STORE (l->data);
+      TplLogIter *iter;
+
+      iter = _tpl_log_store_create_iter (store, account, target, type_mask,
+          filter, user_data);
+
+      if (iter != NULL)
+        tpl_log_walker_add_iter (walker, iter);
+    }
+
+  return walker;
+}
+
+
 /*
  * _tpl_log_manager_get_entities:
  * @manager: the log manager
@@ -1195,6 +1231,122 @@ tpl_log_manager_get_filtered_events_finish (TplLogManager *self,
 
 
 static void
+_walk_filtered_events_async_thread (GSimpleAsyncResult *simple,
+    GObject *object,
+    GCancellable *cancellable)
+{
+  TplLogManagerAsyncData *async_data;
+  TplLogManagerEventInfo *event_info;
+  TplLogWalker *walker;
+
+  async_data = g_async_result_get_user_data (G_ASYNC_RESULT (simple));
+  event_info = async_data->request;
+
+  walker = _tpl_log_manager_walk_filtered_events (async_data->manager,
+      event_info->account, event_info->target,
+      event_info->type_mask, event_info->filter,
+      event_info->user_data);
+
+  g_simple_async_result_set_op_res_gpointer (simple, walker,
+      g_object_unref);
+}
+
+
+/**
+ * tpl_log_manager_walk_filtered_events_async:
+ * @manager: a #TplLogManager
+ * @account: a #TpAccount
+ * @target: a non-NULL #TplEntity
+ * @type_mask: event type filter see #TplEventTypeMask
+ * @filter: (scope call) (allow-none): an optional filter function
+ * @filter_user_data: user data to pass to @filter
+ * @callback: (scope async) (allow-none): a callback to call when
+ * the request is satisfied
+ * @user_data: data to pass to @callback
+ *
+ * Create a #TplLogWalker to traverse all the events exchanged with @target.
+ */
+void
+tpl_log_manager_walk_filtered_events_async (TplLogManager *manager,
+    TpAccount *account,
+    TplEntity *target,
+    gint type_mask,
+    TplLogEventFilter filter,
+    gpointer filter_user_data,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  TplLogManagerEventInfo *event_info = tpl_log_manager_event_info_new ();
+  TplLogManagerAsyncData *async_data = tpl_log_manager_async_data_new ();
+  GSimpleAsyncResult *simple;
+
+  g_return_if_fail (TPL_IS_LOG_MANAGER (manager));
+  g_return_if_fail (TP_IS_ACCOUNT (account));
+  g_return_if_fail (TPL_IS_ENTITY (target));
+
+  event_info->account = g_object_ref (account);
+  event_info->target = g_object_ref (target);
+  event_info->type_mask = type_mask;
+  event_info->filter = filter;
+  event_info->user_data = filter_user_data;
+
+  async_data->manager = g_object_ref (manager);
+  async_data->request = event_info;
+  async_data->request_free =
+    (TplLogManagerFreeFunc) tpl_log_manager_event_info_free;
+  async_data->cb = callback;
+  async_data->user_data = user_data;
+
+  simple = g_simple_async_result_new (G_OBJECT (manager),
+      _tpl_log_manager_async_operation_cb, async_data,
+      tpl_log_manager_walk_filtered_events_async);
+
+  g_simple_async_result_run_in_thread (simple,
+      _walk_filtered_events_async_thread, 0, NULL);
+
+  g_object_unref (simple);
+}
+
+
+/**
+ * tpl_log_manager_walk_filtered_events_finish:
+ * @self: a #TplLogManager
+ * @result: a #GAsyncResult
+ * @walker: (out) (transfer full): a pointer to a #TplLogWalker
+ * used to traverse the #TplEvent list.
+ * @error: a #GError to fill
+ *
+ * Returns: #TRUE if the operation was successful, otherwise #FALSE.
+ */
+gboolean
+tpl_log_manager_walk_filtered_events_finish (TplLogManager *self,
+    GAsyncResult *result,
+    TplLogWalker **walker,
+    GError **error)
+{
+  GSimpleAsyncResult *simple;
+
+  g_return_val_if_fail (TPL_IS_LOG_MANAGER (self), FALSE);
+  g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE);
+  g_return_val_if_fail (g_simple_async_result_is_valid (result,
+        G_OBJECT (self), tpl_log_manager_walk_filtered_events_async), FALSE);
+
+  simple = G_SIMPLE_ASYNC_RESULT (result);
+
+  if (g_simple_async_result_propagate_error (simple, error))
+    return FALSE;
+
+  if (walker != NULL)
+    {
+      g_object_ref (*walker);
+      *walker = TPL_LOG_WALKER (g_simple_async_result_get_op_res_gpointer (simple));
+    }
+
+  return TRUE;
+}
+
+
+static void
 _get_entities_async_thread (GSimpleAsyncResult *simple,
     GObject *object,
     GCancellable *cancellable)
diff --git a/telepathy-logger/log-manager.h b/telepathy-logger/log-manager.h
index 777c7a7..0d4777c 100644
--- a/telepathy-logger/log-manager.h
+++ b/telepathy-logger/log-manager.h
@@ -27,6 +27,7 @@
 #include <telepathy-glib/account.h>
 
 #include <telepathy-logger/event.h>
+#include <telepathy-logger/log-walker.h>
 
 G_BEGIN_DECLS
 #define TPL_TYPE_LOG_MANAGER  (tpl_log_manager_get_type ())
@@ -147,6 +148,20 @@ gboolean tpl_log_manager_get_filtered_events_finish (TplLogManager *self,
     GList **events,
     GError **error);
 
+void tpl_log_manager_walk_filtered_events_async (TplLogManager *manager,
+    TpAccount *account,
+    TplEntity *target,
+    gint type_mask,
+    TplLogEventFilter filter,
+    gpointer filter_user_data,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean tpl_log_manager_walk_filtered_events_finish (TplLogManager *self,
+    GAsyncResult *result,
+    TplLogWalker **walker,
+    GError **error);
+
 void tpl_log_manager_get_entities_async (TplLogManager *self,
     TpAccount *account,
     GAsyncReadyCallback callback,



More information about the telepathy-commits mailing list