浏览代码

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

https://winscp.net/tracker/1997

Source commit: 5f801b18d98616a8f910d069aafedfbcdc16caa5
Martin Prikryl 4 年之前
父节点
当前提交
492a5ece61

+ 13 - 9
source/forms/CustomScpExplorer.cpp

@@ -5048,19 +5048,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 * FirstSession = Manager->NewSessions(DataList.get());
-  // FirstSession can be null, if some of the
-  if (!ConnectFirstTerminal && (FirstSession != NULL))
+  if (!CheckMaxSessions || (DataList->Count <= WinConfiguration->MaxSessions))
   {
-    FirstSession->Disconnected = true;
-    FirstSession->DisconnectedTemporarily = true;
+    TManagedTerminal * FirstSession = Manager->NewSessions(DataList.get());
+    // FirstSession can be null, if some of the
+    if (!ConnectFirstTerminal && (FirstSession != NULL))
+    {
+      FirstSession->Disconnected = true;
+      FirstSession->DisconnectedTemporarily = true;
+    }
+    Manager->ActiveSession = FirstSession;
   }
-  Manager->ActiveSession = FirstSession;
 }
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::OpenFolderOrWorkspace(const UnicodeString & Name)
@@ -5071,7 +5075,7 @@ void __fastcall TCustomScpExplorerForm::OpenFolderOrWorkspace(const UnicodeStrin
   }
   else
   {
-    DoOpenFolderOrWorkspace(Name, true);
+    DoOpenFolderOrWorkspace(Name, true, false);
   }
 }
 //---------------------------------------------------------------------------
@@ -7284,7 +7288,7 @@ void __fastcall TCustomScpExplorerForm::DoShow()
       // 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

@@ -716,7 +716,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

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

+ 2 - 0
source/windows/WinConfiguration.h

@@ -455,6 +455,7 @@ private:
   bool FKeepOpenWhenNoSession;
   bool FDefaultToNewRemoteTab;
   bool FLocalIconsByExt;
+  int FMaxSessions;
   TLocaleFlagOverride FBidiModeOverride;
   TLocaleFlagOverride FFlipChildrenOverride;
   bool FShowTips;
@@ -754,6 +755,7 @@ public:
   __property bool KeepOpenWhenNoSession = { read = FKeepOpenWhenNoSession, write = SetKeepOpenWhenNoSession };
   __property bool DefaultToNewRemoteTab = { read = FDefaultToNewRemoteTab, write = SetDefaultToNewRemoteTab };
   __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 };