Przeglądaj źródła

Bug 1997: Failure when automatically opening a workspace on startup with too many sessions

https://winscp.net/tracker/1997
(cherry picked from commit 492a5ece61d47e40b9c2acf73251ca14aa4fef1e)

# Conflicts:
#	source/forms/CustomScpExplorer.cpp

Source commit: da7ca27b44bac144f047a7330681dbd403dc753b
Martin Prikryl 4 lat temu
rodzic
commit
3fd6d5b38e

+ 13 - 9
source/forms/CustomScpExplorer.cpp

@@ -4923,19 +4923,23 @@ void __fastcall TCustomScpExplorerForm::OpenStoredSession(TSessionData * Data)
   }
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::DoOpenFolderOrWorkspace(const UnicodeString & Name, bool ConnectFirstTerminal)
+void TCustomScpExplorerForm::DoOpenFolderOrWorkspace(
+  const UnicodeString & Name, bool ConnectFirstTerminal, bool CheckMaxSessions)
 {
   TTerminalManager * Manager = TTerminalManager::Instance();
   std::unique_ptr<TObjectList> DataList(new TObjectList());
   StoredSessions->GetFolderOrWorkspace(Name, DataList.get());
-  TManagedTerminal * FirstTerminal = Manager->NewTerminals(DataList.get());
-  // FirstTerminal can be null, if some of the
-  if (!ConnectFirstTerminal && (FirstTerminal != NULL))
+  if (!CheckMaxSessions || (DataList->Count <= WinConfiguration->MaxSessions))
   {
-    FirstTerminal->Disconnected = true;
-    FirstTerminal->DisconnectedTemporarily = true;
+    TManagedTerminal * FirstTerminal = Manager->NewTerminals(DataList.get());
+    // FirstTerminal can be null, if some of the
+    if (!ConnectFirstTerminal && (FirstTerminal != NULL))
+      {
+      FirstTerminal->Disconnected = true;
+      FirstTerminal->DisconnectedTemporarily = true;
+    }
+    Manager->ActiveTerminal = FirstTerminal;
   }
-  Manager->ActiveTerminal = FirstTerminal;
 }
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::OpenFolderOrWorkspace(const UnicodeString & Name)
@@ -4946,7 +4950,7 @@ void __fastcall TCustomScpExplorerForm::OpenFolderOrWorkspace(const UnicodeStrin
   }
   else
   {
-    DoOpenFolderOrWorkspace(Name, true);
+    DoOpenFolderOrWorkspace(Name, true, false);
   }
 }
 //---------------------------------------------------------------------------
@@ -6717,7 +6721,7 @@ void __fastcall TCustomScpExplorerForm::NeedSession(bool Startup)
                // This detects if workspace was saved the last time the main widow was closed
                SameText(WinConfiguration->LastStoredSession, WinConfiguration->AutoWorkspace))
       {
-        DoOpenFolderOrWorkspace(WinConfiguration->AutoWorkspace, false);
+        DoOpenFolderOrWorkspace(WinConfiguration->AutoWorkspace, false, true);
         Configuration->Usage->Inc(L"OpenedWorkspacesAuto");
       }
     }

+ 1 - 1
source/forms/CustomScpExplorer.h

@@ -708,7 +708,7 @@ protected:
   void __fastcall CMDialogKey(TWMKeyDown & Message);
   DYNAMIC void __fastcall Deactivate();
   void __fastcall CenterReconnectToolbar();
-  void __fastcall DoOpenFolderOrWorkspace(const UnicodeString & Name, bool ConnectFirstTerminal);
+  void DoOpenFolderOrWorkspace(const UnicodeString & Name, bool ConnectFirstTerminal, bool CheckMaxSessions);
   virtual void __fastcall ThemeChanged();
   int __fastcall GetStaticQueuePanelComponentsHeight();
   int __fastcall GetMinQueueViewHeight();

+ 2 - 0
source/windows/WinConfiguration.cpp

@@ -604,6 +604,7 @@ void __fastcall TWinConfiguration::Default()
   FShowLoginWhenNoSession = true;
   FKeepOpenWhenNoSession = true;
   FLocalIconsByExt = false;
+  FMaxSessions = 100;
   FBidiModeOverride = lfoLanguageIfRecommended;
   FFlipChildrenOverride = lfoLanguageIfRecommended;
   FShowTips = true;
@@ -1011,6 +1012,7 @@ THierarchicalStorage * TWinConfiguration::CreateScpStorage(bool & SessionList)
     KEY(Bool,     ShowLoginWhenNoSession); \
     KEY(Bool,     KeepOpenWhenNoSession); \
     KEY(Bool,     LocalIconsByExt); \
+    KEY(Integer,  MaxSessions); \
     KEY(Integer,  BidiModeOverride); \
     KEY(Integer,  FlipChildrenOverride); \
     KEY(Bool,     ShowTips); \

+ 2 - 0
source/windows/WinConfiguration.h

@@ -451,6 +451,7 @@ private:
   bool FShowLoginWhenNoSession;
   bool FKeepOpenWhenNoSession;
   bool FLocalIconsByExt;
+  int FMaxSessions;
   TLocaleFlagOverride FBidiModeOverride;
   TLocaleFlagOverride FFlipChildrenOverride;
   bool FShowTips;
@@ -748,6 +749,7 @@ public:
   __property bool ShowLoginWhenNoSession = { read = FShowLoginWhenNoSession, write = SetShowLoginWhenNoSession };
   __property bool KeepOpenWhenNoSession = { read = FKeepOpenWhenNoSession, write = SetKeepOpenWhenNoSession };
   __property bool LocalIconsByExt = { read = FLocalIconsByExt, write = SetLocalIconsByExt };
+  __property int MaxSessions = { read = FMaxSessions, write = FMaxSessions };
   __property TLocaleFlagOverride BidiModeOverride = { read = FBidiModeOverride, write = SetBidiModeOverride };
   __property TLocaleFlagOverride FlipChildrenOverride = { read = FFlipChildrenOverride, write = SetFlipChildrenOverride };
   __property bool ShowTips = { read = FShowTips, write = SetShowTips };