comparison libpurple/protocols/jabber/iq.c @ 25652:a4cba207068f

merge of '1f6758f8bdba42d2eeca66535d11e7de12d9e715' and '7960f1ad9847ca6bd1918ccc6407afbcdc6cfcb8'
author Paul Aurich <paul@darkrain42.org>
date Sun, 08 Feb 2009 07:07:25 +0000
parents d7c195489af3 89c4edb5e545
children af351471ec5a
comparison
equal deleted inserted replaced
25651:d7c195489af3 25652:a4cba207068f
280 JabberCallbackData *jcd; 280 JabberCallbackData *jcd;
281 xmlnode *child, *error, *x; 281 xmlnode *child, *error, *x;
282 const char *xmlns; 282 const char *xmlns;
283 const char *iq_type, *id, *from; 283 const char *iq_type, *id, *from;
284 JabberIqType type = JABBER_IQ_NONE; 284 JabberIqType type = JABBER_IQ_NONE;
285 JabberIqHandler *jih;
286 285
287 /* 286 /*
288 * child will be either the first tag child or NULL if there is no child. 287 * child will be either the first tag child or NULL if there is no child.
289 * Historically, we used just the 'query' subchild, but newer XEPs use 288 * Historically, we used just the 'query' subchild, but newer XEPs use
290 * differently named children. Grabbing the first child is (for the time 289 * differently named children. Grabbing the first child is (for the time
355 } 354 }
356 } 355 }
357 356
358 /* Apparently not, so lets see if we have a pre-defined handler */ 357 /* Apparently not, so lets see if we have a pre-defined handler */
359 if(child && (xmlns = xmlnode_get_namespace(child))) { 358 if(child && (xmlns = xmlnode_get_namespace(child))) {
360 if((jih = g_hash_table_lookup(iq_handlers, xmlns))) { 359 char *key = g_strdup_printf("%s %s", child->name, xmlns);
360 JabberIqHandler *jih = g_hash_table_lookup(iq_handlers, key);
361 g_free(key);
362
363 if(jih) {
361 jih(js, from, type, id, child); 364 jih(js, from, type, id, child);
362 return; 365 return;
363 } 366 }
364 } 367 }
365 368
385 388
386 jabber_iq_send(iq); 389 jabber_iq_send(iq);
387 } 390 }
388 } 391 }
389 392
390 void jabber_iq_register_handler(const char *xmlns, JabberIqHandler *handlerfunc) 393 void jabber_iq_register_handler(const char *node, const char *xmlns, JabberIqHandler *handlerfunc)
391 { 394 {
392 g_hash_table_replace(iq_handlers, g_strdup(xmlns), handlerfunc); 395 /*
396 * This is valid because nodes nor namespaces cannot have spaces in them
397 * (see http://www.w3.org/TR/2006/REC-xml-20060816/ and
398 * http://www.w3.org/TR/REC-xml-names/)
399 */
400 char *key = g_strdup_printf("%s %s", node, xmlns);
401 g_hash_table_replace(iq_handlers, key, handlerfunc);
393 } 402 }
394 403
395 void jabber_iq_init(void) 404 void jabber_iq_init(void)
396 { 405 {
397 iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); 406 iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
398 407
399 jabber_iq_register_handler("google:mail:notify", jabber_gmail_poke); 408 jabber_iq_register_handler("mailbox", "google:mail:notify", jabber_gmail_poke);
400 jabber_iq_register_handler("http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse); 409 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); 410 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); 411 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); 412 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); 413 jabber_iq_register_handler("si", "http://jabber.org/protocol/si", jabber_si_parse);
405 jabber_iq_register_handler("jabber:iq:oob", jabber_oob_parse); 414 jabber_iq_register_handler("query", "jabber:iq:last", jabber_iq_last_parse);
406 jabber_iq_register_handler("jabber:iq:register", jabber_register_parse); 415 jabber_iq_register_handler("query", "jabber:iq:oob", jabber_oob_parse);
407 jabber_iq_register_handler("jabber:iq:roster", jabber_roster_parse); 416 jabber_iq_register_handler("query", "jabber:iq:register", jabber_register_parse);
408 jabber_iq_register_handler("jabber:iq:time", jabber_iq_time_parse); 417 jabber_iq_register_handler("query", "jabber:iq:roster", jabber_roster_parse);
409 jabber_iq_register_handler("jabber:iq:version", jabber_iq_version_parse); 418 jabber_iq_register_handler("query", "jabber:iq:time", jabber_iq_time_parse);
410 jabber_iq_register_handler(XEP_0231_NAMESPACE, jabber_data_parse); 419 jabber_iq_register_handler("query", "jabber:iq:version", jabber_iq_version_parse);
411 jabber_iq_register_handler("urn:xmpp:ping", jabber_ping_parse); 420 jabber_iq_register_handler("data", XEP_0231_NAMESPACE, jabber_data_parse);
412 jabber_iq_register_handler("urn:xmpp:time", jabber_iq_time_parse); 421 jabber_iq_register_handler("ping", "urn:xmpp:ping", jabber_ping_parse);
422 jabber_iq_register_handler("time", "urn:xmpp:time", jabber_iq_time_parse);
413 } 423 }
414 424
415 void jabber_iq_uninit(void) 425 void jabber_iq_uninit(void)
416 { 426 {
417 g_hash_table_destroy(iq_handlers); 427 g_hash_table_destroy(iq_handlers);