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:35:24 +0200
commit72d7913032531e3c1094a06a3535a313309f4c7f (patch)
tree533e19dc04ae75a4568ae19156ae172ba182950a
parent87a54bdafbb654c99d716e65162d9336bbf6db3f (diff)
downloadtelepathy-logger-72d7913032531e3c1094a06a3535a313309f4c7f.tar.gz
log-iter-xml: 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-xml.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/telepathy-logger/log-iter-xml.c b/telepathy-logger/log-iter-xml.c
index 7086a4b..a3e4434 100644
--- a/telepathy-logger/log-iter-xml.c
+++ b/telepathy-logger/log-iter-xml.c
@@ -24,6 +24,10 @@
struct _TplLogIterXmlPriv
{
+ GList *dates;
+ GList *events;
+ GList *next_date;
+ GList *next_event;
TpAccount *account;
TplEntity *target;
TplLogEventFilter filter;
@@ -46,6 +50,59 @@ enum
G_DEFINE_TYPE (TplLogIterXml, tpl_log_iter_xml, TPL_TYPE_LOG_ITER);
+static GList *
+tpl_log_iter_xml_get_events (TplLogIter *iter,
+ guint num_events,
+ GError **error)
+{
+ TplLogIterXmlPriv *priv;
+ GList *events;
+ guint i;
+
+ priv = TPL_LOG_ITER_XML (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_xml_dispose (GObject *object)
{
@@ -53,6 +110,12 @@ tpl_log_iter_xml_dispose (GObject *object)
priv = TPL_LOG_ITER_XML (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_xml_class_init (TplLogIterXmlClass *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_xml_dispose;
object_class->finalize = tpl_log_iter_xml_finalize;
object_class->get_property = tpl_log_iter_xml_get_property;
object_class->set_property = tpl_log_iter_xml_set_property;
+ log_iter_class->get_events = tpl_log_iter_xml_get_events;
param_spec = g_param_spec_object ("account",
"Account",