diff options
author | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2011-10-27 16:18:43 +0100 |
---|---|---|
committer | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2011-10-28 16:16:37 +0100 |
commit | c02da80c845f7852451c79a18c473f883900a4c0 (patch) | |
tree | b6fb86d347895702abba7370353adb3c799e69b5 /src/file-transfer-channel.c | |
parent | 7f3b4e7c145fad099b45ad5536b804498584a723 (diff) | |
download | telepathy-salut-c02da80c845f7852451c79a18c473f883900a4c0.tar.gz |
ft-channel: include metadata in file transfer offer
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
Diffstat (limited to 'src/file-transfer-channel.c')
-rw-r--r-- | src/file-transfer-channel.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/file-transfer-channel.c b/src/file-transfer-channel.c index 9a7512da..51eae766 100644 --- a/src/file-transfer-channel.c +++ b/src/file-transfer-channel.c @@ -45,6 +45,7 @@ #include <wocky/wocky-stanza.h> #include <wocky/wocky-meta-porter.h> #include <wocky/wocky-data-form.h> +#include <wocky/wocky-namespaces.h> #include <gibber/gibber-file-transfer.h> #include <gibber/gibber-oob-file-transfer.h> @@ -1132,6 +1133,102 @@ static gboolean setup_local_socket (SalutFileTransferChannel *self); static void ft_transferred_chunk_cb (GibberFileTransfer *ft, guint64 count, SalutFileTransferChannel *self); +static GList * +add_metadata_forms (SalutFileTransferChannel *self, + GibberFileTransfer *ft) +{ + GError *error = NULL; + GList *list = NULL; + + if (!tp_str_empty (self->priv->service_name)) + { + WockyStanza *tmp = wocky_stanza_build (WOCKY_STANZA_TYPE_IQ, + WOCKY_STANZA_SUB_TYPE_RESULT, NULL, NULL, + '(', "x", + ':', WOCKY_XMPP_NS_DATA, + '@', "type", "result", + '(', "field", + '@', "var", "FORM_TYPE", + '@', "type", "hidden", + '(', "value", + '$', NS_TP_FT_METADATA_SERVICE, + ')', + ')', + '(', "field", + '@', "var", "ServiceName", + '(', "value", + '$', self->priv->service_name, + ')', + ')', + ')', + NULL); + WockyNode *x = wocky_node_get_first_child (wocky_stanza_get_top_node (tmp)); + WockyDataForm *form = wocky_data_form_new_from_node (x, &error); + + if (form == NULL) + { + DEBUG ("Failed to parse form (wat): %s", error->message); + g_clear_error (&error); + } + else + { + list = g_list_append (list, form); + } + + g_object_unref (tmp); + } + + if (self->priv->metadata != NULL + && g_hash_table_size (self->priv->metadata) > 0) + { + WockyStanza *tmp = wocky_stanza_build (WOCKY_STANZA_TYPE_IQ, + WOCKY_STANZA_SUB_TYPE_RESULT, NULL, NULL, + '(', "x", + ':', WOCKY_XMPP_NS_DATA, + '@', "type", "result", + '(', "field", + '@', "var", "FORM_TYPE", + '@', "type", "hidden", + '(', "value", + '$', NS_TP_FT_METADATA, + ')', + ')', + ')', + NULL); + WockyNode *x = wocky_node_get_first_child (wocky_stanza_get_top_node (tmp)); + WockyDataForm *form; + GHashTableIter iter; + gpointer key, val; + + g_hash_table_iter_init (&iter, self->priv->metadata); + while (g_hash_table_iter_next (&iter, &key, &val)) + { + WockyNode *field = wocky_node_add_child (x, "field"); + + wocky_node_set_attribute (field, "var", (const gchar *) key); + + wocky_node_add_child_with_content (field, "value", + (const gchar *) val); + } + + form = wocky_data_form_new_from_node (x, &error); + + if (form == NULL) + { + DEBUG ("Failed to parse form (wat): %s", error->message); + g_clear_error (&error); + } + else + { + list = g_list_append (list, form); + } + + g_object_unref (tmp); + } + + return list; +} + static void send_file_offer (SalutFileTransferChannel *self) { @@ -1159,6 +1256,9 @@ send_file_offer (SalutFileTransferChannel *self) gibber_file_transfer_set_size (ft, self->priv->size); + g_assert (ft->dataforms == NULL); + ft->dataforms = add_metadata_forms (self, ft); + gibber_file_transfer_offer (ft); } |