summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Aurich <darkrain42@pidgin.im>2009-02-08 07:07:25 +0000
committerPaul Aurich <darkrain42@pidgin.im>2009-02-08 07:07:25 +0000
commit5b9069fb3f35e603df0e63dad1f2a97502e98931 (patch)
treed8eba6ea7744f33db66954cea8fb9e6f0e5ffc9b
parent6d8f16558333435dde367cc48633579c43a88d4f (diff)
parenta3d6822a277f3810f2dd8bdcc11ebb505b54a5fd (diff)
downloadpidgin-5b9069fb3f35e603df0e63dad1f2a97502e98931.tar.gz
merge of '4dbe0c6eaf6dc066dddfd3084db3140b730b47a6'
and 'c0ebe6bd49aab5e18e98d677ed7aec1dbb881cda'
-rw-r--r--libpurple/protocols/jabber/data.c19
-rw-r--r--libpurple/protocols/jabber/data.h3
-rw-r--r--libpurple/protocols/jabber/disco.c55
-rw-r--r--libpurple/protocols/jabber/disco.h6
-rw-r--r--libpurple/protocols/jabber/google.c9
-rw-r--r--libpurple/protocols/jabber/google.h3
-rw-r--r--libpurple/protocols/jabber/iq.c102
-rw-r--r--libpurple/protocols/jabber/iq.h12
-rw-r--r--libpurple/protocols/jabber/jabber.c12
-rw-r--r--libpurple/protocols/jabber/jabber.h4
-rw-r--r--libpurple/protocols/jabber/oob.c15
-rw-r--r--libpurple/protocols/jabber/oob.h5
-rw-r--r--libpurple/protocols/jabber/ping.c21
-rw-r--r--libpurple/protocols/jabber/ping.h4
-rw-r--r--libpurple/protocols/jabber/roster.c10
-rw-r--r--libpurple/protocols/jabber/roster.h3
-rw-r--r--libpurple/protocols/jabber/si.c30
-rw-r--r--libpurple/protocols/jabber/si.h6
18 files changed, 151 insertions, 168 deletions
diff --git a/libpurple/protocols/jabber/data.c b/libpurple/protocols/jabber/data.c
index 2064f0a1b8..4a0bf2e2d1 100644
--- a/libpurple/protocols/jabber/data.c
+++ b/libpurple/protocols/jabber/data.c
@@ -200,25 +200,26 @@ jabber_data_associate_remote(JabberData *data)
}
void
-jabber_data_parse(JabberStream *js, xmlnode *packet)
+jabber_data_parse(JabberStream *js, const char *who, JabberIqType type,
+ const char *id, xmlnode *data_node)
{
JabberIq *result = NULL;
- const char *who = xmlnode_get_attrib(packet, "from");
- xmlnode *data_node = xmlnode_get_child(packet, "data");
- const JabberData *data =
- jabber_data_find_local_by_cid(xmlnode_get_attrib(data_node, "cid"));
+ const char *cid = xmlnode_get_attrib(data_node, "cid");
+ const JabberData *data = cid ? jabber_data_find_local_by_cid(cid) : NULL;
if (!data) {
xmlnode *item_not_found = xmlnode_new("item-not-found");
result = jabber_iq_new(js, JABBER_IQ_ERROR);
- xmlnode_set_attrib(result->node, "to", who);
- xmlnode_set_attrib(result->node, "id", xmlnode_get_attrib(packet, "id"));
+ if (who)
+ xmlnode_set_attrib(result->node, "to", who);
+ xmlnode_set_attrib(result->node, "id", id);
xmlnode_insert_child(result->node, item_not_found);
} else {
result = jabber_iq_new(js, JABBER_IQ_RESULT);
- xmlnode_set_attrib(result->node, "to", who);
- xmlnode_set_attrib(result->node, "id", xmlnode_get_attrib(packet, "id"));
+ if (who)
+ xmlnode_set_attrib(result->node, "to", who);
+ xmlnode_set_attrib(result->node, "id", id);
xmlnode_insert_child(result->node,
jabber_data_get_xml_definition(data));
}
diff --git a/libpurple/protocols/jabber/data.h b/libpurple/protocols/jabber/data.h
index 40698de730..ad2b7e2511 100644
--- a/libpurple/protocols/jabber/data.h
+++ b/libpurple/protocols/jabber/data.h
@@ -65,7 +65,8 @@ void jabber_data_associate_local(JabberData *data, const gchar *alt);
void jabber_data_associate_remote(JabberData *data);
/* handles iq requests */
-void jabber_data_parse(JabberStream *js, xmlnode *packet);
+void jabber_data_parse(JabberStream *js, const char *who, JabberIqType type,
+ const char *id, xmlnode *data_node);
void jabber_data_init(void);
void jabber_data_uninit(void);
diff --git a/libpurple/protocols/jabber/disco.c b/libpurple/protocols/jabber/disco.c
index f76772a730..5354221749 100644
--- a/libpurple/protocols/jabber/disco.c
+++ b/libpurple/protocols/jabber/disco.c
@@ -85,29 +85,22 @@ jabber_disco_bytestream_server_cb(JabberStream *js, xmlnode *packet, gpointer da
}
-void jabber_disco_info_parse(JabberStream *js, xmlnode *packet) {
- const char *from = xmlnode_get_attrib(packet, "from");
- const char *type = xmlnode_get_attrib(packet, "type");
+void jabber_disco_info_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id,
+ xmlnode *in_query) {
- if(!from || !type)
+ if(!from)
return;
- if(!strcmp(type, "get")) {
+ if(type == JABBER_IQ_GET) {
xmlnode *query, *identity, *feature;
JabberIq *iq;
-
- xmlnode *in_query;
- const char *node = NULL;
-
- if((in_query = xmlnode_get_child(packet, "query"))) {
- node = xmlnode_get_attrib(in_query, "node");
- }
-
+ const char *node = xmlnode_get_attrib(in_query, "node");
iq = jabber_iq_new_query(js, JABBER_IQ_RESULT,
"http://jabber.org/protocol/disco#info");
- jabber_iq_set_id(iq, xmlnode_get_attrib(packet, "id"));
+ jabber_iq_set_id(iq, id);
xmlnode_set_attrib(iq->node, "to", from);
query = xmlnode_get_child(iq->node, "query");
@@ -200,8 +193,7 @@ void jabber_disco_info_parse(JabberStream *js, xmlnode *packet) {
}
jabber_iq_send(iq);
- } else if(!strcmp(type, "result")) {
- xmlnode *query = xmlnode_get_child(packet, "query");
+ } else if(type == JABBER_IQ_RESULT) {
xmlnode *child;
JabberID *jid;
JabberBuddy *jb;
@@ -218,7 +210,7 @@ void jabber_disco_info_parse(JabberStream *js, xmlnode *packet) {
if(jbr)
capabilities = jbr->capabilities;
- for(child = query->child; child; child = child->next) {
+ for(child = in_query->child; child; child = child->next) {
if(child->type != XMLNODE_TYPE_TAG)
continue;
@@ -285,7 +277,7 @@ void jabber_disco_info_parse(JabberStream *js, xmlnode *packet) {
jdicd->callback(js, from, capabilities, jdicd->data);
g_hash_table_remove(js->disco_callbacks, from);
}
- } else if(!strcmp(type, "error")) {
+ } else if(type == JABBER_IQ_ERROR) {
JabberID *jid;
JabberBuddy *jb;
JabberBuddyResource *jbr = NULL;
@@ -309,28 +301,23 @@ void jabber_disco_info_parse(JabberStream *js, xmlnode *packet) {
}
}
-void jabber_disco_items_parse(JabberStream *js, xmlnode *packet) {
- const char *from = xmlnode_get_attrib(packet, "from");
- const char *type = xmlnode_get_attrib(packet, "type");
-
- if(type && !strcmp(type, "get")) {
+void jabber_disco_items_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id,
+ xmlnode *query) {
+ if(type == JABBER_IQ_GET) {
JabberIq *iq = jabber_iq_new_query(js, JABBER_IQ_RESULT,
"http://jabber.org/protocol/disco#items");
/* preserve node */
- xmlnode *iq_query = xmlnode_get_child_with_namespace(iq->node,"query","http://jabber.org/protocol/disco#items");
- if(iq_query) {
- xmlnode *query = xmlnode_get_child_with_namespace(packet,"query","http://jabber.org/protocol/disco#items");
- if(query) {
- const char *node = xmlnode_get_attrib(query,"node");
- if(node)
- xmlnode_set_attrib(iq_query,"node",node);
- }
- }
+ xmlnode *iq_query = xmlnode_get_child(iq->node, "query");
+ const char *node = xmlnode_get_attrib(query, "node");
+ if(node)
+ xmlnode_set_attrib(iq_query,"node",node);
- jabber_iq_set_id(iq, xmlnode_get_attrib(packet, "id"));
+ jabber_iq_set_id(iq, id);
- xmlnode_set_attrib(iq->node, "to", from);
+ if (from)
+ xmlnode_set_attrib(iq->node, "to", from);
jabber_iq_send(iq);
}
}
diff --git a/libpurple/protocols/jabber/disco.h b/libpurple/protocols/jabber/disco.h
index 04e17853bd..f317079f1f 100644
--- a/libpurple/protocols/jabber/disco.h
+++ b/libpurple/protocols/jabber/disco.h
@@ -27,8 +27,10 @@
typedef void (JabberDiscoInfoCallback)(JabberStream *js, const char *who,
JabberCapabilities capabilities, gpointer data);
-void jabber_disco_info_parse(JabberStream *js, xmlnode *packet);
-void jabber_disco_items_parse(JabberStream *js, xmlnode *packet);
+void jabber_disco_info_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id, xmlnode *in_query);
+void jabber_disco_items_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id, xmlnode *query);
void jabber_disco_items_server(JabberStream *js);
diff --git a/libpurple/protocols/jabber/google.c b/libpurple/protocols/jabber/google.c
index b509096e5f..5da93dd2d2 100644
--- a/libpurple/protocols/jabber/google.c
+++ b/libpurple/protocols/jabber/google.c
@@ -144,9 +144,9 @@ jabber_gmail_parse(JabberStream *js, xmlnode *packet, gpointer nul)
}
void
-jabber_gmail_poke(JabberStream *js, xmlnode *packet)
+jabber_gmail_poke(JabberStream *js, const char *from, JabberIqType type,
+ const char *id, xmlnode *new_mail)
{
- const char *type;
xmlnode *query;
JabberIq *iq;
@@ -154,11 +154,8 @@ jabber_gmail_poke(JabberStream *js, xmlnode *packet)
if (!purple_account_get_check_mail(js->gc->account))
return;
- type = xmlnode_get_attrib(packet, "type");
-
-
/* Is this an initial incoming mail notification? If so, send a request for more info */
- if (strcmp(type, "set") || !xmlnode_get_child(packet, "new-mail"))
+ if (type != JABBER_IQ_SET)
return;
purple_debug(PURPLE_DEBUG_MISC, "jabber",
diff --git a/libpurple/protocols/jabber/google.h b/libpurple/protocols/jabber/google.h
index c1b6e0d0c2..8845a2a699 100644
--- a/libpurple/protocols/jabber/google.h
+++ b/libpurple/protocols/jabber/google.h
@@ -27,7 +27,8 @@
#include "jabber.h"
void jabber_gmail_init(JabberStream *js);
-void jabber_gmail_poke(JabberStream *js, xmlnode *node);
+void jabber_gmail_poke(JabberStream *js, const char *from, JabberIqType type,
+ const char *id, xmlnode *new_mail);
void jabber_google_roster_init(JabberStream *js);
void jabber_google_roster_outgoing(JabberStream *js, xmlnode *query, xmlnode *item);
diff --git a/libpurple/protocols/jabber/iq.c b/libpurple/protocols/jabber/iq.c
index 078c06ca6c..db0ee818b7 100644
--- a/libpurple/protocols/jabber/iq.c
+++ b/libpurple/protocols/jabber/iq.c
@@ -142,23 +142,19 @@ void jabber_iq_free(JabberIq *iq)
g_free(iq);
}
-static void jabber_iq_last_parse(JabberStream *js, xmlnode *packet)
+static void jabber_iq_last_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id,
+ xmlnode *packet)
{
JabberIq *iq;
- const char *type;
- const char *from;
- const char *id;
xmlnode *query;
char *idle_time;
- type = xmlnode_get_attrib(packet, "type");
- from = xmlnode_get_attrib(packet, "from");
- id = xmlnode_get_attrib(packet, "id");
-
- if(type && !strcmp(type, "get")) {
+ if(type == JABBER_IQ_GET) {
iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, "jabber:iq:last");
jabber_iq_set_id(iq, id);
- xmlnode_set_attrib(iq->node, "to", from);
+ if (from)
+ xmlnode_set_attrib(iq->node, "to", from);
query = xmlnode_get_child(iq->node, "query");
@@ -170,39 +166,31 @@ static void jabber_iq_last_parse(JabberStream *js, xmlnode *packet)
}
}
-static void jabber_iq_time_parse(JabberStream *js, xmlnode *packet)
+static void jabber_iq_time_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id,
+ xmlnode *child)
{
- const char *type, *from, *id, *xmlns;
+ const char *xmlns;
JabberIq *iq;
- xmlnode *child;
time_t now_t;
struct tm *now;
time(&now_t);
now = localtime(&now_t);
- type = xmlnode_get_attrib(packet, "type");
- from = xmlnode_get_attrib(packet, "from");
- id = xmlnode_get_attrib(packet, "id");
-
- if ((child = xmlnode_get_child(packet, "query"))) {
- xmlns = "jabber:iq:time";
- } else if ((child = xmlnode_get_child(packet, "time"))) {
- xmlns = "urn:xmpp:time";
- } else {
- purple_debug_warning("jabber", "Malformed IQ time packet\n");
- return;
- }
+ xmlns = xmlnode_get_namespace(child);
- if(type && !strcmp(type, "get")) {
+ if(type == JABBER_IQ_GET) {
xmlnode *utc;
const char *date, *tz, *display;
iq = jabber_iq_new(js, JABBER_IQ_RESULT);
jabber_iq_set_id(iq, id);
- xmlnode_set_attrib(iq->node, "to", from);
+ if (from)
+ xmlnode_set_attrib(iq->node, "to", from);
child = xmlnode_new_child(iq->node, child->name);
+ xmlnode_set_namespace(child, xmlns);
utc = xmlnode_new_child(child, "utc");
if(!strcmp("urn:xmpp:time", xmlns)) {
@@ -226,15 +214,14 @@ static void jabber_iq_time_parse(JabberStream *js, xmlnode *packet)
}
}
-static void jabber_iq_version_parse(JabberStream *js, xmlnode *packet)
+static void jabber_iq_version_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id,
+ xmlnode *packet)
{
JabberIq *iq;
- const char *type, *from, *id;
xmlnode *query;
- type = xmlnode_get_attrib(packet, "type");
-
- if(type && !strcmp(type, "get")) {
+ if(type == JABBER_IQ_GET) {
GHashTable *ui_info;
const char *ui_name = NULL, *ui_version = NULL;
#if 0
@@ -247,11 +234,10 @@ static void jabber_iq_version_parse(JabberStream *js, xmlnode *packet)
osinfo.machine);
}
#endif
- from = xmlnode_get_attrib(packet, "from");
- id = xmlnode_get_attrib(packet, "id");
iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, "jabber:iq:version");
- xmlnode_set_attrib(iq->node, "to", from);
+ if (from)
+ xmlnode_set_attrib(iq->node, "to", from);
jabber_iq_set_id(iq, id);
query = xmlnode_get_child(iq->node, "query");
@@ -294,7 +280,8 @@ void jabber_iq_parse(JabberStream *js, xmlnode *packet)
JabberCallbackData *jcd;
xmlnode *child, *error, *x;
const char *xmlns;
- const char *type, *id, *from;
+ const char *iq_type, *id, *from;
+ JabberIqType type = JABBER_IQ_NONE;
/*
* child will be either the first tag child or NULL if there is no child.
@@ -307,27 +294,40 @@ void jabber_iq_parse(JabberStream *js, xmlnode *packet)
break;
}
- type = xmlnode_get_attrib(packet, "type");
+ iq_type = xmlnode_get_attrib(packet, "type");
from = xmlnode_get_attrib(packet, "from");
id = xmlnode_get_attrib(packet, "id");
- if(type == NULL || !(!strcmp(type, "get") || !strcmp(type, "set")
- || !strcmp(type, "result") || !strcmp(type, "error"))) {
+ if (iq_type) {
+ if (!strcmp(iq_type, "get"))
+ type = JABBER_IQ_GET;
+ else if (!strcmp(iq_type, "set"))
+ type = JABBER_IQ_SET;
+ else if (!strcmp(iq_type, "result"))
+ type = JABBER_IQ_RESULT;
+ else if (!strcmp(iq_type, "error"))
+ type = JABBER_IQ_ERROR;
+ }
+
+ if (type == JABBER_IQ_NONE) {
purple_debug_error("jabber", "IQ with invalid type ('%s') - ignoring.\n",
- type ? type : "(null)");
+ iq_type ? iq_type : "(null)");
return;
}
/* All IQs must have an ID, so send an error for a set/get that doesn't */
if(!id || !*id) {
- if(!strcmp(type, "set") || !strcmp(type, "get")) {
+ if(type == JABBER_IQ_SET || type == JABBER_IQ_GET) {
JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR);
xmlnode_free(iq->node);
iq->node = xmlnode_copy(packet);
- xmlnode_set_attrib(iq->node, "to", from);
- xmlnode_remove_attrib(iq->node, "from");
+ if (from) {
+ xmlnode_set_attrib(iq->node, "to", from);
+ xmlnode_remove_attrib(iq->node, "from");
+ }
+
xmlnode_set_attrib(iq->node, "type", "error");
/* This id is clearly not useful, but we must put something there for a valid stanza */
iq->id = jabber_get_next_id(js);
@@ -339,13 +339,14 @@ void jabber_iq_parse(JabberStream *js, xmlnode *packet)
jabber_iq_send(iq);
} else
- purple_debug_error("jabber", "IQ of type '%s' missing id - ignoring.\n", type);
+ purple_debug_error("jabber", "IQ of type '%s' missing id - ignoring.\n",
+ iq_type);
return;
}
/* First, lets see if a special callback got registered */
- if(!strcmp(type, "result") || !strcmp(type, "error")) {
+ if(type == JABBER_IQ_RESULT || type == JABBER_IQ_ERROR) {
if(id && *id && (jcd = g_hash_table_lookup(js->iq_callbacks, id))) {
jcd->callback(js, packet, jcd->data);
jabber_iq_remove_callback_by_id(js, id);
@@ -360,7 +361,7 @@ void jabber_iq_parse(JabberStream *js, xmlnode *packet)
g_free(key);
if(jih) {
- jih(js, packet);
+ jih(js, from, type, id, child);
return;
}
}
@@ -368,13 +369,16 @@ void jabber_iq_parse(JabberStream *js, xmlnode *packet)
purple_debug_info("jabber", "jabber_iq_parse\n");
/* If we get here, send the default error reply mandated by XMPP-CORE */
- if(!strcmp(type, "set") || !strcmp(type, "get")) {
+ if(type == JABBER_IQ_SET || type == JABBER_IQ_GET) {
JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR);
xmlnode_free(iq->node);
iq->node = xmlnode_copy(packet);
- xmlnode_set_attrib(iq->node, "to", from);
- xmlnode_remove_attrib(iq->node, "from");
+ if (from) {
+ xmlnode_set_attrib(iq->node, "to", from);
+ xmlnode_remove_attrib(iq->node, "from");
+ }
+
xmlnode_set_attrib(iq->node, "type", "error");
error = xmlnode_new_child(iq->node, "error");
xmlnode_set_attrib(error, "type", "cancel");
diff --git a/libpurple/protocols/jabber/iq.h b/libpurple/protocols/jabber/iq.h
index 92e574d3ab..092ca4616a 100644
--- a/libpurple/protocols/jabber/iq.h
+++ b/libpurple/protocols/jabber/iq.h
@@ -22,10 +22,6 @@
#ifndef _PURPLE_JABBER_IQ_H_
#define _PURPLE_JABBER_IQ_H_
-#include "jabber.h"
-
-typedef struct _JabberIq JabberIq;
-
typedef enum {
JABBER_IQ_SET,
JABBER_IQ_GET,
@@ -34,7 +30,13 @@ typedef enum {
JABBER_IQ_NONE
} JabberIqType;
-typedef void (JabberIqHandler)(JabberStream *js, xmlnode *packet);
+#include "jabber.h"
+
+typedef struct _JabberIq JabberIq;
+
+typedef void (JabberIqHandler)(JabberStream *js, const char *from,
+ JabberIqType type, const char *id,
+ xmlnode *child);
typedef void (JabberIqCallback)(JabberStream *js, xmlnode *packet, gpointer data);
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
index 74953c596d..4d12a88cf5 100644
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -969,23 +969,21 @@ static void jabber_register_x_data_cb(JabberStream *js, xmlnode *result, gpointe
jabber_iq_send(iq);
}
-void jabber_register_parse(JabberStream *js, xmlnode *packet)
+void jabber_register_parse(JabberStream *js, const char *from, JabberIqType type,
+ const char *id, xmlnode *query)
{
PurpleAccount *account = purple_connection_get_account(js->gc);
- const char *type;
- const char *from;
PurpleRequestFields *fields;
PurpleRequestFieldGroup *group;
PurpleRequestField *field;
- xmlnode *query, *x, *y;
+ xmlnode *x, *y;
char *instructions;
JabberRegisterCBData *cbdata;
gboolean registered = FALSE;
- if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result"))
+ if (type != JABBER_IQ_RESULT)
return;
- from = xmlnode_get_attrib(packet, "from");
if (!from)
from = js->serverFQDN;
g_return_if_fail(from != NULL);
@@ -995,8 +993,6 @@ void jabber_register_parse(JabberStream *js, xmlnode *packet)
purple_connection_set_state(js->gc, PURPLE_CONNECTED);
}
- query = xmlnode_get_child(packet, "query");
-
if(xmlnode_get_child(query, "registered")) {
registered = TRUE;
diff --git a/libpurple/protocols/jabber/jabber.h b/libpurple/protocols/jabber/jabber.h
index 5692525e5b..fd3e02bad3 100644
--- a/libpurple/protocols/jabber/jabber.h
+++ b/libpurple/protocols/jabber/jabber.h
@@ -57,6 +57,7 @@ typedef struct _JabberStream JabberStream;
#include "roomlist.h"
#include "sslconn.h"
+#include "iq.h"
#include "jutil.h"
#include "xmlnode.h"
#include "buddy.h"
@@ -269,7 +270,8 @@ void jabber_send_raw(JabberStream *js, const char *data, int len);
void jabber_stream_set_state(JabberStream *js, JabberStreamState state);
-void jabber_register_parse(JabberStream *js, xmlnode *packet);
+void jabber_register_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id, xmlnode *query);
void jabber_register_start(JabberStream *js);
char *jabber_get_next_id(JabberStream *js);
diff --git a/libpurple/protocols/jabber/oob.c b/libpurple/protocols/jabber/oob.c
index e43bf5c3ec..73b18fb030 100644
--- a/libpurple/protocols/jabber/oob.c
+++ b/libpurple/protocols/jabber/oob.c
@@ -187,18 +187,18 @@ static void jabber_oob_xfer_recv_canceled(PurpleXfer *xfer) {
jabber_oob_xfer_recv_error(xfer, "404");
}
-void jabber_oob_parse(JabberStream *js, xmlnode *packet) {
+void jabber_oob_parse(JabberStream *js, const char *from, JabberIqType type,
+ const char *id, xmlnode *querynode) {
JabberOOBXfer *jox;
PurpleXfer *xfer;
char *filename;
char *url;
- const char *type;
- xmlnode *querynode, *urlnode;
+ xmlnode *urlnode;
- if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "set"))
+ if(type != JABBER_IQ_SET)
return;
- if(!(querynode = xmlnode_get_child(packet, "query")))
+ if(!from)
return;
if(!(urlnode = xmlnode_get_child(querynode, "url")))
@@ -211,10 +211,9 @@ void jabber_oob_parse(JabberStream *js, xmlnode *packet) {
g_free(url);
jox->js = js;
jox->headers = g_string_new("");
- jox->iq_id = g_strdup(xmlnode_get_attrib(packet, "id"));
+ jox->iq_id = g_strdup(id);
- xfer = purple_xfer_new(js->gc->account, PURPLE_XFER_RECEIVE,
- xmlnode_get_attrib(packet, "from"));
+ xfer = purple_xfer_new(js->gc->account, PURPLE_XFER_RECEIVE, from);
if (xfer)
{
xfer->data = jox;
diff --git a/libpurple/protocols/jabber/oob.h b/libpurple/protocols/jabber/oob.h
index 3a669003dd..6fe67461f9 100644
--- a/libpurple/protocols/jabber/oob.h
+++ b/libpurple/protocols/jabber/oob.h
@@ -22,6 +22,9 @@
#ifndef _PURPLE_JABBER_OOB_H_
#define _PURPLE_JABBER_OOB_H_
-void jabber_oob_parse(JabberStream *js, xmlnode *packet);
+#include "jabber.h"
+
+void jabber_oob_parse(JabberStream *js, const char *from, JabberIqType type,
+ const char *id, xmlnode *querynode);
#endif /* _PURPLE_JABBER_OOB_H_ */
diff --git a/libpurple/protocols/jabber/ping.c b/libpurple/protocols/jabber/ping.c
index 5826a6a7ff..bccdd4cb20 100644
--- a/libpurple/protocols/jabber/ping.c
+++ b/libpurple/protocols/jabber/ping.c
@@ -35,29 +35,20 @@ static void jabber_keepalive_pong_cb(JabberStream *js)
}
void
-jabber_ping_parse(JabberStream *js, xmlnode *packet)
+jabber_ping_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id, xmlnode *ping)
{
- const char *type, *id, *from;
-
- type = xmlnode_get_attrib(packet, "type");
- from = xmlnode_get_attrib(packet, "from");
- id = xmlnode_get_attrib(packet, "id");
-
- if (!type) {
- purple_debug_warning("jabber", "jabber_ping with no type\n");
- return;
- }
-
purple_debug_info("jabber", "jabber_ping_parse\n");
- if (!strcmp(type, "get")) {
+ if (type == JABBER_IQ_GET) {
JabberIq *iq = jabber_iq_new(js, JABBER_IQ_RESULT);
- xmlnode_set_attrib(iq->node, "to", from);
+ if (from)
+ xmlnode_set_attrib(iq->node, "to", from);
xmlnode_set_attrib(iq->node, "id", id);
jabber_iq_send(iq);
- } else if (!strcmp(type, "set")) {
+ } else if (type == JABBER_IQ_SET) {
/* XXX: error */
}
}
diff --git a/libpurple/protocols/jabber/ping.h b/libpurple/protocols/jabber/ping.h
index 65ebe47e04..fd906384b0 100644
--- a/libpurple/protocols/jabber/ping.h
+++ b/libpurple/protocols/jabber/ping.h
@@ -23,9 +23,11 @@
#define _PURPLE_JABBER_PING_H_
#include "jabber.h"
+#include "iq.h"
#include "xmlnode.h"
-void jabber_ping_parse(JabberStream *js, xmlnode *packet);
+void jabber_ping_parse(JabberStream *js, const char *from,
+ JabberIqType, const char *id, xmlnode *child);
gboolean jabber_ping_jid(JabberStream *js, const char *jid);
#endif /* _PURPLE_JABBER_PING_H_ */
diff --git a/libpurple/protocols/jabber/roster.c b/libpurple/protocols/jabber/roster.c
index cab8df2942..b4420859d3 100644
--- a/libpurple/protocols/jabber/roster.c
+++ b/libpurple/protocols/jabber/roster.c
@@ -142,10 +142,10 @@ static void add_purple_buddies_to_groups(JabberStream *js, const char *jid,
g_slist_free(buddies);
}
-void jabber_roster_parse(JabberStream *js, xmlnode *packet)
+void jabber_roster_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id, xmlnode *query)
{
- xmlnode *query, *item, *group;
- const char *from = xmlnode_get_attrib(packet, "from");
+ xmlnode *item, *group;
if(from) {
char *from_norm;
@@ -166,10 +166,6 @@ void jabber_roster_parse(JabberStream *js, xmlnode *packet)
return;
}
- query = xmlnode_get_child(packet, "query");
- if(!query)
- return;
-
js->currently_parsing_roster_push = TRUE;
for(item = xmlnode_get_child(query, "item"); item; item = xmlnode_get_next_twin(item))
diff --git a/libpurple/protocols/jabber/roster.h b/libpurple/protocols/jabber/roster.h
index a20ac309ee..227abdfffa 100644
--- a/libpurple/protocols/jabber/roster.h
+++ b/libpurple/protocols/jabber/roster.h
@@ -26,7 +26,8 @@
void jabber_roster_request(JabberStream *js);
-void jabber_roster_parse(JabberStream *js, xmlnode *packet);
+void jabber_roster_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id, xmlnode *query);
void jabber_roster_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy,
PurpleGroup *group);
diff --git a/libpurple/protocols/jabber/si.c b/libpurple/protocols/jabber/si.c
index 02a79229c4..65ca467272 100644
--- a/libpurple/protocols/jabber/si.c
+++ b/libpurple/protocols/jabber/si.c
@@ -256,20 +256,18 @@ static void jabber_si_bytestreams_attempt_connect(PurpleXfer *xfer)
}
}
-void jabber_bytestreams_parse(JabberStream *js, xmlnode *packet)
+void jabber_bytestreams_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id, xmlnode *query)
{
PurpleXfer *xfer;
JabberSIXfer *jsx;
- xmlnode *query, *streamhost;
- const char *sid, *from, *type;
+ xmlnode *streamhost;
+ const char *sid;
- if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "set"))
+ if(type != JABBER_IQ_SET)
return;
- if(!(from = xmlnode_get_attrib(packet, "from")))
- return;
-
- if(!(query = xmlnode_get_child(packet, "query")))
+ if(!from)
return;
if(!(sid = xmlnode_get_attrib(query, "sid")))
@@ -285,7 +283,7 @@ void jabber_bytestreams_parse(JabberStream *js, xmlnode *packet)
if(jsx->iq_id)
g_free(jsx->iq_id);
- jsx->iq_id = g_strdup(xmlnode_get_attrib(packet, "id"));
+ jsx->iq_id = g_strdup(id);
for(streamhost = xmlnode_get_child(query, "streamhost"); streamhost;
streamhost = xmlnode_get_next_twin(streamhost)) {
@@ -1182,17 +1180,15 @@ void jabber_si_xfer_send(PurpleConnection *gc, const char *who, const char *file
purple_xfer_request(xfer);
}
-void jabber_si_parse(JabberStream *js, xmlnode *packet)
+void jabber_si_parse(JabberStream *js, const char *from, JabberIqType type,
+ const char *id, xmlnode *si)
{
JabberSIXfer *jsx;
PurpleXfer *xfer;
- xmlnode *si, *file, *feature, *x, *field, *option, *value;
- const char *stream_id, *filename, *filesize_c, *profile, *from;
+ xmlnode *file, *feature, *x, *field, *option, *value;
+ const char *stream_id, *filename, *filesize_c, *profile;
size_t filesize = 0;
- if(!(si = xmlnode_get_child(packet, "si")))
- return;
-
if(!(profile = xmlnode_get_attrib(si, "profile")) ||
strcmp(profile, "http://jabber.org/protocol/si/profile/file-transfer"))
return;
@@ -1215,7 +1211,7 @@ void jabber_si_parse(JabberStream *js, xmlnode *packet)
if(!(x = xmlnode_get_child_with_namespace(feature, "x", "jabber:x:data")))
return;
- if(!(from = xmlnode_get_attrib(packet, "from")))
+ if(!from)
return;
/* if they've already sent us this file transfer with the same damn id
@@ -1256,7 +1252,7 @@ void jabber_si_parse(JabberStream *js, xmlnode *packet)
jsx->js = js;
jsx->stream_id = g_strdup(stream_id);
- jsx->iq_id = g_strdup(xmlnode_get_attrib(packet, "id"));
+ jsx->iq_id = g_strdup(id);
xfer = purple_xfer_new(js->gc->account, PURPLE_XFER_RECEIVE, from);
if (xfer)
diff --git a/libpurple/protocols/jabber/si.h b/libpurple/protocols/jabber/si.h
index c7f0ff9526..98e8eaa218 100644
--- a/libpurple/protocols/jabber/si.h
+++ b/libpurple/protocols/jabber/si.h
@@ -26,8 +26,10 @@
#include "jabber.h"
-void jabber_bytestreams_parse(JabberStream *js, xmlnode *packet);
-void jabber_si_parse(JabberStream *js, xmlnode *packet);
+void jabber_bytestreams_parse(JabberStream *js, const char *from,
+ JabberIqType type, const char *id, xmlnode *query);
+void jabber_si_parse(JabberStream *js, const char *from, JabberIqType type,
+ const char *id, xmlnode *si);
PurpleXfer *jabber_si_new_xfer(PurpleConnection *gc, const char *who);
void jabber_si_xfer_send(PurpleConnection *gc, const char *who, const char *file);