comparison libpurple/protocols/jabber/iq.c @ 25651:d7c195489af3

merge of '528b6f92c03b496c915051174c5b85fc46260287' and 'cb69e0857b1d9058d5e043a9ff3f3876c98f96f2'
author Paul Aurich <paul@darkrain42.org>
date Sun, 08 Feb 2009 07:07:23 +0000
parents c8606917787a cd1e80698dbf
children a4cba207068f
comparison
equal deleted inserted replaced
25649:c8606917787a 25651:d7c195489af3
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
50 GHashTable *iq_handlers = NULL; 42 GHashTable *iq_handlers = NULL;
51 43
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 }
74 44
75 JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type) 45 JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type)
76 { 46 {
77 JabberIq *iq; 47 JabberIq *iq;
78 48
385 } 355 }
386 } 356 }
387 357
388 /* Apparently not, so lets see if we have a pre-defined handler */ 358 /* Apparently not, so lets see if we have a pre-defined handler */
389 if(child && (xmlns = xmlnode_get_namespace(child))) { 359 if(child && (xmlns = xmlnode_get_namespace(child))) {
390 JabberIqHandlerKey key; 360 if((jih = g_hash_table_lookup(iq_handlers, xmlns))) {
391 key.node = child->name;
392 /* xmlns isn't being modified, I promise */
393 key.xmlns = (char *)xmlns;
394 if((jih = g_hash_table_lookup(iq_handlers, &key))) {
395 jih(js, from, type, id, child); 361 jih(js, from, type, id, child);
396 return; 362 return;
397 } 363 }
398 } 364 }
399 365
419 385
420 jabber_iq_send(iq); 386 jabber_iq_send(iq);
421 } 387 }
422 } 388 }
423 389
424 void jabber_iq_register_handler(const char *node, const char *xmlns, 390 void jabber_iq_register_handler(const char *xmlns, JabberIqHandler *handlerfunc)
425 JabberIqHandler *handlerfunc) 391 {
426 { 392 g_hash_table_replace(iq_handlers, g_strdup(xmlns), handlerfunc);
427 JabberIqHandlerKey *key = g_new(JabberIqHandlerKey, 1);
428 key->node = g_strdup(node);
429 key->xmlns = g_strdup(xmlns);
430 g_hash_table_replace(iq_handlers, key, handlerfunc);
431 } 393 }
432 394
433 void jabber_iq_init(void) 395 void jabber_iq_init(void)
434 { 396 {
435 iq_handlers = g_hash_table_new_full(iqhandler_hash, iqhandler_equal, 397 iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
436 iqhandler_destroy, NULL); 398
437 399 jabber_iq_register_handler("google:mail:notify", jabber_gmail_poke);
438 jabber_iq_register_handler("mailbox", "google:mail:notify", jabber_gmail_poke); 400 jabber_iq_register_handler("http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse);
439 jabber_iq_register_handler("new-mail", "google:mail:notify", jabber_gmail_poke); 401 jabber_iq_register_handler("http://jabber.org/protocol/disco#info", jabber_disco_info_parse);
440 jabber_iq_register_handler("query", "http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse); 402 jabber_iq_register_handler("http://jabber.org/protocol/disco#items", jabber_disco_items_parse);
441 jabber_iq_register_handler("query", "http://jabber.org/protocol/disco#info", jabber_disco_info_parse); 403 jabber_iq_register_handler("http://jabber.org/protocol/si", jabber_si_parse);
442 jabber_iq_register_handler("query", "http://jabber.org/protocol/disco#items", jabber_disco_items_parse); 404 jabber_iq_register_handler("jabber:iq:last", jabber_iq_last_parse);
443 jabber_iq_register_handler("si", "http://jabber.org/protocol/si", jabber_si_parse); 405 jabber_iq_register_handler("jabber:iq:oob", jabber_oob_parse);
444 jabber_iq_register_handler("query", "jabber:iq:last", jabber_iq_last_parse); 406 jabber_iq_register_handler("jabber:iq:register", jabber_register_parse);
445 jabber_iq_register_handler("query", "jabber:iq:oob", jabber_oob_parse); 407 jabber_iq_register_handler("jabber:iq:roster", jabber_roster_parse);
446 jabber_iq_register_handler("query", "jabber:iq:register", jabber_register_parse); 408 jabber_iq_register_handler("jabber:iq:time", jabber_iq_time_parse);
447 jabber_iq_register_handler("query", "jabber:iq:roster", jabber_roster_parse); 409 jabber_iq_register_handler("jabber:iq:version", jabber_iq_version_parse);
448 jabber_iq_register_handler("query", "jabber:iq:time", jabber_iq_time_parse); 410 jabber_iq_register_handler(XEP_0231_NAMESPACE, jabber_data_parse);
449 jabber_iq_register_handler("query", "jabber:iq:version", jabber_iq_version_parse); 411 jabber_iq_register_handler("urn:xmpp:ping", jabber_ping_parse);
450 jabber_iq_register_handler("data", XEP_0231_NAMESPACE, jabber_data_parse); 412 jabber_iq_register_handler("urn:xmpp:time", jabber_iq_time_parse);
451 jabber_iq_register_handler("ping", "urn:xmpp:ping", jabber_ping_parse);
452 jabber_iq_register_handler("time", "urn:xmpp:time", jabber_iq_time_parse);
453 } 413 }
454 414
455 void jabber_iq_uninit(void) 415 void jabber_iq_uninit(void)
456 { 416 {
457 g_hash_table_destroy(iq_handlers); 417 g_hash_table_destroy(iq_handlers);