Mercurial > pidgin.yaz
changeset 31991:5ec6859bf81a
merge of '15d262d25f6f81c8bf68b2de436e86b672f8d980'
and 'bf86d3d8ea90883936e561e4903aef752403a999'
author | Björn Voigt <bjoern@cs.tu-berlin.de> |
---|---|
date | Wed, 04 May 2011 06:46:04 +0000 |
parents | e1d31abb245c (diff) f3a2b7c6d7d6 (current diff) |
children | 9e478c1afb72 bb4eaf8e70d6 |
files | |
diffstat | 2 files changed, 40 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/bonjour/jabber.c Tue May 03 21:00:40 2011 +0000 +++ b/libpurple/protocols/bonjour/jabber.c Wed May 04 06:46:04 2011 +0000 @@ -831,12 +831,45 @@ if (source < 0) { PurpleConversation *conv = NULL; PurpleAccount *account = NULL; + GSList *tmp = bb->ips; - purple_debug_error("bonjour", "Error connecting to buddy %s at %s:%d error: %s\n", - purple_buddy_get_name(pb), bb->conversation->ip, bb->port_p2pj, error ? error : "(null)"); + purple_debug_error("bonjour", "Error connecting to buddy %s at %s:%d (%s); Trying next IP address\n", + purple_buddy_get_name(pb), bb->conversation->ip, bb->port_p2pj, error); + + /* There may be multiple entries for the same IP - one per + * presence recieved (e.g. multiple interfaces). + * We need to make sure that we find the previously used entry. + */ + while (tmp && bb->conversation->ip_link != tmp->data) + tmp = g_slist_next(tmp); + if (tmp) + tmp = g_slist_next(tmp); account = purple_buddy_get_account(pb); + if (tmp != NULL) { + const gchar *ip; + PurpleProxyConnectData *connect_data; + + bb->conversation->ip_link = ip = tmp->data; + + purple_debug_info("bonjour", "Starting conversation with %s at %s:%d\n", + purple_buddy_get_name(pb), ip, bb->port_p2pj); + + connect_data = purple_proxy_connect(purple_account_get_connection(account), + account, ip, bb->port_p2pj, _connected_to_buddy, pb); + + if (connect_data != NULL) { + g_free(bb->conversation->ip); + bb->conversation->ip = g_strdup(ip); + bb->conversation->connect_data = connect_data; + + return; + } + } + + purple_debug_error("bonjour", "No more addresses for buddy %s. Aborting", purple_buddy_get_name(pb)); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, bb->name, account); if (conv != NULL) purple_conversation_write(conv, NULL, @@ -995,10 +1028,9 @@ { PurpleProxyConnectData *connect_data; PurpleProxyInfo *proxy_info; - /* For better or worse, use the first IP*/ - const char *ip = bb->ips->data; + const char *ip = bb->ips->data; /* Start with the first IP address. */ - purple_debug_info("bonjour", "Starting conversation with %s\n", to); + purple_debug_info("bonjour", "Starting conversation with %s at %s:%d\n", to, ip, bb->port_p2pj); /* Make sure that the account always has a proxy of "none". * This is kind of dirty, but proxy_connect_none() isn't exposed. */ @@ -1021,6 +1053,7 @@ bb->conversation = bonjour_jabber_conv_new(pb, jdata->account, ip); bb->conversation->connect_data = connect_data; + bb->conversation->ip_link = ip; /* We don't want _send_data() to register the tx_handler; * that neeeds to wait until we're actually connected. */ bb->conversation->tx_handler = 0;
--- a/libpurple/protocols/bonjour/jabber.h Tue May 03 21:00:40 2011 +0000 +++ b/libpurple/protocols/bonjour/jabber.h Wed May 04 06:46:04 2011 +0000 @@ -63,6 +63,8 @@ /* The following are only needed before attaching to a PurpleBuddy */ gchar *buddy_name; gchar *ip; + /* This points to a data entry in BonjourBuddy->ips */ + const gchar *ip_link; } BonjourJabberConversation; /**