summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Aurich <darkrain42@pidgin.im>2009-02-08 07:04:34 +0000
committerPaul Aurich <darkrain42@pidgin.im>2009-02-08 07:04:34 +0000
commit6d8f16558333435dde367cc48633579c43a88d4f (patch)
tree14d316720fdcd7b469bf62d49fe670ce456e512f
parenta3450d324f63358893e38d7788a8ae2a7a6f4dfc (diff)
downloadpidgin-6d8f16558333435dde367cc48633579c43a88d4f.tar.gz
Track the node name in addition to the namespace for handlers (try #2)
-rw-r--r--libpurple/protocols/jabber/iq.c46
-rw-r--r--libpurple/protocols/jabber/iq.h3
2 files changed, 30 insertions, 19 deletions
diff --git a/libpurple/protocols/jabber/iq.c b/libpurple/protocols/jabber/iq.c
index 927e33fd3c..078c06ca6c 100644
--- a/libpurple/protocols/jabber/iq.c
+++ b/libpurple/protocols/jabber/iq.c
@@ -295,7 +295,6 @@ void jabber_iq_parse(JabberStream *js, xmlnode *packet)
xmlnode *child, *error, *x;
const char *xmlns;
const char *type, *id, *from;
- JabberIqHandler *jih;
/*
* child will be either the first tag child or NULL if there is no child.
@@ -356,7 +355,11 @@ void jabber_iq_parse(JabberStream *js, xmlnode *packet)
/* 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, packet);
return;
}
@@ -383,29 +386,36 @@ void jabber_iq_parse(JabberStream *js, xmlnode *packet)
}
}
-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 --git a/libpurple/protocols/jabber/iq.h b/libpurple/protocols/jabber/iq.h
index a8743350cd..92e574d3ab 100644
--- a/libpurple/protocols/jabber/iq.h
+++ b/libpurple/protocols/jabber/iq.h
@@ -65,6 +65,7 @@ void jabber_iq_free(JabberIq *iq);
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_ */