[next] telepathy-glib: message: change string getter to _dup_

Guillaume Desmottes gdesmott at kemper.freedesktop.org
Thu Mar 6 04:20:08 PST 2014


Module: telepathy-glib
Branch: next
Commit: fd8ec251c418bb3496f0c1fe820e1a29855b4c34
URL:    http://cgit.freedesktop.org/telepathy/telepathy-glib/commit/?id=fd8ec251c418bb3496f0c1fe820e1a29855b4c34

Author: Guillaume Desmottes <guillaume.desmottes at collabora.co.uk>
Date:   Wed Feb 26 15:18:11 2014 +0100

message: change string getter to _dup_

When switching to GVariant we won't be able to guarantee the lifetime of the
returned string so best to dup them.

---

 .../telepathy-glib/telepathy-glib-sections.txt     |    6 +--
 telepathy-glib/message.c                           |   43 +++++++++++---------
 telepathy-glib/message.h                           |    6 +--
 telepathy-logger/text-channel.c                    |   31 +++++++-------
 tests/dbus/cm-message.c                            |   15 ++++---
 5 files changed, 53 insertions(+), 48 deletions(-)

diff --git a/docs/reference/telepathy-glib/telepathy-glib-sections.txt b/docs/reference/telepathy-glib/telepathy-glib-sections.txt
index 5859518..40f0cef 100644
--- a/docs/reference/telepathy-glib/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib/telepathy-glib-sections.txt
@@ -2107,9 +2107,9 @@ tp_message_to_text
 tp_message_get_message_type
 tp_message_get_received_timestamp
 tp_message_get_sent_timestamp
-tp_message_get_specific_to_interface
-tp_message_get_supersedes
-tp_message_get_token
+tp_message_dup_specific_to_interface
+tp_message_dup_supersedes
+tp_message_dup_token
 tp_message_is_delivery_report
 tp_message_is_rescued
 tp_message_is_scrollback
diff --git a/telepathy-glib/message.c b/telepathy-glib/message.c
index c0face0..1845e3a 100644
--- a/telepathy-glib/message.c
+++ b/telepathy-glib/message.c
@@ -737,7 +737,7 @@ tp_message_is_mutable (TpMessage *self)
 }
 
 /**
- * tp_message_get_token:
+ * tp_message_dup_token:
  * @self: a message
  *
  * Return this message's identifier in the underlying protocol. This is
@@ -747,12 +747,12 @@ tp_message_is_mutable (TpMessage *self)
  *
  * If there is no suitable token, return %NULL.
  *
- * Returns: (transfer none): a non-empty opaque identifier, or %NULL if none
+ * Returns: (transfer full): a non-empty opaque identifier, or %NULL if none
  *
  * Since: 0.13.9
  */
-const gchar *
-tp_message_get_token (TpMessage *self)
+gchar *
+tp_message_dup_token (TpMessage *self)
 {
   const gchar *token;
 
@@ -763,7 +763,7 @@ tp_message_get_token (TpMessage *self)
   if (tp_str_empty (token))
     return NULL;
   else
-    return token;
+    return g_strdup (token);
 }
 
 /**
@@ -870,21 +870,19 @@ tp_message_is_rescued (TpMessage *self)
 }
 
 /**
- * tp_message_get_supersedes:
+ * tp_message_dup_supersedes:
  * @self: a message
  *
  * If this message replaces a previous message, return the value of
- * tp_message_get_token() for that previous message. Otherwise, return %NULL.
+ * tp_message_dup_token() for that previous message. Otherwise, return %NULL.
  *
  * For instance, a user interface could replace the superseded
  * message with this message, or grey out the superseded message.
  *
- * Returns: (transfer none): a non-empty opaque identifier, or %NULL if none
- *
- * Since: 0.13.9
+ * Returns: (transfer full): a non-empty opaque identifier, or %NULL if none
  */
-const gchar *
-tp_message_get_supersedes (TpMessage *self)
+gchar *
+tp_message_dup_supersedes (TpMessage *self)
 {
   const gchar *token;
 
@@ -895,11 +893,11 @@ tp_message_get_supersedes (TpMessage *self)
   if (tp_str_empty (token))
     return NULL;
   else
-    return token;
+    return g_strdup (token);
 }
 
 /**
- * tp_message_get_specific_to_interface:
+ * tp_message_dup_specific_to_interface:
  * @self: a message
  *
  * If this message is specific to a particular D-Bus interface and should
@@ -908,16 +906,21 @@ tp_message_get_supersedes (TpMessage *self)
  *
  * If this message is an ordinary message or delivery report, return %NULL.
  *
- * Returns: (transfer none): a D-Bus interface name, or %NULL for ordinary
+ * Returns: (transfer full): a D-Bus interface name, or %NULL for ordinary
  *  messages and delivery reports
- *
- * Since: 0.13.9
  */
-const gchar *
-tp_message_get_specific_to_interface (TpMessage *self)
+gchar *
+tp_message_dup_specific_to_interface (TpMessage *self)
 {
+  const gchar *interface;
+
   g_return_val_if_fail (TP_IS_MESSAGE (self), NULL);
-  return tp_asv_get_string (tp_message_peek (self, 0), "interface");
+
+  interface = tp_asv_get_string (tp_message_peek (self, 0), "interface");
+  if (interface == NULL)
+    return NULL;
+
+  return g_strdup (interface);
 }
 
 /**
diff --git a/telepathy-glib/message.h b/telepathy-glib/message.h
index e3a767f..608fa6a 100644
--- a/telepathy-glib/message.h
+++ b/telepathy-glib/message.h
@@ -82,13 +82,13 @@ gchar * tp_message_to_text (TpMessage *message) G_GNUC_WARN_UNUSED_RESULT;
 gboolean tp_message_is_mutable (TpMessage *self);
 
 TpChannelTextMessageType tp_message_get_message_type (TpMessage *self);
-const gchar *tp_message_get_token (TpMessage *self);
+gchar *tp_message_dup_token (TpMessage *self);
 gint64 tp_message_get_sent_timestamp (TpMessage *self);
 gint64 tp_message_get_received_timestamp (TpMessage *self);
 gboolean tp_message_is_scrollback (TpMessage *self);
 gboolean tp_message_is_rescued (TpMessage *self);
-const gchar *tp_message_get_supersedes (TpMessage *self);
-const gchar *tp_message_get_specific_to_interface (TpMessage *self);
+gchar *tp_message_dup_supersedes (TpMessage *self);
+gchar *tp_message_dup_specific_to_interface (TpMessage *self);
 gboolean tp_message_is_delivery_report (TpMessage *self);
 _TP_AVAILABLE_IN_0_16
 guint32 tp_message_get_pending_message_id (TpMessage *self,
diff --git a/telepathy-logger/text-channel.c b/telepathy-logger/text-channel.c
index 7600d94..19f703c 100644
--- a/telepathy-logger/text-channel.c
+++ b/telepathy-logger/text-channel.c
@@ -165,17 +165,6 @@ get_network_timestamp (TpMessage *message)
   return timestamp;
 }
 
-
-static gint64
-get_message_edit_timestamp (TpMessage *message)
-{
-  if (tp_message_get_supersedes (message) != NULL)
-    return get_network_timestamp (message);
-  else
-    return 0;
-}
-
-
 static gint64
 get_message_timestamp (TpMessage *message)
 {
@@ -199,8 +188,8 @@ tpl_text_channel_store_message (TplTextChannel *self,
   TplTextChannelPriv *priv = self->priv;
   const gchar *direction;
   TpChannelTextMessageType type;
-  gint64 timestamp;
-  gchar *text;
+  gint64 timestamp, edit_timestamp;
+  gchar *text, *token, *supersedes;
   TplTextEvent *event;
   TplLogManager *logmanager;
   GError *error = NULL;
@@ -250,6 +239,13 @@ tpl_text_channel_store_message (TplTextChannel *self,
         tpl_entity_get_alias (sender),
         tpl_entity_get_identifier (sender));
 
+  token = tp_message_dup_token (message);
+  supersedes = tp_message_dup_supersedes (message);
+
+  if (supersedes != NULL)
+    edit_timestamp = get_network_timestamp (message);
+  else
+    edit_timestamp = 0;
 
   /* Initialise TplTextEvent */
   event = g_object_new (TPL_TYPE_TEXT_EVENT,
@@ -259,14 +255,17 @@ tpl_text_channel_store_message (TplTextChannel *self,
       "receiver", receiver,
       "sender", sender,
       "timestamp", timestamp,
-      "message-token", tp_message_get_token (message),
-      "supersedes-token", tp_message_get_supersedes (message),
-      "edit-timestamp", get_message_edit_timestamp (message),
+      "message-token", token,
+      "supersedes-token", supersedes,
+      "edit-timestamp", edit_timestamp,
       /* TplTextEvent */
       "message-type", type,
       "message", text,
       NULL);
 
+  g_free (token);
+  g_free (supersedes);
+
   /* Store sent event */
   logmanager = tpl_log_manager_dup_singleton ();
   _tpl_log_manager_add_event (logmanager, TPL_EVENT (event), &error);
diff --git a/tests/dbus/cm-message.c b/tests/dbus/cm-message.c
index 7ddc5ea..f014fd1 100644
--- a/tests/dbus/cm-message.c
+++ b/tests/dbus/cm-message.c
@@ -53,6 +53,7 @@ test_new_from_parts (Test *test,
   GVariant *part_vardict;
   gboolean valid;
   const gchar *s;
+  gchar *token;
 
   parts = g_ptr_array_new_full (2, (GDestroyNotify) g_hash_table_unref);
 
@@ -108,13 +109,15 @@ test_new_from_parts (Test *test,
   g_assert_cmpuint (tp_message_get_message_type (msg), ==,
       TP_CHANNEL_TEXT_MESSAGE_TYPE_NOTICE);
   g_assert_cmpuint (tp_cm_message_get_sender (msg), ==, sender);
-  g_assert_cmpstr (tp_message_get_token (msg), ==, "token");
+  token = tp_message_dup_token (msg);
+  g_assert_cmpstr (token, ==, "token");
+  g_free (token);
   g_assert_cmpint ((gint) tp_message_get_sent_timestamp (msg), ==, 42);
   g_assert_cmpint ((gint) tp_message_get_received_timestamp (msg), ==, 666);
   g_assert_cmpint (tp_message_is_scrollback (msg), ==, TRUE);
   g_assert_cmpint (tp_message_is_rescued (msg), ==, FALSE);
-  g_assert_cmpstr (tp_message_get_supersedes (msg), ==, NULL);
-  g_assert_cmpstr (tp_message_get_specific_to_interface (msg), ==, NULL);
+  g_assert_cmpstr (tp_message_dup_supersedes (msg), ==, NULL);
+  g_assert_cmpstr (tp_message_dup_specific_to_interface (msg), ==, NULL);
   g_assert_cmpint (tp_message_is_delivery_report (msg), ==, FALSE);
   g_assert_cmpuint (tp_message_get_pending_message_id (msg, &valid), ==, 666);
   g_assert (valid);
@@ -156,13 +159,13 @@ test_new_text (Test *test,
   g_assert_cmpuint (tp_message_get_message_type (msg), ==,
       TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION);
   g_assert_cmpuint (tp_cm_message_get_sender (msg), ==, sender);
-  g_assert_cmpstr (tp_message_get_token (msg), ==, NULL);
+  g_assert_cmpstr (tp_message_dup_token (msg), ==, NULL);
   g_assert_cmpint ((gint) tp_message_get_sent_timestamp (msg), ==, 0);
   g_assert_cmpint ((gint) tp_message_get_received_timestamp (msg), ==, 0);
   g_assert_cmpint (tp_message_is_scrollback (msg), ==, FALSE);
   g_assert_cmpint (tp_message_is_rescued (msg), ==, FALSE);
-  g_assert_cmpstr (tp_message_get_supersedes (msg), ==, NULL);
-  g_assert_cmpstr (tp_message_get_specific_to_interface (msg), ==, NULL);
+  g_assert_cmpstr (tp_message_dup_supersedes (msg), ==, NULL);
+  g_assert_cmpstr (tp_message_dup_specific_to_interface (msg), ==, NULL);
   g_assert_cmpint (tp_message_is_delivery_report (msg), ==, FALSE);
 
   g_object_unref (msg);



More information about the telepathy-commits mailing list