瀏覽代碼

Bug fix: When moving an ongoing delete operation to background queue, it might attempt to delete the current file again, failing the operation

Overall, the test for cancel is probably redundant for all scenarios. But to limit impact, I'm keeping it for most scenarios, except for the delete.

Source commit: c24c339bd5c5621a74c356b8189487e35dc2ab41
Martin Prikryl 10 月之前
父節點
當前提交
e613fa29fe

+ 2 - 2
source/core/FileOperationProgress.cpp

@@ -321,8 +321,8 @@ void __fastcall TFileOperationProgressType::Finish(UnicodeString FileName,
   DebugAssert(InProgress);
 
   // Cancel reader is guarded
-  FOnFinished(Operation, Side, Temp, FileName,
-    Success && (Cancel == csContinue), OnceDoneOperation);
+  bool NotCancelled = (Cancel == csContinue);
+  FOnFinished(Operation, Side, Temp, FileName, Success, NotCancelled, OnceDoneOperation);
   FFilesFinished++;
   if (Success)
   {

+ 1 - 1
source/core/FileOperationProgress.h

@@ -18,7 +18,7 @@ typedef void __fastcall (__closure *TFileOperationProgressEvent)
   (TFileOperationProgressType & ProgressData);
 typedef void __fastcall (__closure *TFileOperationFinished)
   (TFileOperation Operation, TOperationSide Side, bool Temp,
-    const UnicodeString & FileName, bool Success, TOnceDoneOperation & OnceDoneOperation);
+   const UnicodeString & FileName, bool Success, bool NotCancelled, TOnceDoneOperation & OnceDoneOperation);
 //---------------------------------------------------------------------------
 class TFileOperationStatistics
 {

+ 2 - 2
source/core/Queue.cpp

@@ -270,7 +270,7 @@ protected:
   void __fastcall TerminalShowExtendedException(TTerminal * Terminal,
     Exception * E, void * Arg);
   void __fastcall OperationFinished(TFileOperation Operation, TOperationSide Side,
-    bool Temp, const UnicodeString & FileName, bool Success,
+    bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled,
     TOnceDoneOperation & OnceDoneOperation);
   void __fastcall OperationProgress(TFileOperationProgressType & ProgressData);
 };
@@ -1552,7 +1552,7 @@ void __fastcall TTerminalItem::TerminalShowExtendedException(
 //---------------------------------------------------------------------------
 void __fastcall TTerminalItem::OperationFinished(TFileOperation /*Operation*/,
   TOperationSide /*Side*/, bool /*Temp*/, const UnicodeString & /*FileName*/,
-  bool /*Success*/, TOnceDoneOperation & /*OnceDoneOperation*/)
+  bool /*Success*/, bool /*NotCancelled*/, TOnceDoneOperation & /*OnceDoneOperation*/)
 {
   // nothing
 }

+ 2 - 2
source/core/Script.cpp

@@ -2477,10 +2477,10 @@ void __fastcall TManagementScript::TerminalOperationProgress(
 //---------------------------------------------------------------------------
 void __fastcall TManagementScript::TerminalOperationFinished(
   TFileOperation Operation, TOperationSide /*Side*/,
-  bool /*Temp*/, const UnicodeString & FileName, Boolean Success,
+  bool /*Temp*/, const UnicodeString & FileName, bool Success, bool NotCancelled,
   TOnceDoneOperation & /*OnceDoneOperation*/)
 {
-  if (Success &&
+  if (Success && NotCancelled &&
       (Operation != foCalculateSize) && (Operation != foCalculateChecksum) &&
       !TFileOperationProgressType::IsTransferOperation(Operation))
   {

+ 1 - 1
source/core/Script.h

@@ -239,7 +239,7 @@ protected:
     TTerminal * Terminal, const UnicodeString & Str, bool Status, int Phase, const UnicodeString & Additional);
   void __fastcall TerminalOperationProgress(TFileOperationProgressType & ProgressData);
   void __fastcall TerminalOperationFinished(TFileOperation Operation, TOperationSide Side,
-    bool Temp, const UnicodeString & FileName, Boolean Success,
+    bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled,
     TOnceDoneOperation & OnceDoneOperation);
 
   void __fastcall PrintActiveSession();

+ 2 - 2
source/core/Terminal.cpp

@@ -2224,14 +2224,14 @@ void __fastcall TTerminal::DoProgress(TFileOperationProgressType & ProgressData)
 }
 //---------------------------------------------------------------------------
 void __fastcall TTerminal::DoFinished(TFileOperation Operation, TOperationSide Side, bool Temp,
-  const UnicodeString & FileName, bool Success, TOnceDoneOperation & OnceDoneOperation)
+  const UnicodeString & FileName, bool Success, bool NotCancelled, TOnceDoneOperation & OnceDoneOperation)
 {
   if (OnFinished != NULL)
   {
     TCallbackGuard Guard(this);
     try
     {
-      OnFinished(Operation, Side, Temp, FileName, Success, OnceDoneOperation);
+      OnFinished(Operation, Side, Temp, FileName, Success, NotCancelled, OnceDoneOperation);
       Guard.Verify();
     }
     catch (Exception & E)

+ 1 - 1
source/core/Terminal.h

@@ -423,7 +423,7 @@ protected:
   bool __fastcall IsListenerFree(unsigned int PortNumber);
   void __fastcall DoProgress(TFileOperationProgressType & ProgressData);
   void __fastcall DoFinished(TFileOperation Operation, TOperationSide Side, bool Temp,
-    const UnicodeString & FileName, bool Success, TOnceDoneOperation & OnceDoneOperation);
+    const UnicodeString & FileName, bool Success, bool NotCancelled, TOnceDoneOperation & OnceDoneOperation);
   void __fastcall RollbackAction(TSessionAction & Action,
     TFileOperationProgressType * OperationProgress, Exception * E = NULL);
   void __fastcall DoAnyCommand(const UnicodeString Command, TCaptureOutputEvent OutputEvent,

+ 13 - 12
source/forms/CustomScpExplorer.cpp

@@ -1368,7 +1368,7 @@ void TCustomScpExplorerForm::ClearOperationSelection(TOperationSide Side)
 {
   if (FOnFileOperationFinished != NULL)
   {
-    FOnFileOperationFinished(Side, UnicodeString(), true);
+    FOnFileOperationFinished(Side, UnicodeString(), true, true);
   }
   else
   {
@@ -1781,7 +1781,7 @@ TListItem * TCustomScpExplorerForm::VisualiseOperationFinished(TOperationSide Si
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::DoOperationFinished(
   TFileOperation Operation, TOperationSide Side,
-  bool /*Temp*/, const UnicodeString & FileName, bool Success,
+  bool /*Temp*/, const UnicodeString & FileName, bool Success, bool NotCancelled,
   TOnceDoneOperation & OnceDoneOperation)
 {
   if (!FAutoOperation)
@@ -1805,11 +1805,11 @@ void __fastcall TCustomScpExplorerForm::DoOperationFinished(
       }
       if (FOnFileOperationFinished != NULL)
       {
-        FOnFileOperationFinished(DViewSide, FileName, Success);
+        FOnFileOperationFinished(DViewSide, FileName, Success, NotCancelled);
       }
       else
       {
-        VisualiseOperationFinished(DViewSide, FileName, Success);
+        VisualiseOperationFinished(DViewSide, FileName, Success && NotCancelled);
       }
     }
 
@@ -1852,12 +1852,11 @@ void __fastcall TCustomScpExplorerForm::DoOperationFinished(
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::OperationFinished(
   TFileOperation Operation, TOperationSide Side,
-  bool Temp, const UnicodeString & FileName, Boolean Success,
+  bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled,
   TOnceDoneOperation & OnceDoneOperation)
 {
   TAutoNestingCounter Counter(FDoNotIdleCurrentTerminal);
-  DoOperationFinished(Operation, Side, Temp, FileName, Success,
-    OnceDoneOperation);
+  DoOperationFinished(Operation, Side, Temp, FileName, Success, NotCancelled, OnceDoneOperation);
 }
 //---------------------------------------------------------------------------
 bool TCustomScpExplorerForm::IsLocalBrowserMode()
@@ -4355,9 +4354,10 @@ void __fastcall TCustomScpExplorerForm::SideEnter(TOperationSide Side)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::FileDeleted(TOperationSide Side, const UnicodeString & FileName, bool Success)
+void __fastcall TCustomScpExplorerForm::FileDeleted(
+  TOperationSide Side, const UnicodeString & FileName, bool Success, bool NotCancelled)
 {
-  VisualiseOperationFinished(Side, FileName, Success);
+  VisualiseOperationFinished(Side, FileName, Success && NotCancelled);
 
   if (DebugAlwaysTrue(FDeletedFiles != NULL) && Success)
   {
@@ -10677,7 +10677,7 @@ void __fastcall TCustomScpExplorerForm::DoEditFoundFiles(
       UnicodeString FileName = FileList->Strings[Index];
       TRemoteFile * File = static_cast<TRemoteFile *>(FileList->Objects[Index]);
       ExecuteRemoteFile(FileName, File, efDefaultEditor);
-      OnFileOperationFinished(osRemote, FileName, true);
+      OnFileOperationFinished(osRemote, FileName, true, true);
     }
   }
 }
@@ -12112,7 +12112,8 @@ void TCustomScpExplorerForm::CalculateDirectorySizes(TOperationSide Side)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::DirectorySizeCalculated(TOperationSide Side, const UnicodeString & FileName, bool Success)
+void __fastcall TCustomScpExplorerForm::DirectorySizeCalculated(
+  TOperationSide Side, const UnicodeString & FileName, bool Success, bool NotCancelled)
 {
   DebugAlwaysTrue(FCalculateSizeOperation != NULL);
 
@@ -12137,7 +12138,7 @@ void __fastcall TCustomScpExplorerForm::DirectorySizeCalculated(TOperationSide S
       Index = I - FCalculateSizeOperation->ListItems.begin();
     }
   }
-  if (DebugAlwaysTrue(Index >= 0) && Success)
+  if (DebugAlwaysTrue(Index >= 0) && Success && NotCancelled)
   {
     __int64 Size = (*FCalculateSizeOperation->Stats.CalculatedSizes)[Index];
     ADirView->SetItemCalculatedSize(Item, Size);

+ 4 - 4
source/forms/CustomScpExplorer.h

@@ -463,7 +463,7 @@ protected:
   void __fastcall UpdateStatusBar();
   virtual void __fastcall UpdateStatusPanelText(TTBXStatusPanel * Panel);
   virtual void __fastcall DoOperationFinished(TFileOperation Operation,
-    TOperationSide Side, bool Temp, const UnicodeString & FileName, bool Success,
+    TOperationSide Side, bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled,
     TOnceDoneOperation & OnceDoneOperation);
   virtual void __fastcall DoOpenDirectoryDialog(TOpenDirectoryMode Mode, TOperationSide Side);
   void __fastcall CreateProgressForm(TSynchronizeProgress * SynchronizeProgress);
@@ -762,9 +762,9 @@ protected:
   virtual UnicodeString GetNewTabHintDetails();
   UnicodeString GetTabHintSessionDetails(TManagedTerminal * ASession);
   UnicodeString GetSessionPath(TManagedTerminal * ASession, TOperationSide Side);
-  void __fastcall DirectorySizeCalculated(TOperationSide Side, const UnicodeString & FileName, bool Success);
+  void __fastcall DirectorySizeCalculated(TOperationSide Side, const UnicodeString & FileName, bool Success, bool NotCancelled);
   TListItem * VisualiseOperationFinished(TOperationSide Side, const UnicodeString & FileName, bool Unselect);
-  void __fastcall FileDeleted(TOperationSide Side, const UnicodeString & FileName, bool Success);
+  void __fastcall FileDeleted(TOperationSide Side, const UnicodeString & FileName, bool Success, bool NotCancelled);
   void LoadFilesProperties(TStrings * FileList);
   void PasteFiles();
   bool DoDirectoryExists(void * Session, const UnicodeString & Directory);
@@ -868,7 +868,7 @@ public:
     UnicodeString HelpKeyword, const TMessageParams * Params = NULL,
     TTerminal * Terminal = NULL);
   void __fastcall OperationFinished(TFileOperation Operation, TOperationSide Side,
-    bool Temp, const UnicodeString & FileName, bool Success, TOnceDoneOperation & OnceDoneOperation);
+    bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled, TOnceDoneOperation & OnceDoneOperation);
   void __fastcall OperationProgress(TFileOperationProgressType & ProgressData);
   UnicodeString __fastcall GetProgressTitle();
   void __fastcall ShowExtendedException(TTerminal * Terminal, Exception * E);

+ 7 - 5
source/forms/FileFind.cpp

@@ -610,11 +610,12 @@ TListItem * __fastcall TFileFindDialog::FileOperationFinished(const UnicodeStrin
   return Result;
 }
 //---------------------------------------------------------------------------
-void __fastcall TFileFindDialog::FileDeleteFinished(TOperationSide, const UnicodeString & FileName, bool Success)
+void __fastcall TFileFindDialog::FileDeleteFinished(
+  TOperationSide, const UnicodeString & FileName, bool Success, bool NotCancelled)
 {
   if (FileName.IsEmpty())
   {
-    DebugAssert(Success);
+    DebugAssert(Success && NotCancelled);
     FileView->SelectAll(smNone);
   }
   else
@@ -628,18 +629,19 @@ void __fastcall TFileFindDialog::FileDeleteFinished(TOperationSide, const Unicod
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TFileFindDialog::FileDownloadFinished(TOperationSide, const UnicodeString & FileName, bool Success)
+void __fastcall TFileFindDialog::FileDownloadFinished(
+  TOperationSide, const UnicodeString & FileName, bool Success, bool NotCancelled)
 {
   if (FileName.IsEmpty())
   {
-    DebugAssert(Success);
+    DebugAssert(Success && NotCancelled);
     // Moved to queue, see call in TCustomScpExplorerForm::CopyParamDialog
     FileView->SelectAll(smNone);
   }
   else
   {
     TListItem * Item = FileOperationFinished(FileName);
-    if (DebugAlwaysTrue(Item != NULL) && Success)
+    if (DebugAlwaysTrue(Item != NULL) && Success && NotCancelled)
     {
       Item->Selected = false;
     }

+ 2 - 2
source/forms/FileFind.h

@@ -133,8 +133,8 @@ private:
   void __fastcall DoFocusFile(const UnicodeString & Path);
   void __fastcall CMDialogKey(TWMKeyDown & Message);
   void __fastcall ClearItem(TListItem * Item);
-  void __fastcall FileDeleteFinished(TOperationSide Side, const UnicodeString & FileName, bool Success);
-  void __fastcall FileDownloadFinished(TOperationSide Side, const UnicodeString & FileName, bool Success);
+  void __fastcall FileDeleteFinished(TOperationSide Side, const UnicodeString & FileName, bool Success, bool NotCancelled);
+  void __fastcall FileDownloadFinished(TOperationSide Side, const UnicodeString & FileName, bool Success, bool NotCancelled);
   TListItem * __fastcall FileOperationFinished(const UnicodeString & FileName);
   void __fastcall FileListOperation(TFileListOperationEvent Operation, TFileOperationFinishedEvent OnFileOperationFinished);
   TIEListViewColProperties * GetColProperties();

+ 2 - 3
source/windows/TerminalManager.cpp

@@ -1504,12 +1504,11 @@ void __fastcall TTerminalManager::TerminalInformation(
 }
 //---------------------------------------------------------------------------
 void __fastcall TTerminalManager::OperationFinished(::TFileOperation Operation,
-  TOperationSide Side, bool Temp, const UnicodeString & FileName, bool Success,
+  TOperationSide Side, bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled,
   TOnceDoneOperation & OnceDoneOperation)
 {
   DebugAssert(ScpExplorer);
-  ScpExplorer->OperationFinished(Operation, Side, Temp, FileName, Success,
-    OnceDoneOperation);
+  ScpExplorer->OperationFinished(Operation, Side, Temp, FileName, Success, NotCancelled, OnceDoneOperation);
 }
 //---------------------------------------------------------------------------
 void __fastcall TTerminalManager::OperationProgress(

+ 1 - 1
source/windows/TerminalManager.h

@@ -207,7 +207,7 @@ private:
   void __fastcall SaveTerminal(TTerminal * Terminal);
   void __fastcall SetActiveSessionIndex(int value);
   void __fastcall OperationFinished(::TFileOperation Operation, TOperationSide Side,
-    bool Temp, const UnicodeString & FileName, bool Success,
+    bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled,
     TOnceDoneOperation & OnceDoneOperation);
   void __fastcall OperationProgress(TFileOperationProgressType & ProgressData);
   void __fastcall DeleteLocalFile(const UnicodeString FileName, bool Alternative, int & Deleted);

+ 1 - 1
source/windows/WinInterface.h

@@ -473,7 +473,7 @@ typedef void __fastcall (__closure *TFindEvent)
 typedef void __fastcall (__closure *TFocusFileEvent)
   (TTerminal * Terminal, const UnicodeString & Path);
 typedef void __fastcall (__closure *TFileOperationFinishedEvent)
-  (TOperationSide Side, const UnicodeString & FileName, bool Success);
+  (TOperationSide Side, const UnicodeString & FileName, bool Success, bool NotCancelled);
 typedef void __fastcall (__closure *TFileListOperationEvent)
   (TTerminal * Terminal, TStrings * FileList, TFileOperationFinishedEvent OnFileOperationFinished);
 void __fastcall ShowFileFindDialog(