Mercurial > pidgin.yaz
comparison libpurple/protocols/jabber/caps.c @ 19724:30e4912e4a27
Some clients don't put the node in the 115 disco response, so send the node to the callback
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Tue, 11 Sep 2007 01:57:29 +0000 |
parents | 5c419cd2cd22 |
children | bc0157120924 |
comparison
equal
deleted
inserted
replaced
19723:36d5d5048b53 | 19724:30e4912e4a27 |
---|---|
332 char *ver; | 332 char *ver; |
333 GList *ext; | 333 GList *ext; |
334 unsigned extOutstanding; | 334 unsigned extOutstanding; |
335 } jabber_caps_cbplususerdata; | 335 } jabber_caps_cbplususerdata; |
336 | 336 |
337 typedef struct jabber_ext_userdata { | |
338 jabber_caps_cbplususerdata *userdata; | |
339 char *node; | |
340 } jabber_ext_userdata; | |
341 | |
337 static void jabber_caps_get_info_check_completion(jabber_caps_cbplususerdata *userdata) { | 342 static void jabber_caps_get_info_check_completion(jabber_caps_cbplususerdata *userdata) { |
338 if(userdata->extOutstanding == 0) { | 343 if(userdata->extOutstanding == 0) { |
339 userdata->cb(jabber_caps_collect_info(userdata->node, userdata->ver, userdata->ext), userdata->user_data); | 344 userdata->cb(jabber_caps_collect_info(userdata->node, userdata->ver, userdata->ext), userdata->user_data); |
340 g_free(userdata->who); | 345 g_free(userdata->who); |
341 g_free(userdata->node); | 346 g_free(userdata->node); |
350 | 355 |
351 static void jabber_caps_ext_iqcb(JabberStream *js, xmlnode *packet, gpointer data) { | 356 static void jabber_caps_ext_iqcb(JabberStream *js, xmlnode *packet, gpointer data) { |
352 /* collect data and fetch all exts */ | 357 /* collect data and fetch all exts */ |
353 xmlnode *query = xmlnode_get_child_with_namespace(packet,"query","http://jabber.org/protocol/disco#info"); | 358 xmlnode *query = xmlnode_get_child_with_namespace(packet,"query","http://jabber.org/protocol/disco#info"); |
354 xmlnode *child; | 359 xmlnode *child; |
355 jabber_caps_cbplususerdata *userdata = data; | 360 jabber_ext_userdata *extuserdata = data; |
361 jabber_caps_cbplususerdata *userdata = extuserdata->userdata; | |
356 JabberCapsKey *clientkey = g_new0(JabberCapsKey, 1); | 362 JabberCapsKey *clientkey = g_new0(JabberCapsKey, 1); |
357 JabberCapsValue *client; | 363 JabberCapsValue *client; |
358 JabberCapsValueExt *value = g_new0(JabberCapsValueExt, 1); | 364 JabberCapsValueExt *value = g_new0(JabberCapsValueExt, 1); |
359 const char *node = xmlnode_get_attrib(query, "node"); | 365 const char *node = extuserdata->node; |
360 const char *key; | 366 const char *key; |
361 | 367 |
362 --userdata->extOutstanding; | 368 --userdata->extOutstanding; |
363 | 369 |
364 if(node) { | 370 if(node) { |
402 } | 408 } |
403 g_hash_table_replace(client->ext, g_strdup(key), value); | 409 g_hash_table_replace(client->ext, g_strdup(key), value); |
404 | 410 |
405 jabber_caps_store(); | 411 jabber_caps_store(); |
406 } | 412 } |
407 | 413 g_free(extuserdata->node); |
414 g_free(extuserdata); | |
408 jabber_caps_get_info_check_completion(userdata); | 415 jabber_caps_get_info_check_completion(userdata); |
409 } | 416 } |
410 | 417 |
411 static void jabber_caps_client_iqcb(JabberStream *js, xmlnode *packet, gpointer data) { | 418 static void jabber_caps_client_iqcb(JabberStream *js, xmlnode *packet, gpointer data) { |
412 /* collect data and fetch all exts */ | 419 /* collect data and fetch all exts */ |
447 /* fetch all exts */ | 454 /* fetch all exts */ |
448 for(iter = userdata->ext; iter; iter = g_list_next(iter)) { | 455 for(iter = userdata->ext; iter; iter = g_list_next(iter)) { |
449 JabberIq *iq = jabber_iq_new_query(js,JABBER_IQ_GET,"http://jabber.org/protocol/disco#info"); | 456 JabberIq *iq = jabber_iq_new_query(js,JABBER_IQ_GET,"http://jabber.org/protocol/disco#info"); |
450 xmlnode *query = xmlnode_get_child_with_namespace(iq->node,"query","http://jabber.org/protocol/disco#info"); | 457 xmlnode *query = xmlnode_get_child_with_namespace(iq->node,"query","http://jabber.org/protocol/disco#info"); |
451 char *node = g_strdup_printf("%s#%s", userdata->node, (const char*)iter->data); | 458 char *node = g_strdup_printf("%s#%s", userdata->node, (const char*)iter->data); |
459 jabber_ext_userdata *ext_data = g_new0(jabber_ext_userdata, 1); | |
460 ext_data->node = node; | |
461 ext_data->userdata = userdata; | |
462 | |
452 xmlnode_set_attrib(query, "node", node); | 463 xmlnode_set_attrib(query, "node", node); |
453 g_free(node); | |
454 xmlnode_set_attrib(iq->node, "to", userdata->who); | 464 xmlnode_set_attrib(iq->node, "to", userdata->who); |
455 | 465 |
456 jabber_iq_set_callback(iq,jabber_caps_ext_iqcb,userdata); | 466 jabber_iq_set_callback(iq,jabber_caps_ext_iqcb,ext_data); |
457 jabber_iq_send(iq); | 467 jabber_iq_send(iq); |
458 } | 468 } |
459 | 469 |
460 jabber_caps_store(); | 470 jabber_caps_store(); |
461 | 471 |
509 for(iter = userdata->ext; iter; iter = g_list_next(iter)) { | 519 for(iter = userdata->ext; iter; iter = g_list_next(iter)) { |
510 JabberCapsValueExt *extvalue = g_hash_table_lookup(client->ext, (const char*)iter->data); | 520 JabberCapsValueExt *extvalue = g_hash_table_lookup(client->ext, (const char*)iter->data); |
511 JabberIq *iq; | 521 JabberIq *iq; |
512 xmlnode *query; | 522 xmlnode *query; |
513 char *nodever; | 523 char *nodever; |
524 jabber_ext_userdata *ext_data = g_new0(jabber_ext_userdata, 1); | |
514 | 525 |
515 if(extvalue) { | 526 if(extvalue) { |
516 /* we already have this ext, don't bother with it */ | 527 /* we already have this ext, don't bother with it */ |
517 --userdata->extOutstanding; | 528 --userdata->extOutstanding; |
518 continue; | 529 continue; |
520 | 531 |
521 iq = jabber_iq_new_query(js,JABBER_IQ_GET,"http://jabber.org/protocol/disco#info"); | 532 iq = jabber_iq_new_query(js,JABBER_IQ_GET,"http://jabber.org/protocol/disco#info"); |
522 query = xmlnode_get_child_with_namespace(iq->node,"query","http://jabber.org/protocol/disco#info"); | 533 query = xmlnode_get_child_with_namespace(iq->node,"query","http://jabber.org/protocol/disco#info"); |
523 nodever = g_strdup_printf("%s#%s", node, (const char*)iter->data); | 534 nodever = g_strdup_printf("%s#%s", node, (const char*)iter->data); |
524 xmlnode_set_attrib(query, "node", nodever); | 535 xmlnode_set_attrib(query, "node", nodever); |
525 g_free(nodever); | |
526 xmlnode_set_attrib(iq->node, "to", who); | 536 xmlnode_set_attrib(iq->node, "to", who); |
527 | 537 |
528 jabber_iq_set_callback(iq,jabber_caps_ext_iqcb,userdata); | 538 ext_data->node = nodever; |
539 ext_data->userdata = userdata; | |
540 | |
541 jabber_iq_set_callback(iq, jabber_caps_ext_iqcb, ext_data); | |
529 jabber_iq_send(iq); | 542 jabber_iq_send(iq); |
530 } | 543 } |
531 /* maybe we have all data available anyways? This is the ideal case where no network traffic is necessary */ | 544 /* maybe we have all data available anyways? This is the ideal case where no network traffic is necessary */ |
532 jabber_caps_get_info_check_completion(userdata); | 545 jabber_caps_get_info_check_completion(userdata); |
533 } | 546 } |