diff src/protocols/msn/servconn.c @ 8583:fc27237783ee

[gaim-migrate @ 9333] Added Felipe Contreras's patch to reorganize and clean up the MSN protocol plugin. Thanks, and once again, apologies for the what must have seemed a never-ending delay. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Mon, 05 Apr 2004 07:11:24 +0000
parents ee13d1befabe
children 1e211dde3cae
line wrap: on
line diff
--- a/src/protocols/msn/servconn.c	Mon Apr 05 06:52:02 2004 +0000
+++ b/src/protocols/msn/servconn.c	Mon Apr 05 07:11:24 2004 +0000
@@ -23,6 +23,8 @@
 #include "servconn.h"
 #include "error.h"
 
+static void read_cb(gpointer data, gint source, GaimInputCondition cond);
+
 typedef struct
 {
 	char *command;
@@ -196,9 +198,21 @@
 	MsnServConn *servconn = data;
 
 	gaim_debug_info("msn", "In servconn's connect_cb\n");
-	if (servconn->connect_cb(data, source, cond))
+
+	servconn->fd = source;
+
+	if (source > 0)
+	{
+		/* Someone wants to know we connected. */
+		servconn->connect_cb(servconn);
 		servconn->inpa = gaim_input_add(servconn->fd, GAIM_INPUT_READ,
-										servconn->login_cb, data);
+										read_cb, data);
+	}
+	else
+	{
+		GaimConnection *gc = servconn->session->account->gc;
+		gaim_connection_error(gc, _("Unable to connect."));
+	}
 }
 
 MsnServConn *
@@ -210,7 +224,6 @@
 
 	servconn = g_new0(MsnServConn, 1);
 
-	servconn->login_cb = msn_servconn_parse_data;
 	servconn->session = session;
 
 	if (session->http_method)
@@ -231,28 +244,29 @@
 }
 
 gboolean
-msn_servconn_connect(MsnServConn *servconn)
+msn_servconn_connect(MsnServConn *servconn, const char *host, int port)
 {
 	MsnSession *session;
 	int i;
 
-	g_return_val_if_fail(servconn         != NULL, FALSE);
-	g_return_val_if_fail(servconn->server != NULL, FALSE);
-	g_return_val_if_fail(!servconn->connected,     TRUE);
+	g_return_val_if_fail(servconn != NULL, FALSE);
+	g_return_val_if_fail(host     != NULL, FALSE);
+	g_return_val_if_fail(port      > 0,    FALSE);
 
 	session = servconn->session;
 
+	if (servconn->connected)
+		msn_servconn_disconnect(servconn);
+
 	if (session->http_method)
 	{
-		servconn->http_data->gateway_ip = g_strdup(servconn->server);
-
-		g_free(servconn->server);
-		servconn->server = g_strdup("gateway.messenger.hotmail.com");
-		servconn->port = 80;
+		servconn->http_data->gateway_ip = g_strdup(host);
+		host = "gateway.messenger.hotmail.com";
+		port = 80;
 	}
 
-	i = gaim_proxy_connect(session->account, servconn->server,
-						   servconn->port, connect_cb, servconn);
+	i = gaim_proxy_connect(session->account, host, port, connect_cb,
+						   servconn);
 
 	if (i == 0)
 		servconn->connected = TRUE;
@@ -275,6 +289,8 @@
 
 	close(servconn->fd);
 
+	servconn->connected = FALSE;
+
 	if (servconn->http_data != NULL)
 	{
 		if (servconn->http_data->session_id != NULL)
@@ -308,7 +324,8 @@
 		msn_servconn_unqueue_message(servconn, entry->msg);
 	}
 
-	servconn->connected = FALSE;
+	if (servconn->disconnect_cb)
+		servconn->disconnect_cb(servconn);
 }
 
 void
@@ -325,12 +342,18 @@
 	if (servconn->connected)
 		msn_servconn_disconnect(servconn);
 
-	if (servconn->server != NULL)
-		g_free(servconn->server);
+#if 0
+	/* shx: not used */
+	if (servconn->host != NULL)
+		g_free(servconn->host);
+#endif
 
 	g_free(servconn);
 }
 
+#if 0
+/* shx: this isn't used */
+
 void
 msn_servconn_set_server(MsnServConn *servconn, const char *server, int port)
 {
@@ -338,11 +361,11 @@
 	g_return_if_fail(server != NULL);
 	g_return_if_fail(port > 0);
 
-	if (servconn->server != NULL)
-		g_free(servconn->server);
+	if (servconn->host != NULL)
+		g_free(servconn->host);
 
-	servconn->server = g_strdup(server);
-	servconn->port   = port;
+	servconn->host = g_strdup(server);
+	servconn->port = port;
 }
 
 const char *
@@ -350,7 +373,7 @@
 {
 	g_return_val_if_fail(servconn != NULL, NULL);
 
-	return servconn->server;
+	return servconn->host;
 }
 
 int
@@ -360,11 +383,11 @@
 
 	return servconn->port;
 }
+#endif
 
 void
 msn_servconn_set_connect_cb(MsnServConn *servconn,
-							gboolean (*connect_cb)(gpointer, gint,
-												   GaimInputCondition))
+							gboolean (*connect_cb)(MsnServConn *servconn))
 {
 	g_return_if_fail(servconn != NULL);
 
@@ -372,13 +395,13 @@
 }
 
 void
-msn_servconn_set_failed_read_cb(MsnServConn *servconn,
-								void (*failed_read_cb)(gpointer, gint,
-													   GaimInputCondition))
+msn_servconn_set_disconnect_cb(MsnServConn *servconn,
+							   void (*disconnect_cb)(MsnServConn
+													 *servconn))
 {
 	g_return_if_fail(servconn != NULL);
 
-	servconn->failed_read_cb = failed_read_cb;
+	servconn->disconnect_cb = disconnect_cb;
 }
 
 size_t
@@ -491,8 +514,19 @@
 	g_hash_table_insert(servconn->msg_types, g_strdup(content_type), cb);
 }
 
-void
-msn_servconn_parse_data(gpointer data, gint source, GaimInputCondition cond)
+static void
+failed_io(MsnServConn *servconn)
+{
+	GaimConnection *gc =
+		gaim_account_get_connection(servconn->session->account);
+
+	gaim_connection_error(gc, _("IO Error."));
+
+	msn_servconn_disconnect(servconn);
+}
+
+static void
+read_cb(gpointer data, gint source, GaimInputCondition cond)
 {
 	MsnServConn *servconn = (MsnServConn *)data;
 	MsnSession *session = servconn->session;
@@ -504,8 +538,7 @@
 
 	if (len <= 0)
 	{
-		if (servconn->failed_read_cb != NULL)
-			servconn->failed_read_cb(data, source, cond);
+		failed_io(servconn);
 
 		return;
 	}
@@ -565,7 +598,7 @@
 
 			close(servconn->fd);
 
-			i = gaim_proxy_connect(session->account, servconn->server,
+			i = gaim_proxy_connect(session->account, servconn->host,
 								   servconn->port, servconn->login_cb,
 								   servconn);