summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDebarshi Ray <debarshir@freedesktop.org>2012-06-29 17:18:58 +0200
committerDebarshi Ray <debarshir@freedesktop.org>2012-08-28 19:37:55 +0200
commitc3a6999e0bd7513dd01010e5d2607b2afe9885ef (patch)
treecffd5b0099b2314e6761854334a0e23ac0066fb1
parent62e9fd3476342ebd70adc7199c6aa2adff265cd7 (diff)
downloadtelepathy-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.c65
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",