summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2010-11-01 17:27:44 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2010-11-01 18:34:16 +0000
commit7b2aa8033044ef7c49303a4af4429b6a19b5421a (patch)
tree361b62be4ab2ddad787b065c3ebb0ab0078b17be /lib
parent1a44c03aa82541f38ca91e92f6f568c26a86fc56 (diff)
downloadtelepathy-salut-7b2aa8033044ef7c49303a4af4429b6a19b5421a.tar.gz
gibber_file_transfer_new_from_stanza and friends: raise a GError
Diffstat (limited to 'lib')
-rw-r--r--lib/gibber/gibber-file-transfer.c10
-rw-r--r--lib/gibber/gibber-file-transfer.h5
-rw-r--r--lib/gibber/gibber-oob-file-transfer.c73
-rw-r--r--lib/gibber/gibber-oob-file-transfer.h2
4 files changed, 72 insertions, 18 deletions
diff --git a/lib/gibber/gibber-file-transfer.c b/lib/gibber/gibber-file-transfer.c
index bbd89037..5fd49a57 100644
--- a/lib/gibber/gibber-file-transfer.c
+++ b/lib/gibber/gibber-file-transfer.c
@@ -355,14 +355,15 @@ GibberFileTransfer *
gibber_file_transfer_new_from_stanza_with_from (
GibberXmppStanza *stanza,
GibberXmppConnection *connection,
- const gchar *from)
+ const gchar *from,
+ GError **error)
{
/* FIXME put the known backends in a list and stop when the first one
* can handle the stanza */
GibberFileTransfer *ft;
ft = gibber_oob_file_transfer_new_from_stanza_with_from (stanza, connection,
- from);
+ from, error);
/* it's not possible to have an outgoing transfer created from
* a stanza */
g_assert (ft == NULL ||
@@ -373,14 +374,15 @@ gibber_file_transfer_new_from_stanza_with_from (
GibberFileTransfer *
gibber_file_transfer_new_from_stanza (GibberXmppStanza *stanza,
- GibberXmppConnection *connection)
+ GibberXmppConnection *connection,
+ GError **error)
{
const gchar *from;
from = wocky_node_get_attribute (wocky_stanza_get_top_node (stanza), "from");
return gibber_file_transfer_new_from_stanza_with_from (stanza, connection,
- from);
+ from, error);
}
void
diff --git a/lib/gibber/gibber-file-transfer.h b/lib/gibber/gibber-file-transfer.h
index 07acc6a0..65d985b9 100644
--- a/lib/gibber/gibber-file-transfer.h
+++ b/lib/gibber/gibber-file-transfer.h
@@ -106,10 +106,11 @@ GType gibber_file_transfer_get_type (void);
gboolean gibber_file_transfer_is_file_offer (GibberXmppStanza *stanza);
GibberFileTransfer *gibber_file_transfer_new_from_stanza (
- GibberXmppStanza *stanza, GibberXmppConnection *connection);
+ GibberXmppStanza *stanza, GibberXmppConnection *connection,
+ GError **error);
GibberFileTransfer *gibber_file_transfer_new_from_stanza_with_from (
GibberXmppStanza *stanza, GibberXmppConnection *connection,
- const gchar *from);
+ const gchar *from, GError **error);
void gibber_file_transfer_offer (GibberFileTransfer *self);
void gibber_file_transfer_send (GibberFileTransfer *self, GIOChannel *src);
diff --git a/lib/gibber/gibber-oob-file-transfer.c b/lib/gibber/gibber-oob-file-transfer.c
index dc68da5c..0dba39ec 100644
--- a/lib/gibber/gibber-oob-file-transfer.c
+++ b/lib/gibber/gibber-oob-file-transfer.c
@@ -178,7 +178,8 @@ GibberFileTransfer *
gibber_oob_file_transfer_new_from_stanza_with_from (
GibberXmppStanza *stanza,
GibberXmppConnection *connection,
- const gchar *peer_id)
+ const gchar *peer_id,
+ GError **error)
{
WockyNode *node = wocky_stanza_get_top_node (stanza);
GibberOobFileTransfer *self;
@@ -196,32 +197,80 @@ gibber_oob_file_transfer_new_from_stanza_with_from (
gchar *filename;
if (strcmp (node->name, "iq") != 0)
- return NULL;
+ {
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "Not an IQ: %s", node->name);
+ return NULL;
+ }
self_id = gibber_xmpp_node_get_attribute (node, "to");
- if (peer_id == NULL || self_id == NULL)
- return NULL;
+
+ if (peer_id == NULL)
+ {
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "No 'from' attribute");
+ return NULL;
+ }
+
+ if (self_id == NULL)
+ {
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "No 'to' attribute");
+ return NULL;
+ }
type = gibber_xmpp_node_get_attribute (node, "type");
+
if (type == NULL || strcmp (type, "set") != 0)
- return NULL;
+ {
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "type != 'set': '%s'", (type == NULL ? "(null)" : type));
+ return NULL;
+ }
id = gibber_xmpp_node_get_attribute (node, "id");
+
if (id == NULL)
- return NULL;
+ {
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "no 'id' attribute");
+ return NULL;
+ }
query = gibber_xmpp_node_get_child (node, "query");
+
if (query == NULL)
- return NULL;
+ {
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "no <query> node");
+ return NULL;
+ }
url_node = gibber_xmpp_node_get_child (query, "url");
- if (url_node == NULL || url_node->content == NULL)
- return NULL;
+
+ if (url_node == NULL)
+ {
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "no <query><url> node");
+ return NULL;
+ }
+
+ if (url_node->content == NULL)
+ {
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "<query><url> node has no content");
+ return NULL;
+ }
ft_type = gibber_xmpp_node_get_attribute (url_node, "type");
+
if (ft_type != NULL && gibber_strdiff (ft_type, "file"))
- /* We don't support directory transfer */
- return NULL;
+ {
+ /* We don't support directory transfer */
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "<url> has a 'type' attribute other than 'file': '%s'", ft_type);
+ return NULL;
+ }
/* The file name is extracted from the address */
url = g_strdup (url_node->content);
@@ -229,6 +278,8 @@ gibber_oob_file_transfer_new_from_stanza_with_from (
filename = g_strrstr (url, "/");
if (filename == NULL)
{
+ g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST,
+ "<url> has no '/': '%s'", url);
g_free (url);
return NULL;
}
diff --git a/lib/gibber/gibber-oob-file-transfer.h b/lib/gibber/gibber-oob-file-transfer.h
index cec77141..b8ec34ad 100644
--- a/lib/gibber/gibber-oob-file-transfer.h
+++ b/lib/gibber/gibber-oob-file-transfer.h
@@ -64,7 +64,7 @@ gboolean gibber_oob_file_transfer_is_file_offer (GibberXmppStanza *stanza);
GibberFileTransfer *gibber_oob_file_transfer_new_from_stanza_with_from (
GibberXmppStanza *stanza, GibberXmppConnection *connection,
- const gchar *from);
+ const gchar *from, GError **error);
G_END_DECLS