Mercurial > pidgin
comparison libpurple/protocols/jabber/iq.c @ 25647:969c89c09ad7
Track the sub-node name in addition to the namespace for handlers.
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sun, 08 Feb 2009 04:30:23 +0000 |
parents | ced3d4ab745a |
children | 050052891c55 cd1e80698dbf |
comparison
equal
deleted
inserted
replaced
25645:ced3d4ab745a | 25647:969c89c09ad7 |
---|---|
37 | 37 |
38 #ifdef _WIN32 | 38 #ifdef _WIN32 |
39 #include "utsname.h" | 39 #include "utsname.h" |
40 #endif | 40 #endif |
41 | 41 |
42 struct _JabberIqHandlerKey | |
43 { | |
44 char *node; | |
45 char *xmlns; | |
46 }; | |
47 | |
48 typedef struct _JabberIqHandlerKey JabberIqHandlerKey; | |
49 | |
42 GHashTable *iq_handlers = NULL; | 50 GHashTable *iq_handlers = NULL; |
43 | 51 |
52 static guint iqhandler_hash(gconstpointer data) | |
53 { | |
54 const JabberIqHandlerKey *key = data; | |
55 return g_str_hash(key->node) ^ g_str_hash(key->xmlns); | |
56 } | |
57 | |
58 static gboolean iqhandler_equal(gconstpointer a, gconstpointer b) | |
59 { | |
60 const JabberIqHandlerKey *key_a = a; | |
61 const JabberIqHandlerKey *key_b = b; | |
62 | |
63 return (g_str_equal(key_a->node, key_b->node) && | |
64 g_str_equal(key_a->xmlns, key_b->xmlns)); | |
65 } | |
66 | |
67 static void iqhandler_destroy(gpointer data) | |
68 { | |
69 JabberIqHandlerKey *key = data; | |
70 g_free(key->node); | |
71 g_free(key->xmlns); | |
72 g_free(key); | |
73 } | |
44 | 74 |
45 JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type) | 75 JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type) |
46 { | 76 { |
47 JabberIq *iq; | 77 JabberIq *iq; |
48 | 78 |
354 } | 384 } |
355 } | 385 } |
356 | 386 |
357 /* Apparently not, so lets see if we have a pre-defined handler */ | 387 /* Apparently not, so lets see if we have a pre-defined handler */ |
358 if(child && (xmlns = xmlnode_get_namespace(child))) { | 388 if(child && (xmlns = xmlnode_get_namespace(child))) { |
359 if((jih = g_hash_table_lookup(iq_handlers, xmlns))) { | 389 JabberIqHandlerKey key; |
390 key.node = child->name; | |
391 /* xmlns isn't being modified, I promise */ | |
392 key.xmlns = (char *)xmlns; | |
393 if((jih = g_hash_table_lookup(iq_handlers, &key))) { | |
360 jih(js, packet); | 394 jih(js, packet); |
361 return; | 395 return; |
362 } | 396 } |
363 } | 397 } |
364 | 398 |
381 | 415 |
382 jabber_iq_send(iq); | 416 jabber_iq_send(iq); |
383 } | 417 } |
384 } | 418 } |
385 | 419 |
386 void jabber_iq_register_handler(const char *xmlns, JabberIqHandler *handlerfunc) | 420 void jabber_iq_register_handler(const char *node, const char *xmlns, |
387 { | 421 JabberIqHandler *handlerfunc) |
388 g_hash_table_replace(iq_handlers, g_strdup(xmlns), handlerfunc); | 422 { |
423 JabberIqHandlerKey *key = g_new(JabberIqHandlerKey, 1); | |
424 key->node = g_strdup(node); | |
425 key->xmlns = g_strdup(xmlns); | |
426 g_hash_table_replace(iq_handlers, key, handlerfunc); | |
389 } | 427 } |
390 | 428 |
391 void jabber_iq_init(void) | 429 void jabber_iq_init(void) |
392 { | 430 { |
393 iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); | 431 iq_handlers = g_hash_table_new_full(iqhandler_hash, iqhandler_equal, |
394 | 432 iqhandler_destroy, NULL); |
395 jabber_iq_register_handler("google:mail:notify", jabber_gmail_poke); | 433 |
396 jabber_iq_register_handler("http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse); | 434 jabber_iq_register_handler("mailbox", "google:mail:notify", jabber_gmail_poke); |
397 jabber_iq_register_handler("http://jabber.org/protocol/disco#info", jabber_disco_info_parse); | 435 jabber_iq_register_handler("new-mail", "google:mail:notify", jabber_gmail_poke); |
398 jabber_iq_register_handler("http://jabber.org/protocol/disco#items", jabber_disco_items_parse); | 436 jabber_iq_register_handler("query", "http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse); |
399 jabber_iq_register_handler("http://jabber.org/protocol/si", jabber_si_parse); | 437 jabber_iq_register_handler("query", "http://jabber.org/protocol/disco#info", jabber_disco_info_parse); |
400 jabber_iq_register_handler("jabber:iq:last", jabber_iq_last_parse); | 438 jabber_iq_register_handler("query", "http://jabber.org/protocol/disco#items", jabber_disco_items_parse); |
401 jabber_iq_register_handler("jabber:iq:oob", jabber_oob_parse); | 439 jabber_iq_register_handler("si", "http://jabber.org/protocol/si", jabber_si_parse); |
402 jabber_iq_register_handler("jabber:iq:register", jabber_register_parse); | 440 jabber_iq_register_handler("query", "jabber:iq:last", jabber_iq_last_parse); |
403 jabber_iq_register_handler("jabber:iq:roster", jabber_roster_parse); | 441 jabber_iq_register_handler("query", "jabber:iq:oob", jabber_oob_parse); |
404 jabber_iq_register_handler("jabber:iq:time", jabber_iq_time_parse); | 442 jabber_iq_register_handler("query", "jabber:iq:register", jabber_register_parse); |
405 jabber_iq_register_handler("jabber:iq:version", jabber_iq_version_parse); | 443 jabber_iq_register_handler("query", "jabber:iq:roster", jabber_roster_parse); |
406 jabber_iq_register_handler(XEP_0231_NAMESPACE, jabber_data_parse); | 444 jabber_iq_register_handler("query", "jabber:iq:time", jabber_iq_time_parse); |
407 jabber_iq_register_handler("urn:xmpp:ping", jabber_ping_parse); | 445 jabber_iq_register_handler("query", "jabber:iq:version", jabber_iq_version_parse); |
408 jabber_iq_register_handler("urn:xmpp:time", jabber_iq_time_parse); | 446 jabber_iq_register_handler("data", XEP_0231_NAMESPACE, jabber_data_parse); |
447 jabber_iq_register_handler("ping", "urn:xmpp:ping", jabber_ping_parse); | |
448 jabber_iq_register_handler("time", "urn:xmpp:time", jabber_iq_time_parse); | |
409 } | 449 } |
410 | 450 |
411 void jabber_iq_uninit(void) | 451 void jabber_iq_uninit(void) |
412 { | 452 { |
413 g_hash_table_destroy(iq_handlers); | 453 g_hash_table_destroy(iq_handlers); |