소스 검색

Bug 1691: With parallel background transfers, it is not possible to disable size calculation, which effectively prevented parallel transfers from working

https://winscp.net/tracker/1691

Source commit: e44d90c8fd31ed2cb265dc8bf07ebc81530c17ae
Martin Prikryl 7 년 전
부모
커밋
92d9b9620b
6개의 변경된 파일29개의 추가작업 그리고 15개의 파일을 삭제
  1. 1 1
      source/core/CopyParam.cpp
  2. 1 0
      source/core/CopyParam.h
  3. 14 9
      source/core/Terminal.cpp
  4. 10 5
      source/forms/Copy.cpp
  5. 1 0
      source/forms/Copy.h
  6. 2 0
      source/forms/CopyParams.cpp

+ 1 - 1
source/core/CopyParam.cpp

@@ -326,7 +326,7 @@ void __fastcall TCopyParamType::DoGetInfoStr(
   {
     if (DebugAlwaysTrue(!CalculateSize))
     {
-      ADD(LoadStr(COPY_INFO_DONT_CALCULATE_SIZE), cpaIncludeMaskOnly);
+      ADD(LoadStr(COPY_INFO_DONT_CALCULATE_SIZE), cpaIncludeMaskOnly | cpaNoCalculateSize);
       // Always false in scripting, in assembly controlled by use of FileTransferProgress
     }
   }

+ 1 - 0
source/core/CopyParam.h

@@ -26,6 +26,7 @@ const int cpaNoRemoveBOM        = 0x400;
 const int cpaNoPreserveTimeDirs = 0x800;
 const int cpaNoResumeSupport    = 0x1000;
 const int cpaNoEncryptNewFiles  = 0x2000;
+const int cpaNoCalculateSize    = 0x4000;
 //---------------------------------------------------------------------------
 struct TUsableCopyParamAttrs
 {

+ 14 - 9
source/core/Terminal.cpp

@@ -6664,22 +6664,25 @@ bool __fastcall TTerminal::CopyToRemote(
   {
     __int64 Size;
     std::unique_ptr<TStringList> Files;
-    if (CanParallel(CopyParam, Params, ParallelOperation) &&
-        !CopyParam->ClearArchive)
+    bool ACanParallel =
+      CanParallel(CopyParam, Params, ParallelOperation) &&
+      !CopyParam->ClearArchive;
+    if (ACanParallel)
     {
       Files.reset(new TStringList());
       Files->OwnsObjects = true;
     }
     bool CalculatedSize;
     if ((CopyParam->Size >= 0) &&
-        DebugAlwaysTrue(Files.get() == NULL)) // Size is set for sync only and we never use parallel transfer for sync
+        DebugAlwaysTrue(!ACanParallel)) // Size is set for sync only and we never use parallel transfer for sync
     {
       Size = CopyParam->Size;
       CalculatedSize = true;
     }
     else
     {
-      CalculatedSize = CalculateLocalFilesSize(FilesToCopy, Size, CopyParam, CopyParam->CalculateSize, Files.get(), NULL);
+      bool CalculateSize = ACanParallel || CopyParam->CalculateSize;
+      CalculatedSize = CalculateLocalFilesSize(FilesToCopy, Size, CopyParam, CalculateSize, Files.get(), NULL);
     }
 
     FLastProgressLogged = GetTickCount();
@@ -6709,7 +6712,7 @@ bool __fastcall TTerminal::CopyToRemote(
       BeginTransaction();
       try
       {
-        bool Parallel = CalculatedSize && (Files.get() != NULL);
+        bool Parallel = ACanParallel && CalculatedSize;
         LogTotalTransferDetails(TargetDir, CopyParam, &OperationProgress, Parallel, Files.get());
 
         if (Parallel)
@@ -7112,14 +7115,15 @@ bool __fastcall TTerminal::CopyToLocal(
     TFileOperationProgressType OperationProgress(&DoProgress, &DoFinished);
 
     std::unique_ptr<TStringList> Files;
-    if (CanParallel(CopyParam, Params, ParallelOperation))
+    bool ACanParallel = CanParallel(CopyParam, Params, ParallelOperation);
+    if (ACanParallel)
     {
       Files.reset(new TStringList());
       Files->OwnsObjects = true;
     }
 
     if ((CopyParam->Size >= 0) &&
-        DebugAlwaysTrue(Files.get() == NULL)) // Size is set for sync only and we never use parallel transfer for sync
+        DebugAlwaysTrue(!ACanParallel)) // Size is set for sync only and we never use parallel transfer for sync
     {
       TotalSize = CopyParam->Size;
       TotalSizeKnown = true;
@@ -7131,7 +7135,8 @@ bool __fastcall TTerminal::CopyToLocal(
       {
         TCalculateSizeStats Stats;
         Stats.FoundFiles = Files.get();
-        if (CalculateFilesSize(FilesToCopy, TotalSize, csIgnoreErrors, CopyParam, CopyParam->CalculateSize, Stats))
+        bool CalculateSize = ACanParallel || CopyParam->CalculateSize;
+        if (CalculateFilesSize(FilesToCopy, TotalSize, csIgnoreErrors, CopyParam, CalculateSize, Stats))
         {
           TotalSizeKnown = true;
         }
@@ -7166,7 +7171,7 @@ bool __fastcall TTerminal::CopyToLocal(
       {
         try
         {
-          bool Parallel = TotalSizeKnown && (Files.get() != NULL);
+          bool Parallel = ACanParallel && TotalSizeKnown;
           LogTotalTransferDetails(TargetDir, CopyParam, &OperationProgress, Parallel, Files.get());
 
           if (Parallel)

+ 10 - 5
source/forms/Copy.cpp

@@ -314,6 +314,11 @@ UnicodeString __fastcall TCopyDialog::GetDirectory()
   return Result;
 }
 //---------------------------------------------------------------------------
+int __fastcall TCopyDialog::ActualCopyParamAttrs()
+{
+  return FCopyParamAttrs | FLAGMASK(QueueCheck2->Checked && WinConfiguration->DefaultCopyParam.QueueParallel, cpaNoCalculateSize);
+}
+//---------------------------------------------------------------------------
 void __fastcall TCopyDialog::UpdateControls()
 {
   if (!FToRemote && FLAGSET(FOptions, coAllowRemoteTransfer))
@@ -329,7 +334,7 @@ void __fastcall TCopyDialog::UpdateControls()
     }
   }
 
-  UnicodeString InfoStr = FCopyParams.GetInfoStr(L"; ", FCopyParamAttrs);
+  UnicodeString InfoStr = FCopyParams.GetInfoStr(L"; ", ActualCopyParamAttrs());
   SetLabelHintPopup(CopyParamLabel, InfoStr);
 
   bool RemoteTransfer = FLAGSET(FOutputOptions, cooRemoteTransfer);
@@ -477,7 +482,7 @@ void __fastcall TCopyDialog::TransferSettingsButtonClick(TObject * /*Sender*/)
 void __fastcall TCopyDialog::GenerateCode()
 {
   TFilesSelected FilesSelected = FLAGSET(FOptions, coAllFiles) ? fsAll : fsList;
-  DoGenerateTransferCodeDialog(FToRemote, FMove, FCopyParamAttrs, FSessionData, FilesSelected, FFileList, Directory, Params);
+  DoGenerateTransferCodeDialog(FToRemote, FMove, ActualCopyParamAttrs(), FSessionData, FilesSelected, FFileList, Directory, Params);
 }
 //---------------------------------------------------------------------------
 void __fastcall TCopyDialog::CopyParamClick(TObject * Sender)
@@ -486,7 +491,7 @@ void __fastcall TCopyDialog::CopyParamClick(TObject * Sender)
   // so that they are preserved when assigning back later
   TGUICopyParamType Param = Params;
   bool PrevSaveSettings = FSaveSettings;
-  int Result = CopyParamListPopupClick(Sender, Param, FPreset, FCopyParamAttrs, &FSaveSettings);
+  int Result = CopyParamListPopupClick(Sender, Param, FPreset, ActualCopyParamAttrs(), &FSaveSettings);
   if (Result < 0)
   {
     if (DebugAlwaysTrue(Result == -cplGenerateCode))
@@ -521,7 +526,7 @@ void __fastcall TCopyDialog::CopyParamGroupClick(TObject * /*Sender*/)
 {
   if (CopyParamGroup->Enabled)
   {
-    if (DoCopyParamCustomDialog(FCopyParams, FCopyParamAttrs))
+    if (DoCopyParamCustomDialog(FCopyParams, ActualCopyParamAttrs()))
     {
       UpdateControls();
     }
@@ -546,7 +551,7 @@ void __fastcall TCopyDialog::CopyParamListPopup(TRect R, int AdditionalOptions)
           FLAGCLEAR(FOptions, coDisableSaveSettings) && !RemoteTransfer,
         cplSaveSettings) |
       FLAGMASK(FLAGCLEAR(FOutputOptions, cooRemoteTransfer) && FLAGCLEAR(FOptions, coTemp), cplGenerateCode),
-    FCopyParamAttrs,
+    ActualCopyParamAttrs(),
     FSaveSettings);
 }
 //---------------------------------------------------------------------------

+ 1 - 0
source/forms/Copy.h

@@ -75,6 +75,7 @@ protected:
   void __fastcall AdjustTransferControls();
   bool __fastcall RemotePaths();
   void __fastcall CopyParamListPopup(TRect R, int AdditionalOptions);
+  int __fastcall ActualCopyParamAttrs();
 public:
   __fastcall TCopyDialog(
     TComponent* Owner, bool ToRemote, bool Move, TStrings * FileList, int Options,

+ 2 - 0
source/forms/CopyParams.cpp

@@ -210,6 +210,8 @@ void __fastcall TCopyParamsFrame::UpdateControls()
     FLAGCLEAR(CopyParamAttrs, cpaNoPreserveTimeDirs) &&
     FLAGCLEAR(CopyParamAttrs, cpaIncludeMaskOnly) && Enabled &&
     PreserveTimeCheck->Checked);
+  EnableControl(CommonCalculateSizeCheck,
+    FLAGCLEAR(CopyParamAttrs, cpaNoCalculateSize) && FLAGCLEAR(CopyParamAttrs, cpaIncludeMaskOnly) && Enabled);
   EnableControl(ChangeCaseGroup, FLAGCLEAR(CopyParamAttrs, cpaIncludeMaskOnly) && Enabled);
   EnableControl(IgnorePermErrorsCheck,
     ((PreserveRightsCheck->Enabled && PreserveRightsCheck->Checked) ||