/pidgin/main: 68004413f6e7: Initial fix of file transfer by remo...

Michael McConville <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 68004413f6e7a5e8b7f39fea11ada10eef6bae31
Author:	 Michael McConville <[email protected]>
Date:	 2015-07-23 17:16 -0400
Branch:	 default
URL: https://hg.pidgin.im/pidgin/main/rev/68004413f6e7

Description:

Initial fix of file transfer by removing extra calls to purple_xfer_set_bytes_sent() and purple_xfer_set_completed(). Also, remove needless member bytes_remaining from PurpleXferPrivate. Works reliably for me on XMPP. However, the redundant purple_xfer_set_completed() calls may be relied upon by other protocols. This needs to be tested. Ok'd by elb. Refs #16001

diffstat:

 libpurple/xfer.c |  44 +++++++++++++++++++++-----------------------
 1 files changed, 21 insertions(+), 23 deletions(-)

diffs (127 lines):

diff --git a/libpurple/xfer.c b/libpurple/xfer.c
--- a/libpurple/xfer.c
+++ b/libpurple/xfer.c
@@ -69,7 +69,6 @@ struct _PurpleXferPrivate {
 	int watcher;                 /* Watcher.                            */
 
 	goffset bytes_sent;          /* The number of bytes sent.           */
-	goffset bytes_remaining;     /* The number of bytes remaining.      */
 	time_t start_time;           /* When the transfer of data began.    */
 	time_t end_time;             /* When the transfer of data ended.    */
 
@@ -825,7 +824,7 @@ purple_xfer_get_bytes_remaining(const Pu
 
 	g_return_val_if_fail(priv != NULL, 0);
 
-	return priv->bytes_remaining;
+	return priv->size - priv->bytes_sent;
 }
 
 goffset
@@ -1028,7 +1027,6 @@ purple_xfer_set_size(PurpleXfer *xfer, g
 	g_return_if_fail(priv != NULL);
 
 	priv->size = size;
-	priv->bytes_remaining = priv->size - purple_xfer_get_bytes_sent(xfer);
 
 	g_object_notify_by_pspec(G_OBJECT(xfer), properties[PROP_FILE_SIZE]);
 }
@@ -1054,9 +1052,6 @@ purple_xfer_set_bytes_sent(PurpleXfer *x
 
 	priv->bytes_sent = bytes_sent;
 
-	if (purple_xfer_get_size(xfer) > 0)
-		priv->bytes_remaining = purple_xfer_get_size(xfer) - bytes_sent;
-
 	g_object_notify_by_pspec(G_OBJECT(xfer), properties[PROP_BYTES_SENT]);
 }
 
@@ -1229,10 +1224,6 @@ purple_xfer_write(PurpleXfer *xfer, cons
 		if (r < 0 && errno == EAGAIN)
 			r = 0;
 	}
-	if (r >= 0 && (purple_xfer_get_bytes_sent(xfer)+r) >= purple_xfer_get_size(xfer) &&
-		!purple_xfer_is_completed(xfer))
-		purple_xfer_set_completed(xfer, TRUE);
-	
 
 	return r;
 }
@@ -1355,9 +1346,6 @@ do_transfer(PurpleXfer *xfer)
 				return;
 			}
 
-			if ((purple_xfer_get_size(xfer) > 0) &&
-				((purple_xfer_get_bytes_sent(xfer)+r) >= purple_xfer_get_size(xfer)))
-				purple_xfer_set_completed(xfer, TRUE);
 		} else if(r < 0) {
 			purple_xfer_cancel_remote(xfer);
 			g_free(buffer);
@@ -1450,8 +1438,6 @@ do_transfer(PurpleXfer *xfer)
 	}
 
 	if (r > 0) {
-		purple_xfer_set_bytes_sent(xfer, priv->bytes_sent + r);
-
 		if (priv->ops.ack != NULL)
 			priv->ops.ack(xfer, buffer, r);
 
@@ -1462,8 +1448,17 @@ do_transfer(PurpleXfer *xfer)
 				purple_xfer_get_progress(xfer));
 	}
 
-	if (purple_xfer_is_completed(xfer))
+	if (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer) &&
+			!purple_xfer_is_completed(xfer)) {
+		purple_xfer_set_completed(xfer, TRUE);
+	}
+
+	/* TODO: Check if above is the only place xfers are marked completed.
+	 *       If so, merge these conditions.
+	 */
+	if (purple_xfer_is_completed(xfer)) {
 		purple_xfer_end(xfer);
+	}
 }
 
 static void
@@ -1673,11 +1668,18 @@ purple_xfer_end(PurpleXfer *xfer)
 		purple_xfer_set_watcher(xfer, 0);
 	}
 
-	if (priv->fd != -1)
-		close(priv->fd);
+	if (priv->fd != -1) {
+		if (close(priv->fd)) {
+			purple_debug_error("xfer", "closing file descr in purple_xfer_end() failed: %s",
+					g_strerror(errno));
+		}
+	}
 
 	if (priv->dest_fp != NULL) {
-		fclose(priv->dest_fp);
+		if (fclose(priv->dest_fp)) {
+			purple_debug_error("xfer", "closing dest file in purple_xfer_end() failed: %s",
+					g_strerror(errno));
+		}
 		priv->dest_fp = NULL;
 	}
 
@@ -1766,8 +1768,6 @@ purple_xfer_cancel_local(PurpleXfer *xfe
 	if (ui_ops != NULL && ui_ops->cancel_local != NULL)
 		ui_ops->cancel_local(xfer);
 
-	priv->bytes_remaining = 0;
-
 	g_object_unref(xfer);
 }
 
@@ -1834,8 +1834,6 @@ purple_xfer_cancel_remote(PurpleXfer *xf
 	if (ui_ops != NULL && ui_ops->cancel_remote != NULL)
 		ui_ops->cancel_remote(xfer);
 
-	priv->bytes_remaining = 0;
-
 	g_object_unref(xfer);
 }
 

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.