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