comparison libpurple/protocols/jabber/caps.c @ 27590:a08e84032814

merge of '2348ff22f0ff3453774b8b25b36238465580c609' and 'e76f11543c2a4aa05bdf584f087cbe3439029661'
author Paul Aurich <paul@darkrain42.org>
date Sun, 12 Jul 2009 05:43:38 +0000
parents 3b2a2469ffbf
children a40e0b43f57f
comparison
equal deleted inserted replaced
27104:048bcf41deef 27590:a08e84032814
532 cbplususerdata_unref(userdata->data); 532 cbplususerdata_unref(userdata->data);
533 g_free(userdata); 533 g_free(userdata);
534 return; 534 return;
535 } 535 }
536 536
537 node_exts = (userdata->data->info ? userdata->data->info->exts :
538 userdata->data->node_exts);
539
540 /* TODO: I don't see how this can actually happen, but it crashed khc. */
541 if (!node_exts) {
542 purple_debug_error("jabber", "Couldn't find JabberCapsNodeExts. If you "
543 "see this, please tell darkrain42 and save your debug log.\n"
544 "JabberCapsClientInfo = %p\n", userdata->data->info);
545
546
547 /* Try once more to find the exts and then fail */
548 node_exts = jabber_caps_find_exts_by_node(userdata->data->node);
549 if (node_exts) {
550 purple_debug_info("jabber", "Found the exts on the second try.\n");
551 if (userdata->data->info)
552 userdata->data->info->exts = node_exts;
553 else
554 userdata->data->node_exts = node_exts;
555 } else {
556 cbplususerdata_unref(userdata->data);
557 g_free(userdata);
558 g_return_if_reached();
559 }
560 }
561
537 /* So, we decrement this after checking for an error, which means that 562 /* So, we decrement this after checking for an error, which means that
538 * if there *is* an error, we'll never call the callback passed to 563 * if there *is* an error, we'll never call the callback passed to
539 * jabber_caps_get_info. We will still free all of our data, though. 564 * jabber_caps_get_info. We will still free all of our data, though.
540 */ 565 */
541 --userdata->data->extOutstanding; 566 --userdata->data->extOutstanding;
545 const char *var = xmlnode_get_attrib(child, "var"); 570 const char *var = xmlnode_get_attrib(child, "var");
546 if (var) 571 if (var)
547 features = g_list_prepend(features, g_strdup(var)); 572 features = g_list_prepend(features, g_strdup(var));
548 } 573 }
549 574
550 node_exts = (userdata->data->info ? userdata->data->info->exts :
551 userdata->data->node_exts);
552 g_hash_table_insert(node_exts->exts, g_strdup(userdata->name), features); 575 g_hash_table_insert(node_exts->exts, g_strdup(userdata->name), features);
553 schedule_caps_save(); 576 schedule_caps_save();
554 577
555 /* Are we done? */ 578 /* Are we done? */
556 if (userdata->data->info && userdata->data->extOutstanding == 0) 579 if (userdata->data->info && userdata->data->extOutstanding == 0)
587 cb(info, NULL, user_data); 610 cb(info, NULL, user_data);
588 return; 611 return;
589 } 612 }
590 613
591 userdata = g_new0(jabber_caps_cbplususerdata, 1); 614 userdata = g_new0(jabber_caps_cbplususerdata, 1);
592 /* This ref is given to fetching the basic node#ver info if we need it 615 /* We start out with 0 references. Every query takes one */
593 * or unrefed at the bottom of this function */
594 cbplususerdata_ref(userdata);
595 userdata->cb = cb; 616 userdata->cb = cb;
596 userdata->cb_data = user_data; 617 userdata->cb_data = user_data;
597 userdata->who = g_strdup(who); 618 userdata->who = g_strdup(who);
598 userdata->node = g_strdup(node); 619 userdata->node = g_strdup(node);
599 userdata->ver = g_strdup(ver); 620 userdata->ver = g_strdup(ver);
615 nodever = g_strdup_printf("%s#%s", node, ver); 636 nodever = g_strdup_printf("%s#%s", node, ver);
616 xmlnode_set_attrib(query, "node", nodever); 637 xmlnode_set_attrib(query, "node", nodever);
617 g_free(nodever); 638 g_free(nodever);
618 xmlnode_set_attrib(iq->node, "to", who); 639 xmlnode_set_attrib(iq->node, "to", who);
619 640
641 cbplususerdata_ref(userdata);
642
620 jabber_iq_set_callback(iq, jabber_caps_client_iqcb, userdata); 643 jabber_iq_set_callback(iq, jabber_caps_client_iqcb, userdata);
621 jabber_iq_send(iq); 644 jabber_iq_send(iq);
622 } 645 }
623 646
624 /* Are there any exts that we don't recognize? */ 647 /* Are there any exts that we don't recognize? */
667 * g_strfreev. */ 690 * g_strfreev. */
668 g_free(exts); 691 g_free(exts);
669 } 692 }
670 693
671 if (userdata->info && userdata->extOutstanding == 0) { 694 if (userdata->info && userdata->extOutstanding == 0) {
695 /* Start with 1 ref so the below functions are happy */
696 userdata->ref = 1;
697
698 /* We have everything we need right now */
672 jabber_caps_get_info_complete(userdata); 699 jabber_caps_get_info_complete(userdata);
673 cbplususerdata_unref(userdata); 700 cbplususerdata_unref(userdata);
674 } 701 }
675 } 702 }
676 703