summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJonny Lamb <jonny.lamb@collabora.co.uk>2011-11-16 08:53:50 +0000
committerJonny Lamb <jonny.lamb@collabora.co.uk>2011-11-16 08:53:50 +0000
commitc84e19dfd4d6714b6f3a88c8f04231aeba453183 (patch)
treef9a070cd0948bdad334de320db6e445b240698dc /lib
parentbc9ae568196b3621a19e208f59ebadb2c068ef27 (diff)
parentfc23a8623e7ec3ab9e7f39381367c7d46dc73c7f (diff)
downloadtelepathy-salut-c84e19dfd4d6714b6f3a88c8f04231aeba453183.tar.gz
Merge branch 'ft-metadata'
Diffstat (limited to 'lib')
-rw-r--r--lib/gibber/gibber-file-transfer.c7
-rw-r--r--lib/gibber/gibber-file-transfer.h2
-rw-r--r--lib/gibber/gibber-oob-file-transfer.c38
3 files changed, 47 insertions, 0 deletions
diff --git a/lib/gibber/gibber-file-transfer.c b/lib/gibber/gibber-file-transfer.c
index 8036df6f..b6647c23 100644
--- a/lib/gibber/gibber-file-transfer.c
+++ b/lib/gibber/gibber-file-transfer.c
@@ -339,6 +339,13 @@ gibber_file_transfer_dispose (GObject *object)
self->priv->contact = NULL;
}
+ if (self->dataforms)
+ {
+ g_list_foreach (self->dataforms, (GFunc) g_object_unref, NULL);
+ g_list_free (self->dataforms);
+ self->dataforms = NULL;
+ }
+
G_OBJECT_CLASS (gibber_file_transfer_parent_class)->dispose (object);
}
diff --git a/lib/gibber/gibber-file-transfer.h b/lib/gibber/gibber-file-transfer.h
index e86d4cba..1e479e6e 100644
--- a/lib/gibber/gibber-file-transfer.h
+++ b/lib/gibber/gibber-file-transfer.h
@@ -80,6 +80,8 @@ struct _GibberFileTransfer
gchar *description;
gchar *content_type;
+ GList *dataforms;
+
GibberFileTransferDirection direction;
};
diff --git a/lib/gibber/gibber-oob-file-transfer.c b/lib/gibber/gibber-oob-file-transfer.c
index f501598b..0f723bde 100644
--- a/lib/gibber/gibber-oob-file-transfer.c
+++ b/lib/gibber/gibber-oob-file-transfer.c
@@ -29,6 +29,7 @@
#include <wocky/wocky-stanza.h>
#include <wocky/wocky-meta-porter.h>
#include <wocky/wocky-namespaces.h>
+#include <wocky/wocky-data-form.h>
#include "gibber-oob-file-transfer.h"
#include "gibber-fd-transport.h"
@@ -176,6 +177,32 @@ gibber_oob_file_transfer_is_file_offer (WockyStanza *stanza)
return TRUE;
}
+static GList *
+extract_dataforms (WockyNode *file)
+{
+ GList *forms = NULL;
+ WockyNodeIter iter;
+ WockyNode *x;
+
+ wocky_node_iter_init (&iter, file, "x", WOCKY_XMPP_NS_DATA);
+ while (wocky_node_iter_next (&iter, &x))
+ {
+ GError *error = NULL;
+ WockyDataForm *form = wocky_data_form_new_from_node (x, &error);
+
+ if (form == NULL)
+ {
+ DEBUG ("Failed to parse data form: %s", error->message);
+ g_clear_error (&error);
+ continue;
+ }
+
+ forms = g_list_append (forms, form);
+ }
+
+ return forms;
+}
+
GibberFileTransfer *
gibber_oob_file_transfer_new_from_stanza_with_from (
WockyStanza *stanza,
@@ -324,6 +351,8 @@ gibber_oob_file_transfer_new_from_stanza_with_from (
self->priv->transferred_bytes = 0;
+ GIBBER_FILE_TRANSFER (self)->dataforms = extract_dataforms (query);
+
g_free (filename);
return GIBBER_FILE_TRANSFER (self);
@@ -476,12 +505,14 @@ static WockyStanza *
create_transfer_offer (GibberOobFileTransfer *self,
GError **error)
{
+ GibberFileTransfer *ft = (GibberFileTransfer *) self;
WockyMetaPorter *porter;
WockyContact *contact;
GSocketConnection *conn;
GSocketAddress *address;
GInetAddress *addr;
GSocketFamily family;
+ GList *l;
/* local host name */
gchar *host_name;
@@ -580,6 +611,13 @@ create_transfer_offer (GibberOobFileTransfer *self,
self->priv->url = url;
self->priv->served_name = served_name;
+ /* dataforms */
+ for (l = ft->dataforms; l != NULL; l = l->next)
+ {
+ WockyDataForm *form = l->data;
+ wocky_data_form_add_to_node (form, query_node);
+ }
+
return stanza;
}