diff options
author | Paul Aurich <darkrain42@pidgin.im> | 2009-02-08 07:07:25 +0000 |
---|---|---|
committer | Paul Aurich <darkrain42@pidgin.im> | 2009-02-08 07:07:25 +0000 |
commit | 5b9069fb3f35e603df0e63dad1f2a97502e98931 (patch) | |
tree | d8eba6ea7744f33db66954cea8fb9e6f0e5ffc9b | |
parent | 6d8f16558333435dde367cc48633579c43a88d4f (diff) | |
parent | a3d6822a277f3810f2dd8bdcc11ebb505b54a5fd (diff) | |
download | pidgin-5b9069fb3f35e603df0e63dad1f2a97502e98931.tar.gz |
merge of '4dbe0c6eaf6dc066dddfd3084db3140b730b47a6'
and 'c0ebe6bd49aab5e18e98d677ed7aec1dbb881cda'
-rw-r--r-- | libpurple/protocols/jabber/data.c | 19 | ||||
-rw-r--r-- | libpurple/protocols/jabber/data.h | 3 | ||||
-rw-r--r-- | libpurple/protocols/jabber/disco.c | 55 | ||||
-rw-r--r-- | libpurple/protocols/jabber/disco.h | 6 | ||||
-rw-r--r-- | libpurple/protocols/jabber/google.c | 9 | ||||
-rw-r--r-- | libpurple/protocols/jabber/google.h | 3 | ||||
-rw-r--r-- | libpurple/protocols/jabber/iq.c | 102 | ||||
-rw-r--r-- | libpurple/protocols/jabber/iq.h | 12 | ||||
-rw-r--r-- | libpurple/protocols/jabber/jabber.c | 12 | ||||
-rw-r--r-- | libpurple/protocols/jabber/jabber.h | 4 | ||||
-rw-r--r-- | libpurple/protocols/jabber/oob.c | 15 | ||||
-rw-r--r-- | libpurple/protocols/jabber/oob.h | 5 | ||||
-rw-r--r-- | libpurple/protocols/jabber/ping.c | 21 | ||||
-rw-r--r-- | libpurple/protocols/jabber/ping.h | 4 | ||||
-rw-r--r-- | libpurple/protocols/jabber/roster.c | 10 | ||||
-rw-r--r-- | libpurple/protocols/jabber/roster.h | 3 | ||||
-rw-r--r-- | libpurple/protocols/jabber/si.c | 30 | ||||
-rw-r--r-- | libpurple/protocols/jabber/si.h | 6 |
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); |