src/protocols/msn/ft.c

changeset 4675
8e0a7b537ca2
parent 4634
c4318fc60090
child 4793
1da93f6c80f3
--- 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;
 			}

mercurial