Browse Source

Issue 2238 – Failure when saving edited file over reconnected session after previous reconnect attempt was aborted

https://winscp.net/tracker/2238

Source commit: 775dd9d624f6c9312e0dc34656c70b0bf79d7a77
Martin Prikryl 2 years ago
parent
commit
a8937d3340

+ 15 - 17
source/forms/CustomScpExplorer.cpp

@@ -615,6 +615,7 @@ void __fastcall TCustomScpExplorerForm::DoSetManagedSession(TManagedTerminal * v
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::ReplaceTerminal(TManagedTerminal * value)
 {
+  FEditorManager->ProcessFiles(FileTerminalReplaced, value);
   DoSetManagedSession(value, true);
 }
 //---------------------------------------------------------------------------
@@ -3398,7 +3399,6 @@ void __fastcall TCustomScpExplorerForm::CustomExecuteFile(TOperationSide Side,
   if (!IsSideLocalBrowser(Side))
   {
     Data->Terminal = Terminal;
-    Data->Queue = Queue;
     Data->SessionData = CloneCurrentSessionData();
     Data->ForceText = RemoteExecuteForceText(ExecuteFileBy, ExternalEditor);
     Data->RemoteDirectory = RemoteDirectory;
@@ -4000,7 +4000,6 @@ void __fastcall TCustomScpExplorerForm::ExecutedFileChanged(
           if (MessageDialog(Message, qtConfirmation, qaOK | qaCancel) == qaOK)
           {
             Data->Terminal = SameSiteTerminal;
-            Data->Queue = Manager->FindQueueForTerminal(SameSiteTerminal);
             Data->SessionName = SameSiteTerminal->SessionData->SessionName;
             // We might also overwrite session data
             Configuration->Usage->Inc(EditInactiveSessionReopenAcceptedCounter);
@@ -4025,11 +4024,7 @@ void __fastcall TCustomScpExplorerForm::ExecutedFileChanged(
             Manager->ActiveSession = Terminal;
             ReconnectSession();
             // Was it reconnected? (if not, Data->Terminal should be nulled now)
-            if (IsActiveTerminal(Data->Terminal) && (Terminal == Data->Terminal))
-            {
-              Data->Queue = Manager->FindQueueForTerminal(Terminal);
-            }
-            else
+            if (!IsActiveTerminal(Data->Terminal) || (Terminal != Data->Terminal))
             {
               Abort();
             }
@@ -4112,19 +4107,11 @@ void __fastcall TCustomScpExplorerForm::ExecutedFileChanged(
       int Params = cpNoConfirmation | cpTemporary;
       if (Data->Terminal->IsCapable[fcBackgroundTransfers])
       {
-        if (DebugAlwaysFalse(Data->Queue == NULL))
-        {
-          throw EInvalidOperation(L"Transfer queue invalidated");
-        }
-        if (DebugAlwaysFalse(Data->Queue != Manager->FindQueueForTerminal(Data->Terminal)))
-        {
-          throw EInvalidOperation(L"Transfer queue does not match session");
-        }
-
+        TTerminalQueue * AQueue = Manager->FindQueueForTerminal(Data->Terminal);
         TQueueItem * QueueItem =
           new TEditorUploadQueueItem(Data->Terminal, FileList, Data->RemoteDirectory, &CopyParam, Params);
         QueueItem->CompleteEvent = UploadCompleteEvent;
-        AddQueueItem(Data->Queue, QueueItem, Data->Terminal);
+        AddQueueItem(AQueue, QueueItem, Data->Terminal);
       }
       else
       {
@@ -7271,6 +7258,17 @@ void __fastcall TCustomScpExplorerForm::TerminalRemoved(TObject * Sender)
   DetachTerminal(Sender);
 }
 //---------------------------------------------------------------------------
+void __fastcall TCustomScpExplorerForm::FileTerminalReplaced(
+  const UnicodeString FileName, TEditedFileData * Data, TObject * /*Token*/, void * Arg)
+{
+  TManagedTerminal * ATerminal = static_cast<TManagedTerminal *>(Arg);
+
+  if (Data->Terminal == Terminal)
+  {
+    Data->Terminal = ATerminal;
+  }
+}
+//---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::FileTerminalRemoved(const UnicodeString FileName,
   TEditedFileData * Data, TObject * /*Token*/, void * Arg)
 {

+ 2 - 0
source/forms/CustomScpExplorer.h

@@ -557,6 +557,8 @@ protected:
   bool __fastcall CommandSessionFallback();
   void __fastcall FileTerminalRemoved(const UnicodeString FileName,
     TEditedFileData * Data, TObject * Token, void * Arg);
+  void __fastcall FileTerminalReplaced(
+    const UnicodeString FileName, TEditedFileData * Data, TObject * Token, void * Arg);
   void __fastcall FileConfigurationChanged(const UnicodeString FileName,
     TEditedFileData * Data, TObject * Token, void * Arg);
   void __fastcall CustomExecuteFile(TOperationSide Side,

+ 0 - 1
source/windows/EditorManager.cpp

@@ -18,7 +18,6 @@ TEditedFileData::TEditedFileData()
   ForceText = false;
   Terminal = NULL;
   SessionData = NULL;
-  Queue = NULL;
 }
 //---------------------------------------------------------------------------
 TEditedFileData::~TEditedFileData()

+ 0 - 1
source/windows/EditorManager.h

@@ -17,7 +17,6 @@ struct TEditedFileData
   bool ForceText;
   TManagedTerminal * Terminal;
   TSessionData * SessionData;
-  TTerminalQueue * Queue;
   UnicodeString SessionName;
   UnicodeString OriginalFileName;
   UnicodeString Command;