changeset 14837:118fd0dc5b6e

[gaim-migrate @ 17606] Add a "handle" parameter to gaim_proxy_connect(). It seemed like people thought this was a good idea. You can still cancel each gaim_proxy_connect() individually, if needed. I passed in NULL for the handle in most places. It might be better to pass in the gc in more places, but these changes do no harm, and they should help some Yahoo! things, and I wanted to get the API change in. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sat, 28 Oct 2006 20:04:03 +0000
parents bfcdd361357e
children 71404dbedabc
files ChangeLog.API libgaim/ft.c libgaim/protocols/irc/irc.c libgaim/protocols/irc/irc.h libgaim/protocols/jabber/jabber.c libgaim/protocols/jabber/jabber.h libgaim/protocols/jabber/si.c libgaim/protocols/msn/directconn.c libgaim/protocols/msn/httpconn.c libgaim/protocols/msn/servconn.c libgaim/protocols/oscar/oscar.c libgaim/protocols/oscar/peer.c libgaim/protocols/qq/qq_proxy.c libgaim/protocols/sametime/sametime.c libgaim/protocols/silc/silc.c libgaim/protocols/silc/silcgaim.h libgaim/protocols/simple/simple.c libgaim/protocols/toc/toc.c libgaim/protocols/yahoo/yahoo.c libgaim/protocols/yahoo/yahoo_filexfer.c libgaim/protocols/yahoo/yahoo_picture.c libgaim/protocols/yahoo/yahoochat.c libgaim/protocols/yahoo/ycht.c libgaim/proxy.c libgaim/proxy.h libgaim/sslconn.c libgaim/upnp.c libgaim/util.c
diffstat 28 files changed, 125 insertions(+), 132 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog.API	Sat Oct 28 19:52:30 2006 +0000
+++ b/ChangeLog.API	Sat Oct 28 20:04:03 2006 +0000
@@ -118,7 +118,9 @@
 	  gaim_proxy_connect() and gaim_network_listen*().
 	* gaim_proxy_connect(): changed to return NULL on error and a pointer
 	  to a GaimProxyConnectInfo object which can be used to cancel
-	  connection attempts using gaim_proxy_connect_cancel().
+	  connection attempts using gaim_proxy_connect_cancel().  Also added
+	  a 'handle' parameter that can be used to cancel to cancel the
+	  connection attempt using gaim_proxy_connect_cancel_with_handle().
 	* gaim_gethostbyname_async(): Renamed to gaim_dnsquery_a() and
 	  changed to return a pointer to a data structure that can be
 	  used to cancel the pending DNS query using gaim_dnsquery_destroy()
@@ -321,6 +323,8 @@
 	  call to gaim_network_listen() or gaim_network_listen_range()
 	* gaim_proxy_connect_cancel(): Can be used to cancel a pending
 	  gaim_proxy_connect() request
+	* gaim_proxy_connect_cancel_with_handle(): Can be used to cancel
+	  a previous gaim_proxy_connect() request using a specified handle
 	* gaim_dnsquery_destroy(): Can be used to cancel a pending DNS
 	  query.
 	* gaim_util_fetch_url_cancel(): Can be used to cancel a pending
--- a/libgaim/ft.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/ft.c	Sat Oct 28 20:04:03 2006 +0000
@@ -945,7 +945,7 @@
 			xfer->remote_port = port;
 
 			/* Establish a file descriptor. */
-			gaim_proxy_connect(xfer->account, xfer->remote_ip,
+			gaim_proxy_connect(NULL, xfer->account, xfer->remote_ip,
 							   xfer->remote_port, connect_cb, xfer);
 
 			return;
--- a/libgaim/protocols/irc/irc.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/irc/irc.c	Sat Oct 28 20:04:03 2006 +0000
@@ -341,11 +341,10 @@
 
 	if (!irc->gsc) {
 
-		irc->connect_data = gaim_proxy_connect(account, irc->server,
+		if (gaim_proxy_connect(gc, account, irc->server,
 				 gaim_account_get_int(account, "port", IRC_DEFAULT_PORT),
-				 irc_login_cb, gc);
-
-		if (!irc->connect_data || !gaim_account_get_connection(account)) {
+				 irc_login_cb, gc) == NULL)
+		{
 			gaim_connection_error(gc, _("Couldn't create socket"));
 			return;
 		}
@@ -409,8 +408,6 @@
 	GaimConnection *gc = data;
 	struct irc_conn *irc = gc->proto_data;
 
-	irc->connect_data = NULL;
-
 	if (source < 0) {
 		gaim_connection_error(gc, _("Couldn't connect to host"));
 		return;
@@ -452,9 +449,6 @@
 	if (irc->gsc || (irc->fd >= 0))
 		irc_cmd_quit(irc, "quit", NULL, NULL);
 
-	if (irc->connect_data)
-		gaim_proxy_connect_cancel(irc->connect_data);
-
 	if (gc->inpa)
 		gaim_input_remove(gc->inpa);
 
--- a/libgaim/protocols/irc/irc.h	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/irc/irc.h	Sat Oct 28 20:04:03 2006 +0000
@@ -54,8 +54,6 @@
 	guint timer;
 	GHashTable *buddies;
 
-	GaimProxyConnectData *connect_data;
-
 	char *inbuf;
 	int inbuflen;
 	int inbufused;
--- a/libgaim/protocols/jabber/jabber.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/jabber/jabber.c	Sat Oct 28 20:04:03 2006 +0000
@@ -445,8 +445,6 @@
 	GaimConnection *gc = data;
 	JabberStream *js = gc->proto_data;
 
-	js->connect_data = NULL;
-
 	if (source < 0) {
 		gaim_connection_error(gc, _("Couldn't connect to host"));
 		return;
@@ -490,10 +488,8 @@
 
 static void jabber_login_connect(JabberStream *js, const char *server, int port)
 {
-	js->connect_data = gaim_proxy_connect(js->gc->account, server,
-			port, jabber_login_callback, js->gc);
-
-	if (js->connect_data == NULL)
+	if (gaim_proxy_connect(js->gc, js->gc->account, server,
+			port, jabber_login_callback, js->gc) == NULL)
 		gaim_connection_error(js->gc, _("Unable to create socket"));
 }
 
@@ -922,11 +918,9 @@
 	}
 
 	if(!js->gsc) {
-		js->connect_data = gaim_proxy_connect(account, server,
+		if (gaim_proxy_connect(gc, account, server,
 				gaim_account_get_int(account, "port", 5222),
-				jabber_login_callback, gc);
-
-		if (js->connect_data == NULL)
+				jabber_login_callback, gc) == NULL)
 			gaim_connection_error(gc, _("Unable to create socket"));
 	}
 }
@@ -945,9 +939,6 @@
 	if (js->srv_query_data)
 		gaim_srv_cancel(js->srv_query_data);
 
-	if (js->connect_data)
-		gaim_proxy_connect_cancel(js->connect_data);
-
 	if(js->gsc) {
 #ifdef HAVE_OPENSSL
 		if (!gc->disconnect_timeout)
--- a/libgaim/protocols/jabber/jabber.h	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/jabber/jabber.h	Sat Oct 28 20:04:03 2006 +0000
@@ -67,7 +67,6 @@
 	int fd;
 
 	GaimSrvQueryData *srv_query_data;
-	GaimProxyConnectData *connect_data;
 
 	xmlParserCtxt *context;
 	xmlnode *current;
--- a/libgaim/protocols/jabber/si.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/jabber/si.c	Sat Oct 28 20:04:03 2006 +0000
@@ -177,7 +177,8 @@
 		for(i=0; i<20; i++, p+=2)
 			snprintf(p, 3, "%02x", hashval[i]);
 
-		jsx->connect_data = gaim_proxy_connect_socks5(jsx->gpi, dstaddr, 0,
+		jsx->connect_data = gaim_proxy_connect_socks5(NULL, jsx->gpi,
+				dstaddr, 0,
 				jabber_si_bytestreams_connect_cb, xfer);
 		g_free(dstaddr);
 
--- a/libgaim/protocols/msn/directconn.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/msn/directconn.c	Sat Oct 28 20:04:03 2006 +0000
@@ -423,8 +423,8 @@
 	}
 #endif
 
-	directconn->connect_data = gaim_proxy_connect(session->account, host, port,
-						   connect_cb, directconn);
+	directconn->connect_data = gaim_proxy_connect(NULL, session->account,
+			host, port, connect_cb, directconn);
 
 	if (directconn->connect_data != NULL)
 	{
--- a/libgaim/protocols/msn/httpconn.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/msn/httpconn.c	Sat Oct 28 20:04:03 2006 +0000
@@ -727,7 +727,7 @@
 	if (httpconn->connected)
 		msn_httpconn_disconnect(httpconn);
 
-	httpconn->connect_data = gaim_proxy_connect(httpconn->session->account,
+	httpconn->connect_data = gaim_proxy_connect(NULL, httpconn->session->account,
 		"gateway.messenger.hotmail.com", 80, connect_cb, httpconn);
 
 	if (httpconn->connect_data != NULL)
--- a/libgaim/protocols/msn/servconn.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/msn/servconn.c	Sat Oct 28 20:04:03 2006 +0000
@@ -213,9 +213,7 @@
 	if (servconn->connected)
 		msn_servconn_disconnect(servconn);
 
-	if (servconn->host != NULL)
-		g_free(servconn->host);
-
+	g_free(servconn->host);
 	servconn->host = g_strdup(host);
 
 	if (session->http_method)
@@ -235,8 +233,8 @@
 		return TRUE;
 	}
 
-	servconn->connect_data = gaim_proxy_connect(session->account, host, port,
-		connect_cb, servconn);
+	servconn->connect_data = gaim_proxy_connect(NULL, session->account,
+			host, port, connect_cb, servconn);
 
 	if (servconn->connect_data != NULL)
 	{
--- a/libgaim/protocols/oscar/oscar.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/oscar/oscar.c	Sat Oct 28 20:04:03 2006 +0000
@@ -1211,7 +1211,7 @@
 	gaim_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc);
 
 	newconn = flap_connection_new(od, SNAC_FAMILY_AUTH);
-	newconn->connect_data = gaim_proxy_connect(account,
+	newconn->connect_data = gaim_proxy_connect(NULL, account,
 			gaim_account_get_string(account, "server", OSCAR_DEFAULT_LOGIN_SERVER),
 			gaim_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT),
 			connection_established_cb, newconn);
@@ -1333,7 +1333,7 @@
 	newconn = flap_connection_new(od, SNAC_FAMILY_LOCATE);
 	newconn->cookielen = info->cookielen;
 	newconn->cookie = g_memdup(info->cookie, info->cookielen);
-	newconn->connect_data = gaim_proxy_connect(account, host, port,
+	newconn->connect_data = gaim_proxy_connect(NULL, account, host, port,
 			connection_established_cb, newconn);
 	g_free(host);
 	if (newconn->connect_data == NULL)
@@ -1546,7 +1546,7 @@
 	pos->modname = g_strdup(modname);
 
 	/* TODO: Keep track of this return value. */
-	if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80,
+	if (gaim_proxy_connect(NULL, pos->gc->account, "gaim.sourceforge.net", 80,
 			straight_to_hell, pos) == NULL)
 	{
 		char buf[256];
@@ -1632,13 +1632,13 @@
 		gaim_debug_info("oscar", "Connecting to chat room %s exchange %hu\n", cc->name, cc->exchange);
 	}
 
-	newconn->connect_data = gaim_proxy_connect(account, host, port,
+	newconn->connect_data = gaim_proxy_connect(NULL, account, host, port,
 			connection_established_cb, newconn);
 	if (newconn->connect_data == NULL)
 	{
 		flap_connection_schedule_destroy(newconn,
 				OSCAR_DISCONNECT_COULD_NOT_CONNECT,
-				_("gaim_proxy_connect() failed"));
+				_("Unable to initialize connection"));
 		gaim_debug_error("oscar", "Unable to connect to FLAP server "
 				"of type 0x%04hx\n", redir->group);
 	}
--- a/libgaim/protocols/oscar/peer.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/oscar/peer.c	Sat Oct 28 20:04:03 2006 +0000
@@ -708,7 +708,7 @@
 			g_free(tmp);
 		}
 
-		conn->connect_data = gaim_proxy_connect(account,
+		conn->connect_data = gaim_proxy_connect(NULL, account,
 				conn->verifiedip, conn->port,
 				peer_connection_established_cb, conn);
 		if (conn->connect_data != NULL)
@@ -743,7 +743,7 @@
 				g_free(tmp);
 			}
 
-			conn->connect_data = gaim_proxy_connect(account,
+			conn->connect_data = gaim_proxy_connect(NULL, account,
 					conn->clientip, conn->port,
 					peer_connection_established_cb, conn);
 			if (conn->connect_data != NULL)
@@ -807,7 +807,7 @@
 			g_free(tmp);
 		}
 
-		conn->connect_data = gaim_proxy_connect(account,
+		conn->connect_data = gaim_proxy_connect(NULL, account,
 				(conn->proxyip != NULL) ? conn->proxyip : PEER_PROXY_SERVER,
 				PEER_PROXY_PORT,
 				peer_proxy_connection_established_cb, conn);
--- a/libgaim/protocols/qq/qq_proxy.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/qq/qq_proxy.c	Sat Oct 28 20:04:03 2006 +0000
@@ -420,7 +420,7 @@
 	qd->server_port = port;
 
 	if(use_tcp)
-		return (gaim_proxy_connect(account, host, port, func, data) == NULL);
+		return (gaim_proxy_connect(NULL, account, host, port, func, data) == NULL);
 	else
 		return _qq_udp_proxy_connect(account, host, port, func, data);
 }
--- a/libgaim/protocols/sametime/sametime.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/sametime/sametime.c	Sat Oct 28 20:04:03 2006 +0000
@@ -225,7 +225,6 @@
   /** socket fd */
   int socket;
   gint outpa;  /* like inpa, but the other way */
-  GaimProxyConnectData *connect_data;
 
   /** circular buffer for outgoing data */
   GaimCircBuffer *sock_buf;
@@ -1409,7 +1408,7 @@
   port = gaim_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT);
 
   if(gaim_account_get_bool(account, MW_KEY_FORCE, FALSE) ||
-     (gaim_proxy_connect(account, host, port, connect_cb, pd) == NULL)) {
+     (gaim_proxy_connect(NULL, account, host, port, connect_cb, pd) == NULL)) {
 
     mwSession_forceLogin(session);
   }
@@ -1674,8 +1673,6 @@
   struct mwGaimPluginData *pd = data;
   GaimConnection *gc = pd->gc;
 
-  pd->connect_data = NULL;
-
   if(source < 0) {
     /* connection failed */
 
@@ -3680,8 +3677,7 @@
 
   gaim_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS);
 
-  pd->connect_data = gaim_proxy_connect(account, host, port, connect_cb, pd);
-  if(pd->connect_data == NULL) {
+  if (gaim_proxy_connect(gc, account, host, port, connect_cb, pd) == NULL) {
     gaim_connection_error(gc, _("Unable to connect to host"));
   }
 }
@@ -3714,11 +3710,6 @@
     gc->inpa = 0;
   }
 
-  if(pd->connect_data != NULL) {
-    gaim_proxy_connect_cancel(pd->connect_data);
-    pd->connect_data = NULL;
-  }
-
   /* clean up the rest */
   mwGaimPluginData_free(pd);
 }
--- a/libgaim/protocols/silc/silc.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/silc/silc.c	Sat Oct 28 20:04:03 2006 +0000
@@ -154,7 +154,6 @@
 	g_return_if_fail(gc != NULL);
 
 	sg = gc->proto_data;
-	sg->connect_data = NULL;
 
 	if (source < 0) {
 		gaim_connection_error(gc, _("Connection failed"));
@@ -357,12 +356,11 @@
 	gc->proto_data = sg;
 
 	/* Connect to the SILC server */
-	sg->connect_data = gaim_proxy_connect(account,
+	if (gaim_proxy_connect(gc, account,
 			       gaim_account_get_string(account, "server",
 						       "silc.silcnet.org"),
 			       gaim_account_get_int(account, "port", 706),
-			       silcgaim_login_connected, gc);
-	if (sg->connect_data == NULL)
+			       silcgaim_login_connected, gc) == NULL)
 	{
 		gaim_connection_error(gc, _("Unable to create connection"));
 		return;
@@ -382,8 +380,6 @@
 	SilcGaim sg = (SilcGaim)context;
 	silc_client_stop(sg->client);
 	silc_client_free(sg->client);
-	if (sg->connect_data != NULL)
-		gaim_proxy_connect_cancel(sg->connect_data);
 #ifdef HAVE_SILCMIME_H
 	if (sg->mimeass)
 		silc_mime_assembler_free(sg->mimeass);
--- a/libgaim/protocols/silc/silcgaim.h	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/silc/silcgaim.h	Sat Oct 28 20:04:03 2006 +0000
@@ -67,7 +67,6 @@
 	SilcClient client;
 	SilcClientConnection conn;
 
-	GaimProxyConnectData *connect_data;
 	guint scheduler;
 	GaimConnection *gc;
 	GaimAccount *account;
--- a/libgaim/protocols/simple/simple.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/simple/simple.c	Sat Oct 28 20:04:03 2006 +0000
@@ -457,12 +457,10 @@
 
 static void sendlater(GaimConnection *gc, const char *buf) {
 	struct simple_account_data *sip = gc->proto_data;
-	GaimProxyConnectData *connect_data;
 
 	if(!sip->connecting) {
 		gaim_debug_info("simple", "connecting to %s port %d\n", sip->realhostname ? sip->realhostname : "{NULL}", sip->realport);
-		connect_data = gaim_proxy_connect(sip->account, sip->realhostname, sip->realport, send_later_cb, gc);
-		if(connect_data == NULL) {
+		if (gaim_proxy_connect(gc, sip->account, sip->realhostname, sip->realport, send_later_cb, gc) == NULL) {
 			gaim_connection_error(gc, _("Couldn't create socket"));
 		}
 		sip->connecting = TRUE;
@@ -1565,7 +1563,6 @@
 static void
 simple_tcp_connect_listen_cb(int listenfd, gpointer data) {
 	struct simple_account_data *sip = (struct simple_account_data*) data;
-	GaimProxyConnectData *connect_data;
 
 	sip->listen_data = NULL;
 
@@ -1582,9 +1579,8 @@
 	gaim_debug_info("simple", "connecting to %s port %d\n",
 			sip->realhostname, sip->realport);
 	/* open tcp connection to the server */
-	connect_data = gaim_proxy_connect(sip->account, sip->realhostname,
-			sip->realport, login_cb, sip->gc);
-	if(connect_data == NULL) {
+	if (gaim_proxy_connect(sip->gc, sip->account, sip->realhostname,
+			sip->realport, login_cb, sip->gc) == NULL) {
 		gaim_connection_error(sip->gc, _("Couldn't create socket"));
 	}
 }
--- a/libgaim/protocols/toc/toc.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/toc/toc.c	Sat Oct 28 20:04:03 2006 +0000
@@ -141,7 +141,7 @@
 	gaim_connection_update_progress(gc, buf, 0, TOC_CONNECT_STEPS);
 
 	gaim_debug(GAIM_DEBUG_INFO, "toc", "Client connects to TOC\n");
-	if (gaim_proxy_connect(account,
+	if (gaim_proxy_connect(gc, account,
 				gaim_account_get_string(account, "server", TOC_HOST),
 				gaim_account_get_int(account, "port", TOC_PORT),
 				toc_login_callback, gc) != 0 || !account->gc) {
@@ -1933,7 +1933,7 @@
 	g_snprintf(buf, sizeof(buf), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_SEND_UID);
 	sflap_send(ft->gc, buf, -1, TYPE_DATA);
 
-	if (gaim_proxy_connect(account, ft->ip, ft->port, toc_send_file_connect, ft) != 0) {
+	if (gaim_proxy_connect(ft->gc, account, ft->ip, ft->port, toc_send_file_connect, ft) != 0) {
 		gaim_notify_error(ft->gc, NULL,
 						  _("Could not connect for transfer."), NULL);
 		g_free(ft->filename);
@@ -2145,7 +2145,7 @@
 	g_snprintf(buf2, sizeof(buf2), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_GET_UID);
 	sflap_send(ft->gc, buf2, -1, TYPE_DATA);
 
-	if (gaim_proxy_connect(account, ft->ip, ft->port, toc_get_file_connect, ft) < 0) {
+	if (gaim_proxy_connect(ft->gc, account, ft->ip, ft->port, toc_get_file_connect, ft) < 0) {
 		gaim_notify_error(ft->gc, NULL,
 						  _("Could not connect for transfer."), NULL);
 		fclose(ft->file);
--- a/libgaim/protocols/yahoo/yahoo.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/yahoo/yahoo.c	Sat Oct 28 20:04:03 2006 +0000
@@ -2459,7 +2459,7 @@
 	yd->rxqueue = NULL;
 	yd->rxlen = 0;
 	/* Now we have our cookies to login with.  I'll go get the milk. */
-	if (gaim_proxy_connect(account, "wcs2.msg.dcn.yahoo.com",
+	if (gaim_proxy_connect(gc, account, "wcs2.msg.dcn.yahoo.com",
 			       gaim_account_get_int(account, "port", YAHOO_PAGER_PORT),
 			       yahoo_got_web_connected, gc) == NULL) {
 		gaim_connection_error(gc, _("Connection problem"));
@@ -2633,7 +2633,7 @@
 			      "Host: login.yahoo.com\r\n\r\n");
 	g_hash_table_destroy(hash);
 	yd->auth = g_string_free(url, FALSE);
-	if (gaim_proxy_connect(account, "login.yahoo.com", 80, yahoo_got_cookies, gc) == NULL) {
+	if (gaim_proxy_connect(gc, account, "login.yahoo.com", 80, yahoo_got_cookies, gc) == NULL) {
 		gaim_connection_error(gc, _("Connection problem"));
 		return;
 	}
@@ -2732,7 +2732,7 @@
 
 	if (gaim_account_get_bool(account, "yahoojp", FALSE)) {
 		yd->jp = TRUE;
-		if (gaim_proxy_connect(account,
+		if (gaim_proxy_connect(gc, account,
 		                       gaim_account_get_string(account, "serverjp",  YAHOOJP_PAGER_HOST),
 		                       gaim_account_get_int(account, "port", YAHOO_PAGER_PORT),
 		                       yahoo_got_connected, gc) == NULL)
@@ -2742,7 +2742,7 @@
 		}
 	} else {
 		yd->jp = FALSE;
-		if (gaim_proxy_connect(account,
+		if (gaim_proxy_connect(gc, account,
 		                       gaim_account_get_string(account, "server",  YAHOO_PAGER_HOST),
 		                       gaim_account_get_int(account, "port", YAHOO_PAGER_PORT),
 		                       yahoo_got_connected, gc) == NULL)
--- a/libgaim/protocols/yahoo/yahoo_filexfer.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/yahoo/yahoo_filexfer.c	Sat Oct 28 20:04:03 2006 +0000
@@ -261,7 +261,7 @@
 
 	if (gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) {
 		if (yd->jp) {
-			if (gaim_proxy_connect(account, gaim_account_get_string(account, "xferjp_host",  YAHOOJP_XFER_HOST),
+			if (gaim_proxy_connect(NULL, account, gaim_account_get_string(account, "xferjp_host",  YAHOOJP_XFER_HOST),
 			                       gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT),
 			                       yahoo_sendfile_connected, xfer) == NULL)
 			{
@@ -270,7 +270,7 @@
 				gaim_xfer_cancel_remote(xfer);
 			}
 		} else {
-			if (gaim_proxy_connect(account, gaim_account_get_string(account, "xfer_host",  YAHOO_XFER_HOST),
+			if (gaim_proxy_connect(NULL, account, gaim_account_get_string(account, "xfer_host",  YAHOO_XFER_HOST),
 			                       gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT),
 			                       yahoo_sendfile_connected, xfer) == NULL)
 			{
@@ -281,7 +281,7 @@
 		}
 	} else {
 		/* TODO: Using xfer->fd like this is probably a bad thing... */
-		if (gaim_proxy_connect(account, xfer_data->host, xfer_data->port,
+		if (gaim_proxy_connect(NULL, account, xfer_data->host, xfer_data->port,
 		                              yahoo_receivefile_connected, xfer) == NULL)
 			xfer->fd = -1;
 		else
--- a/libgaim/protocols/yahoo/yahoo_picture.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/yahoo/yahoo_picture.c	Sat Oct 28 20:04:03 2006 +0000
@@ -511,7 +511,7 @@
 	}
 
 	if (yd->jp) {
-		if ((connect_data = gaim_proxy_connect(account, gaim_account_get_string(account, "xferjp_host",  YAHOOJP_XFER_HOST),
+		if ((connect_data = gaim_proxy_connect(NULL, account, gaim_account_get_string(account, "xferjp_host",  YAHOOJP_XFER_HOST),
 											   gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT),
 											   yahoo_buddy_icon_upload_connected, d)) == NULL)
 		{
@@ -519,7 +519,7 @@
 			yahoo_buddy_icon_upload_data_free(d);
 		}
 	} else {
-		if ((connect_data = gaim_proxy_connect(account, gaim_account_get_string(account, "xfer_host",  YAHOO_XFER_HOST),
+		if ((connect_data = gaim_proxy_connect(NULL, account, gaim_account_get_string(account, "xfer_host",  YAHOO_XFER_HOST),
 											   gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT),
 											   yahoo_buddy_icon_upload_connected, d)) == NULL)
 		{
--- a/libgaim/protocols/yahoo/yahoochat.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/yahoo/yahoochat.c	Sat Oct 28 20:04:03 2006 +0000
@@ -1449,7 +1449,7 @@
 
 	gaim_roomlist_set_fields(rl, fields);
 
-	if (gaim_proxy_connect(gaim_connection_get_account(gc), yrl->host, 80,
+	if (gaim_proxy_connect(NULL, gaim_connection_get_account(gc), yrl->host, 80,
 	                       yahoo_roomlist_got_connected, yrl) == NULL)
 	{
 		gaim_notify_error(gc, NULL, _("Connection problem"), _("Unable to fetch room list."));
@@ -1518,7 +1518,7 @@
 	yrl->ucat = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_CATEGORY, _("User Rooms"), yrl->cat);
 	gaim_roomlist_room_add(list, yrl->ucat);
 
-	if (gaim_proxy_connect(list->account, yrl->host, 80,
+	if (gaim_proxy_connect(NULL, list->account, yrl->host, 80,
 	                       yahoo_roomlist_got_connected, yrl) == NULL)
 	{
 		gaim_notify_error(gaim_account_get_connection(list->account),
--- a/libgaim/protocols/yahoo/ycht.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/protocols/yahoo/ycht.c	Sat Oct 28 20:04:03 2006 +0000
@@ -577,7 +577,7 @@
 
 	yd->ycht = ycht;
 
-	if (gaim_proxy_connect(account,
+	if (gaim_proxy_connect(NULL, account,
 	                       gaim_account_get_string(account, "ycht-server",  YAHOO_YCHT_HOST),
 	                       gaim_account_get_int(account, "ycht-port", YAHOO_YCHT_PORT),
 	                       ycht_got_connected, ycht) == NULL)
--- a/libgaim/proxy.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/proxy.c	Sat Oct 28 20:04:03 2006 +0000
@@ -40,6 +40,7 @@
 #include "util.h"
 
 struct _GaimProxyConnectData {
+	void *handle;
 	GaimProxyConnectFunction connect_cb;
 	gpointer data;
 	gchar *host;
@@ -82,12 +83,7 @@
 
 static GaimProxyInfo *global_proxy_info = NULL;
 
-/*
- * TODO: Once all callers of gaim_proxy_connect() are keeping track
- *       of the return value from that function this linked list
- *       will no longer be needed.
- */
-static GSList *connect_datas = NULL;
+static GSList *handles = NULL;
 
 static void try_connect(GaimProxyConnectData *connect_data);
 
@@ -281,7 +277,7 @@
 static void
 gaim_proxy_connect_data_destroy(GaimProxyConnectData *connect_data)
 {
-	connect_datas = g_slist_remove(connect_datas, connect_data);
+	handles = g_slist_remove(handles, connect_data);
 
 	if (connect_data->query_data != NULL)
 		gaim_dnsquery_destroy(connect_data->query_data);
@@ -1750,7 +1746,8 @@
 }
 
 GaimProxyConnectData *
-gaim_proxy_connect(GaimAccount *account, const char *host, int port,
+gaim_proxy_connect(void *handle, GaimAccount *account,
+				   const char *host, int port,
 				   GaimProxyConnectFunction connect_cb, gpointer data)
 {
 	const char *connecthost = host;
@@ -1763,6 +1760,7 @@
 
 	connect_data = g_new0(GaimProxyConnectData, 1);
 	connect_data->fd = -1;
+	connect_data->handle = handle;
 	connect_data->connect_cb = connect_cb;
 	connect_data->data = data;
 	connect_data->host = g_strdup(host);
@@ -1804,7 +1802,7 @@
 		return NULL;
 	}
 
-	connect_datas = g_slist_prepend(connect_datas, connect_data);
+	handles = g_slist_prepend(handles, connect_data);
 
 	return connect_data;
 }
@@ -1813,8 +1811,10 @@
  * Combine some of this code with gaim_proxy_connect()
  */
 GaimProxyConnectData *
-gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port,
-				   GaimProxyConnectFunction connect_cb, gpointer data)
+gaim_proxy_connect_socks5(void *handle, GaimProxyInfo *gpi,
+						  const char *host, int port,
+						  GaimProxyConnectFunction connect_cb,
+						  gpointer data)
 {
 	GaimProxyConnectData *connect_data;
 
@@ -1824,6 +1824,7 @@
 
 	connect_data = g_new0(GaimProxyConnectData, 1);
 	connect_data->fd = -1;
+	connect_data->handle = handle;
 	connect_data->connect_cb = connect_cb;
 	connect_data->data = data;
 	connect_data->host = g_strdup(host);
@@ -1840,7 +1841,7 @@
 		return NULL;
 	}
 
-	connect_datas = g_slist_prepend(connect_datas, connect_data);
+	handles = g_slist_prepend(handles, connect_data);
 
 	return connect_data;
 }
@@ -1852,6 +1853,21 @@
 	gaim_proxy_connect_data_destroy(connect_data);
 }
 
+void
+gaim_proxy_connect_cancel_with_handle(void *handle)
+{
+	GSList *l, *l_next;
+
+	for (l = handles; l != NULL; l = l_next) {
+		GaimProxyConnectData *connect_data = l->data;
+
+		l_next = l->next;
+
+		if (connect_data->handle == handle)
+			gaim_proxy_connect_cancel(connect_data);
+	}
+}
+
 static void
 proxy_pref_cb(const char *name, GaimPrefType type,
 			  gconstpointer value, gpointer data)
@@ -1927,9 +1943,9 @@
 void
 gaim_proxy_uninit(void)
 {
-	while (connect_datas != NULL)
+	while (handles != NULL)
 	{
-		gaim_proxy_connect_data_disconnect(connect_datas->data, NULL);
-		gaim_proxy_connect_data_destroy(connect_datas->data);
+		gaim_proxy_connect_data_disconnect(handles->data, NULL);
+		gaim_proxy_connect_data_destroy(handles->data);
 	}
 }
--- a/libgaim/proxy.h	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/proxy.h	Sat Oct 28 20:04:03 2006 +0000
@@ -237,7 +237,8 @@
  *         structure that can be used to cancel the pending
  *         connection, if needed.
  */
-GaimProxyConnectData *gaim_proxy_connect(GaimAccount *account,
+GaimProxyConnectData *gaim_proxy_connect(void *handle,
+			GaimAccount *account,
 			const char *host, int port,
 			GaimProxyConnectFunction connect_cb, gpointer data);
 
@@ -257,7 +258,8 @@
  *         structure that can be used to cancel the pending
  *         connection, if needed.
  */
-GaimProxyConnectData *gaim_proxy_connect_socks5(GaimProxyInfo *gpi,
+GaimProxyConnectData *gaim_proxy_connect_socks5(void *handle,
+			GaimProxyInfo *gpi,
 			const char *host, int port,
 			GaimProxyConnectFunction connect_cb, gpointer data);
 
@@ -272,6 +274,13 @@
  */
 void gaim_proxy_connect_cancel(GaimProxyConnectData *connect_data);
 
+/*
+ * Closes all proxy connections registered with the specified handle.
+ *
+ * @param handle The handle.
+ */
+void gaim_proxy_connect_cancel_with_handle(void *handle);
+
 /*@}*/
 
 #ifdef __cplusplus
--- a/libgaim/sslconn.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/sslconn.c	Sat Oct 28 20:04:03 2006 +0000
@@ -117,7 +117,7 @@
 	gsc->connect_cb      = func;
 	gsc->error_cb        = error_func;
 
-	gsc->connect_data = gaim_proxy_connect(account, host, port, gaim_ssl_connect_cb, gsc);
+	gsc->connect_data = gaim_proxy_connect(NULL, account, host, port, gaim_ssl_connect_cb, gsc);
 
 	if (gsc->connect_data == NULL)
 	{
--- a/libgaim/upnp.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/upnp.c	Sat Oct 28 20:04:03 2006 +0000
@@ -215,14 +215,14 @@
 	/* make sure we have a valid http response */
 	if(g_strstr_len(httpResponse, len, HTTP_OK) == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): Failed In HTTP_OK\n\n");
+			"parse_description_response(): Failed In HTTP_OK\n");
 		return NULL;
 	}
 
 	/* find the root of the xml document */
 	if((xmlRoot = g_strstr_len(httpResponse, len, "<root")) == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): Failed finding root\n\n");
+			"parse_description_response(): Failed finding root\n");
 		return NULL;
 	}
 
@@ -230,7 +230,7 @@
 	if((xmlRootNode = xmlnode_from_str(xmlRoot,
 			len - (xmlRoot - httpResponse))) == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): Could not parse xml root node\n\n");
+			"parse_description_response(): Could not parse xml root node\n");
 		return NULL;
 	}
 
@@ -252,7 +252,7 @@
 	}
 	if(serviceTypeNode == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): could not get serviceTypeNode 1\n\n");
+			"parse_description_response(): could not get serviceTypeNode 1\n");
 		g_free(baseURL);
 		xmlnode_free(xmlRootNode);
 		return NULL;
@@ -260,7 +260,7 @@
 	serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList");
 	if(serviceTypeNode == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): could not get serviceTypeNode 2\n\n");
+			"parse_description_response(): could not get serviceTypeNode 2\n");
 		g_free(baseURL);
 		xmlnode_free(xmlRootNode);
 		return NULL;
@@ -275,7 +275,7 @@
 	}
 	if(serviceTypeNode == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): could not get serviceTypeNode 3\n\n");
+			"parse_description_response(): could not get serviceTypeNode 3\n");
 		g_free(baseURL);
 		xmlnode_free(xmlRootNode);
 		return NULL;
@@ -283,7 +283,7 @@
 	serviceTypeNode = xmlnode_get_child(serviceTypeNode, "deviceList");
 	if(serviceTypeNode == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): could not get serviceTypeNode 4\n\n");
+			"parse_description_response(): could not get serviceTypeNode 4\n");
 		g_free(baseURL);
 		xmlnode_free(xmlRootNode);
 		return NULL;
@@ -297,7 +297,7 @@
 	}
 	if(serviceTypeNode == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): could not get serviceTypeNode 5\n\n");
+			"parse_description_response(): could not get serviceTypeNode 5\n");
 		g_free(baseURL);
 		xmlnode_free(xmlRootNode);
 		return NULL;
@@ -305,7 +305,7 @@
 	serviceTypeNode = xmlnode_get_child(serviceTypeNode, "serviceList");
 	if(serviceTypeNode == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): could not get serviceTypeNode 6\n\n");
+			"parse_description_response(): could not get serviceTypeNode 6\n");
 		g_free(baseURL);
 		xmlnode_free(xmlRootNode);
 		return NULL;
@@ -322,7 +322,7 @@
 	g_free(service);
 	if(serviceTypeNode == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): could not get serviceTypeNode 7\n\n");
+			"parse_description_response(): could not get serviceTypeNode 7\n");
 		g_free(baseURL);
 		xmlnode_free(xmlRootNode);
 		return NULL;
@@ -332,7 +332,7 @@
 	if((controlURLNode = xmlnode_get_child(serviceTypeNode,
 			"controlURL")) == NULL) {
 		gaim_debug_error("upnp",
-			"parse_description_response(): Could not find controlURL\n\n");
+			"parse_description_response(): Could not find controlURL\n");
 		g_free(baseURL);
 		xmlnode_free(xmlRootNode);
 		return NULL;
@@ -367,7 +367,7 @@
 
 	if(control_url == NULL) {
 		gaim_debug_error("upnp",
-			"gaim_upnp_parse_description(): control URL is NULL\n\n");
+			"gaim_upnp_parse_description(): control URL is NULL\n");
 	}
 
 	control_info.status = control_url ? GAIM_UPNP_STATUS_DISCOVERED
@@ -444,13 +444,13 @@
 
 	if(g_strstr_len(buf, buf_len, HTTP_OK) == NULL) {
 		gaim_debug_error("upnp",
-			"parse_discover_response(): Failed In HTTP_OK\n\n");
+			"parse_discover_response(): Failed In HTTP_OK\n");
 		return;
 	}
 
 	if((startDescURL = g_strstr_len(buf, buf_len, "http://")) == NULL) {
 		gaim_debug_error("upnp",
-			"parse_discover_response(): Failed In finding http://\n\n");
+			"parse_discover_response(): Failed In finding http://\n");
 		return;
 	}
 
@@ -461,7 +461,7 @@
 				buf_len - (startDescURL - buf), "\n");
 		if(endDescURL == NULL) {
 			gaim_debug_error("upnp",
-				"parse_discover_response(): Failed In endDescURL\n\n");
+				"parse_discover_response(): Failed In endDescURL\n");
 			return;
 		}
 	}
@@ -469,7 +469,7 @@
 	/* XXX: I'm not sure how this could ever happen */
 	if(endDescURL == startDescURL) {
 		gaim_debug_error("upnp",
-			"parse_discover_response(): endDescURL == startDescURL\n\n");
+			"parse_discover_response(): endDescURL == startDescURL\n");
 		return;
 	}
 
@@ -492,6 +492,7 @@
 	dd->tima = 0;
 
 	if (dd->retry_count < NUM_UDP_ATTEMPTS) {
+		/* TODO: We probably shouldn't be incrementing retry_count in two places */
 		dd->retry_count++;
 		gaim_upnp_discover_send_broadcast(dd);
 	} else {
@@ -625,7 +626,7 @@
 	sock = socket(AF_INET, SOCK_DGRAM, 0);
 	if(sock == -1) {
 		gaim_debug_error("upnp",
-			"gaim_upnp_discover(): Failed In sock creation\n\n");
+			"gaim_upnp_discover(): Failed In sock creation\n");
 		/* Short circuit the retry attempts */
 		dd->retry_count = NUM_UDP_ATTEMPTS;
 		gaim_timeout_add(10, gaim_upnp_discover_timeout, dd);
@@ -634,10 +635,10 @@
 
 	dd->fd = sock;
 
-	/* This shouldn't block */
+	/* TODO: Non-blocking! */
 	if((hp = gethostbyname(HTTPMU_HOST_ADDRESS)) == NULL) {
 		gaim_debug_error("upnp",
-			"gaim_upnp_discover(): Failed In gethostbyname\n\n");
+			"gaim_upnp_discover(): Failed In gethostbyname\n");
 		/* Short circuit the retry attempts */
 		dd->retry_count = NUM_UDP_ATTEMPTS;
 		gaim_timeout_add(10, gaim_upnp_discover_timeout, dd);
@@ -670,7 +671,7 @@
 	if(!gaim_url_parse(control_info.control_url, &addressOfControl,
 			&port, &pathOfControl, NULL, NULL)) {
 		gaim_debug_error("upnp",
-			"generate_action_message_and_send(): Failed In Parse URL\n\n");
+			"generate_action_message_and_send(): Failed In Parse URL\n");
 		/* XXX: This should probably be async */
 		if(cb)
 			cb(NULL, cb_data, NULL, 0, NULL);
@@ -728,17 +729,17 @@
 	if((temp = g_strstr_len(httpResponse, len,
 			"<NewExternalIPAddress")) == NULL) {
 		gaim_debug_error("upnp",
-			"looked_up_public_ip_cb(): Failed Finding <NewExternalIPAddress\n\n");
+			"looked_up_public_ip_cb(): Failed Finding <NewExternalIPAddress\n");
 		return;
 	}
 	if(!(temp = g_strstr_len(temp, len - (temp - httpResponse), ">"))) {
 		gaim_debug_error("upnp",
-			"looked_up_public_ip_cb(): Failed In Finding >\n\n");
+			"looked_up_public_ip_cb(): Failed In Finding >\n");
 		return;
 	}
 	if(!(temp2 = g_strstr_len(temp, len - (temp - httpResponse), "<"))) {
 		gaim_debug_error("upnp",
-			"looked_up_public_ip_cb(): Failed In Finding <\n\n");
+			"looked_up_public_ip_cb(): Failed In Finding <\n");
 		return;
 	}
 	*temp2 = '\0';
@@ -798,14 +799,14 @@
 	if(!gaim_url_parse(control_info.control_url, &addressOfControl, &port,
 			NULL, NULL, NULL)) {
 		gaim_debug_error("upnp",
-			"lookup_internal_ip(): Failed In Parse URL\n\n");
+			"lookup_internal_ip(): Failed In Parse URL\n");
 		return;
 	}
 	if(port == 0 || port == -1) {
 		port = DEFAULT_HTTP_PORT;
 	}
 
-	if(gaim_proxy_connect(NULL, addressOfControl, port,
+	if(gaim_proxy_connect(NULL, NULL, addressOfControl, port,
 			looked_up_internal_ip_cb, NULL) == NULL)
 	{
 		gaim_debug_error("upnp", "Get Local IP Connect Failed: Address: %s @@@ Port %d\n",
@@ -828,7 +829,7 @@
 		(g_strstr_len(httpResponse, len, HTTP_OK) == NULL))
 	{
 		gaim_debug_error("upnp",
-			"gaim_upnp_set_port_mapping(): Failed HTTP_OK\n\n%s\n\n",
+			"gaim_upnp_set_port_mapping(): Failed HTTP_OK\n%s\n",
 			httpResponse ? httpResponse : "(null)");
 		success =  FALSE;
 	} else
@@ -852,7 +853,7 @@
 			/* get the internal IP */
 			if(!(internal_ip = gaim_upnp_get_internal_ip())) {
 				gaim_debug_error("upnp",
-					"gaim_upnp_set_port_mapping(): couldn't get local ip\n\n");
+					"gaim_upnp_set_port_mapping(): couldn't get local ip\n");
 				/* UGLY */
 				if (ar->cb)
 					ar->cb(FALSE, ar->cb_data);
--- a/libgaim/util.c	Sat Oct 28 19:52:30 2006 +0000
+++ b/libgaim/util.c	Sat Oct 28 20:04:03 2006 +0000
@@ -3152,7 +3152,7 @@
 		gaim_url_parse(new_url, &gfud->website.address, &gfud->website.port,
 					   &gfud->website.page, &gfud->website.user, &gfud->website.passwd);
 
-		gfud->connect_data = gaim_proxy_connect(NULL,
+		gfud->connect_data = gaim_proxy_connect(NULL, NULL,
 				gfud->website.address, gfud->website.port,
 				url_fetch_connect_cb, gfud);
 
@@ -3451,7 +3451,7 @@
 	gaim_url_parse(url, &gfud->website.address, &gfud->website.port,
 				   &gfud->website.page, &gfud->website.user, &gfud->website.passwd);
 
-	gfud->connect_data = gaim_proxy_connect(NULL,
+	gfud->connect_data = gaim_proxy_connect(NULL, NULL,
 			gfud->website.address, gfud->website.port,
 			url_fetch_connect_cb, gfud);