[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