From fe56268421a522d68323fdb9973308c4df07396b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 18 Jul 2018 14:53:02 -0500 Subject: [PATCH] added a simple system to batch saves in the connection service --- mRemoteV1/Connection/ConnectionsService.cs | 41 +++++++++++++++++-- .../Controls/ConnectionTree/ConnectionTree.cs | 4 ++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionsService.cs b/mRemoteV1/Connection/ConnectionsService.cs index 734915fb..d1a35c02 100644 --- a/mRemoteV1/Connection/ConnectionsService.cs +++ b/mRemoteV1/Connection/ConnectionsService.cs @@ -8,6 +8,7 @@ using mRemoteNG.Config.Connections; using mRemoteNG.Config.Connections.Multiuser; using mRemoteNG.Config.Putty; using mRemoteNG.Connection.Protocol; +using mRemoteNG.Messages; using mRemoteNG.Security; using mRemoteNG.Tools; using mRemoteNG.Tree; @@ -19,6 +20,9 @@ namespace mRemoteNG.Connection { private static readonly object SaveLock = new object(); private readonly PuttySessionsManager _puttySessionsManager; + private bool _batchingSaves = false; + private bool _saveRequested = false; + private bool _saveAsyncRequested = false; public bool IsConnectionsFileLoaded { get; set; } public bool UsingDatabase { get; private set; } @@ -122,14 +126,27 @@ namespace mRemoteNG.Connection return newConnectionTreeModel; } + public void BeginBatchingSaves() + { + _batchingSaves = true; + } + + public void EndBatchingSaves() + { + _batchingSaves = false; + + if (_saveAsyncRequested) + SaveConnectionsAsync(); + else if(_saveRequested) + SaveConnections(); + } + /// /// Saves the currently loaded with /// no . /// public void SaveConnections() { - if (!IsConnectionsFileLoaded) - return; SaveConnections(ConnectionTreeModel, UsingDatabase, new SaveFilter(), ConnectionFileName); } @@ -143,10 +160,21 @@ namespace mRemoteNG.Connection /// public void SaveConnections(ConnectionTreeModel connectionTreeModel, bool useDatabase, SaveFilter saveFilter, string connectionFileName) { - if (connectionTreeModel == null) return; + if (connectionTreeModel == null) + return; + + if (!IsConnectionsFileLoaded) + return; + + if (_batchingSaves) + { + _saveRequested = true; + return; + } try { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Saving connections..."); RemoteConnectionsSyncronizer?.Disable(); var previouslyUsingDatabase = UsingDatabase; @@ -161,6 +189,7 @@ namespace mRemoteNG.Connection UsingDatabase = useDatabase; ConnectionFileName = connectionFileName; RaiseConnectionsSavedEvent(connectionTreeModel, previouslyUsingDatabase, UsingDatabase, connectionFileName); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, "Successfully saved connections"); } catch (Exception ex) { @@ -174,6 +203,12 @@ namespace mRemoteNG.Connection public void SaveConnectionsAsync() { + if (_batchingSaves) + { + _saveAsyncRequested = true; + return; + } + var t = new Thread(SaveConnectionsBGd); t.SetApartmentState(ApartmentState.STA); t.Start(); diff --git a/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs b/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs index e7ca7578..c15f45b5 100644 --- a/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs +++ b/mRemoteV1/UI/Controls/ConnectionTree/ConnectionTree.cs @@ -311,11 +311,15 @@ namespace mRemoteNG.UI.Controls if (sortTarget == null) sortTarget = GetRootConnectionNode(); + Runtime.ConnectionsService.BeginBatchingSaves(); + var sortTargetAsContainer = sortTarget as ContainerInfo; if (sortTargetAsContainer != null) sortTargetAsContainer.SortRecursive(sortDirection); else SelectedNode.Parent.SortRecursive(sortDirection); + + Runtime.ConnectionsService.EndBatchingSaves(); } ///