# HG changeset patch # User Paul Aurich # Date 1234076845 0 # Node ID a4cba207068fefe7337e91ce1bdbce421134612c # Parent d7c195489af378aa5e4dc0b7ee45dda971833bde# Parent 89c4edb5e545dcd693c3094272d24f854e99bfa7 merge of '1f6758f8bdba42d2eeca66535d11e7de12d9e715' and '7960f1ad9847ca6bd1918ccc6407afbcdc6cfcb8' diff -r d7c195489af3 -r a4cba207068f libpurple/protocols/jabber/iq.c --- a/libpurple/protocols/jabber/iq.c Sun Feb 08 07:07:23 2009 +0000 +++ b/libpurple/protocols/jabber/iq.c Sun Feb 08 07:07:25 2009 +0000 @@ -282,7 +282,6 @@ const char *xmlns; const char *iq_type, *id, *from; JabberIqType type = JABBER_IQ_NONE; - JabberIqHandler *jih; /* * child will be either the first tag child or NULL if there is no child. @@ -357,7 +356,11 @@ /* Apparently not, so lets see if we have a pre-defined handler */ if(child && (xmlns = xmlnode_get_namespace(child))) { - if((jih = g_hash_table_lookup(iq_handlers, xmlns))) { + char *key = g_strdup_printf("%s %s", child->name, xmlns); + JabberIqHandler *jih = g_hash_table_lookup(iq_handlers, key); + g_free(key); + + if(jih) { jih(js, from, type, id, child); return; } @@ -387,29 +390,36 @@ } } -void jabber_iq_register_handler(const char *xmlns, JabberIqHandler *handlerfunc) +void jabber_iq_register_handler(const char *node, const char *xmlns, JabberIqHandler *handlerfunc) { - g_hash_table_replace(iq_handlers, g_strdup(xmlns), handlerfunc); + /* + * This is valid because nodes nor namespaces cannot have spaces in them + * (see http://www.w3.org/TR/2006/REC-xml-20060816/ and + * http://www.w3.org/TR/REC-xml-names/) + */ + char *key = g_strdup_printf("%s %s", node, xmlns); + g_hash_table_replace(iq_handlers, key, handlerfunc); } void jabber_iq_init(void) { iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); - jabber_iq_register_handler("google:mail:notify", jabber_gmail_poke); - jabber_iq_register_handler("http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse); - jabber_iq_register_handler("http://jabber.org/protocol/disco#info", jabber_disco_info_parse); - jabber_iq_register_handler("http://jabber.org/protocol/disco#items", jabber_disco_items_parse); - jabber_iq_register_handler("http://jabber.org/protocol/si", jabber_si_parse); - jabber_iq_register_handler("jabber:iq:last", jabber_iq_last_parse); - jabber_iq_register_handler("jabber:iq:oob", jabber_oob_parse); - jabber_iq_register_handler("jabber:iq:register", jabber_register_parse); - jabber_iq_register_handler("jabber:iq:roster", jabber_roster_parse); - jabber_iq_register_handler("jabber:iq:time", jabber_iq_time_parse); - jabber_iq_register_handler("jabber:iq:version", jabber_iq_version_parse); - jabber_iq_register_handler(XEP_0231_NAMESPACE, jabber_data_parse); - jabber_iq_register_handler("urn:xmpp:ping", jabber_ping_parse); - jabber_iq_register_handler("urn:xmpp:time", jabber_iq_time_parse); + jabber_iq_register_handler("mailbox", "google:mail:notify", jabber_gmail_poke); + jabber_iq_register_handler("new-mail", "google:mail:notify", jabber_gmail_poke); + jabber_iq_register_handler("query", "http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse); + jabber_iq_register_handler("query", "http://jabber.org/protocol/disco#info", jabber_disco_info_parse); + jabber_iq_register_handler("query", "http://jabber.org/protocol/disco#items", jabber_disco_items_parse); + jabber_iq_register_handler("si", "http://jabber.org/protocol/si", jabber_si_parse); + jabber_iq_register_handler("query", "jabber:iq:last", jabber_iq_last_parse); + jabber_iq_register_handler("query", "jabber:iq:oob", jabber_oob_parse); + jabber_iq_register_handler("query", "jabber:iq:register", jabber_register_parse); + jabber_iq_register_handler("query", "jabber:iq:roster", jabber_roster_parse); + jabber_iq_register_handler("query", "jabber:iq:time", jabber_iq_time_parse); + jabber_iq_register_handler("query", "jabber:iq:version", jabber_iq_version_parse); + jabber_iq_register_handler("data", XEP_0231_NAMESPACE, jabber_data_parse); + jabber_iq_register_handler("ping", "urn:xmpp:ping", jabber_ping_parse); + jabber_iq_register_handler("time", "urn:xmpp:time", jabber_iq_time_parse); } void jabber_iq_uninit(void) diff -r d7c195489af3 -r a4cba207068f libpurple/protocols/jabber/iq.h --- a/libpurple/protocols/jabber/iq.h Sun Feb 08 07:07:23 2009 +0000 +++ b/libpurple/protocols/jabber/iq.h Sun Feb 08 07:07:25 2009 +0000 @@ -67,6 +67,7 @@ void jabber_iq_init(void); void jabber_iq_uninit(void); -void jabber_iq_register_handler(const char *xmlns, JabberIqHandler *func); +void jabber_iq_register_handler(const char *node, const char *xmlns, + JabberIqHandler *func); #endif /* _PURPLE_JABBER_IQ_H_ */