From 29ab54db065d7753aebd5501680fb91049011fce Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Wed, 18 May 2011 12:51:43 +1000 Subject: Add 'token' property to EmpathyMessage This allows us to pass the 'message-token' from the TpMessage through to the chat-view. --- libempathy/empathy-message.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'libempathy/empathy-message.c') diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c index d30ce3645..79625dd61 100644 --- a/libempathy/empathy-message.c +++ b/libempathy/empathy-message.c @@ -49,6 +49,7 @@ typedef struct { TpChannelTextMessageType type; EmpathyContact *sender; EmpathyContact *receiver; + gchar *token; gchar *body; gint64 timestamp; gboolean is_backlog; @@ -74,6 +75,7 @@ enum { PROP_TYPE, PROP_SENDER, PROP_RECEIVER, + PROP_TOKEN, PROP_BODY, PROP_TIMESTAMP, PROP_IS_BACKLOG, @@ -116,6 +118,13 @@ empathy_message_class_init (EmpathyMessageClass *class) "The receiver of the message", EMPATHY_TYPE_CONTACT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_TOKEN, + g_param_spec_string ("token", + "Message Token", + "The message-token", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, PROP_BODY, g_param_spec_string ("body", @@ -201,6 +210,7 @@ empathy_message_finalize (GObject *object) g_object_unref (priv->tp_message); } + g_free (priv->token); g_free (priv->body); G_OBJECT_CLASS (empathy_message_parent_class)->finalize (object); @@ -226,6 +236,9 @@ message_get_property (GObject *object, case PROP_RECEIVER: g_value_set_object (value, priv->receiver); break; + case PROP_TOKEN: + g_value_set_string (value, priv->token); + break; case PROP_BODY: g_value_set_string (value, priv->body); break; @@ -272,6 +285,10 @@ message_set_property (GObject *object, empathy_message_set_receiver (EMPATHY_MESSAGE (object), EMPATHY_CONTACT (g_value_get_object (value))); break; + case PROP_TOKEN: + g_assert (priv->token == NULL); /* construct only */ + priv->token = g_value_dup_string (value); + break; case PROP_BODY: g_assert (priv->body == NULL); /* construct only */ priv->body = g_value_dup_string (value); @@ -472,6 +489,18 @@ empathy_message_set_receiver (EmpathyMessage *message, EmpathyContact *contact) g_object_notify (G_OBJECT (message), "receiver"); } +const gchar * +empathy_message_get_token (EmpathyMessage *message) +{ + EmpathyMessagePriv *priv; + + g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), NULL); + + priv = GET_PRIV (message); + + return priv->token; +} + const gchar * empathy_message_get_body (EmpathyMessage *message) { @@ -668,6 +697,7 @@ empathy_message_new_from_tp_message (TpMessage *tp_msg, message = g_object_new (EMPATHY_TYPE_MESSAGE, "body", body, + "token", tp_message_get_token (tp_msg), "type", tp_message_get_message_type (tp_msg), "timestamp", tp_message_get_received_timestamp (tp_msg), "flags", flags, -- cgit v1.2.3 From 44edc9fc835feaa279b5c20269a07aecff9e38cc Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 20 May 2011 11:34:31 +1000 Subject: Add 'supersedes' property to EmpathyMessage It would be nice to remove EmpathyMessage, because now that TpMessages are a GObject, EmpathyMessage is just an empty abstraction layer that we have to keep punching through. --- libempathy/empathy-message.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'libempathy/empathy-message.c') diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c index 79625dd61..d68309bb3 100644 --- a/libempathy/empathy-message.c +++ b/libempathy/empathy-message.c @@ -50,6 +50,7 @@ typedef struct { EmpathyContact *sender; EmpathyContact *receiver; gchar *token; + gchar *supersedes; gchar *body; gint64 timestamp; gboolean is_backlog; @@ -76,6 +77,7 @@ enum { PROP_SENDER, PROP_RECEIVER, PROP_TOKEN, + PROP_SUPERSEDES, PROP_BODY, PROP_TIMESTAMP, PROP_IS_BACKLOG, @@ -125,6 +127,13 @@ empathy_message_class_init (EmpathyMessageClass *class) "The message-token", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (object_class, + PROP_SUPERSEDES, + g_param_spec_string ("supersedes", + "Supersedes Token", + "The message-token this message supersedes", + NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, PROP_BODY, g_param_spec_string ("body", @@ -211,6 +220,7 @@ empathy_message_finalize (GObject *object) } g_free (priv->token); + g_free (priv->supersedes); g_free (priv->body); G_OBJECT_CLASS (empathy_message_parent_class)->finalize (object); @@ -239,6 +249,9 @@ message_get_property (GObject *object, case PROP_TOKEN: g_value_set_string (value, priv->token); break; + case PROP_SUPERSEDES: + g_value_set_string (value, priv->supersedes); + break; case PROP_BODY: g_value_set_string (value, priv->body); break; @@ -289,6 +302,10 @@ message_set_property (GObject *object, g_assert (priv->token == NULL); /* construct only */ priv->token = g_value_dup_string (value); break; + case PROP_SUPERSEDES: + g_assert (priv->supersedes == NULL); /* construct only */ + priv->supersedes = g_value_dup_string (value); + break; case PROP_BODY: g_assert (priv->body == NULL); /* construct only */ priv->body = g_value_dup_string (value); @@ -501,6 +518,30 @@ empathy_message_get_token (EmpathyMessage *message) return priv->token; } +const gchar * +empathy_message_get_supersedes (EmpathyMessage *message) +{ + EmpathyMessagePriv *priv; + + g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), NULL); + + priv = GET_PRIV (message); + + return priv->supersedes; +} + +gboolean +empathy_message_is_edit (EmpathyMessage *message) +{ + EmpathyMessagePriv *priv; + + g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), FALSE); + + priv = GET_PRIV (message); + + return !tp_str_empty (priv->supersedes); +} + const gchar * empathy_message_get_body (EmpathyMessage *message) { @@ -698,6 +739,7 @@ empathy_message_new_from_tp_message (TpMessage *tp_msg, message = g_object_new (EMPATHY_TYPE_MESSAGE, "body", body, "token", tp_message_get_token (tp_msg), + "supersedes", tp_message_get_supersedes (tp_msg), "type", tp_message_get_message_type (tp_msg), "timestamp", tp_message_get_received_timestamp (tp_msg), "flags", flags, -- cgit v1.2.3 From 7d48e0689c9c13bfeb7dbc21854a87dfc58a3005 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 20 May 2011 15:25:46 +1000 Subject: Set 'token' and 'supersedes' for events from the logger --- libempathy/empathy-message.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'libempathy/empathy-message.c') diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c index d68309bb3..06913dc0c 100644 --- a/libempathy/empathy-message.c +++ b/libempathy/empathy-message.c @@ -341,7 +341,8 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) TpAccount *account = NULL; TplEntity *receiver = NULL; TplEntity *sender = NULL; - gchar *body= NULL; + gchar *body = NULL; + const gchar *token = NULL, *supersedes = NULL; EmpathyContact *contact; TpChannelTextMessageType type = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL; @@ -364,14 +365,18 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) g_object_unref (acc_man); if (TPL_IS_TEXT_EVENT (logevent)) { - body = g_strdup (tpl_text_event_get_message ( - TPL_TEXT_EVENT (logevent))); + TplTextEvent *textevent = TPL_TEXT_EVENT (logevent); + + body = g_strdup (tpl_text_event_get_message (textevent)); type = tpl_text_event_get_message_type (TPL_TEXT_EVENT (logevent)); + token = tpl_text_event_get_message_token (textevent); + supersedes = tpl_text_event_get_supersedes_token (textevent); } #ifdef HAVE_CALL_LOGS else if (TPL_IS_CALL_EVENT (logevent)) { TplCallEvent *call = TPL_CALL_EVENT (logevent); + if (tpl_call_event_get_end_reason (call) == TPL_CALL_END_REASON_NO_ANSWER) body = g_strdup_printf (_("Missed call from %s"), tpl_entity_get_alias (tpl_event_get_sender (logevent))); @@ -393,6 +398,8 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) retval = g_object_new (EMPATHY_TYPE_MESSAGE, "type", type, + "token", token, + "supersedes", supersedes, "body", body, "is-backlog", TRUE, "timestamp", tpl_event_get_timestamp (logevent), -- cgit v1.2.3 From 3884ef55323a4060d043d37d565af3a8c2e9a293 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Thu, 26 May 2011 12:18:36 +1000 Subject: Add 'original-timestamp' to EmpathyMessage --- libempathy/empathy-message.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'libempathy/empathy-message.c') diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c index 06913dc0c..949c05bd9 100644 --- a/libempathy/empathy-message.c +++ b/libempathy/empathy-message.c @@ -53,6 +53,7 @@ typedef struct { gchar *supersedes; gchar *body; gint64 timestamp; + gint64 original_timestamp; gboolean is_backlog; guint id; gboolean incoming; @@ -80,6 +81,7 @@ enum { PROP_SUPERSEDES, PROP_BODY, PROP_TIMESTAMP, + PROP_ORIGINAL_TIMESTAMP, PROP_IS_BACKLOG, PROP_INCOMING, PROP_FLAGS, @@ -150,6 +152,13 @@ empathy_message_class_init (EmpathyMessageClass *class) G_MININT64, G_MAXINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (object_class, + PROP_ORIGINAL_TIMESTAMP, + g_param_spec_int64 ("original-timestamp", + "Original Timestamp", + "Timestamp of the original message", + G_MININT64, G_MAXINT64, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, PROP_IS_BACKLOG, g_param_spec_boolean ("is-backlog", @@ -258,6 +267,9 @@ message_get_property (GObject *object, case PROP_TIMESTAMP: g_value_set_int64 (value, priv->timestamp); break; + case PROP_ORIGINAL_TIMESTAMP: + g_value_set_int64 (value, priv->original_timestamp); + break; case PROP_IS_BACKLOG: g_value_set_boolean (value, priv->is_backlog); break; @@ -315,6 +327,9 @@ message_set_property (GObject *object, if (priv->timestamp <= 0) priv->timestamp = empathy_time_get_current (); break; + case PROP_ORIGINAL_TIMESTAMP: + priv->original_timestamp = g_value_get_int64 (value); + break; case PROP_IS_BACKLOG: priv->is_backlog = g_value_get_boolean (value); break; @@ -345,6 +360,7 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) const gchar *token = NULL, *supersedes = NULL; EmpathyContact *contact; TpChannelTextMessageType type = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL; + gint64 original_timestamp; g_return_val_if_fail (TPL_IS_EVENT (logevent), NULL); @@ -372,6 +388,8 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) type = tpl_text_event_get_message_type (TPL_TEXT_EVENT (logevent)); token = tpl_text_event_get_message_token (textevent); supersedes = tpl_text_event_get_supersedes_token (textevent); + + original_timestamp = tpl_text_event_get_original_timestamp (textevent); } #ifdef HAVE_CALL_LOGS else if (TPL_IS_CALL_EVENT (logevent)) { @@ -403,6 +421,7 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) "body", body, "is-backlog", TRUE, "timestamp", tpl_event_get_timestamp (logevent), + "original-timestamp", original_timestamp, NULL); if (receiver != NULL) { @@ -573,6 +592,18 @@ empathy_message_get_timestamp (EmpathyMessage *message) return priv->timestamp; } +gint64 +empathy_message_get_original_timestamp (EmpathyMessage *message) +{ + EmpathyMessagePriv *priv; + + g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), -1); + + priv = GET_PRIV (message); + + return priv->original_timestamp; +} + gboolean empathy_message_is_backlog (EmpathyMessage *message) { @@ -738,17 +769,23 @@ empathy_message_new_from_tp_message (TpMessage *tp_msg, EmpathyMessage *message; gchar *body; TpChannelTextMessageFlags flags; + gint64 original_timestamp; + const GHashTable *part = tp_message_peek (tp_msg, 0); g_return_val_if_fail (TP_IS_MESSAGE (tp_msg), NULL); body = tp_message_to_text (tp_msg, &flags); + original_timestamp = tp_asv_get_int64 (part, + "original-message-received", NULL); + message = g_object_new (EMPATHY_TYPE_MESSAGE, "body", body, "token", tp_message_get_token (tp_msg), "supersedes", tp_message_get_supersedes (tp_msg), "type", tp_message_get_message_type (tp_msg), "timestamp", tp_message_get_received_timestamp (tp_msg), + "original-timestamp", original_timestamp, "flags", flags, "is-backlog", flags & TP_CHANNEL_TEXT_MESSAGE_FLAG_SCROLLBACK, "incoming", incoming, -- cgit v1.2.3 From 830ced19dc7166bbb5aafba8db7d9dfc12e8aae2 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 27 May 2011 10:31:57 +1000 Subject: Update for new TPL API, we now get timestamp and edit_timestamp This makes it backwards to what we get in Telepathy, but we can manage by translating it into the Telepathy form. --- libempathy/empathy-message.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'libempathy/empathy-message.c') diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c index 949c05bd9..7864ee2ba 100644 --- a/libempathy/empathy-message.c +++ b/libempathy/empathy-message.c @@ -360,7 +360,7 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) const gchar *token = NULL, *supersedes = NULL; EmpathyContact *contact; TpChannelTextMessageType type = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL; - gint64 original_timestamp; + gint64 timestamp, original_timestamp = 0; g_return_val_if_fail (TPL_IS_EVENT (logevent), NULL); @@ -383,18 +383,32 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) if (TPL_IS_TEXT_EVENT (logevent)) { TplTextEvent *textevent = TPL_TEXT_EVENT (logevent); + supersedes = tpl_text_event_get_supersedes_token (textevent); + + /* tp-logger is kind of messy in that instead of having + * timestamp and original-timestamp like Telepathy it has + * timestamp (which is the original) and edited-timestamp, + * (which is when the message was edited) */ + if (tp_str_empty (supersedes)) { + /* not an edited message */ + timestamp = tpl_event_get_timestamp (logevent); + } else { + /* this is an edited event */ + original_timestamp = tpl_event_get_timestamp (logevent); + timestamp = tpl_text_event_get_edit_timestamp (textevent); + } + body = g_strdup (tpl_text_event_get_message (textevent)); type = tpl_text_event_get_message_type (TPL_TEXT_EVENT (logevent)); token = tpl_text_event_get_message_token (textevent); - supersedes = tpl_text_event_get_supersedes_token (textevent); - - original_timestamp = tpl_text_event_get_original_timestamp (textevent); } #ifdef HAVE_CALL_LOGS else if (TPL_IS_CALL_EVENT (logevent)) { TplCallEvent *call = TPL_CALL_EVENT (logevent); + timestamp = tpl_event_get_timestamp (logevent); + if (tpl_call_event_get_end_reason (call) == TPL_CALL_END_REASON_NO_ANSWER) body = g_strdup_printf (_("Missed call from %s"), tpl_entity_get_alias (tpl_event_get_sender (logevent))); @@ -420,7 +434,7 @@ empathy_message_from_tpl_log_event (TplEvent *logevent) "supersedes", supersedes, "body", body, "is-backlog", TRUE, - "timestamp", tpl_event_get_timestamp (logevent), + "timestamp", timestamp, "original-timestamp", original_timestamp, NULL); -- cgit v1.2.3