telepathy-logger: log-iter-pidgin: Implement get_events

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


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

Author: Debarshi Ray <debarshir at freedesktop.org>
Date:   Fri Jun 29 17:18:58 2012 +0200

log-iter-pidgin: Implement get_events

It a sign of completion if the number of events returned is less than
num_events. NULL is returned when there are no more events left in the
log.

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

---

 telepathy-logger/log-iter-pidgin.c |   65 ++++++++++++++++++++++++++++++++++++
 1 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/telepathy-logger/log-iter-pidgin.c b/telepathy-logger/log-iter-pidgin.c
index bc5678e..d539e1e 100644
--- a/telepathy-logger/log-iter-pidgin.c
+++ b/telepathy-logger/log-iter-pidgin.c
@@ -24,6 +24,10 @@
 
 struct _TplLogIterPidginPriv
 {
+  GList *dates;
+  GList *events;
+  GList *next_date;
+  GList *next_event;
   TpAccount *account;
   TplEntity *target;
   TplLogEventFilter filter;
@@ -46,6 +50,59 @@ enum
 G_DEFINE_TYPE (TplLogIterPidgin, tpl_log_iter_pidgin, TPL_TYPE_LOG_ITER);
 
 
+static GList *
+tpl_log_iter_pidgin_get_events (TplLogIter *iter,
+    guint num_events,
+    GError **error)
+{
+  TplLogIterPidginPriv *priv;
+  GList *events;
+  guint i;
+
+  priv = TPL_LOG_ITER_PIDGIN (iter)->priv;
+  events = NULL;
+
+  if (priv->dates == NULL)
+    {
+      priv->dates = _tpl_log_store_get_dates (priv->store, priv->account,
+          priv->target, priv->type_mask);
+      priv->next_date = g_list_last (priv->dates);
+    }
+
+  i = 0;
+  while (i < num_events)
+    {
+      TplEvent *event;
+
+      if (priv->next_event == NULL)
+        {
+          if (priv->next_date == NULL)
+            break;
+
+          g_list_free_full (priv->events, g_object_unref);
+          priv->events = _tpl_log_store_get_events_for_date (priv->store,
+              priv->account, priv->target, priv->type_mask,
+              (GDate *) priv->next_date->data);
+
+          priv->next_event = g_list_last (priv->events);
+          priv->next_date = g_list_previous (priv->next_date);
+        }
+
+      event = TPL_EVENT (priv->next_event->data);
+
+      if (priv->filter == NULL || (*priv->filter) (event, priv->filter_data))
+        {
+          events = g_list_prepend (events, g_object_ref (event));
+          i++;
+        }
+
+      priv->next_event = g_list_previous (priv->next_event);
+    }
+
+  return events;
+}
+
+
 static void
 tpl_log_iter_pidgin_dispose (GObject *object)
 {
@@ -53,6 +110,12 @@ tpl_log_iter_pidgin_dispose (GObject *object)
 
   priv = TPL_LOG_ITER_PIDGIN (object)->priv;
 
+  g_list_free_full (priv->dates, (GDestroyNotify) g_date_free);
+  priv->dates = NULL;
+
+  g_list_free_full (priv->events, g_object_unref);
+  priv->events = NULL;
+
   g_clear_object (&priv->account);
   g_clear_object (&priv->store);
   g_clear_object (&priv->target);
@@ -166,12 +229,14 @@ static void
 tpl_log_iter_pidgin_class_init (TplLogIterPidginClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  TplLogIterClass *log_iter_class = TPL_LOG_ITER_CLASS (klass);
   GParamSpec *param_spec;
 
   object_class->dispose = tpl_log_iter_pidgin_dispose;
   object_class->finalize = tpl_log_iter_pidgin_finalize;
   object_class->get_property = tpl_log_iter_pidgin_get_property;
   object_class->set_property = tpl_log_iter_pidgin_set_property;
+  log_iter_class->get_events = tpl_log_iter_pidgin_get_events;
 
   param_spec = g_param_spec_object ("account",
       "Account",



More information about the telepathy-commits mailing list