Mercurial > pidgin
changeset 15111:cde909b9eb4b
[gaim-migrate @ 17897]
In the worst case, OSCAR file transfer waited 60 seconds before proxying. I've brought it down to 10
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Wed, 06 Dec 2006 00:39:27 +0000 |
parents | 6cc89a43bf8f |
children | 072987463f90 |
files | libgaim/protocols/oscar/peer.c libgaim/protocols/oscar/peer.h libgaim/protocols/oscar/peer_proxy.c |
diffstat | 3 files changed, 68 insertions(+), 52 deletions(-) [+] |
line wrap: on
line diff
--- a/libgaim/protocols/oscar/peer.c Tue Dec 05 06:23:43 2006 +0000 +++ b/libgaim/protocols/oscar/peer.c Wed Dec 06 00:39:27 2006 +0000 @@ -139,10 +139,16 @@ else if (conn->type == OSCAR_CAPABILITY_SENDFILE) peer_oft_close(conn); - if (conn->connect_data != NULL) + if (conn->verified_connect_data != NULL) { - gaim_proxy_connect_cancel(conn->connect_data); - conn->connect_data = NULL; + gaim_proxy_connect_cancel(conn->verified_connect_data); + conn->verified_connect_data = NULL; + } + + if (conn->client_connect_data != NULL) + { + gaim_proxy_connect_cancel(conn->client_connect_data); + conn->client_connect_data = NULL; } if (conn->listen_data != NULL) @@ -497,13 +503,17 @@ * either connected or failed to connect. */ static void -peer_connection_established_cb(gpointer data, gint source, const gchar *error_message) +peer_connection_common_established_cb(gpointer data, gint source, const gchar *error_message, gboolean verified) { PeerConnection *conn; conn = data; - conn->connect_data = NULL; + if (verified) + conn->verified_connect_data = NULL; + else + conn->client_connect_data = NULL; + gaim_timeout_remove(conn->connect_timeout_timer); conn->connect_timeout_timer = 0; @@ -512,12 +522,32 @@ peer_connection_trynext(conn); return; } - + + if (verified) { + gaim_proxy_connect_cancel(conn->client_connect_data); + conn->client_connect_data = NULL; + } else { + gaim_proxy_connect_cancel(conn->verified_connect_data); + conn->verified_connect_data = NULL; + } + conn->fd = source; peer_connection_finalize_connection(conn); } +static void +peer_connection_verified_established_cb(gpointer data, gint source, const gchar *error_message) +{ + peer_connection_common_established_cb(data, source, error_message, TRUE); +} + +static void +peer_connection_client_established_cb(gpointer data, gint source, const gchar *error_message) +{ + peer_connection_common_established_cb(data, source, error_message, FALSE); +} + /** * This is the watcher callback for any listening socket that is * waiting for a peer to connect. When a peer connects we set the @@ -639,7 +669,7 @@ /** * This is a callback function used when we're connecting to a peer * using either the client IP or the verified IP and the connection - * took longer than 15 seconds to complete. We do this because + * took longer than 5 seconds to complete. We do this because * waiting for the OS to time out the connection attempt is not * practical--the default timeout on many OSes can be 3 minutes or * more, and users are impatient. @@ -653,6 +683,12 @@ * I suppose this line of thinking is discriminatory against people * with very high lag but decent throughput who are transferring * large files. But we don't care about those people. + * + * I (Sean) changed the timeout from 15 to 5 seconds, as 60 seconds is + * too long for a user to wait to send a file. I'm also parallelizing + * requests when possible. The longest we should have to wait now is 10 + * seconds. We shouldn't make it shorter than this. + * */ static gboolean peer_connection_tooktoolong(gpointer data) @@ -689,12 +725,14 @@ peer_connection_close(conn); /* - * 1. Attempt to connect to the remote user using their verifiedip. + * 1. Attempt to connect to the remote user using their verifiedip and clientip. + * We try these at the same time and use whichever succeeds first, so we don't + * have to wait for a timeout. */ - if (!(conn->flags & PEER_CONNECTION_FLAG_TRIED_VERIFIEDIP) && + if (!(conn->flags & PEER_CONNECTION_FLAG_TRIED_DIRECT) && (conn->verifiedip != NULL) && (conn->port != 0) && (!conn->use_proxy)) { - conn->flags |= PEER_CONNECTION_FLAG_TRIED_VERIFIEDIP; + conn->flags |= PEER_CONNECTION_FLAG_TRIED_DIRECT; if (conn->type == OSCAR_CAPABILITY_DIRECTIM) { @@ -708,48 +746,26 @@ g_free(tmp); } - conn->connect_data = gaim_proxy_connect(NULL, account, + conn->verified_connect_data = gaim_proxy_connect(NULL, account, conn->verifiedip, conn->port, - peer_connection_established_cb, conn); - if (conn->connect_data != NULL) + peer_connection_verified_established_cb, conn); + if (conn->verified_connect_data != NULL) { /* Connecting... */ - conn->connect_timeout_timer = gaim_timeout_add(15000, + conn->connect_timeout_timer = gaim_timeout_add(5000, peer_connection_tooktoolong, conn); - return; } - } - - /* - * 2. Attempt to connect to the remote user using their clientip. - */ - if (!(conn->flags & PEER_CONNECTION_FLAG_TRIED_CLIENTIP) && - (conn->clientip != NULL) && (conn->port != 0) && (!conn->use_proxy)) - { - conn->flags |= PEER_CONNECTION_FLAG_TRIED_CLIENTIP; if ((conn->verifiedip == NULL) || strcmp(conn->verifiedip, conn->clientip)) { - if (conn->type == OSCAR_CAPABILITY_DIRECTIM) - { - gchar *tmp; - GaimConversation *conv; - tmp = g_strdup_printf(_("Attempting to connect to %s:%hu."), - conn->clientip, conn->port); - conv = gaim_conversation_new(GAIM_CONV_TYPE_IM, account, conn->sn); - gaim_conversation_write(conv, NULL, tmp, - GAIM_MESSAGE_SYSTEM, time(NULL)); - g_free(tmp); - } - - conn->connect_data = gaim_proxy_connect(NULL, account, + conn->client_connect_data = gaim_proxy_connect(NULL, account, conn->clientip, conn->port, - peer_connection_established_cb, conn); - if (conn->connect_data != NULL) + peer_connection_client_established_cb, conn); + if (conn->connect_timeout_timer == 0 && conn->verified_connect_data != NULL) { /* Connecting... */ - conn->connect_timeout_timer = gaim_timeout_add(15000, + conn->connect_timeout_timer = gaim_timeout_add(5000, peer_connection_tooktoolong, conn); return; } @@ -757,7 +773,7 @@ } /* - * 3. Attempt to have the remote user connect to us (using both + * 2. Attempt to have the remote user connect to us (using both * our verifiedip and our clientip). */ if (!(conn->flags & PEER_CONNECTION_FLAG_TRIED_INCOMING) && @@ -781,7 +797,7 @@ } /* - * 4. Attempt to have both users connect to an intermediate proxy + * 3. Attempt to have both users connect to an intermediate proxy * server. */ if (!(conn->flags & PEER_CONNECTION_FLAG_TRIED_PROXY)) @@ -807,11 +823,11 @@ g_free(tmp); } - conn->connect_data = gaim_proxy_connect(NULL, account, + conn->verified_connect_data = gaim_proxy_connect(NULL, account, (conn->proxyip != NULL) ? conn->proxyip : PEER_PROXY_SERVER, PEER_PROXY_PORT, peer_proxy_connection_established_cb, conn); - if (conn->connect_data != NULL) + if (conn->verified_connect_data != NULL) { /* Connecting... */ return;
--- a/libgaim/protocols/oscar/peer.h Tue Dec 05 06:23:43 2006 +0000 +++ b/libgaim/protocols/oscar/peer.h Wed Dec 06 00:39:27 2006 +0000 @@ -36,11 +36,10 @@ #define PEER_CONNECTION_FLAG_INITIATED_BY_ME 0x0001 #define PEER_CONNECTION_FLAG_APPROVED 0x0002 -#define PEER_CONNECTION_FLAG_TRIED_VERIFIEDIP 0x0004 -#define PEER_CONNECTION_FLAG_TRIED_CLIENTIP 0x0008 -#define PEER_CONNECTION_FLAG_TRIED_INCOMING 0x0010 -#define PEER_CONNECTION_FLAG_TRIED_PROXY 0x0020 -#define PEER_CONNECTION_FLAG_IS_INCOMING 0x0040 +#define PEER_CONNECTION_FLAG_TRIED_DIRECT 0x0004 +#define PEER_CONNECTION_FLAG_TRIED_INCOMING 0x0008 +#define PEER_CONNECTION_FLAG_TRIED_PROXY 0x0010 +#define PEER_CONNECTION_FLAG_IS_INCOMING 0x0020 #define PEER_TYPE_PROMPT 0x0101 /* "I am going to send you this file, is that ok?" */ #define PEER_TYPE_RESUMESOMETHING 0x0106 /* I really don't know */ @@ -157,8 +156,9 @@ /** * This is only used when the peer connection is being established. */ - GaimProxyConnectData *connect_data; - + GaimProxyConnectData *client_connect_data; + GaimProxyConnectData *verified_connect_data; + /** * This is only used when the peer connection is being established. */