[Telepathy-commits] [telepathy-glib/master] TpMessage: add _take_message to insert one message into another

Will Thompson will.thompson at collabora.co.uk
Thu Dec 18 10:41:52 PST 2008


---
 docs/reference/telepathy-glib-sections.txt |    1 +
 telepathy-glib/message-mixin.c             |   58 +++++++++++++++++++++++++++-
 telepathy-glib/message-mixin.h             |    2 +
 3 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/docs/reference/telepathy-glib-sections.txt b/docs/reference/telepathy-glib-sections.txt
index d2ebd50..3b70ed6 100644
--- a/docs/reference/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib-sections.txt
@@ -1554,6 +1554,7 @@ tp_message_set_string
 tp_message_set_uint16
 tp_message_set_uint32
 tp_message_set_uint64
+tp_message_take_message
 TpMessageMixin
 TpMessageMixinSendImpl
 tp_message_mixin_finalize
diff --git a/telepathy-glib/message-mixin.c b/telepathy-glib/message-mixin.c
index 571c83e..edaf682 100644
--- a/telepathy-glib/message-mixin.c
+++ b/telepathy-glib/message-mixin.c
@@ -390,7 +390,6 @@ tp_message_ref_handle (TpMessage *self,
  * @since 0.7.UNRELEASED
  */
 static void
-G_GNUC_UNUSED
 tp_message_ref_handles (TpMessage *self,
                         TpHandleType handle_type,
                         TpIntSet *handles)
@@ -736,6 +735,63 @@ tp_message_set (TpMessage *self,
 
 
 /**
+ * tp_message_take_message:
+ * @self: a message
+ * @part: a part number, which must be strictly less than the number
+ *  returned by tp_message_count_parts()
+ * @key: a key in the mapping representing the part
+ * @message: another (distinct) message created for the same #TpBaseConnection
+ *
+ * Set @key in part @part of @self to have @message as an aa{sv} value (that
+ * is, an array of Message_Part), and take ownership of @message.  The caller
+ * should not use @message after passing it to this function.  All handle
+ * references owned by @message will subsequently belong to and be released
+ * with @self.
+ *
+ * @since 0.7.UNRELEASED
+ */
+void
+tp_message_take_message (TpMessage *self,
+                         guint part,
+                         const gchar *key,
+                         TpMessage *message)
+{
+  GValue *value;
+  guint i;
+
+  g_return_if_fail (self != NULL);
+  g_return_if_fail (part < self->parts->len);
+  g_return_if_fail (key != NULL);
+  g_return_if_fail (message != NULL);
+  g_return_if_fail (self != message);
+  g_return_if_fail (self->connection == message->connection);
+
+  /* FIXME: TP_ARRAY_TYPE_MESSAGE_PART_LIST */
+  value = tp_g_value_slice_new (dbus_g_type_get_collection ("GPtrArray",
+      TP_HASH_TYPE_MESSAGE_PART));
+  g_value_take_boxed (value, message->parts);
+  g_hash_table_insert (g_ptr_array_index (self->parts, part),
+      g_strdup (key), value);
+
+  /* Now that @self has stolen @message's parts, replace them with a stub to
+   * keep tp_message_destroy happy.
+   */
+  message->parts = g_ptr_array_sized_new (1);
+  g_ptr_array_add (message->parts, g_hash_table_new_full (g_str_hash,
+        g_str_equal, g_free, (GDestroyNotify) tp_g_value_slice_free));
+
+  for (i = 0; i < NUM_TP_HANDLE_TYPES; i++)
+    {
+      if (message->reffed_handles[i] != NULL)
+        tp_message_ref_handles (self, i,
+            tp_handle_set_peek (message->reffed_handles[i]));
+    }
+
+  tp_message_destroy (message);
+}
+
+
+/**
  * tp_message_mixin_get_offset_quark:
  *
  * <!--no documentation beyond Returns: needed-->
diff --git a/telepathy-glib/message-mixin.h b/telepathy-glib/message-mixin.h
index d29a705..299de42 100644
--- a/telepathy-glib/message-mixin.h
+++ b/telepathy-glib/message-mixin.h
@@ -72,6 +72,8 @@ void tp_message_set_bytes (TpMessage *self, guint part, const gchar *key,
     guint len, gconstpointer bytes);
 void tp_message_set (TpMessage *self, guint part, const gchar *key,
     const GValue *source);
+void tp_message_take_message (TpMessage *self, guint part, const gchar *key,
+    TpMessage *message);
 
 void tp_message_mixin_get_dbus_property (GObject *object, GQuark interface,
     GQuark name, GValue *value, gpointer unused);
-- 
1.5.6.5




More information about the Telepathy-commits mailing list