summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2012-09-19 12:12:40 +0100
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-09-26 14:50:15 +0200
commit3db2b44439ee7330eaa15ab374ebb033e8296063 (patch)
tree7fce13bbbfb650ef6b799b66fee265670b448197
parent9720a304317d43b9ada1555b4542bcece7457c8a (diff)
downloadtelepathy-glib-3db2b44439ee7330eaa15ab374ebb033e8296063.tar.gz
tp_message_set_variant: add and test
https://bugs.freedesktop.org/show_bug.cgi?id=55096
-rw-r--r--docs/reference/telepathy-glib-sections.txt1
-rw-r--r--telepathy-glib/message.c41
-rw-r--r--telepathy-glib/message.h3
-rw-r--r--tests/dbus/cm-message.c4
4 files changed, 46 insertions, 3 deletions
diff --git a/docs/reference/telepathy-glib-sections.txt b/docs/reference/telepathy-glib-sections.txt
index 1ebf47cb7..f50622707 100644
--- a/docs/reference/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib-sections.txt
@@ -2765,6 +2765,7 @@ tp_message_append_part
tp_message_delete_key
tp_message_delete_part
tp_message_set
+tp_message_set_variant
tp_message_set_boolean
tp_message_set_bytes
tp_message_set_int16
diff --git a/telepathy-glib/message.c b/telepathy-glib/message.c
index 508e86e33..4b410701e 100644
--- a/telepathy-glib/message.c
+++ b/telepathy-glib/message.c
@@ -614,13 +614,15 @@ tp_message_set_bytes (TpMessage *self,
* @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
- * @source: a value
+ * @source: a value, encoded as dbus-glib would
*
* Set @key in part @part of @self to have a copy of @source as its value.
*
* If @source represents a data structure containing handles, they should
* all be referenced with tp_message_ref_handle() first.
*
+ * In high-level language bindings, use tp_message_set_variant() instead.
+ *
* Since: 0.7.21
*/
void
@@ -639,6 +641,43 @@ tp_message_set (TpMessage *self,
}
/**
+ * tp_message_set_variant:
+ * @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
+ * @value: a value
+ *
+ * Set @key in part @part of @self to have @value as its value.
+ *
+ * If @value is a floating reference (see g_variant_ref_sink()), then this
+ * function will take ownership of it.
+ *
+ * Since: 0.UNRELEASED
+ */
+void
+tp_message_set_variant (TpMessage *self,
+ guint part,
+ const gchar *key,
+ GVariant *value)
+{
+ GValue *gvalue;
+
+ g_return_if_fail (part < self->parts->len);
+ g_return_if_fail (key != NULL);
+ g_return_if_fail (value != NULL);
+ g_return_if_fail (self->priv->mutable);
+
+ g_variant_ref_sink (value);
+ gvalue = g_slice_new0 (GValue);
+ dbus_g_value_parse_g_variant (value, gvalue);
+ g_variant_unref (value);
+
+ g_hash_table_insert (g_ptr_array_index (self->parts, part),
+ g_strdup (key), gvalue);
+}
+
+/**
* tp_message_take_message:
* @self: a #TpCMMessage
* @part: a part number, which must be strictly less than the number
diff --git a/telepathy-glib/message.h b/telepathy-glib/message.h
index e4f7c288c..50df7f2d6 100644
--- a/telepathy-glib/message.h
+++ b/telepathy-glib/message.h
@@ -74,6 +74,9 @@ 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);
+_TP_AVAILABLE_IN_UNRELEASED
+void tp_message_set_variant (TpMessage *self, guint part, const gchar *key,
+ GVariant *value);
gchar * tp_message_to_text (TpMessage *message,
TpChannelTextMessageFlags *out_flags) G_GNUC_WARN_UNUSED_RESULT;
diff --git a/tests/dbus/cm-message.c b/tests/dbus/cm-message.c
index 42f5de9f5..5e504b3eb 100644
--- a/tests/dbus/cm-message.c
+++ b/tests/dbus/cm-message.c
@@ -295,8 +295,8 @@ test_take_message (Test *test,
tp_message_set_uint32 (msg, 0, "message-type",
TP_CHANNEL_TEXT_MESSAGE_TYPE_DELIVERY_REPORT);
- tp_message_set_uint32 (msg, 0, "delivery-status",
- TP_DELIVERY_STATUS_DELIVERED);
+ tp_message_set_variant (msg, 0, "delivery-status",
+ g_variant_new_uint32 (TP_DELIVERY_STATUS_DELIVERED));
tp_cm_message_take_message (msg, 0, "delivery-echo", echo);
/* ensure the message was destroyed */