summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonny Lamb <jonny.lamb@collabora.co.uk>2011-11-09 19:36:04 +0000
committerJonny Lamb <jonny.lamb@collabora.co.uk>2011-11-09 19:36:04 +0000
commit4c1f77918863361e2b44171f11cc82379b936354 (patch)
tree783f397463438deffaf8d6a72715f980dac2d9ea
parentcab22c8a694a21b48073f572baf49c907ce2bf9d (diff)
downloadtelepathy-salut-4c1f77918863361e2b44171f11cc82379b936354.tar.gz
metadata: update to new draft
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
-rw-r--r--extensions/Channel_Interface_File_Transfer_Metadata.xml14
-rw-r--r--src/file-transfer-channel.c23
-rw-r--r--src/ft-manager.c3
-rw-r--r--tests/twisted/avahi/file-transfer/file_transfer_helper.py13
-rw-r--r--tests/twisted/avahi/file-transfer/metadata.py4
5 files changed, 35 insertions, 22 deletions
diff --git a/extensions/Channel_Interface_File_Transfer_Metadata.xml b/extensions/Channel_Interface_File_Transfer_Metadata.xml
index ea42332d..da7af77b 100644
--- a/extensions/Channel_Interface_File_Transfer_Metadata.xml
+++ b/extensions/Channel_Interface_File_Transfer_Metadata.xml
@@ -57,7 +57,7 @@
</property>
<property name="Metadata" tp:name-for-bindings="Metadata"
- type="a{ss}" tp:type="String_String_Map" access="readwrite"
+ type="a{sas}" tp:type="Metadata" access="readwrite"
tp:immutable="sì" tp:requestable="naturalmente">
<tp:docstring xmlns="http://www.w3.org/1999/xhtml">
<p>Additional information about the file transfer set by the
@@ -66,6 +66,18 @@
</tp:docstring>
</property>
+ <tp:mapping name="Metadata" type="a{ua{sv}}">
+ <tp:docstring>
+ A mapping from string key to a list of strings, used in the
+ <tp:member-ref>Metadata</tp:member-ref> property. To emulate a
+ simple string -> string hash table one should have exactly one
+ member in the value string list. A string list is used instead
+ of a single string so one can transfer RDF triples.
+ </tp:docstring>
+ <tp:member name="Key" type="s"/>
+ <tp:member name="Values" type="as"/>
+ </tp:mapping>
+
</interface>
</node>
<!-- vim:set sw=2 sts=2 et ft=xml: -->
diff --git a/src/file-transfer-channel.c b/src/file-transfer-channel.c
index c3e901ca..6adba642 100644
--- a/src/file-transfer-channel.c
+++ b/src/file-transfer-channel.c
@@ -37,6 +37,7 @@
#include "file-transfer-channel.h"
#include "signals-marshal.h"
+#include <extensions/_gen/gtypes.h>
#include "connection.h"
#include "im-manager.h"
#include "contact.h"
@@ -873,7 +874,7 @@ salut_file_transfer_channel_class_init (
param_spec = g_param_spec_boxed ("metadata",
"Metadata",
"The Metadata.Metadata property of this channel",
- TP_HASH_TYPE_STRING_STRING_MAP,
+ SALUT_HASH_TYPE_METADATA,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_METADATA,
param_spec);
@@ -1203,13 +1204,15 @@ add_metadata_forms (SalutFileTransferChannel *self,
g_hash_table_iter_init (&iter, self->priv->metadata);
while (g_hash_table_iter_next (&iter, &key, &val))
{
- wocky_node_add_build (x,
- '(', "field",
- '@', "var", key,
- '(', "value",
- '$', val,
- ')',
- ')', NULL);
+ const gchar * const *values = val;
+
+ WockyNode *field = wocky_node_add_child (x, "field");
+ wocky_node_set_attribute (field, "var", key);
+
+ for (; values != NULL && *values != NULL; values++)
+ {
+ wocky_node_add_child_with_content (field, "value", *values);
+ }
}
form = wocky_data_form_new_from_node (x, &error);
@@ -1783,7 +1786,7 @@ extract_metadata (GibberFileTransfer *ft)
return NULL;
metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_free);
+ g_free, (GDestroyNotify) g_strfreev);
g_hash_table_iter_init (&iter, form->fields);
while (g_hash_table_iter_next (&iter, &key, &value))
@@ -1796,7 +1799,7 @@ extract_metadata (GibberFileTransfer *ft)
g_hash_table_insert (metadata,
g_strdup (var),
- g_strdup (field->raw_value_contents[0]));
+ g_strdupv (field->raw_value_contents));
}
return metadata;
diff --git a/src/ft-manager.c b/src/ft-manager.c
index 5de5d7fe..b7fa7492 100644
--- a/src/ft-manager.c
+++ b/src/ft-manager.c
@@ -33,6 +33,7 @@
#include <salut/caps-channel-manager.h>
+#include <extensions/_gen/gtypes.h>
#include "file-transfer-channel.h"
#include "contact-manager.h"
#include "presence-cache.h"
@@ -405,7 +406,7 @@ salut_ft_manager_handle_request (TpChannelManager *manager,
metadata = tp_asv_get_boxed (request_properties,
SALUT_IFACE_CHANNEL_INTERFACE_FILE_TRANSFER_METADATA ".Metadata",
- TP_HASH_TYPE_STRING_STRING_MAP);
+ SALUT_HASH_TYPE_METADATA);
if (metadata != NULL && g_hash_table_lookup ((GHashTable *) metadata, "FORM_TYPE"))
{
diff --git a/tests/twisted/avahi/file-transfer/file_transfer_helper.py b/tests/twisted/avahi/file-transfer/file_transfer_helper.py
index b798f475..3f9f26d6 100644
--- a/tests/twisted/avahi/file-transfer/file_transfer_helper.py
+++ b/tests/twisted/avahi/file-transfer/file_transfer_helper.py
@@ -55,8 +55,8 @@ class FileTransferTest(object):
CONTACT_NAME = 'test-ft'
service_name = 'wacky.service.name'
- metadata = {'loads': 'of',
- 'mental': 'data'}
+ metadata = {'loads': ['of'],
+ 'mental': ['data']}
def __init__(self):
self.file = File()
@@ -214,7 +214,7 @@ class ReceiveFileTest(FileTransferTest):
add_dataforms(query, service_form)
if self.metadata:
- metadata_form = {ns.TP_FT_METADATA: {k: [v] for k, v in self.metadata.items()}}
+ metadata_form = {ns.TP_FT_METADATA: self.metadata}
add_dataforms(query, metadata_form)
self.outbound.send(iq)
@@ -384,7 +384,7 @@ class SendFileTest(FileTransferTest):
if self.service_name:
request[cs.FT_SERVICE_NAME] = self.service_name
if self.metadata:
- request[cs.FT_METADATA] = dbus.Dictionary(self.metadata, signature='ss')
+ request[cs.FT_METADATA] = dbus.Dictionary(self.metadata, signature='sas')
if uri:
request[cs.FT_URI] = self.file.uri
@@ -458,10 +458,7 @@ class SendFileTest(FileTransferTest):
assert ns.TP_FT_METADATA_SERVICE not in forms
if self.metadata:
- # the dataform isn't such a simple a{ss} because it can
- # have multiple values
- expected = {k:[v] for k,v in self.metadata.items()}
- assertEquals(expected, forms[ns.TP_FT_METADATA])
+ assertEquals(self.metadata, forms[ns.TP_FT_METADATA])
else:
assert ns.TP_FT_METADATA not in forms
diff --git a/tests/twisted/avahi/file-transfer/metadata.py b/tests/twisted/avahi/file-transfer/metadata.py
index 5b96d680..41811ab8 100644
--- a/tests/twisted/avahi/file-transfer/metadata.py
+++ b/tests/twisted/avahi/file-transfer/metadata.py
@@ -34,7 +34,7 @@ class SendFileBadProps(SendFileTest):
cs.FT_DATE: self.file.date,
cs.FT_INITIAL_OFFSET: 0,
cs.FT_SERVICE_NAME: self.service_name,
- cs.FT_METADATA: dbus.Dictionary(self.metadata, signature='ss')}
+ cs.FT_METADATA: dbus.Dictionary(self.metadata, signature='sas')}
call_async(self.q, self.conn.Requests, 'CreateChannel', request)
@@ -60,7 +60,7 @@ class SendFileBadContact(SendFileTest):
cs.FT_DATE: self.file.date,
cs.FT_INITIAL_OFFSET: 0,
cs.FT_SERVICE_NAME: self.service_name,
- cs.FT_METADATA: dbus.Dictionary(self.metadata, signature='ss')}
+ cs.FT_METADATA: dbus.Dictionary(self.metadata, signature='sas')}
call_async(self.q, self.conn.Requests, 'CreateChannel', request)