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 }