changeset 862:885038cb945b

2006-11-30 Brian Masney <masneyb@gftp.org> * lib/gftp.h src/uicommon/gftpui.c - when a file transfer is restarted, get the file size of the destination file. This is so that the file is restarted at the proper position (closes #160239). (_gftpui_common_do_transfer_file) - split this function into a smaller function: _do_transfer_block(). * src/gtk/transfer.c - removed debugging statement
author masneyb
date Sat, 23 Dec 2006 16:12:21 +0000
parents 5aae5b877544
children 9f10d3c835cb
files ChangeLog lib/gftp.h src/gtk/transfer.c src/uicommon/gftpui.c
diffstat 4 files changed, 70 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sat Dec 23 15:56:22 2006 +0000
+++ b/ChangeLog	Sat Dec 23 16:12:21 2006 +0000
@@ -1,4 +1,12 @@
 2006-11-30 Brian Masney <masneyb@gftp.org>
+	* lib/gftp.h src/uicommon/gftpui.c - when a file transfer is restarted,
+	get the file size of the destination file. This is so that the file is 
+	restarted at the proper position (closes #160239). 
+	(_gftpui_common_do_transfer_file) - split this function into a smaller
+	function: _do_transfer_block().
+
+	* src/gtk/transfer.c - removed debugging statement
+
 	* lib/rfc959.c lib/sshv2.c src/uicommon/gftpui.c - don't abort the
 	entire file transfer if there is a permission denied at some point
 	during the file transfer. Give the user an error at the very end if
@@ -3745,7 +3753,7 @@
 
 	* cvsclean - added this script
 
-	* *.[ch] - added $Id: ChangeLog,v 1.505 2006/12/01 00:57:49 masneyb Exp $ tags
+	* *.[ch] - added $Id: ChangeLog,v 1.506 2006/12/23 16:12:17 masneyb Exp $ tags
 
 	* debian/* - updated files from Debian maintainer
 
--- a/lib/gftp.h	Sat Dec 23 15:56:22 2006 +0000
+++ b/lib/gftp.h	Sat Dec 23 16:12:21 2006 +0000
@@ -256,6 +256,7 @@
                done_edit : 1,	/* Edit the file when done transfering? */
                done_rm : 1,	/* Remove the file when done */
                transfer_done : 1, /* Is current file transfer done? */
+               retry_transfer : 1, /* Is current file transfer done? */
                is_fd : 1,	/* Is this a file descriptor? */
                exists_other_side; /* The file exists on the other side during
                                      the file transfer */
--- a/src/gtk/transfer.c	Sat Dec 23 15:56:22 2006 +0000
+++ b/src/gtk/transfer.c	Sat Dec 23 16:12:21 2006 +0000
@@ -442,7 +442,6 @@
   gftpui_common_child_process_done = 0;
   while ((pid = waitpid (-1, &ret, WNOHANG)) > 0)
     {
-printf ("FIXME - PID %d returned %d\n", pid, ret);
       do_check_done_process (pid, ret);
     }
 }
--- a/src/uicommon/gftpui.c	Sat Dec 23 15:56:22 2006 +0000
+++ b/src/uicommon/gftpui.c	Sat Dec 23 16:12:21 2006 +0000
@@ -1280,13 +1280,41 @@
 }
 
 
+static ssize_t
+_do_transfer_block (gftp_transfer * tdata, gftp_file * curfle, char *buf,
+                    size_t trans_blksize)
+{
+  ssize_t num_read, num_wrote, ret;
+  char *bufpos;
+
+  num_read = gftp_get_next_file_chunk (tdata->fromreq, buf, trans_blksize);
+  if (num_read < 0)
+    return (num_read);
+
+  bufpos = buf;
+  num_wrote = 0;
+  while (num_wrote < num_read)
+    {
+      if ((ret = gftp_put_next_file_chunk (tdata->toreq, bufpos,
+                                           num_read - num_wrote)) <= 0)
+        return (ret);
+
+      num_wrote += ret;
+      bufpos += ret;
+    }
+
+  return (num_read);
+}
+
+
 int
 _gftpui_common_do_transfer_file (gftp_transfer * tdata, gftp_file * curfle)
 {
   struct timeval updatetime;
   intptr_t trans_blksize;
-  ssize_t num_read, ret;
-  char *buf, *bufpos;
+  ssize_t num_trans;
+  char *buf;
+  int ret;
 
   gftp_lookup_request_option (tdata->fromreq, "trans_blksize", &trans_blksize);
   buf = g_malloc (trans_blksize);
@@ -1294,41 +1322,31 @@
   memset (&updatetime, 0, sizeof (updatetime));
   gftpui_start_current_file_in_transfer (tdata);
 
-  num_read = 0;
+  num_trans = 0;
   while (!tdata->cancel &&
-         (num_read = gftp_get_next_file_chunk (tdata->fromreq, buf,
-                                               trans_blksize)) > 0)
+         (num_trans = _do_transfer_block (tdata, curfle, buf,
+                                          trans_blksize)) > 0)
     {
-      gftp_calc_kbs (tdata, num_read);
+      gftp_calc_kbs (tdata, num_trans);
+
       if (tdata->lasttime.tv_sec - updatetime.tv_sec >= 1 ||
           tdata->curtrans >= tdata->tot_file_trans)
         {
           gftpui_update_current_file_in_transfer (tdata);
           memcpy (&updatetime, &tdata->lasttime, sizeof (updatetime));
-        }
 
-      bufpos = buf;
-      while (num_read > 0)
-        {
-          if ((ret = gftp_put_next_file_chunk (tdata->toreq, bufpos,
-                                               num_read)) <= 0)
-            {
-              num_read = ret;
-              break;
-            }
-
-          num_read -= ret;
-          bufpos += ret;
+          if (tdata->current_file_retries > 0)
+            tdata->current_file_retries = 0;
         }
     }
 
-  if (num_read == GFTP_ENOTRANS)
-    num_read = 0;
+  if (num_trans == GFTP_ENOTRANS)
+    num_trans = 0;
 
   g_free (buf);
   gftpui_finish_current_file_in_transfer (tdata);
 
-  if ((int) num_read == 0)
+  if ((int) num_trans == 0)
     {
       if ((ret = gftp_end_transfer (tdata->fromreq)) < 0)
         return (ret);
@@ -1344,7 +1362,7 @@
       return (0);
     }
   else
-    return ((int) num_read);
+    return ((int) num_trans);
 }
 
 
@@ -1463,7 +1481,8 @@
 _gftpui_common_trans_file_or_dir (gftp_transfer * tdata)
 {
   int tofd, fromfd, ret;
-  gftp_file * curfle; 
+  gftp_file * curfle;
+  off_t fsize;
 
   if (g_thread_supported ())
     g_static_mutex_lock (&tdata->structmutex);
@@ -1489,10 +1508,7 @@
   if (S_ISDIR (curfle->st_mode))
     {
       tdata->tot_file_trans = 0;
-      if (tdata->toreq->mkdir != NULL)
-        ret = tdata->toreq->mkdir (tdata->toreq, curfle->destfile);
-      else
-        ret = GFTP_EFATAL;
+      ret = gftp_make_directory (tdata->toreq, curfle->destfile);
     }
   else
     {
@@ -1501,12 +1517,20 @@
       if (curfle->size == 0)
         {
           curfle->size = gftp_get_file_size (tdata->fromreq, curfle->file);
-          if (!GFTP_IS_CONNECTED (tdata->fromreq))
-            return (curfle->size);
+          if (curfle->size < 0)
+            return ((int) curfle->size);
 
           tdata->total_bytes += curfle->size;
         }
 
+      if (curfle->retry_transfer)
+        {
+          curfle->transfer_action = GFTP_TRANS_ACTION_RESUME;
+          curfle->startsize = gftp_get_file_size (tdata->toreq, curfle->destfile);
+          if (curfle->startsize < 0)
+            return ((int) curfle->startsize);
+        }
+
       tdata->tot_file_trans = gftp_transfer_file (tdata->fromreq, curfle->file,
                                                   fromfd,
                                                   curfle->transfer_action == GFTP_TRANS_ACTION_RESUME ?
@@ -1540,9 +1564,12 @@
         ret = _gftpui_common_preserve_perm_time (tdata, curfle);
     }
   else
-    tdata->fromreq->logging_function (gftp_logging_error, tdata->fromreq,
-                                      _("Could not download %s from %s\n"),
-                                      curfle->file, tdata->fromreq->hostname);
+    {
+      curfle->retry_transfer = 1;
+      tdata->fromreq->logging_function (gftp_logging_error, tdata->fromreq,
+                                        _("Could not download %s from %s\n"),
+                                        curfle->file, tdata->fromreq->hostname);
+    }
 
   return (ret);
 }