diff options
author | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-06-09 15:21:16 +1000 |
---|---|---|
committer | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-06-09 15:21:16 +1000 |
commit | ef1ae465aeb17a28f9348c88302ca136c92a4179 (patch) | |
tree | 3aad832592db01348750c03557d71913e3d2fd98 /telepathy-glib/cm-message.c | |
parent | a6d52df4a22c71093354ef2522d6a5c3ab6392f0 (diff) | |
download | telepathy-glib-ef1ae465aeb17a28f9348c88302ca136c92a4179.tar.gz |
Copy the message more deeply so it may be unreffed or changed
Create a new array and maps and keys but 'dup' the values. This should be safe
because people should be using tp_message_set_* which replaces the GValue,
rather than fiddling with its contents.
Diffstat (limited to 'telepathy-glib/cm-message.c')
-rw-r--r-- | telepathy-glib/cm-message.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/telepathy-glib/cm-message.c b/telepathy-glib/cm-message.c index 3bf11e28e..90bb44ba0 100644 --- a/telepathy-glib/cm-message.c +++ b/telepathy-glib/cm-message.c @@ -142,6 +142,9 @@ tp_cm_message_set_message (TpMessage *self, const gchar *key, TpMessage *message) { + GPtrArray *parts; + guint i; + g_return_if_fail (self != NULL); g_return_if_fail (part < self->parts->len); g_return_if_fail (key != NULL); @@ -153,10 +156,25 @@ tp_cm_message_set_message (TpMessage *self, g_return_if_fail (TP_CM_MESSAGE (self)->priv->connection == TP_CM_MESSAGE (message)->priv->connection); + parts = g_ptr_array_sized_new (message->parts->len); + + for (i = 0; i < message->parts->len; i++) + { + GHashTable *src, *dest; + + src = g_ptr_array_index (message->parts, i); + dest = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) tp_g_value_slice_free); + + tp_g_hash_table_update (dest, src, + (GBoxedCopyFunc) g_strdup, + (GBoxedCopyFunc) tp_g_value_slice_dup); + g_ptr_array_add (parts, dest); + } + g_hash_table_insert (g_ptr_array_index (self->parts, part), g_strdup (key), - tp_g_value_slice_new_boxed (TP_ARRAY_TYPE_MESSAGE_PART_LIST, - message->parts)); + tp_g_value_slice_new_take_boxed (TP_ARRAY_TYPE_MESSAGE_PART_LIST, parts)); } /** |