diff options
author | Debarshi Ray <debarshir@freedesktop.org> | 2012-07-11 18:58:34 +0200 |
---|---|---|
committer | Debarshi Ray <debarshir@freedesktop.org> | 2012-08-28 19:37:57 +0200 |
commit | e1188dea59d3cbdc4999ae92b1a36a20ad1bf602 (patch) | |
tree | b7bd89ffc6c52b8aa28eb4edbb4c706a34a571a2 /telepathy-logger | |
parent | 3338392907f823e0a965e31c507d11133dd85921 (diff) | |
download | telepathy-logger-e1188dea59d3cbdc4999ae92b1a36a20ad1bf602.tar.gz |
log-iter-pidgin: Implement rewind
Fixes: https://bugs.freedesktop.org/41772
Diffstat (limited to 'telepathy-logger')
-rw-r--r-- | telepathy-logger/log-iter-pidgin.c | 70 |
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", |