Bläddra i källkod

Bug fix: When using a local custom command from Synchronization checklist window, opened from a command-line, the connection was closed

Fixed by refactoring that removes gross long standing hack.

Source commit: a8c3ef29226e6c762910f7824a68fef9aedd70cc
Martin Prikryl 6 år sedan
förälder
incheckning
ebc5784505

+ 5 - 0
source/core/CopyParam.cpp

@@ -58,6 +58,7 @@ void __fastcall TCopyParamType::Default()
   ExcludeHiddenFiles = false;
   ExcludeHiddenFiles = false;
   ExcludeEmptyDirectories = false;
   ExcludeEmptyDirectories = false;
   Size = -1;
   Size = -1;
+  OnceDoneOperation = odoIdle;
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 UnicodeString __fastcall TCopyParamType::GetInfoStr(
 UnicodeString __fastcall TCopyParamType::GetInfoStr(
@@ -574,6 +575,7 @@ void __fastcall TCopyParamType::Assign(const TCopyParamType * Source)
   COPY(ExcludeHiddenFiles);
   COPY(ExcludeHiddenFiles);
   COPY(ExcludeEmptyDirectories);
   COPY(ExcludeEmptyDirectories);
   COPY(Size);
   COPY(Size);
+  COPY(OnceDoneOperation);
   #undef COPY
   #undef COPY
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -898,6 +900,7 @@ void __fastcall TCopyParamType::Load(THierarchicalStorage * Storage)
   ExcludeHiddenFiles = Storage->ReadBool(L"ExcludeHiddenFiles", ExcludeHiddenFiles);
   ExcludeHiddenFiles = Storage->ReadBool(L"ExcludeHiddenFiles", ExcludeHiddenFiles);
   ExcludeEmptyDirectories = Storage->ReadBool(L"ExcludeEmptyDirectories", ExcludeEmptyDirectories);
   ExcludeEmptyDirectories = Storage->ReadBool(L"ExcludeEmptyDirectories", ExcludeEmptyDirectories);
   Size = -1;
   Size = -1;
+  OnceDoneOperation = odoIdle;
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 void __fastcall TCopyParamType::Save(THierarchicalStorage * Storage, const TCopyParamType * Defaults) const
 void __fastcall TCopyParamType::Save(THierarchicalStorage * Storage, const TCopyParamType * Defaults) const
@@ -945,6 +948,7 @@ void __fastcall TCopyParamType::Save(THierarchicalStorage * Storage, const TCopy
   WRITE_DATA(Bool, ExcludeHiddenFiles);
   WRITE_DATA(Bool, ExcludeHiddenFiles);
   WRITE_DATA(Bool, ExcludeEmptyDirectories);
   WRITE_DATA(Bool, ExcludeEmptyDirectories);
   DebugAssert(Size < 0);
   DebugAssert(Size < 0);
+  DebugAssert(OnceDoneOperation == odoIdle);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 #define C(Property) (Property == rhp.Property)
 #define C(Property) (Property == rhp.Property)
@@ -980,6 +984,7 @@ bool __fastcall TCopyParamType::operator==(const TCopyParamType & rhp) const
     C(ExcludeHiddenFiles) &&
     C(ExcludeHiddenFiles) &&
     C(ExcludeEmptyDirectories) &&
     C(ExcludeEmptyDirectories) &&
     C(Size) &&
     C(Size) &&
+    C(OnceDoneOperation) &&
     true;
     true;
 }
 }
 #undef C
 #undef C

+ 3 - 0
source/core/CopyParam.h

@@ -4,6 +4,7 @@
 
 
 #include "FileMasks.h"
 #include "FileMasks.h"
 #include "RemoteFiles.h"
 #include "RemoteFiles.h"
+#include "Exceptions.h"
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 // When adding new options, mind TCopyParamType::GetLogStr()
 // When adding new options, mind TCopyParamType::GetLogStr()
 enum TOperationSide { osLocal, osRemote, osCurrent };
 enum TOperationSide { osLocal, osRemote, osCurrent };
@@ -68,6 +69,7 @@ private:
   bool FExcludeHiddenFiles;
   bool FExcludeHiddenFiles;
   bool FExcludeEmptyDirectories;
   bool FExcludeEmptyDirectories;
   __int64 FSize;
   __int64 FSize;
+  TOnceDoneOperation FOnceDoneOperation;
   static const wchar_t TokenPrefix = L'%';
   static const wchar_t TokenPrefix = L'%';
   static const wchar_t NoReplacement = wchar_t(false);
   static const wchar_t NoReplacement = wchar_t(false);
   static const wchar_t TokenReplacement = wchar_t(true);
   static const wchar_t TokenReplacement = wchar_t(true);
@@ -143,6 +145,7 @@ public:
   __property bool ExcludeHiddenFiles = { read = FExcludeHiddenFiles, write = FExcludeHiddenFiles };
   __property bool ExcludeHiddenFiles = { read = FExcludeHiddenFiles, write = FExcludeHiddenFiles };
   __property bool ExcludeEmptyDirectories = { read = FExcludeEmptyDirectories, write = FExcludeEmptyDirectories };
   __property bool ExcludeEmptyDirectories = { read = FExcludeEmptyDirectories, write = FExcludeEmptyDirectories };
   __property __int64 Size = { read = FSize, write = FSize };
   __property __int64 Size = { read = FSize, write = FSize };
+  __property TOnceDoneOperation OnceDoneOperation = { read = FOnceDoneOperation, write = FOnceDoneOperation };
 };
 };
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 unsigned long __fastcall GetSpeedLimit(const UnicodeString & Text);
 unsigned long __fastcall GetSpeedLimit(const UnicodeString & Text);

+ 3 - 2
source/core/FileOperationProgress.cpp

@@ -150,12 +150,12 @@ void __fastcall TFileOperationProgressType::ClearTransfer()
 void __fastcall TFileOperationProgressType::Start(TFileOperation AOperation,
 void __fastcall TFileOperationProgressType::Start(TFileOperation AOperation,
   TOperationSide ASide, int ACount)
   TOperationSide ASide, int ACount)
 {
 {
-  Start(AOperation, ASide, ACount, false, L"", 0);
+  Start(AOperation, ASide, ACount, false, L"", 0, odoIdle);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 void __fastcall TFileOperationProgressType::Start(TFileOperation AOperation,
 void __fastcall TFileOperationProgressType::Start(TFileOperation AOperation,
   TOperationSide ASide, int ACount, bool ATemp,
   TOperationSide ASide, int ACount, bool ATemp,
-  const UnicodeString ADirectory, unsigned long ACPSLimit)
+  const UnicodeString ADirectory, unsigned long ACPSLimit, TOnceDoneOperation InitialOnceDoneOperation)
 {
 {
 
 
   {
   {
@@ -169,6 +169,7 @@ void __fastcall TFileOperationProgressType::Start(TFileOperation AOperation,
     FCancel = csContinue;
     FCancel = csContinue;
     FDirectory = ADirectory;
     FDirectory = ADirectory;
     FTemp = ATemp;
     FTemp = ATemp;
+    FInitialOnceDoneOperation = InitialOnceDoneOperation;
     FPersistence.CPSLimit = ACPSLimit;
     FPersistence.CPSLimit = ACPSLimit;
   }
   }
 
 

+ 3 - 1
source/core/FileOperationProgress.h

@@ -95,6 +95,7 @@ private:
   bool FReset;
   bool FReset;
   unsigned int FLastSecond;
   unsigned int FLastSecond;
   unsigned long FRemainingCPS;
   unsigned long FRemainingCPS;
+  TOnceDoneOperation FInitialOnceDoneOperation;
   TPersistence FPersistence;
   TPersistence FPersistence;
   TCriticalSection * FSection;
   TCriticalSection * FSection;
   TCriticalSection * FUserSelectionsSection;
   TCriticalSection * FUserSelectionsSection;
@@ -152,6 +153,7 @@ public:
   __property __int64 OperationTransferred = { read = GetOperationTransferred };
   __property __int64 OperationTransferred = { read = GetOperationTransferred };
   __property __int64 TotalSize = { read = GetTotalSize };
   __property __int64 TotalSize = { read = GetTotalSize };
   __property int FilesFinishedSuccessfully = { read = FFilesFinishedSuccessfully };
   __property int FilesFinishedSuccessfully = { read = FFilesFinishedSuccessfully };
+  __property TOnceDoneOperation InitialOnceDoneOperation = { read = FInitialOnceDoneOperation };
 
 
   __property TBatchOverwrite BatchOverwrite = { read = GetBatchOverwrite };
   __property TBatchOverwrite BatchOverwrite = { read = GetBatchOverwrite };
   __property bool SkipToAll = { read = GetSkipToAll };
   __property bool SkipToAll = { read = GetSkipToAll };
@@ -198,7 +200,7 @@ public:
   void __fastcall Start(TFileOperation AOperation, TOperationSide ASide, int ACount);
   void __fastcall Start(TFileOperation AOperation, TOperationSide ASide, int ACount);
   void __fastcall Start(TFileOperation AOperation,
   void __fastcall Start(TFileOperation AOperation,
     TOperationSide ASide, int ACount, bool ATemp, const UnicodeString ADirectory,
     TOperationSide ASide, int ACount, bool ATemp, const UnicodeString ADirectory,
-    unsigned long ACPSLimit);
+    unsigned long ACPSLimit, TOnceDoneOperation InitialOnceDoneOperation);
   void __fastcall Stop();
   void __fastcall Stop();
   void __fastcall SetDone();
   void __fastcall SetDone();
   void __fastcall Suspend();
   void __fastcall Suspend();

+ 1 - 1
source/core/Queue.cpp

@@ -2276,7 +2276,7 @@ void __fastcall TParallelTransferQueueItem::DoExecute(TTerminal * Terminal)
   OperationProgress.Start(
   OperationProgress.Start(
     // CPS limit inherited from parent OperationProgress.
     // CPS limit inherited from parent OperationProgress.
     // Count not known and won't be needed as we will always have TotalSize as  we always transfer a single file at a time.
     // Count not known and won't be needed as we will always have TotalSize as  we always transfer a single file at a time.
-    Operation, FParallelOperation->Side, -1, Temp, FParallelOperation->TargetDir, 0);
+    Operation, FParallelOperation->Side, -1, Temp, FParallelOperation->TargetDir, 0, odoIdle);
 
 
   try
   try
   {
   {

+ 5 - 5
source/core/Terminal.cpp

@@ -3711,18 +3711,18 @@ void __fastcall TTerminal::OperationFinish(
 void __fastcall TTerminal::OperationStart(
 void __fastcall TTerminal::OperationStart(
   TFileOperationProgressType & Progress, TFileOperation Operation, TOperationSide Side, int Count)
   TFileOperationProgressType & Progress, TFileOperation Operation, TOperationSide Side, int Count)
 {
 {
-  OperationStart(Progress, Operation, Side, Count, false, UnicodeString(), 0);
+  OperationStart(Progress, Operation, Side, Count, false, UnicodeString(), 0, odoIdle);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 void __fastcall TTerminal::OperationStart(
 void __fastcall TTerminal::OperationStart(
   TFileOperationProgressType & Progress, TFileOperation Operation, TOperationSide Side, int Count,
   TFileOperationProgressType & Progress, TFileOperation Operation, TOperationSide Side, int Count,
-  bool Temp, const UnicodeString & Directory, unsigned long CPSLimit)
+  bool Temp, const UnicodeString & Directory, unsigned long CPSLimit, TOnceDoneOperation OnceDoneOperation)
 {
 {
   if (FOperationProgressPersistence != NULL)
   if (FOperationProgressPersistence != NULL)
   {
   {
     Progress.Restore(*FOperationProgressPersistence);
     Progress.Restore(*FOperationProgressPersistence);
   }
   }
-  Progress.Start(Operation, Side, Count, Temp, Directory, CPSLimit);
+  Progress.Start(Operation, Side, Count, Temp, Directory, CPSLimit, OnceDoneOperation);
   DebugAssert(FOperationProgress == NULL);
   DebugAssert(FOperationProgress == NULL);
   FOperationProgress = &Progress;
   FOperationProgress = &Progress;
 }
 }
@@ -6735,7 +6735,7 @@ bool __fastcall TTerminal::CopyToRemote(
     TFileOperationProgressType OperationProgress(&DoProgress, &DoFinished);
     TFileOperationProgressType OperationProgress(&DoProgress, &DoFinished);
     OperationStart(
     OperationStart(
       OperationProgress, (Params & cpDelete ? foMove : foCopy), osLocal,
       OperationProgress, (Params & cpDelete ? foMove : foCopy), osLocal,
-      FilesToCopy->Count, Params & cpTemporary, TargetDir, CopyParam->CPSLimit);
+      FilesToCopy->Count, Params & cpTemporary, TargetDir, CopyParam->CPSLimit, CopyParam->OnceDoneOperation);
 
 
     bool CollectingUsage = false;
     bool CollectingUsage = false;
     try
     try
@@ -7191,7 +7191,7 @@ bool __fastcall TTerminal::CopyToLocal(
     }
     }
 
 
     OperationStart(OperationProgress, (Params & cpDelete ? foMove : foCopy), osRemote,
     OperationStart(OperationProgress, (Params & cpDelete ? foMove : foCopy), osRemote,
-      FilesToCopy->Count, Params & cpTemporary, TargetDir, CopyParam->CPSLimit);
+      FilesToCopy->Count, Params & cpTemporary, TargetDir, CopyParam->CPSLimit, CopyParam->OnceDoneOperation);
 
 
     bool CollectingUsage = false;
     bool CollectingUsage = false;
     try
     try

+ 1 - 1
source/core/Terminal.h

@@ -391,7 +391,7 @@ protected:
     TFileOperationProgressType & Progress, TFileOperation Operation, TOperationSide Side, int Count);
     TFileOperationProgressType & Progress, TFileOperation Operation, TOperationSide Side, int Count);
   void __fastcall OperationStart(
   void __fastcall OperationStart(
     TFileOperationProgressType & Progress, TFileOperation Operation, TOperationSide Side, int Count,
     TFileOperationProgressType & Progress, TFileOperation Operation, TOperationSide Side, int Count,
-    bool Temp, const UnicodeString & Directory, unsigned long CPSLimit);
+    bool Temp, const UnicodeString & Directory, unsigned long CPSLimit, TOnceDoneOperation OnceDoneOperation);
   void __fastcall OperationStop(TFileOperationProgressType & Progress);
   void __fastcall OperationStop(TFileOperationProgressType & Progress);
   virtual void __fastcall Information(const UnicodeString & Str, bool Status);
   virtual void __fastcall Information(const UnicodeString & Str, bool Status);
   virtual unsigned int __fastcall QueryUser(const UnicodeString Query,
   virtual unsigned int __fastcall QueryUser(const UnicodeString Query,

+ 2 - 11
source/forms/CustomScpExplorer.cpp

@@ -1441,17 +1441,8 @@ void __fastcall TCustomScpExplorerForm::FileOperationProgress(
   if (ProgressData.InProgress && !FProgressForm)
   if (ProgressData.InProgress && !FProgressForm)
   {
   {
     CreateProgressForm(NULL);
     CreateProgressForm(NULL);
-    // When main window is hidden, synchronisation form does not exist (we do not get here during synchronization - only comparing),
-    // we suppose "/upload" or URL download mode
-    if (!Visible && (ProgressData.Operation != foCalculateSize) &&
-        (ProgressData.Operation != foCalculateChecksum) &&
-        // Hack to prevent renames from DoSynchronizeMove (synchronize checklist) closing the connection
-        (ProgressData.Operation != foRemoteMove) &&
-        (FSynchronizeProgressForm == NULL) &&
-        !FStandaloneEditing)
-    {
-      FProgressForm->OnceDoneOperation = odoDisconnect;
-    }
+    DebugAssert(FProgressForm->OnceDoneOperation == odoIdle);
+    FProgressForm->OnceDoneOperation = ProgressData.InitialOnceDoneOperation;
   }
   }
   // operation is finished (or terminated), so we hide progress form
   // operation is finished (or terminated), so we hide progress form
   else if (!ProgressData.InProgress && (FProgressForm != NULL) && (FProgressForm->SynchronizeProgress == NULL))
   else if (!ProgressData.InProgress && (FProgressForm != NULL) && (FProgressForm->SynchronizeProgress == NULL))

+ 7 - 0
source/windows/WinMain.cpp

@@ -108,6 +108,9 @@ void __fastcall Upload(TTerminal * Terminal, TStrings * FileList, bool UseDefaul
       DoCopyDialog(true, false, FileList, TargetDirectory, &CopyParam, Options,
       DoCopyDialog(true, false, FileList, TargetDirectory, &CopyParam, Options,
         CopyParamAttrs, Data.get(), NULL))
         CopyParamAttrs, Data.get(), NULL))
   {
   {
+    // Setting parameter overrides only now, otherwise the dialog would present the parametes as non-default
+    CopyParam.OnceDoneOperation = odoDisconnect;
+
     Terminal->CopyToRemote(FileList, TargetDirectory, &CopyParam, 0, NULL);
     Terminal->CopyToRemote(FileList, TargetDirectory, &CopyParam, 0, NULL);
   }
   }
 }
 }
@@ -157,6 +160,8 @@ void __fastcall Download(TTerminal * Terminal, const UnicodeString FileName,
         DoCopyDialog(false, false, FileListFriendly.get(), TargetDirectory, &CopyParam,
         DoCopyDialog(false, false, FileListFriendly.get(), TargetDirectory, &CopyParam,
           Options, CopyParamAttrs, NULL, NULL))
           Options, CopyParamAttrs, NULL, NULL))
     {
     {
+      // Setting parameter overrides only now, otherwise the dialog would present the parametes as non-default
+
       if (CustomDisplayName)
       if (CustomDisplayName)
       {
       {
         // Set only now, so that it is not redundantly displayed on the copy dialog.
         // Set only now, so that it is not redundantly displayed on the copy dialog.
@@ -164,6 +169,8 @@ void __fastcall Download(TTerminal * Terminal, const UnicodeString FileName,
         CopyParam.FileMask = DisplayName;
         CopyParam.FileMask = DisplayName;
       }
       }
 
 
+      CopyParam.OnceDoneOperation = odoDisconnect;
+
       std::unique_ptr<TStrings> FileList(new TStringList());
       std::unique_ptr<TStrings> FileList(new TStringList());
       FileList->AddObject(FileName, File);
       FileList->AddObject(FileName, File);
       Terminal->CopyToLocal(FileList.get(), TargetDirectory, &CopyParam, 0, NULL);
       Terminal->CopyToLocal(FileList.get(), TargetDirectory, &CopyParam, 0, NULL);