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