浏览代码

Bug 597: Bytes transferred are recorded in XML log and available in .NET assembly API + Bug fix: When size of a file downloaded with FTP protocol changes (or when ASCII mode is used) the logged size did not reflect the actual transfer size

https://winscp.net/tracker/597
(cherry picked from commit 3442fc2b6c1d860bed9b092d1550add9350dbf85)

Source commit: 06eea0dc71a88d9a4109cbf702e81232ea3e791d
Martin Prikryl 4 年之前
父节点
当前提交
63243511ec

+ 8 - 1
dotnet/TransferEventArgs.cs

@@ -1,4 +1,5 @@
-using System.Runtime.InteropServices;
+using System.Globalization;
+using System.Runtime.InteropServices;
 
 namespace WinSCP
 {
@@ -11,6 +12,8 @@ namespace WinSCP
 
         public string Destination { get; private set; }
 
+        public long Length { get; private set; }
+
         public TouchEventArgs Touch { get; internal set; }
         public ChmodEventArgs Chmod { get; internal set; }
         public RemovalEventArgs Removal { get; internal set; }
@@ -39,6 +42,10 @@ namespace WinSCP
                     {
                         args.Destination = value;
                     }
+                    else if (reader.GetEmptyElementValue("size", out value))
+                    {
+                        args.Length = long.Parse(value, CultureInfo.InvariantCulture);
+                    }
                     else if (SessionRemoteException.IsResult(reader))
                     {
                         args.Error = SessionRemoteException.ReadResult(reader);

+ 2 - 2
source/core/ScpFileSystem.cpp

@@ -1984,7 +1984,7 @@ void __fastcall TSCPFileSystem::SCPSource(const UnicodeString FileName,
         Rights);
     }
 
-    FTerminal->LogFileDone(OperationProgress, AbsoluteFileName);
+    FTerminal->LogFileDone(OperationProgress, AbsoluteFileName, Action);
     // Stream is disposed here
   }
 
@@ -2644,7 +2644,7 @@ void __fastcall TSCPFileSystem::SCPSink(const UnicodeString TargetDir,
             FILE_OPERATION_LOOP_END(FMTLOAD(CANT_SET_ATTRS, (DestFileName)));
           }
 
-          FTerminal->LogFileDone(OperationProgress, DestFileName);
+          FTerminal->LogFileDone(OperationProgress, DestFileName, Action);
         }
       }
     }

+ 21 - 2
source/core/SessionInfo.cpp

@@ -242,6 +242,11 @@ public:
     Parameter(L"destination", Destination);
   }
 
+  void Size(__int64 Size)
+  {
+    Parameter(L"size", Size);
+  }
+
   void __fastcall Rights(const TRights & Rights)
   {
     Parameter(L"permissions", Rights.Text);
@@ -558,14 +563,28 @@ void __fastcall TFileLocationSessionAction::Destination(const UnicodeString & De
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
+TTransferSessionAction::TTransferSessionAction(TActionLog * Log, TLogAction Action) :
+  TFileLocationSessionAction(Log, Action)
+{
+}
+//---------------------------------------------------------------------------
+void TTransferSessionAction::Size(__int64 Size)
+{
+  if (FRecord != NULL)
+  {
+    FRecord->Size(Size);
+  }
+}
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
 __fastcall TUploadSessionAction::TUploadSessionAction(TActionLog * Log) :
-  TFileLocationSessionAction(Log, laUpload)
+  TTransferSessionAction(Log, laUpload)
 {
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 __fastcall TDownloadSessionAction::TDownloadSessionAction(TActionLog * Log) :
-  TFileLocationSessionAction(Log, laDownload)
+  TTransferSessionAction(Log, laDownload)
 {
 }
 //---------------------------------------------------------------------------

+ 10 - 2
source/core/SessionInfo.h

@@ -132,13 +132,21 @@ public:
   void __fastcall Destination(const UnicodeString & Destination);
 };
 //---------------------------------------------------------------------------
-class TUploadSessionAction : public TFileLocationSessionAction
+class TTransferSessionAction : public TFileLocationSessionAction
+{
+public:
+  TTransferSessionAction(TActionLog * Log, TLogAction Action);
+
+  void Size(__int64 Size);
+};
+//---------------------------------------------------------------------------
+class TUploadSessionAction : public TTransferSessionAction
 {
 public:
   __fastcall TUploadSessionAction(TActionLog * Log);
 };
 //---------------------------------------------------------------------------
-class TDownloadSessionAction : public TFileLocationSessionAction
+class TDownloadSessionAction : public TTransferSessionAction
 {
 public:
   __fastcall TDownloadSessionAction(TActionLog * Log);

+ 9 - 4
source/core/Terminal.cpp

@@ -3477,7 +3477,9 @@ void __fastcall TTerminal::LogFileDetails(const UnicodeString & FileName, TDateT
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TTerminal::LogFileDone(TFileOperationProgressType * OperationProgress, const UnicodeString & DestFileName)
+void __fastcall TTerminal::LogFileDone(
+  TFileOperationProgressType * OperationProgress, const UnicodeString & DestFileName,
+  TTransferSessionAction & Action)
 {
   if (FDestFileName.IsEmpty())
   {
@@ -3488,11 +3490,14 @@ void __fastcall TTerminal::LogFileDone(TFileOperationProgressType * OperationPro
     FMultipleDestinationFiles = true;
   }
 
+  __int64 Size = OperationProgress->TransferredSize;
   // optimization
   if (Log->Logging)
   {
-    LogEvent(FORMAT("Transfer done: '%s' => '%s' [%s]", (OperationProgress->FullFileName, DestFileName, IntToStr(OperationProgress->TransferredSize))));
+    LogEvent(FORMAT("Transfer done: '%s' => '%s' [%s]", (OperationProgress->FullFileName, DestFileName, IntToStr(Size))));
   }
+
+  Action.Size(Size);
 }
 //---------------------------------------------------------------------------
 void __fastcall TTerminal::CustomReadDirectory(TRemoteFileList * FileList)
@@ -7323,7 +7328,7 @@ void __fastcall TTerminal::Source(
     FFileSystem->Source(
       Handle, TargetDir, DestFileName, CopyParam, Params, OperationProgress, Flags, Action, ChildError);
 
-    LogFileDone(OperationProgress, AbsolutePath(TargetDir + DestFileName, true));
+    LogFileDone(OperationProgress, AbsolutePath(TargetDir + DestFileName, true), Action);
     OperationProgress->Succeeded();
   }
 
@@ -7734,7 +7739,7 @@ void __fastcall TTerminal::Sink(
     FFileSystem->Sink(
       FileName, File, TargetDir, DestFileName, Attrs, CopyParam, Params, OperationProgress, Flags, Action);
 
-    LogFileDone(OperationProgress, LogFileName);
+    LogFileDone(OperationProgress, LogFileName, Action);
     OperationProgress->Succeeded();
   }
 }

+ 3 - 1
source/core/Terminal.h

@@ -428,7 +428,9 @@ protected:
   UnicodeString __fastcall FormatFileDetailsForLog(
     const UnicodeString & FileName, TDateTime Modification, __int64 Size, const TRemoteFile * LinkedFile = NULL);
   void __fastcall LogFileDetails(const UnicodeString & FileName, TDateTime Modification, __int64 Size, const TRemoteFile * LinkedFile = NULL);
-  void __fastcall LogFileDone(TFileOperationProgressType * OperationProgress, const UnicodeString & DestFileName);
+  void __fastcall LogFileDone(
+    TFileOperationProgressType * OperationProgress, const UnicodeString & DestFileName,
+    TTransferSessionAction & Action);
   void __fastcall LogTotalTransferDetails(
     const UnicodeString TargetDir, const TCopyParamType * CopyParam,
     TFileOperationProgressType * OperationProgress, bool Parallel, TStrings * Files);

+ 3 - 3
source/filezilla/TransferSocket.cpp

@@ -235,7 +235,7 @@ void CTransferSocket::OnReceive(int nErrorCode)
         CloseAndEnsureSendClose(CSMODE_TRANSFERERROR);
       }
 
-      UpdateStatusBar(false);
+      UpdateStatusBar(true);
       return;
     }
 
@@ -658,7 +658,7 @@ void CTransferSocket::OnSend(int nErrorCode)
           LogError(nError);
           CloseOnShutDownOrError(CSMODE_TRANSFERERROR);
         }
-        UpdateStatusBar(false);
+        UpdateStatusBar(true);
         return;
       }
 
@@ -773,7 +773,7 @@ void CTransferSocket::OnSend(int nErrorCode)
           LogError(nError);
           CloseOnShutDownOrError(CSMODE_TRANSFERERROR);
         }
-        UpdateStatusBar(false);
+        UpdateStatusBar(true);
         return;
       }
       else