diff src/protocols/msn/servconn.c @ 10463:9bed28273ec7

[gaim-migrate @ 11737] Felipe Contreras fixed the MSN HTTP Method. Yay! Thanks Felipe. committer: Tailor Script <tailor@pidgin.im>
author Stu Tomlinson <stu@nosnilmot.com>
date Fri, 31 Dec 2004 16:34:22 +0000
parents 6be6da69d603
children bcfea6c3d5c9
line wrap: on
line diff
--- a/src/protocols/msn/servconn.c	Fri Dec 31 15:34:18 2004 +0000
+++ b/src/protocols/msn/servconn.c	Fri Dec 31 16:34:22 2004 +0000
@@ -43,10 +43,7 @@
 	servconn->cmdproc->servconn = servconn;
 
 	if (session->http_method)
-	{
-		servconn->http_data = g_new0(MsnHttpMethodData, 1);
-		servconn->http_data->virgin = TRUE;
-	}
+		servconn->httpconn = msn_httpconn_new(servconn);
 
 	servconn->num = session->servconns_count++;
 
@@ -64,11 +61,22 @@
 		return;
 	}
 
+	if (servconn->destroying)
+		return;
+
+	servconn->destroying = TRUE;
+
 	if (servconn->connected)
 		msn_servconn_disconnect(servconn);
 
-	if (servconn->http_data != NULL)
-		g_free(servconn->http_data);
+	if (servconn->destroy_cb)
+		servconn->destroy_cb(servconn);
+
+	if (servconn->httpconn != NULL)
+		msn_httpconn_destroy(servconn->httpconn);
+
+	if (servconn->host != NULL)
+		g_free(servconn->host);
 
 	msn_cmdproc_destroy(servconn->cmdproc);
 	g_free(servconn);
@@ -113,7 +121,7 @@
 	else
 	{
 		MsnSwitchBoard *swboard;
-		swboard = servconn->data;
+		swboard = servconn->cmdproc->data;
 		swboard->error = MSN_SB_ERROR_CONNECTION;
 	}
 
@@ -167,12 +175,26 @@
 	if (servconn->connected)
 		msn_servconn_disconnect(servconn);
 
+	if (servconn->host != NULL)
+		g_free(servconn->host);
+
+	servconn->host = g_strdup(host);
+
 	if (session->http_method)
 	{
-		if (servconn->http_data->gateway_host != NULL)
-			g_free(servconn->http_data->gateway_host);
+		/* HTTP Connection. */
+
+		if (!servconn->httpconn->connected)
+			msn_httpconn_connect(servconn->httpconn, host, port);
 
-		servconn->http_data->gateway_host = g_strdup(host);
+		servconn->connected = TRUE;
+		servconn->cmdproc->ready = TRUE;
+		servconn->httpconn->virgin = TRUE;
+
+		/* Someone wants to know we connected. */
+		servconn->connect_cb(servconn);
+
+		return TRUE;
 	}
 
 	r = gaim_proxy_connect(session->account, host, port, connect_cb,
@@ -200,6 +222,15 @@
 		return;
 	}
 
+	if (servconn->session->http_method)
+	{
+		/* Fake disconnection */
+		if (servconn->disconnect_cb != NULL)
+			servconn->disconnect_cb(servconn);
+
+		return;
+	}
+
 	if (servconn->inpa > 0)
 	{
 		gaim_input_remove(servconn->inpa);
@@ -208,21 +239,6 @@
 
 	close(servconn->fd);
 
-	if (servconn->http_data != NULL)
-	{
-		if (servconn->http_data->session_id != NULL)
-			g_free(servconn->http_data->session_id);
-
-		if (servconn->http_data->old_gateway_host != NULL)
-			g_free(servconn->http_data->old_gateway_host);
-
-		if (servconn->http_data->gateway_host != NULL)
-			g_free(servconn->http_data->gateway_host);
-
-		if (servconn->http_data->timer)
-			gaim_timeout_remove(servconn->http_data->timer);
-	}
-
 	servconn->rx_buf = NULL;
 	servconn->rx_len = 0;
 	servconn->payload_len = 0;
@@ -235,20 +251,31 @@
 }
 
 void
-msn_servconn_set_connect_cb(MsnServConn *servconn, void (*connect_cb)(MsnServConn *))
+msn_servconn_set_connect_cb(MsnServConn *servconn,
+							void (*connect_cb)(MsnServConn *))
 {
 	g_return_if_fail(servconn != NULL);
 	servconn->connect_cb = connect_cb;
 }
 
 void
-msn_servconn_set_disconnect_cb(MsnServConn *servconn, void (*disconnect_cb)(MsnServConn *))
+msn_servconn_set_disconnect_cb(MsnServConn *servconn,
+							   void (*disconnect_cb)(MsnServConn *))
 {
 	g_return_if_fail(servconn != NULL);
 
 	servconn->disconnect_cb = disconnect_cb;
 }
 
+void
+msn_servconn_set_destroy_cb(MsnServConn *servconn,
+							   void (*destroy_cb)(MsnServConn *))
+{
+	g_return_if_fail(servconn != NULL);
+
+	servconn->destroy_cb = destroy_cb;
+}
+
 static void
 failed_io(MsnServConn *servconn)
 {
@@ -266,7 +293,7 @@
 
 	g_return_val_if_fail(servconn != NULL, 0);
 
-	if (servconn->http_data == NULL)
+	if (!servconn->session->http_method)
 	{
 		switch (servconn->type)
 		{
@@ -285,8 +312,7 @@
 	}
 	else
 	{
-		ret = msn_http_servconn_write(servconn, buf, len,
-									  servconn->http_data->server_type);
+		ret = msn_httpconn_write(servconn->httpconn, buf, len);
 	}
 
 	if (ret == -1)
@@ -327,69 +353,6 @@
 	memcpy(servconn->rx_buf + servconn->rx_len, buf, len + 1);
 	servconn->rx_len += len;
 
-	if (session->http_method)
-	{
-		char *result_msg = NULL;
-		size_t result_len = 0;
-		gboolean error;
-		char *tmp;
-
-		tmp = g_strndup(servconn->rx_buf, servconn->rx_len);
-
-		if (!msn_http_servconn_parse_data(servconn, tmp, servconn->rx_len,
-										  &result_msg, &result_len,
-										  &error))
-		{
-			g_free(tmp);
-			return;
-		}
-
-		g_free(tmp);
-
-		if (error)
-		{
-			gaim_connection_error(gaim_account_get_connection(session->account),
-								  _("Received HTTP error. Please report this."));
-
-			return;
-		}
-
-		if (servconn->http_data->session_id != NULL &&
-			!strcmp(servconn->http_data->session_id, "close"))
-		{
-			msn_servconn_destroy(servconn);
-
-			return;
-		}
-
-#if 0
-		if (strcmp(servconn->http_data->gateway_ip,
-				   msn_servconn_get_server(servconn)) != 0)
-		{
-			int i;
-
-			/* Evil hackery. I promise to remove it, even though I can't. */
-
-			servconn->connected = FALSE;
-
-			if (servconn->inpa)
-				gaim_input_remove(servconn->inpa);
-
-			close(servconn->fd);
-
-			i = gaim_proxy_connect(session->account, servconn->host,
-								   servconn->port, read_cb, servconn);
-
-			if (i == 0)
-				servconn->connected = TRUE;
-		}
-#endif
-
-		g_free(servconn->rx_buf);
-		servconn->rx_buf = result_msg;
-		servconn->rx_len = result_len;
-	}
-
 	end = old_rx_buf = servconn->rx_buf;
 
 	servconn->processing = TRUE;