summaryrefslogtreecommitdiff
path: root/telepathy-glib/cm-message.c
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2011-06-09 15:21:16 +1000
committerDanielle Madeley <danielle.madeley@collabora.co.uk>2011-06-09 15:21:16 +1000
commitef1ae465aeb17a28f9348c88302ca136c92a4179 (patch)
tree3aad832592db01348750c03557d71913e3d2fd98 /telepathy-glib/cm-message.c
parenta6d52df4a22c71093354ef2522d6a5c3ab6392f0 (diff)
downloadtelepathy-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.c22
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));
}
/**