diff src/ft.c @ 4150:1bd663beada5

[gaim-migrate @ 4369] potato chip file receive in msn committer: Tailor Script <tailor@pidgin.im>
author Rob Flynn <gaim@robflynn.com>
date Sat, 28 Dec 2002 05:15:43 +0000
parents a20bf3d247ff
children d3c8d2b40494
line wrap: on
line diff
--- a/src/ft.c	Sat Dec 28 05:12:03 2002 +0000
+++ b/src/ft.c	Sat Dec 28 05:15:43 2002 +0000
@@ -571,35 +571,50 @@
 {
 	struct file_transfer *xfer = (struct file_transfer *)data;
 	int rt, i;
-	char buf[FT_BUFFER_SIZE];
+	char *buf = NULL;
 
 	if (condition & GAIM_INPUT_READ) {
-		rt = read(xfer->fd, buf, MIN(xfer->bytesleft, FT_BUFFER_SIZE));
+		if (xfer->gc->prpl->file_transfer_read)
+			rt = xfer->gc->prpl->file_transfer_read(xfer->gc, xfer,
+													xfer->fd, &buf);
+		else {
+			buf = g_new0(char, MIN(xfer->bytesleft, FT_BUFFER_SIZE));
+			rt = read(xfer->fd, buf, MIN(xfer->bytesleft, FT_BUFFER_SIZE));
+		}
+
 		/* XXX What if the transfer is interrupted while we
 		 * are inside read()?  How can this be handled safely?
 		 * -- wtm
 		 */
 		if (rt > 0) {
 			xfer->bytesleft -= rt;
-			for (i = 0; i < rt; i++) {
-				fprintf(xfer->file, "%c", buf[i]);
-			}
+			fwrite(buf, 1, rt, xfer->file);
 		}
 
 	}
 	else /* (condition & GAIM_INPUT_WRITE) */ {
 		int remain = MIN(xfer->bytesleft, FT_BUFFER_SIZE);
 
-		for (i = 0; i < remain; i++)
-			fscanf(xfer->file, "%c", &buf[i]);
+		buf = g_new0(char, remain);
+
+		fread(buf, 1, remain, xfer->file);
 
-		rt = write(xfer->fd, buf, remain);
+		if (xfer->gc->prpl->file_transfer_write)
+			rt = xfer->gc->prpl->file_transfer_write(xfer->gc, xfer, xfer->fd,
+													 buf, remain);
+		else
+			rt = write(xfer->fd, buf, remain);
+
 		if (rt > 0)
 			xfer->bytesleft -= rt;
 	}
 
-	if (rt < 0)
+	if (rt < 0) {
+		if (buf != NULL)
+			g_free(buf);
+
 		return;
+	}
 
 	xfer->bytessent += rt;
 
@@ -614,6 +629,9 @@
 		xfer->file = 0;
 		ft_nextfile(xfer);
 	}
+
+	if (buf != NULL)
+		g_free(buf);
 }
 
 static void ft_nextfile(struct file_transfer *xfer)