# HG changeset patch # User Paul Aurich # Date 1234074678 0 # Node ID 050052891c559bdb70088ab5364aa2d4801e297c # Parent 969c89c09ad7a924954e76b4488d8cfaf32d5e7f Pass IQ handlers type, from, id, and the child node As QuLogic pointed out in 8a80f271, it's pointless for the handlers to re-get the information from the IQ stanza. Additionally, instead of string-matching the type everywhere, pass around a JabberIqType. Last, 'child' cannot be NULL, but 'from' may be. diff -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/data.c --- a/libpurple/protocols/jabber/data.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/data.c Sun Feb 08 06:31:18 2009 +0000 @@ -200,25 +200,26 @@ } 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/data.h --- a/libpurple/protocols/jabber/data.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/data.h Sun Feb 08 06:31:18 2009 +0000 @@ -65,7 +65,8 @@ 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/disco.c --- a/libpurple/protocols/jabber/disco.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/disco.c Sun Feb 08 06:31:18 2009 +0000 @@ -85,29 +85,22 @@ } -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 @@ } 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 @@ 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 @@ 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_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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/disco.h --- a/libpurple/protocols/jabber/disco.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/disco.h Sun Feb 08 06:31:18 2009 +0000 @@ -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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/google.c --- a/libpurple/protocols/jabber/google.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/google.c Sun Feb 08 06:31:18 2009 +0000 @@ -144,9 +144,9 @@ } 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 @@ 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/google.h --- a/libpurple/protocols/jabber/google.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/google.h Sun Feb 08 06:31:18 2009 +0000 @@ -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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/iq.c --- a/libpurple/protocols/jabber/iq.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/iq.c Sun Feb 08 06:31:18 2009 +0000 @@ -172,20 +172,15 @@ 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); @@ -200,31 +195,21 @@ } } -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"); + xmlns = xmlnode_get_namespace(child); - 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; - } - - if(type && !strcmp(type, "get")) { + if(type == JABBER_IQ_GET) { xmlnode *utc; const char *date, *tz, *display; @@ -233,6 +218,7 @@ 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)) { @@ -256,15 +242,14 @@ } } -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 @@ -277,8 +262,6 @@ 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); @@ -324,7 +307,8 @@ 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; JabberIqHandler *jih; /* @@ -338,21 +322,31 @@ 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); @@ -370,13 +364,14 @@ 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); @@ -391,7 +386,7 @@ /* xmlns isn't being modified, I promise */ key.xmlns = (char *)xmlns; if((jih = g_hash_table_lookup(iq_handlers, &key))) { - jih(js, packet); + jih(js, from, type, id, child); return; } } @@ -399,7 +394,7 @@ 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); diff -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/iq.h --- a/libpurple/protocols/jabber/iq.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/iq.h Sun Feb 08 06:31:18 2009 +0000 @@ -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 @@ 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sun Feb 08 06:31:18 2009 +0000 @@ -969,23 +969,21 @@ 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 @@ purple_connection_set_state(js->gc, PURPLE_CONNECTED); } - query = xmlnode_get_child(packet, "query"); - if(xmlnode_get_child(query, "registered")) { registered = TRUE; diff -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.h Sun Feb 08 06:31:18 2009 +0000 @@ -57,6 +57,7 @@ #include "roomlist.h" #include "sslconn.h" +#include "iq.h" #include "jutil.h" #include "xmlnode.h" #include "buddy.h" @@ -269,7 +270,8 @@ 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/oob.c --- a/libpurple/protocols/jabber/oob.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/oob.c Sun Feb 08 06:31:18 2009 +0000 @@ -187,18 +187,18 @@ 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(!querynode) return; if(!(urlnode = xmlnode_get_child(querynode, "url"))) @@ -211,10 +211,9 @@ 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/oob.h --- a/libpurple/protocols/jabber/oob.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/oob.h Sun Feb 08 06:31:18 2009 +0000 @@ -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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/ping.c --- a/libpurple/protocols/jabber/ping.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/ping.c Sun Feb 08 06:31:18 2009 +0000 @@ -35,29 +35,19 @@ } 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); 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/ping.h --- a/libpurple/protocols/jabber/ping.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/ping.h Sun Feb 08 06:31:18 2009 +0000 @@ -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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/roster.c --- a/libpurple/protocols/jabber/roster.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/roster.c Sun Feb 08 06:31:18 2009 +0000 @@ -142,10 +142,10 @@ 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 @@ 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/roster.h --- a/libpurple/protocols/jabber/roster.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/roster.h Sun Feb 08 06:31:18 2009 +0000 @@ -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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/si.c --- a/libpurple/protocols/jabber/si.c Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/si.c Sun Feb 08 06:31:18 2009 +0000 @@ -256,20 +256,18 @@ } } -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 @@ 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 @@ 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 @@ 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 @@ 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 -r 969c89c09ad7 -r 050052891c55 libpurple/protocols/jabber/si.h --- a/libpurple/protocols/jabber/si.h Sun Feb 08 04:30:23 2009 +0000 +++ b/libpurple/protocols/jabber/si.h Sun Feb 08 06:31:18 2009 +0000 @@ -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);