summaryrefslogtreecommitdiff
path: root/telepathy-logger/text-event.c
diff options
context:
space:
mode:
authorDavid Laban <david.laban@collabora.co.uk>2011-05-17 18:05:44 -0400
committerDavid Laban <david.laban@collabora.co.uk>2011-05-17 18:05:44 -0400
commit887a15b3786107bd1ac1110408fa3cfa4c9f7944 (patch)
tree9ab86e152c7e4382c59f4f2c06a59676b3bbe5ac /telepathy-logger/text-event.c
parentea98862759782023b56bd13778c02e49b441f246 (diff)
downloadtelepathy-logger-887a15b3786107bd1ac1110408fa3cfa4c9f7944.tar.gz
tpl_text_event_{add,dup}_supersedes
A list of TplTextEvent (intended to be in log order)
Diffstat (limited to 'telepathy-logger/text-event.c')
-rw-r--r--telepathy-logger/text-event.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/telepathy-logger/text-event.c b/telepathy-logger/text-event.c
index 7791362..a8ba21b 100644
--- a/telepathy-logger/text-event.c
+++ b/telepathy-logger/text-event.c
@@ -55,6 +55,10 @@ struct _TplTextEventPriv
gchar *message;
gchar *token;
gchar *supersedes_token;
+ /* A list of TplTextEvent that we supersede.
+ * This is only populated when reading logs (not storing them). */
+ GQueue supersedes;
+ gboolean dispose_has_run;
};
enum
@@ -76,6 +80,19 @@ static gchar *message_types[] = {
static void
+tpl_text_event_dispose (GObject *obj)
+{
+ TplTextEventPriv *priv = TPL_TEXT_EVENT (obj)->priv;
+
+ if (priv->dispose_has_run)
+ return;
+ priv->dispose_has_run = TRUE;
+
+ g_list_free_full (priv->supersedes.head, g_object_unref);
+}
+
+
+static void
tpl_text_event_finalize (GObject *obj)
{
TplTextEventPriv *priv = TPL_TEXT_EVENT (obj)->priv;
@@ -171,6 +188,7 @@ static void tpl_text_event_class_init (TplTextEventClass *klass)
TplEventClass *event_class = TPL_EVENT_CLASS (klass);
GParamSpec *param_spec;
+ object_class->dispose = tpl_text_event_dispose;
object_class->finalize = tpl_text_event_finalize;
object_class->get_property = tpl_text_event_get_property;
object_class->set_property = tpl_text_event_set_property;
@@ -304,6 +322,53 @@ tpl_text_event_get_supersedes_token (TplTextEvent *self)
/**
+ * tpl_text_event_add_supersedes
+ * @self: a #TplTextEvent
+ * @old_event: (transfer full): an #TplTextEvent which this one supersedes
+ *
+ * If there are other known entries in the message edit/succession chain,
+ * they should be added to old_event before linking these two events,
+ * as they will be copied onto this event for convenience.
+ */
+void
+tpl_text_event_add_supersedes (TplTextEvent *self,
+ TplTextEvent *old_event)
+{
+ GList *l;
+
+ g_object_ref (old_event);
+ g_queue_push_tail (&self->priv->supersedes, old_event);
+
+ for (l = old_event->priv->supersedes.head; l != NULL; l = l->next)
+ g_queue_push_tail (&self->priv->supersedes, g_object_ref (l->data));
+
+ if (self->priv->supersedes_token == NULL)
+ self->priv->supersedes_token = g_strdup (old_event->priv->token);
+}
+
+
+/**
+ * tpl_text_event_dup_supersedes
+ * @self: a #TplTextEvent
+ *
+ * Returns: (transfer full): A #GList of #TplTextEvent that this event
+ * supersedes. Should be freed using g_list_free_full (l, g_object_unref).
+ */
+GList *
+tpl_text_event_dup_supersedes (TplTextEvent *self)
+{
+ GList *supersedes = NULL;
+ GList *l;
+
+ /* Iterate backwards to copy quickly (thanks GList) */
+ for (l = self->priv->supersedes.tail; l != NULL; l = l->prev)
+ supersedes = g_list_prepend (supersedes, g_object_ref (l->data));
+
+ return supersedes;
+}
+
+
+/**
* tpl_text_event_get_message_type
* @self: a #TplTextEvent
*