[next] telepathy-glib: TpFileTransferChannel: store metadata as a GVariant
Guillaume Desmottes
gdesmott at kemper.freedesktop.org
Fri Mar 7 02:22:28 PST 2014
Module: telepathy-glib
Branch: next
Commit: 3b54a2b0509a0c0731a96507fdf5a143d00bc8ae
URL: http://cgit.freedesktop.org/telepathy/telepathy-glib/commit/?id=3b54a2b0509a0c0731a96507fdf5a143d00bc8ae
Author: Guillaume Desmottes <guillaume.desmottes at collabora.co.uk>
Date: Mon Feb 24 12:21:27 2014 +0100
TpFileTransferChannel: store metadata as a GVariant
---
.../telepathy-glib/telepathy-glib-sections.txt | 2 +-
telepathy-glib/file-transfer-channel.c | 38 +++++++++++---------
telepathy-glib/file-transfer-channel.h | 3 +-
tests/dbus/file-transfer-channel.c | 33 +++++++++++++----
4 files changed, 50 insertions(+), 26 deletions(-)
diff --git a/docs/reference/telepathy-glib/telepathy-glib-sections.txt b/docs/reference/telepathy-glib/telepathy-glib-sections.txt
index 96e1249..02c8791 100644
--- a/docs/reference/telepathy-glib/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib/telepathy-glib-sections.txt
@@ -5441,7 +5441,7 @@ tp_file_transfer_channel_get_size
tp_file_transfer_channel_get_transferred_bytes
tp_file_transfer_channel_get_state
tp_file_transfer_channel_get_service_name
-tp_file_transfer_channel_get_metadata
+tp_file_transfer_channel_dup_metadata
tp_file_transfer_channel_accept_file_async
tp_file_transfer_channel_accept_file_finish
tp_file_transfer_channel_provide_file_async
diff --git a/telepathy-glib/file-transfer-channel.c b/telepathy-glib/file-transfer-channel.c
index 28e6c37..6392ce7 100644
--- a/telepathy-glib/file-transfer-channel.c
+++ b/telepathy-glib/file-transfer-channel.c
@@ -108,6 +108,7 @@
#include <telepathy-glib/proxy-internal.h>
#include <telepathy-glib/util-internal.h>
#include <telepathy-glib/util.h>
+#include <telepathy-glib/variant-util-internal.h>
#define DEBUG_FLAG TP_DEBUG_CHANNEL
#include "telepathy-glib/automatic-client-factory-internal.h"
@@ -146,7 +147,7 @@ struct _TpFileTransferChannelPrivate
goffset initial_offset;
/* Metadata */
const gchar *service_name;
- GHashTable *metadata; /* const gchar* => const gchar* const* */
+ GVariant *metadata; /* a{sas} */
/* Streams and sockets for sending and receiving the actual file */
GSocket *client_socket;
@@ -525,6 +526,7 @@ tp_file_transfer_channel_constructed (GObject *obj)
gboolean valid;
gint64 date;
const gchar *uri;
+ GHashTable *metadata;
G_OBJECT_CLASS (tp_file_transfer_channel_parent_class)->constructed (obj);
@@ -608,14 +610,16 @@ tp_file_transfer_channel_constructed (GObject *obj)
self->priv->service_name = tp_asv_get_string (properties,
TP_PROP_CHANNEL_INTERFACE_FILE_TRANSFER_METADATA1_SERVICE_NAME);
- self->priv->metadata = tp_asv_get_boxed (properties,
+ metadata = tp_asv_get_boxed (properties,
TP_PROP_CHANNEL_INTERFACE_FILE_TRANSFER_METADATA1_METADATA,
TP_HASH_TYPE_METADATA);
- if (self->priv->metadata == NULL)
- self->priv->metadata = g_hash_table_new (g_str_hash, g_str_equal);
+ if (metadata == NULL)
+ self->priv->metadata = g_variant_new ("a{sas}", NULL);
else
- g_hash_table_ref (self->priv->metadata);
+ self->priv->metadata = _tp_boxed_to_variant (TP_HASH_TYPE_METADATA,
+ "a{sas}", metadata);
+ g_variant_ref_sink (self->priv->metadata);
self->priv->cancellable = g_cancellable_new ();
g_signal_connect (self, "invalidated",
@@ -673,7 +677,7 @@ tp_file_transfer_channel_get_property (GObject *object,
break;
case PROP_METADATA:
- g_value_set_boxed (value, self->priv->metadata);
+ g_value_set_variant (value, self->priv->metadata);
break;
default:
@@ -714,7 +718,7 @@ tp_file_transfer_channel_dispose (GObject *obj)
tp_clear_pointer (&self->priv->date, g_date_time_unref);
g_clear_object (&self->priv->file);
- tp_clear_pointer (&self->priv->metadata, g_hash_table_unref);
+ tp_clear_pointer (&self->priv->metadata, g_variant_unref);
g_clear_object (&self->priv->stream);
if (self->priv->cancellable != NULL)
@@ -997,10 +1001,11 @@ tp_file_transfer_channel_class_init (TpFileTransferChannelClass *klass)
*
* Since: 0.17.1
*/
- param_spec = g_param_spec_boxed ("metadata",
+ param_spec = g_param_spec_variant ("metadata",
"Metadata",
- "The Metadata.Metadata property of this channel",
- TP_HASH_TYPE_METADATA,
+ "The Metadata.Metadata property of this channel as a variant of type"
+ "a{sas}, i.e. map with string keys and array-of-strings values",
+ G_VARIANT_TYPE ("a{sas}"), NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_METADATA,
param_spec);
@@ -1637,20 +1642,21 @@ tp_file_transfer_channel_get_service_name (TpFileTransferChannel *self)
}
/**
- * tp_file_transfer_channel_get_metadata:
+ * tp_file_transfer_channel_dup_metadata:
* @self: a #TpFileTransferChannel
*
* Return the #TpFileTransferChannel:metadata property
*
- * Returns: (transfer none) (element-type utf8 GStrv): the
- * value of the #TpFileTransferChannel:metadata property
+ * Returns: (transfer full): the
+ * value of the #TpFileTransferChannel:metadata property as a variant of type
+ * "a{sas}, i.e. map with string keys and array-of-strings values.
*
* Since: 0.17.1
*/
-const GHashTable *
-tp_file_transfer_channel_get_metadata (TpFileTransferChannel *self)
+GVariant *
+tp_file_transfer_channel_dup_metadata (TpFileTransferChannel *self)
{
g_return_val_if_fail (TP_IS_FILE_TRANSFER_CHANNEL (self), NULL);
- return self->priv->metadata;
+ return g_variant_ref (self->priv->metadata);
}
diff --git a/telepathy-glib/file-transfer-channel.h b/telepathy-glib/file-transfer-channel.h
index 6d9e112..192b896 100644
--- a/telepathy-glib/file-transfer-channel.h
+++ b/telepathy-glib/file-transfer-channel.h
@@ -127,8 +127,7 @@ _TP_AVAILABLE_IN_0_18
const gchar * tp_file_transfer_channel_get_service_name (
TpFileTransferChannel *self);
-_TP_AVAILABLE_IN_0_18
-const GHashTable * tp_file_transfer_channel_get_metadata (
+GVariant * tp_file_transfer_channel_dup_metadata (
TpFileTransferChannel *self);
G_END_DECLS
diff --git a/tests/dbus/file-transfer-channel.c b/tests/dbus/file-transfer-channel.c
index 1ff983e..9daa525 100644
--- a/tests/dbus/file-transfer-channel.c
+++ b/tests/dbus/file-transfer-channel.c
@@ -378,6 +378,24 @@ test_create_unrequested (Test *test,
g_assert_no_error (error);
}
+static void
+check_metadata (GVariant *metadata)
+{
+ GVariant *as;
+ const gchar **metadata_values;
+ gsize len;
+
+ g_assert (metadata != NULL);
+ g_assert_cmpuint (g_variant_n_children (metadata), ==, 1);
+ as = g_variant_lookup_value (metadata, "banana", G_VARIANT_TYPE ("as"));
+ metadata_values = g_variant_get_strv (as, &len);
+ g_assert_cmpuint (len, ==, 1);
+ g_assert_cmpuint (g_strv_length ((GStrv) metadata_values), ==, 1);
+ g_assert_cmpstr (metadata_values[0], ==, "cheese");
+ g_free (metadata_values);
+ g_variant_unref (as);
+}
+
/* Test setting and getting properties */
static void
test_properties (Test *test,
@@ -386,8 +404,7 @@ test_properties (Test *test,
GDateTime *date1, *date2;
TpFileTransferStateChangeReason reason;
const GError *error = NULL;
- const GHashTable *metadata;
- const gchar * const *metadata_values;
+ GVariant *metadata;
create_file_transfer_channel (test, FALSE, TP_SOCKET_ADDRESS_TYPE_UNIX,
TP_SOCKET_ACCESS_CONTROL_LOCALHOST);
@@ -418,11 +435,13 @@ test_properties (Test *test,
g_assert_cmpstr (tp_file_transfer_channel_get_service_name (test->channel),
==, "fit.service.name");
- metadata = tp_file_transfer_channel_get_metadata (test->channel);
- g_assert_cmpuint (g_hash_table_size ((GHashTable *) metadata), ==, 1);
- metadata_values = g_hash_table_lookup ((GHashTable *) metadata, "banana");
- g_assert_cmpuint (g_strv_length ((GStrv) metadata_values), ==, 1);
- g_assert_cmpstr (metadata_values[0], ==, "cheese");
+ metadata = tp_file_transfer_channel_dup_metadata (test->channel);
+ check_metadata (metadata);
+ g_variant_unref (metadata);
+
+ g_object_get (test->channel, "metadata", &metadata, NULL);
+ check_metadata (metadata);
+ g_variant_unref (metadata);
error = tp_proxy_get_invalidated (test->channel);
g_assert_no_error (error);
More information about the telepathy-commits
mailing list