Преглед изворни кода

Bug 1558: Failure when creating local directory or deleting local files, while no session is connected

https://winscp.net/tracker/1558

Source commit: 988a7557e733179399721b49b8c3dcebba40373f
Martin Prikryl пре 8 година
родитељ
комит
2920c37bef

+ 1 - 1
source/core/Terminal.cpp

@@ -3666,7 +3666,6 @@ bool __fastcall TTerminal::ProcessFiles(TStrings * FileList,
   TFileOperation Operation, TProcessFileEvent ProcessFile, void * Param,
   TOperationSide Side, bool Ex)
 {
-  DebugAssert(FFileSystem);
   DebugAssert(FileList);
 
   bool Result = false;
@@ -3682,6 +3681,7 @@ bool __fastcall TTerminal::ProcessFiles(TStrings * FileList,
     {
       if (Side == osRemote)
       {
+        DebugAssert(FFileSystem != NULL);
         BeginTransaction();
       }
 

+ 3 - 3
source/forms/CustomScpExplorer.cpp

@@ -3680,7 +3680,6 @@ void __fastcall TCustomScpExplorerForm::SideEnter(TOperationSide Side)
 void __fastcall TCustomScpExplorerForm::DeleteFiles(TOperationSide Side,
   TStrings * FileList, bool Alternative)
 {
-  DebugAssert(Terminal);
   TCustomDirView * DView = DirView(Side);
   DView->SaveSelection();
   DView->SaveSelectedNames();
@@ -3691,13 +3690,14 @@ void __fastcall TCustomScpExplorerForm::DeleteFiles(TOperationSide Side,
   {
     if (Side == osRemote)
     {
+      DebugAssert(Terminal != NULL);
       Terminal->DeleteFiles(FileList, FLAGMASK(Alternative, dfAlternative));
     }
     else
     {
       try
       {
-        Terminal->DeleteLocalFiles(FileList, FLAGMASK(Alternative, dfAlternative));
+        TTerminalManager::Instance()->LocalTerminal->DeleteLocalFiles(FileList, FLAGMASK(Alternative, dfAlternative));
       }
       __finally
       {
@@ -3924,7 +3924,7 @@ void __fastcall TCustomScpExplorerForm::CreateDirectory(TOperationSide Side)
   TRemoteProperties * AProperties = (Side == osRemote ? &Properties : NULL);
   UnicodeString Name = LoadStr(NEW_FOLDER);
   int AllowedChanges =
-    FLAGMASK(Terminal->IsCapable[fcModeChanging], cpMode);
+    FLAGMASK((Side == osRemote) && Terminal->IsCapable[fcModeChanging], cpMode);
   bool SaveSettings = false;
 
   if (DoCreateDirectoryDialog(Name, AProperties, AllowedChanges, SaveSettings))

+ 19 - 10
source/windows/TerminalManager.cpp

@@ -93,6 +93,9 @@ __fastcall TTerminalManager::TTerminalManager() :
   FTerminalList = new TStringList();
   FQueues = new TList();
   FTerminationMessages = new TStringList();
+  std::unique_ptr<TSessionData> DummyData(new TSessionData(L""));
+  FLocalTerminal = CreateTerminal(DummyData.get());
+  SetupTerminal(FLocalTerminal);
 }
 //---------------------------------------------------------------------------
 __fastcall TTerminalManager::~TTerminalManager()
@@ -109,6 +112,7 @@ __fastcall TTerminalManager::~TTerminalManager()
   DebugAssert(WinConfiguration->OnMasterPasswordPrompt == MasterPasswordPrompt);
   WinConfiguration->OnMasterPasswordPrompt = NULL;
 
+  delete FLocalTerminal;
   delete FQueues;
   delete FTerminationMessages;
   delete FTerminalList;
@@ -141,6 +145,20 @@ TTerminal * __fastcall TTerminalManager::CreateTerminal(TSessionData * Data)
   return new TManagedTerminal(Data, Configuration);
 }
 //---------------------------------------------------------------------------
+void __fastcall TTerminalManager::SetupTerminal(TTerminal * Terminal)
+{
+  Terminal->OnQueryUser = TerminalQueryUser;
+  Terminal->OnPromptUser = TerminalPromptUser;
+  Terminal->OnDisplayBanner = TerminalDisplayBanner;
+  Terminal->OnShowExtendedException = TerminalShowExtendedException;
+  Terminal->OnProgress = OperationProgress;
+  Terminal->OnFinished = OperationFinished;
+  Terminal->OnDeleteLocalFile = DeleteLocalFile;
+  Terminal->OnReadDirectoryProgress = TerminalReadDirectoryProgress;
+  Terminal->OnInformation = TerminalInformation;
+  Terminal->OnCustomCommand = TerminalCustomCommand;
+}
+//---------------------------------------------------------------------------
 TTerminal * __fastcall TTerminalManager::DoNewTerminal(TSessionData * Data)
 {
   FTerminalList->Clear();
@@ -150,16 +168,7 @@ TTerminal * __fastcall TTerminalManager::DoNewTerminal(TSessionData * Data)
     FQueues->Add(NewQueue(Terminal));
     FTerminationMessages->Add(L"");
 
-    Terminal->OnQueryUser = TerminalQueryUser;
-    Terminal->OnPromptUser = TerminalPromptUser;
-    Terminal->OnDisplayBanner = TerminalDisplayBanner;
-    Terminal->OnShowExtendedException = TerminalShowExtendedException;
-    Terminal->OnProgress = OperationProgress;
-    Terminal->OnFinished = OperationFinished;
-    Terminal->OnDeleteLocalFile = DeleteLocalFile;
-    Terminal->OnReadDirectoryProgress = TerminalReadDirectoryProgress;
-    Terminal->OnInformation = TerminalInformation;
-    Terminal->OnCustomCommand = TerminalCustomCommand;
+    SetupTerminal(Terminal);
   }
   catch(...)
   {

+ 3 - 0
source/windows/TerminalManager.h

@@ -71,6 +71,7 @@ public:
   __property TStrings * TerminalList = { read = GetTerminalList };
   __property TNotifyEvent OnLastTerminalClosed = { read = FOnLastTerminalClosed, write = FOnLastTerminalClosed };
   __property TNotifyEvent OnTerminalListChanged = { read = FOnTerminalListChanged, write = FOnTerminalListChanged };
+  __property TTerminal * LocalTerminal = { read = FLocalTerminal };
 
 protected:
   virtual TTerminal * __fastcall CreateTerminal(TSessionData * Data);
@@ -79,6 +80,7 @@ private:
   static TTerminalManager * FInstance;
   TCustomScpExplorerForm * FScpExplorer;
   TTerminal * FActiveTerminal;
+  TTerminal * FLocalTerminal;
   bool FDestroying;
   TTerminalPendingAction FTerminalPendingAction;
   TNotifyEvent FOnLastTerminalClosed;
@@ -163,6 +165,7 @@ private:
   bool __fastcall HandleMouseWheel(WPARAM WParam, LPARAM LParam);
   void __fastcall DoConfigurationChange();
   bool __fastcall ShouldDisplayQueueStatusOnAppTitle();
+  void __fastcall SetupTerminal(TTerminal * Terminal);
 };
 //---------------------------------------------------------------------------
 #endif