diff src/protocols/msn/ft.c @ 4675:3145c5c45877

[gaim-migrate @ 4986] Okay, redid the cancel stuff. It may not work too well yet, as it's largely untested, and will need some testing and bug reporting. The protocols may not work too well (namely, Oscar), but this will be fixed soon. Note that that's only for canceling. Any receiving that currently works will continue to work. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Sat, 08 Mar 2003 08:27:02 +0000
parents d19872836812
children 677d3cb193a1
line wrap: on
line diff
--- a/src/protocols/msn/ft.c	Sat Mar 08 07:21:09 2003 +0000
+++ b/src/protocols/msn/ft.c	Sat Mar 08 08:27:02 2003 +0000
@@ -109,7 +109,7 @@
 		g_snprintf(sendbuf, sizeof(sendbuf), "TFR\r\n");
 
 		if (msn_write(xfer->fd, sendbuf, strlen(sendbuf)) < 0) {
-			gaim_xfer_cancel(xfer);
+			gaim_xfer_cancel_remote(xfer);
 		}
 	}
 }
@@ -140,7 +140,27 @@
 }
 
 static void
-msn_xfer_cancel(struct gaim_xfer *xfer)
+msn_xfer_cancel_send(struct gaim_xfer *xfer)
+{
+	struct gaim_account *account;
+	struct msn_xfer_data *xfer_data;
+	struct msn_data *md;
+
+	xfer_data = (struct msn_xfer_data *)xfer->data;
+
+	xfer_data->do_cancel = TRUE;
+
+	account   = gaim_xfer_get_account(xfer);
+	md        = (struct msn_data *)account->gc->proto_data;
+
+	md->file_transfers = g_slist_remove(md->file_transfers, xfer);
+
+	g_free(xfer_data);
+	xfer->data = NULL;
+}
+
+static void
+msn_xfer_cancel_recv(struct gaim_xfer *xfer)
 {
 	struct gaim_account *account;
 	struct msn_xfer_data *xfer_data;
@@ -150,20 +170,28 @@
 	xfer_data = (struct msn_xfer_data *)xfer->data;
 	md        = (struct msn_data *)account->gc->proto_data;
 
-	if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) {
-		md->file_transfers = g_slist_remove(md->file_transfers, xfer);
+	md->file_transfers = g_slist_remove(md->file_transfers, xfer);
 
-		g_free(xfer_data);
-		xfer->data = NULL;
-	}
+	g_free(xfer_data);
+	xfer->data = NULL;
 }
 
 static size_t
 msn_xfer_read(char **buffer, struct gaim_xfer *xfer)
 {
+	struct msn_xfer_data *xfer_data;
 	unsigned char header[3];
 	size_t len, size;
 
+	xfer_data = (struct msn_xfer_data *)xfer->data;
+
+	if (xfer_data->do_cancel)
+	{
+		write(xfer->fd, "CCL\n", 4);
+
+		return 0;
+	}
+
 	if (read(xfer->fd, header, sizeof(header)) < 3) {
 		gaim_xfer_set_completed(xfer, TRUE);
 		return 0;
@@ -193,6 +221,31 @@
 static size_t
 msn_xfer_write(const char *buffer, size_t size, struct gaim_xfer *xfer)
 {
+	struct gaim_account *account;
+	struct msn_xfer_data *xfer_data;
+	struct msn_data *md;
+	unsigned char header[3];
+
+	xfer_data = (struct msn_xfer_data *)xfer->data;
+	account   = gaim_xfer_get_account(xfer);
+	md        = (struct msn_data *)account->gc->proto_data;
+
+	if (xfer_data->do_cancel)
+	{
+		header[0] = 1;
+		header[1] = 0;
+		header[2] = 0;
+
+		if (write(xfer->fd, header, sizeof(header)) < 3) {
+			gaim_xfer_cancel_remote(xfer);
+			return 0;
+		}
+	}
+	else
+	{
+		/* Not implemented yet. */
+	}
+
 	return 0;
 }
 
@@ -213,7 +266,7 @@
 				   (unsigned long)xfer_data->authcookie);
 
 		if (msn_write(source, sendbuf, strlen(sendbuf)) < 0) {
-			gaim_xfer_cancel(xfer); /* ? */
+			gaim_xfer_cancel_remote(xfer); /* ? */
 
 			return 0;
 		}
@@ -262,7 +315,7 @@
 	len = read(source, buf, sizeof(buf));
 
 	if (len <= 0) {
-		gaim_xfer_cancel(xfer);
+		gaim_xfer_cancel_remote(xfer);
 		return;
 	}
 
@@ -326,7 +379,7 @@
 		debug_printf("MSNFTP: Error establishing connection\n");
 		close(source);
 
-		gaim_xfer_cancel(xfer);
+		gaim_xfer_cancel_remote(xfer);
 
 		return;
 	}
@@ -334,7 +387,7 @@
 	g_snprintf(buf, sizeof(buf), "VER MSNFTP\r\n");
 
 	if (msn_write(source, buf, strlen(buf)) < 0) {
-		gaim_xfer_cancel(xfer);
+		gaim_xfer_cancel_remote(xfer);
 		return;
 	}
 
@@ -391,12 +444,13 @@
 		gaim_xfer_set_size(xfer, atoi(filesize_s));
 
 		/* Setup our I/O op functions */
-		gaim_xfer_set_init_fnc(xfer,   msn_xfer_init);
-		gaim_xfer_set_start_fnc(xfer,  msn_xfer_start);
-		gaim_xfer_set_end_fnc(xfer,    msn_xfer_end);
-		gaim_xfer_set_cancel_fnc(xfer, msn_xfer_cancel);
-		gaim_xfer_set_read_fnc(xfer,   msn_xfer_read);
-		gaim_xfer_set_write_fnc(xfer,  msn_xfer_write);
+		gaim_xfer_set_init_fnc(xfer,        msn_xfer_init);
+		gaim_xfer_set_start_fnc(xfer,       msn_xfer_start);
+		gaim_xfer_set_end_fnc(xfer,         msn_xfer_end);
+		gaim_xfer_set_cancel_send_fnc(xfer, msn_xfer_cancel_send);
+		gaim_xfer_set_cancel_recv_fnc(xfer, msn_xfer_cancel_recv);
+		gaim_xfer_set_read_fnc(xfer,        msn_xfer_read);
+		gaim_xfer_set_write_fnc(xfer,       msn_xfer_write);
 
 		/* Keep track of this transfer for later. */
 		md->file_transfers = g_slist_append(md->file_transfers, xfer);
@@ -452,7 +506,7 @@
 			if (proxy_connect(xfer->account, ip_s, atoi(port_s),
 							  msn_msnftp_connect, xfer) != 0) {
 
-				gaim_xfer_cancel(xfer);
+				gaim_xfer_cancel_remote(xfer);
 
 				return;
 			}