summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDebarshi Ray <debarshir@freedesktop.org>2012-07-11 18:58:34 +0200
committerDebarshi Ray <debarshir@freedesktop.org>2012-08-28 19:37:57 +0200
commite1188dea59d3cbdc4999ae92b1a36a20ad1bf602 (patch)
treeb7bd89ffc6c52b8aa28eb4edbb4c706a34a571a2
parent3338392907f823e0a965e31c507d11133dd85921 (diff)
downloadtelepathy-logger-e1188dea59d3cbdc4999ae92b1a36a20ad1bf602.tar.gz
log-iter-pidgin: Implement rewind
Fixes: https://bugs.freedesktop.org/41772
-rw-r--r--telepathy-logger/log-iter-pidgin.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/telepathy-logger/log-iter-pidgin.c b/telepathy-logger/log-iter-pidgin.c
index d539e1e..86ea0df 100644
--- a/telepathy-logger/log-iter-pidgin.c
+++ b/telepathy-logger/log-iter-pidgin.c
@@ -104,6 +104,75 @@ tpl_log_iter_pidgin_get_events (TplLogIter *iter,
static void
+tpl_log_iter_pidgin_rewind (TplLogIter *iter,
+ guint num_events,
+ GError **error)
+{
+ GList *e;
+ TplLogIterPidginPriv *priv;
+ guint i;
+
+ priv = TPL_LOG_ITER_PIDGIN (iter)->priv;
+ e = NULL;
+
+ /* Set e to the last event that was returned */
+ if (priv->next_event == NULL)
+ e = priv->events;
+ else
+ e = g_list_next (priv->next_event);
+
+ i = 0;
+ while (i < num_events)
+ {
+ TplEvent *event;
+
+ if (e == NULL)
+ {
+ GList *d;
+
+ if (priv->next_date == NULL)
+ d = priv->dates;
+ else
+ d = g_list_next (priv->next_date);
+
+ /* This can happen if get_events was never called or called
+ * with num_events == 0
+ */
+ if (d == NULL)
+ break;
+
+ g_list_free_full (priv->events, g_object_unref);
+ priv->events = NULL;
+ priv->next_event = NULL;
+
+ /* Rollback the priv->next_date */
+ priv->next_date = d;
+
+ /* Rollback the current date (ie. d) */
+ d = g_list_next (d);
+ if (d == NULL)
+ break;
+
+ priv->events = _tpl_log_store_get_events_for_date (priv->store,
+ priv->account, priv->target, priv->type_mask,
+ (GDate *) d->data);
+ e = priv->events;
+ }
+
+ event = TPL_EVENT (e->data);
+
+ if (priv->filter == NULL || (*priv->filter) (event, priv->filter_data))
+ {
+ priv->next_event = e;
+ i++;
+ }
+
+ e = g_list_next (e);
+ }
+}
+
+
+static void
tpl_log_iter_pidgin_dispose (GObject *object)
{
TplLogIterPidginPriv *priv;
@@ -237,6 +306,7 @@ tpl_log_iter_pidgin_class_init (TplLogIterPidginClass *klass)
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;
+ log_iter_class->rewind = tpl_log_iter_pidgin_rewind;
param_spec = g_param_spec_object ("account",
"Account",