Mercurial > pidgin
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 |