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);