Mercurial > pidgin
diff src/protocols/jabber/iq.c @ 8043:9a6df4d567e0
[gaim-migrate @ 8727]
I think I can sneak this stuff in here before we release
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sat, 10 Jan 2004 01:48:24 +0000 |
parents | 45f37d7a20dc |
children | 8f4ce853e685 |
line wrap: on
line diff
--- a/src/protocols/jabber/iq.c Fri Jan 09 16:58:33 2004 +0000 +++ b/src/protocols/jabber/iq.c Sat Jan 10 01:48:24 2004 +0000 @@ -278,6 +278,7 @@ SUPPORT_FEATURE("http://jabber.org/protocol/si") SUPPORT_FEATURE("http://jabber.org/protocol/si/profile/file-transfer") */ + SUPPORT_FEATURE("http://jabber.org/protocol/xhtml-im") jabber_iq_send(iq); } else if(!strcmp(type, "result")) { @@ -294,24 +295,32 @@ jbr = jabber_buddy_find_resource(jb, jid->resource); jabber_id_free(jid); - if(!jbr) - return; - for(child = query->child; child; child = child->next) { if(child->type != NODE_TYPE_TAG) continue; - if(!strcmp(child->name, "feature")) { + if(!strcmp(child->name, "identity")) { + const char *category = xmlnode_get_attrib(child, "category"); + const char *type = xmlnode_get_attrib(child, "type"); + if(!category || !type) + continue; + + /* we found a groupchat or MUC server, add it to the list */ + /* XXX: actually check for protocol/muc or gc-1.0 support */ + if(!strcmp(category, "conference") && !strcmp(type, "text")) + js->chat_servers = g_list_append(js->chat_servers, g_strdup(from)); + + } else if(!strcmp(child->name, "feature")) { const char *var = xmlnode_get_attrib(child, "var"); if(!var) continue; - if(!strcmp(var, "http://jabber.org/protocol/si")) + if(jbr && !strcmp(var, "http://jabber.org/protocol/si")) jbr->capabilities |= JABBER_CAP_SI; - else if(!strcmp(var, + else if(jbr && !strcmp(var, "http://jabber.org/protocol/si/profile/file-transfer")) jbr->capabilities |= JABBER_CAP_SI_FILE_XFER; - else if(!strcmp(var, "http://jabber.org/protocol/bytestreams")) + else if(jbr && !strcmp(var, "http://jabber.org/protocol/bytestreams")) jbr->capabilities |= JABBER_CAP_BYTESTREAMS; } } @@ -333,6 +342,58 @@ } } +static void +jabber_iq_disco_server_result_cb(JabberStream *js, xmlnode *packet, gpointer data) +{ + xmlnode *query, *child; + const char *from = xmlnode_get_attrib(packet, "from"); + const char *type = xmlnode_get_attrib(packet, "type"); + + if(!from || !type) + return; + + if(strcmp(from, js->user->domain)) + return; + + if(strcmp(type, "result")) + return; + + while(js->chat_servers) { + g_free(js->chat_servers->data); + js->chat_servers = g_list_delete_link(js->chat_servers, js->chat_servers); + } + + query = xmlnode_get_child(packet, "query"); + + for(child = query->child; child; child = child->next) { + JabberIq *iq; + const char *jid; + + if(child->type != NODE_TYPE_TAG) + continue; + if(strcmp(child->name, "item")) + continue; + if(!(jid = xmlnode_get_attrib(child, "jid"))) + continue; + + iq = jabber_iq_new_query(js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#info"); + xmlnode_set_attrib(iq->node, "to", jid); + jabber_iq_send(iq); + } +} + +void jabber_iq_disco_server(JabberStream *js) +{ + JabberIq *iq = jabber_iq_new_query(js, JABBER_IQ_GET, + "http://jabber.org/protocol/disco#items"); + + xmlnode_set_attrib(iq->node, "to", js->user->domain); + + jabber_iq_set_callback(iq, jabber_iq_disco_server_result_cb, NULL); + jabber_iq_send(iq); +} + + void jabber_iq_parse(JabberStream *js, xmlnode *packet) { JabberCallbackData *jcd; @@ -341,50 +402,51 @@ const char *type, *id; query = xmlnode_get_child(packet, "query"); - - if(query) { - - xmlns = xmlnode_get_attrib(query, "xmlns"); - - if(!xmlns) - return; + type = xmlnode_get_attrib(packet, "type"); - if(!strcmp(xmlns, "jabber:iq:roster")) { - jabber_roster_parse(js, packet); - return; - } else if(!strcmp(xmlns, "jabber:iq:last")) { - jabber_iq_handle_last(js, packet); - return; - } else if(!strcmp(xmlns, "jabber:iq:time")) { - jabber_iq_handle_time(js, packet); - return; - } else if(!strcmp(xmlns, "jabber:iq:version")) { - jabber_iq_handle_version(js, packet); - return; - } else if(!strcmp(xmlns, "jabber:iq:register")) { - jabber_register_parse(js, packet); - return; - } else if(!strcmp(xmlns, "jabber:iq:oob")) { - jabber_oob_parse(js, packet); - return; - } else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#info")) { - jabber_disco_info_parse(js, packet); - return; - } else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#items")) { - jabber_disco_items_parse(js, packet); - return; + if(type && query && (xmlns = xmlnode_get_attrib(query, "xmlns"))) { + if(!strcmp(type, "set")) { + if(!strcmp(xmlns, "jabber:iq:roster")) { + jabber_roster_parse(js, packet); + return; + } else if(!strcmp(xmlns, "jabber:iq:oob")) { + jabber_oob_parse(js, packet); + return; + } + } else if(!strcmp(type, "get")) { + if(!strcmp(xmlns, "jabber:iq:last")) { + jabber_iq_handle_last(js, packet); + return; + } else if(!strcmp(xmlns, "jabber:iq:time")) { + jabber_iq_handle_time(js, packet); + return; + } else if(!strcmp(xmlns, "jabber:iq:version")) { + jabber_iq_handle_version(js, packet); + return; + } else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#info")) { + jabber_disco_info_parse(js, packet); + return; + } else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#items")) { + jabber_disco_items_parse(js, packet); + return; + } + } else if(!strcmp(type, "result")) { + if(!strcmp(xmlns, "jabber:iq:roster")) { + jabber_roster_parse(js, packet); + return; + } else if(!strcmp(xmlns, "jabber:iq:register")) { + jabber_register_parse(js, packet); + return; + } else if(!strcmp(xmlns, "http://jabber.org/protocol/disco#info")) { + jabber_disco_info_parse(js, packet); + return; + } } - /* - } else if(xmlnode_get_child(packet, "si")) { - jabber_si_parse(js, packet); - return; - */ } /* If we got here, no pre-defined handlers got it, lets see if a special * callback got registered */ - type = xmlnode_get_attrib(packet, "type"); id = xmlnode_get_attrib(packet, "id"); if(type && (!strcmp(type, "result") || !strcmp(type, "error")) && id