diff options
author | Debarshi Ray <debarshir@freedesktop.org> | 2012-06-29 17:18:58 +0200 |
---|---|---|
committer | Debarshi Ray <debarshir@freedesktop.org> | 2012-08-28 19:37:55 +0200 |
commit | c3a6999e0bd7513dd01010e5d2607b2afe9885ef (patch) | |
tree | cffd5b0099b2314e6761854334a0e23ac0066fb1 | |
parent | 62e9fd3476342ebd70adc7199c6aa2adff265cd7 (diff) | |
download | telepathy-logger-c3a6999e0bd7513dd01010e5d2607b2afe9885ef.tar.gz |
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
-rw-r--r-- | 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", |