diff options
author | David Laban <david.laban@collabora.co.uk> | 2011-05-17 18:05:44 -0400 |
---|---|---|
committer | David Laban <david.laban@collabora.co.uk> | 2011-05-17 18:05:44 -0400 |
commit | 887a15b3786107bd1ac1110408fa3cfa4c9f7944 (patch) | |
tree | 9ab86e152c7e4382c59f4f2c06a59676b3bbe5ac | |
parent | ea98862759782023b56bd13778c02e49b441f246 (diff) | |
download | telepathy-logger-887a15b3786107bd1ac1110408fa3cfa4c9f7944.tar.gz |
tpl_text_event_{add,dup}_supersedes
A list of TplTextEvent (intended to be in log order)
-rw-r--r-- | telepathy-logger/text-event.c | 65 | ||||
-rw-r--r-- | telepathy-logger/text-event.h | 4 |
2 files changed, 69 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 * diff --git a/telepathy-logger/text-event.h b/telepathy-logger/text-event.h index 79105b5..1648d8c 100644 --- a/telepathy-logger/text-event.h +++ b/telepathy-logger/text-event.h @@ -45,5 +45,9 @@ const gchar *tpl_text_event_get_message (TplTextEvent *self); const gchar *tpl_text_event_get_message_token (TplTextEvent *self); const gchar *tpl_text_event_get_supersedes_token (TplTextEvent *self); +void tpl_text_event_add_supersedes (TplTextEvent *self, + TplTextEvent *old_event); +GList *tpl_text_event_dup_supersedes (TplTextEvent *self); + G_END_DECLS #endif // __TPL_TEXT_EVENT_H__ |