[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