From 90dc8274c53facca42c6dcbeeb76a83fd820013e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 17 Aug 2016 09:29:43 -0600 Subject: [PATCH 001/338] Added ObjectListView to packages --- mRemoteV1/mRemoteV1.csproj | 4 ++++ mRemoteV1/packages.config | 1 + 2 files changed, 5 insertions(+) diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index f1567bf46..485ade318 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -72,6 +72,10 @@ References\MagicLibrary.dll True + + ..\packages\ObjectListView.Official.2.9.1\lib\net20\ObjectListView.dll + True + ..\packages\SSH.NET.2016.0.0\lib\net40\Renci.SshNet.dll True diff --git a/mRemoteV1/packages.config b/mRemoteV1/packages.config index 14b47134f..29e9c4d93 100644 --- a/mRemoteV1/packages.config +++ b/mRemoteV1/packages.config @@ -4,5 +4,6 @@ + \ No newline at end of file From 501dffe5b296c8772ac5597f6d18e68e3fa70053 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 17 Aug 2016 14:47:03 -0600 Subject: [PATCH 002/338] Refactored to separate loading connection data from deserializing data into domain objects --- .../Connections/ConnectionsDecryptor.cs | 97 +++++++++++++ .../Config/Connections/ConnectionsLoader.cs | 5 +- ...oader.cs => XmlConnectionsDeserializer.cs} | 128 +++--------------- mRemoteV1/Config/FileDataProvider.cs | 24 ++++ mRemoteV1/Config/IDataProvider.cs | 10 ++ mRemoteV1/Tree/ConnectionTree.cs | 25 ++-- mRemoteV1/mRemoteV1.csproj | 5 +- 7 files changed, 170 insertions(+), 124 deletions(-) create mode 100644 mRemoteV1/Config/Connections/ConnectionsDecryptor.cs rename mRemoteV1/Config/Connections/{XmlConnectionsLoader.cs => XmlConnectionsDeserializer.cs} (88%) create mode 100644 mRemoteV1/Config/FileDataProvider.cs create mode 100644 mRemoteV1/Config/IDataProvider.cs diff --git a/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs b/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs new file mode 100644 index 000000000..19d4b349b --- /dev/null +++ b/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs @@ -0,0 +1,97 @@ +using System; +using System.Security; +using mRemoteNG.App.Info; +using mRemoteNG.Security; +using mRemoteNG.Security.SymmetricEncryption; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class ConnectionsDecryptor + { + private readonly ICryptographyProvider _cryptographyProvider; + private SecureString _pW = GeneralAppInfo.EncryptionKey; + + public ConnectionsDecryptor() + { + _cryptographyProvider = new LegacyRijndaelCryptographyProvider(); + } + + public string DecryptConnections(string xml) + { + var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); + + if (string.IsNullOrEmpty(xml)) return ""; + if (xml.Contains("")) return xml; + + var strDecr = ""; + bool notDecr; + + try + { + strDecr = cryptographyProvider.Decrypt(xml, _pW); + notDecr = strDecr == xml; + } + catch (Exception) + { + notDecr = true; + } + + if (notDecr) + { + if (Authenticate(xml, true)) + { + strDecr = cryptographyProvider.Decrypt(xml, _pW); + notDecr = false; + } + + if (notDecr == false) + return strDecr; + } + else + { + return strDecr; + } + + return ""; + } + + public bool ConnectionsFileIsAuthentic(string protectedString, RootNodeInfo rootInfo) + { + var connectionsFileIsNotEncrypted = _cryptographyProvider.Decrypt(protectedString, _pW) == "ThisIsNotProtected"; + return connectionsFileIsNotEncrypted || Authenticate(protectedString, false, rootInfo); + } + + private bool Authenticate(string value, bool compareToOriginalValue, RootNodeInfo rootInfo = null) + { + var passwordName = ""; + //passwordName = Path.GetFileName(ConnectionFileName); + + if (compareToOriginalValue) + { + while (_cryptographyProvider.Decrypt(value, _pW) == value) + { + _pW = Tools.MiscTools.PasswordDialog(passwordName, false); + if (_pW.Length == 0) + return false; + } + } + else + { + while (_cryptographyProvider.Decrypt(value, _pW) != "ThisIsProtected") + { + _pW = Tools.MiscTools.PasswordDialog(passwordName, false); + if (_pW.Length == 0) + return false; + } + + if (rootInfo == null) return true; + rootInfo.Password = true; + rootInfo.PasswordString = _pW.ConvertToUnsecureString(); + } + + return true; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index cb3953c51..270850945 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -45,9 +45,10 @@ namespace mRemoteNG.Config.Connections } else { - var xmlConnectionsLoader = new XmlConnectionsLoader() + var dataProvider = new FileDataProvider(ConnectionFileName); + var xmlString = dataProvider.Load(); + var xmlConnectionsLoader = new XmlConnectionsDeserializer(xmlString) { - ConnectionFileName = ConnectionFileName, ConnectionList = ConnectionList, ContainerList = ContainerList, RootTreeNode = RootTreeNode, diff --git a/mRemoteV1/Config/Connections/XmlConnectionsLoader.cs b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs similarity index 88% rename from mRemoteV1/Config/Connections/XmlConnectionsLoader.cs rename to mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs index c4a59a123..2c5a74771 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using System.IO; using System.Security; using System.Windows.Forms; using System.Xml; @@ -14,7 +13,6 @@ using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Connection.Protocol.VNC; using mRemoteNG.Container; using mRemoteNG.Messages; -using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; @@ -24,20 +22,25 @@ using mRemoteNG.UI.TaskDialog; namespace mRemoteNG.Config.Connections { - public class XmlConnectionsLoader + public class XmlConnectionsDeserializer { private XmlDocument _xmlDocument; private double _confVersion; private SecureString _pW = GeneralAppInfo.EncryptionKey; private ContainerInfo _previousContainer; + private ConnectionsDecryptor _decryptor = new ConnectionsDecryptor(); + //TODO find way to inject data source info + private string ConnectionFileName = ""; - - - public string ConnectionFileName { get; set; } public TreeNode RootTreeNode { get; set; } public ConnectionList ConnectionList { get; set; } public ContainerList ContainerList { get; set; } + public XmlConnectionsDeserializer(string xml) + { + LoadXmlConnectionData(xml); + } + public void LoadFromXml(bool import) { @@ -45,16 +48,24 @@ namespace mRemoteNG.Config.Connections { if (!import) Runtime.IsConnectionsFileLoaded = false; - // SECTION 1. Create a DOM Document and load the XML data into it. - LoadXmlConnectionData(); ValidateConnectionFileVersion(); // SECTION 2. Initialize the treeview control. var rootInfo = InitializeRootNode(); - if (!ConnectionsFileIsAuthentic(rootInfo)) return; + if (_confVersion > 1.3) + { + var protectedString = _xmlDocument.DocumentElement?.Attributes["Protected"].Value; + if (!_decryptor.ConnectionsFileIsAuthentic(protectedString, rootInfo)) + { + mRemoteNG.Settings.Default.LoadConsFromCustomLocation = false; + mRemoteNG.Settings.Default.CustomConsPath = ""; + RootTreeNode.Remove(); + return; + } + } if (import && !IsExportFile()) { @@ -89,20 +100,6 @@ namespace mRemoteNG.Config.Connections } } - private bool ConnectionsFileIsAuthentic(RootNodeInfo rootInfo) - { - if (!(_confVersion > 1.3)) return true; - var protectedString = _xmlDocument.DocumentElement.Attributes["Protected"].Value; - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - var connectionsFileIsNotEncrypted = cryptographyProvider.Decrypt(protectedString, _pW) == "ThisIsNotProtected"; - if (connectionsFileIsNotEncrypted) return true; - if (Authenticate(protectedString, false, rootInfo)) return true; - mRemoteNG.Settings.Default.LoadConsFromCustomLocation = false; - mRemoteNG.Settings.Default.CustomConsPath = ""; - RootTreeNode.Remove(); - return false; - } - private void OpenConnectionsFromLastSession() { if (!mRemoteNG.Settings.Default.OpenConsFromLastSession || mRemoteNG.Settings.Default.NoReconnect) return; @@ -514,14 +511,12 @@ namespace mRemoteNG.Config.Connections return rootInfo; } - private void LoadXmlConnectionData() + private void LoadXmlConnectionData(string connections) { - var connections = DecryptCompleteFile(); + connections = _decryptor.DecryptConnections(connections); _xmlDocument = new XmlDocument(); if (connections != "") _xmlDocument.LoadXml(connections); - else - _xmlDocument.Load(ConnectionFileName); } private void ValidateConnectionFileVersion() @@ -562,84 +557,5 @@ namespace mRemoteNG.Config.Connections } Windows.treeForm.tvConnections.SelectedNode = treeNode; } - - private string DecryptCompleteFile() - { - var sRd = new StreamReader(ConnectionFileName); - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - var strCons = ""; - strCons = sRd.ReadToEnd(); - sRd.Close(); - - if (string.IsNullOrEmpty(strCons)) return ""; - var strDecr = ""; - bool notDecr; - - if (strCons.Contains("")) - { - strDecr = strCons; - return strDecr; - } - - try - { - strDecr = cryptographyProvider.Decrypt(strCons, _pW); - notDecr = strDecr == strCons; - } - catch (Exception) - { - notDecr = true; - } - - if (notDecr) - { - if (Authenticate(strCons, true)) - { - strDecr = cryptographyProvider.Decrypt(strCons, _pW); - notDecr = false; - } - - if (notDecr == false) - return strDecr; - } - else - { - return strDecr; - } - - return ""; - } - - private bool Authenticate(string value, bool compareToOriginalValue, RootNodeInfo rootInfo = null) - { - var passwordName = ""; - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - passwordName = Path.GetFileName(ConnectionFileName); - - if (compareToOriginalValue) - { - while (cryptographyProvider.Decrypt(value, _pW) == value) - { - _pW = Tools.MiscTools.PasswordDialog(passwordName, false); - if (_pW.Length == 0) - return false; - } - } - else - { - while (cryptographyProvider.Decrypt(value, _pW) != "ThisIsProtected") - { - _pW = Tools.MiscTools.PasswordDialog(passwordName, false); - if (_pW.Length == 0) - return false; - } - - if (rootInfo == null) return true; - rootInfo.Password = true; - rootInfo.PasswordString = _pW.ConvertToUnsecureString(); - } - - return true; - } } } \ No newline at end of file diff --git a/mRemoteV1/Config/FileDataProvider.cs b/mRemoteV1/Config/FileDataProvider.cs new file mode 100644 index 000000000..ac939d6a3 --- /dev/null +++ b/mRemoteV1/Config/FileDataProvider.cs @@ -0,0 +1,24 @@ +using System.IO; + +namespace mRemoteNG.Config +{ + public class FileDataProvider : IDataProvider + { + public string FilePath { get; set; } + + public FileDataProvider(string filePath) + { + FilePath = filePath; + } + + public string Load() + { + return File.ReadAllText(FilePath); + } + + public void Save(string content) + { + File.WriteAllText(FilePath, content); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/IDataProvider.cs b/mRemoteV1/Config/IDataProvider.cs new file mode 100644 index 000000000..4f464478d --- /dev/null +++ b/mRemoteV1/Config/IDataProvider.cs @@ -0,0 +1,10 @@ + +namespace mRemoteNG.Config +{ + public interface IDataProvider + { + string Load(); + + void Save(string contents); + } +} \ No newline at end of file diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index 8d3a3cce0..7bd6ab407 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -12,19 +12,14 @@ namespace mRemoteNG.Tree { private static TreeNode SetNodeToolTip_old_node; private static TreeNode treeNodeToBeSelected; - private static TreeView _TreeView; - public static TreeView TreeView - { - get { return _TreeView; } - set { _TreeView = value; } - } + public static TreeView TreeView { get; set; } public static TreeNode SelectedNode { get { - return _TreeView.SelectedNode; + return TreeView.SelectedNode; } set { @@ -142,7 +137,7 @@ namespace mRemoteNG.Tree { if (!Settings.Default.ShowDescriptionTooltipsInTree) return; //Find the node under the mouse. - TreeNode new_node = _TreeView.GetNodeAt(e.X, e.Y); + TreeNode new_node = TreeView.GetNodeAt(e.X, e.Y); if (new_node == null || new_node.Equals(SetNodeToolTip_old_node)) { return; @@ -152,14 +147,14 @@ namespace mRemoteNG.Tree //See if we have a node. if (SetNodeToolTip_old_node == null) { - tTip.SetToolTip(_TreeView, ""); + tTip.SetToolTip(TreeView, ""); } else { //Get this node's object data. if (ConnectionTreeNode.GetNodeType(SetNodeToolTip_old_node) == TreeNodeType.Connection) { - tTip.SetToolTip(_TreeView, ((ConnectionInfo) SetNodeToolTip_old_node.Tag).Description); + tTip.SetToolTip(TreeView, ((ConnectionInfo) SetNodeToolTip_old_node.Tag).Description); } } } @@ -362,17 +357,17 @@ namespace mRemoteNG.Tree } } - private delegate void SelectNodeCB(); + private delegate void SelectNodeDelegate(); private static void SelectNode() { - if (_TreeView.InvokeRequired) + if (TreeView.InvokeRequired) { - SelectNodeCB d = SelectNode; - _TreeView.Invoke(d); + SelectNodeDelegate d = SelectNode; + TreeView.Invoke(d); } else { - _TreeView.SelectedNode = treeNodeToBeSelected; + TreeView.SelectedNode = treeNodeToBeSelected; } } } diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 485ade318..ae78029f9 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,15 +127,18 @@ + + + - + From 6e221e753b3c12ce456aad3a8659069d25183682 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 17 Aug 2016 15:12:48 -0600 Subject: [PATCH 003/338] code cleanup --- .../Connections/XmlConnectionsDeserializer.cs | 97 +++++++++---------- 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs index 2c5a74771..954d2a2f6 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs @@ -39,8 +39,44 @@ namespace mRemoteNG.Config.Connections public XmlConnectionsDeserializer(string xml) { LoadXmlConnectionData(xml); + ValidateConnectionFileVersion(); } + private void LoadXmlConnectionData(string connections) + { + connections = _decryptor.DecryptConnections(connections); + _xmlDocument = new XmlDocument(); + if (connections != "") + _xmlDocument.LoadXml(connections); + } + + private void ValidateConnectionFileVersion() + { + if (_xmlDocument.DocumentElement != null && _xmlDocument.DocumentElement.HasAttribute("ConfVersion")) + _confVersion = Convert.ToDouble(_xmlDocument.DocumentElement.Attributes["ConfVersion"].Value.Replace(",", "."), + CultureInfo.InvariantCulture); + else + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strOldConffile); + + const double maxSupportedConfVersion = 2.5; + if (!(_confVersion > maxSupportedConfVersion)) return; + CTaskDialog.ShowTaskDialogBox( + frmMain.Default, + Application.ProductName, + "Incompatible connection file format", + $"The format of this connection file is not supported. Please upgrade to a newer version of {Application.ProductName}.", + string.Format("{1}{0}File Format Version: {2}{0}Highest Supported Version: {3}", Environment.NewLine, + ConnectionFileName, _confVersion, maxSupportedConfVersion), + "", + "", + "", + "", + ETaskDialogButtons.Ok, + ESysIcons.Error, + ESysIcons.Error + ); + throw (new Exception($"Incompatible connection file format (file format version {_confVersion}).")); + } public void LoadFromXml(bool import) { @@ -49,9 +85,6 @@ namespace mRemoteNG.Config.Connections if (!import) Runtime.IsConnectionsFileLoaded = false; - // SECTION 1. Create a DOM Document and load the XML data into it. - ValidateConnectionFileVersion(); - // SECTION 2. Initialize the treeview control. var rootInfo = InitializeRootNode(); @@ -87,7 +120,6 @@ namespace mRemoteNG.Config.Connections //open connections from last mremote session OpenConnectionsFromLastSession(); - if (!import) Runtime.IsConnectionsFileLoaded = true; @@ -100,16 +132,6 @@ namespace mRemoteNG.Config.Connections } } - private void OpenConnectionsFromLastSession() - { - if (!mRemoteNG.Settings.Default.OpenConsFromLastSession || mRemoteNG.Settings.Default.NoReconnect) return; - foreach (ConnectionInfo conI in ConnectionList) - { - if (conI.PleaseConnect) - Runtime.OpenConnection(conI); - } - } - private void PopulateTreeview() { Windows.treeForm.tvConnections.BeginUpdate(); @@ -475,7 +497,6 @@ namespace mRemoteNG.Config.Connections return connectionInfo; } - private void ExpandPreviouslyOpenedFolders() { foreach (ContainerInfo contI in ContainerList) @@ -511,42 +532,6 @@ namespace mRemoteNG.Config.Connections return rootInfo; } - private void LoadXmlConnectionData(string connections) - { - connections = _decryptor.DecryptConnections(connections); - _xmlDocument = new XmlDocument(); - if (connections != "") - _xmlDocument.LoadXml(connections); - } - - private void ValidateConnectionFileVersion() - { - if (_xmlDocument.DocumentElement.HasAttribute("ConfVersion")) - _confVersion = Convert.ToDouble(_xmlDocument.DocumentElement.Attributes["ConfVersion"].Value.Replace(",", "."), - CultureInfo.InvariantCulture); - else - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strOldConffile); - - const double maxSupportedConfVersion = 2.5; - if (!(_confVersion > maxSupportedConfVersion)) return; - CTaskDialog.ShowTaskDialogBox( - frmMain.Default, - Application.ProductName, - "Incompatible connection file format", - $"The format of this connection file is not supported. Please upgrade to a newer version of {Application.ProductName}.", - string.Format("{1}{0}File Format Version: {2}{0}Highest Supported Version: {3}", Environment.NewLine, - ConnectionFileName, _confVersion, maxSupportedConfVersion), - "", - "", - "", - "", - ETaskDialogButtons.Ok, - ESysIcons.Error, - ESysIcons.Error - ); - throw (new Exception($"Incompatible connection file format (file format version {_confVersion}).")); - } - private delegate void SetSelectedNodeDelegate(TreeNode treeNode); private static void SetSelectedNode(TreeNode treeNode) { @@ -557,5 +542,15 @@ namespace mRemoteNG.Config.Connections } Windows.treeForm.tvConnections.SelectedNode = treeNode; } + + private void OpenConnectionsFromLastSession() + { + if (!mRemoteNG.Settings.Default.OpenConsFromLastSession || mRemoteNG.Settings.Default.NoReconnect) return; + foreach (ConnectionInfo conI in ConnectionList) + { + if (conI.PleaseConnect) + Runtime.OpenConnection(conI); + } + } } } \ No newline at end of file From 23dcb3e823a7c7aa8ca1193ab039700026f1450a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 19 Aug 2016 12:45:52 -0600 Subject: [PATCH 004/338] Renamed method XmlConnectionsDeserializer.LoadFromXml to "Deserialize" --- mRemoteV1/Config/Connections/ConnectionsLoader.cs | 4 ++-- .../Config/Connections/XmlConnectionsDeserializer.cs | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 270850945..a7987a568 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -47,13 +47,13 @@ namespace mRemoteNG.Config.Connections { var dataProvider = new FileDataProvider(ConnectionFileName); var xmlString = dataProvider.Load(); - var xmlConnectionsLoader = new XmlConnectionsDeserializer(xmlString) + var xmlConnectionsDeserializer = new XmlConnectionsDeserializer(xmlString) { ConnectionList = ConnectionList, ContainerList = ContainerList, RootTreeNode = RootTreeNode, }; - xmlConnectionsLoader.LoadFromXml(import); + xmlConnectionsDeserializer.Deserialize(import); } frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; diff --git a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs index 954d2a2f6..793964b9d 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs @@ -78,7 +78,7 @@ namespace mRemoteNG.Config.Connections throw (new Exception($"Incompatible connection file format (file format version {_confVersion}).")); } - public void LoadFromXml(bool import) + public void Deserialize(bool import) { try { @@ -135,13 +135,13 @@ namespace mRemoteNG.Config.Connections private void PopulateTreeview() { Windows.treeForm.tvConnections.BeginUpdate(); - AddNodeFromXml(_xmlDocument.DocumentElement, RootTreeNode); + AddNodesFromXmlRecursive(_xmlDocument.DocumentElement, RootTreeNode); RootTreeNode.Expand(); ExpandPreviouslyOpenedFolders(); Windows.treeForm.tvConnections.EndUpdate(); } - private void AddNodeFromXml(XmlNode parentXmlNode, TreeNode parentTreeNode) + private void AddNodesFromXmlRecursive(XmlNode parentXmlNode, TreeNode parentTreeNode) { try { @@ -160,7 +160,7 @@ namespace mRemoteNG.Config.Connections else if (nodeType == TreeNodeType.Container) AddContainerToList(xmlNode, treeNode); - AddNodeFromXml(xmlNode, treeNode); + AddNodesFromXmlRecursive(xmlNode, treeNode); } } else From 3baaf8bda496b8cf54a662d2cf7376e2b81645d8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 19 Aug 2016 12:46:49 -0600 Subject: [PATCH 005/338] Began building logic to build a TreeView from a connection tree model --- .../UI/ConnectionTreeViewBuilderTests.cs | 195 ++++++++++++++++++ mRemoteNGTests/mRemoteNGTests.csproj | 1 + mRemoteV1/Tree/ConnectionTreeModel.cs | 16 ++ mRemoteV1/UI/ConnectionTreeViewBuilder.cs | 85 ++++++++ mRemoteV1/mRemoteV1.csproj | 2 + 5 files changed, 299 insertions(+) create mode 100644 mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs create mode 100644 mRemoteV1/Tree/ConnectionTreeModel.cs create mode 100644 mRemoteV1/UI/ConnectionTreeViewBuilder.cs diff --git a/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs new file mode 100644 index 000000000..16755a75c --- /dev/null +++ b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs @@ -0,0 +1,195 @@ +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; +using mRemoteNG.UI; +using NUnit.Framework; + + +namespace mRemoteNGTests.UI +{ + public class ConnectionTreeViewBuilderTests + { + private ConnectionTreeModel _connectionTreeModel; + private ConnectionTreeViewBuilder _connectionTreeViewBuilder; + + [SetUp] + public void Setup() + { + _connectionTreeModel = new ConnectionTreeModel(); + _connectionTreeViewBuilder = new ConnectionTreeViewBuilder(_connectionTreeModel); + } + + [TearDown] + public void Teardown() + { + _connectionTreeModel = null; + _connectionTreeViewBuilder = null; + } + + [Test] + public void RootNodeGetsAddedToTreeView() + { + CreateRootNode(); + _connectionTreeViewBuilder.Build(); + var tree = _connectionTreeViewBuilder.TreeView; + Assert.That(tree.Nodes.Count, Is.EqualTo(1)); + } + + [Test] + public void BuildTreeWithSingleConnection() + { + /** + * Root + * -- con1 + */ + var root = CreateRootNode(); + var con1 = new ConnectionInfo(); + root.Add(con1); + _connectionTreeViewBuilder.Build(); + var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(con1)); + } + + [Test] + public void BuildTreeWithSingleFolder() + { + /** + * Root + * -- folder1 + */ + var root = CreateRootNode(); + var folder1 = new ContainerInfo(); + root.Add(folder1); + _connectionTreeViewBuilder.Build(); + var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); + } + + [Test] + public void BuildTreeWithTwoConnectionsUnderRoot() + { + /** + * Root + * -- con1 + * -- con2 + */ + var root = CreateRootNode(); + var con1 = new ConnectionInfo(); + var con2 = new ConnectionInfo(); + root.AddRange(new []{con1, con2}); + _connectionTreeViewBuilder.Build(); + var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + Assert.That(GetTreeNodeTags(rootTreeNode.Nodes), Is.EquivalentTo(new[] { con1, con2 })); + } + + [Test] + public void BuildTreeWithConnectionInFolder() + { + /* + * Root + * -- folder1 + * ---- con1 + */ + var root = CreateRootNode(); + var folder1 = new ContainerInfo(); + var con1 = new ConnectionInfo(); + root.Add(folder1); + folder1.Add(con1); + _connectionTreeViewBuilder.Build(); + var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); + Assert.That(rootTreeNode.Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); + } + + [Test] + public void BuildTreeWithTwoFoldersAndFolderOneHasAConnection() + { + /** + * Root + * -- folder1 + * ---- con1 + * -- folder2 + */ + var root = CreateRootNode(); + var folder1 = new ContainerInfo(); + var con1 = new ConnectionInfo(); + var folder2 = new ContainerInfo(); + root.Add(folder1); + folder1.Add(con1); + root.Add(folder2); + _connectionTreeViewBuilder.Build(); + var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); + Assert.That(rootTreeNode.Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); + Assert.That(rootTreeNode.Nodes[1].Tag, Is.EqualTo(folder2)); + } + + [Test] + public void BuildTreeWithConnectionNestedTwoLevelsDeep() + { + /** + * Root + * -- folder1 + * ---- folder2 + * ------ con1 + */ + var root = CreateRootNode(); + var folder1 = new ContainerInfo(); + var folder2 = new ContainerInfo(); + var con1 = new ConnectionInfo(); + root.Add(folder1); + folder1.Add(folder2); + folder2.Add(con1); + _connectionTreeViewBuilder.Build(); + var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); + } + + [Test] + public void BuildTreeWithMultipleDeepRecursion() + { + /** + * Root + * -- folder1 + * ---- folder2 + * ------ con1 + * -- folder3 + * ---- folder4 + * ------ con2 + */ + var root = CreateRootNode(); + var folder1 = new ContainerInfo(); + var folder2 = new ContainerInfo(); + var con1 = new ConnectionInfo(); + var folder3 = new ContainerInfo(); + var folder4 = new ContainerInfo(); + var con2 = new ConnectionInfo(); + root.Add(folder1); + folder1.Add(folder2); + folder2.Add(con1); + root.Add(folder3); + folder3.Add(folder4); + folder4.Add(con2); + _connectionTreeViewBuilder.Build(); + var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); + Assert.That(rootTreeNode.Nodes[1].Nodes[0].Nodes[0].Tag, Is.EqualTo(con2)); + } + + private IEnumerable GetTreeNodeTags(TreeNodeCollection treeNodes) + { + return (from TreeNode node in treeNodes select (ConnectionInfo) node.Tag).ToList(); + } + + private RootNodeInfo CreateRootNode() + { + var root = new RootNodeInfo(RootNodeType.Connection); + _connectionTreeModel.AddRootNode(root); + return root; + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index cfc74e278..8da618eb3 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -117,6 +117,7 @@ + Form diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs new file mode 100644 index 000000000..aa669b4a8 --- /dev/null +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using mRemoteNG.Container; + + +namespace mRemoteNG.Tree +{ + public class ConnectionTreeModel + { + public List RootNodes { get; } = new List(); + + public void AddRootNode(ContainerInfo rootNode) + { + RootNodes.Add(rootNode); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs new file mode 100644 index 000000000..d59f7b38c --- /dev/null +++ b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs @@ -0,0 +1,85 @@ +using System.Linq; +using System.Windows.Forms; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.UI +{ + public class ConnectionTreeViewBuilder + { + private ConnectionTreeModel _connectionTreeModel; + + public TreeView TreeView { get; private set; } + public ConnectionList ConnectionList { get; set; } + public ContainerList ContainerList { get; set; } + + public ConnectionTreeViewBuilder(ConnectionTreeModel connectionTreeModel) + { + _connectionTreeModel = connectionTreeModel; + TreeView = new TreeView(); + ConnectionList = new ConnectionList(); + ContainerList = new ContainerList(); + } + + public void Build() + { + var rootNodeInfo = _connectionTreeModel.RootNodes.First(a => a is RootNodeInfo); + BuildTreeViewFromConnectionTree(rootNodeInfo, InitRootNode((RootNodeInfo)rootNodeInfo)); + } + + private TreeNode InitRootNode(RootNodeInfo rootNodeInfo) + { + var rootNode = new TreeNode(rootNodeInfo.Name); + TreeView.Nodes.Add(rootNode); + return rootNode; + } + + private void BuildTreeViewFromConnectionTree(ContainerInfo parentContainer, TreeNode parentTreeNode) + { + if (parentContainer.Children.Any()) + { + foreach (var child in parentContainer.Children) + { + var treeNode = new TreeNode(child.Name); + parentTreeNode.Nodes.Add(treeNode); + + if (child is ContainerInfo) + { + AddContainerToList((ContainerInfo) child, treeNode); + BuildTreeViewFromConnectionTree((ContainerInfo)child, treeNode); + } + else + { + AddConnectionToList(child, treeNode); + } + } + } + else + { + + //parentTreeNode.Text = parentContainer.Name; + } + } + + private void AddConnectionToList(ConnectionInfo connectionInfo, TreeNode treeNode) + { + connectionInfo.TreeNode = treeNode; + ConnectionList.Add(connectionInfo); + treeNode.Tag = connectionInfo; + treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; + treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; + } + + private void AddContainerToList(ContainerInfo containerInfo, TreeNode treeNode) + { + containerInfo.TreeNode = treeNode; + ContainerList.Add(containerInfo); + treeNode.Tag = containerInfo; + treeNode.ImageIndex = (int)TreeImageType.Container; + treeNode.SelectedImageIndex = (int)TreeImageType.Container; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index ae78029f9..7722da455 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -186,9 +186,11 @@ + + Component From 7a366de0e366b56ebcd51ff2438f1dc65241b1ad Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 19 Aug 2016 12:51:01 -0600 Subject: [PATCH 006/338] minor code cleanup --- mRemoteV1/UI/ConnectionTreeViewBuilder.cs | 31 +++++++++-------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs index d59f7b38c..007afe884 100644 --- a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs +++ b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs @@ -39,28 +39,21 @@ namespace mRemoteNG.UI private void BuildTreeViewFromConnectionTree(ContainerInfo parentContainer, TreeNode parentTreeNode) { - if (parentContainer.Children.Any()) + if (!parentContainer.Children.Any()) return; + foreach (var child in parentContainer.Children) { - foreach (var child in parentContainer.Children) + var treeNode = new TreeNode(child.Name); + parentTreeNode.Nodes.Add(treeNode); + + if (child is ContainerInfo) { - var treeNode = new TreeNode(child.Name); - parentTreeNode.Nodes.Add(treeNode); - - if (child is ContainerInfo) - { - AddContainerToList((ContainerInfo) child, treeNode); - BuildTreeViewFromConnectionTree((ContainerInfo)child, treeNode); - } - else - { - AddConnectionToList(child, treeNode); - } + AddContainerToList((ContainerInfo) child, treeNode); + BuildTreeViewFromConnectionTree((ContainerInfo)child, treeNode); + } + else + { + AddConnectionToList(child, treeNode); } - } - else - { - - //parentTreeNode.Text = parentContainer.Name; } } From 003793b082dd032660b62acba18ef6cccd1d229b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 19 Aug 2016 14:32:55 -0600 Subject: [PATCH 007/338] Removed dependency on GeneralAppInfo class to improved testability --- mRemoteV1/Config/Connections/ConnectionsDecryptor.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs b/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs index 19d4b349b..22d1e397c 100644 --- a/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs +++ b/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs @@ -1,6 +1,5 @@ using System; using System.Security; -using mRemoteNG.App.Info; using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree.Root; @@ -11,7 +10,7 @@ namespace mRemoteNG.Config.Connections public class ConnectionsDecryptor { private readonly ICryptographyProvider _cryptographyProvider; - private SecureString _pW = GeneralAppInfo.EncryptionKey; + private SecureString _pW = "mR3m".ConvertToSecureString(); public ConnectionsDecryptor() { From ccaa70c1a41af1638802dd0af7ee8b683b1e71ac Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 19 Aug 2016 15:28:12 -0600 Subject: [PATCH 008/338] XmlConnectionDeserializer now creates a connectiontreemodel which is turned into a treeview by ConnectionTreeViewBuilder --- .../XmlConnectionsDeserializerTests.cs | 101 +++++++++++++ .../Properties/Resources.Designer.cs | 74 ++++++++++ mRemoteNGTests/Properties/Resources.resx | 124 ++++++++++++++++ mRemoteNGTests/Resources/TestConfCons.xml | 27 ++++ mRemoteNGTests/mRemoteNGTests.csproj | 13 ++ .../Config/Connections/ConnectionsLoader.cs | 16 +- .../Connections/XmlConnectionsDeserializer.cs | 138 ++++++------------ mRemoteV1/UI/ConnectionTreeViewBuilder.cs | 1 + mRemoteV1/UI/Forms/frmMain.cs | 11 +- 9 files changed, 405 insertions(+), 100 deletions(-) create mode 100644 mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs create mode 100644 mRemoteNGTests/Properties/Resources.Designer.cs create mode 100644 mRemoteNGTests/Properties/Resources.resx create mode 100644 mRemoteNGTests/Resources/TestConfCons.xml diff --git a/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs b/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs new file mode 100644 index 000000000..07d630e21 --- /dev/null +++ b/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs @@ -0,0 +1,101 @@ +using System.Collections.Generic; +using System.Linq; +using mRemoteNG.Config.Connections; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNGTests.Properties; +using NUnit.Framework; + + +namespace mRemoteNGTests.Config.Connections +{ + public class XmlConnectionsDeserializerTests + { + private XmlConnectionsDeserializer _xmlConnectionsDeserializer; + private ConnectionTreeModel _connectionTreeModel; + + [SetUp] + public void Setup() + { + _xmlConnectionsDeserializer = new XmlConnectionsDeserializer(Resources.TestConfCons); + _connectionTreeModel = _xmlConnectionsDeserializer.Deserialize(); + } + + [TearDown] + public void Teardown() + { + _xmlConnectionsDeserializer = null; + _connectionTreeModel = null; + } + + [Test] + public void DeserializingCreatesRootNode() + { + Assert.That(_connectionTreeModel.RootNodes, Is.Not.Empty); + } + + [Test] + public void RootNodeHasThreeChildren() + { + var connectionRoot = _connectionTreeModel.RootNodes[0]; + Assert.That(connectionRoot.Children.Count, Is.EqualTo(3)); + } + + [Test] + public void RootContainsFolder1() + { + var connectionRoot = _connectionTreeModel.RootNodes[0]; + Assert.That(ContainsNodeNamed("Folder1", connectionRoot.Children), Is.True); + } + + [Test] + public void Folder1ContainsThreeConnections() + { + var connectionRoot = _connectionTreeModel.RootNodes[0]; + var folder1 = GetFolderNamed("Folder1", connectionRoot.Children); + var folder1ConnectionCount = folder1?.Children.Count(node => !(node is ContainerInfo)); + Assert.That(folder1ConnectionCount, Is.EqualTo(3)); + } + + [Test] + public void Folder2ContainsThreeNodes() + { + var connectionRoot = _connectionTreeModel.RootNodes[0]; + var folder2 = GetFolderNamed("Folder2", connectionRoot.Children); + var folder1Count = folder2?.Children.Count(); + Assert.That(folder1Count, Is.EqualTo(3)); + } + + [Test] + public void Folder21HasTwoNodes() + { + var connectionRoot = _connectionTreeModel.RootNodes[0]; + var folder2 = GetFolderNamed("Folder2", connectionRoot.Children); + var folder21 = GetFolderNamed("Folder2.1", folder2.Children); + Assert.That(folder21.Children.Count, Is.EqualTo(2)); + } + + [Test] + public void Folder211HasOneConnection() + { + var connectionRoot = _connectionTreeModel.RootNodes[0]; + var folder2 = GetFolderNamed("Folder2", connectionRoot.Children); + var folder21 = GetFolderNamed("Folder2.1", folder2.Children); + var folder211 = GetFolderNamed("Folder2.1.1", folder21.Children); + var connectionCount = folder211.Children.Count(node => !(node is ContainerInfo)); + Assert.That(connectionCount, Is.EqualTo(1)); + } + + private bool ContainsNodeNamed(string name, IEnumerable list) + { + return list.Any(node => node.Name == name); + } + + private ContainerInfo GetFolderNamed(string name, IEnumerable list) + { + var folder = list.First(node => (node is ContainerInfo && node.Name == name)) as ContainerInfo; + return folder; + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/Properties/Resources.Designer.cs b/mRemoteNGTests/Properties/Resources.Designer.cs new file mode 100644 index 000000000..fac011306 --- /dev/null +++ b/mRemoteNGTests/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace mRemoteNGTests.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("mRemoteNGTests.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<Connections Name="Connections" Export="False" Protected="95syzRuZ4mRxpNkZQzoyX8SDpQXLyMq3GncO8o4SyTBoYvn3TAWgn05ZEU2DrjkM" ConfVersion="2.5"> + /// <Node Name="Folder1" Type="Container" Expanded="True" Descr="" Icon="mRemoteNG" Panel="General" Username="" Domain="" Password="" Hostname="" Protocol="ICA" PuttySession="Default Settings" Port="1494" ConnectToConsole="False" UseCredSsp="True" RenderingEngine="IE" ICAEncryptionStrength="Encr128Bit" RDPAuthenticationLevel=" [rest of string was truncated]";. + /// + internal static string TestConfCons { + get { + return ResourceManager.GetString("TestConfCons", resourceCulture); + } + } + } +} diff --git a/mRemoteNGTests/Properties/Resources.resx b/mRemoteNGTests/Properties/Resources.resx new file mode 100644 index 000000000..2710c157f --- /dev/null +++ b/mRemoteNGTests/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\TestConfCons.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/TestConfCons.xml b/mRemoteNGTests/Resources/TestConfCons.xml new file mode 100644 index 000000000..22d6627c0 --- /dev/null +++ b/mRemoteNGTests/Resources/TestConfCons.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 8da618eb3..a276ae235 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -102,6 +102,7 @@ + @@ -113,6 +114,11 @@ + + True + True + Resources.resx + @@ -139,10 +145,17 @@ + + ResXFileCodeGenerator + Resources.Designer.cs + TestForm.cs + + + diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index a7987a568..cc2b9add8 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -1,6 +1,9 @@ +using System.Linq; using System.Windows.Forms; +using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Container; +using mRemoteNG.UI; using mRemoteNG.UI.Forms; @@ -50,11 +53,16 @@ namespace mRemoteNG.Config.Connections var xmlConnectionsDeserializer = new XmlConnectionsDeserializer(xmlString) { ConnectionList = ConnectionList, - ContainerList = ContainerList, - RootTreeNode = RootTreeNode, + ContainerList = ContainerList }; - xmlConnectionsDeserializer.Deserialize(import); - } + var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(import); + var connectionTreeViewBuilder = new ConnectionTreeViewBuilder(connectionTreeModel); + connectionTreeViewBuilder.Build(); + var treeNodes = new TreeNode[connectionTreeViewBuilder.TreeView.Nodes.Count]; + connectionTreeViewBuilder.TreeView.Nodes.CopyTo(treeNodes, 0); + Windows.treeForm.tvConnections.Nodes.AddRange(treeNodes); + //Windows.treeForm.InitialRefresh(); + } frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; frmMain.Default.ConnectionsFileName = ConnectionFileName; diff --git a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs index 793964b9d..58a572bea 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs @@ -4,7 +4,6 @@ using System.Security; using System.Windows.Forms; using System.Xml; using mRemoteNG.App; -using mRemoteNG.App.Info; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.Http; @@ -13,6 +12,7 @@ using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Connection.Protocol.VNC; using mRemoteNG.Container; using mRemoteNG.Messages; +using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; @@ -26,13 +26,12 @@ namespace mRemoteNG.Config.Connections { private XmlDocument _xmlDocument; private double _confVersion; - private SecureString _pW = GeneralAppInfo.EncryptionKey; - private ContainerInfo _previousContainer; - private ConnectionsDecryptor _decryptor = new ConnectionsDecryptor(); + private readonly SecureString _pW = "mR3m".ConvertToSecureString(); + private readonly ConnectionsDecryptor _decryptor = new ConnectionsDecryptor(); //TODO find way to inject data source info private string ConnectionFileName = ""; - public TreeNode RootTreeNode { get; set; } + //public TreeNode RootTreeNode { get; set; } public ConnectionList ConnectionList { get; set; } public ContainerList ContainerList { get; set; } @@ -40,6 +39,8 @@ namespace mRemoteNG.Config.Connections { LoadXmlConnectionData(xml); ValidateConnectionFileVersion(); + ConnectionList = new ConnectionList(); + ContainerList = new ContainerList(); } private void LoadXmlConnectionData(string connections) @@ -78,7 +79,7 @@ namespace mRemoteNG.Config.Connections throw (new Exception($"Incompatible connection file format (file format version {_confVersion}).")); } - public void Deserialize(bool import) + public ConnectionTreeModel Deserialize(bool import = false) { try { @@ -87,6 +88,8 @@ namespace mRemoteNG.Config.Connections // SECTION 2. Initialize the treeview control. var rootInfo = InitializeRootNode(); + var connectionTreeModel = new ConnectionTreeModel(); + connectionTreeModel.AddRootNode(rootInfo); if (_confVersion > 1.3) { @@ -95,34 +98,36 @@ namespace mRemoteNG.Config.Connections { mRemoteNG.Settings.Default.LoadConsFromCustomLocation = false; mRemoteNG.Settings.Default.CustomConsPath = ""; - RootTreeNode.Remove(); - return; + return null; } } if (import && !IsExportFile()) { Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strCannotImportNormalSessionFile); - return; + return null; } - if (!IsExportFile()) - { - RootTreeNode.ImageIndex = (int)TreeImageType.Root; - RootTreeNode.SelectedImageIndex = (int)TreeImageType.Root; - } + //if (!IsExportFile()) + //{ + // RootTreeNode.ImageIndex = (int)TreeImageType.Root; + // RootTreeNode.SelectedImageIndex = (int)TreeImageType.Root; + //} // SECTION 3. Populate the TreeView with the DOM nodes. - PopulateTreeview(); - RootTreeNode.EnsureVisible(); - Windows.treeForm.InitialRefresh(); - SetSelectedNode(RootTreeNode); + //PopulateTreeview(); + AddNodesFromXmlRecursive(_xmlDocument.DocumentElement, rootInfo); + //RootTreeNode.EnsureVisible(); + //Windows.treeForm.InitialRefresh(); + //SetSelectedNode(RootTreeNode); //open connections from last mremote session - OpenConnectionsFromLastSession(); + //OpenConnectionsFromLastSession(); if (!import) Runtime.IsConnectionsFileLoaded = true; + + return connectionTreeModel; } catch (Exception ex) { @@ -132,42 +137,34 @@ namespace mRemoteNG.Config.Connections } } - private void PopulateTreeview() - { - Windows.treeForm.tvConnections.BeginUpdate(); - AddNodesFromXmlRecursive(_xmlDocument.DocumentElement, RootTreeNode); - RootTreeNode.Expand(); - ExpandPreviouslyOpenedFolders(); - Windows.treeForm.tvConnections.EndUpdate(); - } - - private void AddNodesFromXmlRecursive(XmlNode parentXmlNode, TreeNode parentTreeNode) + private void AddNodesFromXmlRecursive(XmlNode parentXmlNode, ContainerInfo parentContainer) { try { - // Loop through the XML nodes until the leaf is reached. - // Add the nodes to the TreeView during the looping process. - if (parentXmlNode.HasChildNodes) + if (!parentXmlNode.HasChildNodes) return; + foreach (XmlNode xmlNode in parentXmlNode.ChildNodes) { - foreach (XmlNode xmlNode in parentXmlNode.ChildNodes) + var nodeType = ConnectionTreeNode.GetNodeTypeFromString(xmlNode.Attributes?["Type"].Value); + + if (nodeType == TreeNodeType.Connection) { - var treeNode = new TreeNode(xmlNode.Attributes?["Name"].Value); - parentTreeNode.Nodes.Add(treeNode); - var nodeType = ConnectionTreeNode.GetNodeTypeFromString(xmlNode.Attributes?["Type"].Value); - - if (nodeType == TreeNodeType.Connection) - AddConnectionToList(xmlNode, treeNode); - else if (nodeType == TreeNodeType.Container) - AddContainerToList(xmlNode, treeNode); - - AddNodesFromXmlRecursive(xmlNode, treeNode); + var connectionInfo = GetConnectionInfoFromXml(xmlNode); + parentContainer.Add(connectionInfo); + ConnectionList.Add(connectionInfo); + } + else if (nodeType == TreeNodeType.Container) + { + var containerInfo = new ContainerInfo(); + + if (_confVersion >= 0.9) + containerInfo.CopyFrom(GetConnectionInfoFromXml(xmlNode)); + if (_confVersion >= 0.8) + containerInfo.IsExpanded = xmlNode.Attributes?["Expanded"].Value == "True"; + + parentContainer.Add(containerInfo); + ContainerList.Add(containerInfo); + AddNodesFromXmlRecursive(xmlNode, containerInfo); } - } - else - { - var nameAttribute = parentXmlNode.Attributes?["Name"]; - var nodeName = nameAttribute?.Value.Trim(); - parentTreeNode.Text = !string.IsNullOrEmpty(nodeName) ? nodeName : parentXmlNode.Name; } } catch (Exception ex) @@ -177,39 +174,6 @@ namespace mRemoteNG.Config.Connections } } - private void AddConnectionToList(XmlNode xmlNode, TreeNode treeNode) - { - var connectionInfo = GetConnectionInfoFromXml(xmlNode); - connectionInfo.TreeNode = treeNode; - connectionInfo.Parent = _previousContainer; - ConnectionList.Add(connectionInfo); - treeNode.Tag = connectionInfo; - treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; - treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; - } - - private void AddContainerToList(XmlNode xmlNode, TreeNode treeNode) - { - var containerInfo = new ContainerInfo(); - - if (_confVersion >= 0.8) - containerInfo.IsExpanded = xmlNode.Attributes?["Expanded"].Value == "True"; - if (_confVersion >= 0.9) - containerInfo.CopyFrom(GetConnectionInfoFromXml(xmlNode)); - - if (treeNode.Parent?.Tag is ContainerInfo) - containerInfo.Parent = (ContainerInfo) treeNode.Parent.Tag; - - containerInfo.TreeNode = treeNode; - containerInfo.Name = xmlNode.Attributes?["Name"].Value; - - _previousContainer = containerInfo; - ContainerList.Add(containerInfo); - treeNode.Tag = containerInfo; - treeNode.ImageIndex = (int) TreeImageType.Container; - treeNode.SelectedImageIndex = (int) TreeImageType.Container; - } - private ConnectionInfo GetConnectionInfoFromXml(XmlNode xxNode) { var connectionInfo = new ConnectionInfo(); @@ -517,18 +481,12 @@ namespace mRemoteNG.Config.Connections private RootNodeInfo InitializeRootNode() { - var rootNodeName = ""; - if (_xmlDocument.DocumentElement.HasAttribute("Name")) - rootNodeName = Convert.ToString(_xmlDocument.DocumentElement.Attributes["Name"].Value.Trim()); - RootTreeNode.Name = !string.IsNullOrEmpty(rootNodeName) ? rootNodeName : _xmlDocument.DocumentElement.Name; - RootTreeNode.Text = RootTreeNode.Name; + var rootNodeName = _xmlDocument.DocumentElement?.Attributes["Name"].Value.Trim(); var rootInfo = new RootNodeInfo(RootNodeType.Connection) { - Name = RootTreeNode.Name, - TreeNode = RootTreeNode + Name = rootNodeName }; - RootTreeNode.Tag = rootInfo; return rootInfo; } diff --git a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs index 007afe884..0051759dc 100644 --- a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs +++ b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs @@ -33,6 +33,7 @@ namespace mRemoteNG.UI private TreeNode InitRootNode(RootNodeInfo rootNodeInfo) { var rootNode = new TreeNode(rootNodeInfo.Name); + rootNode.Expand(); TreeView.Nodes.Add(rootNode); return rootNode; } diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 6ec5da0f4..2b59b1fd6 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -125,8 +125,6 @@ namespace mRemoteNG.UI.Forms private void frmMain_Load(object sender, EventArgs e) { - - // Create gui config load and save objects var settingsLoader = new SettingsLoader(this); settingsLoader.LoadSettings(); @@ -141,9 +139,6 @@ namespace mRemoteNG.UI.Forms Runtime.MessageCollector = new MessageCollector(Windows.errorsForm); Runtime.WindowList = new WindowList(); - Windows.treePanel.Focus(); - ConnectionTree.TreeView = Windows.treeForm.tvConnections; - if (Settings.Default.FirstStart && !Settings.Default.LoadConsFromCustomLocation && !File.Exists(Runtime.GetStartupConnectionFileName())) { Runtime.NewConnections(Runtime.GetStartupConnectionFileName()); @@ -155,7 +150,11 @@ namespace mRemoteNG.UI.Forms Application.Exit(); return ; } - Config.Putty.Sessions.StartWatcher(); + + Windows.treePanel.Focus(); + ConnectionTree.TreeView = Windows.treeForm.tvConnections; + + Config.Putty.Sessions.StartWatcher(); if (Settings.Default.StartupComponentsCheck) { Windows.Show(WindowType.ComponentsCheck); From 020433d7ad8dc9895a4e7a1f98bffe41552af1ed Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 22 Aug 2016 16:04:06 -0600 Subject: [PATCH 009/338] Fixed issue with display of connections tree which was caused by new connection tree builder code --- .../UI/ConnectionTreeViewBuilderTests.cs | 18 ++++++------ mRemoteV1/App/Runtime.cs | 4 +-- .../Config/Connections/ConnectionsLoader.cs | 9 ++---- mRemoteV1/UI/ConnectionTreeViewBuilder.cs | 29 ++++++++++++------- .../Window/ConnectionTreeWindow.Designer.cs | 4 --- 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs index 16755a75c..05dffa1c2 100644 --- a/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs +++ b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs @@ -35,8 +35,8 @@ namespace mRemoteNGTests.UI { CreateRootNode(); _connectionTreeViewBuilder.Build(); - var tree = _connectionTreeViewBuilder.TreeView; - Assert.That(tree.Nodes.Count, Is.EqualTo(1)); + var rootTreeNode = _connectionTreeViewBuilder.RootNode; + Assert.That(rootTreeNode, Is.Not.Null); } [Test] @@ -50,7 +50,7 @@ namespace mRemoteNGTests.UI var con1 = new ConnectionInfo(); root.Add(con1); _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(con1)); } @@ -65,7 +65,7 @@ namespace mRemoteNGTests.UI var folder1 = new ContainerInfo(); root.Add(folder1); _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); } @@ -82,7 +82,7 @@ namespace mRemoteNGTests.UI var con2 = new ConnectionInfo(); root.AddRange(new []{con1, con2}); _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(GetTreeNodeTags(rootTreeNode.Nodes), Is.EquivalentTo(new[] { con1, con2 })); } @@ -100,7 +100,7 @@ namespace mRemoteNGTests.UI root.Add(folder1); folder1.Add(con1); _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); Assert.That(rootTreeNode.Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); } @@ -122,7 +122,7 @@ namespace mRemoteNGTests.UI folder1.Add(con1); root.Add(folder2); _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); Assert.That(rootTreeNode.Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); Assert.That(rootTreeNode.Nodes[1].Tag, Is.EqualTo(folder2)); @@ -145,7 +145,7 @@ namespace mRemoteNGTests.UI folder1.Add(folder2); folder2.Add(con1); _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); } @@ -175,7 +175,7 @@ namespace mRemoteNGTests.UI folder3.Add(folder4); folder4.Add(con2); _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.TreeView.Nodes[0]; + var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); Assert.That(rootTreeNode.Nodes[1].Nodes[0].Nodes[0].Tag, Is.EqualTo(con2)); } diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 60d8a6bd4..77ace4b0d 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -341,9 +341,9 @@ namespace mRemoteNG.App connectionsLoader.PreviousSelected = LastSelected; } - ConnectionTree.ResetTree(); + //ConnectionTree.ResetTree(); - connectionsLoader.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; + //connectionsLoader.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; connectionsLoader.UseDatabase = Settings.Default.UseSQLServer; connectionsLoader.DatabaseHost = Settings.Default.SQLHost; connectionsLoader.DatabaseName = Settings.Default.SQLDatabaseName; diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index cc2b9add8..e3e7d7e50 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -58,17 +58,14 @@ namespace mRemoteNG.Config.Connections var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(import); var connectionTreeViewBuilder = new ConnectionTreeViewBuilder(connectionTreeModel); connectionTreeViewBuilder.Build(); - var treeNodes = new TreeNode[connectionTreeViewBuilder.TreeView.Nodes.Count]; - connectionTreeViewBuilder.TreeView.Nodes.CopyTo(treeNodes, 0); - Windows.treeForm.tvConnections.Nodes.AddRange(treeNodes); - //Windows.treeForm.InitialRefresh(); + connectionTreeViewBuilder.AppendTo(Windows.treeForm.tvConnections); } frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; frmMain.Default.ConnectionsFileName = ConnectionFileName; - + if (!import) - Putty.Sessions.AddSessionsToTree(); + Putty.Sessions.AddSessionsToTree(Windows.treeForm.tvConnections); } } } \ No newline at end of file diff --git a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs index 0051759dc..60f21e7f7 100644 --- a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs +++ b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs @@ -10,32 +10,41 @@ namespace mRemoteNG.UI { public class ConnectionTreeViewBuilder { - private ConnectionTreeModel _connectionTreeModel; + private readonly ConnectionTreeModel _connectionTreeModel; - public TreeView TreeView { get; private set; } + public TreeNode RootNode { get; private set; } public ConnectionList ConnectionList { get; set; } public ContainerList ContainerList { get; set; } public ConnectionTreeViewBuilder(ConnectionTreeModel connectionTreeModel) { _connectionTreeModel = connectionTreeModel; - TreeView = new TreeView(); ConnectionList = new ConnectionList(); ContainerList = new ContainerList(); } + public void AppendTo(TreeView foreignTreeView) + { + foreignTreeView.BeginUpdate(); + foreignTreeView.Nodes.Add(RootNode); + foreignTreeView.EndUpdate(); + } + public void Build() { var rootNodeInfo = _connectionTreeModel.RootNodes.First(a => a is RootNodeInfo); - BuildTreeViewFromConnectionTree(rootNodeInfo, InitRootNode((RootNodeInfo)rootNodeInfo)); + InitRootNode((RootNodeInfo)rootNodeInfo); + BuildTreeViewFromConnectionTree(rootNodeInfo, RootNode); } - private TreeNode InitRootNode(RootNodeInfo rootNodeInfo) + private void InitRootNode(RootNodeInfo rootNodeInfo) { - var rootNode = new TreeNode(rootNodeInfo.Name); - rootNode.Expand(); - TreeView.Nodes.Add(rootNode); - return rootNode; + RootNode = new TreeNode(rootNodeInfo.Name) + { + Name = rootNodeInfo.Name, + Tag = rootNodeInfo + }; + RootNode.Expand(); } private void BuildTreeViewFromConnectionTree(ContainerInfo parentContainer, TreeNode parentTreeNode) @@ -43,7 +52,7 @@ namespace mRemoteNG.UI if (!parentContainer.Children.Any()) return; foreach (var child in parentContainer.Children) { - var treeNode = new TreeNode(child.Name); + var treeNode = new TreeNode(child.Name) {Name = child.Name}; parentTreeNode.Nodes.Add(treeNode); if (child is ContainerInfo) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 461d684bd..dcb85195e 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -49,7 +49,6 @@ namespace mRemoteNG.UI.Window { this.components = new System.ComponentModel.Container(); this.Load += new System.EventHandler(Tree_Load); - System.Windows.Forms.TreeNode TreeNode1 = new System.Windows.Forms.TreeNode("Connections"); this.tvConnections = new System.Windows.Forms.TreeView(); this.tvConnections.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tvConnections_BeforeLabelEdit); this.tvConnections.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tvConnections_AfterLabelEdit); @@ -156,9 +155,6 @@ namespace mRemoteNG.UI.Window this.tvConnections.LabelEdit = true; this.tvConnections.Location = new System.Drawing.Point(0, 0); this.tvConnections.Name = "tvConnections"; - TreeNode1.Name = "nodeRoot"; - TreeNode1.Text = "Connections"; - this.tvConnections.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {TreeNode1}); this.tvConnections.SelectedImageIndex = 0; this.tvConnections.Size = new System.Drawing.Size(192, 410); this.tvConnections.TabIndex = 20; From 8f685faf9ba8749cfede3a8fd484dcce9fade2c8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 22 Aug 2016 16:05:49 -0600 Subject: [PATCH 010/338] Refactored to reduce coupling --- mRemoteV1/Config/Putty/Config.Putty.Sessions.cs | 8 ++++---- mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs | 2 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 8 +++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs b/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs index eba31b4e0..f60032df8 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs +++ b/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs @@ -4,6 +4,7 @@ using mRemoteNG.Tree; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; +using mRemoteNG.App; namespace mRemoteNG.Config.Putty @@ -11,10 +12,9 @@ namespace mRemoteNG.Config.Putty public class Sessions { #region Public Methods - private delegate void AddSessionsToTreeDelegate(); - public static void AddSessionsToTree() + private delegate void AddSessionsToTreeDelegate(TreeView treeView); + public static void AddSessionsToTree(TreeView treeView) { - TreeView treeView = ConnectionTree.TreeView; if (treeView == null) { return ; @@ -139,7 +139,7 @@ namespace mRemoteNG.Config.Putty public static void SessionChanged(object sender, Provider.SessionChangedEventArgs e) { - AddSessionsToTree(); + AddSessionsToTree(Windows.treeForm.tvConnections); } #endregion diff --git a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs index 00d1ed0de..6751a8f2c 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs @@ -80,7 +80,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages if (puttyPathChanged) { PuttyBase.PuttyPath = Settings.Default.UseCustomPuttyPath ? Settings.Default.CustomPuttyPath : GeneralAppInfo.PuttyPath; - Sessions.AddSessionsToTree(); + Sessions.AddSessionsToTree(Windows.treeForm.tvConnections); } Settings.Default.MaxPuttyWaitTime = (int) numPuttyWaitTime.Value; diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index f7f4101cc..91590f95a 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -909,7 +909,13 @@ namespace mRemoteNG.UI.Window public void txtSearch_TextChanged(object sender, EventArgs e) { - tvConnections.SelectedNode = ConnectionTree.Find(tvConnections.Nodes[0], txtSearch.Text); + try + { + tvConnections.SelectedNode = ConnectionTree.Find(tvConnections.Nodes[0], txtSearch.Text); + } + catch (Exception) + { + } } public void tvConnections_KeyPress(object sender, KeyPressEventArgs e) From a89a593f5101b879f3e6e9fa6ccfb7d29262e449 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 09:16:09 -0600 Subject: [PATCH 011/338] code cleanup --- .../Config/Putty/Config.Putty.Sessions.cs | 79 ++++++++----------- 1 file changed, 31 insertions(+), 48 deletions(-) diff --git a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs b/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs index f60032df8..63fdac7dc 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs +++ b/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs @@ -25,12 +25,12 @@ namespace mRemoteNG.Config.Putty return ; } - foreach (Provider provider in Providers) + foreach (var provider in Providers) { - TreeNode rootTreeNode = provider.RootTreeNode; - bool inUpdate = false; + var rootTreeNode = provider.RootTreeNode; + var inUpdate = false; - List savedSessions = new List(provider.GetSessions()); + var savedSessions = new List(provider.GetSessions()); if (!IsProviderEnabled(provider) || savedSessions == null || savedSessions.Count == 0) { if (rootTreeNode != null && treeView.Nodes.Contains(rootTreeNode)) @@ -52,11 +52,11 @@ namespace mRemoteNG.Config.Putty treeView.Nodes.Add(rootTreeNode); } - List newTreeNodes = new List(); + var newTreeNodes = new List(); foreach (PuttySessionInfo sessionInfo in savedSessions) { - TreeNode treeNode = default(TreeNode); - bool isNewNode = false; + TreeNode treeNode; + bool isNewNode; if (rootTreeNode.Nodes.ContainsKey(sessionInfo.Name)) { treeNode = rootTreeNode.Nodes[sessionInfo.Name]; @@ -89,18 +89,16 @@ namespace mRemoteNG.Config.Putty foreach (TreeNode treeNode in rootTreeNode.Nodes) { - if (!savedSessions.Contains((ConnectionInfo)treeNode.Tag)) - { - if (!inUpdate) - { - treeView.BeginUpdate(); - inUpdate = true; - } - rootTreeNode.Nodes.Remove(treeNode); - } + if (savedSessions.Contains((ConnectionInfo) treeNode.Tag)) continue; + if (!inUpdate) + { + treeView.BeginUpdate(); + inUpdate = true; + } + rootTreeNode.Nodes.Remove(treeNode); } - if (!(newTreeNodes.Count == 0)) + if (newTreeNodes.Count != 0) { if (!inUpdate) { @@ -109,19 +107,17 @@ namespace mRemoteNG.Config.Putty } rootTreeNode.Nodes.AddRange(newTreeNodes.ToArray()); } - - if (inUpdate) - { - ConnectionTree.Sort(rootTreeNode, SortOrder.Ascending); - rootTreeNode.Expand(); - treeView.EndUpdate(); - } + + if (!inUpdate) continue; + ConnectionTree.Sort(rootTreeNode, SortOrder.Ascending); + rootTreeNode.Expand(); + treeView.EndUpdate(); } } public static void StartWatcher() { - foreach (Provider provider in Providers) + foreach (var provider in Providers) { provider.StartWatcher(); provider.SessionChanged += SessionChanged; @@ -130,7 +126,7 @@ namespace mRemoteNG.Config.Putty public static void StopWatcher() { - foreach (Provider provider in Providers) + foreach (var provider in Providers) { provider.StopWatcher(); provider.SessionChanged -= SessionChanged; @@ -159,15 +155,13 @@ namespace mRemoteNG.Config.Putty private static void AddProviders() { - _providers = new List(); - _providers.Add(new RegistryProvider()); - _providers.Add(new XmingProvider()); + _providers = new List {new RegistryProvider(), new XmingProvider()}; } private static string[] GetSessionNames(bool raw = false) { - List sessionNames = new List(); - foreach (Provider provider in Providers) + var sessionNames = new List(); + foreach (var provider in Providers) { if (!IsProviderEnabled(provider)) { @@ -180,20 +174,16 @@ namespace mRemoteNG.Config.Putty private static bool IsProviderEnabled(Provider provider) { - bool enabled = true; + var enabled = true; if (PuttyTypeDetector.GetPuttyType() == PuttyTypeDetector.PuttyType.Xming) { if ((provider) is RegistryProvider) - { enabled = false; - } } else { if ((provider) is XmingProvider) - { enabled = false; - } } return enabled; } @@ -202,21 +192,14 @@ namespace mRemoteNG.Config.Putty #region Public Classes public class SessionList : StringConverter { - - public static string[] Names - { - get - { - return GetSessionNames(); - } - } - - public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) + public static string[] Names => GetSessionNames(); + + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { return new StandardValuesCollection(Names); } - public override bool GetStandardValuesExclusive(System.ComponentModel.ITypeDescriptorContext context) + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; } @@ -228,4 +211,4 @@ namespace mRemoteNG.Config.Putty } #endregion } -} +} \ No newline at end of file From 3c69644f21737fa0e6d2a2021028219ed36d2108 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 09:35:08 -0600 Subject: [PATCH 012/338] Re-enable expanding previously expanded folders. Implementation is still not ideal, but it's better --- .../Connections/XmlConnectionsDeserializer.cs | 10 ---------- mRemoteV1/UI/Forms/frmMain.cs | 1 + mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 13 +++++++++++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs index 2a0076e8b..e9a910b8a 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs @@ -31,7 +31,6 @@ namespace mRemoteNG.Config.Connections //TODO find way to inject data source info private string ConnectionFileName = ""; - //public TreeNode RootTreeNode { get; set; } public ConnectionList ConnectionList { get; set; } public ContainerList ContainerList { get; set; } @@ -461,15 +460,6 @@ namespace mRemoteNG.Config.Connections return connectionInfo; } - private void ExpandPreviouslyOpenedFolders() - { - foreach (ContainerInfo contI in ContainerList) - { - if (contI.IsExpanded) - contI.TreeNode.Expand(); - } - } - private bool IsExportFile() { var isExportFile = false; diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index af0dab542..aed7faf13 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -153,6 +153,7 @@ namespace mRemoteNG.UI.Forms Windows.treePanel.Focus(); ConnectionTree.TreeView = Windows.treeForm.tvConnections; + Windows.treeForm.ExpandPreviouslyOpenedFolders(); Config.Putty.Sessions.StartWatcher(); if (Settings.Default.StartupComponentsCheck) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 91590f95a..8f0f20208 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -104,10 +104,19 @@ namespace mRemoteNG.UI.Window { tvConnections_AfterSelect(tvConnections, new TreeViewEventArgs(tvConnections.SelectedNode, TreeViewAction.ByMouse)); } + + public void ExpandPreviouslyOpenedFolders() + { + foreach (ContainerInfo contI in Runtime.ContainerList) + { + if (contI.IsExpanded) + contI.TreeNode.Expand(); + } + } #endregion - + #region Public Properties - public ToolTip DescriptionTooltip {get; set;} + public ToolTip DescriptionTooltip {get; set;} #endregion #region Private Methods From 1c5ea9e3ff0ec6663b2c831f53e7813e58e8b3df Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 09:49:39 -0600 Subject: [PATCH 013/338] Re-enabled opening connections from last session --- .../Connections/XmlConnectionsDeserializer.cs | 23 ---------------- mRemoteV1/UI/Forms/frmMain.cs | 7 +++-- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 26 ++++++++++++++++--- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs index e9a910b8a..078dfd399 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs @@ -85,7 +85,6 @@ namespace mRemoteNG.Config.Connections if (!import) Runtime.IsConnectionsFileLoaded = false; - // SECTION 2. Initialize the treeview control. var rootInfo = InitializeRootNode(); var connectionTreeModel = new ConnectionTreeModel(); connectionTreeModel.AddRootNode(rootInfo); @@ -107,22 +106,10 @@ namespace mRemoteNG.Config.Connections return null; } - //if (!IsExportFile()) - //{ - // RootTreeNode.ImageIndex = (int)TreeImageType.Root; - // RootTreeNode.SelectedImageIndex = (int)TreeImageType.Root; - //} - - // SECTION 3. Populate the TreeView with the DOM nodes. - //PopulateTreeview(); AddNodesFromXmlRecursive(_xmlDocument.DocumentElement, rootInfo); - //RootTreeNode.EnsureVisible(); //Windows.treeForm.InitialRefresh(); //SetSelectedNode(RootTreeNode); - //open connections from last mremote session - //OpenConnectionsFromLastSession(); - if (!import) Runtime.IsConnectionsFileLoaded = true; @@ -490,15 +477,5 @@ namespace mRemoteNG.Config.Connections } Windows.treeForm.tvConnections.SelectedNode = treeNode; } - - private void OpenConnectionsFromLastSession() - { - if (!mRemoteNG.Settings.Default.OpenConsFromLastSession || mRemoteNG.Settings.Default.NoReconnect) return; - foreach (ConnectionInfo conI in ConnectionList) - { - if (conI.PleaseConnect) - Runtime.OpenConnection(conI); - } - } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index aed7faf13..c93bccb99 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -153,7 +153,6 @@ namespace mRemoteNG.UI.Forms Windows.treePanel.Focus(); ConnectionTree.TreeView = Windows.treeForm.tvConnections; - Windows.treeForm.ExpandPreviouslyOpenedFolders(); Config.Putty.Sessions.StartWatcher(); if (Settings.Default.StartupComponentsCheck) @@ -167,7 +166,11 @@ namespace mRemoteNG.UI.Forms AddSysMenuItems(); Microsoft.Win32.SystemEvents.DisplaySettingsChanged += DisplayChanged; Opacity = 1; - } + + Windows.treeForm.ExpandPreviouslyOpenedFolders(); + Windows.treeForm.EnsureRootNodeVisible(); + Windows.treeForm.OpenConnectionsFromLastSession(); + } private void ApplySpecialSettingsForPortableVersion() { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 8f0f20208..cbc02930c 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -94,10 +94,12 @@ namespace mRemoteNG.UI.Window DockPnl = panel; InitializeComponent(); FillImageList(); - - DescriptionTooltip = new ToolTip(); - DescriptionTooltip.InitialDelay = 300; - DescriptionTooltip.ReshowDelay = 0; + + DescriptionTooltip = new ToolTip + { + InitialDelay = 300, + ReshowDelay = 0 + }; } public void InitialRefresh() @@ -113,6 +115,22 @@ namespace mRemoteNG.UI.Window contI.TreeNode.Expand(); } } + + public void OpenConnectionsFromLastSession() + { + if (!Settings.Default.OpenConsFromLastSession || Settings.Default.NoReconnect) return; + foreach (ConnectionInfo conI in Runtime.ConnectionList) + { + if (conI.PleaseConnect) + Runtime.OpenConnection(conI); + } + } + + public void EnsureRootNodeVisible() + { + var rootNode = tvConnections.Nodes[0]; + rootNode.EnsureVisible(); + } #endregion #region Public Properties From 94ee9a39b4fdbed7234dba6c8d5bc1e7df937c93 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 13:59:30 -0600 Subject: [PATCH 014/338] Saving XML data to file now decoupled --- mRemoteV1/App/Runtime.cs | 93 ++--- .../Config/Connections/ConnectionsLoader.cs | 4 +- .../Config/Connections/ConnectionsSaver.cs | 363 +----------------- .../Connections/XmlConnectionsSerializer.cs | 363 ++++++++++++++++++ mRemoteV1/Config/IDeserializer.cs | 9 + mRemoteV1/Config/ISerializer.cs | 9 + mRemoteV1/mRemoteV1.csproj | 3 + 7 files changed, 421 insertions(+), 423 deletions(-) create mode 100644 mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs create mode 100644 mRemoteV1/Config/IDeserializer.cs create mode 100644 mRemoteV1/Config/ISerializer.cs diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 77ace4b0d..38adb33dd 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -31,49 +31,22 @@ namespace mRemoteNG.App { #region Public Properties public static ConnectionList ConnectionList { get; set; } - public static ConnectionList PreviousConnectionList { get; set; } - public static ContainerList ContainerList { get; set; } - public static ContainerList PreviousContainerList { get; set; } - public static CredentialList CredentialList { get; set; } - public static CredentialList PreviousCredentialList { get; set; } - public static WindowList WindowList { get; set; } - public static MessageCollector MessageCollector { get; set; } - public static Tools.Controls.NotificationAreaIcon NotificationAreaIcon { get; set; } - public static bool IsConnectionsFileLoaded { get; set; } - public static SqlConnectionsProvider SQLConnProvider { get; set; } - - /* - public static System.Timers.Timer TimerSqlWatcher - { - get { return _timerSqlWatcher; } - set - { - _timerSqlWatcher = value; - _timerSqlWatcher.Elapsed += tmrSqlWatcher_Elapsed; - } - } - */ - public static DateTime LastSqlUpdate { get; set; } - public static string LastSelected { get; set; } - public static ConnectionInfo DefaultConnection { get; set; } = DefaultConnectionInfo.Instance; - public static ConnectionInfoInheritance DefaultInheritance { get; set; } - public static ArrayList ExternalTools { get; set; } = new ArrayList(); - + public static ConnectionTreeModel ConnectionTreeModel { get; set; } #endregion #region Panels @@ -509,51 +482,41 @@ namespace mRemoteNG.App public static void SaveConnections(bool Update = false) { if (!IsConnectionsFileLoaded) - { return; - } try { if (Update && Settings.Default.UseSQLServer == false) - { return; - } - if (SQLConnProvider != null) - { - SQLConnProvider.Disable(); - } + SQLConnProvider?.Disable(); - ConnectionsSaver conS = new ConnectionsSaver(); + var connectionsSaver = new ConnectionsSaver(); if (!Settings.Default.UseSQLServer) - { - conS.ConnectionFileName = GetStartupConnectionFileName(); - } + connectionsSaver.ConnectionFileName = GetStartupConnectionFileName(); - conS.ConnectionList = ConnectionList; - conS.ContainerList = ContainerList; - conS.Export = false; - conS.SaveSecurity = new Security.Save(false); - conS.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; + connectionsSaver.ConnectionList = ConnectionList; + connectionsSaver.ContainerList = ContainerList; + connectionsSaver.Export = false; + connectionsSaver.SaveSecurity = new Security.Save(false); + connectionsSaver.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; + connectionsSaver.ConnectionTreeModel = ConnectionTreeModel; if (Settings.Default.UseSQLServer) { - conS.SaveFormat = ConnectionsSaver.Format.SQL; - conS.SQLHost = Convert.ToString(Settings.Default.SQLHost); - conS.SQLDatabaseName = Convert.ToString(Settings.Default.SQLDatabaseName); - conS.SQLUsername = Convert.ToString(Settings.Default.SQLUser); + connectionsSaver.SaveFormat = ConnectionsSaver.Format.SQL; + connectionsSaver.SQLHost = Convert.ToString(Settings.Default.SQLHost); + connectionsSaver.SQLDatabaseName = Convert.ToString(Settings.Default.SQLDatabaseName); + connectionsSaver.SQLUsername = Convert.ToString(Settings.Default.SQLUser); var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - conS.SQLPassword = cryptographyProvider.Decrypt(Convert.ToString(Settings.Default.SQLPass), GeneralAppInfo.EncryptionKey); + connectionsSaver.SQLPassword = cryptographyProvider.Decrypt(Convert.ToString(Settings.Default.SQLPass), GeneralAppInfo.EncryptionKey); } - conS.SaveConnections(); + connectionsSaver.SaveConnections(); if (Settings.Default.UseSQLServer) - { LastSqlUpdate = DateTime.Now; - } } catch (Exception ex) { @@ -561,23 +524,17 @@ namespace mRemoteNG.App } finally { - if (SQLConnProvider != null) - { - SQLConnProvider.Enable(); - } + SQLConnProvider?.Enable(); } } public static void SaveConnectionsAs() { - ConnectionsSaver connectionsSave = new ConnectionsSaver(); + var connectionsSave = new ConnectionsSaver(); try { - if (SQLConnProvider != null) - { - SQLConnProvider.Disable(); - } + SQLConnProvider?.Disable(); using (SaveFileDialog saveFileDialog = new SaveFileDialog()) { @@ -586,16 +543,14 @@ namespace mRemoteNG.App saveFileDialog.FileName = ConnectionsFileInfo.DefaultConnectionsFile; saveFileDialog.OverwritePrompt = true; - List fileTypes = new List(); + var fileTypes = new List(); fileTypes.AddRange(new[] { Language.strFiltermRemoteXML, "*.xml" }); fileTypes.AddRange(new[] { Language.strFilterAll, "*.*" }); saveFileDialog.Filter = string.Join("|", fileTypes.ToArray()); - if (!(saveFileDialog.ShowDialog(frmMain.Default) == DialogResult.OK)) - { + if (saveFileDialog.ShowDialog(frmMain.Default) != DialogResult.OK) return; - } connectionsSave.SaveFormat = ConnectionsSaver.Format.mRXML; connectionsSave.ConnectionFileName = saveFileDialog.FileName; @@ -604,6 +559,7 @@ namespace mRemoteNG.App connectionsSave.ConnectionList = ConnectionList; connectionsSave.ContainerList = ContainerList; connectionsSave.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; + connectionsSave.ConnectionTreeModel = ConnectionTreeModel; connectionsSave.SaveConnections(); @@ -625,10 +581,7 @@ namespace mRemoteNG.App } finally { - if (SQLConnProvider != null) - { - SQLConnProvider.Enable(); - } + SQLConnProvider?.Enable(); } } #endregion diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index e3e7d7e50..968278fe3 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -1,4 +1,3 @@ -using System.Linq; using System.Windows.Forms; using mRemoteNG.App; using mRemoteNG.Connection; @@ -59,7 +58,8 @@ namespace mRemoteNG.Config.Connections var connectionTreeViewBuilder = new ConnectionTreeViewBuilder(connectionTreeModel); connectionTreeViewBuilder.Build(); connectionTreeViewBuilder.AppendTo(Windows.treeForm.tvConnections); - } + Runtime.ConnectionTreeModel = connectionTreeModel; + } frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; frmMain.Default.ConnectionsFileName = ConnectionFileName; diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 416de697e..14611b331 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -61,6 +61,7 @@ namespace mRemoteNG.Config.Connections public Save SaveSecurity {get; set;} public ConnectionList ConnectionList {get; set;} public ContainerList ContainerList {get; set;} + public ConnectionTreeModel ConnectionTreeModel { get; set; } #endregion #region Public Methods @@ -557,61 +558,18 @@ namespace mRemoteNG.Config.Connections { try { - if (!Runtime.IsConnectionsFileLoaded) + var xmlConnectionsSerializer = new XmlConnectionsSerializer() { - return; - } - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - TreeNode treeNode; - - if (ConnectionTreeNode.GetNodeType(RootTreeNode) == TreeNodeType.Root) - { - treeNode = (TreeNode)RootTreeNode.Clone(); - } - else - { - treeNode = new TreeNode("mR|Export (" + MiscTools.DBDate(DateTime.Now) + ")"); - treeNode.Nodes.Add(Convert.ToString(RootTreeNode.Clone())); - } - - string tempFileName = Path.GetTempFileName(); - _xmlTextWriter = new XmlTextWriter(tempFileName, Encoding.UTF8); - - _xmlTextWriter.Formatting = Formatting.Indented; - _xmlTextWriter.Indentation = 4; - - _xmlTextWriter.WriteStartDocument(); - - _xmlTextWriter.WriteStartElement("Connections"); // Do not localize - _xmlTextWriter.WriteAttributeString("Name", "", treeNode.Text); - _xmlTextWriter.WriteAttributeString("Export", "", Convert.ToString(Export)); - - if (Export) - { - _xmlTextWriter.WriteAttributeString("Protected", "", cryptographyProvider.Encrypt("ThisIsNotProtected", _password)); - } - else - { - if (((RootNodeInfo) treeNode.Tag).Password) - { - _password = Convert.ToString(((RootNodeInfo) treeNode.Tag).PasswordString).ConvertToSecureString(); - _xmlTextWriter.WriteAttributeString("Protected", "", cryptographyProvider.Encrypt("ThisIsProtected", _password)); - } - else - { - _xmlTextWriter.WriteAttributeString("Protected", "", cryptographyProvider.Encrypt("ThisIsNotProtected", _password)); - } - } - - _xmlTextWriter.WriteAttributeString("ConfVersion", "", ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture)); - - var treeNodeCollection = treeNode.Nodes; - - SaveNode(treeNodeCollection); - - _xmlTextWriter.WriteEndElement(); - _xmlTextWriter.Close(); + ConnectionList = ConnectionList, + ContainerList = ContainerList, + Export = Export, + SaveSecurity = SaveSecurity + }; + var xml = xmlConnectionsSerializer.Serialize(ConnectionTreeModel); + var tempFileName = Path.GetTempFileName(); + var fileDataProvider = new FileDataProvider(tempFileName); + fileDataProvider.Save(xml); if (File.Exists(ConnectionFileName)) { if (Export) @@ -620,7 +578,7 @@ namespace mRemoteNG.Config.Connections } else { - string backupFileName = ConnectionFileName +".backup"; + var backupFileName = ConnectionFileName +".backup"; File.Delete(backupFileName); File.Move(ConnectionFileName, backupFileName); } @@ -632,303 +590,6 @@ namespace mRemoteNG.Config.Connections Runtime.MessageCollector.AddExceptionStackTrace("SaveToXml failed", ex); } } - - private void SaveNode(TreeNodeCollection tNC) - { - try - { - foreach (TreeNode node in tNC) - { - ConnectionInfo curConI; - - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) - { - _xmlTextWriter.WriteStartElement("Node"); - _xmlTextWriter.WriteAttributeString("Name", "", node.Text); - _xmlTextWriter.WriteAttributeString("Type", "", ConnectionTreeNode.GetNodeType(node).ToString()); - } - - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) //container - { - _xmlTextWriter.WriteAttributeString("Expanded", "", Convert.ToString(ContainerList[node.Tag].TreeNode.IsExpanded)); - curConI = ContainerList[node.Tag]; - SaveConnectionFields(curConI); - SaveNode(node.Nodes); - _xmlTextWriter.WriteEndElement(); - } - - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection) - { - curConI = ConnectionList[node.Tag]; - SaveConnectionFields(curConI); - _xmlTextWriter.WriteEndElement(); - } - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "SaveNode failed" + Environment.NewLine + ex.Message, true); - } - } - - private void SaveConnectionFields(ConnectionInfo curConI) - { - try - { - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - _xmlTextWriter.WriteAttributeString("Descr", "", curConI.Description); - - _xmlTextWriter.WriteAttributeString("Icon", "", curConI.Icon); - - _xmlTextWriter.WriteAttributeString("Panel", "", curConI.Panel); - - if (SaveSecurity.Username) - { - _xmlTextWriter.WriteAttributeString("Username", "", curConI.Username); - } - else - { - _xmlTextWriter.WriteAttributeString("Username", "", ""); - } - - if (SaveSecurity.Domain) - { - _xmlTextWriter.WriteAttributeString("Domain", "", curConI.Domain); - } - else - { - _xmlTextWriter.WriteAttributeString("Domain", "", ""); - } - - if (SaveSecurity.Password) - { - _xmlTextWriter.WriteAttributeString("Password", "", cryptographyProvider.Encrypt(curConI.Password, _password)); - } - else - { - _xmlTextWriter.WriteAttributeString("Password", "", ""); - } - - _xmlTextWriter.WriteAttributeString("Hostname", "", curConI.Hostname); - - _xmlTextWriter.WriteAttributeString("Protocol", "", curConI.Protocol.ToString()); - - _xmlTextWriter.WriteAttributeString("PuttySession", "", curConI.PuttySession); - - _xmlTextWriter.WriteAttributeString("Port", "", Convert.ToString(curConI.Port)); - - _xmlTextWriter.WriteAttributeString("ConnectToConsole", "", Convert.ToString(curConI.UseConsoleSession)); - - _xmlTextWriter.WriteAttributeString("UseCredSsp", "", Convert.ToString(curConI.UseCredSsp)); - - _xmlTextWriter.WriteAttributeString("RenderingEngine", "", curConI.RenderingEngine.ToString()); - - _xmlTextWriter.WriteAttributeString("ICAEncryptionStrength", "", curConI.ICAEncryptionStrength.ToString()); - - _xmlTextWriter.WriteAttributeString("RDPAuthenticationLevel", "", curConI.RDPAuthenticationLevel.ToString()); - - _xmlTextWriter.WriteAttributeString("LoadBalanceInfo", "", curConI.LoadBalanceInfo); - - _xmlTextWriter.WriteAttributeString("Colors", "", curConI.Colors.ToString()); - - _xmlTextWriter.WriteAttributeString("Resolution", "", curConI.Resolution.ToString()); - - _xmlTextWriter.WriteAttributeString("AutomaticResize", "", Convert.ToString(curConI.AutomaticResize)); - - _xmlTextWriter.WriteAttributeString("DisplayWallpaper", "", Convert.ToString(curConI.DisplayWallpaper)); - - _xmlTextWriter.WriteAttributeString("DisplayThemes", "", Convert.ToString(curConI.DisplayThemes)); - - _xmlTextWriter.WriteAttributeString("EnableFontSmoothing", "", Convert.ToString(curConI.EnableFontSmoothing)); - - _xmlTextWriter.WriteAttributeString("EnableDesktopComposition", "", Convert.ToString(curConI.EnableDesktopComposition)); - - _xmlTextWriter.WriteAttributeString("CacheBitmaps", "", Convert.ToString(curConI.CacheBitmaps)); - - _xmlTextWriter.WriteAttributeString("RedirectDiskDrives", "", Convert.ToString(curConI.RedirectDiskDrives)); - - _xmlTextWriter.WriteAttributeString("RedirectPorts", "", Convert.ToString(curConI.RedirectPorts)); - - _xmlTextWriter.WriteAttributeString("RedirectPrinters", "", Convert.ToString(curConI.RedirectPrinters)); - - _xmlTextWriter.WriteAttributeString("RedirectSmartCards", "", Convert.ToString(curConI.RedirectSmartCards)); - - _xmlTextWriter.WriteAttributeString("RedirectSound", "", curConI.RedirectSound.ToString()); - - _xmlTextWriter.WriteAttributeString("RedirectKeys", "", Convert.ToString(curConI.RedirectKeys)); - - if (curConI.OpenConnections.Count > 0) - { - _xmlTextWriter.WriteAttributeString("Connected", "", Convert.ToString(true)); - } - else - { - _xmlTextWriter.WriteAttributeString("Connected", "", Convert.ToString(false)); - } - - _xmlTextWriter.WriteAttributeString("PreExtApp", "", curConI.PreExtApp); - _xmlTextWriter.WriteAttributeString("PostExtApp", "", curConI.PostExtApp); - _xmlTextWriter.WriteAttributeString("MacAddress", "", curConI.MacAddress); - _xmlTextWriter.WriteAttributeString("UserField", "", curConI.UserField); - _xmlTextWriter.WriteAttributeString("ExtApp", "", curConI.ExtApp); - - _xmlTextWriter.WriteAttributeString("VNCCompression", "", curConI.VNCCompression.ToString()); - _xmlTextWriter.WriteAttributeString("VNCEncoding", "", curConI.VNCEncoding.ToString()); - _xmlTextWriter.WriteAttributeString("VNCAuthMode", "", curConI.VNCAuthMode.ToString()); - _xmlTextWriter.WriteAttributeString("VNCProxyType", "", curConI.VNCProxyType.ToString()); - _xmlTextWriter.WriteAttributeString("VNCProxyIP", "", curConI.VNCProxyIP); - _xmlTextWriter.WriteAttributeString("VNCProxyPort", "", Convert.ToString(curConI.VNCProxyPort)); - _xmlTextWriter.WriteAttributeString("VNCProxyUsername", "", curConI.VNCProxyUsername); - _xmlTextWriter.WriteAttributeString("VNCProxyPassword", "", cryptographyProvider.Encrypt(curConI.VNCProxyPassword, _password)); - _xmlTextWriter.WriteAttributeString("VNCColors", "", curConI.VNCColors.ToString()); - _xmlTextWriter.WriteAttributeString("VNCSmartSizeMode", "", curConI.VNCSmartSizeMode.ToString()); - _xmlTextWriter.WriteAttributeString("VNCViewOnly", "", Convert.ToString(curConI.VNCViewOnly)); - - _xmlTextWriter.WriteAttributeString("RDGatewayUsageMethod", "", curConI.RDGatewayUsageMethod.ToString()); - _xmlTextWriter.WriteAttributeString("RDGatewayHostname", "", curConI.RDGatewayHostname); - - _xmlTextWriter.WriteAttributeString("RDGatewayUseConnectionCredentials", "", curConI.RDGatewayUseConnectionCredentials.ToString()); - - if (SaveSecurity.Username) - { - _xmlTextWriter.WriteAttributeString("RDGatewayUsername", "", curConI.RDGatewayUsername); - } - else - { - _xmlTextWriter.WriteAttributeString("RDGatewayUsername", "", ""); - } - - if (SaveSecurity.Password) - { - _xmlTextWriter.WriteAttributeString("RDGatewayPassword", "", cryptographyProvider.Encrypt(curConI.RDGatewayPassword, _password)); - } - else - { - _xmlTextWriter.WriteAttributeString("RDGatewayPassword", "", ""); - } - - if (SaveSecurity.Domain) - { - _xmlTextWriter.WriteAttributeString("RDGatewayDomain", "", curConI.RDGatewayDomain); - } - else - { - _xmlTextWriter.WriteAttributeString("RDGatewayDomain", "", ""); - } - - if (SaveSecurity.Inheritance) - { - _xmlTextWriter.WriteAttributeString("InheritCacheBitmaps", "", Convert.ToString(curConI.Inheritance.CacheBitmaps)); - _xmlTextWriter.WriteAttributeString("InheritColors", "", Convert.ToString(curConI.Inheritance.Colors)); - _xmlTextWriter.WriteAttributeString("InheritDescription", "", Convert.ToString(curConI.Inheritance.Description)); - _xmlTextWriter.WriteAttributeString("InheritDisplayThemes", "", Convert.ToString(curConI.Inheritance.DisplayThemes)); - _xmlTextWriter.WriteAttributeString("InheritDisplayWallpaper", "", Convert.ToString(curConI.Inheritance.DisplayWallpaper)); - _xmlTextWriter.WriteAttributeString("InheritEnableFontSmoothing", "", Convert.ToString(curConI.Inheritance.EnableFontSmoothing)); - _xmlTextWriter.WriteAttributeString("InheritEnableDesktopComposition", "", Convert.ToString(curConI.Inheritance.EnableDesktopComposition)); - _xmlTextWriter.WriteAttributeString("InheritDomain", "", Convert.ToString(curConI.Inheritance.Domain)); - _xmlTextWriter.WriteAttributeString("InheritIcon", "", Convert.ToString(curConI.Inheritance.Icon)); - _xmlTextWriter.WriteAttributeString("InheritPanel", "", Convert.ToString(curConI.Inheritance.Panel)); - _xmlTextWriter.WriteAttributeString("InheritPassword", "", Convert.ToString(curConI.Inheritance.Password)); - _xmlTextWriter.WriteAttributeString("InheritPort", "", Convert.ToString(curConI.Inheritance.Port)); - _xmlTextWriter.WriteAttributeString("InheritProtocol", "", Convert.ToString(curConI.Inheritance.Protocol)); - _xmlTextWriter.WriteAttributeString("InheritPuttySession", "", Convert.ToString(curConI.Inheritance.PuttySession)); - _xmlTextWriter.WriteAttributeString("InheritRedirectDiskDrives", "", Convert.ToString(curConI.Inheritance.RedirectDiskDrives)); - _xmlTextWriter.WriteAttributeString("InheritRedirectKeys", "", Convert.ToString(curConI.Inheritance.RedirectKeys)); - _xmlTextWriter.WriteAttributeString("InheritRedirectPorts", "", Convert.ToString(curConI.Inheritance.RedirectPorts)); - _xmlTextWriter.WriteAttributeString("InheritRedirectPrinters", "", Convert.ToString(curConI.Inheritance.RedirectPrinters)); - _xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", Convert.ToString(curConI.Inheritance.RedirectSmartCards)); - _xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", Convert.ToString(curConI.Inheritance.RedirectSound)); - _xmlTextWriter.WriteAttributeString("InheritResolution", "", Convert.ToString(curConI.Inheritance.Resolution)); - _xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", Convert.ToString(curConI.Inheritance.AutomaticResize)); - _xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", Convert.ToString(curConI.Inheritance.UseConsoleSession)); - _xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", Convert.ToString(curConI.Inheritance.UseCredSsp)); - _xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", Convert.ToString(curConI.Inheritance.RenderingEngine)); - _xmlTextWriter.WriteAttributeString("InheritUsername", "", Convert.ToString(curConI.Inheritance.Username)); - _xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", Convert.ToString(curConI.Inheritance.ICAEncryptionStrength)); - _xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", Convert.ToString(curConI.Inheritance.RDPAuthenticationLevel)); - _xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", Convert.ToString(curConI.Inheritance.LoadBalanceInfo)); - _xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", Convert.ToString(curConI.Inheritance.PreExtApp)); - _xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", Convert.ToString(curConI.Inheritance.PostExtApp)); - _xmlTextWriter.WriteAttributeString("InheritMacAddress", "", Convert.ToString(curConI.Inheritance.MacAddress)); - _xmlTextWriter.WriteAttributeString("InheritUserField", "", Convert.ToString(curConI.Inheritance.UserField)); - _xmlTextWriter.WriteAttributeString("InheritExtApp", "", Convert.ToString(curConI.Inheritance.ExtApp)); - _xmlTextWriter.WriteAttributeString("InheritVNCCompression", "", Convert.ToString(curConI.Inheritance.VNCCompression)); - _xmlTextWriter.WriteAttributeString("InheritVNCEncoding", "", Convert.ToString(curConI.Inheritance.VNCEncoding)); - _xmlTextWriter.WriteAttributeString("InheritVNCAuthMode", "", Convert.ToString(curConI.Inheritance.VNCAuthMode)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyType", "", Convert.ToString(curConI.Inheritance.VNCProxyType)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyIP", "", Convert.ToString(curConI.Inheritance.VNCProxyIP)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyPort", "", Convert.ToString(curConI.Inheritance.VNCProxyPort)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyUsername", "", Convert.ToString(curConI.Inheritance.VNCProxyUsername)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyPassword", "", Convert.ToString(curConI.Inheritance.VNCProxyPassword)); - _xmlTextWriter.WriteAttributeString("InheritVNCColors", "", Convert.ToString(curConI.Inheritance.VNCColors)); - _xmlTextWriter.WriteAttributeString("InheritVNCSmartSizeMode", "", Convert.ToString(curConI.Inheritance.VNCSmartSizeMode)); - _xmlTextWriter.WriteAttributeString("InheritVNCViewOnly", "", Convert.ToString(curConI.Inheritance.VNCViewOnly)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsageMethod", "", Convert.ToString(curConI.Inheritance.RDGatewayUsageMethod)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayHostname", "", Convert.ToString(curConI.Inheritance.RDGatewayHostname)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUseConnectionCredentials", "", Convert.ToString(curConI.Inheritance.RDGatewayUseConnectionCredentials)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsername", "", Convert.ToString(curConI.Inheritance.RDGatewayUsername)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayPassword", "", Convert.ToString(curConI.Inheritance.RDGatewayPassword)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayDomain", "", Convert.ToString(curConI.Inheritance.RDGatewayDomain)); - } - else - { - _xmlTextWriter.WriteAttributeString("InheritCacheBitmaps", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritColors", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritDescription", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritDisplayThemes", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritDisplayWallpaper", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritEnableFontSmoothing", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritEnableDesktopComposition", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritDomain", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritIcon", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPanel", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPassword", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPort", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritProtocol", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPuttySession", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectDiskDrives", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectKeys", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectPorts", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectPrinters", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritResolution", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritUsername", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritMacAddress", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritUserField", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritExtApp", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCCompression", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCEncoding", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCAuthMode", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyType", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyIP", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyPort", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyUsername", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCProxyPassword", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCColors", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCSmartSizeMode", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritVNCViewOnly", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayHostname", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUseConnectionCredentials", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsername", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayPassword", "", Convert.ToString(false)); - _xmlTextWriter.WriteAttributeString("InheritRDGatewayDomain", "", Convert.ToString(false)); - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "SaveConnectionFields failed" + Environment.NewLine + ex.Message, true); - } - } #endregion #region CSV diff --git a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs new file mode 100644 index 000000000..24c735738 --- /dev/null +++ b/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs @@ -0,0 +1,363 @@ +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Security; +using System.Text; +using System.Xml; +using mRemoteNG.App; +using mRemoteNG.App.Info; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Messages; +using mRemoteNG.Security; +using mRemoteNG.Security.SymmetricEncryption; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class XmlConnectionsSerializer : ISerializer + { + private SecureString _password = GeneralAppInfo.EncryptionKey; + private XmlTextWriter _xmlTextWriter; + + public bool Export { get; set; } + public Save SaveSecurity { get; set; } + public ConnectionList ConnectionList { get; set; } + public ContainerList ContainerList { get; set; } + + + public string Serialize(ConnectionTreeModel connectionTreeModel) + { + var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); + return SaveToXml(rootNode); + } + + private string SaveToXml(RootNodeInfo rootNodeInfo) + { + var xml = ""; + try + { + if (!Runtime.IsConnectionsFileLoaded) + return ""; + + //TreeNode treeNode; + //if (ConnectionTreeNode.GetNodeType(rootTreeNode) == TreeNodeType.Root) + //{ + // treeNode = (TreeNode)rootTreeNode.Clone(); + //} + //else + //{ + // treeNode = new TreeNode("mR|Export (" + MiscTools.DBDate(DateTime.Now) + ")"); + // treeNode.Nodes.Add(Convert.ToString(rootTreeNode.Clone())); + //} + + var memoryStream = new MemoryStream(); + using (_xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8)) + { + SetXmlTextWriterSettings(); + _xmlTextWriter.WriteStartDocument(); + SaveNodesRecursive(rootNodeInfo); + _xmlTextWriter.Flush(); + + var streamReader = new StreamReader(memoryStream, Encoding.UTF8, true); + memoryStream.Seek(0, SeekOrigin.Begin); + xml = streamReader.ReadToEnd(); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace("SaveToXml failed", ex); + } + return xml; + } + + private void SetXmlTextWriterSettings() + { + _xmlTextWriter.Formatting = Formatting.Indented; + _xmlTextWriter.Indentation = 4; + } + + private void SaveNodesRecursive(RootNodeInfo rootNodeInfo) + { + SerializeRootNodeInfo(rootNodeInfo); + foreach (var child in rootNodeInfo.Children) + SaveNodesRecursive(child); + _xmlTextWriter.WriteEndElement(); + } + + private void SaveNodesRecursive(ConnectionInfo connectionInfo) + { + try + { + var containerInfo = connectionInfo as ContainerInfo; + if (containerInfo != null) + { + SerializeContainerInfo(containerInfo); + foreach (var child in containerInfo.Children) + SaveNodesRecursive(child); + } + else + { + SerializeConnectionInfo(connectionInfo); + } + _xmlTextWriter.WriteEndElement(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "SaveNode failed" + Environment.NewLine + ex.Message, true); + } + } + + private void SerializeRootNodeInfo(RootNodeInfo rootNodeInfo) + { + var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); + _xmlTextWriter.WriteStartElement("Connections"); // Do not localize + _xmlTextWriter.WriteAttributeString("Name", "", rootNodeInfo.Name); + _xmlTextWriter.WriteAttributeString("Export", "", Convert.ToString(Export)); + + if (Export) + { + _xmlTextWriter.WriteAttributeString("Protected", "", cryptographyProvider.Encrypt("ThisIsNotProtected", _password)); + } + else + { + if (rootNodeInfo.Password) + { + _password = rootNodeInfo.PasswordString.ConvertToSecureString(); + _xmlTextWriter.WriteAttributeString("Protected", "", cryptographyProvider.Encrypt("ThisIsProtected", _password)); + } + else + { + _xmlTextWriter.WriteAttributeString("Protected", "", cryptographyProvider.Encrypt("ThisIsNotProtected", _password)); + } + } + + _xmlTextWriter.WriteAttributeString("ConfVersion", "", ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture)); + } + + private void SerializeContainerInfo(ContainerInfo containerInfo) + { + _xmlTextWriter.WriteStartElement("Node"); + _xmlTextWriter.WriteAttributeString("Name", "", containerInfo.Name); + _xmlTextWriter.WriteAttributeString("Type", "", ConnectionTreeNode.GetNodeType(containerInfo.TreeNode).ToString()); + _xmlTextWriter.WriteAttributeString("Expanded", "", containerInfo.TreeNode.IsExpanded.ToString()); + SaveConnectionFields(containerInfo); + } + + private void SerializeConnectionInfo(ConnectionInfo connectionInfo) + { + _xmlTextWriter.WriteStartElement("Node"); + _xmlTextWriter.WriteAttributeString("Name", "", connectionInfo.Name); + _xmlTextWriter.WriteAttributeString("Type", "", ConnectionTreeNode.GetNodeType(connectionInfo.TreeNode).ToString()); + SaveConnectionFields(connectionInfo); + } + + private void SaveConnectionFields(ConnectionInfo connectionInfo) + { + try + { + var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); + _xmlTextWriter.WriteAttributeString("Descr", "", connectionInfo.Description); + _xmlTextWriter.WriteAttributeString("Icon", "", connectionInfo.Icon); + _xmlTextWriter.WriteAttributeString("Panel", "", connectionInfo.Panel); + + if (SaveSecurity.Username) + _xmlTextWriter.WriteAttributeString("Username", "", connectionInfo.Username); + else + _xmlTextWriter.WriteAttributeString("Username", "", ""); + + if (SaveSecurity.Domain) + _xmlTextWriter.WriteAttributeString("Domain", "", connectionInfo.Domain); + else + _xmlTextWriter.WriteAttributeString("Domain", "", ""); + + if (SaveSecurity.Password) + _xmlTextWriter.WriteAttributeString("Password", "", cryptographyProvider.Encrypt(connectionInfo.Password, _password)); + else + _xmlTextWriter.WriteAttributeString("Password", "", ""); + + _xmlTextWriter.WriteAttributeString("Hostname", "", connectionInfo.Hostname); + _xmlTextWriter.WriteAttributeString("Protocol", "", connectionInfo.Protocol.ToString()); + _xmlTextWriter.WriteAttributeString("PuttySession", "", connectionInfo.PuttySession); + _xmlTextWriter.WriteAttributeString("Port", "", Convert.ToString(connectionInfo.Port)); + _xmlTextWriter.WriteAttributeString("ConnectToConsole", "", Convert.ToString(connectionInfo.UseConsoleSession)); + _xmlTextWriter.WriteAttributeString("UseCredSsp", "", Convert.ToString(connectionInfo.UseCredSsp)); + _xmlTextWriter.WriteAttributeString("RenderingEngine", "", connectionInfo.RenderingEngine.ToString()); + _xmlTextWriter.WriteAttributeString("ICAEncryptionStrength", "", connectionInfo.ICAEncryptionStrength.ToString()); + _xmlTextWriter.WriteAttributeString("RDPAuthenticationLevel", "", connectionInfo.RDPAuthenticationLevel.ToString()); + _xmlTextWriter.WriteAttributeString("LoadBalanceInfo", "", connectionInfo.LoadBalanceInfo); + _xmlTextWriter.WriteAttributeString("Colors", "", connectionInfo.Colors.ToString()); + _xmlTextWriter.WriteAttributeString("Resolution", "", connectionInfo.Resolution.ToString()); + _xmlTextWriter.WriteAttributeString("AutomaticResize", "", Convert.ToString(connectionInfo.AutomaticResize)); + _xmlTextWriter.WriteAttributeString("DisplayWallpaper", "", Convert.ToString(connectionInfo.DisplayWallpaper)); + _xmlTextWriter.WriteAttributeString("DisplayThemes", "", Convert.ToString(connectionInfo.DisplayThemes)); + _xmlTextWriter.WriteAttributeString("EnableFontSmoothing", "", Convert.ToString(connectionInfo.EnableFontSmoothing)); + _xmlTextWriter.WriteAttributeString("EnableDesktopComposition", "", Convert.ToString(connectionInfo.EnableDesktopComposition)); + _xmlTextWriter.WriteAttributeString("CacheBitmaps", "", Convert.ToString(connectionInfo.CacheBitmaps)); + _xmlTextWriter.WriteAttributeString("RedirectDiskDrives", "", Convert.ToString(connectionInfo.RedirectDiskDrives)); + _xmlTextWriter.WriteAttributeString("RedirectPorts", "", Convert.ToString(connectionInfo.RedirectPorts)); + _xmlTextWriter.WriteAttributeString("RedirectPrinters", "", Convert.ToString(connectionInfo.RedirectPrinters)); + _xmlTextWriter.WriteAttributeString("RedirectSmartCards", "", Convert.ToString(connectionInfo.RedirectSmartCards)); + _xmlTextWriter.WriteAttributeString("RedirectSound", "", connectionInfo.RedirectSound.ToString()); + _xmlTextWriter.WriteAttributeString("RedirectKeys", "", Convert.ToString(connectionInfo.RedirectKeys)); + + if (connectionInfo.OpenConnections.Count > 0) + _xmlTextWriter.WriteAttributeString("Connected", "", Convert.ToString(true)); + else + _xmlTextWriter.WriteAttributeString("Connected", "", Convert.ToString(false)); + + _xmlTextWriter.WriteAttributeString("PreExtApp", "", connectionInfo.PreExtApp); + _xmlTextWriter.WriteAttributeString("PostExtApp", "", connectionInfo.PostExtApp); + _xmlTextWriter.WriteAttributeString("MacAddress", "", connectionInfo.MacAddress); + _xmlTextWriter.WriteAttributeString("UserField", "", connectionInfo.UserField); + _xmlTextWriter.WriteAttributeString("ExtApp", "", connectionInfo.ExtApp); + + _xmlTextWriter.WriteAttributeString("VNCCompression", "", connectionInfo.VNCCompression.ToString()); + _xmlTextWriter.WriteAttributeString("VNCEncoding", "", connectionInfo.VNCEncoding.ToString()); + _xmlTextWriter.WriteAttributeString("VNCAuthMode", "", connectionInfo.VNCAuthMode.ToString()); + _xmlTextWriter.WriteAttributeString("VNCProxyType", "", connectionInfo.VNCProxyType.ToString()); + _xmlTextWriter.WriteAttributeString("VNCProxyIP", "", connectionInfo.VNCProxyIP); + _xmlTextWriter.WriteAttributeString("VNCProxyPort", "", Convert.ToString(connectionInfo.VNCProxyPort)); + _xmlTextWriter.WriteAttributeString("VNCProxyUsername", "", connectionInfo.VNCProxyUsername); + _xmlTextWriter.WriteAttributeString("VNCProxyPassword", "", cryptographyProvider.Encrypt(connectionInfo.VNCProxyPassword, _password)); + _xmlTextWriter.WriteAttributeString("VNCColors", "", connectionInfo.VNCColors.ToString()); + _xmlTextWriter.WriteAttributeString("VNCSmartSizeMode", "", connectionInfo.VNCSmartSizeMode.ToString()); + _xmlTextWriter.WriteAttributeString("VNCViewOnly", "", Convert.ToString(connectionInfo.VNCViewOnly)); + + _xmlTextWriter.WriteAttributeString("RDGatewayUsageMethod", "", connectionInfo.RDGatewayUsageMethod.ToString()); + _xmlTextWriter.WriteAttributeString("RDGatewayHostname", "", connectionInfo.RDGatewayHostname); + _xmlTextWriter.WriteAttributeString("RDGatewayUseConnectionCredentials", "", connectionInfo.RDGatewayUseConnectionCredentials.ToString()); + + if (SaveSecurity.Username) + _xmlTextWriter.WriteAttributeString("RDGatewayUsername", "", connectionInfo.RDGatewayUsername); + else + _xmlTextWriter.WriteAttributeString("RDGatewayUsername", "", ""); + + if (SaveSecurity.Password) + _xmlTextWriter.WriteAttributeString("RDGatewayPassword", "", cryptographyProvider.Encrypt(connectionInfo.RDGatewayPassword, _password)); + else + _xmlTextWriter.WriteAttributeString("RDGatewayPassword", "", ""); + + if (SaveSecurity.Domain) + _xmlTextWriter.WriteAttributeString("RDGatewayDomain", "", connectionInfo.RDGatewayDomain); + else + _xmlTextWriter.WriteAttributeString("RDGatewayDomain", "", ""); + + if (SaveSecurity.Inheritance) + { + _xmlTextWriter.WriteAttributeString("InheritCacheBitmaps", "", Convert.ToString(connectionInfo.Inheritance.CacheBitmaps)); + _xmlTextWriter.WriteAttributeString("InheritColors", "", Convert.ToString(connectionInfo.Inheritance.Colors)); + _xmlTextWriter.WriteAttributeString("InheritDescription", "", Convert.ToString(connectionInfo.Inheritance.Description)); + _xmlTextWriter.WriteAttributeString("InheritDisplayThemes", "", Convert.ToString(connectionInfo.Inheritance.DisplayThemes)); + _xmlTextWriter.WriteAttributeString("InheritDisplayWallpaper", "", Convert.ToString(connectionInfo.Inheritance.DisplayWallpaper)); + _xmlTextWriter.WriteAttributeString("InheritEnableFontSmoothing", "", Convert.ToString(connectionInfo.Inheritance.EnableFontSmoothing)); + _xmlTextWriter.WriteAttributeString("InheritEnableDesktopComposition", "", Convert.ToString(connectionInfo.Inheritance.EnableDesktopComposition)); + _xmlTextWriter.WriteAttributeString("InheritDomain", "", Convert.ToString(connectionInfo.Inheritance.Domain)); + _xmlTextWriter.WriteAttributeString("InheritIcon", "", Convert.ToString(connectionInfo.Inheritance.Icon)); + _xmlTextWriter.WriteAttributeString("InheritPanel", "", Convert.ToString(connectionInfo.Inheritance.Panel)); + _xmlTextWriter.WriteAttributeString("InheritPassword", "", Convert.ToString(connectionInfo.Inheritance.Password)); + _xmlTextWriter.WriteAttributeString("InheritPort", "", Convert.ToString(connectionInfo.Inheritance.Port)); + _xmlTextWriter.WriteAttributeString("InheritProtocol", "", Convert.ToString(connectionInfo.Inheritance.Protocol)); + _xmlTextWriter.WriteAttributeString("InheritPuttySession", "", Convert.ToString(connectionInfo.Inheritance.PuttySession)); + _xmlTextWriter.WriteAttributeString("InheritRedirectDiskDrives", "", Convert.ToString(connectionInfo.Inheritance.RedirectDiskDrives)); + _xmlTextWriter.WriteAttributeString("InheritRedirectKeys", "", Convert.ToString(connectionInfo.Inheritance.RedirectKeys)); + _xmlTextWriter.WriteAttributeString("InheritRedirectPorts", "", Convert.ToString(connectionInfo.Inheritance.RedirectPorts)); + _xmlTextWriter.WriteAttributeString("InheritRedirectPrinters", "", Convert.ToString(connectionInfo.Inheritance.RedirectPrinters)); + _xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", Convert.ToString(connectionInfo.Inheritance.RedirectSmartCards)); + _xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", Convert.ToString(connectionInfo.Inheritance.RedirectSound)); + _xmlTextWriter.WriteAttributeString("InheritResolution", "", Convert.ToString(connectionInfo.Inheritance.Resolution)); + _xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", Convert.ToString(connectionInfo.Inheritance.AutomaticResize)); + _xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", Convert.ToString(connectionInfo.Inheritance.UseConsoleSession)); + _xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", Convert.ToString(connectionInfo.Inheritance.UseCredSsp)); + _xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", Convert.ToString(connectionInfo.Inheritance.RenderingEngine)); + _xmlTextWriter.WriteAttributeString("InheritUsername", "", Convert.ToString(connectionInfo.Inheritance.Username)); + _xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", Convert.ToString(connectionInfo.Inheritance.ICAEncryptionStrength)); + _xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", Convert.ToString(connectionInfo.Inheritance.RDPAuthenticationLevel)); + _xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", Convert.ToString(connectionInfo.Inheritance.LoadBalanceInfo)); + _xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", Convert.ToString(connectionInfo.Inheritance.PreExtApp)); + _xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", Convert.ToString(connectionInfo.Inheritance.PostExtApp)); + _xmlTextWriter.WriteAttributeString("InheritMacAddress", "", Convert.ToString(connectionInfo.Inheritance.MacAddress)); + _xmlTextWriter.WriteAttributeString("InheritUserField", "", Convert.ToString(connectionInfo.Inheritance.UserField)); + _xmlTextWriter.WriteAttributeString("InheritExtApp", "", Convert.ToString(connectionInfo.Inheritance.ExtApp)); + _xmlTextWriter.WriteAttributeString("InheritVNCCompression", "", Convert.ToString(connectionInfo.Inheritance.VNCCompression)); + _xmlTextWriter.WriteAttributeString("InheritVNCEncoding", "", Convert.ToString(connectionInfo.Inheritance.VNCEncoding)); + _xmlTextWriter.WriteAttributeString("InheritVNCAuthMode", "", Convert.ToString(connectionInfo.Inheritance.VNCAuthMode)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyType", "", Convert.ToString(connectionInfo.Inheritance.VNCProxyType)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyIP", "", Convert.ToString(connectionInfo.Inheritance.VNCProxyIP)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyPort", "", Convert.ToString(connectionInfo.Inheritance.VNCProxyPort)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyUsername", "", Convert.ToString(connectionInfo.Inheritance.VNCProxyUsername)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyPassword", "", Convert.ToString(connectionInfo.Inheritance.VNCProxyPassword)); + _xmlTextWriter.WriteAttributeString("InheritVNCColors", "", Convert.ToString(connectionInfo.Inheritance.VNCColors)); + _xmlTextWriter.WriteAttributeString("InheritVNCSmartSizeMode", "", Convert.ToString(connectionInfo.Inheritance.VNCSmartSizeMode)); + _xmlTextWriter.WriteAttributeString("InheritVNCViewOnly", "", Convert.ToString(connectionInfo.Inheritance.VNCViewOnly)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsageMethod", "", Convert.ToString(connectionInfo.Inheritance.RDGatewayUsageMethod)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayHostname", "", Convert.ToString(connectionInfo.Inheritance.RDGatewayHostname)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUseConnectionCredentials", "", Convert.ToString(connectionInfo.Inheritance.RDGatewayUseConnectionCredentials)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsername", "", Convert.ToString(connectionInfo.Inheritance.RDGatewayUsername)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayPassword", "", Convert.ToString(connectionInfo.Inheritance.RDGatewayPassword)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayDomain", "", Convert.ToString(connectionInfo.Inheritance.RDGatewayDomain)); + } + else + { + _xmlTextWriter.WriteAttributeString("InheritCacheBitmaps", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritColors", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritDescription", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritDisplayThemes", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritDisplayWallpaper", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritEnableFontSmoothing", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritEnableDesktopComposition", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritDomain", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritIcon", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPanel", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPassword", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPort", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritProtocol", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPuttySession", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectDiskDrives", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectKeys", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectPorts", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectPrinters", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectSmartCards", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRedirectSound", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritResolution", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritAutomaticResize", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritUseConsoleSession", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritUseCredSsp", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRenderingEngine", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritUsername", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritICAEncryptionStrength", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDPAuthenticationLevel", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritLoadBalanceInfo", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPreExtApp", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritPostExtApp", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritMacAddress", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritUserField", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritExtApp", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCCompression", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCEncoding", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCAuthMode", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyType", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyIP", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyPort", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyUsername", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCProxyPassword", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCColors", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCSmartSizeMode", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritVNCViewOnly", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayHostname", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUseConnectionCredentials", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayUsername", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayPassword", "", Convert.ToString(false)); + _xmlTextWriter.WriteAttributeString("InheritRDGatewayDomain", "", Convert.ToString(false)); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "SaveConnectionFields failed" + Environment.NewLine + ex.Message, true); + } + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/IDeserializer.cs b/mRemoteV1/Config/IDeserializer.cs new file mode 100644 index 000000000..d71e55c9f --- /dev/null +++ b/mRemoteV1/Config/IDeserializer.cs @@ -0,0 +1,9 @@ +using mRemoteNG.Tree; + +namespace mRemoteNG.Config +{ + public interface IDeserializer + { + ConnectionTreeModel Deserialize(); + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/ISerializer.cs b/mRemoteV1/Config/ISerializer.cs new file mode 100644 index 000000000..c260d15a3 --- /dev/null +++ b/mRemoteV1/Config/ISerializer.cs @@ -0,0 +1,9 @@ +using mRemoteNG.Tree; + +namespace mRemoteNG.Config +{ + public interface ISerializer + { + string Serialize(ConnectionTreeModel connectionTreeModel); + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index b89926148..4e59495b7 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -130,6 +130,9 @@ + + + From 093f8c2714c32fee45864bbe61373871d8c3b009 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 14:00:00 -0600 Subject: [PATCH 015/338] XmlConnectionsDeserializer now implements IDeserializer --- .../Config/Connections/XmlConnectionsDeserializer.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs index 078dfd399..4b73f9b91 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs @@ -22,7 +22,7 @@ using mRemoteNG.UI.TaskDialog; namespace mRemoteNG.Config.Connections { - public class XmlConnectionsDeserializer + public class XmlConnectionsDeserializer : IDeserializer { private XmlDocument _xmlDocument; private double _confVersion; @@ -78,7 +78,12 @@ namespace mRemoteNG.Config.Connections throw (new Exception($"Incompatible connection file format (file format version {_confVersion}).")); } - public ConnectionTreeModel Deserialize(bool import = false) + public ConnectionTreeModel Deserialize() + { + return Deserialize(false); + } + + public ConnectionTreeModel Deserialize(bool import) { try { From dcd63f321c740410d252f803278dfc6f4f9271c7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 14:57:17 -0600 Subject: [PATCH 016/338] Expanded some of the FileDataProvider code and created two different strategies for handling saves with backups --- mRemoteV1/Config/FileDataProvider.cs | 41 ++++++++++++++++--- .../Config/FileDataProviderWithBackup.cs | 36 ++++++++++++++++ .../FileDataProviderWithRollingBackup.cs | 35 ++++++++++++++++ mRemoteV1/mRemoteV1.csproj | 2 + 4 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 mRemoteV1/Config/FileDataProviderWithBackup.cs create mode 100644 mRemoteV1/Config/FileDataProviderWithRollingBackup.cs diff --git a/mRemoteV1/Config/FileDataProvider.cs b/mRemoteV1/Config/FileDataProvider.cs index ac939d6a3..00960de53 100644 --- a/mRemoteV1/Config/FileDataProvider.cs +++ b/mRemoteV1/Config/FileDataProvider.cs @@ -1,4 +1,6 @@ -using System.IO; +using System; +using System.IO; +using mRemoteNG.App; namespace mRemoteNG.Config { @@ -11,14 +13,43 @@ namespace mRemoteNG.Config FilePath = filePath; } - public string Load() + public virtual string Load() { - return File.ReadAllText(FilePath); + var fileContents = ""; + try + { + fileContents = File.ReadAllText(FilePath); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace($"Failed to load file {FilePath}", ex); + } + return fileContents; } - public void Save(string content) + public virtual void Save(string content) { - File.WriteAllText(FilePath, content); + try + { + File.WriteAllText(FilePath, content); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace($"Failed to save file {FilePath}", ex); + } + } + + public virtual void MoveTo(string newPath) + { + try + { + File.Move(FilePath, newPath); + FilePath = newPath; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace($"Failed to move file {FilePath} to {newPath}", ex); + } } } } \ No newline at end of file diff --git a/mRemoteV1/Config/FileDataProviderWithBackup.cs b/mRemoteV1/Config/FileDataProviderWithBackup.cs new file mode 100644 index 000000000..bd4e426e1 --- /dev/null +++ b/mRemoteV1/Config/FileDataProviderWithBackup.cs @@ -0,0 +1,36 @@ +using System; +using System.IO; +using mRemoteNG.App; + + +namespace mRemoteNG.Config +{ + public class FileDataProviderWithBackup : FileDataProvider + { + protected string BackupFileSuffix = ".backup"; + + public FileDataProviderWithBackup(string filePath) : base(filePath) + { + } + + public override void Save(string content) + { + CreateBackup(); + base.Save(content); + } + + protected virtual void CreateBackup() + { + var backupFileName = FilePath + BackupFileSuffix; + try + { + File.Copy(FilePath, backupFileName, true); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace($"Failed to create backup of file {FilePath}", ex); + throw; + } + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/FileDataProviderWithRollingBackup.cs b/mRemoteV1/Config/FileDataProviderWithRollingBackup.cs new file mode 100644 index 000000000..a2746175f --- /dev/null +++ b/mRemoteV1/Config/FileDataProviderWithRollingBackup.cs @@ -0,0 +1,35 @@ +using System; +using mRemoteNG.App; + + +namespace mRemoteNG.Config +{ + public class FileDataProviderWithRollingBackup : FileDataProviderWithBackup + { + public FileDataProviderWithRollingBackup(string filePath) : base(filePath) + { + } + + protected override void CreateBackup() + { + CreateRollingBackup(); + base.CreateBackup(); + } + + protected virtual void CreateRollingBackup() + { + var timeStamp = $"{DateTime.Now:yyyyMMdd-HHmmss-ffff}"; + var normalBackup = new FileDataProviderWithBackup(FilePath + BackupFileSuffix); + var normalBackupWithoutSuffix = normalBackup.FilePath.Replace(BackupFileSuffix, ""); + try + { + normalBackup.MoveTo(normalBackupWithoutSuffix + timeStamp + BackupFileSuffix); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace($"Failed to create rolling backup of file {FilePath}", ex); + throw; + } + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 4e59495b7..a6ac31a09 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,9 +127,11 @@ + + From bc523621236e466da034d5c89ce5c499586e298e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 14:58:04 -0600 Subject: [PATCH 017/338] ConnectionSave now uses the FileDataProviderWithBackup strategies for saving connections files in xml --- .../Config/Connections/ConnectionsSaver.cs | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 14611b331..416224bc6 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -567,24 +567,10 @@ namespace mRemoteNG.Config.Connections }; var xml = xmlConnectionsSerializer.Serialize(ConnectionTreeModel); - var tempFileName = Path.GetTempFileName(); - var fileDataProvider = new FileDataProvider(tempFileName); + //var tempFileName = Path.GetTempFileName(); + var fileDataProvider = new FileDataProviderWithBackup(ConnectionFileName); fileDataProvider.Save(xml); - if (File.Exists(ConnectionFileName)) - { - if (Export) - { - File.Delete(ConnectionFileName); - } - else - { - var backupFileName = ConnectionFileName +".backup"; - File.Delete(backupFileName); - File.Move(ConnectionFileName, backupFileName); - } - } - File.Move(tempFileName, ConnectionFileName); - } + } catch (Exception ex) { Runtime.MessageCollector.AddExceptionStackTrace("SaveToXml failed", ex); From b3ff4de2ae87176d7f7d450acf4f6b66dd8afaad Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 15:02:54 -0600 Subject: [PATCH 018/338] Moved all data providers to the namespace mRemoteNG.Config.DataProviders --- mRemoteV1/Config/Connections/ConnectionsLoader.cs | 1 + mRemoteV1/Config/Connections/ConnectionsSaver.cs | 1 + mRemoteV1/Config/{ => DataProviders}/FileDataProvider.cs | 2 +- .../{ => DataProviders}/FileDataProviderWithBackup.cs | 3 +-- .../FileDataProviderWithRollingBackup.cs | 3 +-- mRemoteV1/Config/{ => DataProviders}/IDataProvider.cs | 2 +- mRemoteV1/mRemoteV1.csproj | 8 ++++---- 7 files changed, 10 insertions(+), 10 deletions(-) rename mRemoteV1/Config/{ => DataProviders}/FileDataProvider.cs (97%) rename mRemoteV1/Config/{ => DataProviders}/FileDataProviderWithBackup.cs (95%) rename mRemoteV1/Config/{ => DataProviders}/FileDataProviderWithRollingBackup.cs (96%) rename mRemoteV1/Config/{ => DataProviders}/IDataProvider.cs (73%) diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 968278fe3..695255e6a 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -1,5 +1,6 @@ using System.Windows.Forms; using mRemoteNG.App; +using mRemoteNG.Config.DataProviders; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.UI; diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 416224bc6..b67c547bd 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using System.Xml; using mRemoteNG.App; using mRemoteNG.App.Info; +using mRemoteNG.Config.DataProviders; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.RDP; diff --git a/mRemoteV1/Config/FileDataProvider.cs b/mRemoteV1/Config/DataProviders/FileDataProvider.cs similarity index 97% rename from mRemoteV1/Config/FileDataProvider.cs rename to mRemoteV1/Config/DataProviders/FileDataProvider.cs index 00960de53..abed196bc 100644 --- a/mRemoteV1/Config/FileDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/FileDataProvider.cs @@ -2,7 +2,7 @@ using System.IO; using mRemoteNG.App; -namespace mRemoteNG.Config +namespace mRemoteNG.Config.DataProviders { public class FileDataProvider : IDataProvider { diff --git a/mRemoteV1/Config/FileDataProviderWithBackup.cs b/mRemoteV1/Config/DataProviders/FileDataProviderWithBackup.cs similarity index 95% rename from mRemoteV1/Config/FileDataProviderWithBackup.cs rename to mRemoteV1/Config/DataProviders/FileDataProviderWithBackup.cs index bd4e426e1..d04bf5b3a 100644 --- a/mRemoteV1/Config/FileDataProviderWithBackup.cs +++ b/mRemoteV1/Config/DataProviders/FileDataProviderWithBackup.cs @@ -2,8 +2,7 @@ using System.IO; using mRemoteNG.App; - -namespace mRemoteNG.Config +namespace mRemoteNG.Config.DataProviders { public class FileDataProviderWithBackup : FileDataProvider { diff --git a/mRemoteV1/Config/FileDataProviderWithRollingBackup.cs b/mRemoteV1/Config/DataProviders/FileDataProviderWithRollingBackup.cs similarity index 96% rename from mRemoteV1/Config/FileDataProviderWithRollingBackup.cs rename to mRemoteV1/Config/DataProviders/FileDataProviderWithRollingBackup.cs index a2746175f..9d01d64b7 100644 --- a/mRemoteV1/Config/FileDataProviderWithRollingBackup.cs +++ b/mRemoteV1/Config/DataProviders/FileDataProviderWithRollingBackup.cs @@ -1,8 +1,7 @@ using System; using mRemoteNG.App; - -namespace mRemoteNG.Config +namespace mRemoteNG.Config.DataProviders { public class FileDataProviderWithRollingBackup : FileDataProviderWithBackup { diff --git a/mRemoteV1/Config/IDataProvider.cs b/mRemoteV1/Config/DataProviders/IDataProvider.cs similarity index 73% rename from mRemoteV1/Config/IDataProvider.cs rename to mRemoteV1/Config/DataProviders/IDataProvider.cs index 4f464478d..13dda938a 100644 --- a/mRemoteV1/Config/IDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/IDataProvider.cs @@ -1,5 +1,5 @@  -namespace mRemoteNG.Config +namespace mRemoteNG.Config.DataProviders { public interface IDataProvider { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index a6ac31a09..276feacf3 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,16 +127,16 @@ - + - + - - + + From 8747da47a5211504dd5ff8b2410ea9fce5a45b6a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 23 Aug 2016 15:31:47 -0600 Subject: [PATCH 019/338] Began creating a serializer for Csv formatting --- .../Config/Connections/ConnectionsSaver.cs | 1 - .../Connections/CsvConnectionsSerializer.cs | 97 +++++++++++++++++++ .../Connections/XmlConnectionsSerializer.cs | 4 +- mRemoteV1/mRemoteV1.csproj | 1 + 4 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 mRemoteV1/Config/Connections/CsvConnectionsSerializer.cs diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index b67c547bd..2930b013d 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -568,7 +568,6 @@ namespace mRemoteNG.Config.Connections }; var xml = xmlConnectionsSerializer.Serialize(ConnectionTreeModel); - //var tempFileName = Path.GetTempFileName(); var fileDataProvider = new FileDataProviderWithBackup(ConnectionFileName); fileDataProvider.Save(xml); } diff --git a/mRemoteV1/Config/Connections/CsvConnectionsSerializer.cs b/mRemoteV1/Config/Connections/CsvConnectionsSerializer.cs new file mode 100644 index 000000000..b6ce7373b --- /dev/null +++ b/mRemoteV1/Config/Connections/CsvConnectionsSerializer.cs @@ -0,0 +1,97 @@ +using System; +using System.Linq; +using System.Windows.Forms; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Security; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class CsvConnectionsSerializer : ISerializer + { + private string _csv = ""; + + public Save SaveSecurity { get; set; } + + public string Serialize(ConnectionTreeModel connectionTreeModel) + { + var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); + return SerializeToCsv(rootNode); + } + + private string SerializeToCsv(RootNodeInfo rootNodeInfo) + { + if (Runtime.IsConnectionsFileLoaded == false) + return ""; + + WriteCsvHeader(); + SerializeNodesRecursive(rootNodeInfo); + return _csv; + } + + private void WriteCsvHeader() + { + var csvHeader = string.Empty; + csvHeader += "Name;Folder;Description;Icon;Panel;"; + if (SaveSecurity.Username) + csvHeader += "Username;"; + if (SaveSecurity.Password) + csvHeader += "Password;"; + if (SaveSecurity.Domain) + csvHeader += "Domain;"; + csvHeader += "Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;"; + if (SaveSecurity.Inheritance) + csvHeader += "InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain"; + _csv += csvHeader; + } + + private void SerializeNodesRecursive(ContainerInfo containerInfo) + { + foreach (var child in containerInfo.Children) + { + if (child is ContainerInfo) + SerializeNodesRecursive((ContainerInfo)child); + else + SerializeConnectionInfo(child); + } + } + + private void SerializeConnectionInfo(ConnectionInfo con) + { + var nodePath = con.TreeNode.FullPath; + + var firstSlash = nodePath.IndexOf("\\", StringComparison.Ordinal); + nodePath = nodePath.Remove(0, firstSlash + 1); + var lastSlash = nodePath.LastIndexOf("\\", StringComparison.Ordinal); + + nodePath = lastSlash > 0 ? nodePath.Remove(lastSlash) : ""; + + var csvLine = Environment.NewLine; + + csvLine += con.Name + ";" + nodePath + ";" + con.Description + ";" + con.Icon + ";" + con.Panel + ";"; + + if (SaveSecurity.Username) + csvLine += con.Username + ";"; + + if (SaveSecurity.Password) + csvLine += con.Password + ";"; + + if (SaveSecurity.Domain) + csvLine += con.Domain + ";"; + + csvLine += con.Hostname + ";" + con.Protocol + ";" + con.PuttySession + ";" + Convert.ToString(con.Port) + ";" + Convert.ToString(con.UseConsoleSession) + ";" + Convert.ToString(con.UseCredSsp) + ";" + con.RenderingEngine + ";" + con.ICAEncryptionStrength + ";" + con.RDPAuthenticationLevel + ";" + con.LoadBalanceInfo + ";" + con.Colors + ";" + con.Resolution + ";" + Convert.ToString(con.AutomaticResize) + ";" + Convert.ToString(con.DisplayWallpaper) + ";" + Convert.ToString(con.DisplayThemes) + ";" + Convert.ToString(con.EnableFontSmoothing) + ";" + Convert.ToString(con.EnableDesktopComposition) + ";" + Convert.ToString(con.CacheBitmaps) + ";" + Convert.ToString(con.RedirectDiskDrives) + ";" + Convert.ToString(con.RedirectPorts) + ";" + Convert.ToString(con.RedirectPrinters) + ";" + Convert.ToString(con.RedirectSmartCards) + ";" + con.RedirectSound + ";" + Convert.ToString(con.RedirectKeys) + ";" + con.PreExtApp + ";" + con.PostExtApp + ";" + con.MacAddress + ";" + con.UserField + ";" + con.ExtApp + ";" + con.VNCCompression + ";" + con.VNCEncoding + ";" + con.VNCAuthMode + ";" + con.VNCProxyType + ";" + con.VNCProxyIP + ";" + Convert.ToString(con.VNCProxyPort) + ";" + con.VNCProxyUsername + ";" + con.VNCProxyPassword + ";" + con.VNCColors + ";" + con.VNCSmartSizeMode + ";" + Convert.ToString(con.VNCViewOnly) + ";"; + + if (SaveSecurity.Inheritance) + { + csvLine += con.Inheritance.CacheBitmaps + ";" + Convert.ToString(con.Inheritance.Colors) + ";" + Convert.ToString(con.Inheritance.Description) + ";" + Convert.ToString(con.Inheritance.DisplayThemes) + ";" + Convert.ToString(con.Inheritance.DisplayWallpaper) + ";" + Convert.ToString(con.Inheritance.EnableFontSmoothing) + ";" + Convert.ToString(con.Inheritance.EnableDesktopComposition) + ";" + Convert.ToString(con.Inheritance.Domain) + ";" + Convert.ToString(con.Inheritance.Icon) + ";" + Convert.ToString(con.Inheritance.Panel) + ";" + Convert.ToString(con.Inheritance.Password) + ";" + Convert.ToString(con.Inheritance.Port) + ";" + Convert.ToString(con.Inheritance.Protocol) + ";" + Convert.ToString(con.Inheritance.PuttySession) + ";" + Convert.ToString(con.Inheritance.RedirectDiskDrives) + ";" + Convert.ToString(con.Inheritance.RedirectKeys) + ";" + Convert.ToString(con.Inheritance.RedirectPorts) + ";" + Convert.ToString(con.Inheritance.RedirectPrinters) + ";" + Convert.ToString(con.Inheritance.RedirectSmartCards) + ";" + Convert.ToString(con.Inheritance.RedirectSound) + ";" + Convert.ToString(con.Inheritance.Resolution) + ";" + Convert.ToString(con.Inheritance.AutomaticResize) + ";" + Convert.ToString(con.Inheritance.UseConsoleSession) + ";" + Convert.ToString(con.Inheritance.UseCredSsp) + ";" + Convert.ToString(con.Inheritance.RenderingEngine) + ";" + Convert.ToString(con.Inheritance.Username) + ";" + Convert.ToString(con.Inheritance.ICAEncryptionStrength) + ";" + Convert.ToString(con.Inheritance.RDPAuthenticationLevel) + ";" + Convert.ToString(con.Inheritance.LoadBalanceInfo) + ";" + Convert.ToString(con.Inheritance.PreExtApp) + ";" + Convert.ToString(con.Inheritance.PostExtApp) + ";" + Convert.ToString(con.Inheritance.MacAddress) + ";" + Convert.ToString(con.Inheritance.UserField) + ";" + Convert.ToString(con.Inheritance.ExtApp) + ";" + Convert.ToString(con.Inheritance.VNCCompression) + ";" + + Convert.ToString(con.Inheritance.VNCEncoding) + ";" + Convert.ToString(con.Inheritance.VNCAuthMode) + ";" + Convert.ToString(con.Inheritance.VNCProxyType) + ";" + Convert.ToString(con.Inheritance.VNCProxyIP) + ";" + Convert.ToString(con.Inheritance.VNCProxyPort) + ";" + Convert.ToString(con.Inheritance.VNCProxyUsername) + ";" + Convert.ToString(con.Inheritance.VNCProxyPassword) + ";" + Convert.ToString(con.Inheritance.VNCColors) + ";" + Convert.ToString(con.Inheritance.VNCSmartSizeMode) + ";" + Convert.ToString(con.Inheritance.VNCViewOnly); + } + + _csv += csvLine; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs index 24c735738..f202d7385 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs @@ -32,10 +32,10 @@ namespace mRemoteNG.Config.Connections public string Serialize(ConnectionTreeModel connectionTreeModel) { var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); - return SaveToXml(rootNode); + return SerializeToXml(rootNode); } - private string SaveToXml(RootNodeInfo rootNodeInfo) + private string SerializeToXml(RootNodeInfo rootNodeInfo) { var xml = ""; try diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 276feacf3..65b5e0df8 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,6 +127,7 @@ + From 21fe39542dcaba9de018793268d54bc8cc6b1ae8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 08:44:52 -0600 Subject: [PATCH 020/338] Renamed CsvConnectionsSerializer to CsvConnectionsSerializerMremotengFormat to help distinguish between this and another CSV serializer strategy --- .../Config/Connections/ConnectionsSaver.cs | 129 +----------------- ...svConnectionsSerializerMremotengFormat.cs} | 50 ++++++- mRemoteV1/mRemoteV1.csproj | 2 +- 3 files changed, 54 insertions(+), 127 deletions(-) rename mRemoteV1/Config/Connections/{CsvConnectionsSerializer.cs => CsvConnectionsSerializerMremotengFormat.cs} (69%) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 2930b013d..d66d4709d 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -74,8 +74,8 @@ namespace mRemoteNG.Config.Connections SaveToSQL(); break; case Format.mRCSV: - SaveTomRCSV(); - break; + SaveToCsv(); + break; case Format.vRDvRE: SaveToVRE(); break; @@ -576,122 +576,12 @@ namespace mRemoteNG.Config.Connections Runtime.MessageCollector.AddExceptionStackTrace("SaveToXml failed", ex); } } - #endregion - #region CSV - private StreamWriter csvWr; - - private void SaveTomRCSV() + private void SaveToCsv() { - if (Runtime.IsConnectionsFileLoaded == false) - { - return; - } - - var tN = (TreeNode)RootTreeNode.Clone(); - - var tNC = tN.Nodes; - - csvWr = new StreamWriter(ConnectionFileName); - - - string csvLn = string.Empty; - - csvLn += "Name;Folder;Description;Icon;Panel;"; - - if (SaveSecurity.Username) - { - csvLn += "Username;"; - } - - if (SaveSecurity.Password) - { - csvLn += "Password;"; - } - - if (SaveSecurity.Domain) - { - csvLn += "Domain;"; - } - - csvLn += "Hostname;Protocol;PuttySession;Port;ConnectToConsole;UseCredSsp;RenderingEngine;ICAEncryptionStrength;RDPAuthenticationLevel;LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectSmartCards;RedirectSound;RedirectKeys;PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;"; - - if (SaveSecurity.Inheritance) - { - csvLn += "InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;InheritProtocol;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;InheritUseConsoleSession;InheritUseCredSsp;InheritRenderingEngine;InheritUsername;InheritICAEncryptionStrength;InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;InheritRDGatewayUsageMethod;InheritRDGatewayHostname;InheritRDGatewayUseConnectionCredentials;InheritRDGatewayUsername;InheritRDGatewayPassword;InheritRDGatewayDomain"; - } - - csvWr.WriteLine(csvLn); - - SaveNodemRCSV(tNC); - - csvWr.Close(); - } - - private void SaveNodemRCSV(TreeNodeCollection tNC) - { - foreach (TreeNode node in tNC) - { - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection) - { - ConnectionInfo curConI = (ConnectionInfo)node.Tag; - - WritemRCSVLine(curConI); - } - else if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) - { - SaveNodemRCSV(node.Nodes); - } - } - } - - private void WritemRCSVLine(ConnectionInfo con) - { - string nodePath = con.TreeNode.FullPath; - - int firstSlash = nodePath.IndexOf("\\", StringComparison.Ordinal); - nodePath = nodePath.Remove(0, firstSlash + 1); - int lastSlash = nodePath.LastIndexOf("\\", StringComparison.Ordinal); - - if (lastSlash > 0) - { - nodePath = nodePath.Remove(lastSlash); - } - else - { - nodePath = ""; - } - - string csvLn = string.Empty; - - csvLn += con.Name + ";" + nodePath + ";" + con.Description + ";" + con.Icon + ";" + con.Panel + ";"; - - if (SaveSecurity.Username) - { - csvLn += con.Username + ";"; - } - - if (SaveSecurity.Password) - { - csvLn += con.Password + ";"; - } - - if (SaveSecurity.Domain) - { - csvLn += con.Domain + ";"; - } - - csvLn += con.Hostname + ";" + con.Protocol + ";" + con.PuttySession + ";" + Convert.ToString(con.Port) + ";" + Convert.ToString(con.UseConsoleSession) + ";" + Convert.ToString(con.UseCredSsp) + ";" + con.RenderingEngine + ";" + con.ICAEncryptionStrength + ";" + con.RDPAuthenticationLevel + ";" + con.LoadBalanceInfo + ";" + con.Colors + ";" + con.Resolution + ";" + Convert.ToString(con.AutomaticResize) + ";" + Convert.ToString(con.DisplayWallpaper) + ";" + Convert.ToString(con.DisplayThemes) + ";" + Convert.ToString(con.EnableFontSmoothing) + ";" + Convert.ToString(con.EnableDesktopComposition) + ";" + Convert.ToString(con.CacheBitmaps) + ";" + Convert.ToString(con.RedirectDiskDrives) + ";" + Convert.ToString(con.RedirectPorts) + ";" + Convert.ToString(con.RedirectPrinters) + ";" + Convert.ToString(con.RedirectSmartCards) + ";" + con.RedirectSound + ";" + Convert.ToString(con.RedirectKeys) + ";" + con.PreExtApp + ";" + con.PostExtApp + ";" + con.MacAddress + ";" + con.UserField + ";" + con.ExtApp + ";" + con.VNCCompression + ";" + con.VNCEncoding + ";" + con.VNCAuthMode + ";" + con.VNCProxyType + ";" + con.VNCProxyIP + ";" + Convert.ToString(con.VNCProxyPort) + ";" + con.VNCProxyUsername + ";" + con.VNCProxyPassword + ";" + con.VNCColors + ";" + con.VNCSmartSizeMode + ";" + Convert.ToString(con.VNCViewOnly) + ";"; - - if (SaveSecurity.Inheritance) - { - csvLn += con.Inheritance.CacheBitmaps + ";" + Convert.ToString(con.Inheritance.Colors) + ";" + Convert.ToString(con.Inheritance.Description) + ";" + Convert.ToString(con.Inheritance.DisplayThemes) + ";" + Convert.ToString(con.Inheritance.DisplayWallpaper) + ";" + Convert.ToString(con.Inheritance.EnableFontSmoothing) + ";" + Convert.ToString(con.Inheritance.EnableDesktopComposition) + ";" + Convert.ToString(con.Inheritance.Domain) + ";" + Convert.ToString(con.Inheritance.Icon) + ";" + Convert.ToString(con.Inheritance.Panel) + ";" + Convert.ToString(con.Inheritance.Password) + ";" + Convert.ToString(con.Inheritance.Port) + ";" + Convert.ToString(con.Inheritance.Protocol) + ";" + Convert.ToString(con.Inheritance.PuttySession) + ";" + Convert.ToString(con.Inheritance.RedirectDiskDrives) + ";" + Convert.ToString(con.Inheritance.RedirectKeys) + ";" + Convert.ToString(con.Inheritance.RedirectPorts) + ";" + Convert.ToString(con.Inheritance.RedirectPrinters) + ";" + Convert.ToString(con.Inheritance.RedirectSmartCards) + ";" + Convert.ToString(con.Inheritance.RedirectSound) + ";" + Convert.ToString(con.Inheritance.Resolution) + ";" + Convert.ToString(con.Inheritance.AutomaticResize) + ";" + Convert.ToString(con.Inheritance.UseConsoleSession) + ";" + Convert.ToString(con.Inheritance.UseCredSsp) + ";" + Convert.ToString(con.Inheritance.RenderingEngine) + ";" + Convert.ToString(con.Inheritance.Username) + ";" + Convert.ToString(con.Inheritance.ICAEncryptionStrength) + ";" + Convert.ToString(con.Inheritance.RDPAuthenticationLevel) + ";" + Convert.ToString(con.Inheritance.LoadBalanceInfo) + ";" + Convert.ToString(con.Inheritance.PreExtApp) + ";" + Convert.ToString(con.Inheritance.PostExtApp) + ";" + Convert.ToString(con.Inheritance.MacAddress) + ";" + Convert.ToString(con.Inheritance.UserField) + ";" + Convert.ToString(con.Inheritance.ExtApp) + ";" + Convert.ToString(con.Inheritance.VNCCompression) + ";" - + Convert.ToString(con.Inheritance.VNCEncoding) + ";" + Convert.ToString(con.Inheritance.VNCAuthMode) + ";" + Convert.ToString(con.Inheritance.VNCProxyType) + ";" + Convert.ToString(con.Inheritance.VNCProxyIP) + ";" + Convert.ToString(con.Inheritance.VNCProxyPort) + ";" + Convert.ToString(con.Inheritance.VNCProxyUsername) + ";" + Convert.ToString(con.Inheritance.VNCProxyPassword) + ";" + Convert.ToString(con.Inheritance.VNCColors) + ";" + Convert.ToString(con.Inheritance.VNCSmartSizeMode) + ";" + Convert.ToString(con.Inheritance.VNCViewOnly); - } - - csvWr.WriteLine(csvLn); - } - #endregion + var csvConnectionsSerializer = new CsvConnectionsSerializerMremotengFormat { SaveSecurity = SaveSecurity }; + csvConnectionsSerializer.Serialize(ConnectionTreeModel); + } #region vRD CSV private void SaveTovRDCSV() @@ -700,15 +590,10 @@ namespace mRemoteNG.Config.Connections { return; } - var tN = (TreeNode)RootTreeNode.Clone(); - var tNC = tN.Nodes; - - csvWr = new StreamWriter(ConnectionFileName); - + var csvWr = new StreamWriter(ConnectionFileName); SaveNodevRDCSV(tNC); - csvWr.Close(); } diff --git a/mRemoteV1/Config/Connections/CsvConnectionsSerializer.cs b/mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs similarity index 69% rename from mRemoteV1/Config/Connections/CsvConnectionsSerializer.cs rename to mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs index b6ce7373b..f85bfd61d 100644 --- a/mRemoteV1/Config/Connections/CsvConnectionsSerializer.cs +++ b/mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using System.Windows.Forms; using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Container; @@ -11,7 +10,7 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Config.Connections { - public class CsvConnectionsSerializer : ISerializer + public class CsvConnectionsSerializerMremotengFormat : ISerializer { private string _csv = ""; @@ -87,8 +86,51 @@ namespace mRemoteNG.Config.Connections if (SaveSecurity.Inheritance) { - csvLine += con.Inheritance.CacheBitmaps + ";" + Convert.ToString(con.Inheritance.Colors) + ";" + Convert.ToString(con.Inheritance.Description) + ";" + Convert.ToString(con.Inheritance.DisplayThemes) + ";" + Convert.ToString(con.Inheritance.DisplayWallpaper) + ";" + Convert.ToString(con.Inheritance.EnableFontSmoothing) + ";" + Convert.ToString(con.Inheritance.EnableDesktopComposition) + ";" + Convert.ToString(con.Inheritance.Domain) + ";" + Convert.ToString(con.Inheritance.Icon) + ";" + Convert.ToString(con.Inheritance.Panel) + ";" + Convert.ToString(con.Inheritance.Password) + ";" + Convert.ToString(con.Inheritance.Port) + ";" + Convert.ToString(con.Inheritance.Protocol) + ";" + Convert.ToString(con.Inheritance.PuttySession) + ";" + Convert.ToString(con.Inheritance.RedirectDiskDrives) + ";" + Convert.ToString(con.Inheritance.RedirectKeys) + ";" + Convert.ToString(con.Inheritance.RedirectPorts) + ";" + Convert.ToString(con.Inheritance.RedirectPrinters) + ";" + Convert.ToString(con.Inheritance.RedirectSmartCards) + ";" + Convert.ToString(con.Inheritance.RedirectSound) + ";" + Convert.ToString(con.Inheritance.Resolution) + ";" + Convert.ToString(con.Inheritance.AutomaticResize) + ";" + Convert.ToString(con.Inheritance.UseConsoleSession) + ";" + Convert.ToString(con.Inheritance.UseCredSsp) + ";" + Convert.ToString(con.Inheritance.RenderingEngine) + ";" + Convert.ToString(con.Inheritance.Username) + ";" + Convert.ToString(con.Inheritance.ICAEncryptionStrength) + ";" + Convert.ToString(con.Inheritance.RDPAuthenticationLevel) + ";" + Convert.ToString(con.Inheritance.LoadBalanceInfo) + ";" + Convert.ToString(con.Inheritance.PreExtApp) + ";" + Convert.ToString(con.Inheritance.PostExtApp) + ";" + Convert.ToString(con.Inheritance.MacAddress) + ";" + Convert.ToString(con.Inheritance.UserField) + ";" + Convert.ToString(con.Inheritance.ExtApp) + ";" + Convert.ToString(con.Inheritance.VNCCompression) + ";" - + Convert.ToString(con.Inheritance.VNCEncoding) + ";" + Convert.ToString(con.Inheritance.VNCAuthMode) + ";" + Convert.ToString(con.Inheritance.VNCProxyType) + ";" + Convert.ToString(con.Inheritance.VNCProxyIP) + ";" + Convert.ToString(con.Inheritance.VNCProxyPort) + ";" + Convert.ToString(con.Inheritance.VNCProxyUsername) + ";" + Convert.ToString(con.Inheritance.VNCProxyPassword) + ";" + Convert.ToString(con.Inheritance.VNCColors) + ";" + Convert.ToString(con.Inheritance.VNCSmartSizeMode) + ";" + Convert.ToString(con.Inheritance.VNCViewOnly); + csvLine += con.Inheritance.CacheBitmaps + ";" + + con.Inheritance.Colors + ";" + + con.Inheritance.Description + ";" + + con.Inheritance.DisplayThemes + ";" + + con.Inheritance.DisplayWallpaper + ";" + + con.Inheritance.EnableFontSmoothing + ";" + + con.Inheritance.EnableDesktopComposition + ";" + + con.Inheritance.Domain + ";" + + con.Inheritance.Icon + ";" + + con.Inheritance.Panel + ";" + + con.Inheritance.Password + ";" + + con.Inheritance.Port + ";" + + con.Inheritance.Protocol + ";" + + con.Inheritance.PuttySession + ";" + + con.Inheritance.RedirectDiskDrives + ";" + + con.Inheritance.RedirectKeys + ";" + + con.Inheritance.RedirectPorts + ";" + + con.Inheritance.RedirectPrinters + ";" + + con.Inheritance.RedirectSmartCards + ";" + + con.Inheritance.RedirectSound + ";" + + con.Inheritance.Resolution + ";" + + con.Inheritance.AutomaticResize + ";" + + con.Inheritance.UseConsoleSession + ";" + + con.Inheritance.UseCredSsp + ";" + + con.Inheritance.RenderingEngine + ";" + + con.Inheritance.Username + ";" + + con.Inheritance.ICAEncryptionStrength + ";" + + con.Inheritance.RDPAuthenticationLevel + ";" + + con.Inheritance.LoadBalanceInfo + ";" + + con.Inheritance.PreExtApp + ";" + + con.Inheritance.PostExtApp + ";" + + con.Inheritance.MacAddress + ";" + + con.Inheritance.UserField + ";" + + con.Inheritance.ExtApp + ";" + + con.Inheritance.VNCCompression + ";" + + con.Inheritance.VNCEncoding + ";" + + con.Inheritance.VNCAuthMode + ";" + + con.Inheritance.VNCProxyType + ";" + + con.Inheritance.VNCProxyIP + ";" + + con.Inheritance.VNCProxyPort + ";" + + con.Inheritance.VNCProxyUsername + ";" + + con.Inheritance.VNCProxyPassword + ";" + + con.Inheritance.VNCColors + ";" + + con.Inheritance.VNCSmartSizeMode + ";" + + con.Inheritance.VNCViewOnly; } _csv += csvLine; diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 65b5e0df8..0d536fd3a 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,7 +127,7 @@ - + From c98e672a734a01b32fbc033a3db37413a4a60415 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 08:45:45 -0600 Subject: [PATCH 021/338] minor code cleanup --- .../Config/Connections/ConnectionsSaver.cs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index d66d4709d..57d93131f 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -537,22 +537,18 @@ namespace mRemoteNG.Config.Connections } #endregion - #region XML private void EncryptCompleteFile() { - StreamReader streamReader = new StreamReader(ConnectionFileName); + var streamReader = new StreamReader(ConnectionFileName); var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - string fileContents; - fileContents = streamReader.ReadToEnd(); + var fileContents = streamReader.ReadToEnd(); streamReader.Close(); - - if (!string.IsNullOrEmpty(fileContents)) - { - StreamWriter streamWriter = new StreamWriter(ConnectionFileName); - streamWriter.Write(cryptographyProvider.Encrypt(fileContents, _password)); - streamWriter.Close(); - } + + if (string.IsNullOrEmpty(fileContents)) return; + var streamWriter = new StreamWriter(ConnectionFileName); + streamWriter.Write(cryptographyProvider.Encrypt(fileContents, _password)); + streamWriter.Close(); } private void SaveToXml() From cf87f2ee4d5ef84c88abae7352ed2f427b8b62fb Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 08:47:31 -0600 Subject: [PATCH 022/338] Fixed issue with undeclared variable --- mRemoteV1/Config/Connections/ConnectionsSaver.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 57d93131f..2336b33b1 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -578,9 +578,11 @@ namespace mRemoteNG.Config.Connections var csvConnectionsSerializer = new CsvConnectionsSerializerMremotengFormat { SaveSecurity = SaveSecurity }; csvConnectionsSerializer.Serialize(ConnectionTreeModel); } - + #region vRD CSV - private void SaveTovRDCSV() + + private StreamWriter csvWr; + private void SaveTovRDCSV() { if (Runtime.IsConnectionsFileLoaded == false) { @@ -588,7 +590,7 @@ namespace mRemoteNG.Config.Connections } var tN = (TreeNode)RootTreeNode.Clone(); var tNC = tN.Nodes; - var csvWr = new StreamWriter(ConnectionFileName); + csvWr = new StreamWriter(ConnectionFileName); SaveNodevRDCSV(tNC); csvWr.Close(); } From 396f63a3c9265685e628176c36293727a0161246 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 09:17:55 -0600 Subject: [PATCH 023/338] Added necessary call to save the csv file to disk --- mRemoteV1/Config/Connections/ConnectionsSaver.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 2336b33b1..4bfc16809 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -576,7 +576,9 @@ namespace mRemoteNG.Config.Connections private void SaveToCsv() { var csvConnectionsSerializer = new CsvConnectionsSerializerMremotengFormat { SaveSecurity = SaveSecurity }; - csvConnectionsSerializer.Serialize(ConnectionTreeModel); + var dataProvider = new FileDataProvider(ConnectionFileName); + var csvContent = csvConnectionsSerializer.Serialize(ConnectionTreeModel); + dataProvider.Save(csvContent); } #region vRD CSV From 8137b0831c558cb6ee4c1fd5f73223db4b2cf9e9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 09:18:28 -0600 Subject: [PATCH 024/338] Fixed issue where ConnectionTreeModel was not always populated when exporting. --- mRemoteV1/App/Export.cs | 10 ++++++---- mRemoteV1/UI/Forms/frmMain.cs | 2 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index 447c724e1..fe94f6526 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -1,6 +1,7 @@ using System; using System.Windows.Forms; using mRemoteNG.Config.Connections; +using mRemoteNG.Tree; using mRemoteNG.UI.Forms; @@ -8,7 +9,7 @@ namespace mRemoteNG.App { public static class Export { - public static void ExportToFile(TreeNode rootTreeNode, TreeNode selectedTreeNode) + public static void ExportToFile(TreeNode rootTreeNode, TreeNode selectedTreeNode, ConnectionTreeModel connectionTreeModel) { try { @@ -53,7 +54,7 @@ namespace mRemoteNG.App saveSecurity.Domain = exportForm.IncludeDomain; saveSecurity.Inheritance = exportForm.IncludeInheritance; - SaveExportFile(exportForm.FileName, exportForm.SaveFormat, exportTreeNode, saveSecurity); + SaveExportFile(exportForm.FileName, exportForm.SaveFormat, exportTreeNode, saveSecurity, connectionTreeModel); } } @@ -63,7 +64,7 @@ namespace mRemoteNG.App } } - private static void SaveExportFile(string fileName, ConnectionsSaver.Format saveFormat, TreeNode rootNode, Security.Save saveSecurity) + private static void SaveExportFile(string fileName, ConnectionsSaver.Format saveFormat, TreeNode rootNode, Security.Save saveSecurity, ConnectionTreeModel connectionTreeModel) { try { @@ -80,7 +81,8 @@ namespace mRemoteNG.App ConnectionList = Runtime.ConnectionList, ContainerList = Runtime.ContainerList, RootTreeNode = rootNode, - SaveSecurity = saveSecurity + SaveSecurity = saveSecurity, + ConnectionTreeModel = connectionTreeModel }; connectionsSave.SaveConnections(); } diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index c93bccb99..9d10abbbe 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -638,7 +638,7 @@ namespace mRemoteNG.UI.Forms private static void mMenFileExport_Click(object sender, EventArgs e) { - Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode); + Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); } private static void mMenFileExit_Click(object sender, EventArgs e) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index cbc02930c..49ea440f6 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -650,7 +650,7 @@ namespace mRemoteNG.UI.Window private static void cMenTreeExportFile_Click(object sender, EventArgs e) { - Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode); + Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); } private static void cMenTreeMoveUp_Click(object sender, EventArgs e) { From 269366264d5dacf10ec717090470fb720b7b34fa Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 09:26:50 -0600 Subject: [PATCH 025/338] Resolve small bug that would occur when exporting csv multiple times --- .../Connections/CsvConnectionsSerializerMremotengFormat.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs b/mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs index f85bfd61d..872fd816d 100644 --- a/mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs +++ b/mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs @@ -26,7 +26,7 @@ namespace mRemoteNG.Config.Connections { if (Runtime.IsConnectionsFileLoaded == false) return ""; - + _csv = ""; WriteCsvHeader(); SerializeNodesRecursive(rootNodeInfo); return _csv; From 6280fdf9735c74c6d59a655cc41a6e7cb029a03a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 09:56:53 -0600 Subject: [PATCH 026/338] Refactored code for exporting connections in visionapp remote desktop 2008 csv format --- .../Config/Connections/ConnectionsSaver.cs | 67 +++---------------- ...ctionsSerializerRemoteDesktop2008Format.cs | 57 ++++++++++++++++ mRemoteV1/mRemoteV1.csproj | 1 + 3 files changed, 68 insertions(+), 57 deletions(-) create mode 100644 mRemoteV1/Config/Connections/CsvConnectionsSerializerRemoteDesktop2008Format.cs diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 4bfc16809..55f22ce7e 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -74,13 +74,13 @@ namespace mRemoteNG.Config.Connections SaveToSQL(); break; case Format.mRCSV: - SaveToCsv(); + SaveToMremotengFormattedCsv(); break; case Format.vRDvRE: SaveToVRE(); break; case Format.vRDCSV: - SaveTovRDCSV(); + SaveToRemoteDesktop2008FormattedCsv(); break; default: SaveToXml(); @@ -573,7 +573,7 @@ namespace mRemoteNG.Config.Connections } } - private void SaveToCsv() + private void SaveToMremotengFormattedCsv() { var csvConnectionsSerializer = new CsvConnectionsSerializerMremotengFormat { SaveSecurity = SaveSecurity }; var dataProvider = new FileDataProvider(ConnectionFileName); @@ -582,60 +582,13 @@ namespace mRemoteNG.Config.Connections } #region vRD CSV - - private StreamWriter csvWr; - private void SaveTovRDCSV() - { - if (Runtime.IsConnectionsFileLoaded == false) - { - return; - } - var tN = (TreeNode)RootTreeNode.Clone(); - var tNC = tN.Nodes; - csvWr = new StreamWriter(ConnectionFileName); - SaveNodevRDCSV(tNC); - csvWr.Close(); - } - - private void SaveNodevRDCSV(TreeNodeCollection tNC) - { - foreach (TreeNode node in tNC) - { - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection) - { - ConnectionInfo curConI = (ConnectionInfo)node.Tag; - - if (curConI.Protocol == ProtocolType.RDP) - { - WritevRDCSVLine(curConI); - } - } - else if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) - { - SaveNodevRDCSV(node.Nodes); - } - } - } - - private void WritevRDCSVLine(ConnectionInfo con) - { - string nodePath = con.TreeNode.FullPath; - - int firstSlash = nodePath.IndexOf("\\", StringComparison.Ordinal); - nodePath = nodePath.Remove(0, firstSlash + 1); - int lastSlash = nodePath.LastIndexOf("\\", StringComparison.Ordinal); - - if (lastSlash > 0) - { - nodePath = nodePath.Remove(lastSlash); - } - else - { - nodePath = ""; - } - - csvWr.WriteLine(con.Name + ";" + con.Hostname + ";" + con.MacAddress + ";;" + Convert.ToString(con.Port) + ";" + Convert.ToString(con.UseConsoleSession) + ";" + nodePath); - } + private void SaveToRemoteDesktop2008FormattedCsv() + { + var csvSerializer = new CsvConnectionsSerializerRemoteDesktop2008Format(); + var dataProvider = new FileDataProvider(ConnectionFileName); + var csvContent = csvSerializer.Serialize(ConnectionTreeModel); + dataProvider.Save(csvContent); + } #endregion #region vRD VRE diff --git a/mRemoteV1/Config/Connections/CsvConnectionsSerializerRemoteDesktop2008Format.cs b/mRemoteV1/Config/Connections/CsvConnectionsSerializerRemoteDesktop2008Format.cs new file mode 100644 index 000000000..06582c462 --- /dev/null +++ b/mRemoteV1/Config/Connections/CsvConnectionsSerializerRemoteDesktop2008Format.cs @@ -0,0 +1,57 @@ +using System; +using System.Linq; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class CsvConnectionsSerializerRemoteDesktop2008Format : ISerializer + { + private string _csv = ""; + + public string Serialize(ConnectionTreeModel connectionTreeModel) + { + var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); + return SerializeToCsv(rootNode); + } + + private string SerializeToCsv(RootNodeInfo rootNodeInfo) + { + if (Runtime.IsConnectionsFileLoaded == false) + return ""; + + _csv = ""; + SerializeNodesRecursive(rootNodeInfo); + return _csv; + } + + private void SerializeNodesRecursive(ContainerInfo containerInfo) + { + foreach (var child in containerInfo.Children) + { + if (child is ContainerInfo) + SerializeNodesRecursive((ContainerInfo)child); + else if (child.Protocol == ProtocolType.RDP) + SerializeConnectionInfo(child); + } + } + + private void SerializeConnectionInfo(ConnectionInfo con) + { + var nodePath = con.TreeNode.FullPath; + + var firstSlash = nodePath.IndexOf("\\", StringComparison.Ordinal); + nodePath = nodePath.Remove(0, firstSlash + 1); + var lastSlash = nodePath.LastIndexOf("\\", StringComparison.Ordinal); + + nodePath = lastSlash > 0 ? nodePath.Remove(lastSlash) : ""; + + _csv += con.Name + ";" + con.Hostname + ";" + con.MacAddress + ";;" + con.Port + ";" + con.UseConsoleSession + ";" + nodePath + Environment.NewLine; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 0d536fd3a..0520f86e2 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -128,6 +128,7 @@ + From c4c175e107f7ed2a2e263e5a772193bf57344763 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 10:05:27 -0600 Subject: [PATCH 027/338] Minor code cleanup --- mRemoteV1/Config/Connections/ConnectionsSaver.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 55f22ce7e..a2c1d319b 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -85,13 +85,9 @@ namespace mRemoteNG.Config.Connections default: SaveToXml(); if (mRemoteNG.Settings.Default.EncryptCompleteConnectionsFile) - { EncryptCompleteFile(); - } if (!Export) - { frmMain.Default.ConnectionsFileName = ConnectionFileName; - } break; } frmMain.Default.AreWeUsingSqlServerForSavingConnections = SaveFormat == Format.SQL; @@ -581,7 +577,6 @@ namespace mRemoteNG.Config.Connections dataProvider.Save(csvContent); } - #region vRD CSV private void SaveToRemoteDesktop2008FormattedCsv() { var csvSerializer = new CsvConnectionsSerializerRemoteDesktop2008Format(); @@ -589,9 +584,9 @@ namespace mRemoteNG.Config.Connections var csvContent = csvSerializer.Serialize(ConnectionTreeModel); dataProvider.Save(csvContent); } - #endregion #region vRD VRE + // What export format is this? What does vRD VRE mean? private void SaveToVRE() { if (Runtime.IsConnectionsFileLoaded == false) From 530819e788c6ffc4d6034e42f50a3d2920ea6745 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 10:21:26 -0600 Subject: [PATCH 028/338] Renamed several files to be more in line with project standards --- .../SqlConnectionsUpdateChecker.cs | 6 ++--- .../{SqlConnector.cs => ISqlConnector.cs} | 2 +- ...onnectorImp.cs => SqlDatabaseConnector.cs} | 22 ++++++++----------- mRemoteV1/mRemoteV1.csproj | 4 ++-- 4 files changed, 15 insertions(+), 19 deletions(-) rename mRemoteV1/Config/{SqlConnector.cs => ISqlConnector.cs} (80%) rename mRemoteV1/Config/{SqlConnectorImp.cs => SqlDatabaseConnector.cs} (76%) diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs index b81ef2a31..16247e29e 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs @@ -9,14 +9,14 @@ namespace mRemoteNG.Config.Connections { public class SqlConnectionsUpdateChecker : IDisposable { - private SqlConnector sqlConnector; + private ISqlConnector sqlConnector; private SqlCommand sqlQuery; private SqlDataReader sqlReader; public SqlConnectionsUpdateChecker() { - sqlConnector = default(SqlConnectorImp); + sqlConnector = default(SqlDatabaseConnector); sqlQuery = default(SqlCommand); sqlReader = default(SqlDataReader); } @@ -52,7 +52,7 @@ namespace mRemoteNG.Config.Connections { try { - sqlConnector = new SqlConnectorImp(); + sqlConnector = new SqlDatabaseConnector(); sqlConnector.Connect(); } catch(Exception e) diff --git a/mRemoteV1/Config/SqlConnector.cs b/mRemoteV1/Config/ISqlConnector.cs similarity index 80% rename from mRemoteV1/Config/SqlConnector.cs rename to mRemoteV1/Config/ISqlConnector.cs index 4ec8faaf9..d04a6e189 100644 --- a/mRemoteV1/Config/SqlConnector.cs +++ b/mRemoteV1/Config/ISqlConnector.cs @@ -2,7 +2,7 @@ using System.Data.SqlClient; namespace mRemoteNG.Config { - public interface SqlConnector : IDisposable + public interface ISqlConnector : IDisposable { void Connect(); void Disconnect(); diff --git a/mRemoteV1/Config/SqlConnectorImp.cs b/mRemoteV1/Config/SqlDatabaseConnector.cs similarity index 76% rename from mRemoteV1/Config/SqlConnectorImp.cs rename to mRemoteV1/Config/SqlDatabaseConnector.cs index 012a4c8eb..cbe6135f6 100644 --- a/mRemoteV1/Config/SqlConnectorImp.cs +++ b/mRemoteV1/Config/SqlDatabaseConnector.cs @@ -1,12 +1,11 @@ using mRemoteNG.App.Info; -using System; using System.Data.SqlClient; -using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; + namespace mRemoteNG.Config { - public class SqlConnectorImp : IDisposable, mRemoteNG.Config.SqlConnector + public class SqlDatabaseConnector : ISqlConnector { private SqlConnection _sqlConnection = default(SqlConnection); private string _sqlConnectionString = ""; @@ -15,12 +14,12 @@ namespace mRemoteNG.Config private string _sqlUsername; private string _sqlPassword; - public SqlConnectorImp() + public SqlDatabaseConnector() { Initialize(); } - ~SqlConnectorImp() + ~SqlDatabaseConnector() { Dispose(false); } @@ -43,12 +42,12 @@ namespace mRemoteNG.Config private void BuildSqlConnectionStringWithCustomCredentials() { - _sqlConnectionString = string.Format("Data Source={0};Initial Catalog={1};User Id={2};Password={3}", _sqlHost, _sqlCatalog, _sqlUsername, _sqlPassword); + _sqlConnectionString = $"Data Source={_sqlHost};Initial Catalog={_sqlCatalog};User Id={_sqlUsername};Password={_sqlPassword}"; } private void BuildSqlConnectionStringWithDefaultCredentials() { - _sqlConnectionString = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True", _sqlHost, _sqlCatalog); + _sqlConnectionString = $"Data Source={_sqlHost};Initial Catalog={_sqlCatalog};Integrated Security=True"; } private void GetSqlConnectionDataFromSettings() @@ -74,7 +73,6 @@ namespace mRemoteNG.Config { sqlCommand.Connection = _sqlConnection; } - public void Dispose() { @@ -82,11 +80,9 @@ namespace mRemoteNG.Config } private void Dispose(bool itIsSafeToFreeManagedObjects) { - if (itIsSafeToFreeManagedObjects) - { - _sqlConnection.Close(); - _sqlConnection.Dispose(); - } + if (!itIsSafeToFreeManagedObjects) return; + _sqlConnection.Close(); + _sqlConnection.Dispose(); } } } \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 0520f86e2..a356d8566 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -164,8 +164,8 @@ - - + + From 2c785ade5144024a13e77e83cd2d984035bb2846 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 10:49:03 -0600 Subject: [PATCH 029/338] Initial refactor of sql saving. not even close to done --- .../Connections/SqlConnectionsSerializer.cs | 450 ++++++++++++++++++ .../Config/DataProviders/SqlDataProvider.cs | 18 + mRemoteV1/mRemoteV1.csproj | 2 + 3 files changed, 470 insertions(+) create mode 100644 mRemoteV1/Config/Connections/SqlConnectionsSerializer.cs create mode 100644 mRemoteV1/Config/DataProviders/SqlDataProvider.cs diff --git a/mRemoteV1/Config/Connections/SqlConnectionsSerializer.cs b/mRemoteV1/Config/Connections/SqlConnectionsSerializer.cs new file mode 100644 index 000000000..3c5f12509 --- /dev/null +++ b/mRemoteV1/Config/Connections/SqlConnectionsSerializer.cs @@ -0,0 +1,450 @@ +using System; +using System.Data.SqlClient; +using System.Globalization; +using System.Security; +using System.Windows.Forms; +using mRemoteNG.App; +using mRemoteNG.App.Info; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Messages; +using mRemoteNG.Security; +using mRemoteNG.Security.SymmetricEncryption; +using mRemoteNG.Tools; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class SqlConnectionsSerializer : ISerializer + { + private SqlConnection _sqlConnection; + private SqlCommand _sqlQuery; + private SecureString _password = GeneralAppInfo.EncryptionKey; + private int _currentNodeIndex; + private string _parentConstantId = Convert.ToString(0); + + public string SqlHost { get; set; } + public string SqlDatabaseName { get; set; } + public string SqlUsername { get; set; } + public string SqlPassword { get; set; } + public TreeNode RootTreeNode { get; set; } + public Save SaveSecurity { get; set; } + public ConnectionList ConnectionList { get; set; } + public ContainerList ContainerList { get; set; } + public ConnectionTreeModel ConnectionTreeModel { get; set; } + + public string Serialize(ConnectionTreeModel connectionTreeModel) + { + throw new NotImplementedException(); + } + + private bool VerifyDatabaseVersion(SqlConnection sqlConnection) + { + bool isVerified = false; + SqlDataReader sqlDataReader = null; + try + { + SqlCommand sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlConnection); + sqlDataReader = sqlCommand.ExecuteReader(); + if (!sqlDataReader.HasRows) + { + return true; // assume new empty database + } + sqlDataReader.Read(); + + var databaseVersion = new Version(Convert.ToString(sqlDataReader["confVersion"], CultureInfo.InvariantCulture)); + + sqlDataReader.Close(); + + if (databaseVersion.CompareTo(new Version(2, 2)) == 0) // 2.2 + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.3")); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new Version(2, 3); + } + + if (databaseVersion.CompareTo(new Version(2, 3)) == 0) // 2.3 + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.4")); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new Version(2, 4); + } + + if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.5")); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new Version(2, 5); + } + + if (databaseVersion.CompareTo(new Version(2, 5)) == 0) // 2.5 + { + isVerified = true; + } + + if (isVerified == false) + { + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strErrorBadDatabaseVersion, databaseVersion, GeneralAppInfo.ProdName)); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, string.Format(Language.strErrorVerifyDatabaseVersionFailed, ex.Message)); + } + finally + { + if (sqlDataReader != null) + { + if (!sqlDataReader.IsClosed) + { + sqlDataReader.Close(); + } + } + } + return isVerified; + } + + private void SaveToSQL() + { + if (SqlUsername != "") + { + _sqlConnection = new SqlConnection("Data Source=" + SqlHost + ";Initial Catalog=" + SqlDatabaseName + ";User Id=" + SqlUsername + ";Password=" + SqlPassword); + } + else + { + _sqlConnection = new SqlConnection("Data Source=" + SqlHost + ";Initial Catalog=" + SqlDatabaseName + ";Integrated Security=True"); + } + var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); + + _sqlConnection.Open(); + + if (!VerifyDatabaseVersion(_sqlConnection)) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strErrorConnectionListSaveFailed); + return; + } + + var tN = (TreeNode)RootTreeNode.Clone(); + + string strProtected; + if (tN.Tag != null) + { + if (((RootNodeInfo)tN.Tag).Password) + { + _password = Convert.ToString(((RootNodeInfo)tN.Tag).PasswordString).ConvertToSecureString(); + strProtected = cryptographyProvider.Encrypt("ThisIsProtected", _password); + } + else + { + strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); + } + } + else + { + strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); + } + + _sqlQuery = new SqlCommand("DELETE FROM tblRoot", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + _sqlQuery = new SqlCommand("INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" + MiscTools.PrepareValueForDB(tN.Text) + "\', 0, \'" + strProtected + "\'," + ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + _sqlQuery = new SqlCommand("DELETE FROM tblCons", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + TreeNodeCollection tNC = tN.Nodes; + + SaveNodesSQL(tNC); + + _sqlQuery = new SqlCommand("DELETE FROM tblUpdate", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + _sqlQuery = new SqlCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + MiscTools.DBDate(DateTime.Now) + "\')", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + _sqlConnection.Close(); + } + + private void SaveNodesSQL(TreeNodeCollection tnc) + { + foreach (TreeNode node in tnc) + { + _currentNodeIndex++; + + ConnectionInfo curConI; + var sqlInsertStatement = + "INSERT INTO tblCons (Name, Type, Expanded, Description, Icon, Panel, Username, " + + "DomainName, Password, Hostname, Protocol, PuttySession, " + + "Port, ConnectToConsole, RenderingEngine, ICAEncryptionStrength, RDPAuthenticationLevel, LoadBalanceInfo, Colors, Resolution, AutomaticResize, DisplayWallpaper, " + + "DisplayThemes, EnableFontSmoothing, EnableDesktopComposition, CacheBitmaps, RedirectDiskDrives, RedirectPorts, " + + "RedirectPrinters, RedirectSmartCards, RedirectSound, RedirectKeys, " + + "Connected, PreExtApp, PostExtApp, MacAddress, UserField, ExtApp, VNCCompression, VNCEncoding, VNCAuthMode, " + + "VNCProxyType, VNCProxyIP, VNCProxyPort, VNCProxyUsername, VNCProxyPassword, " + + "VNCColors, VNCSmartSizeMode, VNCViewOnly, " + + "RDGatewayUsageMethod, RDGatewayHostname, RDGatewayUseConnectionCredentials, RDGatewayUsername, RDGatewayPassword, RDGatewayDomain, " + + "UseCredSsp, " + "InheritCacheBitmaps, InheritColors, " + + "InheritDescription, InheritDisplayThemes, InheritDisplayWallpaper, InheritEnableFontSmoothing, InheritEnableDesktopComposition, InheritDomain, " + + "InheritIcon, InheritPanel, InheritPassword, InheritPort, " + + "InheritProtocol, InheritPuttySession, InheritRedirectDiskDrives, " + + "InheritRedirectKeys, InheritRedirectPorts, InheritRedirectPrinters, " + + "InheritRedirectSmartCards, InheritRedirectSound, InheritResolution, InheritAutomaticResize, " + + "InheritUseConsoleSession, InheritRenderingEngine, InheritUsername, InheritICAEncryptionStrength, InheritRDPAuthenticationLevel, InheritLoadBalanceInfo, " + + "InheritPreExtApp, InheritPostExtApp, InheritMacAddress, InheritUserField, InheritExtApp, InheritVNCCompression, InheritVNCEncoding, " + + "InheritVNCAuthMode, InheritVNCProxyType, InheritVNCProxyIP, InheritVNCProxyPort, " + + "InheritVNCProxyUsername, InheritVNCProxyPassword, InheritVNCColors, " + + "InheritVNCSmartSizeMode, InheritVNCViewOnly, " + + "InheritRDGatewayUsageMethod, InheritRDGatewayHostname, InheritRDGatewayUseConnectionCredentials, InheritRDGatewayUsername, InheritRDGatewayPassword, InheritRDGatewayDomain, " + + "InheritUseCredSsp, " + "PositionID, ParentID, ConstantID, LastChange)" + "VALUES ("; + _sqlQuery = new SqlCommand(sqlInsertStatement, _sqlConnection); + + if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) + { + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(node.Text) + "\',"; //Name + _sqlQuery.CommandText += "\'" + ConnectionTreeNode.GetNodeType(node) + "\',"; //Type + } + + if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) //container + { + _sqlQuery.CommandText += "\'" + ContainerList[node.Tag].IsExpanded + "\',"; //Expanded + curConI = ContainerList[node.Tag]; + SerializeConnectionInfo(curConI); + + _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); + _sqlQuery.ExecuteNonQuery(); + //_parentConstantId = _currentNodeIndex + SaveNodesSQL(node.Nodes); + } + + if (ConnectionTreeNode.GetNodeType(node) != TreeNodeType.Connection) continue; + _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; + curConI = ConnectionList[node.Tag]; + SerializeConnectionInfo(curConI); + _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); + _sqlQuery.ExecuteNonQuery(); + //_parentConstantId = 0 + } + } + + private void SerializeConnectionInfo(ConnectionInfo connectionInfo) + { + var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Description) + "\',"; + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Icon) + "\',"; + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Panel) + "\',"; + + if (SaveSecurity.Username) + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Username) + "\',"; + else + _sqlQuery.CommandText += "\'" + "" + "\',"; + + if (SaveSecurity.Domain) + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Domain) + "\',"; + else + _sqlQuery.CommandText += "\'" + "" + "\',"; + + if (SaveSecurity.Password) + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(cryptographyProvider.Encrypt(connectionInfo.Password, _password)) + "\',"; + else + _sqlQuery.CommandText += "\'" + "" + "\',"; + + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Hostname) + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Protocol + "\',"; + _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.PuttySession) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.Port) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.UseConsoleSession) + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.RenderingEngine + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.ICAEncryptionStrength + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.RDPAuthenticationLevel + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.LoadBalanceInfo + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Colors + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Resolution + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.AutomaticResize) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.DisplayWallpaper) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.DisplayThemes) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.EnableFontSmoothing) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.EnableDesktopComposition) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.CacheBitmaps) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectDiskDrives) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectPorts) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectPrinters) + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectSmartCards) + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.RedirectSound + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectKeys) + "\',"; + + if (connectionInfo.OpenConnections.Count > 0) + _sqlQuery.CommandText += 1 + ","; + else + _sqlQuery.CommandText += 0 + ","; + + _sqlQuery.CommandText += "\'" + connectionInfo.PreExtApp + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.PostExtApp + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.MacAddress + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.UserField + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.ExtApp + "\',"; + + _sqlQuery.CommandText += "\'" + connectionInfo.VNCCompression + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.VNCEncoding + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.VNCAuthMode + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.VNCProxyType + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.VNCProxyIP + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.VNCProxyPort) + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.VNCProxyUsername + "\',"; + _sqlQuery.CommandText += "\'" + cryptographyProvider.Encrypt(connectionInfo.VNCProxyPassword, _password) + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.VNCColors + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.VNCSmartSizeMode + "\',"; + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.VNCViewOnly) + "\',"; + + _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayUsageMethod + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayHostname + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayUseConnectionCredentials + "\',"; + + if (SaveSecurity.Username) + _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayUsername + "\',"; + else + _sqlQuery.CommandText += "\'" + "" + "\',"; + + if (SaveSecurity.Password) + _sqlQuery.CommandText += "\'" + cryptographyProvider.Encrypt(connectionInfo.RDGatewayPassword, _password) + "\',"; + else + _sqlQuery.CommandText += "\'" + "" + "\',"; + + if (SaveSecurity.Domain) + _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayDomain + "\',"; + else + _sqlQuery.CommandText += "\'" + "" + "\',"; + + _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.UseCredSsp) + "\',"; + + if (SaveSecurity.Inheritance) + { + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.CacheBitmaps + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Colors + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Description + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.DisplayThemes + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.DisplayWallpaper + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.EnableFontSmoothing + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.EnableDesktopComposition + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Domain + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Icon + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Panel + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Password + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Port + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Protocol + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.PuttySession + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectDiskDrives + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectKeys + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectPorts + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectPrinters + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectSmartCards + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectSound + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Resolution + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.AutomaticResize + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.UseConsoleSession + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RenderingEngine + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Username + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.ICAEncryptionStrength + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDPAuthenticationLevel + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.LoadBalanceInfo + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.PreExtApp + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.PostExtApp + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.MacAddress + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.UserField + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.ExtApp + "\',"; + + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCCompression + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCEncoding + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCAuthMode + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyType + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyIP + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyPort + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyUsername + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyPassword + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCColors + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCSmartSizeMode + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCViewOnly + "\',"; + + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayUsageMethod + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayHostname + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayUseConnectionCredentials + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayUsername + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayPassword + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayDomain + "\',"; + _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.UseCredSsp + "\',"; + } + else + { + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; // .AutomaticResize + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; // .LoadBalanceInfo + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + _sqlQuery.CommandText += "\'" + false + "\',"; + + _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayUsageMethod + _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayHostname + _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayUseConnectionCredentials + _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayUsername + _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayPassword + _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayDomain + _sqlQuery.CommandText += "\'" + false + "\',"; // .UseCredSsp + } + + connectionInfo.PositionID = _currentNodeIndex; + + if (connectionInfo.IsContainer == false) + { + _parentConstantId = connectionInfo.Parent != null ? connectionInfo.Parent.ConstantID : "0"; + } + else + { + _parentConstantId = connectionInfo.Parent.Parent != null ? connectionInfo.Parent.Parent.ConstantID : "0"; + } + + _sqlQuery.CommandText += _currentNodeIndex + ",\'" + _parentConstantId + "\',\'" + connectionInfo.ConstantID + "\',\'" + MiscTools.DBDate(DateTime.Now) + "\')"; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs new file mode 100644 index 000000000..899d67948 --- /dev/null +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -0,0 +1,18 @@ +using System; + + +namespace mRemoteNG.Config.DataProviders +{ + public class SqlDataProvider : IDataProvider + { + public string Load() + { + throw new NotImplementedException(); + } + + public void Save(string contents) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index a356d8566..3c75796fe 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -129,11 +129,13 @@ + + From 71683992a02dfb966789eceb6432735843e9105b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 24 Aug 2016 10:55:59 -0600 Subject: [PATCH 030/338] Renamed ISqlConnector to IDatabaseConnector --- .../Config/Connections/SqlConnectionsUpdateChecker.cs | 2 +- mRemoteV1/Config/DataProviders/SqlDataProvider.cs | 7 +++++++ .../Config/{ISqlConnector.cs => IDatabaseConnector.cs} | 3 ++- mRemoteV1/Config/SqlDatabaseConnector.cs | 7 +++++-- mRemoteV1/mRemoteV1.csproj | 2 +- 5 files changed, 16 insertions(+), 5 deletions(-) rename mRemoteV1/Config/{ISqlConnector.cs => IDatabaseConnector.cs} (69%) diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs index 16247e29e..4e43490d7 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs @@ -9,7 +9,7 @@ namespace mRemoteNG.Config.Connections { public class SqlConnectionsUpdateChecker : IDisposable { - private ISqlConnector sqlConnector; + private IDatabaseConnector sqlConnector; private SqlCommand sqlQuery; private SqlDataReader sqlReader; diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs index 899d67948..925a79992 100644 --- a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -5,6 +5,13 @@ namespace mRemoteNG.Config.DataProviders { public class SqlDataProvider : IDataProvider { + private IDatabaseConnector _sqlConnector; + + public SqlDataProvider(IDatabaseConnector sqlConnector) + { + _sqlConnector = sqlConnector; + } + public string Load() { throw new NotImplementedException(); diff --git a/mRemoteV1/Config/ISqlConnector.cs b/mRemoteV1/Config/IDatabaseConnector.cs similarity index 69% rename from mRemoteV1/Config/ISqlConnector.cs rename to mRemoteV1/Config/IDatabaseConnector.cs index d04a6e189..882e9e623 100644 --- a/mRemoteV1/Config/ISqlConnector.cs +++ b/mRemoteV1/Config/IDatabaseConnector.cs @@ -2,8 +2,9 @@ using System.Data.SqlClient; namespace mRemoteNG.Config { - public interface ISqlConnector : IDisposable + public interface IDatabaseConnector : IDisposable { + bool IsConnected { get; } void Connect(); void Disconnect(); void AssociateItemToThisConnector(SqlCommand sqlCommand); diff --git a/mRemoteV1/Config/SqlDatabaseConnector.cs b/mRemoteV1/Config/SqlDatabaseConnector.cs index cbe6135f6..e191fd500 100644 --- a/mRemoteV1/Config/SqlDatabaseConnector.cs +++ b/mRemoteV1/Config/SqlDatabaseConnector.cs @@ -1,11 +1,12 @@ -using mRemoteNG.App.Info; +using System.Data; +using mRemoteNG.App.Info; using System.Data.SqlClient; using mRemoteNG.Security.SymmetricEncryption; namespace mRemoteNG.Config { - public class SqlDatabaseConnector : ISqlConnector + public class SqlDatabaseConnector : IDatabaseConnector { private SqlConnection _sqlConnection = default(SqlConnection); private string _sqlConnectionString = ""; @@ -14,6 +15,8 @@ namespace mRemoteNG.Config private string _sqlUsername; private string _sqlPassword; + public bool IsConnected => (_sqlConnection.State == ConnectionState.Open); + public SqlDatabaseConnector() { Initialize(); diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 3c75796fe..f9c9be6e0 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -166,7 +166,7 @@ - + From 13d833ac5c2c713c4a1f1623a1c5dd8e8019ecc0 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 08:06:57 -0600 Subject: [PATCH 031/338] Very minor code cleanup --- mRemoteV1/Config/IDatabaseConnector.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mRemoteV1/Config/IDatabaseConnector.cs b/mRemoteV1/Config/IDatabaseConnector.cs index 882e9e623..1f3e0d50c 100644 --- a/mRemoteV1/Config/IDatabaseConnector.cs +++ b/mRemoteV1/Config/IDatabaseConnector.cs @@ -1,5 +1,7 @@ using System; using System.Data.SqlClient; + + namespace mRemoteNG.Config { public interface IDatabaseConnector : IDisposable From 03c8f96a465c1670642d7df936f5f82f21ddd531 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 11:16:49 -0600 Subject: [PATCH 032/338] Created serializer which creates a data table. This can then be used for more efficient bulk Sql transfers --- .../Connections/DataTableSerializerTests.cs | 129 +++++++ mRemoteNGTests/mRemoteNGTests.csproj | 1 + .../Config/Connections/DataTableSerializer.cs | 339 ++++++++++++++++++ mRemoteV1/mRemoteV1.csproj | 1 + 4 files changed, 470 insertions(+) create mode 100644 mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs create mode 100644 mRemoteV1/Config/Connections/DataTableSerializer.cs diff --git a/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs b/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs new file mode 100644 index 000000000..add449e66 --- /dev/null +++ b/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs @@ -0,0 +1,129 @@ +using mRemoteNG.Config.Connections; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Security; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; +using NUnit.Framework; + + +namespace mRemoteNGTests.Config.Connections +{ + public class DataTableSerializerTests + { + private DataTableSerializer _dataTableSerializer; + private Save _saveFilter; + + [SetUp] + public void Setup() + { + _saveFilter = new Save(); + _dataTableSerializer = new DataTableSerializer(_saveFilter); + } + + [TearDown] + public void Teardown() + { + _saveFilter = null; + _dataTableSerializer = null; + } + + [Test] + public void AllItemsSerialized() + { + var model = CreateConnectionTreeModel(); + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows.Count, Is.EqualTo(3)); + } + + [Test] + public void UsernameSerializedWhenSaveSecurityAllowsIt() + { + var model = CreateConnectionTreeModel(); + _saveFilter.Username = true; + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows[0]["Username"], Is.Not.EqualTo("")); + } + + [Test] + public void DomainSerializedWhenSaveSecurityAllowsIt() + { + var model = CreateConnectionTreeModel(); + _saveFilter.Domain = true; + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows[0]["Domain"], Is.Not.EqualTo("")); + } + + [Test] + public void PasswordSerializedWhenSaveSecurityAllowsIt() + { + var model = CreateConnectionTreeModel(); + _saveFilter.Password = true; + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows[0]["Password"], Is.Not.EqualTo("")); + } + + [Test] + public void InheritanceSerializedWhenSaveSecurityAllowsIt() + { + var model = CreateConnectionTreeModel(); + _saveFilter.Inheritance = true; + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows[0]["InheritUsername"], Is.Not.EqualTo("")); + } + + + + [Test] + public void UsernameNotSerializedWhenSaveSecurityDisabled() + { + var model = CreateConnectionTreeModel(); + _saveFilter.Username = false; + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows[0]["Username"], Is.EqualTo("")); + } + + [Test] + public void DomainNotSerializedWhenSaveSecurityDisabled() + { + var model = CreateConnectionTreeModel(); + _saveFilter.Domain = false; + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows[0]["Domain"], Is.EqualTo("")); + } + + [Test] + public void PasswordNotSerializedWhenSaveSecurityDisabled() + { + var model = CreateConnectionTreeModel(); + _saveFilter.Password = false; + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows[0]["Password"], Is.EqualTo("")); + } + + [Test] + public void InheritanceNotSerializedWhenSaveSecurityDisabled() + { + var model = CreateConnectionTreeModel(); + _saveFilter.Inheritance = false; + var dataTable = _dataTableSerializer.Serialize(model); + Assert.That(dataTable.Rows[0]["InheritUsername"], Is.EqualTo("")); + } + + + private ConnectionTreeModel CreateConnectionTreeModel() + { + var model = new ConnectionTreeModel(); + var root = new RootNodeInfo(RootNodeType.Connection); + var folder1 = new ContainerInfo {Name = "folder1", Username = "user1", Domain = "domain1", Password = "password1"}; + var con1 = new ConnectionInfo {Name = "Con1", Username = "user1", Domain = "domain1", Password = "password1" }; + var con2 = new ConnectionInfo {Name = "Con2", Username = "user2", Domain = "domain2", Password = "password2" }; + + root.Add(folder1); + root.Add(con2); + folder1.Add(con1); + model.AddRootNode(root); + return model; + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index a276ae235..fae75f179 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -102,6 +102,7 @@ + diff --git a/mRemoteV1/Config/Connections/DataTableSerializer.cs b/mRemoteV1/Config/Connections/DataTableSerializer.cs new file mode 100644 index 000000000..0fce8dd98 --- /dev/null +++ b/mRemoteV1/Config/Connections/DataTableSerializer.cs @@ -0,0 +1,339 @@ +using System.Data; +using System.Linq; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Security; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class DataTableSerializer + { + private DataTable _dataTable; + private const string TableName = "tblCons"; + private readonly Save _saveSecurity; + + public DataTableSerializer(Save saveSecurity) + { + _saveSecurity = saveSecurity; + } + + + public DataTable Serialize(ConnectionTreeModel connectionTreeModel) + { + var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); + SerializeToDataTable(rootNode); + return _dataTable; + } + + private void SerializeToDataTable(RootNodeInfo rootNodeInfo) + { + _dataTable = new DataTable(TableName); + CreateSchema(); + SetPrimaryKey(); + SerializeNodesRecursive(rootNodeInfo); + } + + private void CreateSchema() + { + _dataTable.Columns.Add("Name"); + _dataTable.Columns.Add("Type"); + _dataTable.Columns.Add("ConstantID"); + _dataTable.Columns.Add("ParentID"); + _dataTable.Columns.Add("Expanded"); + _dataTable.Columns.Add("Descr"); + _dataTable.Columns.Add("Icon"); + _dataTable.Columns.Add("Panel"); + _dataTable.Columns.Add("Username"); + _dataTable.Columns.Add("Domain"); + _dataTable.Columns.Add("Password"); + _dataTable.Columns.Add("Hostname"); + _dataTable.Columns.Add("Protocol"); + _dataTable.Columns.Add("PuttySession"); + _dataTable.Columns.Add("Port"); + _dataTable.Columns.Add("ConnectToConsole"); + _dataTable.Columns.Add("UseCredSsp"); + _dataTable.Columns.Add("RenderingEngine"); + _dataTable.Columns.Add("ICAEncryptionStrength"); + _dataTable.Columns.Add("RDPAuthenticationLevel"); + _dataTable.Columns.Add("LoadBalanceInfo"); + _dataTable.Columns.Add("Colors"); + _dataTable.Columns.Add("Resolution"); + _dataTable.Columns.Add("AutomaticResize"); + _dataTable.Columns.Add("DisplayWallpaper"); + _dataTable.Columns.Add("DisplayThemes"); + _dataTable.Columns.Add("EnableFontSmoothing"); + _dataTable.Columns.Add("EnableDesktopComposition"); + _dataTable.Columns.Add("CacheBitmaps"); + _dataTable.Columns.Add("RedirectDiskDrives"); + _dataTable.Columns.Add("RedirectPorts"); + _dataTable.Columns.Add("RedirectPrinters"); + _dataTable.Columns.Add("RedirectSmartCards"); + _dataTable.Columns.Add("RedirectSound"); + _dataTable.Columns.Add("RedirectKeys"); + _dataTable.Columns.Add("Connected"); + _dataTable.Columns.Add("PreExtApp"); + _dataTable.Columns.Add("PostExtApp"); + _dataTable.Columns.Add("MacAddress"); + _dataTable.Columns.Add("UserField"); + _dataTable.Columns.Add("ExtApp"); + _dataTable.Columns.Add("VNCCompression"); + _dataTable.Columns.Add("VNCEncoding"); + _dataTable.Columns.Add("VNCAuthMode"); + _dataTable.Columns.Add("VNCProxyType"); + _dataTable.Columns.Add("VNCProxyIP"); + _dataTable.Columns.Add("VNCProxyPort"); + _dataTable.Columns.Add("VNCProxyUsername"); + _dataTable.Columns.Add("VNCProxyPassword"); + _dataTable.Columns.Add("VNCColors"); + _dataTable.Columns.Add("VNCSmartSizeMode"); + _dataTable.Columns.Add("VNCViewOnly"); + _dataTable.Columns.Add("RDGatewayUsageMethod"); + _dataTable.Columns.Add("RDGatewayHostname"); + _dataTable.Columns.Add("RDGatewayUseConnectionCredentials"); + _dataTable.Columns.Add("RDGatewayUsername"); + _dataTable.Columns.Add("RDGatewayPassword"); + _dataTable.Columns.Add("RDGatewayDomain"); + _dataTable.Columns.Add("InheritCacheBitmaps"); + _dataTable.Columns.Add("InheritColors"); + _dataTable.Columns.Add("InheritDescription"); + _dataTable.Columns.Add("InheritDisplayThemes"); + _dataTable.Columns.Add("InheritDisplayWallpaper"); + _dataTable.Columns.Add("InheritEnableFontSmoothing"); + _dataTable.Columns.Add("InheritEnableDesktopComposition"); + _dataTable.Columns.Add("InheritDomain"); + _dataTable.Columns.Add("InheritIcon"); + _dataTable.Columns.Add("InheritPanel"); + _dataTable.Columns.Add("InheritPassword"); + _dataTable.Columns.Add("InheritPort"); + _dataTable.Columns.Add("InheritProtocol"); + _dataTable.Columns.Add("InheritPuttySession"); + _dataTable.Columns.Add("InheritRedirectDiskDrives"); + _dataTable.Columns.Add("InheritRedirectKeys"); + _dataTable.Columns.Add("InheritRedirectPorts"); + _dataTable.Columns.Add("InheritRedirectPrinters"); + _dataTable.Columns.Add("InheritRedirectSmartCards"); + _dataTable.Columns.Add("InheritRedirectSound"); + _dataTable.Columns.Add("InheritResolution"); + _dataTable.Columns.Add("InheritAutomaticResize"); + _dataTable.Columns.Add("InheritUseConsoleSession"); + _dataTable.Columns.Add("InheritUseCredSsp"); + _dataTable.Columns.Add("InheritRenderingEngine"); + _dataTable.Columns.Add("InheritUsername"); + _dataTable.Columns.Add("InheritICAEncryptionStrength"); + _dataTable.Columns.Add("InheritRDPAuthenticationLevel"); + _dataTable.Columns.Add("InheritLoadBalanceInfo"); + _dataTable.Columns.Add("InheritPreExtApp"); + _dataTable.Columns.Add("InheritPostExtApp"); + _dataTable.Columns.Add("InheritMacAddress"); + _dataTable.Columns.Add("InheritUserField"); + _dataTable.Columns.Add("InheritExtApp"); + _dataTable.Columns.Add("InheritVNCCompression"); + _dataTable.Columns.Add("InheritVNCEncoding"); + _dataTable.Columns.Add("InheritVNCAuthMode"); + _dataTable.Columns.Add("InheritVNCProxyType"); + _dataTable.Columns.Add("InheritVNCProxyIP"); + _dataTable.Columns.Add("InheritVNCProxyPort"); + _dataTable.Columns.Add("InheritVNCProxyUsername"); + _dataTable.Columns.Add("InheritVNCProxyPassword"); + _dataTable.Columns.Add("InheritVNCColors"); + _dataTable.Columns.Add("InheritVNCSmartSizeMode"); + _dataTable.Columns.Add("InheritVNCViewOnly"); + _dataTable.Columns.Add("InheritRDGatewayUsageMethod"); + _dataTable.Columns.Add("InheritRDGatewayHostname"); + _dataTable.Columns.Add("InheritRDGatewayUseConnectionCredentials"); + _dataTable.Columns.Add("InheritRDGatewayUsername"); + _dataTable.Columns.Add("InheritRDGatewayPassword"); + _dataTable.Columns.Add("InheritRDGatewayDomain"); + } + + private void SetPrimaryKey() + { + _dataTable.PrimaryKey = new[] { _dataTable.Columns["ConstantID"] }; + } + + private void SerializeNodesRecursive(ConnectionInfo connectionInfo) + { + if (!(connectionInfo is RootNodeInfo)) + SerializeConnectionInfo(connectionInfo); + var containerInfo = connectionInfo as ContainerInfo; + if (containerInfo == null) return; + foreach (var child in containerInfo.Children) + SerializeNodesRecursive(child); + } + + private void SerializeConnectionInfo(ConnectionInfo connectionInfo) + { + var dataRow = _dataTable.NewRow(); + dataRow["Name"] = connectionInfo.Name; + dataRow["Type"] = ConnectionTreeNode.GetNodeType(connectionInfo.TreeNode).ToString(); + dataRow["ConstantID"] = connectionInfo.ConstantID; + dataRow["ParentID"] = connectionInfo.Parent.ConstantID; + dataRow["Expanded"] = connectionInfo is ContainerInfo ? ((ContainerInfo)connectionInfo).IsExpanded.ToString() : ""; + dataRow["Descr"] = connectionInfo.Description; + dataRow["Icon"] = connectionInfo.Icon; + dataRow["Panel"] = connectionInfo.Panel; + dataRow["Username"] = _saveSecurity.Username ? connectionInfo.Username : ""; + dataRow["Domain"] = _saveSecurity.Domain ? connectionInfo.Domain : ""; + dataRow["Password"] = _saveSecurity.Password ? connectionInfo.Password : ""; + dataRow["Hostname"] = connectionInfo.Hostname; + dataRow["Protocol"] = connectionInfo.Protocol; + dataRow["PuttySession"] = connectionInfo.PuttySession; + dataRow["Port"] = connectionInfo.Port; + dataRow["ConnectToConsole"] = connectionInfo.UseConsoleSession; + dataRow["UseCredSsp"] = connectionInfo.UseCredSsp; + dataRow["RenderingEngine"] = connectionInfo.RenderingEngine; + dataRow["ICAEncryptionStrength"] = connectionInfo.ICAEncryptionStrength; + dataRow["RDPAuthenticationLevel"] = connectionInfo.RDPAuthenticationLevel; + dataRow["LoadBalanceInfo"] = connectionInfo.LoadBalanceInfo; + dataRow["Colors"] = connectionInfo.Colors; + dataRow["Resolution"] = connectionInfo.Resolution; + dataRow["AutomaticResize"] = connectionInfo.AutomaticResize; + dataRow["DisplayWallpaper"] = connectionInfo.DisplayWallpaper; + dataRow["DisplayThemes"] = connectionInfo.DisplayThemes; + dataRow["EnableFontSmoothing"] = connectionInfo.EnableFontSmoothing; + dataRow["EnableDesktopComposition"] = connectionInfo.EnableDesktopComposition; + dataRow["CacheBitmaps"] = connectionInfo.CacheBitmaps; + dataRow["RedirectDiskDrives"] = connectionInfo.RedirectDiskDrives; + dataRow["RedirectPorts"] = connectionInfo.RedirectPorts; + dataRow["RedirectPrinters"] = connectionInfo.RedirectPrinters; + dataRow["RedirectSmartCards"] = connectionInfo.RedirectSmartCards; + dataRow["RedirectSound"] = connectionInfo.RedirectSound; + dataRow["RedirectKeys"] = connectionInfo.RedirectKeys; + dataRow["Connected"] = connectionInfo.OpenConnections.Count > 0 ? "true" : "false"; + dataRow["PreExtApp"] = connectionInfo.PreExtApp; + dataRow["PostExtApp"] = connectionInfo.PostExtApp; + dataRow["MacAddress"] = connectionInfo.MacAddress; + dataRow["UserField"] = connectionInfo.UserField; + dataRow["ExtApp"] = connectionInfo.ExtApp; + dataRow["VNCCompression"] = connectionInfo.VNCCompression; + dataRow["VNCEncoding"] = connectionInfo.VNCEncoding; + dataRow["VNCAuthMode"] = connectionInfo.VNCAuthMode; + dataRow["VNCProxyType"] = connectionInfo.VNCProxyType; + dataRow["VNCProxyIP"] = connectionInfo.VNCProxyIP; + dataRow["VNCProxyPort"] = connectionInfo.VNCProxyPort; + dataRow["VNCProxyUsername"] = connectionInfo.VNCProxyUsername; + dataRow["VNCProxyPassword"] = connectionInfo.VNCProxyPassword; + dataRow["VNCColors"] = connectionInfo.VNCColors; + dataRow["VNCSmartSizeMode"] = connectionInfo.VNCSmartSizeMode; + dataRow["VNCViewOnly"] = connectionInfo.VNCViewOnly; + dataRow["RDGatewayUsageMethod"] = connectionInfo.RDGatewayUsageMethod; + dataRow["RDGatewayHostname"] = connectionInfo.RDGatewayHostname; + dataRow["RDGatewayUseConnectionCredentials"] = connectionInfo.RDGatewayUseConnectionCredentials; + dataRow["RDGatewayUsername"] = connectionInfo.RDGatewayUsername; + dataRow["RDGatewayPassword"] = connectionInfo.RDGatewayPassword; + dataRow["RDGatewayDomain"] = connectionInfo.RDGatewayDomain; + if (_saveSecurity.Inheritance) + { + dataRow["InheritCacheBitmaps"] = connectionInfo.Inheritance.CacheBitmaps; + dataRow["InheritColors"] = connectionInfo.Inheritance.Colors; + dataRow["InheritDescription"] = connectionInfo.Inheritance.Description; + dataRow["InheritDisplayThemes"] = connectionInfo.Inheritance.DisplayThemes; + dataRow["InheritDisplayWallpaper"] = connectionInfo.Inheritance.DisplayWallpaper; + dataRow["InheritEnableFontSmoothing"] = connectionInfo.Inheritance.EnableFontSmoothing; + dataRow["InheritEnableDesktopComposition"] = connectionInfo.Inheritance.EnableDesktopComposition; + dataRow["InheritDomain"] = connectionInfo.Inheritance.Domain; + dataRow["InheritIcon"] = connectionInfo.Inheritance.Icon; + dataRow["InheritPanel"] = connectionInfo.Inheritance.Panel; + dataRow["InheritPassword"] = connectionInfo.Inheritance.Password; + dataRow["InheritPort"] = connectionInfo.Inheritance.Port; + dataRow["InheritProtocol"] = connectionInfo.Inheritance.Protocol; + dataRow["InheritPuttySession"] = connectionInfo.Inheritance.PuttySession; + dataRow["InheritRedirectDiskDrives"] = connectionInfo.Inheritance.RedirectDiskDrives; + dataRow["InheritRedirectKeys"] = connectionInfo.Inheritance.RedirectKeys; + dataRow["InheritRedirectPorts"] = connectionInfo.Inheritance.RedirectPorts; + dataRow["InheritRedirectPrinters"] = connectionInfo.Inheritance.RedirectPrinters; + dataRow["InheritRedirectSmartCards"] = connectionInfo.Inheritance.RedirectSmartCards; + dataRow["InheritRedirectSound"] = connectionInfo.Inheritance.RedirectSound; + dataRow["InheritResolution"] = connectionInfo.Inheritance.Resolution; + dataRow["InheritAutomaticResize"] = connectionInfo.Inheritance.AutomaticResize; + dataRow["InheritUseConsoleSession"] = connectionInfo.Inheritance.UseConsoleSession; + dataRow["InheritUseCredSsp"] = connectionInfo.Inheritance.UseCredSsp; + dataRow["InheritRenderingEngine"] = connectionInfo.Inheritance.RenderingEngine; + dataRow["InheritUsername"] = connectionInfo.Inheritance.Username; + dataRow["InheritICAEncryptionStrength"] = connectionInfo.Inheritance.ICAEncryptionStrength; + dataRow["InheritRDPAuthenticationLevel"] = connectionInfo.Inheritance.RDPAuthenticationLevel; + dataRow["InheritLoadBalanceInfo"] = connectionInfo.Inheritance.LoadBalanceInfo; + dataRow["InheritPreExtApp"] = connectionInfo.Inheritance.PreExtApp; + dataRow["InheritPostExtApp"] = connectionInfo.Inheritance.PostExtApp; + dataRow["InheritMacAddress"] = connectionInfo.Inheritance.MacAddress; + dataRow["InheritUserField"] = connectionInfo.Inheritance.UserField; + dataRow["InheritExtApp"] = connectionInfo.Inheritance.ExtApp; + dataRow["InheritVNCCompression"] = connectionInfo.Inheritance.VNCCompression; + dataRow["InheritVNCEncoding"] = connectionInfo.Inheritance.VNCEncoding; + dataRow["InheritVNCAuthMode"] = connectionInfo.Inheritance.VNCAuthMode; + dataRow["InheritVNCProxyType"] = connectionInfo.Inheritance.VNCProxyType; + dataRow["InheritVNCProxyIP"] = connectionInfo.Inheritance.VNCProxyIP; + dataRow["InheritVNCProxyPort"] = connectionInfo.Inheritance.VNCProxyPort; + dataRow["InheritVNCProxyUsername"] = connectionInfo.Inheritance.VNCProxyUsername; + dataRow["InheritVNCProxyPassword"] = connectionInfo.Inheritance.VNCProxyPassword; + dataRow["InheritVNCColors"] = connectionInfo.Inheritance.VNCColors; + dataRow["InheritVNCSmartSizeMode"] = connectionInfo.Inheritance.VNCSmartSizeMode; + dataRow["InheritVNCViewOnly"] = connectionInfo.Inheritance.VNCViewOnly; + dataRow["InheritRDGatewayUsageMethod"] = connectionInfo.Inheritance.RDGatewayUsageMethod; + dataRow["InheritRDGatewayHostname"] = connectionInfo.Inheritance.RDGatewayHostname; + dataRow["InheritRDGatewayUseConnectionCredentials"] = connectionInfo.Inheritance.RDGatewayUseConnectionCredentials; + dataRow["InheritRDGatewayUsername"] = connectionInfo.Inheritance.RDGatewayUsername; + dataRow["InheritRDGatewayPassword"] = connectionInfo.Inheritance.RDGatewayPassword; + dataRow["InheritRDGatewayDomain"] = connectionInfo.Inheritance.RDGatewayDomain; + } + else + { + dataRow["InheritCacheBitmaps"] = ""; + dataRow["InheritColors"] = ""; + dataRow["InheritDescription"] = ""; + dataRow["InheritDisplayThemes"] = ""; + dataRow["InheritDisplayWallpaper"] = ""; + dataRow["InheritEnableFontSmoothing"] = ""; + dataRow["InheritEnableDesktopComposition"] = ""; + dataRow["InheritDomain"] = ""; + dataRow["InheritIcon"] = ""; + dataRow["InheritPanel"] = ""; + dataRow["InheritPassword"] = ""; + dataRow["InheritPort"] = ""; + dataRow["InheritProtocol"] = ""; + dataRow["InheritPuttySession"] = ""; + dataRow["InheritRedirectDiskDrives"] = ""; + dataRow["InheritRedirectKeys"] = ""; + dataRow["InheritRedirectPorts"] = ""; + dataRow["InheritRedirectPrinters"] = ""; + dataRow["InheritRedirectSmartCards"] = ""; + dataRow["InheritRedirectSound"] = ""; + dataRow["InheritResolution"] = ""; + dataRow["InheritAutomaticResize"] = ""; + dataRow["InheritUseConsoleSession"] = ""; + dataRow["InheritUseCredSsp"] = ""; + dataRow["InheritRenderingEngine"] = ""; + dataRow["InheritUsername"] = ""; + dataRow["InheritICAEncryptionStrength"] = ""; + dataRow["InheritRDPAuthenticationLevel"] = ""; + dataRow["InheritLoadBalanceInfo"] = ""; + dataRow["InheritPreExtApp"] = ""; + dataRow["InheritPostExtApp"] = ""; + dataRow["InheritMacAddress"] = ""; + dataRow["InheritUserField"] = ""; + dataRow["InheritExtApp"] = ""; + dataRow["InheritVNCCompression"] = ""; + dataRow["InheritVNCEncoding"] = ""; + dataRow["InheritVNCAuthMode"] = ""; + dataRow["InheritVNCProxyType"] = ""; + dataRow["InheritVNCProxyIP"] = ""; + dataRow["InheritVNCProxyPort"] = ""; + dataRow["InheritVNCProxyUsername"] = ""; + dataRow["InheritVNCProxyPassword"] = ""; + dataRow["InheritVNCColors"] = ""; + dataRow["InheritVNCSmartSizeMode"] = ""; + dataRow["InheritVNCViewOnly"] = ""; + dataRow["InheritRDGatewayUsageMethod"] = ""; + dataRow["InheritRDGatewayHostname"] = ""; + dataRow["InheritRDGatewayUseConnectionCredentials"] = ""; + dataRow["InheritRDGatewayUsername"] = ""; + dataRow["InheritRDGatewayPassword"] = ""; + dataRow["InheritRDGatewayDomain"] = ""; + } + _dataTable.Rows.Add(dataRow); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index f9c9be6e0..5a0c0c1ab 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -129,6 +129,7 @@ + From 60f79b4400067c9c94024052b87c97c705d4b66e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 13:13:08 -0600 Subject: [PATCH 033/338] Fixed bug where uninitialized sql database would not load --- mRemoteV1/App/Runtime.cs | 4 +- .../Config/Connections/ConnectionsSaver.cs | 268 +++++++++--------- .../Connections/SqlConnectionsLoader.cs | 46 +-- mRemoteV1/UI/Forms/frmMain.cs | 4 +- 4 files changed, 174 insertions(+), 148 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 38adb33dd..11aefe2c8 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -481,8 +481,8 @@ namespace mRemoteNG.App public static void SaveConnections(bool Update = false) { - if (!IsConnectionsFileLoaded) - return; + //if (!IsConnectionsFileLoaded) + // return; try { diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index a2c1d319b..7eea9cde6 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -71,7 +71,7 @@ namespace mRemoteNG.Config.Connections switch (SaveFormat) { case Format.SQL: - SaveToSQL(); + SaveToSql(); break; case Format.mRCSV: SaveToMremotengFormattedCsv(); @@ -95,137 +95,151 @@ namespace mRemoteNG.Config.Connections #endregion #region SQL - private bool VerifyDatabaseVersion(SqlConnection sqlConnection) + private void SaveToSql() { - bool isVerified = false; - SqlDataReader sqlDataReader = null; - try - { - SqlCommand sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlConnection); - sqlDataReader = sqlCommand.ExecuteReader(); - if (!sqlDataReader.HasRows) - { - return true; // assume new empty database - } - sqlDataReader.Read(); - - var databaseVersion = new Version(Convert.ToString(sqlDataReader["confVersion"], CultureInfo.InvariantCulture)); - - sqlDataReader.Close(); - - if (databaseVersion.CompareTo(new Version(2, 2)) == 0) // 2.2 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.3")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 3); - } - - if (databaseVersion.CompareTo(new Version(2, 3)) == 0) // 2.3 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.4")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 4); - } - - if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.5")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 5); - } - - if (databaseVersion.CompareTo(new Version(2, 5)) == 0) // 2.5 - { - isVerified = true; - } - - if (isVerified == false) - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strErrorBadDatabaseVersion, databaseVersion, GeneralAppInfo.ProdName)); - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, string.Format(Language.strErrorVerifyDatabaseVersionFailed, ex.Message)); - } - finally - { - if (sqlDataReader != null) - { - if (!sqlDataReader.IsClosed) - { - sqlDataReader.Close(); - } - } - } - return isVerified; - } - - private void SaveToSQL() - { - if (SQLUsername != "") - { - _sqlConnection = new SqlConnection("Data Source=" + SQLHost + ";Initial Catalog=" + SQLDatabaseName + ";User Id=" + SQLUsername + ";Password=" + SQLPassword); - } - else - { - _sqlConnection = new SqlConnection("Data Source=" + SQLHost + ";Initial Catalog=" + SQLDatabaseName + ";Integrated Security=True"); - } - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - - _sqlConnection.Open(); - - if (!VerifyDatabaseVersion(_sqlConnection)) + OpenDatabaseConnection(); + if (!VerifyDatabaseVersion(_sqlConnection)) { Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strErrorConnectionListSaveFailed); return ; } - var tN = (TreeNode)RootTreeNode.Clone(); - - string strProtected; - if (tN.Tag != null) - { - if (((RootNodeInfo) tN.Tag).Password) - { - _password = Convert.ToString(((RootNodeInfo) tN.Tag).PasswordString).ConvertToSecureString(); - strProtected = cryptographyProvider.Encrypt("ThisIsProtected", _password); - } - else - { - strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); - } - } - else - { - strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); - } - - _sqlQuery = new SqlCommand("DELETE FROM tblRoot", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); + var rootTreeNode = (TreeNode)RootTreeNode.Clone(); - _sqlQuery = new SqlCommand("INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" + MiscTools.PrepareValueForDB(tN.Text) + "\', 0, \'" + strProtected + "\'," + ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - _sqlQuery = new SqlCommand("DELETE FROM tblCons", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - TreeNodeCollection tNC = tN.Nodes; + UpdateRootNodeTable(rootTreeNode); + UpdateConnectionsTable(rootTreeNode); + UpdateUpdatesTable(); - SaveNodesSQL(tNC); - - _sqlQuery = new SqlCommand("DELETE FROM tblUpdate", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - _sqlQuery = new SqlCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + MiscTools.DBDate(DateTime.Now) + "\')", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - _sqlConnection.Close(); + _sqlConnection.Close(); } - - private void SaveNodesSQL(TreeNodeCollection tnc) + + private void OpenDatabaseConnection() + { + var sqlConnectionString = "Data Source=" + SQLHost + ";Initial Catalog=" + SQLDatabaseName; + sqlConnectionString += SQLUsername != "" + ? ";User Id=" + SQLUsername + ";Password=" + SQLPassword + : ";Integrated Security=True"; + _sqlConnection = new SqlConnection(sqlConnectionString); + _sqlConnection.Open(); + } + + private bool VerifyDatabaseVersion(SqlConnection sqlConnection) + { + var isVerified = false; + try + { + var databaseVersion = GetDatabaseVersion(sqlConnection); + + SqlCommand sqlCommand; + if (databaseVersion.CompareTo(new Version(2, 2)) == 0) // 2.2 + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.3."); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new Version(2, 3); + } + + if (databaseVersion.CompareTo(new Version(2, 3)) == 0) // 2.3 + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.4."); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new Version(2, 4); + } + + if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.5."); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand.ExecuteNonQuery(); + databaseVersion = new Version(2, 5); + } + + if (databaseVersion.CompareTo(new Version(2, 5)) == 0) // 2.5 + isVerified = true; + + if (isVerified == false) + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strErrorBadDatabaseVersion, databaseVersion, GeneralAppInfo.ProdName)); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, string.Format(Language.strErrorVerifyDatabaseVersionFailed, ex.Message)); + } + return isVerified; + } + + private Version GetDatabaseVersion(SqlConnection sqlConnection) + { + Version databaseVersion; + SqlDataReader sqlDataReader = null; + try + { + var sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlConnection); + sqlDataReader = sqlCommand.ExecuteReader(); + if (!sqlDataReader.HasRows) + return new Version(); // assume new empty database + else + sqlDataReader.Read(); + databaseVersion = new Version(Convert.ToString(sqlDataReader["confVersion"], CultureInfo.InvariantCulture)); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, $"Retrieving database version failed. {ex}"); + throw; + } + finally + { + if (sqlDataReader != null && !sqlDataReader.IsClosed) + sqlDataReader.Close(); + } + return databaseVersion; + } + + private void UpdateRootNodeTable(TreeNode rootTreeNode) + { + var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); + string strProtected; + if (rootTreeNode.Tag != null) + { + if (((RootNodeInfo)rootTreeNode.Tag).Password) + { + _password = Convert.ToString(((RootNodeInfo)rootTreeNode.Tag).PasswordString).ConvertToSecureString(); + strProtected = cryptographyProvider.Encrypt("ThisIsProtected", _password); + } + else + { + strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); + } + } + else + { + strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); + } + + _sqlQuery = new SqlCommand("DELETE FROM tblRoot", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + + _sqlQuery = new SqlCommand("INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" + MiscTools.PrepareValueForDB(rootTreeNode.Text) + "\', 0, \'" + strProtected + "\'," + ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + } + + private void UpdateConnectionsTable(TreeNode rootTreeNode) + { + _sqlQuery = new SqlCommand("DELETE FROM tblCons", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + var treeNodeCollection = rootTreeNode.Nodes; + SaveNodesRecursiveSql(treeNodeCollection); + } + + private void UpdateUpdatesTable() + { + _sqlQuery = new SqlCommand("DELETE FROM tblUpdate", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + _sqlQuery = new SqlCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + MiscTools.DBDate(DateTime.Now) + "\')", _sqlConnection); + _sqlQuery.ExecuteNonQuery(); + } + + private void SaveNodesRecursiveSql(TreeNodeCollection tnc) { foreach (TreeNode node in tnc) { @@ -247,12 +261,12 @@ namespace mRemoteNG.Config.Connections { _sqlQuery.CommandText += "\'" + ContainerList[node.Tag].IsExpanded + "\',"; //Expanded curConI = ContainerList[node.Tag]; - SaveConnectionFieldsSQL(curConI); + SaveConnectionFieldsSql(curConI); _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); _sqlQuery.ExecuteNonQuery(); //_parentConstantId = _currentNodeIndex - SaveNodesSQL(node.Nodes); + SaveNodesRecursiveSql(node.Nodes); //_xmlTextWriter.WriteEndElement() } @@ -260,7 +274,7 @@ namespace mRemoteNG.Config.Connections { _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; curConI = ConnectionList[node.Tag]; - SaveConnectionFieldsSQL(curConI); + SaveConnectionFieldsSql(curConI); //_xmlTextWriter.WriteEndElement() _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); _sqlQuery.ExecuteNonQuery(); @@ -270,7 +284,7 @@ namespace mRemoteNG.Config.Connections } } - private void SaveConnectionFieldsSQL(ConnectionInfo curConI) + private void SaveConnectionFieldsSql(ConnectionInfo curConI) { var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); ConnectionInfo with_1 = curConI; diff --git a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs index 746693d3f..9c26a20b5 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs @@ -67,12 +67,18 @@ namespace mRemoteNG.Config.Connections _sqlDataReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); _sqlDataReader.Read(); - if (_sqlDataReader.HasRows == false) + //if (_sqlDataReader.HasRows == false) + //{ + // Runtime.SaveConnections(); + // _sqlQuery = new SqlCommand("SELECT * FROM tblRoot", _sqlConnection); + // _sqlDataReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); + // _sqlDataReader.Read(); + //} + + if (!_sqlDataReader.HasRows) { - Runtime.SaveConnections(); - _sqlQuery = new SqlCommand("SELECT * FROM tblRoot", _sqlConnection); - _sqlDataReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); - _sqlDataReader.Read(); + CreateRootTreeNode("Connections"); + return; } _confVersion = Convert.ToDouble(_sqlDataReader["confVersion"], CultureInfo.InvariantCulture); @@ -96,22 +102,12 @@ namespace mRemoteNG.Config.Connections throw (new Exception($"Incompatible database schema (schema version {_confVersion}).")); } - RootTreeNode.Name = Convert.ToString(_sqlDataReader["Name"]); - - var rootInfo = new RootNodeInfo(RootNodeType.Connection) - { - Name = RootTreeNode.Name, - TreeNode = RootTreeNode - }; - - RootTreeNode.Tag = rootInfo; - RootTreeNode.ImageIndex = (int)TreeImageType.Root; - RootTreeNode.SelectedImageIndex = (int)TreeImageType.Root; + CreateRootTreeNode(Convert.ToString(_sqlDataReader["Name"])); var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); if (cryptographyProvider.Decrypt(Convert.ToString(_sqlDataReader["Protected"]), _pW) != "ThisIsNotProtected") { - if (Authenticate(Convert.ToString(_sqlDataReader["Protected"]), false, rootInfo) == false) + if (Authenticate(Convert.ToString(_sqlDataReader["Protected"]), false, (RootNodeInfo)RootTreeNode.Tag) == false) { mRemoteNG.Settings.Default.LoadConsFromCustomLocation = false; mRemoteNG.Settings.Default.CustomConsPath = ""; @@ -156,6 +152,22 @@ namespace mRemoteNG.Config.Connections } } + private void CreateRootTreeNode(string name) + { + RootTreeNode = new TreeNode(name); + Windows.treeForm.tvConnections.Nodes.Add(RootTreeNode); + + var rootInfo = new RootNodeInfo(RootNodeType.Connection) + { + Name = RootTreeNode.Name, + TreeNode = RootTreeNode + }; + + RootTreeNode.Tag = rootInfo; + RootTreeNode.ImageIndex = (int)TreeImageType.Root; + RootTreeNode.SelectedImageIndex = (int)TreeImageType.Root; + } + private void AddNodesFromSql(TreeNode baseNode) { try diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 9d10abbbe..932c1433f 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -147,8 +147,8 @@ namespace mRemoteNG.UI.Forms Runtime.LoadConnections(); if (!Runtime.IsConnectionsFileLoaded) { - Application.Exit(); - return ; + //Application.Exit(); + //return ; } Windows.treePanel.Focus(); From de24dbbb7aa2f1c7d5cef94be1adeb9cc539e6f8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 13:21:49 -0600 Subject: [PATCH 034/338] Resolved small bug with uninitialized sql dbs --- mRemoteV1/Config/Connections/ConnectionsSaver.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 7eea9cde6..09da12231 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -129,8 +129,13 @@ namespace mRemoteNG.Config.Connections try { var databaseVersion = GetDatabaseVersion(sqlConnection); - SqlCommand sqlCommand; + + if (databaseVersion.Equals(new Version())) + { + return true; + } + if (databaseVersion.CompareTo(new Version(2, 2)) == 0) // 2.2 { Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.3."); From b44e6572797694b9565707900ec780f5501d9aa7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 14:43:43 -0600 Subject: [PATCH 035/338] made the DataTableSerializer more closely conform to the current DB schema --- .../Config/Connections/DataTableSerializer.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/DataTableSerializer.cs b/mRemoteV1/Config/Connections/DataTableSerializer.cs index 0fce8dd98..9fb4b7a39 100644 --- a/mRemoteV1/Config/Connections/DataTableSerializer.cs +++ b/mRemoteV1/Config/Connections/DataTableSerializer.cs @@ -1,4 +1,5 @@ -using System.Data; +using System; +using System.Data; using System.Linq; using mRemoteNG.Connection; using mRemoteNG.Container; @@ -14,6 +15,7 @@ namespace mRemoteNG.Config.Connections private DataTable _dataTable; private const string TableName = "tblCons"; private readonly Save _saveSecurity; + private int _currentNodeIndex; public DataTableSerializer(Save saveSecurity) { @@ -33,6 +35,7 @@ namespace mRemoteNG.Config.Connections _dataTable = new DataTable(TableName); CreateSchema(); SetPrimaryKey(); + _currentNodeIndex = 0; SerializeNodesRecursive(rootNodeInfo); } @@ -42,6 +45,8 @@ namespace mRemoteNG.Config.Connections _dataTable.Columns.Add("Type"); _dataTable.Columns.Add("ConstantID"); _dataTable.Columns.Add("ParentID"); + _dataTable.Columns.Add("PositionID"); + _dataTable.Columns.Add("LastChange"); _dataTable.Columns.Add("Expanded"); _dataTable.Columns.Add("Descr"); _dataTable.Columns.Add("Icon"); @@ -166,11 +171,14 @@ namespace mRemoteNG.Config.Connections private void SerializeConnectionInfo(ConnectionInfo connectionInfo) { + _currentNodeIndex++; var dataRow = _dataTable.NewRow(); dataRow["Name"] = connectionInfo.Name; dataRow["Type"] = ConnectionTreeNode.GetNodeType(connectionInfo.TreeNode).ToString(); dataRow["ConstantID"] = connectionInfo.ConstantID; dataRow["ParentID"] = connectionInfo.Parent.ConstantID; + dataRow["PositionID"] = _currentNodeIndex; + dataRow["LastChange"] = FormateDateForDatabase(DateTime.Now); dataRow["Expanded"] = connectionInfo is ContainerInfo ? ((ContainerInfo)connectionInfo).IsExpanded.ToString() : ""; dataRow["Descr"] = connectionInfo.Description; dataRow["Icon"] = connectionInfo.Icon; @@ -335,5 +343,10 @@ namespace mRemoteNG.Config.Connections } _dataTable.Rows.Add(dataRow); } + + private string FormateDateForDatabase(DateTime dateTime) + { + return $"{dateTime:yyyy-MM-dd HH:mm:ss}"; + } } } \ No newline at end of file From 124ebaa9703ebb742ea2c85f85748856de47833a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 14:44:04 -0600 Subject: [PATCH 036/338] Built out the SqlDataProvider --- .../Config/DataProviders/SqlDataProvider.cs | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs index 925a79992..5358c9bd2 100644 --- a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -1,25 +1,46 @@ using System; +using System.Data; +using System.Data.SqlClient; namespace mRemoteNG.Config.DataProviders { - public class SqlDataProvider : IDataProvider + public class SqlDataProvider { - private IDatabaseConnector _sqlConnector; + public SqlConnection SqlConnection { get; } - public SqlDataProvider(IDatabaseConnector sqlConnector) + public SqlDataProvider(SqlConnection sqlConnection) { - _sqlConnector = sqlConnector; + SqlConnection = sqlConnection; } - public string Load() + ~SqlDataProvider() + { + SqlConnection.Dispose(); + } + + public DataTable Load() { throw new NotImplementedException(); } - public void Save(string contents) + public void Save(DataTable dataTable) { - throw new NotImplementedException(); + if (SqlConnection.State != ConnectionState.Open) + OpenConnection(); + var sqlBulkCopy = new SqlBulkCopy(SqlConnection) {DestinationTableName = "dbo.tblCons"}; + sqlBulkCopy.WriteToServer(dataTable); + sqlBulkCopy.Close(); + } + + public void OpenConnection() + { + SqlConnection.Open(); + } + + public void CloseConnection() + { + SqlConnection.Close(); } } } \ No newline at end of file From 1b9d18adc146e2fe1cc9507496d715f75e8e0bb0 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 14:44:31 -0600 Subject: [PATCH 037/338] Began creating the DataTableDeserializer --- .../Connections/DataTableDeserializer.cs | 192 ++++++++++++++++++ mRemoteV1/mRemoteV1.csproj | 1 + 2 files changed, 193 insertions(+) create mode 100644 mRemoteV1/Config/Connections/DataTableDeserializer.cs diff --git a/mRemoteV1/Config/Connections/DataTableDeserializer.cs b/mRemoteV1/Config/Connections/DataTableDeserializer.cs new file mode 100644 index 000000000..3b4613ac7 --- /dev/null +++ b/mRemoteV1/Config/Connections/DataTableDeserializer.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Connection.Protocol.Http; +using mRemoteNG.Connection.Protocol.ICA; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Connection.Protocol.VNC; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class DataTableDeserializer : IDeserializer + { + private readonly DataTable _dataTable; + private ConnectionTreeModel _connectionTreeModel; + + public DataTableDeserializer(DataTable dataTable) + { + _dataTable = dataTable; + } + + public DataTableDeserializer(IDataReader sqlDataReader) + { + _dataTable = new DataTable(); + _dataTable.Load(sqlDataReader); + } + + public ConnectionTreeModel Deserialize() + { + var connectionList = CreateNodesFromTable(); + CreateNodeHierarchy(connectionList); + return _connectionTreeModel; + } + + private IEnumerable CreateNodesFromTable() + { + var nodeList = new List(); + foreach (DataRow row in _dataTable.Rows) + { + if ((string)row["Type"] == "Connection") + nodeList.Add(DeserializeConnectionInfo(row)); + else if ((string)row["Type"] == "Container") + nodeList.Add(DeserializeContainerInfo(row)); + } + return nodeList; + } + + private ConnectionInfo DeserializeConnectionInfo(DataRow row) + { + var connectionInfo = new ConnectionInfo(); + CopyConnectionInfoToObject(row, connectionInfo); + return connectionInfo; + } + + private ContainerInfo DeserializeContainerInfo(DataRow row) + { + var containerInfo = new ContainerInfo(); + CopyConnectionInfoToObject(row, containerInfo); + return containerInfo; + } + + private void CopyConnectionInfoToObject(DataRow dataRow, ConnectionInfo connectionInfo) + { + connectionInfo.Name = (string)dataRow["Name"]; + connectionInfo.ConstantID = (string)dataRow["ConstantID"]; + connectionInfo.Parent.ConstantID = (string)dataRow["ParentID"]; + //connectionInfo is ContainerInfo ? ((ContainerInfo)connectionInfo).IsExpanded.ToString() : "" = dataRow["Expanded"]; + connectionInfo.Description = (string)dataRow["Descr"]; + connectionInfo.Icon = (string)dataRow["Icon"]; + connectionInfo.Panel = (string)dataRow["Panel"]; + connectionInfo.Username = (string)dataRow["Username"]; + connectionInfo.Domain = (string)dataRow["Domain"]; + connectionInfo.Password = (string)dataRow["Password"]; + connectionInfo.Hostname = (string)dataRow["Hostname"]; + connectionInfo.Protocol = (ProtocolType)dataRow["Protocol"]; + connectionInfo.PuttySession = (string)dataRow["PuttySession"]; + connectionInfo.Port = (int)dataRow["Port"]; + connectionInfo.UseConsoleSession = (bool)dataRow["ConnectToConsole"]; + connectionInfo.UseCredSsp = (bool)dataRow["UseCredSsp"]; + connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)dataRow["RenderingEngine"]; + connectionInfo.ICAEncryptionStrength = (ProtocolICA.EncryptionStrength)dataRow["ICAEncryptionStrength"]; + connectionInfo.RDPAuthenticationLevel = (ProtocolRDP.AuthenticationLevel)dataRow["RDPAuthenticationLevel"]; + connectionInfo.LoadBalanceInfo = (string)dataRow["LoadBalanceInfo"]; + connectionInfo.Colors = (ProtocolRDP.RDPColors)dataRow["Colors"]; + connectionInfo.Resolution = (ProtocolRDP.RDPResolutions)dataRow["Resolution"]; + connectionInfo.AutomaticResize = (bool)dataRow["AutomaticResize"]; + connectionInfo.DisplayWallpaper = (bool)dataRow["DisplayWallpaper"]; + connectionInfo.DisplayThemes = (bool)dataRow["DisplayThemes"]; + connectionInfo.EnableFontSmoothing = (bool)dataRow["EnableFontSmoothing"]; + connectionInfo.EnableDesktopComposition = (bool)dataRow["EnableDesktopComposition"]; + connectionInfo.CacheBitmaps = (bool)dataRow["CacheBitmaps"]; + connectionInfo.RedirectDiskDrives = (bool)dataRow["RedirectDiskDrives"]; + connectionInfo.RedirectPorts = (bool)dataRow["RedirectPorts"]; + connectionInfo.RedirectPrinters = (bool)dataRow["RedirectPrinters"]; + connectionInfo.RedirectSmartCards = (bool)dataRow["RedirectSmartCards"]; + connectionInfo.RedirectSound = (ProtocolRDP.RDPSounds)dataRow["RedirectSound"]; + connectionInfo.RedirectKeys = (bool)dataRow["RedirectKeys"]; + connectionInfo.PleaseConnect = (bool)dataRow["Connected"]; + connectionInfo.PreExtApp = (string)dataRow["PreExtApp"]; + connectionInfo.PostExtApp = (string)dataRow["PostExtApp"]; + connectionInfo.MacAddress = (string)dataRow["MacAddress"]; + connectionInfo.UserField = (string)dataRow["UserField"]; + connectionInfo.ExtApp = (string)dataRow["ExtApp"]; + connectionInfo.VNCCompression = (ProtocolVNC.Compression)dataRow["VNCCompression"]; + connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)dataRow["VNCEncoding"]; + connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)dataRow["VNCAuthMode"]; + connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)dataRow["VNCProxyType"]; + connectionInfo.VNCProxyIP = (string)dataRow["VNCProxyIP"]; + connectionInfo.VNCProxyPort = (int)dataRow["VNCProxyPort"]; + connectionInfo.VNCProxyUsername = (string)dataRow["VNCProxyUsername"]; + connectionInfo.VNCProxyPassword = (string)dataRow["VNCProxyPassword"]; + connectionInfo.VNCColors = (ProtocolVNC.Colors)dataRow["VNCColors"]; + connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)dataRow["VNCSmartSizeMode"]; + connectionInfo.VNCViewOnly = (bool)dataRow["VNCViewOnly"]; + connectionInfo.RDGatewayUsageMethod = (ProtocolRDP.RDGatewayUsageMethod)dataRow["RDGatewayUsageMethod"]; + connectionInfo.RDGatewayHostname = (string)dataRow["RDGatewayHostname"]; + connectionInfo.RDGatewayUseConnectionCredentials = (ProtocolRDP.RDGatewayUseConnectionCredentials)dataRow["RDGatewayUseConnectionCredentials"]; + connectionInfo.RDGatewayUsername = (string)dataRow["RDGatewayUsername"]; + connectionInfo.RDGatewayPassword = (string)dataRow["RDGatewayPassword"]; + connectionInfo.RDGatewayDomain = (string)dataRow["RDGatewayDomain"]; + + connectionInfo.Inheritance.CacheBitmaps = (bool)dataRow["InheritCacheBitmaps"]; + connectionInfo.Inheritance.Colors = (bool)dataRow["InheritColors"]; + connectionInfo.Inheritance.Description = (bool)dataRow["InheritDescription"]; + connectionInfo.Inheritance.DisplayThemes = (bool)dataRow["InheritDisplayThemes"]; + connectionInfo.Inheritance.DisplayWallpaper = (bool)dataRow["InheritDisplayWallpaper"]; + connectionInfo.Inheritance.EnableFontSmoothing = (bool)dataRow["InheritEnableFontSmoothing"]; + connectionInfo.Inheritance.EnableDesktopComposition = (bool)dataRow["InheritEnableDesktopComposition"]; + connectionInfo.Inheritance.Domain = (bool)dataRow["InheritDomain"]; + connectionInfo.Inheritance.Icon = (bool)dataRow["InheritIcon"]; + connectionInfo.Inheritance.Panel = (bool)dataRow["InheritPanel"]; + connectionInfo.Inheritance.Password = (bool)dataRow["InheritPassword"]; + connectionInfo.Inheritance.Port = (bool)dataRow["InheritPort"]; + connectionInfo.Inheritance.Protocol = (bool)dataRow["InheritProtocol"]; + connectionInfo.Inheritance.PuttySession = (bool)dataRow["InheritPuttySession"]; + connectionInfo.Inheritance.RedirectDiskDrives = (bool)dataRow["InheritRedirectDiskDrives"]; + connectionInfo.Inheritance.RedirectKeys = (bool)dataRow["InheritRedirectKeys"]; + connectionInfo.Inheritance.RedirectPorts = (bool)dataRow["InheritRedirectPorts"]; + connectionInfo.Inheritance.RedirectPrinters = (bool)dataRow["InheritRedirectPrinters"]; + connectionInfo.Inheritance.RedirectSmartCards = (bool)dataRow["InheritRedirectSmartCards"]; + connectionInfo.Inheritance.RedirectSound = (bool)dataRow["InheritRedirectSound"]; + connectionInfo.Inheritance.Resolution = (bool)dataRow["InheritResolution"]; + connectionInfo.Inheritance.AutomaticResize = (bool)dataRow["InheritAutomaticResize"]; + connectionInfo.Inheritance.UseConsoleSession = (bool)dataRow["InheritUseConsoleSession"]; + connectionInfo.Inheritance.UseCredSsp = (bool)dataRow["InheritUseCredSsp"]; + connectionInfo.Inheritance.RenderingEngine = (bool)dataRow["InheritRenderingEngine"]; + connectionInfo.Inheritance.Username = (bool)dataRow["InheritUsername"]; + connectionInfo.Inheritance.ICAEncryptionStrength = (bool)dataRow["InheritICAEncryptionStrength"]; + connectionInfo.Inheritance.RDPAuthenticationLevel = (bool)dataRow["InheritRDPAuthenticationLevel"]; + connectionInfo.Inheritance.LoadBalanceInfo = (bool)dataRow["InheritLoadBalanceInfo"]; + connectionInfo.Inheritance.PreExtApp = (bool)dataRow["InheritPreExtApp"]; + connectionInfo.Inheritance.PostExtApp = (bool)dataRow["InheritPostExtApp"]; + connectionInfo.Inheritance.MacAddress = (bool)dataRow["InheritMacAddress"]; + connectionInfo.Inheritance.UserField = (bool)dataRow["InheritUserField"]; + connectionInfo.Inheritance.ExtApp = (bool)dataRow["InheritExtApp"]; + connectionInfo.Inheritance.VNCCompression = (bool)dataRow["InheritVNCCompression"]; + connectionInfo.Inheritance.VNCEncoding = (bool)dataRow["InheritVNCEncoding"]; + connectionInfo.Inheritance.VNCAuthMode = (bool)dataRow["InheritVNCAuthMode"]; + connectionInfo.Inheritance.VNCProxyType = (bool)dataRow["InheritVNCProxyType"]; + connectionInfo.Inheritance.VNCProxyIP = (bool)dataRow["InheritVNCProxyIP"]; + connectionInfo.Inheritance.VNCProxyPort = (bool)dataRow["InheritVNCProxyPort"]; + connectionInfo.Inheritance.VNCProxyUsername = (bool)dataRow["InheritVNCProxyUsername"]; + connectionInfo.Inheritance.VNCProxyPassword = (bool)dataRow["InheritVNCProxyPassword"]; + connectionInfo.Inheritance.VNCColors = (bool)dataRow["InheritVNCColors"]; + connectionInfo.Inheritance.VNCSmartSizeMode = (bool)dataRow["InheritVNCSmartSizeMode"]; + connectionInfo.Inheritance.VNCViewOnly = (bool)dataRow["InheritVNCViewOnly"]; + connectionInfo.Inheritance.RDGatewayUsageMethod = (bool)dataRow["InheritRDGatewayUsageMethod"]; + connectionInfo.Inheritance.RDGatewayHostname = (bool)dataRow["InheritRDGatewayHostname"]; + connectionInfo.Inheritance.RDGatewayUseConnectionCredentials = (bool)dataRow["InheritRDGatewayUseConnectionCredentials"]; + connectionInfo.Inheritance.RDGatewayUsername = (bool)dataRow["InheritRDGatewayUsername"]; + connectionInfo.Inheritance.RDGatewayPassword = (bool)dataRow["InheritRDGatewayPassword"]; + connectionInfo.Inheritance.RDGatewayDomain = (bool)dataRow["InheritRDGatewayDomain"]; + } + + private void CreateNodeHierarchy(IEnumerable connectionList) + { + _connectionTreeModel = new ConnectionTreeModel(); + _connectionTreeModel.AddRootNode(new RootNodeInfo(RootNodeType.Connection)); + + foreach (var connection in connectionList) + { + + } + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 5a0c0c1ab..c7a0e7e7f 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -129,6 +129,7 @@ + From 1538628e164835a58d83b567f71a8cd574997e9a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 14:45:18 -0600 Subject: [PATCH 038/338] minor code cleanup --- mRemoteV1/Config/Connections/ConnectionsSaver.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 09da12231..aa058aae1 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -257,7 +257,6 @@ namespace mRemoteNG.Config.Connections if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) { - //_xmlTextWriter.WriteStartElement("Node") _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(node.Text) + "\',"; //Name _sqlQuery.CommandText += "\'" + ConnectionTreeNode.GetNodeType(node) + "\',"; //Type } @@ -272,7 +271,6 @@ namespace mRemoteNG.Config.Connections _sqlQuery.ExecuteNonQuery(); //_parentConstantId = _currentNodeIndex SaveNodesRecursiveSql(node.Nodes); - //_xmlTextWriter.WriteEndElement() } if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection) @@ -280,7 +278,6 @@ namespace mRemoteNG.Config.Connections _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; curConI = ConnectionList[node.Tag]; SaveConnectionFieldsSql(curConI); - //_xmlTextWriter.WriteEndElement() _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); _sqlQuery.ExecuteNonQuery(); } @@ -288,7 +285,7 @@ namespace mRemoteNG.Config.Connections //_parentConstantId = 0 } } - + private void SaveConnectionFieldsSql(ConnectionInfo curConI) { var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); @@ -551,7 +548,7 @@ namespace mRemoteNG.Config.Connections _sqlQuery.CommandText += _currentNodeIndex + ",\'" + _parentConstantId + "\',\'" + with_1.ConstantID + "\',\'" + MiscTools.DBDate(DateTime.Now) + "\')"; } #endregion - + private void EncryptCompleteFile() { var streamReader = new StreamReader(ConnectionFileName); From a0f7241f854d4f7565869b8789661f83a440b611 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 15:15:58 -0600 Subject: [PATCH 039/338] Fixed db schema error --- mRemoteV1/Config/Connections/DataTableSerializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/DataTableSerializer.cs b/mRemoteV1/Config/Connections/DataTableSerializer.cs index 9fb4b7a39..8e7f4767e 100644 --- a/mRemoteV1/Config/Connections/DataTableSerializer.cs +++ b/mRemoteV1/Config/Connections/DataTableSerializer.cs @@ -180,7 +180,7 @@ namespace mRemoteNG.Config.Connections dataRow["PositionID"] = _currentNodeIndex; dataRow["LastChange"] = FormateDateForDatabase(DateTime.Now); dataRow["Expanded"] = connectionInfo is ContainerInfo ? ((ContainerInfo)connectionInfo).IsExpanded.ToString() : ""; - dataRow["Descr"] = connectionInfo.Description; + dataRow["Description"] = connectionInfo.Description; dataRow["Icon"] = connectionInfo.Icon; dataRow["Panel"] = connectionInfo.Panel; dataRow["Username"] = _saveSecurity.Username ? connectionInfo.Username : ""; From ff14c91fe1dad044eaf89c2aa94398258cc46084 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 25 Aug 2016 15:16:56 -0600 Subject: [PATCH 040/338] First attempt at deserializing hierarchy from flat database --- .../Connections/DataTableDeserializer.cs | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/mRemoteV1/Config/Connections/DataTableDeserializer.cs b/mRemoteV1/Config/Connections/DataTableDeserializer.cs index 3b4613ac7..99b4ee43b 100644 --- a/mRemoteV1/Config/Connections/DataTableDeserializer.cs +++ b/mRemoteV1/Config/Connections/DataTableDeserializer.cs @@ -1,7 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Data; -using System.Data.SqlClient; +using System.Linq; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.Http; @@ -38,7 +37,7 @@ namespace mRemoteNG.Config.Connections return _connectionTreeModel; } - private IEnumerable CreateNodesFromTable() + private List CreateNodesFromTable() { var nodeList = new List(); foreach (DataRow row in _dataTable.Rows) @@ -69,9 +68,9 @@ namespace mRemoteNG.Config.Connections { connectionInfo.Name = (string)dataRow["Name"]; connectionInfo.ConstantID = (string)dataRow["ConstantID"]; - connectionInfo.Parent.ConstantID = (string)dataRow["ParentID"]; + //connectionInfo.Parent.ConstantID = (string)dataRow["ParentID"]; //connectionInfo is ContainerInfo ? ((ContainerInfo)connectionInfo).IsExpanded.ToString() : "" = dataRow["Expanded"]; - connectionInfo.Description = (string)dataRow["Descr"]; + connectionInfo.Description = (string)dataRow["Description"]; connectionInfo.Icon = (string)dataRow["Icon"]; connectionInfo.Panel = (string)dataRow["Panel"]; connectionInfo.Username = (string)dataRow["Username"]; @@ -178,14 +177,21 @@ namespace mRemoteNG.Config.Connections connectionInfo.Inheritance.RDGatewayDomain = (bool)dataRow["InheritRDGatewayDomain"]; } - private void CreateNodeHierarchy(IEnumerable connectionList) + private void CreateNodeHierarchy(List connectionList) { _connectionTreeModel = new ConnectionTreeModel(); - _connectionTreeModel.AddRootNode(new RootNodeInfo(RootNodeType.Connection)); + var rootNode = new RootNodeInfo(RootNodeType.Connection) {ConstantID = "0"}; + _connectionTreeModel.AddRootNode(rootNode); - foreach (var connection in connectionList) + foreach (DataRow row in _dataTable.Rows) { - + var id = (string) row["ConstantID"]; + var connectionInfo = connectionList.First(node => node.ConstantID == id); + var parentId = (string) row["ParentID"]; + if (parentId == "0") + _connectionTreeModel.AddRootNode((ContainerInfo)connectionInfo); + else + connectionInfo.Parent = connectionList.First(node => node.ConstantID == parentId) as ContainerInfo; } } } From cb3fe686f37fa18941f99967a567fcb55b5d8a33 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 1 Sep 2016 13:25:36 -0600 Subject: [PATCH 041/338] Renamed function to be a bit more descriptive --- mRemoteV1/Config/Connections/DataTableDeserializer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Config/Connections/DataTableDeserializer.cs b/mRemoteV1/Config/Connections/DataTableDeserializer.cs index 99b4ee43b..eecae7613 100644 --- a/mRemoteV1/Config/Connections/DataTableDeserializer.cs +++ b/mRemoteV1/Config/Connections/DataTableDeserializer.cs @@ -53,18 +53,18 @@ namespace mRemoteNG.Config.Connections private ConnectionInfo DeserializeConnectionInfo(DataRow row) { var connectionInfo = new ConnectionInfo(); - CopyConnectionInfoToObject(row, connectionInfo); + PopulateConnectionInfoFromDatarow(row, connectionInfo); return connectionInfo; } private ContainerInfo DeserializeContainerInfo(DataRow row) { var containerInfo = new ContainerInfo(); - CopyConnectionInfoToObject(row, containerInfo); + PopulateConnectionInfoFromDatarow(row, containerInfo); return containerInfo; } - private void CopyConnectionInfoToObject(DataRow dataRow, ConnectionInfo connectionInfo) + private void PopulateConnectionInfoFromDatarow(DataRow dataRow, ConnectionInfo connectionInfo) { connectionInfo.Name = (string)dataRow["Name"]; connectionInfo.ConstantID = (string)dataRow["ConstantID"]; From 543f5e126f69ef9906c8d6379264da5d267ccade Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 2 Sep 2016 14:54:34 -0600 Subject: [PATCH 042/338] Fixed enum casts in DataTableSerializer --- .../Connections/DataTableDeserializer.cs | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/mRemoteV1/Config/Connections/DataTableDeserializer.cs b/mRemoteV1/Config/Connections/DataTableDeserializer.cs index eecae7613..b154f220b 100644 --- a/mRemoteV1/Config/Connections/DataTableDeserializer.cs +++ b/mRemoteV1/Config/Connections/DataTableDeserializer.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Data; using System.Linq; using mRemoteNG.Connection; @@ -17,7 +18,6 @@ namespace mRemoteNG.Config.Connections public class DataTableDeserializer : IDeserializer { private readonly DataTable _dataTable; - private ConnectionTreeModel _connectionTreeModel; public DataTableDeserializer(DataTable dataTable) { @@ -33,8 +33,8 @@ namespace mRemoteNG.Config.Connections public ConnectionTreeModel Deserialize() { var connectionList = CreateNodesFromTable(); - CreateNodeHierarchy(connectionList); - return _connectionTreeModel; + var connectionTreeModel = CreateNodeHierarchy(connectionList); + return connectionTreeModel; } private List CreateNodesFromTable() @@ -74,20 +74,20 @@ namespace mRemoteNG.Config.Connections connectionInfo.Icon = (string)dataRow["Icon"]; connectionInfo.Panel = (string)dataRow["Panel"]; connectionInfo.Username = (string)dataRow["Username"]; - connectionInfo.Domain = (string)dataRow["Domain"]; + connectionInfo.Domain = (string)dataRow["DomainName"]; connectionInfo.Password = (string)dataRow["Password"]; connectionInfo.Hostname = (string)dataRow["Hostname"]; - connectionInfo.Protocol = (ProtocolType)dataRow["Protocol"]; + connectionInfo.Protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), (string)dataRow["Protocol"]); connectionInfo.PuttySession = (string)dataRow["PuttySession"]; connectionInfo.Port = (int)dataRow["Port"]; connectionInfo.UseConsoleSession = (bool)dataRow["ConnectToConsole"]; connectionInfo.UseCredSsp = (bool)dataRow["UseCredSsp"]; - connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)dataRow["RenderingEngine"]; - connectionInfo.ICAEncryptionStrength = (ProtocolICA.EncryptionStrength)dataRow["ICAEncryptionStrength"]; - connectionInfo.RDPAuthenticationLevel = (ProtocolRDP.AuthenticationLevel)dataRow["RDPAuthenticationLevel"]; + connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine), (string)dataRow["RenderingEngine"]); + connectionInfo.ICAEncryptionStrength = (ProtocolICA.EncryptionStrength)Enum.Parse(typeof(ProtocolICA.EncryptionStrength), (string)dataRow["ICAEncryptionStrength"]); + connectionInfo.RDPAuthenticationLevel = (ProtocolRDP.AuthenticationLevel)Enum.Parse(typeof(ProtocolRDP.AuthenticationLevel), (string)dataRow["RDPAuthenticationLevel"]); connectionInfo.LoadBalanceInfo = (string)dataRow["LoadBalanceInfo"]; - connectionInfo.Colors = (ProtocolRDP.RDPColors)dataRow["Colors"]; - connectionInfo.Resolution = (ProtocolRDP.RDPResolutions)dataRow["Resolution"]; + connectionInfo.Colors = (ProtocolRDP.RDPColors)Enum.Parse(typeof(ProtocolRDP.RDPColors) ,(string)dataRow["Colors"]); + connectionInfo.Resolution = (ProtocolRDP.RDPResolutions)Enum.Parse(typeof(ProtocolRDP.RDPResolutions), (string)dataRow["Resolution"]); connectionInfo.AutomaticResize = (bool)dataRow["AutomaticResize"]; connectionInfo.DisplayWallpaper = (bool)dataRow["DisplayWallpaper"]; connectionInfo.DisplayThemes = (bool)dataRow["DisplayThemes"]; @@ -98,7 +98,7 @@ namespace mRemoteNG.Config.Connections connectionInfo.RedirectPorts = (bool)dataRow["RedirectPorts"]; connectionInfo.RedirectPrinters = (bool)dataRow["RedirectPrinters"]; connectionInfo.RedirectSmartCards = (bool)dataRow["RedirectSmartCards"]; - connectionInfo.RedirectSound = (ProtocolRDP.RDPSounds)dataRow["RedirectSound"]; + connectionInfo.RedirectSound = (ProtocolRDP.RDPSounds)Enum.Parse(typeof(ProtocolRDP.RDPSounds), (string)dataRow["RedirectSound"]); connectionInfo.RedirectKeys = (bool)dataRow["RedirectKeys"]; connectionInfo.PleaseConnect = (bool)dataRow["Connected"]; connectionInfo.PreExtApp = (string)dataRow["PreExtApp"]; @@ -106,20 +106,20 @@ namespace mRemoteNG.Config.Connections connectionInfo.MacAddress = (string)dataRow["MacAddress"]; connectionInfo.UserField = (string)dataRow["UserField"]; connectionInfo.ExtApp = (string)dataRow["ExtApp"]; - connectionInfo.VNCCompression = (ProtocolVNC.Compression)dataRow["VNCCompression"]; - connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)dataRow["VNCEncoding"]; - connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)dataRow["VNCAuthMode"]; - connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)dataRow["VNCProxyType"]; + connectionInfo.VNCCompression = (ProtocolVNC.Compression)Enum.Parse(typeof(ProtocolVNC.Compression), (string)dataRow["VNCCompression"]); + connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)Enum.Parse(typeof(ProtocolVNC.Encoding) ,(string)dataRow["VNCEncoding"]); + connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)Enum.Parse(typeof(ProtocolVNC.AuthMode), (string)dataRow["VNCAuthMode"]); + connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)Enum.Parse(typeof(ProtocolVNC.ProxyType), (string)dataRow["VNCProxyType"]); connectionInfo.VNCProxyIP = (string)dataRow["VNCProxyIP"]; connectionInfo.VNCProxyPort = (int)dataRow["VNCProxyPort"]; connectionInfo.VNCProxyUsername = (string)dataRow["VNCProxyUsername"]; connectionInfo.VNCProxyPassword = (string)dataRow["VNCProxyPassword"]; - connectionInfo.VNCColors = (ProtocolVNC.Colors)dataRow["VNCColors"]; - connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)dataRow["VNCSmartSizeMode"]; + connectionInfo.VNCColors = (ProtocolVNC.Colors)Enum.Parse(typeof(ProtocolVNC.Colors), (string)dataRow["VNCColors"]); + connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Enum.Parse(typeof(ProtocolVNC.SmartSizeMode), (string)dataRow["VNCSmartSizeMode"]); connectionInfo.VNCViewOnly = (bool)dataRow["VNCViewOnly"]; - connectionInfo.RDGatewayUsageMethod = (ProtocolRDP.RDGatewayUsageMethod)dataRow["RDGatewayUsageMethod"]; + connectionInfo.RDGatewayUsageMethod = (ProtocolRDP.RDGatewayUsageMethod)Enum.Parse(typeof(ProtocolRDP.RDGatewayUsageMethod), (string)dataRow["RDGatewayUsageMethod"]); connectionInfo.RDGatewayHostname = (string)dataRow["RDGatewayHostname"]; - connectionInfo.RDGatewayUseConnectionCredentials = (ProtocolRDP.RDGatewayUseConnectionCredentials)dataRow["RDGatewayUseConnectionCredentials"]; + connectionInfo.RDGatewayUseConnectionCredentials = (ProtocolRDP.RDGatewayUseConnectionCredentials)Enum.Parse(typeof(ProtocolRDP.RDGatewayUseConnectionCredentials), (string)dataRow["RDGatewayUseConnectionCredentials"]); connectionInfo.RDGatewayUsername = (string)dataRow["RDGatewayUsername"]; connectionInfo.RDGatewayPassword = (string)dataRow["RDGatewayPassword"]; connectionInfo.RDGatewayDomain = (string)dataRow["RDGatewayDomain"]; @@ -177,11 +177,11 @@ namespace mRemoteNG.Config.Connections connectionInfo.Inheritance.RDGatewayDomain = (bool)dataRow["InheritRDGatewayDomain"]; } - private void CreateNodeHierarchy(List connectionList) + private ConnectionTreeModel CreateNodeHierarchy(List connectionList) { - _connectionTreeModel = new ConnectionTreeModel(); + var connectionTreeModel = new ConnectionTreeModel(); var rootNode = new RootNodeInfo(RootNodeType.Connection) {ConstantID = "0"}; - _connectionTreeModel.AddRootNode(rootNode); + connectionTreeModel.AddRootNode(rootNode); foreach (DataRow row in _dataTable.Rows) { @@ -189,10 +189,11 @@ namespace mRemoteNG.Config.Connections var connectionInfo = connectionList.First(node => node.ConstantID == id); var parentId = (string) row["ParentID"]; if (parentId == "0") - _connectionTreeModel.AddRootNode((ContainerInfo)connectionInfo); + connectionTreeModel.AddRootNode((ContainerInfo)connectionInfo); else connectionInfo.Parent = connectionList.First(node => node.ConstantID == parentId) as ContainerInfo; } + return connectionTreeModel; } } } \ No newline at end of file From 8b143a27135656a3ea8e663a8541ac0349be4597 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 2 Sep 2016 15:07:22 -0600 Subject: [PATCH 043/338] Fixed issue with creating node hierarchy --- mRemoteV1/Config/Connections/DataTableDeserializer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/Config/Connections/DataTableDeserializer.cs b/mRemoteV1/Config/Connections/DataTableDeserializer.cs index b154f220b..f6598c995 100644 --- a/mRemoteV1/Config/Connections/DataTableDeserializer.cs +++ b/mRemoteV1/Config/Connections/DataTableDeserializer.cs @@ -189,9 +189,9 @@ namespace mRemoteNG.Config.Connections var connectionInfo = connectionList.First(node => node.ConstantID == id); var parentId = (string) row["ParentID"]; if (parentId == "0") - connectionTreeModel.AddRootNode((ContainerInfo)connectionInfo); + rootNode.Add(connectionInfo); else - connectionInfo.Parent = connectionList.First(node => node.ConstantID == parentId) as ContainerInfo; + (connectionList.First(node => node.ConstantID == parentId) as ContainerInfo)?.Add(connectionInfo); } return connectionTreeModel; } From b5e35647240e61313b0b030037ea521f52f585d3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 2 Sep 2016 15:20:41 -0600 Subject: [PATCH 044/338] Fixed null ref error when viewing folders in some situations --- mRemoteV1/UI/Window/ConfigWindow.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/mRemoteV1/UI/Window/ConfigWindow.cs b/mRemoteV1/UI/Window/ConfigWindow.cs index 6568804c1..cebc38af4 100644 --- a/mRemoteV1/UI/Window/ConfigWindow.cs +++ b/mRemoteV1/UI/Window/ConfigWindow.cs @@ -475,14 +475,7 @@ namespace mRemoteNG.UI.Window pGrid.SelectedObject = Obj; btnShowProperties.Enabled = true; - if (((ContainerInfo) Obj).Parent.Parent != null) - { - btnShowInheritance.Enabled = true; - } - else - { - btnShowInheritance.Enabled = false; - } + btnShowInheritance.Enabled = ((ContainerInfo) Obj).Parent != null; btnShowDefaultProperties.Enabled = false; btnShowDefaultInheritance.Enabled = false; btnIcon.Enabled = true; From 1bd6839b218fbf1a72d986a6fca3964d17664be9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 09:24:39 -0600 Subject: [PATCH 045/338] Resolved bug with loading folders from SQL --- .../Connections/SqlConnectionsLoader.cs | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs index 9c26a20b5..f248cbeca 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs @@ -179,6 +179,9 @@ namespace mRemoteNG.Config.Connections if (_sqlDataReader.HasRows == false) return; + //var deserializer = new DataTableDeserializer(_sqlDataReader); + //var connectionTreeModel = deserializer.Deserialize(); + while (_sqlDataReader.Read()) { var tNode = new TreeNode(Convert.ToString(_sqlDataReader["Name"])); @@ -271,34 +274,32 @@ namespace mRemoteNG.Config.Connections private void AddContainerToList(TreeNode tNode) { - var contI = new ContainerInfo - { - TreeNode = tNode, - Name = Convert.ToString(_sqlDataReader["Name"]) - }; + var containerInfo = new ContainerInfo(); - var conI = GetConnectionInfoFromSql(); - conI.Parent = contI; - conI.IsContainer = true; - contI.CopyFrom(conI); + var connectionInfo = GetConnectionInfoFromSql(); + containerInfo.CopyFrom(connectionInfo); + //connectionInfo.Parent = contI; + containerInfo.IsContainer = true; + containerInfo.Name = Convert.ToString(_sqlDataReader["Name"]); + containerInfo.TreeNode = tNode; if (DatabaseUpdate) { - var prevCont = PreviousContainerList.FindByConstantID(conI.ConstantID); + var prevCont = PreviousContainerList.FindByConstantID(connectionInfo.ConstantID); if (prevCont != null) - contI.IsExpanded = prevCont.IsExpanded; + containerInfo.IsExpanded = prevCont.IsExpanded; - if (conI.ConstantID == PreviousSelected) + if (connectionInfo.ConstantID == PreviousSelected) _selectedTreeNode = tNode; } else { - contI.IsExpanded = Convert.ToBoolean(_sqlDataReader["Expanded"]); + containerInfo.IsExpanded = Convert.ToBoolean(_sqlDataReader["Expanded"]); } - ContainerList.Add(contI); - ConnectionList.Add(conI); - tNode.Tag = contI; + ContainerList.Add(containerInfo); + ConnectionList.Add(connectionInfo); + tNode.Tag = containerInfo; tNode.ImageIndex = (int)TreeImageType.Container; tNode.SelectedImageIndex = (int)TreeImageType.Container; } From 1afe93be66ad77d18dd489649e982bf1abe52d7d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 12:14:11 -0600 Subject: [PATCH 046/338] Began implementing TreeListView to replace the regular TreeView for the connection list. This will utilize a virtual list rather than a concrete set of tree nodes to model the connection list hierarchy. --- mRemoteV1/App/ProgramRoot.cs | 2 + .../Config/Connections/ConnectionsLoader.cs | 6 +- mRemoteV1/UI/Forms/frmMain.cs | 7 +- .../Window/ConnectionTreeWindow.Designer.cs | 939 +++++++++--------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 172 ++-- mRemoteV1/UI/Window/ConnectionTreeWindow.resx | 10 +- 6 files changed, 601 insertions(+), 535 deletions(-) diff --git a/mRemoteV1/App/ProgramRoot.cs b/mRemoteV1/App/ProgramRoot.cs index 038e32211..6371359e7 100644 --- a/mRemoteV1/App/ProgramRoot.cs +++ b/mRemoteV1/App/ProgramRoot.cs @@ -24,6 +24,8 @@ namespace mRemoteNG.App private static void StartApplication() { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); Startup.Instance.InitializeProgram(); Application.Run(frmMain.Default); } diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 695255e6a..16844aaab 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -56,9 +56,9 @@ namespace mRemoteNG.Config.Connections ContainerList = ContainerList }; var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(import); - var connectionTreeViewBuilder = new ConnectionTreeViewBuilder(connectionTreeModel); - connectionTreeViewBuilder.Build(); - connectionTreeViewBuilder.AppendTo(Windows.treeForm.tvConnections); + //var connectionTreeViewBuilder = new ConnectionTreeViewBuilder(connectionTreeModel); + //connectionTreeViewBuilder.Build(); + //connectionTreeViewBuilder.AppendTo(Windows.treeForm.tvConnections); Runtime.ConnectionTreeModel = connectionTreeModel; } diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 553797d6e..bd658916e 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -168,9 +168,10 @@ namespace mRemoteNG.UI.Forms Microsoft.Win32.SystemEvents.DisplaySettingsChanged += DisplayChanged; Opacity = 1; - Windows.treeForm.ExpandPreviouslyOpenedFolders(); - Windows.treeForm.EnsureRootNodeVisible(); - Windows.treeForm.OpenConnectionsFromLastSession(); + Windows.treeForm.ConnectionTreeModel = Runtime.ConnectionTreeModel; + //Windows.treeForm.ExpandPreviouslyOpenedFolders(); + //Windows.treeForm.EnsureRootNodeVisible(); + //Windows.treeForm.OpenConnectionsFromLastSession(); } private void ApplySpecialSettingsForPortableVersion() diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index dcb85195e..9eb873f2b 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -1,13 +1,9 @@ - -using mRemoteNG.My; - namespace mRemoteNG.UI.Window { public partial class ConnectionTreeWindow : BaseWindow { #region Windows Form Designer generated code - private System.ComponentModel.Container components = null; internal System.Windows.Forms.TextBox txtSearch; internal System.Windows.Forms.Panel pnlConnections; internal System.Windows.Forms.ImageList imgListTree; @@ -45,451 +41,495 @@ namespace mRemoteNG.UI.Window internal System.Windows.Forms.ToolStripMenuItem mMenAddConnection; internal System.Windows.Forms.ToolStripMenuItem mMenAddFolder; public System.Windows.Forms.TreeView tvConnections; + public BrightIdeasSoftware.TreeListView olvConnections; private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - this.Load += new System.EventHandler(Tree_Load); - this.tvConnections = new System.Windows.Forms.TreeView(); - this.tvConnections.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tvConnections_BeforeLabelEdit); - this.tvConnections.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tvConnections_AfterLabelEdit); - this.tvConnections.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvConnections_AfterSelect); - this.tvConnections.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvConnections_NodeMouseClick); - this.tvConnections.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(tvConnections_NodeMouseDoubleClick); - this.tvConnections.MouseMove += new System.Windows.Forms.MouseEventHandler(this.tvConnections_MouseMove); - this.tvConnections.DragDrop += new System.Windows.Forms.DragEventHandler(tvConnections_DragDrop); - this.tvConnections.DragEnter += new System.Windows.Forms.DragEventHandler(tvConnections_DragEnter); - this.tvConnections.DragOver += new System.Windows.Forms.DragEventHandler(tvConnections_DragOver); - this.tvConnections.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.tvConnections_ItemDrag); - this.tvConnections.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tvConnections_KeyPress); - this.tvConnections.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tvConnections_KeyDown); - this.cMenTree = new System.Windows.Forms.ContextMenuStrip(this.components); - this.cMenTree.Opening += new System.ComponentModel.CancelEventHandler(this.cMenTree_DropDownOpening); - this.cMenTreeConnect = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnect.Click += new System.EventHandler(cMenTreeConnect_Click); - this.cMenTreeConnectWithOptions = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsConnectToConsoleSession = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Click += new System.EventHandler(cMenTreeConnectWithOptionsConnectToConsoleSession_Click); - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Click += new System.EventHandler(cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click); - this.cMenTreeConnectWithOptionsConnectInFullscreen = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsConnectInFullscreen.Click += new System.EventHandler(cMenTreeConnectWithOptionsConnectInFullscreen_Click); - this.cMenTreeConnectWithOptionsNoCredentials = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsNoCredentials.Click += new System.EventHandler(cMenTreeConnectWithOptionsNoCredentials_Click); - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Click += new System.EventHandler(cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click); - this.cMenTreeDisconnect = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeDisconnect.Click += new System.EventHandler(this.cMenTreeDisconnect_Click); - this.cMenTreeSep1 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeToolsExternalApps = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeToolsTransferFile = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeToolsTransferFile.Click += new System.EventHandler(cMenTreeToolsTransferFile_Click); - this.cMenTreeSep2 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeDuplicate = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeDuplicate.Click += new System.EventHandler(cMenTreeDuplicate_Click); - this.cMenTreeRename = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeRename.Click += new System.EventHandler(cMenTreeRename_Click); - this.cMenTreeDelete = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeDelete.Click += new System.EventHandler(cMenTreeDelete_Click); - this.cMenTreeSep3 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeImport = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeImportFile = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeImportFile.Click += new System.EventHandler(cMenTreeImportFile_Click); - this.cMenTreeImportActiveDirectory = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeImportActiveDirectory.Click += new System.EventHandler(cMenTreeImportActiveDirectory_Click); - this.cMenTreeImportPortScan = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeImportPortScan.Click += new System.EventHandler(cMenTreeImportPortScan_Click); - this.cMenTreeExportFile = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeExportFile.Click += new System.EventHandler(cMenTreeExportFile_Click); - this.cMenTreeSep4 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeAddConnection = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeAddConnection.Click += new System.EventHandler(this.cMenTreeAddConnection_Click); - this.cMenTreeAddFolder = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeAddFolder.Click += new System.EventHandler(this.cMenTreeAddFolder_Click); - this.ToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeToolsSort = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeToolsSortAscending = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeToolsSortAscending.Click += new System.EventHandler(this.cMenTreeToolsSortAscending_Click); - this.cMenTreeToolsSortDescending = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeToolsSortDescending.Click += new System.EventHandler(this.cMenTreeToolsSortDescending_Click); - this.cMenTreeMoveUp = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeMoveUp.Click += new System.EventHandler(cMenTreeMoveUp_Click); - this.cMenTreeMoveDown = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeMoveDown.Click += new System.EventHandler(cMenTreeMoveDown_Click); - this.imgListTree = new System.Windows.Forms.ImageList(this.components); - this.pnlConnections = new System.Windows.Forms.Panel(); - this.PictureBox1 = new System.Windows.Forms.PictureBox(); - this.txtSearch = new System.Windows.Forms.TextBox(); - this.txtSearch.GotFocus += new System.EventHandler(this.txtSearch_GotFocus); - this.txtSearch.LostFocus += new System.EventHandler(this.txtSearch_LostFocus); - this.txtSearch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown); - this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged); - this.msMain = new System.Windows.Forms.MenuStrip(); - this.mMenAddConnection = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenAddConnection.Click += new System.EventHandler(this.cMenTreeAddConnection_Click); - this.mMenAddFolder = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenAddFolder.Click += new System.EventHandler(this.cMenTreeAddFolder_Click); - this.mMenView = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenViewExpandAllFolders = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenViewExpandAllFolders.Click += new System.EventHandler(mMenViewExpandAllFolders_Click); - this.mMenViewCollapseAllFolders = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenViewCollapseAllFolders.Click += new System.EventHandler(this.mMenViewCollapseAllFolders_Click); - this.mMenSortAscending = new System.Windows.Forms.ToolStripMenuItem(); - this.mMenSortAscending.Click += new System.EventHandler(this.mMenSortAscending_Click); - this.cMenTree.SuspendLayout(); - this.pnlConnections.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize) this.PictureBox1).BeginInit(); - this.msMain.SuspendLayout(); - this.SuspendLayout(); - // - //tvConnections - // - this.tvConnections.AllowDrop = true; - this.tvConnections.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.tvConnections.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.tvConnections.ContextMenuStrip = this.cMenTree; - this.tvConnections.HideSelection = false; - this.tvConnections.ImageIndex = 0; - this.tvConnections.ImageList = this.imgListTree; - this.tvConnections.LabelEdit = true; - this.tvConnections.Location = new System.Drawing.Point(0, 0); - this.tvConnections.Name = "tvConnections"; - this.tvConnections.SelectedImageIndex = 0; - this.tvConnections.Size = new System.Drawing.Size(192, 410); - this.tvConnections.TabIndex = 20; - // - //cMenTree - // - this.cMenTree.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.cMenTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cMenTreeConnect, this.cMenTreeConnectWithOptions, this.cMenTreeDisconnect, this.cMenTreeSep1, this.cMenTreeToolsExternalApps, this.cMenTreeToolsTransferFile, this.cMenTreeSep2, this.cMenTreeDuplicate, this.cMenTreeRename, this.cMenTreeDelete, this.cMenTreeSep3, this.cMenTreeImport, this.cMenTreeExportFile, this.cMenTreeSep4, this.cMenTreeAddConnection, this.cMenTreeAddFolder, this.ToolStripSeparator1, this.cMenTreeToolsSort, this.cMenTreeMoveUp, this.cMenTreeMoveDown}); - this.cMenTree.Name = "cMenTree"; - this.cMenTree.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this.cMenTree.Size = new System.Drawing.Size(187, 386); - // - //cMenTreeConnect - // - this.cMenTreeConnect.Image = Resources.Play; - this.cMenTreeConnect.Name = "cMenTreeConnect"; - this.cMenTreeConnect.ShortcutKeys = (System.Windows.Forms.Keys) ((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.C); - this.cMenTreeConnect.Size = new System.Drawing.Size(186, 22); - this.cMenTreeConnect.Text = "Connect"; - // - //cMenTreeConnectWithOptions - // - this.cMenTreeConnectWithOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cMenTreeConnectWithOptionsConnectToConsoleSession, this.cMenTreeConnectWithOptionsDontConnectToConsoleSession, this.cMenTreeConnectWithOptionsConnectInFullscreen, this.cMenTreeConnectWithOptionsNoCredentials, this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting}); - this.cMenTreeConnectWithOptions.Name = "cMenTreeConnectWithOptions"; - this.cMenTreeConnectWithOptions.Size = new System.Drawing.Size(186, 22); - this.cMenTreeConnectWithOptions.Text = "Connect (with options)"; - // - //cMenTreeConnectWithOptionsConnectToConsoleSession - // - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Image = Resources.monitor_go; - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsConnectToConsoleSession"; - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Size = new System.Drawing.Size(231, 22); - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Text = "Connect to console session"; - // - //cMenTreeConnectWithOptionsDontConnectToConsoleSession - // - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Image = Resources.monitor_delete; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsDontConnectToConsoleSession"; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Size = new System.Drawing.Size(231, 22); - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = "Don\'t connect to console session"; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Visible = false; - // - //cMenTreeConnectWithOptionsConnectInFullscreen - // - this.cMenTreeConnectWithOptionsConnectInFullscreen.Image = Resources.arrow_out; - this.cMenTreeConnectWithOptionsConnectInFullscreen.Name = "cMenTreeConnectWithOptionsConnectInFullscreen"; - this.cMenTreeConnectWithOptionsConnectInFullscreen.Size = new System.Drawing.Size(231, 22); - this.cMenTreeConnectWithOptionsConnectInFullscreen.Text = "Connect in fullscreen"; - // - //cMenTreeConnectWithOptionsNoCredentials - // - this.cMenTreeConnectWithOptionsNoCredentials.Image = Resources.key_delete; - this.cMenTreeConnectWithOptionsNoCredentials.Name = "cMenTreeConnectWithOptionsNoCredentials"; - this.cMenTreeConnectWithOptionsNoCredentials.Size = new System.Drawing.Size(231, 22); - this.cMenTreeConnectWithOptionsNoCredentials.Text = "Connect without credentials"; - // - //cMenTreeConnectWithOptionsChoosePanelBeforeConnecting - // - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Image = Resources.Panels; - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Name = "cMenTreeConnectWithOptionsChoosePanelBeforeConnecting"; - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Size = new System.Drawing.Size(231, 22); - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = "Choose panel before connecting"; - // - //cMenTreeDisconnect - // - this.cMenTreeDisconnect.Image = Resources.Pause; - this.cMenTreeDisconnect.Name = "cMenTreeDisconnect"; - this.cMenTreeDisconnect.Size = new System.Drawing.Size(186, 22); - this.cMenTreeDisconnect.Text = "Disconnect"; - // - //cMenTreeSep1 - // - this.cMenTreeSep1.Name = "cMenTreeSep1"; - this.cMenTreeSep1.Size = new System.Drawing.Size(183, 6); - // - //cMenTreeToolsExternalApps - // - this.cMenTreeToolsExternalApps.Image = Resources.ExtApp; - this.cMenTreeToolsExternalApps.Name = "cMenTreeToolsExternalApps"; - this.cMenTreeToolsExternalApps.Size = new System.Drawing.Size(186, 22); - this.cMenTreeToolsExternalApps.Text = "External Applications"; - // - //cMenTreeToolsTransferFile - // - this.cMenTreeToolsTransferFile.Image = Resources.SSHTransfer; - this.cMenTreeToolsTransferFile.Name = "cMenTreeToolsTransferFile"; - this.cMenTreeToolsTransferFile.Size = new System.Drawing.Size(186, 22); - this.cMenTreeToolsTransferFile.Text = "Transfer File (SSH)"; - // - //cMenTreeSep2 - // - this.cMenTreeSep2.Name = "cMenTreeSep2"; - this.cMenTreeSep2.Size = new System.Drawing.Size(183, 6); - // - //cMenTreeDuplicate - // - this.cMenTreeDuplicate.Image = Resources.page_copy; - this.cMenTreeDuplicate.Name = "cMenTreeDuplicate"; - this.cMenTreeDuplicate.ShortcutKeys = (System.Windows.Forms.Keys) (System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D); - this.cMenTreeDuplicate.Size = new System.Drawing.Size(186, 22); - this.cMenTreeDuplicate.Text = "Duplicate"; - // - //cMenTreeRename - // - this.cMenTreeRename.Image = Resources.Rename; - this.cMenTreeRename.Name = "cMenTreeRename"; - this.cMenTreeRename.ShortcutKeys = System.Windows.Forms.Keys.F2; - this.cMenTreeRename.Size = new System.Drawing.Size(186, 22); - this.cMenTreeRename.Text = "Rename"; - // - //cMenTreeDelete - // - this.cMenTreeDelete.Image = Resources.Delete; - this.cMenTreeDelete.Name = "cMenTreeDelete"; - this.cMenTreeDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; - this.cMenTreeDelete.Size = new System.Drawing.Size(186, 22); - this.cMenTreeDelete.Text = "Delete"; - // - //cMenTreeSep3 - // - this.cMenTreeSep3.Name = "cMenTreeSep3"; - this.cMenTreeSep3.Size = new System.Drawing.Size(183, 6); - // - //cMenTreeImport - // - this.cMenTreeImport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cMenTreeImportFile, this.cMenTreeImportActiveDirectory, this.cMenTreeImportPortScan}); - this.cMenTreeImport.Name = "cMenTreeImport"; - this.cMenTreeImport.Size = new System.Drawing.Size(186, 22); - this.cMenTreeImport.Text = "&Import"; - // - //cMenTreeImportFile - // - this.cMenTreeImportFile.Name = "cMenTreeImportFile"; - this.cMenTreeImportFile.Size = new System.Drawing.Size(213, 22); - this.cMenTreeImportFile.Text = "Import from &File..."; - // - //cMenTreeImportActiveDirectory - // - this.cMenTreeImportActiveDirectory.Name = "cMenTreeImportActiveDirectory"; - this.cMenTreeImportActiveDirectory.Size = new System.Drawing.Size(213, 22); - this.cMenTreeImportActiveDirectory.Text = "Import from &Active Directory..."; - // - //cMenTreeImportPortScan - // - this.cMenTreeImportPortScan.Name = "cMenTreeImportPortScan"; - this.cMenTreeImportPortScan.Size = new System.Drawing.Size(213, 22); - this.cMenTreeImportPortScan.Text = "Import from &Port Scan..."; - // - //cMenTreeExportFile - // - this.cMenTreeExportFile.Name = "cMenTreeExportFile"; - this.cMenTreeExportFile.Size = new System.Drawing.Size(186, 22); - this.cMenTreeExportFile.Text = "&Export to File..."; - // - //cMenTreeSep4 - // - this.cMenTreeSep4.Name = "cMenTreeSep4"; - this.cMenTreeSep4.Size = new System.Drawing.Size(183, 6); - // - //cMenTreeAddConnection - // - this.cMenTreeAddConnection.Image = Resources.Connection_Add; - this.cMenTreeAddConnection.Name = "cMenTreeAddConnection"; - this.cMenTreeAddConnection.Size = new System.Drawing.Size(186, 22); - this.cMenTreeAddConnection.Text = "New Connection"; - // - //cMenTreeAddFolder - // - this.cMenTreeAddFolder.Image = Resources.Folder_Add; - this.cMenTreeAddFolder.Name = "cMenTreeAddFolder"; - this.cMenTreeAddFolder.Size = new System.Drawing.Size(186, 22); - this.cMenTreeAddFolder.Text = "New Folder"; - // - //ToolStripSeparator1 - // - this.ToolStripSeparator1.Name = "ToolStripSeparator1"; - this.ToolStripSeparator1.Size = new System.Drawing.Size(183, 6); - // - //cMenTreeToolsSort - // - this.cMenTreeToolsSort.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {this.cMenTreeToolsSortAscending, this.cMenTreeToolsSortDescending}); - this.cMenTreeToolsSort.Name = "cMenTreeToolsSort"; - this.cMenTreeToolsSort.Size = new System.Drawing.Size(186, 22); - this.cMenTreeToolsSort.Text = "Sort"; - // - //cMenTreeToolsSortAscending - // - this.cMenTreeToolsSortAscending.Image = Resources.Sort_AZ; - this.cMenTreeToolsSortAscending.Name = "cMenTreeToolsSortAscending"; - this.cMenTreeToolsSortAscending.Size = new System.Drawing.Size(157, 22); - this.cMenTreeToolsSortAscending.Text = "Ascending (A-Z)"; - // - //cMenTreeToolsSortDescending - // - this.cMenTreeToolsSortDescending.Image = Resources.Sort_ZA; - this.cMenTreeToolsSortDescending.Name = "cMenTreeToolsSortDescending"; - this.cMenTreeToolsSortDescending.Size = new System.Drawing.Size(157, 22); - this.cMenTreeToolsSortDescending.Text = "Descending (Z-A)"; - // - //cMenTreeMoveUp - // - this.cMenTreeMoveUp.Image = Resources.Arrow_Up; - this.cMenTreeMoveUp.Name = "cMenTreeMoveUp"; - this.cMenTreeMoveUp.ShortcutKeys = (System.Windows.Forms.Keys) (System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up); - this.cMenTreeMoveUp.Size = new System.Drawing.Size(186, 22); - this.cMenTreeMoveUp.Text = "Move up"; - // - //cMenTreeMoveDown - // - this.cMenTreeMoveDown.Image = Resources.Arrow_Down; - this.cMenTreeMoveDown.Name = "cMenTreeMoveDown"; - this.cMenTreeMoveDown.ShortcutKeys = (System.Windows.Forms.Keys) (System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down); - this.cMenTreeMoveDown.Size = new System.Drawing.Size(186, 22); - this.cMenTreeMoveDown.Text = "Move down"; - // - //imgListTree - // - this.imgListTree.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; - this.imgListTree.ImageSize = new System.Drawing.Size(16, 16); - this.imgListTree.TransparentColor = System.Drawing.Color.Transparent; - // - //pnlConnections - // - this.pnlConnections.Anchor = (System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.pnlConnections.Controls.Add(this.PictureBox1); - this.pnlConnections.Controls.Add(this.txtSearch); - this.pnlConnections.Controls.Add(this.tvConnections); - this.pnlConnections.Location = new System.Drawing.Point(0, 25); - this.pnlConnections.Name = "pnlConnections"; - this.pnlConnections.Size = new System.Drawing.Size(192, 428); - this.pnlConnections.TabIndex = 9; - // - //PictureBox1 - // - this.PictureBox1.Anchor = (System.Windows.Forms.AnchorStyles) (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); - this.PictureBox1.Image = Resources.Search; - this.PictureBox1.Location = new System.Drawing.Point(2, 412); - this.PictureBox1.Name = "PictureBox1"; - this.PictureBox1.Size = new System.Drawing.Size(16, 16); - this.PictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.PictureBox1.TabIndex = 1; - this.PictureBox1.TabStop = false; - // - //txtSearch - // - this.txtSearch.Anchor = (System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right); - this.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txtSearch.ForeColor = System.Drawing.SystemColors.GrayText; - this.txtSearch.Location = new System.Drawing.Point(19, 413); - this.txtSearch.Name = "txtSearch"; - this.txtSearch.Size = new System.Drawing.Size(171, 13); - this.txtSearch.TabIndex = 30; - this.txtSearch.TabStop = false; - this.txtSearch.Text = "Search"; - // - //msMain - // - this.msMain.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.msMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.mMenAddConnection, this.mMenAddFolder, this.mMenView, this.mMenSortAscending}); - this.msMain.Location = new System.Drawing.Point(0, 0); - this.msMain.Name = "msMain"; - this.msMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this.msMain.ShowItemToolTips = true; - this.msMain.Size = new System.Drawing.Size(192, 24); - this.msMain.TabIndex = 10; - this.msMain.Text = "MenuStrip1"; - // - //mMenAddConnection - // - this.mMenAddConnection.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mMenAddConnection.Image = Resources.Connection_Add; - this.mMenAddConnection.Name = "mMenAddConnection"; - this.mMenAddConnection.Size = new System.Drawing.Size(28, 20); - // - //mMenAddFolder - // - this.mMenAddFolder.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mMenAddFolder.Image = Resources.Folder_Add; - this.mMenAddFolder.Name = "mMenAddFolder"; - this.mMenAddFolder.Size = new System.Drawing.Size(28, 20); - // - //mMenView - // - this.mMenView.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mMenView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {this.mMenViewExpandAllFolders, this.mMenViewCollapseAllFolders}); - this.mMenView.Image = Resources.View; - this.mMenView.Name = "mMenView"; - this.mMenView.Size = new System.Drawing.Size(28, 20); - this.mMenView.Text = "&View"; - // - //mMenViewExpandAllFolders - // - this.mMenViewExpandAllFolders.Image = Resources.Expand; - this.mMenViewExpandAllFolders.Name = "mMenViewExpandAllFolders"; - this.mMenViewExpandAllFolders.Size = new System.Drawing.Size(161, 22); - this.mMenViewExpandAllFolders.Text = "Expand all folders"; - // - //mMenViewCollapseAllFolders - // - this.mMenViewCollapseAllFolders.Image = Resources.Collapse; - this.mMenViewCollapseAllFolders.Name = "mMenViewCollapseAllFolders"; - this.mMenViewCollapseAllFolders.Size = new System.Drawing.Size(161, 22); - this.mMenViewCollapseAllFolders.Text = "Collapse all folders"; - // - //mMenSortAscending - // - this.mMenSortAscending.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.mMenSortAscending.Image = Resources.Sort_AZ; - this.mMenSortAscending.Name = "mMenSortAscending"; - this.mMenSortAscending.Size = new System.Drawing.Size(28, 20); - // - //Tree - // - this.ClientSize = new System.Drawing.Size(192, 453); - this.Controls.Add(this.msMain); - this.Controls.Add(this.pnlConnections); - this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, System.Convert.ToByte(0)); - this.HideOnClose = true; - this.Icon = Resources.Root_Icon; - this.Name = "Tree"; - this.TabText = "Connections"; - this.Text = "Connections"; - this.cMenTree.ResumeLayout(false); - this.pnlConnections.ResumeLayout(false); - this.pnlConnections.PerformLayout(); - ((System.ComponentModel.ISupportInitialize) this.PictureBox1).EndInit(); - this.msMain.ResumeLayout(false); - this.msMain.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - + this.components = new System.ComponentModel.Container(); + this.olvConnections = new BrightIdeasSoftware.TreeListView(); + this.olvColumn1 = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.cMenTree = new System.Windows.Forms.ContextMenuStrip(this.components); + this.cMenTreeConnect = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeConnectWithOptions = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeConnectWithOptionsConnectToConsoleSession = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeConnectWithOptionsConnectInFullscreen = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeConnectWithOptionsNoCredentials = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeDisconnect = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeSep1 = new System.Windows.Forms.ToolStripSeparator(); + this.cMenTreeToolsExternalApps = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeToolsTransferFile = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeSep2 = new System.Windows.Forms.ToolStripSeparator(); + this.cMenTreeDuplicate = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeRename = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeDelete = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeSep3 = new System.Windows.Forms.ToolStripSeparator(); + this.cMenTreeImport = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeImportFile = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeImportActiveDirectory = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeImportPortScan = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeExportFile = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeSep4 = new System.Windows.Forms.ToolStripSeparator(); + this.cMenTreeAddConnection = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeAddFolder = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.cMenTreeToolsSort = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeToolsSortAscending = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeToolsSortDescending = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeMoveUp = new System.Windows.Forms.ToolStripMenuItem(); + this.cMenTreeMoveDown = new System.Windows.Forms.ToolStripMenuItem(); + this.imgListTree = new System.Windows.Forms.ImageList(this.components); + this.pnlConnections = new System.Windows.Forms.Panel(); + this.PictureBox1 = new System.Windows.Forms.PictureBox(); + this.txtSearch = new System.Windows.Forms.TextBox(); + this.msMain = new System.Windows.Forms.MenuStrip(); + this.mMenAddConnection = new System.Windows.Forms.ToolStripMenuItem(); + this.mMenAddFolder = new System.Windows.Forms.ToolStripMenuItem(); + this.mMenView = new System.Windows.Forms.ToolStripMenuItem(); + this.mMenViewExpandAllFolders = new System.Windows.Forms.ToolStripMenuItem(); + this.mMenViewCollapseAllFolders = new System.Windows.Forms.ToolStripMenuItem(); + this.mMenSortAscending = new System.Windows.Forms.ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)(this.olvConnections)).BeginInit(); + this.cMenTree.SuspendLayout(); + this.pnlConnections.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit(); + this.msMain.SuspendLayout(); + this.SuspendLayout(); + // + // olvConnections + // + this.olvConnections.AllColumns.Add(this.olvColumn1); + this.olvConnections.AllowDrop = true; + this.olvConnections.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.olvConnections.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.olvConnections.CellEditUseWholeCell = false; + this.olvConnections.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.olvColumn1}); + this.olvConnections.ContextMenuStrip = this.cMenTree; + this.olvConnections.Cursor = System.Windows.Forms.Cursors.Default; + this.olvConnections.FullRowSelect = true; + this.olvConnections.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.olvConnections.HideSelection = false; + this.olvConnections.LabelEdit = true; + this.olvConnections.Location = new System.Drawing.Point(0, 0); + this.olvConnections.MultiSelect = false; + this.olvConnections.Name = "olvConnections"; + this.olvConnections.ShowGroups = false; + this.olvConnections.Size = new System.Drawing.Size(192, 410); + this.olvConnections.SmallImageList = this.imgListTree; + this.olvConnections.TabIndex = 20; + this.olvConnections.UseCompatibleStateImageBehavior = false; + this.olvConnections.View = System.Windows.Forms.View.Details; + this.olvConnections.VirtualMode = true; + // + // olvColumn1 + // + this.olvColumn1.AspectName = "Name"; + this.olvColumn1.IsButton = true; + this.olvColumn1.Width = 200; + // + // cMenTree + // + this.cMenTree.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cMenTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cMenTreeConnect, + this.cMenTreeConnectWithOptions, + this.cMenTreeDisconnect, + this.cMenTreeSep1, + this.cMenTreeToolsExternalApps, + this.cMenTreeToolsTransferFile, + this.cMenTreeSep2, + this.cMenTreeDuplicate, + this.cMenTreeRename, + this.cMenTreeDelete, + this.cMenTreeSep3, + this.cMenTreeImport, + this.cMenTreeExportFile, + this.cMenTreeSep4, + this.cMenTreeAddConnection, + this.cMenTreeAddFolder, + this.ToolStripSeparator1, + this.cMenTreeToolsSort, + this.cMenTreeMoveUp, + this.cMenTreeMoveDown}); + this.cMenTree.Name = "cMenTree"; + this.cMenTree.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.cMenTree.Size = new System.Drawing.Size(200, 364); + this.cMenTree.Opening += new System.ComponentModel.CancelEventHandler(this.cMenTree_DropDownOpening); + // + // cMenTreeConnect + // + this.cMenTreeConnect.Image = global::mRemoteNG.Resources.Play; + this.cMenTreeConnect.Name = "cMenTreeConnect"; + this.cMenTreeConnect.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.C))); + this.cMenTreeConnect.Size = new System.Drawing.Size(199, 22); + this.cMenTreeConnect.Text = "Connect"; + this.cMenTreeConnect.Click += new System.EventHandler(this.cMenTreeConnect_Click); + // + // cMenTreeConnectWithOptions + // + this.cMenTreeConnectWithOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cMenTreeConnectWithOptionsConnectToConsoleSession, + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession, + this.cMenTreeConnectWithOptionsConnectInFullscreen, + this.cMenTreeConnectWithOptionsNoCredentials, + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting}); + this.cMenTreeConnectWithOptions.Name = "cMenTreeConnectWithOptions"; + this.cMenTreeConnectWithOptions.Size = new System.Drawing.Size(199, 22); + this.cMenTreeConnectWithOptions.Text = "Connect (with options)"; + // + // cMenTreeConnectWithOptionsConnectToConsoleSession + // + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Image = global::mRemoteNG.Resources.monitor_go; + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsConnectToConsoleSession"; + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Text = "Connect to console session"; + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsConnectToConsoleSession_Click); + // + // cMenTreeConnectWithOptionsDontConnectToConsoleSession + // + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Image = global::mRemoteNG.Resources.monitor_delete; + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsDontConnectToConsoleSession"; + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = "Don\'t connect to console session"; + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Visible = false; + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click); + // + // cMenTreeConnectWithOptionsConnectInFullscreen + // + this.cMenTreeConnectWithOptionsConnectInFullscreen.Image = global::mRemoteNG.Resources.arrow_out; + this.cMenTreeConnectWithOptionsConnectInFullscreen.Name = "cMenTreeConnectWithOptionsConnectInFullscreen"; + this.cMenTreeConnectWithOptionsConnectInFullscreen.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsConnectInFullscreen.Text = "Connect in fullscreen"; + this.cMenTreeConnectWithOptionsConnectInFullscreen.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsConnectInFullscreen_Click); + // + // cMenTreeConnectWithOptionsNoCredentials + // + this.cMenTreeConnectWithOptionsNoCredentials.Image = global::mRemoteNG.Resources.key_delete; + this.cMenTreeConnectWithOptionsNoCredentials.Name = "cMenTreeConnectWithOptionsNoCredentials"; + this.cMenTreeConnectWithOptionsNoCredentials.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsNoCredentials.Text = "Connect without credentials"; + this.cMenTreeConnectWithOptionsNoCredentials.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsNoCredentials_Click); + // + // cMenTreeConnectWithOptionsChoosePanelBeforeConnecting + // + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Image = global::mRemoteNG.Resources.Panels; + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Name = "cMenTreeConnectWithOptionsChoosePanelBeforeConnecting"; + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = "Choose panel before connecting"; + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click); + // + // cMenTreeDisconnect + // + this.cMenTreeDisconnect.Image = global::mRemoteNG.Resources.Pause; + this.cMenTreeDisconnect.Name = "cMenTreeDisconnect"; + this.cMenTreeDisconnect.Size = new System.Drawing.Size(199, 22); + this.cMenTreeDisconnect.Text = "Disconnect"; + this.cMenTreeDisconnect.Click += new System.EventHandler(this.cMenTreeDisconnect_Click); + // + // cMenTreeSep1 + // + this.cMenTreeSep1.Name = "cMenTreeSep1"; + this.cMenTreeSep1.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeToolsExternalApps + // + this.cMenTreeToolsExternalApps.Image = global::mRemoteNG.Resources.ExtApp; + this.cMenTreeToolsExternalApps.Name = "cMenTreeToolsExternalApps"; + this.cMenTreeToolsExternalApps.Size = new System.Drawing.Size(199, 22); + this.cMenTreeToolsExternalApps.Text = "External Applications"; + // + // cMenTreeToolsTransferFile + // + this.cMenTreeToolsTransferFile.Image = global::mRemoteNG.Resources.SSHTransfer; + this.cMenTreeToolsTransferFile.Name = "cMenTreeToolsTransferFile"; + this.cMenTreeToolsTransferFile.Size = new System.Drawing.Size(199, 22); + this.cMenTreeToolsTransferFile.Text = "Transfer File (SSH)"; + this.cMenTreeToolsTransferFile.Click += new System.EventHandler(this.cMenTreeToolsTransferFile_Click); + // + // cMenTreeSep2 + // + this.cMenTreeSep2.Name = "cMenTreeSep2"; + this.cMenTreeSep2.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeDuplicate + // + this.cMenTreeDuplicate.Image = global::mRemoteNG.Resources.page_copy; + this.cMenTreeDuplicate.Name = "cMenTreeDuplicate"; + this.cMenTreeDuplicate.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); + this.cMenTreeDuplicate.Size = new System.Drawing.Size(199, 22); + this.cMenTreeDuplicate.Text = "Duplicate"; + this.cMenTreeDuplicate.Click += new System.EventHandler(this.cMenTreeDuplicate_Click); + // + // cMenTreeRename + // + this.cMenTreeRename.Image = global::mRemoteNG.Resources.Rename; + this.cMenTreeRename.Name = "cMenTreeRename"; + this.cMenTreeRename.ShortcutKeys = System.Windows.Forms.Keys.F2; + this.cMenTreeRename.Size = new System.Drawing.Size(199, 22); + this.cMenTreeRename.Text = "Rename"; + this.cMenTreeRename.Click += new System.EventHandler(this.cMenTreeRename_Click); + // + // cMenTreeDelete + // + this.cMenTreeDelete.Image = global::mRemoteNG.Resources.Delete; + this.cMenTreeDelete.Name = "cMenTreeDelete"; + this.cMenTreeDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; + this.cMenTreeDelete.Size = new System.Drawing.Size(199, 22); + this.cMenTreeDelete.Text = "Delete"; + this.cMenTreeDelete.Click += new System.EventHandler(this.cMenTreeDelete_Click); + // + // cMenTreeSep3 + // + this.cMenTreeSep3.Name = "cMenTreeSep3"; + this.cMenTreeSep3.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeImport + // + this.cMenTreeImport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cMenTreeImportFile, + this.cMenTreeImportActiveDirectory, + this.cMenTreeImportPortScan}); + this.cMenTreeImport.Name = "cMenTreeImport"; + this.cMenTreeImport.Size = new System.Drawing.Size(199, 22); + this.cMenTreeImport.Text = "&Import"; + // + // cMenTreeImportFile + // + this.cMenTreeImportFile.Name = "cMenTreeImportFile"; + this.cMenTreeImportFile.Size = new System.Drawing.Size(226, 22); + this.cMenTreeImportFile.Text = "Import from &File..."; + this.cMenTreeImportFile.Click += new System.EventHandler(this.cMenTreeImportFile_Click); + // + // cMenTreeImportActiveDirectory + // + this.cMenTreeImportActiveDirectory.Name = "cMenTreeImportActiveDirectory"; + this.cMenTreeImportActiveDirectory.Size = new System.Drawing.Size(226, 22); + this.cMenTreeImportActiveDirectory.Text = "Import from &Active Directory..."; + this.cMenTreeImportActiveDirectory.Click += new System.EventHandler(this.cMenTreeImportActiveDirectory_Click); + // + // cMenTreeImportPortScan + // + this.cMenTreeImportPortScan.Name = "cMenTreeImportPortScan"; + this.cMenTreeImportPortScan.Size = new System.Drawing.Size(226, 22); + this.cMenTreeImportPortScan.Text = "Import from &Port Scan..."; + this.cMenTreeImportPortScan.Click += new System.EventHandler(this.cMenTreeImportPortScan_Click); + // + // cMenTreeExportFile + // + this.cMenTreeExportFile.Name = "cMenTreeExportFile"; + this.cMenTreeExportFile.Size = new System.Drawing.Size(199, 22); + this.cMenTreeExportFile.Text = "&Export to File..."; + this.cMenTreeExportFile.Click += new System.EventHandler(this.cMenTreeExportFile_Click); + // + // cMenTreeSep4 + // + this.cMenTreeSep4.Name = "cMenTreeSep4"; + this.cMenTreeSep4.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeAddConnection + // + this.cMenTreeAddConnection.Image = global::mRemoteNG.Resources.Connection_Add; + this.cMenTreeAddConnection.Name = "cMenTreeAddConnection"; + this.cMenTreeAddConnection.Size = new System.Drawing.Size(199, 22); + this.cMenTreeAddConnection.Text = "New Connection"; + this.cMenTreeAddConnection.Click += new System.EventHandler(this.cMenTreeAddConnection_Click); + // + // cMenTreeAddFolder + // + this.cMenTreeAddFolder.Image = global::mRemoteNG.Resources.Folder_Add; + this.cMenTreeAddFolder.Name = "cMenTreeAddFolder"; + this.cMenTreeAddFolder.Size = new System.Drawing.Size(199, 22); + this.cMenTreeAddFolder.Text = "New Folder"; + this.cMenTreeAddFolder.Click += new System.EventHandler(this.cMenTreeAddFolder_Click); + // + // ToolStripSeparator1 + // + this.ToolStripSeparator1.Name = "ToolStripSeparator1"; + this.ToolStripSeparator1.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeToolsSort + // + this.cMenTreeToolsSort.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cMenTreeToolsSortAscending, + this.cMenTreeToolsSortDescending}); + this.cMenTreeToolsSort.Name = "cMenTreeToolsSort"; + this.cMenTreeToolsSort.Size = new System.Drawing.Size(199, 22); + this.cMenTreeToolsSort.Text = "Sort"; + // + // cMenTreeToolsSortAscending + // + this.cMenTreeToolsSortAscending.Image = global::mRemoteNG.Resources.Sort_AZ; + this.cMenTreeToolsSortAscending.Name = "cMenTreeToolsSortAscending"; + this.cMenTreeToolsSortAscending.Size = new System.Drawing.Size(161, 22); + this.cMenTreeToolsSortAscending.Text = "Ascending (A-Z)"; + this.cMenTreeToolsSortAscending.Click += new System.EventHandler(this.cMenTreeToolsSortAscending_Click); + // + // cMenTreeToolsSortDescending + // + this.cMenTreeToolsSortDescending.Image = global::mRemoteNG.Resources.Sort_ZA; + this.cMenTreeToolsSortDescending.Name = "cMenTreeToolsSortDescending"; + this.cMenTreeToolsSortDescending.Size = new System.Drawing.Size(161, 22); + this.cMenTreeToolsSortDescending.Text = "Descending (Z-A)"; + this.cMenTreeToolsSortDescending.Click += new System.EventHandler(this.cMenTreeToolsSortDescending_Click); + // + // cMenTreeMoveUp + // + this.cMenTreeMoveUp.Image = global::mRemoteNG.Resources.Arrow_Up; + this.cMenTreeMoveUp.Name = "cMenTreeMoveUp"; + this.cMenTreeMoveUp.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); + this.cMenTreeMoveUp.Size = new System.Drawing.Size(199, 22); + this.cMenTreeMoveUp.Text = "Move up"; + this.cMenTreeMoveUp.Click += new System.EventHandler(this.cMenTreeMoveUp_Click); + // + // cMenTreeMoveDown + // + this.cMenTreeMoveDown.Image = global::mRemoteNG.Resources.Arrow_Down; + this.cMenTreeMoveDown.Name = "cMenTreeMoveDown"; + this.cMenTreeMoveDown.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); + this.cMenTreeMoveDown.Size = new System.Drawing.Size(199, 22); + this.cMenTreeMoveDown.Text = "Move down"; + this.cMenTreeMoveDown.Click += new System.EventHandler(this.cMenTreeMoveDown_Click); + // + // imgListTree + // + this.imgListTree.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.imgListTree.ImageSize = new System.Drawing.Size(16, 16); + this.imgListTree.TransparentColor = System.Drawing.Color.Transparent; + // + // pnlConnections + // + this.pnlConnections.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlConnections.Controls.Add(this.PictureBox1); + this.pnlConnections.Controls.Add(this.txtSearch); + this.pnlConnections.Controls.Add(this.olvConnections); + this.pnlConnections.Location = new System.Drawing.Point(0, 25); + this.pnlConnections.Name = "pnlConnections"; + this.pnlConnections.Size = new System.Drawing.Size(192, 428); + this.pnlConnections.TabIndex = 9; + // + // PictureBox1 + // + this.PictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.PictureBox1.Image = global::mRemoteNG.Resources.Search; + this.PictureBox1.Location = new System.Drawing.Point(2, 412); + this.PictureBox1.Name = "PictureBox1"; + this.PictureBox1.Size = new System.Drawing.Size(16, 16); + this.PictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.PictureBox1.TabIndex = 1; + this.PictureBox1.TabStop = false; + // + // txtSearch + // + this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSearch.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtSearch.ForeColor = System.Drawing.SystemColors.GrayText; + this.txtSearch.Location = new System.Drawing.Point(19, 413); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(171, 15); + this.txtSearch.TabIndex = 30; + this.txtSearch.TabStop = false; + this.txtSearch.Text = "Search"; + this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged); + this.txtSearch.GotFocus += new System.EventHandler(this.txtSearch_GotFocus); + this.txtSearch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearch_KeyDown); + this.txtSearch.LostFocus += new System.EventHandler(this.txtSearch_LostFocus); + // + // msMain + // + this.msMain.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.msMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mMenAddConnection, + this.mMenAddFolder, + this.mMenView, + this.mMenSortAscending}); + this.msMain.Location = new System.Drawing.Point(0, 0); + this.msMain.Name = "msMain"; + this.msMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.msMain.ShowItemToolTips = true; + this.msMain.Size = new System.Drawing.Size(192, 24); + this.msMain.TabIndex = 10; + this.msMain.Text = "MenuStrip1"; + // + // mMenAddConnection + // + this.mMenAddConnection.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.mMenAddConnection.Image = global::mRemoteNG.Resources.Connection_Add; + this.mMenAddConnection.Name = "mMenAddConnection"; + this.mMenAddConnection.Size = new System.Drawing.Size(28, 20); + this.mMenAddConnection.Click += new System.EventHandler(this.cMenTreeAddConnection_Click); + // + // mMenAddFolder + // + this.mMenAddFolder.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.mMenAddFolder.Image = global::mRemoteNG.Resources.Folder_Add; + this.mMenAddFolder.Name = "mMenAddFolder"; + this.mMenAddFolder.Size = new System.Drawing.Size(28, 20); + this.mMenAddFolder.Click += new System.EventHandler(this.cMenTreeAddFolder_Click); + // + // mMenView + // + this.mMenView.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.mMenView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mMenViewExpandAllFolders, + this.mMenViewCollapseAllFolders}); + this.mMenView.Image = global::mRemoteNG.Resources.View; + this.mMenView.Name = "mMenView"; + this.mMenView.Size = new System.Drawing.Size(28, 20); + this.mMenView.Text = "&View"; + // + // mMenViewExpandAllFolders + // + this.mMenViewExpandAllFolders.Image = global::mRemoteNG.Resources.Expand; + this.mMenViewExpandAllFolders.Name = "mMenViewExpandAllFolders"; + this.mMenViewExpandAllFolders.Size = new System.Drawing.Size(172, 22); + this.mMenViewExpandAllFolders.Text = "Expand all folders"; + this.mMenViewExpandAllFolders.Click += new System.EventHandler(this.mMenViewExpandAllFolders_Click); + // + // mMenViewCollapseAllFolders + // + this.mMenViewCollapseAllFolders.Image = global::mRemoteNG.Resources.Collapse; + this.mMenViewCollapseAllFolders.Name = "mMenViewCollapseAllFolders"; + this.mMenViewCollapseAllFolders.Size = new System.Drawing.Size(172, 22); + this.mMenViewCollapseAllFolders.Text = "Collapse all folders"; + this.mMenViewCollapseAllFolders.Click += new System.EventHandler(this.mMenViewCollapseAllFolders_Click); + // + // mMenSortAscending + // + this.mMenSortAscending.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.mMenSortAscending.Image = global::mRemoteNG.Resources.Sort_AZ; + this.mMenSortAscending.Name = "mMenSortAscending"; + this.mMenSortAscending.Size = new System.Drawing.Size(28, 20); + this.mMenSortAscending.Click += new System.EventHandler(this.mMenSortAscending_Click); + // + // ConnectionTreeWindow + // + this.ClientSize = new System.Drawing.Size(192, 453); + this.Controls.Add(this.msMain); + this.Controls.Add(this.pnlConnections); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.HideOnClose = true; + this.Icon = global::mRemoteNG.Resources.Root_Icon; + this.Name = "ConnectionTreeWindow"; + this.TabText = "Connections"; + this.Text = "Connections"; + this.Load += new System.EventHandler(this.Tree_Load); + ((System.ComponentModel.ISupportInitialize)(this.olvConnections)).EndInit(); + this.cMenTree.ResumeLayout(false); + this.pnlConnections.ResumeLayout(false); + this.pnlConnections.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit(); + this.msMain.ResumeLayout(false); + this.msMain.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + } internal System.Windows.Forms.ToolStripMenuItem cMenTreeImport; internal System.Windows.Forms.ToolStripMenuItem cMenTreeExportFile; @@ -498,5 +538,8 @@ namespace mRemoteNG.UI.Window internal System.Windows.Forms.ToolStripMenuItem cMenTreeImportActiveDirectory; internal System.Windows.Forms.ToolStripMenuItem cMenTreeImportPortScan; #endregion - } + + private System.ComponentModel.IContainer components; + private BrightIdeasSoftware.OLVColumn olvColumn1; + } } diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 1c398121f..510ab2f20 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -14,14 +14,24 @@ namespace mRemoteNG.UI.Window { public partial class ConnectionTreeWindow { + private ConnectionTreeModel _connectionTreeModel; + private ToolTip DescriptionTooltip { get; } - #region Form Stuff + public ConnectionTreeModel ConnectionTreeModel + { + get { return _connectionTreeModel; } + set + { + _connectionTreeModel = value; + PopulateTreeView(); + } + } + #region Form Stuff private void Tree_Load(object sender, EventArgs e) { ApplyLanguage(); - Themes.ThemeManager.ThemeChanged += ApplyTheme; ApplyTheme(); @@ -29,6 +39,7 @@ namespace mRemoteNG.UI.Window txtSearch.MinimumSize = new Size(0, 14); txtSearch.Size = new Size(txtSearch.Size.Width, 14); txtSearch.Multiline = false; + olvConnections.Show(); } private void ApplyLanguage() @@ -81,9 +92,9 @@ namespace mRemoteNG.UI.Window { msMain.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; msMain.ForeColor = Themes.ThemeManager.ActiveTheme.ToolbarTextColor; - tvConnections.BackColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelBackgroundColor; - tvConnections.ForeColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTextColor; - tvConnections.LineColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTreeLineColor; + olvConnections.BackColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelBackgroundColor; + olvConnections.ForeColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTextColor; + //tvConnections.LineColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTreeLineColor; BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; txtSearch.BackColor = Themes.ThemeManager.ActiveTheme.SearchBoxBackgroundColor; txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; @@ -104,6 +115,15 @@ namespace mRemoteNG.UI.Window ReshowDelay = 0 }; } + + private void PopulateTreeView() + { + olvColumn1.AspectGetter = item => ((ConnectionInfo) item).Name; + olvConnections.CanExpandGetter = item => item is ContainerInfo; + olvConnections.ChildrenGetter = item => ((ContainerInfo) item).Children; + olvConnections.Roots = ConnectionTreeModel.RootNodes; + olvConnections.ExpandAll(); + } public void InitialRefresh() { @@ -153,12 +173,12 @@ namespace mRemoteNG.UI.Window } } - private void tvConnections_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) { cMenTreeDelete.ShortcutKeys = Keys.None; } - private void tvConnections_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + private void tvConnections_AfterLabelEdit(object sender, LabelEditEventArgs e) { try { @@ -166,7 +186,7 @@ namespace mRemoteNG.UI.Window ConnectionTree.FinishRenameSelectedNode(e.Label); Windows.configForm.pGrid_SelectedObjectChanged(); - ShowHideTreeContextMenuItems(e.Node); + //ShowHideTreeContextMenuItems(e.Node); Runtime.SaveConnectionsBG(); } catch (Exception ex) @@ -175,67 +195,67 @@ namespace mRemoteNG.UI.Window } } - private void tvConnections_AfterSelect(object sender, TreeViewEventArgs e) + private void tvConnections_AfterSelect(object sender, EventArgs e) { - try - { - if ((ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection) || (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttySession)) - { - Windows.configForm.SetPropertyGridObject(e.Node.Tag); - } - else if (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Container) - { - Windows.configForm.SetPropertyGridObject((ContainerInfo) e.Node.Tag); - } - else if ((ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Root) || (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttyRoot)) - { - Windows.configForm.SetPropertyGridObject(e.Node.Tag); - } - else - { - return; - } + //try + //{ + // if ((ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection) || (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttySession)) + // { + // Windows.configForm.SetPropertyGridObject(e.Node.Tag); + // } + // else if (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Container) + // { + // Windows.configForm.SetPropertyGridObject((ContainerInfo) e.Node.Tag); + // } + // else if ((ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Root) || (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttyRoot)) + // { + // Windows.configForm.SetPropertyGridObject(e.Node.Tag); + // } + // else + // { + // return; + // } - Windows.configForm.pGrid_SelectedObjectChanged(); - ShowHideTreeContextMenuItems(e.Node); + // Windows.configForm.pGrid_SelectedObjectChanged(); + // ShowHideTreeContextMenuItems(e.Node); - Runtime.LastSelected = ConnectionTreeNode.GetConstantID(e.Node); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_AfterSelect (UI.Window.ConnectionTreeWindow) failed", ex); - } + // Runtime.LastSelected = ConnectionTreeNode.GetConstantID(e.Node); + //} + //catch (Exception ex) + //{ + // Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_AfterSelect (UI.Window.ConnectionTreeWindow) failed", ex); + //} } - private void tvConnections_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + private void tvConnections_NodeMouseClick(object sender, MouseEventArgs e) { - try - { - ShowHideTreeContextMenuItems(tvConnections.SelectedNode); - tvConnections.SelectedNode = e.Node; + //try + //{ + // ShowHideTreeContextMenuItems(tvConnections.SelectedNode); + // tvConnections.SelectedNode = e.Node; - if (e.Button == MouseButtons.Left) - { - if (Settings.Default.SingleClickOnConnectionOpensIt && - (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection | - ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttySession)) - { - Runtime.OpenConnection(); - } + // if (e.Button == MouseButtons.Left) + // { + // if (Settings.Default.SingleClickOnConnectionOpensIt && + // (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection | + // ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttySession)) + // { + // Runtime.OpenConnection(); + // } - if (Settings.Default.SingleClickSwitchesToOpenConnection && ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection) - { - Runtime.SwitchToOpenConnection((ConnectionInfo)e.Node.Tag); - } - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_NodeMouseClick (UI.Window.ConnectionTreeWindow) failed", ex); - } + // if (Settings.Default.SingleClickSwitchesToOpenConnection && ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection) + // { + // Runtime.SwitchToOpenConnection((ConnectionInfo)e.Node.Tag); + // } + // } + //} + //catch (Exception ex) + //{ + // Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_NodeMouseClick (UI.Window.ConnectionTreeWindow) failed", ex); + //} } - private static void tvConnections_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) + private static void tvConnections_NodeMouseDoubleClick(object sender, MouseEventArgs e) { if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) @@ -536,32 +556,32 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - private static void cMenTreeConnect_Click(object sender, EventArgs e) + private void cMenTreeConnect_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.DoNotJump); } - private static void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(object sender, EventArgs e) + private void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); } - private static void cMenTreeConnectWithOptionsNoCredentials_Click(object sender, EventArgs e) + private void cMenTreeConnectWithOptionsNoCredentials_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.NoCredentials); } - private static void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(object sender, EventArgs e) + private void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); } - private static void cMenTreeConnectWithOptionsConnectInFullscreen_Click(object sender, EventArgs e) + private void cMenTreeConnectWithOptionsConnectInFullscreen_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); } - private static void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(object sender, EventArgs e) + private void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); } @@ -571,7 +591,7 @@ namespace mRemoteNG.UI.Window DisconnectConnection(); } - private static void cMenTreeToolsTransferFile_Click(object sender, EventArgs e) + private void cMenTreeToolsTransferFile_Click(object sender, EventArgs e) { SshTransferFile(); } @@ -605,7 +625,7 @@ namespace mRemoteNG.UI.Window AddExternalApps(); } - private static void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e) + private void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e) { StartExternalApp((Tools.ExternalTool)((ToolStripMenuItem)sender).Tag); } @@ -616,44 +636,44 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - private static void cMenTreeRename_Click(object sender, EventArgs e) + private void cMenTreeRename_Click(object sender, EventArgs e) { ConnectionTree.StartRenameSelectedNode(); Runtime.SaveConnectionsBG(); } - private static void cMenTreeDelete_Click(object sender, EventArgs e) + private void cMenTreeDelete_Click(object sender, EventArgs e) { ConnectionTree.DeleteSelectedNode(); Runtime.SaveConnectionsBG(); } - private static void cMenTreeImportFile_Click(object sender, EventArgs e) + private void cMenTreeImportFile_Click(object sender, EventArgs e) { Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true); } - private static void cMenTreeImportActiveDirectory_Click(object sender, EventArgs e) + private void cMenTreeImportActiveDirectory_Click(object sender, EventArgs e) { Windows.Show(WindowType.ActiveDirectoryImport); } - private static void cMenTreeImportPortScan_Click(object sender, EventArgs e) + private void cMenTreeImportPortScan_Click(object sender, EventArgs e) { Windows.Show(WindowType.PortScan); } - private static void cMenTreeExportFile_Click(object sender, EventArgs e) + private void cMenTreeExportFile_Click(object sender, EventArgs e) { Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); } - private static void cMenTreeMoveUp_Click(object sender, EventArgs e) + private void cMenTreeMoveUp_Click(object sender, EventArgs e) { ConnectionTree.MoveNodeUp(); Runtime.SaveConnectionsBG(); } - private static void cMenTreeMoveDown_Click(object sender, EventArgs e) + private void cMenTreeMoveDown_Click(object sender, EventArgs e) { ConnectionTree.MoveNodeDown(); Runtime.SaveConnectionsBG(); @@ -933,7 +953,7 @@ namespace mRemoteNG.UI.Window { try { - tvConnections.SelectedNode = ConnectionTree.Find(tvConnections.Nodes[0], txtSearch.Text); + //tvConnections.SelectedNode = ConnectionTree.Find(tvConnections.Nodes[0], txtSearch.Text); } catch (Exception) { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.resx b/mRemoteV1/UI/Window/ConnectionTreeWindow.resx index 4c0f58aeb..45d7100e9 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.resx +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.resx @@ -112,18 +112,18 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 208, 19 - + 17, 17 - + 119, 19 \ No newline at end of file From a6dbc59ad1ff4eab38ed01a653f33550cd6872d9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 12:32:34 -0600 Subject: [PATCH 047/338] Made the connection node name column take up all available space (similar to previous implementation) --- mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 9eb873f2b..382a19660 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -127,6 +127,7 @@ namespace mRemoteNG.UI.Window // olvColumn1 // this.olvColumn1.AspectName = "Name"; + this.olvColumn1.FillsFreeSpace = true; this.olvColumn1.IsButton = true; this.olvColumn1.Width = 200; // From 2810fa7f8053a33bcfe9a4c87e119f273ab05ff2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 12:33:50 -0600 Subject: [PATCH 048/338] Removed unnecessary tree update function. Added TODO comments for all functionality broken by the change to the TreeListView --- .../Connections/SqlConnectionsLoader.cs | 1 - mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 157 +++++++++++------- 2 files changed, 99 insertions(+), 59 deletions(-) diff --git a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs index f248cbeca..4312652ca 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs @@ -143,7 +143,6 @@ namespace mRemoteNG.Config.Connections } Runtime.IsConnectionsFileLoaded = true; - Windows.treeForm.InitialRefresh(); SetSelectedNode(_selectedTreeNode); } finally diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 510ab2f20..b0155b578 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -39,7 +39,6 @@ namespace mRemoteNG.UI.Window txtSearch.MinimumSize = new Size(0, 14); txtSearch.Size = new Size(txtSearch.Size.Width, 14); txtSearch.Multiline = false; - olvConnections.Show(); } private void ApplyLanguage() @@ -122,14 +121,9 @@ namespace mRemoteNG.UI.Window olvConnections.CanExpandGetter = item => item is ContainerInfo; olvConnections.ChildrenGetter = item => ((ContainerInfo) item).Children; olvConnections.Roots = ConnectionTreeModel.RootNodes; - olvConnections.ExpandAll(); } - - public void InitialRefresh() - { - tvConnections_AfterSelect(tvConnections, new TreeViewEventArgs(tvConnections.SelectedNode, TreeViewAction.ByMouse)); - } + //TODO Fix for TreeListView public void ExpandPreviouslyOpenedFolders() { foreach (ContainerInfo contI in Runtime.ContainerList) @@ -139,6 +133,7 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView public void OpenConnectionsFromLastSession() { if (!Settings.Default.OpenConsFromLastSession || Settings.Default.NoReconnect) return; @@ -149,15 +144,17 @@ namespace mRemoteNG.UI.Window } } - public void EnsureRootNodeVisible() + //TODO Fix for TreeListView + public void EnsureRootNodeVisible() { var rootNode = tvConnections.Nodes[0]; rootNode.EnsureVisible(); } #endregion - + #region Private Methods - private void FillImageList() + //TODO Fix for TreeListView + private void FillImageList() { try { @@ -172,12 +169,14 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace("FillImageList (UI.Window.ConnectionTreeWindow) failed", ex); } } - - private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) + + //TODO Fix for TreeListView + private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) { cMenTreeDelete.ShortcutKeys = Keys.None; } + //TODO Fix for TreeListView private void tvConnections_AfterLabelEdit(object sender, LabelEditEventArgs e) { try @@ -195,6 +194,7 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView private void tvConnections_AfterSelect(object sender, EventArgs e) { //try @@ -227,34 +227,36 @@ namespace mRemoteNG.UI.Window //} } + //TODO Fix for TreeListView private void tvConnections_NodeMouseClick(object sender, MouseEventArgs e) { - //try - //{ - // ShowHideTreeContextMenuItems(tvConnections.SelectedNode); - // tvConnections.SelectedNode = e.Node; - - // if (e.Button == MouseButtons.Left) - // { - // if (Settings.Default.SingleClickOnConnectionOpensIt && - // (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection | - // ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttySession)) - // { - // Runtime.OpenConnection(); - // } - - // if (Settings.Default.SingleClickSwitchesToOpenConnection && ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection) - // { - // Runtime.SwitchToOpenConnection((ConnectionInfo)e.Node.Tag); - // } - // } - //} - //catch (Exception ex) - //{ - // Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_NodeMouseClick (UI.Window.ConnectionTreeWindow) failed", ex); - //} - } + //try + //{ + // ShowHideTreeContextMenuItems(tvConnections.SelectedNode); + // tvConnections.SelectedNode = e.Node; + // if (e.Button == MouseButtons.Left) + // { + // if (Settings.Default.SingleClickOnConnectionOpensIt && + // (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection | + // ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttySession)) + // { + // Runtime.OpenConnection(); + // } + + // if (Settings.Default.SingleClickSwitchesToOpenConnection && ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection) + // { + // Runtime.SwitchToOpenConnection((ConnectionInfo)e.Node.Tag); + // } + // } + //} + //catch (Exception ex) + //{ + // Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_NodeMouseClick (UI.Window.ConnectionTreeWindow) failed", ex); + //} + } + + //TODO Fix for TreeListView private static void tvConnections_NodeMouseDoubleClick(object sender, MouseEventArgs e) { if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | @@ -264,6 +266,7 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView private void tvConnections_MouseMove(object sender, MouseEventArgs e) { try @@ -275,8 +278,9 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_MouseMove (UI.Window.ConnectionTreeWindow) failed", ex); } } - - private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true) + + //TODO Fix for TreeListView + private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true) { foreach (ToolStripItem item in items) { @@ -292,8 +296,9 @@ namespace mRemoteNG.UI.Window } } } - - private void ShowHideTreeContextMenuItems(TreeNode selectedNode) + + //TODO Fix for TreeListView + private void ShowHideTreeContextMenuItems(TreeNode selectedNode) { if (selectedNode == null) { @@ -425,6 +430,7 @@ namespace mRemoteNG.UI.Window #endregion #region Drag and Drop + //TODO Fix for TreeListView private static void tvConnections_DragDrop(object sender, DragEventArgs e) { try @@ -446,8 +452,7 @@ namespace mRemoteNG.UI.Window } } - - + //TODO Fix for TreeListView private static void tvConnections_DragEnter(object sender, DragEventArgs e) { try @@ -470,6 +475,7 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView private static void tvConnections_DragOver(object sender, DragEventArgs e) { try @@ -517,6 +523,7 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView private void tvConnections_ItemDrag(object sender, ItemDragEventArgs e) { try @@ -544,43 +551,51 @@ namespace mRemoteNG.UI.Window #endregion #region Tree Context Menu + //TODO Fix for TreeListView private void cMenTreeAddConnection_Click(object sender, EventArgs e) { AddConnection(); Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTreeAddFolder_Click(object sender, EventArgs e) { AddFolder(); Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTreeConnect_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.DoNotJump); } + //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); } + //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsNoCredentials_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.NoCredentials); } + //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); } + //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsConnectInFullscreen_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); } + //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); @@ -596,6 +611,7 @@ namespace mRemoteNG.UI.Window SshTransferFile(); } + //TODO Fix for TreeListView private void mMenSortAscending_Click(object sender, EventArgs e) { tvConnections.BeginUpdate(); @@ -604,6 +620,7 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTreeToolsSortAscending_Click(object sender, EventArgs e) { tvConnections.BeginUpdate(); @@ -612,6 +629,7 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTreeToolsSortDescending_Click(object sender, EventArgs e) { tvConnections.BeginUpdate(); @@ -624,64 +642,75 @@ namespace mRemoteNG.UI.Window { AddExternalApps(); } - - private void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e) + + private void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e) { StartExternalApp((Tools.ExternalTool)((ToolStripMenuItem)sender).Tag); } + //TODO Fix for TreeListView private void cMenTreeDuplicate_Click(object sender, EventArgs e) { ConnectionTreeNode.CloneNode(tvConnections.SelectedNode); Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTreeRename_Click(object sender, EventArgs e) { ConnectionTree.StartRenameSelectedNode(); Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTreeDelete_Click(object sender, EventArgs e) { ConnectionTree.DeleteSelectedNode(); Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTreeImportFile_Click(object sender, EventArgs e) { Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true); } + //TODO Fix for TreeListView private void cMenTreeImportActiveDirectory_Click(object sender, EventArgs e) { Windows.Show(WindowType.ActiveDirectoryImport); } + //TODO Fix for TreeListView private void cMenTreeImportPortScan_Click(object sender, EventArgs e) { Windows.Show(WindowType.PortScan); } + //TODO Fix for TreeListView private void cMenTreeExportFile_Click(object sender, EventArgs e) { Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); } + + //TODO Fix for TreeListView private void cMenTreeMoveUp_Click(object sender, EventArgs e) { ConnectionTree.MoveNodeUp(); Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTreeMoveDown_Click(object sender, EventArgs e) { ConnectionTree.MoveNodeDown(); Runtime.SaveConnectionsBG(); } #endregion - + #region Context Menu Actions - public void AddConnection() + //TODO Fix for TreeListView + public void AddConnection() { try { @@ -728,8 +757,9 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace("UI.Window.Tree.AddConnection() failed.", ex); } } - - public void AddFolder() + + //TODO Fix for TreeListView + public void AddFolder() { try { @@ -776,8 +806,9 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace(Language.strErrorAddFolderFailed, ex); } } - - private void DisconnectConnection() + + //TODO Fix for TreeListView + private void DisconnectConnection() { try { @@ -813,8 +844,9 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace("DisconnectConnection (UI.Window.ConnectionTreeWindow) failed", ex); } } - - private static void SshTransferFile() + + //TODO Fix for TreeListView + private static void SshTransferFile() { try { @@ -832,8 +864,9 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace("SSHTransferFile (UI.Window.ConnectionTreeWindow) failed", ex); } } - - private void AddExternalApps() + + //TODO Fix for TreeListView + private void AddExternalApps() { try { @@ -866,8 +899,9 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace("cMenTreeTools_DropDownOpening failed (UI.Window.ConnectionTreeWindow)", ex); } } - - private static void StartExternalApp(Tools.ExternalTool externalTool) + + //TODO Fix for TreeListView + private static void StartExternalApp(Tools.ExternalTool externalTool) { try { @@ -884,11 +918,13 @@ namespace mRemoteNG.UI.Window #endregion #region Menu + //TODO Fix for TreeListView private void mMenViewExpandAllFolders_Click(object sender, EventArgs e) { ConnectionTree.ExpandAllNodes(); } + //TODO Fix for TreeListView private void mMenViewCollapseAllFolders_Click(object sender, EventArgs e) { if (tvConnections.SelectedNode != null) @@ -912,6 +948,7 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView private void txtSearch_LostFocus(object sender, EventArgs e) { if (txtSearch.Text == "") @@ -921,6 +958,7 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView private void txtSearch_KeyDown(object sender, KeyEventArgs e) { try @@ -949,17 +987,19 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView private void txtSearch_TextChanged(object sender, EventArgs e) { try { - //tvConnections.SelectedNode = ConnectionTree.Find(tvConnections.Nodes[0], txtSearch.Text); + tvConnections.SelectedNode = ConnectionTree.Find(tvConnections.Nodes[0], txtSearch.Text); } catch (Exception) { } } + //TODO Fix for TreeListView private void tvConnections_KeyPress(object sender, KeyPressEventArgs e) { try @@ -978,6 +1018,7 @@ namespace mRemoteNG.UI.Window } } + //TODO Fix for TreeListView private void tvConnections_KeyDown(object sender, KeyEventArgs e) { try From 10597aed2f4c895f940dd682e86d413b75f3250e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 12:38:06 -0600 Subject: [PATCH 049/338] Renamed the Name column --- .../UI/Window/ConnectionTreeWindow.Designer.cs | 17 ++++++++--------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 382a19660..f98e16208 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -46,7 +46,7 @@ namespace mRemoteNG.UI.Window { this.components = new System.ComponentModel.Container(); this.olvConnections = new BrightIdeasSoftware.TreeListView(); - this.olvColumn1 = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.olvNameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); this.cMenTree = new System.Windows.Forms.ContextMenuStrip(this.components); this.cMenTreeConnect = new System.Windows.Forms.ToolStripMenuItem(); this.cMenTreeConnectWithOptions = new System.Windows.Forms.ToolStripMenuItem(); @@ -98,7 +98,7 @@ namespace mRemoteNG.UI.Window // // olvConnections // - this.olvConnections.AllColumns.Add(this.olvColumn1); + this.olvConnections.AllColumns.Add(this.olvNameColumn); this.olvConnections.AllowDrop = true; this.olvConnections.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) @@ -106,7 +106,7 @@ namespace mRemoteNG.UI.Window this.olvConnections.BorderStyle = System.Windows.Forms.BorderStyle.None; this.olvConnections.CellEditUseWholeCell = false; this.olvConnections.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.olvColumn1}); + this.olvNameColumn}); this.olvConnections.ContextMenuStrip = this.cMenTree; this.olvConnections.Cursor = System.Windows.Forms.Cursors.Default; this.olvConnections.FullRowSelect = true; @@ -124,12 +124,11 @@ namespace mRemoteNG.UI.Window this.olvConnections.View = System.Windows.Forms.View.Details; this.olvConnections.VirtualMode = true; // - // olvColumn1 + // olvNameColumn // - this.olvColumn1.AspectName = "Name"; - this.olvColumn1.FillsFreeSpace = true; - this.olvColumn1.IsButton = true; - this.olvColumn1.Width = 200; + this.olvNameColumn.AspectName = "Name"; + this.olvNameColumn.FillsFreeSpace = true; + this.olvNameColumn.IsButton = true; // // cMenTree // @@ -541,6 +540,6 @@ namespace mRemoteNG.UI.Window #endregion private System.ComponentModel.IContainer components; - private BrightIdeasSoftware.OLVColumn olvColumn1; + private BrightIdeasSoftware.OLVColumn olvNameColumn; } } diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index b0155b578..32cd8123f 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -117,7 +117,7 @@ namespace mRemoteNG.UI.Window private void PopulateTreeView() { - olvColumn1.AspectGetter = item => ((ConnectionInfo) item).Name; + olvNameColumn.AspectGetter = item => ((ConnectionInfo) item).Name; olvConnections.CanExpandGetter = item => item is ContainerInfo; olvConnections.ChildrenGetter = item => ((ContainerInfo) item).Children; olvConnections.Roots = ConnectionTreeModel.RootNodes; From 15c894845c09516886475835efd127aa28dcbf1e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 12:58:27 -0600 Subject: [PATCH 050/338] Created function to expand the root node on load. Refactored some delegate code --- .../Window/ConnectionTreeWindow.Designer.cs | 2 ++ mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index f98e16208..ceac13f24 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -1,4 +1,6 @@ +using mRemoteNG.Connection; + namespace mRemoteNG.UI.Window { public partial class ConnectionTreeWindow : BaseWindow diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 32cd8123f..ec7fbdc13 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -6,6 +6,7 @@ using mRemoteNG.Messages; using mRemoteNG.Tree; using System; using System.Drawing; +using System.Linq; using System.Windows.Forms; using WeifenLuo.WinFormsUI.Docking; @@ -113,14 +114,26 @@ namespace mRemoteNG.UI.Window InitialDelay = 300, ReshowDelay = 0 }; + LinkModelToView(); } + private void LinkModelToView() + { + olvNameColumn.AspectGetter = item => ((ConnectionInfo)item).Name; + olvConnections.CanExpandGetter = item => item is ContainerInfo; + olvConnections.ChildrenGetter = item => ((ContainerInfo)item).Children; + } + private void PopulateTreeView() { - olvNameColumn.AspectGetter = item => ((ConnectionInfo) item).Name; - olvConnections.CanExpandGetter = item => item is ContainerInfo; - olvConnections.ChildrenGetter = item => ((ContainerInfo) item).Children; olvConnections.Roots = ConnectionTreeModel.RootNodes; + ExpandRootConnectionNode(); + } + + private void ExpandRootConnectionNode() + { + var rootConnectionNode = olvConnections.Roots.Cast().First(item => item.Name == "Connections"); + olvConnections.Expand(rootConnectionNode); } //TODO Fix for TreeListView From 4623853399ad3d6f7731a9536574af320390ac12 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 13:03:41 -0600 Subject: [PATCH 051/338] Rearranged some code --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 146 ++++++++++---------- 1 file changed, 72 insertions(+), 74 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index ec7fbdc13..cda2752d7 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -29,79 +29,6 @@ namespace mRemoteNG.UI.Window } } - #region Form Stuff - private void Tree_Load(object sender, EventArgs e) - { - ApplyLanguage(); - Themes.ThemeManager.ThemeChanged += ApplyTheme; - ApplyTheme(); - - txtSearch.Multiline = true; - txtSearch.MinimumSize = new Size(0, 14); - txtSearch.Size = new Size(txtSearch.Size.Width, 14); - txtSearch.Multiline = false; - } - - private void ApplyLanguage() - { - Text = Language.strConnections; - TabText = Language.strConnections; - - mMenAddConnection.ToolTipText = Language.strAddConnection; - mMenAddFolder.ToolTipText = Language.strAddFolder; - mMenView.ToolTipText = Language.strMenuView.Replace("&", ""); - mMenViewExpandAllFolders.Text = Language.strExpandAllFolders; - mMenViewCollapseAllFolders.Text = Language.strCollapseAllFolders; - mMenSortAscending.ToolTipText = Language.strSortAsc; - - cMenTreeConnect.Text = Language.strConnect; - cMenTreeConnectWithOptions.Text = Language.strConnectWithOptions; - cMenTreeConnectWithOptionsConnectToConsoleSession.Text = Language.strConnectToConsoleSession; - cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = Language.strDontConnectToConsoleSessionMenuItem; - cMenTreeConnectWithOptionsConnectInFullscreen.Text = Language.strConnectInFullscreen; - cMenTreeConnectWithOptionsNoCredentials.Text = Language.strConnectNoCredentials; - cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = Language.strChoosePanelBeforeConnecting; - cMenTreeDisconnect.Text = Language.strMenuDisconnect; - - cMenTreeToolsExternalApps.Text = Language.strMenuExternalTools; - cMenTreeToolsTransferFile.Text = Language.strMenuTransferFile; - - cMenTreeDuplicate.Text = Language.strDuplicate; - cMenTreeRename.Text = Language.strRename; - cMenTreeDelete.Text = Language.strMenuDelete; - - cMenTreeImport.Text = Language.strImportMenuItem; - cMenTreeImportFile.Text = Language.strImportFromFileMenuItem; - cMenTreeImportActiveDirectory.Text = Language.strImportAD; - cMenTreeImportPortScan.Text = Language.strImportPortScan; - cMenTreeExportFile.Text = Language.strExportToFileMenuItem; - - cMenTreeAddConnection.Text = Language.strAddConnection; - cMenTreeAddFolder.Text = Language.strAddFolder; - - cMenTreeToolsSort.Text = Language.strSort; - cMenTreeToolsSortAscending.Text = Language.strSortAsc; - cMenTreeToolsSortDescending.Text = Language.strSortDesc; - cMenTreeMoveUp.Text = Language.strMoveUp; - cMenTreeMoveDown.Text = Language.strMoveDown; - - txtSearch.Text = Language.strSearchPrompt; - } - - private void ApplyTheme() - { - msMain.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; - msMain.ForeColor = Themes.ThemeManager.ActiveTheme.ToolbarTextColor; - olvConnections.BackColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelBackgroundColor; - olvConnections.ForeColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTextColor; - //tvConnections.LineColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTreeLineColor; - BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; - txtSearch.BackColor = Themes.ThemeManager.ActiveTheme.SearchBoxBackgroundColor; - txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; - } - #endregion - - #region Public Methods public ConnectionTreeWindow(DockContent panel) { WindowType = WindowType.Tree; @@ -136,6 +63,78 @@ namespace mRemoteNG.UI.Window olvConnections.Expand(rootConnectionNode); } + #region Form Stuff + private void Tree_Load(object sender, EventArgs e) + { + ApplyLanguage(); + Themes.ThemeManager.ThemeChanged += ApplyTheme; + ApplyTheme(); + + txtSearch.Multiline = true; + txtSearch.MinimumSize = new Size(0, 14); + txtSearch.Size = new Size(txtSearch.Size.Width, 14); + txtSearch.Multiline = false; + } + + private void ApplyLanguage() + { + Text = Language.strConnections; + TabText = Language.strConnections; + + mMenAddConnection.ToolTipText = Language.strAddConnection; + mMenAddFolder.ToolTipText = Language.strAddFolder; + mMenView.ToolTipText = Language.strMenuView.Replace("&", ""); + mMenViewExpandAllFolders.Text = Language.strExpandAllFolders; + mMenViewCollapseAllFolders.Text = Language.strCollapseAllFolders; + mMenSortAscending.ToolTipText = Language.strSortAsc; + + cMenTreeConnect.Text = Language.strConnect; + cMenTreeConnectWithOptions.Text = Language.strConnectWithOptions; + cMenTreeConnectWithOptionsConnectToConsoleSession.Text = Language.strConnectToConsoleSession; + cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = Language.strDontConnectToConsoleSessionMenuItem; + cMenTreeConnectWithOptionsConnectInFullscreen.Text = Language.strConnectInFullscreen; + cMenTreeConnectWithOptionsNoCredentials.Text = Language.strConnectNoCredentials; + cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = Language.strChoosePanelBeforeConnecting; + cMenTreeDisconnect.Text = Language.strMenuDisconnect; + + cMenTreeToolsExternalApps.Text = Language.strMenuExternalTools; + cMenTreeToolsTransferFile.Text = Language.strMenuTransferFile; + + cMenTreeDuplicate.Text = Language.strDuplicate; + cMenTreeRename.Text = Language.strRename; + cMenTreeDelete.Text = Language.strMenuDelete; + + cMenTreeImport.Text = Language.strImportMenuItem; + cMenTreeImportFile.Text = Language.strImportFromFileMenuItem; + cMenTreeImportActiveDirectory.Text = Language.strImportAD; + cMenTreeImportPortScan.Text = Language.strImportPortScan; + cMenTreeExportFile.Text = Language.strExportToFileMenuItem; + + cMenTreeAddConnection.Text = Language.strAddConnection; + cMenTreeAddFolder.Text = Language.strAddFolder; + + cMenTreeToolsSort.Text = Language.strSort; + cMenTreeToolsSortAscending.Text = Language.strSortAsc; + cMenTreeToolsSortDescending.Text = Language.strSortDesc; + cMenTreeMoveUp.Text = Language.strMoveUp; + cMenTreeMoveDown.Text = Language.strMoveDown; + + txtSearch.Text = Language.strSearchPrompt; + } + + private void ApplyTheme() + { + msMain.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; + msMain.ForeColor = Themes.ThemeManager.ActiveTheme.ToolbarTextColor; + olvConnections.BackColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelBackgroundColor; + olvConnections.ForeColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTextColor; + //tvConnections.LineColor = Themes.ThemeManager.ActiveTheme.ConnectionsPanelTreeLineColor; + BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; + txtSearch.BackColor = Themes.ThemeManager.ActiveTheme.SearchBoxBackgroundColor; + txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; + } + #endregion + //TODO Fix for TreeListView public void ExpandPreviouslyOpenedFolders() { @@ -163,7 +162,6 @@ namespace mRemoteNG.UI.Window var rootNode = tvConnections.Nodes[0]; rootNode.EnsureVisible(); } - #endregion #region Private Methods //TODO Fix for TreeListView From 44a81cb7d82c534e4e21c8323b2001c3bf1df149 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 13:57:26 -0600 Subject: [PATCH 052/338] Fixed scheme issue in the data table serializer --- mRemoteV1/Config/Connections/DataTableSerializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/DataTableSerializer.cs b/mRemoteV1/Config/Connections/DataTableSerializer.cs index 8e7f4767e..a3b1efe1b 100644 --- a/mRemoteV1/Config/Connections/DataTableSerializer.cs +++ b/mRemoteV1/Config/Connections/DataTableSerializer.cs @@ -48,7 +48,7 @@ namespace mRemoteNG.Config.Connections _dataTable.Columns.Add("PositionID"); _dataTable.Columns.Add("LastChange"); _dataTable.Columns.Add("Expanded"); - _dataTable.Columns.Add("Descr"); + _dataTable.Columns.Add("Description"); _dataTable.Columns.Add("Icon"); _dataTable.Columns.Add("Panel"); _dataTable.Columns.Add("Username"); From 454f007e42ee26aa79af6169922605f856be1d12 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 13:59:10 -0600 Subject: [PATCH 053/338] Created helper function GetChildList in ConnectionTreeModel to retrieve a flat list of all connections/folders under a particular node --- .../Tree/ConnectionTreeModelTests.cs | 40 +++++++++++++++++++ mRemoteNGTests/mRemoteNGTests.csproj | 2 + mRemoteV1/Tree/ConnectionTreeModel.cs | 15 +++++++ 3 files changed, 57 insertions(+) create mode 100644 mRemoteNGTests/Tree/ConnectionTreeModelTests.cs diff --git a/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs b/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs new file mode 100644 index 000000000..76d475fea --- /dev/null +++ b/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs @@ -0,0 +1,40 @@ +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using NUnit.Framework; + + +namespace mRemoteNGTests.Tree +{ + public class ConnectionTreeModelTests + { + private ConnectionTreeModel _connectionTreeModel; + + [SetUp] + public void Setup() + { + _connectionTreeModel = new ConnectionTreeModel(); + } + + [TearDown] + public void Teardown() + { + _connectionTreeModel = null; + } + + [Test] + public void GetChildListProvidesAllChildren() + { + var root = new ContainerInfo(); + var folder1 = new ContainerInfo(); + var folder2 = new ContainerInfo(); + var con1 = new ConnectionInfo(); + root.Add(folder1); + folder1.Add(folder2); + root.Add(con1); + _connectionTreeModel.AddRootNode(root); + var connectionList = _connectionTreeModel.GetChildList(root); + Assert.That(connectionList, Is.EquivalentTo(new[] {folder1,folder2,con1})); + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index fae75f179..6be6d5494 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -104,6 +104,7 @@ + @@ -157,6 +158,7 @@ + diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index aa669b4a8..41aa72d4a 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.Linq; +using mRemoteNG.Connection; using mRemoteNG.Container; @@ -12,5 +14,18 @@ namespace mRemoteNG.Tree { RootNodes.Add(rootNode); } + + public IEnumerable GetChildList(ContainerInfo container) + { + var childList = new List(); + foreach (var child in container.Children) + { + childList.Add(child); + var childContainer = child as ContainerInfo; + if (childContainer != null) + childList.AddRange(GetChildList(childContainer)); + } + return childList; + } } } \ No newline at end of file From c2b32de533ea37c7c233da3e70f08ad7293f87bc Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 14:11:40 -0600 Subject: [PATCH 054/338] Added support for expanding all previously expanded nodes --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 23 +++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index cda2752d7..c4121a9c1 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -8,6 +8,7 @@ using System; using System.Drawing; using System.Linq; using System.Windows.Forms; +using mRemoteNG.Tree.Root; using WeifenLuo.WinFormsUI.Docking; @@ -54,15 +55,21 @@ namespace mRemoteNG.UI.Window private void PopulateTreeView() { olvConnections.Roots = ConnectionTreeModel.RootNodes; - ExpandRootConnectionNode(); - } + ExpandPreviouslyOpenedFolders(); + ExpandRootConnectionNode(); + } private void ExpandRootConnectionNode() { - var rootConnectionNode = olvConnections.Roots.Cast().First(item => item.Name == "Connections"); + var rootConnectionNode = GetRootConnectionNode(); olvConnections.Expand(rootConnectionNode); } + private RootNodeInfo GetRootConnectionNode() + { + return (RootNodeInfo)olvConnections.Roots.Cast().First(item => item is RootNodeInfo); + } + #region Form Stuff private void Tree_Load(object sender, EventArgs e) { @@ -135,14 +142,12 @@ namespace mRemoteNG.UI.Window } #endregion - //TODO Fix for TreeListView public void ExpandPreviouslyOpenedFolders() { - foreach (ContainerInfo contI in Runtime.ContainerList) - { - if (contI.IsExpanded) - contI.TreeNode.Expand(); - } + var containerList = ConnectionTreeModel.GetChildList(GetRootConnectionNode()).OfType(); + var previouslyExpandedNodes = containerList.Where(container => container.IsExpanded); + olvConnections.ExpandedObjects = previouslyExpandedNodes; + olvConnections.RebuildAll(true); } //TODO Fix for TreeListView From 6e565c0b313d10604e5e992deb1de7be20ee98ad Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 14:41:59 -0600 Subject: [PATCH 055/338] Fixed support for saving tree node expansion --- mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs | 2 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs index f202d7385..429274e50 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs @@ -143,7 +143,7 @@ namespace mRemoteNG.Config.Connections _xmlTextWriter.WriteStartElement("Node"); _xmlTextWriter.WriteAttributeString("Name", "", containerInfo.Name); _xmlTextWriter.WriteAttributeString("Type", "", ConnectionTreeNode.GetNodeType(containerInfo.TreeNode).ToString()); - _xmlTextWriter.WriteAttributeString("Expanded", "", containerInfo.TreeNode.IsExpanded.ToString()); + _xmlTextWriter.WriteAttributeString("Expanded", "", containerInfo.IsExpanded.ToString()); SaveConnectionFields(containerInfo); } diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index c4121a9c1..1294e1346 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -43,6 +43,7 @@ namespace mRemoteNG.UI.Window ReshowDelay = 0 }; LinkModelToView(); + SetEventHandlers(); } private void LinkModelToView() @@ -52,6 +53,12 @@ namespace mRemoteNG.UI.Window olvConnections.ChildrenGetter = item => ((ContainerInfo)item).Children; } + private void SetEventHandlers() + { + olvConnections.Collapsed += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = false; + olvConnections.Expanded += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = true; + } + private void PopulateTreeView() { olvConnections.Roots = ConnectionTreeModel.RootNodes; From bec154e538de4b7ebe909073b9d53efadbca2c98 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 14:48:53 -0600 Subject: [PATCH 056/338] Resolved issue serializing the connection tree node types (connect/container) --- mRemoteV1/App/Runtime.cs | 1 - mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs | 4 ++-- mRemoteV1/Connection/ConnectionInfo.cs | 8 +++++++- mRemoteV1/Connection/PuttySessionInfo.cs | 9 +++++++-- mRemoteV1/Container/ContainerInfo.cs | 6 ++++++ mRemoteV1/Tree/ConnectionTreeModel.cs | 1 - mRemoteV1/Tree/Root/PuttySessionsNodeInfo.cs | 6 ++++++ mRemoteV1/Tree/Root/RootNodeInfo.cs | 8 ++++++-- 8 files changed, 34 insertions(+), 9 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 2bc61fa69..56590c425 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -506,7 +506,6 @@ namespace mRemoteNG.App connectionsSaver.ContainerList = ContainerList; connectionsSaver.Export = false; connectionsSaver.SaveSecurity = new Security.Save(false); - connectionsSaver.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; connectionsSaver.ConnectionTreeModel = ConnectionTreeModel; if (Settings.Default.UseSQLServer) diff --git a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs index 429274e50..e50b97695 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs @@ -142,7 +142,7 @@ namespace mRemoteNG.Config.Connections { _xmlTextWriter.WriteStartElement("Node"); _xmlTextWriter.WriteAttributeString("Name", "", containerInfo.Name); - _xmlTextWriter.WriteAttributeString("Type", "", ConnectionTreeNode.GetNodeType(containerInfo.TreeNode).ToString()); + _xmlTextWriter.WriteAttributeString("Type", "", containerInfo.GetTreeNodeType().ToString()); _xmlTextWriter.WriteAttributeString("Expanded", "", containerInfo.IsExpanded.ToString()); SaveConnectionFields(containerInfo); } @@ -151,7 +151,7 @@ namespace mRemoteNG.Config.Connections { _xmlTextWriter.WriteStartElement("Node"); _xmlTextWriter.WriteAttributeString("Name", "", connectionInfo.Name); - _xmlTextWriter.WriteAttributeString("Type", "", ConnectionTreeNode.GetNodeType(connectionInfo.TreeNode).ToString()); + _xmlTextWriter.WriteAttributeString("Type", "", connectionInfo.GetTreeNodeType().ToString()); SaveConnectionFields(connectionInfo); } diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index 5526a2814..b76e8aac0 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -17,6 +17,7 @@ using mRemoteNG.Connection.Protocol.Rlogin; using mRemoteNG.Container; using mRemoteNG.Connection.Protocol; using mRemoteNG.Messages; +using mRemoteNG.Tree; namespace mRemoteNG.Connection @@ -683,7 +684,12 @@ namespace mRemoteNG.Connection property.SetValue(this, remotePropertyValue, null); } } - + + public virtual TreeNodeType GetTreeNodeType() + { + return TreeNodeType.Connection; + } + public void SetDefaults() { if (Port == 0) diff --git a/mRemoteV1/Connection/PuttySessionInfo.cs b/mRemoteV1/Connection/PuttySessionInfo.cs index 4e9c15331..69e095c89 100644 --- a/mRemoteV1/Connection/PuttySessionInfo.cs +++ b/mRemoteV1/Connection/PuttySessionInfo.cs @@ -5,6 +5,7 @@ using System; using System.ComponentModel; using mRemoteNG.Connection.Protocol; using mRemoteNG.Root.PuttySessions; +using mRemoteNG.Tree; namespace mRemoteNG.Connection @@ -89,8 +90,12 @@ namespace mRemoteNG.Connection Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strErrorCouldNotLaunchPutty + Environment.NewLine + ex.Message); } } - - + + public override TreeNodeType GetTreeNodeType() + { + return TreeNodeType.PuttySession; + } + #region IComponent [Browsable(false)] public ISite Site diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index ef19ea43a..31b0b4511 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using mRemoteNG.Connection; using System.ComponentModel; +using mRemoteNG.Tree; namespace mRemoteNG.Container { @@ -19,6 +20,11 @@ namespace mRemoteNG.Container IsContainer = true; } + public override TreeNodeType GetTreeNodeType() + { + return TreeNodeType.Container; + } + public void Add(ConnectionInfo newChildItem) { newChildItem.Parent = this; diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index 41aa72d4a..5ac94e6d3 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using mRemoteNG.Connection; using mRemoteNG.Container; diff --git a/mRemoteV1/Tree/Root/PuttySessionsNodeInfo.cs b/mRemoteV1/Tree/Root/PuttySessionsNodeInfo.cs index 656c365fb..ab5b097ed 100644 --- a/mRemoteV1/Tree/Root/PuttySessionsNodeInfo.cs +++ b/mRemoteV1/Tree/Root/PuttySessionsNodeInfo.cs @@ -2,6 +2,7 @@ using mRemoteNG.My; using mRemoteNG.Tools; using mRemoteNG.Tree.Root; using System.Windows.Forms; +using mRemoteNG.Tree; namespace mRemoteNG.Root.PuttySessions @@ -54,6 +55,11 @@ namespace mRemoteNG.Root.PuttySessions mRemoteNG.Settings.Default.PuttySavedSessionsPanel = value; } } + + public override TreeNodeType GetTreeNodeType() + { + return TreeNodeType.PuttyRoot; + } #endregion } } \ No newline at end of file diff --git a/mRemoteV1/Tree/Root/RootNodeInfo.cs b/mRemoteV1/Tree/Root/RootNodeInfo.cs index fff203583..de15554fd 100644 --- a/mRemoteV1/Tree/Root/RootNodeInfo.cs +++ b/mRemoteV1/Tree/Root/RootNodeInfo.cs @@ -1,6 +1,5 @@ using mRemoteNG.Tools; using System.ComponentModel; -using System.Windows.Forms; using mRemoteNG.Container; @@ -53,6 +52,11 @@ namespace mRemoteNG.Tree.Root [Browsable(false)] public RootNodeType Type {get; set;} + + public override TreeNodeType GetTreeNodeType() + { + return TreeNodeType.Root; + } #endregion - } + } } \ No newline at end of file From 617ec4cc3e708318165c21b8305e1b974943d3bb Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 14:55:19 -0600 Subject: [PATCH 057/338] Moved the code for generating a recursive list of children to ContainerInfo where it makes more sense. Left a helper function in ConnectionTreeModel where it may still be useful --- .../Tree/ConnectionTreeModelTests.cs | 2 +- mRemoteV1/Container/ContainerInfo.cs | 28 ++++++++++++++++++- mRemoteV1/Tree/ConnectionTreeModel.cs | 12 ++------ mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs b/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs index 76d475fea..f8d0d1689 100644 --- a/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs +++ b/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs @@ -33,7 +33,7 @@ namespace mRemoteNGTests.Tree folder1.Add(folder2); root.Add(con1); _connectionTreeModel.AddRootNode(root); - var connectionList = _connectionTreeModel.GetChildList(root); + var connectionList = _connectionTreeModel.GetRecursiveChildList(root); Assert.That(connectionList, Is.EquivalentTo(new[] {folder1,folder2,con1})); } } diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 31b0b4511..e7ae83b39 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -62,5 +62,31 @@ namespace mRemoteNG.Container { IsExpanded = true; } - } + + public IEnumerable GetRecursiveChildList() + { + var childList = new List(); + foreach (var child in Children) + { + childList.Add(child); + var childContainer = child as ContainerInfo; + if (childContainer != null) + childList.AddRange(GetRecursiveChildList(childContainer)); + } + return childList; + } + + private IEnumerable GetRecursiveChildList(ContainerInfo container) + { + var childList = new List(); + foreach (var child in container.Children) + { + childList.Add(child); + var childContainer = child as ContainerInfo; + if (childContainer != null) + childList.AddRange(GetRecursiveChildList(childContainer)); + } + return childList; + } + } } \ No newline at end of file diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index 5ac94e6d3..fc4562fd6 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -14,17 +14,9 @@ namespace mRemoteNG.Tree RootNodes.Add(rootNode); } - public IEnumerable GetChildList(ContainerInfo container) + public IEnumerable GetRecursiveChildList(ContainerInfo container) { - var childList = new List(); - foreach (var child in container.Children) - { - childList.Add(child); - var childContainer = child as ContainerInfo; - if (childContainer != null) - childList.AddRange(GetChildList(childContainer)); - } - return childList; + return container.GetRecursiveChildList(); } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 1294e1346..ad9550135 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -151,7 +151,7 @@ namespace mRemoteNG.UI.Window public void ExpandPreviouslyOpenedFolders() { - var containerList = ConnectionTreeModel.GetChildList(GetRootConnectionNode()).OfType(); + var containerList = ConnectionTreeModel.GetRecursiveChildList(GetRootConnectionNode()).OfType(); var previouslyExpandedNodes = containerList.Where(container => container.IsExpanded); olvConnections.ExpandedObjects = previouslyExpandedNodes; olvConnections.RebuildAll(true); From 64ed15ffaea3719df9c4f66d053d5e1b0765451e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 15:28:38 -0600 Subject: [PATCH 058/338] Got the tree node images working with the new TreeListView --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 57 +++++++++++++-------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index ad9550135..ee0bd49e1 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -35,24 +35,56 @@ namespace mRemoteNG.UI.Window WindowType = WindowType.Tree; DockPnl = panel; InitializeComponent(); - FillImageList(); - DescriptionTooltip = new ToolTip { InitialDelay = 300, ReshowDelay = 0 }; - LinkModelToView(); + + FillImageList(); + LinkModelToView(); SetEventHandlers(); } - private void LinkModelToView() + private void FillImageList() + { + try + { + imgListTree.Images.Add(Resources.Root); + imgListTree.Images.SetKeyName(0, "Root"); + imgListTree.Images.Add(Resources.Folder); + imgListTree.Images.SetKeyName(1, "Folder"); + imgListTree.Images.Add(Resources.Play); + imgListTree.Images.SetKeyName(2, "Play"); + imgListTree.Images.Add(Resources.Pause); + imgListTree.Images.SetKeyName(3, "Pause"); + imgListTree.Images.Add(Resources.PuttySessions); + imgListTree.Images.SetKeyName(4, "PuttySessions"); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace("FillImageList (UI.Window.ConnectionTreeWindow) failed", ex); + } + } + + private void LinkModelToView() { olvNameColumn.AspectGetter = item => ((ConnectionInfo)item).Name; + olvNameColumn.ImageGetter = ConnectionImageGetter; olvConnections.CanExpandGetter = item => item is ContainerInfo; olvConnections.ChildrenGetter = item => ((ContainerInfo)item).Children; } + private object ConnectionImageGetter(object rowObject) + { + if (rowObject is RootNodeInfo) return "Root"; + if (rowObject is ContainerInfo) return "Folder"; + if (rowObject is PuttySessionInfo) return "PuttySessions"; + var connection = rowObject as ConnectionInfo; + if (connection == null) return ""; + return connection.OpenConnections.Count > 0 ? "Play" : "Pause"; + } + private void SetEventHandlers() { olvConnections.Collapsed += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = false; @@ -176,23 +208,6 @@ namespace mRemoteNG.UI.Window } #region Private Methods - //TODO Fix for TreeListView - private void FillImageList() - { - try - { - imgListTree.Images.Add(Resources.Root); - imgListTree.Images.Add(Resources.Folder); - imgListTree.Images.Add(Resources.Play); - imgListTree.Images.Add(Resources.Pause); - imgListTree.Images.Add(Resources.PuttySessions); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("FillImageList (UI.Window.ConnectionTreeWindow) failed", ex); - } - } - //TODO Fix for TreeListView private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) { From 40347c09ba602ecd7451862162db23d29d69ee20 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 15:28:56 -0600 Subject: [PATCH 059/338] minor update --- mRemoteV1/Tree/ConnectionTreeNode.cs | 1 + mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index a90b040fe..230adf858 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -11,6 +11,7 @@ namespace mRemoteNG.Tree { public static class ConnectionTreeNode { + //TODO Everything in this class needs to be updated / rewritten to work with the TreeListView/ConnectionTreeModel #region Public Methods public static string GetConstantID(TreeNode node) { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index ceac13f24..8af95cd09 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -1,5 +1,4 @@ -using mRemoteNG.Connection; namespace mRemoteNG.UI.Window { From 9cf3c23328878e6080aaf69bc918a8756eb7db32 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 16:37:39 -0600 Subject: [PATCH 060/338] Disabled full row select to be more in line with previous functionality --- mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 8af95cd09..7cb62c53f 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -110,7 +110,6 @@ namespace mRemoteNG.UI.Window this.olvNameColumn}); this.olvConnections.ContextMenuStrip = this.cMenTree; this.olvConnections.Cursor = System.Windows.Forms.Cursors.Default; - this.olvConnections.FullRowSelect = true; this.olvConnections.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; this.olvConnections.HideSelection = false; this.olvConnections.LabelEdit = true; From 8a74809ea47f7501795c2c34f12880680e13ee29 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 18:05:46 -0600 Subject: [PATCH 061/338] Fixed opening previous connections to work with the tree list view --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index ee0bd49e1..907692738 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -96,7 +96,8 @@ namespace mRemoteNG.UI.Window olvConnections.Roots = ConnectionTreeModel.RootNodes; ExpandPreviouslyOpenedFolders(); ExpandRootConnectionNode(); - } + OpenConnectionsFromLastSession(); + } private void ExpandRootConnectionNode() { @@ -189,14 +190,14 @@ namespace mRemoteNG.UI.Window olvConnections.RebuildAll(true); } - //TODO Fix for TreeListView public void OpenConnectionsFromLastSession() { if (!Settings.Default.OpenConsFromLastSession || Settings.Default.NoReconnect) return; - foreach (ConnectionInfo conI in Runtime.ConnectionList) + var connectionInfoList = GetRootConnectionNode().GetRecursiveChildList().Where(node => !(node is ContainerInfo)); + var previouslyOpenedConnections = connectionInfoList.Where(item => item.PleaseConnect); + foreach (var connectionInfo in previouslyOpenedConnections) { - if (conI.PleaseConnect) - Runtime.OpenConnection(conI); + Runtime.OpenConnection(connectionInfo); } } From e70e8262e661c0663e81cdd3b4f14d785d71d17f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 18:08:17 -0600 Subject: [PATCH 062/338] EnsureRootNodeVisible now works --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 907692738..0ffc9770f 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -201,11 +201,9 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView public void EnsureRootNodeVisible() { - var rootNode = tvConnections.Nodes[0]; - rootNode.EnsureVisible(); + olvConnections.EnsureModelVisible(GetRootConnectionNode()); } #region Private Methods From 73627a680c919821839b9d95916f3a38cd719ba0 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 6 Sep 2016 18:56:28 -0600 Subject: [PATCH 063/338] AfterSelect event working again --- .../Config/Putty/Config.Putty.Provider.cs | 8 +- .../Config/Putty/Config.Putty.Sessions.cs | 2 +- mRemoteV1/Connection/PuttySessionInfo.cs | 4 +- mRemoteV1/Tree/ConnectionTreeNode.cs | 2 +- ...deInfo.cs => RootPuttySessionsNodeInfo.cs} | 4 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 223 ++++++++---------- mRemoteV1/mRemoteV1.csproj | 2 +- 7 files changed, 107 insertions(+), 138 deletions(-) rename mRemoteV1/Tree/Root/{PuttySessionsNodeInfo.cs => RootPuttySessionsNodeInfo.cs} (91%) diff --git a/mRemoteV1/Config/Putty/Config.Putty.Provider.cs b/mRemoteV1/Config/Putty/Config.Putty.Provider.cs index a3eb9ea56..78bd98f17 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.Provider.cs +++ b/mRemoteV1/Config/Putty/Config.Putty.Provider.cs @@ -23,8 +23,8 @@ namespace mRemoteNG.Config.Putty } } - private Root.PuttySessions.PuttySessionsNodeInfo _rootInfo; - public Root.PuttySessions.PuttySessionsNodeInfo RootInfo + private Root.PuttySessions.RootPuttySessionsNodeInfo _rootInfo; + public Root.PuttySessions.RootPuttySessionsNodeInfo RootInfo { get { @@ -115,9 +115,9 @@ namespace mRemoteNG.Config.Putty return newTreeNode; } - protected virtual Root.PuttySessions.PuttySessionsNodeInfo CreateRootInfo() + protected virtual Root.PuttySessions.RootPuttySessionsNodeInfo CreateRootInfo() { - Root.PuttySessions.PuttySessionsNodeInfo newRootInfo = new Root.PuttySessions.PuttySessionsNodeInfo(); + Root.PuttySessions.RootPuttySessionsNodeInfo newRootInfo = new Root.PuttySessions.RootPuttySessionsNodeInfo(); if (string.IsNullOrEmpty(Convert.ToString(mRemoteNG.Settings.Default.PuttySavedSessionsName))) { diff --git a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs b/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs index 63fdac7dc..45307fd76 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs +++ b/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs @@ -75,7 +75,7 @@ namespace mRemoteNG.Config.Putty isNewNode = true; } - sessionInfo.RootPuttySessionsInfo = provider.RootInfo; + sessionInfo.RootRootPuttySessionsInfo = provider.RootInfo; sessionInfo.TreeNode = treeNode; //sessionInfo.IInheritable.TurnOffInheritanceCompletely(); diff --git a/mRemoteV1/Connection/PuttySessionInfo.cs b/mRemoteV1/Connection/PuttySessionInfo.cs index 69e095c89..b3720d0f0 100644 --- a/mRemoteV1/Connection/PuttySessionInfo.cs +++ b/mRemoteV1/Connection/PuttySessionInfo.cs @@ -14,7 +14,7 @@ namespace mRemoteNG.Connection { #region Properties [Browsable(false)] - public PuttySessionsNodeInfo RootPuttySessionsInfo { get; set; } + public RootPuttySessionsNodeInfo RootRootPuttySessionsInfo { get; set; } [ReadOnly(true)] public override string PuttySession { get; set; } @@ -35,7 +35,7 @@ namespace mRemoteNG.Connection [ReadOnly(true), Browsable(false)] public override string Panel { - get { return RootPuttySessionsInfo.Panel; } + get { return RootRootPuttySessionsInfo.Panel; } set { } } diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 230adf858..ea26a183f 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -60,7 +60,7 @@ namespace mRemoteNG.Tree if (treeNode?.Tag == null) return TreeNodeType.None; - if (treeNode.Tag is PuttySessionsNodeInfo) + if (treeNode.Tag is RootPuttySessionsNodeInfo) return TreeNodeType.PuttyRoot; if (treeNode.Tag is RootNodeInfo) return TreeNodeType.Root; diff --git a/mRemoteV1/Tree/Root/PuttySessionsNodeInfo.cs b/mRemoteV1/Tree/Root/RootPuttySessionsNodeInfo.cs similarity index 91% rename from mRemoteV1/Tree/Root/PuttySessionsNodeInfo.cs rename to mRemoteV1/Tree/Root/RootPuttySessionsNodeInfo.cs index ab5b097ed..60245ec7f 100644 --- a/mRemoteV1/Tree/Root/PuttySessionsNodeInfo.cs +++ b/mRemoteV1/Tree/Root/RootPuttySessionsNodeInfo.cs @@ -7,13 +7,13 @@ using mRemoteNG.Tree; namespace mRemoteNG.Root.PuttySessions { - public class PuttySessionsNodeInfo : RootNodeInfo + public class RootPuttySessionsNodeInfo : RootNodeInfo { private string _name; private string _panel; - public PuttySessionsNodeInfo() : base(RootNodeType.PuttySessions) + public RootPuttySessionsNodeInfo() : base(RootNodeType.PuttySessions) { _name = Language.strPuttySavedSessionsRootName; _panel = Language.strGeneral; diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 0ffc9770f..84c7b13f3 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -8,6 +8,7 @@ using System; using System.Drawing; using System.Linq; using System.Windows.Forms; +using mRemoteNG.Root.PuttySessions; using mRemoteNG.Tree.Root; using WeifenLuo.WinFormsUI.Docking; @@ -89,7 +90,11 @@ namespace mRemoteNG.UI.Window { olvConnections.Collapsed += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = false; olvConnections.Expanded += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = true; - } + //olvConnections.BeforeLabelEdit += tvConnections_BeforeLabelEdit; + //olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; + olvConnections.SelectionChanged += tvConnections_AfterSelect; + + } private void PopulateTreeView() { @@ -234,35 +239,17 @@ namespace mRemoteNG.UI.Window //TODO Fix for TreeListView private void tvConnections_AfterSelect(object sender, EventArgs e) { - //try - //{ - // if ((ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection) || (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttySession)) - // { - // Windows.configForm.SetPropertyGridObject(e.Node.Tag); - // } - // else if (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Container) - // { - // Windows.configForm.SetPropertyGridObject((ContainerInfo) e.Node.Tag); - // } - // else if ((ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Root) || (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttyRoot)) - // { - // Windows.configForm.SetPropertyGridObject(e.Node.Tag); - // } - // else - // { - // return; - // } - - // Windows.configForm.pGrid_SelectedObjectChanged(); - // ShowHideTreeContextMenuItems(e.Node); - - // Runtime.LastSelected = ConnectionTreeNode.GetConstantID(e.Node); - //} - //catch (Exception ex) - //{ - // Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_AfterSelect (UI.Window.ConnectionTreeWindow) failed", ex); - //} - } + try + { + Windows.configForm.SetPropertyGridObject(olvConnections.SelectedObject); + ShowHideTreeContextMenuItems((ConnectionInfo)olvConnections.SelectedObject); + Runtime.LastSelected = ((ConnectionInfo)olvConnections.SelectedObject)?.ConstantID; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_AfterSelect (UI.Window.ConnectionTreeWindow) failed", ex); + } + } //TODO Fix for TreeListView private void tvConnections_NodeMouseClick(object sender, MouseEventArgs e) @@ -335,57 +322,81 @@ namespace mRemoteNG.UI.Window } //TODO Fix for TreeListView - private void ShowHideTreeContextMenuItems(TreeNode selectedNode) + private void ShowHideTreeContextMenuItems(ConnectionInfo connectionInfo) { - if (selectedNode == null) - { + if (connectionInfo == null) return ; - } try { cMenTree.Enabled = true; EnableMenuItemsRecursive(cMenTree.Items); - - if (ConnectionTreeNode.GetNodeType(selectedNode) == TreeNodeType.Connection) + if (connectionInfo is RootPuttySessionsNodeInfo) + { + cMenTreeAddConnection.Enabled = false; + cMenTreeAddFolder.Enabled = false; + cMenTreeConnect.Enabled = false; + cMenTreeConnectWithOptions.Enabled = false; + cMenTreeDisconnect.Enabled = false; + cMenTreeToolsTransferFile.Enabled = false; + cMenTreeConnectWithOptions.Enabled = false; + cMenTreeToolsSort.Enabled = false; + cMenTreeToolsExternalApps.Enabled = false; + cMenTreeDuplicate.Enabled = false; + cMenTreeRename.Enabled = true; + cMenTreeDelete.Enabled = false; + cMenTreeMoveUp.Enabled = false; + cMenTreeMoveDown.Enabled = false; + } + else if (connectionInfo is RootNodeInfo) + { + cMenTreeConnect.Enabled = false; + cMenTreeConnectWithOptions.Enabled = false; + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = false; + cMenTreeDisconnect.Enabled = false; + cMenTreeToolsTransferFile.Enabled = false; + cMenTreeToolsExternalApps.Enabled = false; + cMenTreeDuplicate.Enabled = false; + cMenTreeDelete.Enabled = false; + cMenTreeMoveUp.Enabled = false; + cMenTreeMoveDown.Enabled = false; + } + else if (connectionInfo is ContainerInfo) + { + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + cMenTreeDisconnect.Enabled = false; + + var openConnections = 0; + //foreach (TreeNode node in selectedNode.Nodes) + //{ + // if (node.Tag is ConnectionInfo) + // { + // var connectionInfo = (ConnectionInfo)node.Tag; + // openConnections = openConnections + connectionInfo.OpenConnections.Count; + // } + //} + if (openConnections == 0) + { + cMenTreeDisconnect.Enabled = false; + } + + cMenTreeToolsTransferFile.Enabled = false; + cMenTreeToolsExternalApps.Enabled = false; + } + else if (connectionInfo is PuttySessionInfo) { - ConnectionInfo connectionInfo = (ConnectionInfo)selectedNode.Tag; + cMenTreeAddConnection.Enabled = false; + cMenTreeAddFolder.Enabled = false; if (connectionInfo.OpenConnections.Count == 0) { cMenTreeDisconnect.Enabled = false; } - if (!(connectionInfo.Protocol == ProtocolType.SSH1 | - connectionInfo.Protocol == ProtocolType.SSH2)) - { - cMenTreeToolsTransferFile.Enabled = false; - } - - if (!(connectionInfo.Protocol == ProtocolType.RDP | connectionInfo.Protocol == ProtocolType.ICA)) - { - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - } - - if (connectionInfo.Protocol == ProtocolType.IntApp) - { - cMenTreeConnectWithOptionsNoCredentials.Enabled = false; - } - } - else if (ConnectionTreeNode.GetNodeType(selectedNode) == TreeNodeType.PuttySession) - { - PuttySessionInfo puttySessionInfo = (PuttySessionInfo)selectedNode.Tag; - - cMenTreeAddConnection.Enabled = false; - cMenTreeAddFolder.Enabled = false; - - if (puttySessionInfo.OpenConnections.Count == 0) - { - cMenTreeDisconnect.Enabled = false; - } - - if (!(puttySessionInfo.Protocol == ProtocolType.SSH1 | puttySessionInfo.Protocol == ProtocolType.SSH2)) + if (!(connectionInfo.Protocol == ProtocolType.SSH1 | connectionInfo.Protocol == ProtocolType.SSH2)) { cMenTreeToolsTransferFile.Enabled = false; } @@ -399,65 +410,23 @@ namespace mRemoteNG.UI.Window cMenTreeMoveUp.Enabled = false; cMenTreeMoveDown.Enabled = false; } - else if (ConnectionTreeNode.GetNodeType(selectedNode) == TreeNodeType.Container) - { - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - cMenTreeDisconnect.Enabled = false; - - int openConnections = 0; - foreach (TreeNode node in selectedNode.Nodes) - { - if (node.Tag is ConnectionInfo) - { - var connectionInfo = (ConnectionInfo)node.Tag; - openConnections = openConnections + connectionInfo.OpenConnections.Count; - } - } - if (openConnections == 0) - { - cMenTreeDisconnect.Enabled = false; - } - - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - } - else if (ConnectionTreeNode.GetNodeType(selectedNode) == TreeNodeType.Root) - { - cMenTreeConnect.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = false; - cMenTreeDisconnect.Enabled = false; - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - cMenTreeDuplicate.Enabled = false; - cMenTreeDelete.Enabled = false; - cMenTreeMoveUp.Enabled = false; - cMenTreeMoveDown.Enabled = false; - } - else if (ConnectionTreeNode.GetNodeType(selectedNode) == TreeNodeType.PuttyRoot) - { - cMenTreeAddConnection.Enabled = false; - cMenTreeAddFolder.Enabled = false; - cMenTreeConnect.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeDisconnect.Enabled = false; - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeToolsSort.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - cMenTreeDuplicate.Enabled = false; - cMenTreeRename.Enabled = true; - cMenTreeDelete.Enabled = false; - cMenTreeMoveUp.Enabled = false; - cMenTreeMoveDown.Enabled = false; - } - else - { - cMenTree.Enabled = false; - } + else + { + if (connectionInfo.OpenConnections.Count == 0) + cMenTreeDisconnect.Enabled = false; + + if (!(connectionInfo.Protocol == ProtocolType.SSH1 | connectionInfo.Protocol == ProtocolType.SSH2)) + cMenTreeToolsTransferFile.Enabled = false; + + if (!(connectionInfo.Protocol == ProtocolType.RDP | connectionInfo.Protocol == ProtocolType.ICA)) + { + cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + } + + if (connectionInfo.Protocol == ProtocolType.IntApp) + cMenTreeConnectWithOptionsNoCredentials.Enabled = false; + } } catch (Exception ex) { @@ -542,7 +511,7 @@ namespace mRemoteNG.UI.Window while (targetNode != null) { - var puttyRootInfo = targetNode.Tag as Root.PuttySessions.PuttySessionsNodeInfo; + var puttyRootInfo = targetNode.Tag as Root.PuttySessions.RootPuttySessionsNodeInfo; if (puttyRootInfo != null || targetNode == dropNode) { e.Effect = DragDropEffects.None; diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 29eb82361..a8e05fa11 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -285,7 +285,7 @@ - + From 22c21222d3cb0a68aa2becd480b61d3a7dd2eebd Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 07:34:40 -0600 Subject: [PATCH 064/338] Added more TODO notes for functionality that needs to be fixed for the treelistview change --- mRemoteV1/Tree/ConnectionTree.cs | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index 23dd91d31..a59f37953 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -28,6 +28,7 @@ namespace mRemoteNG.Tree } } + //TODO Fix for TreeListView public static void DeleteSelectedNode() { try @@ -69,6 +70,7 @@ namespace mRemoteNG.Tree } } + //TODO Fix for TreeListView private static bool SelectedNodeIsAValidDeletionTarget() { bool validDeletionTarget = true; @@ -82,55 +84,64 @@ namespace mRemoteNG.Tree return validDeletionTarget; } + //TODO Fix for TreeListView private static bool UserConfirmsEmptyFolderDeletion() { string messagePrompt = string.Format(Language.strConfirmDeleteNodeFolder, SelectedNode.Text); return PromptUser(messagePrompt); } + //TODO Fix for TreeListView private static bool UserConfirmsNonEmptyFolderDeletion() { string messagePrompt = string.Format(Language.strConfirmDeleteNodeFolderNotEmpty, SelectedNode.Text); return PromptUser(messagePrompt); } + //TODO Fix for TreeListView private static bool UserConfirmsConnectionDeletion() { string messagePrompt = string.Format(Language.strConfirmDeleteNodeConnection, SelectedNode.Text); return PromptUser(messagePrompt); } + //TODO Fix for TreeListView private static bool PromptUser(string PromptMessage) { DialogResult msgBoxResponse = MessageBox.Show(PromptMessage, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question); return (msgBoxResponse == DialogResult.Yes); } + //TODO Fix for TreeListView public static void StartRenameSelectedNode() { SelectedNode?.BeginEdit(); } + //TODO Fix for TreeListView public static void FinishRenameSelectedNode(string newName) { FinishRenameSelectedConnectionNode(newName); FinishRenameSelectedContainerNode(newName); } + //TODO Fix for TreeListView private static void FinishRenameSelectedConnectionNode(string newName) { - ConnectionInfo connectionInfo = SelectedNode.Tag as ConnectionInfo; + var connectionInfo = SelectedNode.Tag as ConnectionInfo; if (connectionInfo != null) ConnectionTreeNode.RenameNode(connectionInfo, newName); } + //TODO Fix for TreeListView private static void FinishRenameSelectedContainerNode(string newName) { - Container.ContainerInfo containerInfo = SelectedNode.Tag as Container.ContainerInfo; + var containerInfo = SelectedNode.Tag as Container.ContainerInfo; if (containerInfo != null) ConnectionTreeNode.RenameNode(containerInfo, newName); } + //TODO Fix for TreeListView public static void SetNodeToolTip(MouseEventArgs e, ToolTip tTip) { try @@ -164,6 +175,7 @@ namespace mRemoteNG.Tree } } + //TODO Fix for TreeListView public static void ExpandAllNodes() { TreeView.BeginUpdate(); @@ -171,6 +183,7 @@ namespace mRemoteNG.Tree TreeView.EndUpdate(); } + //TODO Fix for TreeListView public static void CollapseAllNodes() { TreeView.BeginUpdate(); @@ -181,6 +194,7 @@ namespace mRemoteNG.Tree TreeView.EndUpdate(); } + //TODO Fix for TreeListView public static void MoveNodeDown() { try @@ -202,6 +216,7 @@ namespace mRemoteNG.Tree } } + //TODO Fix for TreeListView public static void MoveNodeUp() { try @@ -223,6 +238,7 @@ namespace mRemoteNG.Tree } } + //TODO Fix for TreeListView public static void Sort(TreeNode treeNode, SortOrder sorting) { if (TreeView == null) @@ -248,6 +264,7 @@ namespace mRemoteNG.Tree TreeView.EndUpdate(); } + //TODO Fix for TreeListView private static void Sort(TreeNode treeNode, TreeNodeSorter nodeSorter) { // Adapted from http://www.codeproject.com/Tips/252234/ASP-NET-TreeView-Sort @@ -288,6 +305,7 @@ namespace mRemoteNG.Tree } } + //TODO Fix for TreeListView public static TreeNode Find(TreeNode treeNode, string searchFor) { @@ -313,11 +331,13 @@ namespace mRemoteNG.Tree return null; } + //TODO Fix for TreeListView private static bool IsThisTheNodeWeAreSearchingFor(TreeNode treeNode, string searchFor) { return treeNode.Text.ToLower().IndexOf(searchFor.ToLower(), StringComparison.Ordinal) + 1 > 0; } + //TODO Fix for TreeListView public static TreeNode Find(TreeNode treeNode, ConnectionInfo conInfo) { try @@ -340,6 +360,7 @@ namespace mRemoteNG.Tree return null; } + //TODO Fix for TreeListView private delegate void ResetTreeDelegate(); public static void ResetTree() { @@ -357,6 +378,7 @@ namespace mRemoteNG.Tree } } + //TODO Fix for TreeListView private delegate void SelectNodeDelegate(); private static void SelectNode() { @@ -371,4 +393,4 @@ namespace mRemoteNG.Tree } } } -} +} \ No newline at end of file From 1e68483debbf4eb9d580c298b14c4c8f0522ead9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 09:24:30 -0600 Subject: [PATCH 065/338] - Renamed IParent to IHasParent - Renamed Add, AddRange, Remove, RemoveRange to include the word "Child" to make it more explicit - Added SetParent and RemoveParent functions - DeleteNode now works --- .../Connections/DataTableSerializerTests.cs | 6 ++-- .../Container/ContainerInfoTests.cs | 24 ++++++------- .../ConnectionInheritanceIntegrationTests.cs | 18 +++++----- .../Tree/ConnectionTreeModelTests.cs | 6 ++-- .../UI/ConnectionTreeViewBuilderTests.cs | 34 +++++++++---------- .../Connections/DataTableDeserializer.cs | 4 +-- .../Connections/XmlConnectionsDeserializer.cs | 4 +-- mRemoteV1/Connection/ConnectionInfo.cs | 22 ++++++++++-- mRemoteV1/Connection/IHasParent.cs | 11 ++++++ mRemoteV1/Connection/IParent.cs | 9 ----- mRemoteV1/Container/ContainerInfo.cs | 20 +++++++---- mRemoteV1/Tree/ConnectionTreeModel.cs | 19 +++++++++++ mRemoteV1/Tree/TreeNodeMover.cs | 4 +-- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 18 +++++----- mRemoteV1/mRemoteV1.csproj | 2 +- 15 files changed, 122 insertions(+), 79 deletions(-) create mode 100644 mRemoteV1/Connection/IHasParent.cs delete mode 100644 mRemoteV1/Connection/IParent.cs diff --git a/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs b/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs index add449e66..081735700 100644 --- a/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs +++ b/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs @@ -119,9 +119,9 @@ namespace mRemoteNGTests.Config.Connections var con1 = new ConnectionInfo {Name = "Con1", Username = "user1", Domain = "domain1", Password = "password1" }; var con2 = new ConnectionInfo {Name = "Con2", Username = "user2", Domain = "domain2", Password = "password2" }; - root.Add(folder1); - root.Add(con2); - folder1.Add(con1); + root.AddChild(folder1); + root.AddChild(con2); + folder1.AddChild(con1); model.AddRootNode(root); return model; } diff --git a/mRemoteNGTests/Container/ContainerInfoTests.cs b/mRemoteNGTests/Container/ContainerInfoTests.cs index 528991067..61a99a0af 100644 --- a/mRemoteNGTests/Container/ContainerInfoTests.cs +++ b/mRemoteNGTests/Container/ContainerInfoTests.cs @@ -27,14 +27,14 @@ namespace mRemoteNGTests.Container [Test] public void AddSetsParentPropertyOnTheChild() { - _containerInfo.Add(_connectionInfo); + _containerInfo.AddChild(_connectionInfo); Assert.That(_connectionInfo.Parent, Is.EqualTo(_containerInfo)); } [Test] public void AddAddsChildToChildrenList() { - _containerInfo.Add(_connectionInfo); + _containerInfo.AddChild(_connectionInfo); Assert.That(_containerInfo.Children, Does.Contain(_connectionInfo)); } @@ -42,23 +42,23 @@ namespace mRemoteNGTests.Container public void AddRangeAddsAllItems() { var collection = new[] {new ConnectionInfo(),new ConnectionInfo(), new ContainerInfo()}; - _containerInfo.AddRange(collection); + _containerInfo.AddChildRange(collection); Assert.That(_containerInfo.Children, Is.EquivalentTo(collection)); } [Test] public void RemoveUnsetsParentPropertyOnChild() { - _containerInfo.Add(_connectionInfo); - _containerInfo.Remove(_connectionInfo); + _containerInfo.AddChild(_connectionInfo); + _containerInfo.RemoveChild(_connectionInfo); Assert.That(_connectionInfo.Parent, Is.Not.EqualTo(_containerInfo)); } [Test] public void RemoveRemovesChildFromChildrenList() { - _containerInfo.Add(_connectionInfo); - _containerInfo.Remove(_connectionInfo); + _containerInfo.AddChild(_connectionInfo); + _containerInfo.RemoveChild(_connectionInfo); Assert.That(_containerInfo.Children, Does.Not.Contains(_connectionInfo)); } @@ -66,8 +66,8 @@ namespace mRemoteNGTests.Container public void RemoveRangeRemovesAllIndicatedItems() { var collection = new[] { new ConnectionInfo(), new ConnectionInfo(), new ContainerInfo() }; - _containerInfo.AddRange(collection); - _containerInfo.RemoveRange(collection); + _containerInfo.AddChildRange(collection); + _containerInfo.RemoveChildRange(collection); Assert.That(_containerInfo.Children, Does.Not.Contains(collection[0]).And.Not.Contains(collection[1]).And.Not.Contains(collection[2])); } @@ -75,9 +75,9 @@ namespace mRemoteNGTests.Container public void RemoveRangeDoesNotRemoveUntargetedMembers() { var collection = new[] { new ConnectionInfo(), new ConnectionInfo(), new ContainerInfo() }; - _containerInfo.AddRange(collection); - _containerInfo.Add(_connectionInfo); - _containerInfo.RemoveRange(collection); + _containerInfo.AddChildRange(collection); + _containerInfo.AddChild(_connectionInfo); + _containerInfo.RemoveChildRange(collection); Assert.That(_containerInfo.Children, Does.Contain(_connectionInfo)); } } diff --git a/mRemoteNGTests/IntegrationTests/ConnectionInheritanceIntegrationTests.cs b/mRemoteNGTests/IntegrationTests/ConnectionInheritanceIntegrationTests.cs index 8169f6faf..c5645473b 100644 --- a/mRemoteNGTests/IntegrationTests/ConnectionInheritanceIntegrationTests.cs +++ b/mRemoteNGTests/IntegrationTests/ConnectionInheritanceIntegrationTests.cs @@ -39,9 +39,9 @@ namespace mRemoteNGTests.IntegrationTests var connection1 = new ConnectionInfo(); var connection2 = new ConnectionInfo(); var connection3 = new ConnectionInfo {Inheritance = {Username = true}}; - _rootNode.Add(folder1); - folder1.AddRange(new []{connection1, folder2, connection3}); - folder2.Add(connection2); + _rootNode.AddChild(folder1); + folder1.AddChildRange(new []{connection1, folder2, connection3}); + folder2.AddChild(connection2); Assert.That(connection3.Username, Is.EqualTo(folder1.Username)); } @@ -50,8 +50,8 @@ namespace mRemoteNGTests.IntegrationTests { var folder = new ContainerInfo() {Protocol = ProtocolType.SSH2, Username = "folderUser", Domain = "CoolDomain"}; var connection = new ConnectionInfo() {Inheritance = {EverythingInherited = true}}; - _rootNode.Add(folder); - folder.Add(connection); + _rootNode.AddChild(folder); + folder.AddChild(connection); Assert.That(new object[] { connection.Protocol, connection.Username, connection.Domain }, Is.EquivalentTo(new object[] {folder.Protocol, folder.Username, folder.Domain})); } @@ -62,10 +62,10 @@ namespace mRemoteNGTests.IntegrationTests var folder2 = new ContainerInfo {Inheritance = {Username = true}}; var folder3 = new ContainerInfo {Inheritance = {Username = true}}; var connection = new ConnectionInfo {Inheritance = {Username = true}}; - _rootNode.Add(folder1); - folder1.Add(folder2); - folder2.Add(folder3); - folder3.Add(connection); + _rootNode.AddChild(folder1); + folder1.AddChild(folder2); + folder2.AddChild(folder3); + folder3.AddChild(connection); Assert.That(connection.Username, Is.EqualTo(folder1.Username)); } } diff --git a/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs b/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs index f8d0d1689..b392e962f 100644 --- a/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs +++ b/mRemoteNGTests/Tree/ConnectionTreeModelTests.cs @@ -29,9 +29,9 @@ namespace mRemoteNGTests.Tree var folder1 = new ContainerInfo(); var folder2 = new ContainerInfo(); var con1 = new ConnectionInfo(); - root.Add(folder1); - folder1.Add(folder2); - root.Add(con1); + root.AddChild(folder1); + folder1.AddChild(folder2); + root.AddChild(con1); _connectionTreeModel.AddRootNode(root); var connectionList = _connectionTreeModel.GetRecursiveChildList(root); Assert.That(connectionList, Is.EquivalentTo(new[] {folder1,folder2,con1})); diff --git a/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs index 05dffa1c2..a9e7de669 100644 --- a/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs +++ b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs @@ -48,7 +48,7 @@ namespace mRemoteNGTests.UI */ var root = CreateRootNode(); var con1 = new ConnectionInfo(); - root.Add(con1); + root.AddChild(con1); _connectionTreeViewBuilder.Build(); var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(con1)); @@ -63,7 +63,7 @@ namespace mRemoteNGTests.UI */ var root = CreateRootNode(); var folder1 = new ContainerInfo(); - root.Add(folder1); + root.AddChild(folder1); _connectionTreeViewBuilder.Build(); var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); @@ -80,7 +80,7 @@ namespace mRemoteNGTests.UI var root = CreateRootNode(); var con1 = new ConnectionInfo(); var con2 = new ConnectionInfo(); - root.AddRange(new []{con1, con2}); + root.AddChildRange(new []{con1, con2}); _connectionTreeViewBuilder.Build(); var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(GetTreeNodeTags(rootTreeNode.Nodes), Is.EquivalentTo(new[] { con1, con2 })); @@ -97,8 +97,8 @@ namespace mRemoteNGTests.UI var root = CreateRootNode(); var folder1 = new ContainerInfo(); var con1 = new ConnectionInfo(); - root.Add(folder1); - folder1.Add(con1); + root.AddChild(folder1); + folder1.AddChild(con1); _connectionTreeViewBuilder.Build(); var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); @@ -118,9 +118,9 @@ namespace mRemoteNGTests.UI var folder1 = new ContainerInfo(); var con1 = new ConnectionInfo(); var folder2 = new ContainerInfo(); - root.Add(folder1); - folder1.Add(con1); - root.Add(folder2); + root.AddChild(folder1); + folder1.AddChild(con1); + root.AddChild(folder2); _connectionTreeViewBuilder.Build(); var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); @@ -141,9 +141,9 @@ namespace mRemoteNGTests.UI var folder1 = new ContainerInfo(); var folder2 = new ContainerInfo(); var con1 = new ConnectionInfo(); - root.Add(folder1); - folder1.Add(folder2); - folder2.Add(con1); + root.AddChild(folder1); + folder1.AddChild(folder2); + folder2.AddChild(con1); _connectionTreeViewBuilder.Build(); var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); @@ -168,12 +168,12 @@ namespace mRemoteNGTests.UI var folder3 = new ContainerInfo(); var folder4 = new ContainerInfo(); var con2 = new ConnectionInfo(); - root.Add(folder1); - folder1.Add(folder2); - folder2.Add(con1); - root.Add(folder3); - folder3.Add(folder4); - folder4.Add(con2); + root.AddChild(folder1); + folder1.AddChild(folder2); + folder2.AddChild(con1); + root.AddChild(folder3); + folder3.AddChild(folder4); + folder4.AddChild(con2); _connectionTreeViewBuilder.Build(); var rootTreeNode = _connectionTreeViewBuilder.RootNode; Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); diff --git a/mRemoteV1/Config/Connections/DataTableDeserializer.cs b/mRemoteV1/Config/Connections/DataTableDeserializer.cs index f6598c995..b6b027188 100644 --- a/mRemoteV1/Config/Connections/DataTableDeserializer.cs +++ b/mRemoteV1/Config/Connections/DataTableDeserializer.cs @@ -189,9 +189,9 @@ namespace mRemoteNG.Config.Connections var connectionInfo = connectionList.First(node => node.ConstantID == id); var parentId = (string) row["ParentID"]; if (parentId == "0") - rootNode.Add(connectionInfo); + rootNode.AddChild(connectionInfo); else - (connectionList.First(node => node.ConstantID == parentId) as ContainerInfo)?.Add(connectionInfo); + (connectionList.First(node => node.ConstantID == parentId) as ContainerInfo)?.AddChild(connectionInfo); } return connectionTreeModel; } diff --git a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs index 4b73f9b91..9cca6fe09 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs @@ -140,7 +140,7 @@ namespace mRemoteNG.Config.Connections if (nodeType == TreeNodeType.Connection) { var connectionInfo = GetConnectionInfoFromXml(xmlNode); - parentContainer.Add(connectionInfo); + parentContainer.AddChild(connectionInfo); ConnectionList.Add(connectionInfo); } else if (nodeType == TreeNodeType.Container) @@ -152,7 +152,7 @@ namespace mRemoteNG.Config.Connections if (_confVersion >= 0.8) containerInfo.IsExpanded = xmlNode.Attributes?["Expanded"].Value == "True"; - parentContainer.Add(containerInfo); + parentContainer.AddChild(containerInfo); ContainerList.Add(containerInfo); AddNodesFromXmlRecursive(xmlNode, containerInfo); } diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index b76e8aac0..c27237dd4 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -23,7 +23,7 @@ using mRemoteNG.Tree; namespace mRemoteNG.Connection { [DefaultProperty("Name")] - public class ConnectionInfo : IParent, IInheritable + public class ConnectionInfo : IHasParent, IInheritable, IDisposable { #region Private Properties private string _description; @@ -78,6 +78,7 @@ namespace mRemoteNG.Connection private ProtocolVNC.Colors _vncColors; private ProtocolVNC.SmartSizeMode _vncSmartSizeMode; private bool _vncViewOnly; + private ContainerInfo _parent; #endregion #region Public Properties @@ -624,7 +625,7 @@ namespace mRemoteNG.Connection public bool IsDefault { get; set; } [Browsable(false)] - public ContainerInfo Parent { get; set; } + public ContainerInfo Parent { get; internal set; } [Browsable(false)] public int PositionID { get; set; } @@ -662,7 +663,7 @@ namespace mRemoteNG.Connection public ConnectionInfo(ContainerInfo parent) : this() { IsContainer = true; - parent.Add(this); + parent.AddChild(this); } #endregion @@ -714,6 +715,21 @@ namespace mRemoteNG.Connection var filteredProperties = properties.Where((prop) => !excludedPropertyNames.Contains(prop.Name)); return filteredProperties; } + + public void SetParent(ContainerInfo parent) + { + parent.AddChild(this); + } + + public void RemoveParent() + { + Parent?.RemoveChild(this); + } + + public virtual void Dispose() + { + RemoveParent(); + } #endregion #region Public Enumerations diff --git a/mRemoteV1/Connection/IHasParent.cs b/mRemoteV1/Connection/IHasParent.cs new file mode 100644 index 000000000..d43997fc7 --- /dev/null +++ b/mRemoteV1/Connection/IHasParent.cs @@ -0,0 +1,11 @@ +using mRemoteNG.Container; + +namespace mRemoteNG.Connection +{ + public interface IHasParent + { + ContainerInfo Parent { get; } + + void SetParent(ContainerInfo containerInfo); + } +} \ No newline at end of file diff --git a/mRemoteV1/Connection/IParent.cs b/mRemoteV1/Connection/IParent.cs deleted file mode 100644 index 49145a197..000000000 --- a/mRemoteV1/Connection/IParent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using mRemoteNG.Container; - -namespace mRemoteNG.Connection -{ - public interface IParent - { - ContainerInfo Parent { get; set; } - } -} \ No newline at end of file diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index e7ae83b39..70e948716 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -25,34 +25,42 @@ namespace mRemoteNG.Container return TreeNodeType.Container; } - public void Add(ConnectionInfo newChildItem) + public void AddChild(ConnectionInfo newChildItem) { newChildItem.Parent = this; Children.Add(newChildItem); } - public void AddRange(IEnumerable newChildren) + public void AddChildRange(IEnumerable newChildren) { foreach (var child in newChildren) { - Add(child); + AddChild(child); } } - public void Remove(ConnectionInfo removalTarget) + public void RemoveChild(ConnectionInfo removalTarget) { removalTarget.Parent = null; Children.Remove(removalTarget); } - public void RemoveRange(IEnumerable removalTargets) + public void RemoveChildRange(IEnumerable removalTargets) { foreach (var child in removalTargets) { - Remove(child); + RemoveChild(child); } } + public override void Dispose() + { + var tempChildList = Children.ToArray(); + foreach (var child in tempChildList) + child.Dispose(); + RemoveParent(); + } + public new ContainerInfo Copy() { return (ContainerInfo)MemberwiseClone(); diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index fc4562fd6..425e9ad7d 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using mRemoteNG.Connection; using mRemoteNG.Container; +using mRemoteNG.Tree.Root; namespace mRemoteNG.Tree @@ -18,5 +19,23 @@ namespace mRemoteNG.Tree { return container.GetRecursiveChildList(); } + + public void RenameNode(ConnectionInfo connectionInfo, string newName) + { + if (newName == null || newName.Length <= 0) + return; + + connectionInfo.Name = newName; + if (Settings.Default.SetHostnameLikeDisplayName) + connectionInfo.Hostname = newName; + } + + public void DeleteNode(ConnectionInfo connectionInfo) + { + if (connectionInfo is RootNodeInfo) + return; + + connectionInfo.Dispose(); + } } } \ No newline at end of file diff --git a/mRemoteV1/Tree/TreeNodeMover.cs b/mRemoteV1/Tree/TreeNodeMover.cs index eda89dedc..9655cc5b2 100644 --- a/mRemoteV1/Tree/TreeNodeMover.cs +++ b/mRemoteV1/Tree/TreeNodeMover.cs @@ -66,7 +66,7 @@ namespace mRemoteNG.Tree { if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved.Parent) == TreeNodeType.Container) { - ((IParent)_nodeBeingMoved.Tag).Parent = (ContainerInfo)_nodeBeingMoved.Parent.Tag; + ((IHasParent)_nodeBeingMoved.Tag).SetParent((ContainerInfo)_nodeBeingMoved.Parent.Tag); ((IInheritable)_nodeBeingMoved.Tag).Inheritance.EnableInheritance(); } } @@ -75,7 +75,7 @@ namespace mRemoteNG.Tree { if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved.Parent) == TreeNodeType.Root) { - ((IParent)_nodeBeingMoved.Tag).Parent = null; + ((IHasParent) _nodeBeingMoved.Tag).SetParent(null); ((IInheritable)_nodeBeingMoved.Tag).Inheritance.DisableInheritance(); } } diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 84c7b13f3..d615367b0 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -20,6 +20,7 @@ namespace mRemoteNG.UI.Window private ConnectionTreeModel _connectionTreeModel; private ToolTip DescriptionTooltip { get; } + private ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; public ConnectionTreeModel ConnectionTreeModel { @@ -90,8 +91,8 @@ namespace mRemoteNG.UI.Window { olvConnections.Collapsed += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = false; olvConnections.Expanded += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = true; - //olvConnections.BeforeLabelEdit += tvConnections_BeforeLabelEdit; - //olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; + olvConnections.BeforeLabelEdit += tvConnections_BeforeLabelEdit; + olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; olvConnections.SelectionChanged += tvConnections_AfterSelect; } @@ -218,16 +219,14 @@ namespace mRemoteNG.UI.Window cMenTreeDelete.ShortcutKeys = Keys.None; } - //TODO Fix for TreeListView private void tvConnections_AfterLabelEdit(object sender, LabelEditEventArgs e) { try { cMenTreeDelete.ShortcutKeys = Keys.Delete; - - ConnectionTree.FinishRenameSelectedNode(e.Label); + ConnectionTreeModel.RenameNode(SelectedNode, e.Label); Windows.configForm.pGrid_SelectedObjectChanged(); - //ShowHideTreeContextMenuItems(e.Node); + ShowHideTreeContextMenuItems(SelectedNode); Runtime.SaveConnectionsBG(); } catch (Exception ex) @@ -236,7 +235,6 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView private void tvConnections_AfterSelect(object sender, EventArgs e) { try @@ -661,18 +659,18 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - //TODO Fix for TreeListView private void cMenTreeRename_Click(object sender, EventArgs e) { - ConnectionTree.StartRenameSelectedNode(); + olvConnections.SelectedItem.BeginEdit(); Runtime.SaveConnectionsBG(); } //TODO Fix for TreeListView private void cMenTreeDelete_Click(object sender, EventArgs e) { - ConnectionTree.DeleteSelectedNode(); + ConnectionTreeModel.DeleteNode(SelectedNode); Runtime.SaveConnectionsBG(); + olvConnections.RebuildAll(true); } //TODO Fix for TreeListView diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index a8e05fa11..0f1f7fabe 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -175,7 +175,7 @@ - + From 73ee88ab084f015eb476c4724ead64b457da137a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 09:28:41 -0600 Subject: [PATCH 066/338] Removed unnecessary code --- mRemoteV1/App/Import.cs | 2 +- mRemoteV1/Tree/ConnectionTree.cs | 23 --------------------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 1 - 3 files changed, 1 insertion(+), 25 deletions(-) diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 63ff9d705..028cf9a39 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -28,7 +28,7 @@ namespace mRemoteNG.App #endregion #region Public Methods - + //TODO Fix for TreeListView public static void ImportFromFile(TreeNode rootTreeNode, TreeNode selectedTreeNode, bool alwaysUseSelectedTreeNode = false) { diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index a59f37953..3876d17cd 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -118,29 +118,6 @@ namespace mRemoteNG.Tree SelectedNode?.BeginEdit(); } - //TODO Fix for TreeListView - public static void FinishRenameSelectedNode(string newName) - { - FinishRenameSelectedConnectionNode(newName); - FinishRenameSelectedContainerNode(newName); - } - - //TODO Fix for TreeListView - private static void FinishRenameSelectedConnectionNode(string newName) - { - var connectionInfo = SelectedNode.Tag as ConnectionInfo; - if (connectionInfo != null) - ConnectionTreeNode.RenameNode(connectionInfo, newName); - } - - //TODO Fix for TreeListView - private static void FinishRenameSelectedContainerNode(string newName) - { - var containerInfo = SelectedNode.Tag as Container.ContainerInfo; - if (containerInfo != null) - ConnectionTreeNode.RenameNode(containerInfo, newName); - } - //TODO Fix for TreeListView public static void SetNodeToolTip(MouseEventArgs e, ToolTip tTip) { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index d615367b0..1ea228a71 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -665,7 +665,6 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - //TODO Fix for TreeListView private void cMenTreeDelete_Click(object sender, EventArgs e) { ConnectionTreeModel.DeleteNode(SelectedNode); From a589f337b778f671adaa8a1b4b69459a567489fc Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 09:37:12 -0600 Subject: [PATCH 067/338] Removed more unnecessary code --- mRemoteV1/Tree/ConnectionTree.cs | 1 - mRemoteV1/Tree/ConnectionTreeNode.cs | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index 3876d17cd..4f6393e38 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -112,7 +112,6 @@ namespace mRemoteNG.Tree return (msgBoxResponse == DialogResult.Yes); } - //TODO Fix for TreeListView public static void StartRenameSelectedNode() { SelectedNode?.BeginEdit(); diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index ea26a183f..e73bf1753 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -245,16 +245,6 @@ namespace mRemoteNG.Tree { SetNodeImageIndex(treeNode, (int)Img); } - - public static void RenameNode(ConnectionInfo connectionInfo, string newName) - { - if (newName == null || newName.Length <= 0) - return; - - connectionInfo.Name = newName; - if (Settings.Default.SetHostnameLikeDisplayName) - connectionInfo.Hostname = newName; - } #endregion #region Private Methods From 1056e20ec2afa03588d22a59f4a1876ebb614c9b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 09:47:15 -0600 Subject: [PATCH 068/338] Renamed Copy to Clone --- mRemoteNGTests/Connection/ConnectionInfoTests.cs | 2 +- mRemoteV1/Connection/ConnectionInfo.cs | 2 +- mRemoteV1/Container/ContainerInfo.cs | 2 +- mRemoteV1/Tools/ExternalTool.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mRemoteNGTests/Connection/ConnectionInfoTests.cs b/mRemoteNGTests/Connection/ConnectionInfoTests.cs index ea1cce0fe..b3f80c680 100644 --- a/mRemoteNGTests/Connection/ConnectionInfoTests.cs +++ b/mRemoteNGTests/Connection/ConnectionInfoTests.cs @@ -42,7 +42,7 @@ namespace mRemoteNGTests.Connection public void CopyCreatesMemberwiseCopy() { _connectionInfo.Domain = TestDomain; - var secondConnection = _connectionInfo.Copy(); + var secondConnection = _connectionInfo.Clone(); Assert.That(secondConnection.Domain, Is.EqualTo(_connectionInfo.Domain)); } diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index c27237dd4..d51dbe359 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -668,7 +668,7 @@ namespace mRemoteNG.Connection #endregion #region Public Methods - public virtual ConnectionInfo Copy() + public virtual ConnectionInfo Clone() { var newConnectionInfo = (ConnectionInfo)MemberwiseClone(); newConnectionInfo.ConstantID = MiscTools.CreateConstantID(); diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 70e948716..fe43a32fa 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -61,7 +61,7 @@ namespace mRemoteNG.Container RemoveParent(); } - public new ContainerInfo Copy() + public new ContainerInfo Clone() { return (ContainerInfo)MemberwiseClone(); } diff --git a/mRemoteV1/Tools/ExternalTool.cs b/mRemoteV1/Tools/ExternalTool.cs index 781c8fd64..80c015d73 100644 --- a/mRemoteV1/Tools/ExternalTool.cs +++ b/mRemoteV1/Tools/ExternalTool.cs @@ -97,7 +97,7 @@ namespace mRemoteNG.Tools private ConnectionInfo GetAppropriateInstanceOfConnectionInfo() { - var newConnectionInfo = ConnectionInfo == null ? new ConnectionInfo() : ConnectionInfo.Copy(); + var newConnectionInfo = ConnectionInfo == null ? new ConnectionInfo() : ConnectionInfo.Clone(); return newConnectionInfo; } From 53cb4149da2e24f55ffd406a13b43533ad949cca Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 09:52:55 -0600 Subject: [PATCH 069/338] Missed a commit for the Copy -> Clone rename --- mRemoteV1/Tree/ConnectionTreeNode.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index e73bf1753..6d14aa484 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -175,8 +175,8 @@ namespace mRemoteNG.Tree { ContainerInfo oldContainerInfo = (ContainerInfo) oldTreeNode.Tag; - ContainerInfo newContainerInfo = oldContainerInfo.Copy(); - ConnectionInfo newConnectionInfo = oldContainerInfo.Copy(); + ContainerInfo newContainerInfo = oldContainerInfo.Clone(); + ConnectionInfo newConnectionInfo = oldContainerInfo.Clone(); newContainerInfo.CopyFrom(newConnectionInfo); TreeNode newTreeNode = new TreeNode(newContainerInfo.Name); @@ -209,7 +209,7 @@ namespace mRemoteNG.Tree { ConnectionInfo oldConnectionInfo = (ConnectionInfo)oldTreeNode.Tag; - ConnectionInfo newConnectionInfo = oldConnectionInfo.Copy(); + ConnectionInfo newConnectionInfo = oldConnectionInfo.Clone(); ConnectionInfoInheritance newInheritance = oldConnectionInfo.Inheritance.Copy(); newInheritance.Parent = newConnectionInfo; newConnectionInfo.Inheritance = newInheritance; From 5ab56888443957bae5cf17ae8a6c811f4b3a4599 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 10:02:45 -0600 Subject: [PATCH 070/338] Renamed Inheritance.Copy to Clone --- mRemoteV1/Connection/ConnectionInfoInheritance.cs | 4 ++-- mRemoteV1/Tree/ConnectionTreeNode.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInfoInheritance.cs b/mRemoteV1/Connection/ConnectionInfoInheritance.cs index 4d7ac372c..43a1a2eb5 100644 --- a/mRemoteV1/Connection/ConnectionInfoInheritance.cs +++ b/mRemoteV1/Connection/ConnectionInfoInheritance.cs @@ -305,7 +305,7 @@ namespace mRemoteNG.Connection } - public ConnectionInfoInheritance Copy() + public ConnectionInfoInheritance Clone() { return (ConnectionInfoInheritance)MemberwiseClone(); } @@ -330,7 +330,7 @@ namespace mRemoteNG.Connection private void StashInheritanceData() { - _tempInheritanceStorage = Copy(); + _tempInheritanceStorage = Clone(); } public void TurnOnInheritanceCompletely() diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 6d14aa484..44917312d 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -210,7 +210,7 @@ namespace mRemoteNG.Tree ConnectionInfo oldConnectionInfo = (ConnectionInfo)oldTreeNode.Tag; ConnectionInfo newConnectionInfo = oldConnectionInfo.Clone(); - ConnectionInfoInheritance newInheritance = oldConnectionInfo.Inheritance.Copy(); + ConnectionInfoInheritance newInheritance = oldConnectionInfo.Inheritance.Clone(); newInheritance.Parent = newConnectionInfo; newConnectionInfo.Inheritance = newInheritance; From 86228e4270e4a08d61a108a69b1726970a7b7d11 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 10:29:16 -0600 Subject: [PATCH 071/338] Updated some Clone methods to be deeper --- mRemoteV1/Connection/ConnectionInfo.cs | 2 ++ .../Connection/ConnectionInfoInheritance.cs | 4 +++- mRemoteV1/Container/ContainerInfo.cs | 16 +++++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index d51dbe359..8b2816c85 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -672,7 +672,9 @@ namespace mRemoteNG.Connection { var newConnectionInfo = (ConnectionInfo)MemberwiseClone(); newConnectionInfo.ConstantID = MiscTools.CreateConstantID(); + newConnectionInfo.SetParent(Parent); newConnectionInfo.OpenConnections = new ProtocolList(); + newConnectionInfo.Inheritance = Inheritance.Clone(); return newConnectionInfo; } diff --git a/mRemoteV1/Connection/ConnectionInfoInheritance.cs b/mRemoteV1/Connection/ConnectionInfoInheritance.cs index 43a1a2eb5..058c374c6 100644 --- a/mRemoteV1/Connection/ConnectionInfoInheritance.cs +++ b/mRemoteV1/Connection/ConnectionInfoInheritance.cs @@ -307,7 +307,9 @@ namespace mRemoteNG.Connection public ConnectionInfoInheritance Clone() { - return (ConnectionInfoInheritance)MemberwiseClone(); + var newInheritance = (ConnectionInfoInheritance) MemberwiseClone(); + newInheritance._tempInheritanceStorage = null; + return newInheritance; } public void EnableInheritance() diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index fe43a32fa..e31a72385 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using mRemoteNG.Connection; using System.ComponentModel; +using mRemoteNG.Tools; using mRemoteNG.Tree; namespace mRemoteNG.Container @@ -61,9 +62,22 @@ namespace mRemoteNG.Container RemoveParent(); } + // Deep clone, recursive + public ContainerInfo DeepClone() + { + var newContainer = new ContainerInfo(); + newContainer.CopyFrom(base.Clone()); + foreach (var child in Children) + newContainer.AddChild(child.Clone()); + return newContainer; + } + public new ContainerInfo Clone() { - return (ContainerInfo)MemberwiseClone(); + var newContainer = new ContainerInfo(); + newContainer.CopyFrom(base.Clone()); + newContainer.Children = new List(); + return newContainer; } private new void SetDefaults() From d73f0d24014fbb8acc7fbefa11e62233863010f7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 10:36:03 -0600 Subject: [PATCH 072/338] Resolved nullref error with SetParent --- mRemoteV1/Connection/ConnectionInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index 8b2816c85..764690733 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -720,7 +720,7 @@ namespace mRemoteNG.Connection public void SetParent(ContainerInfo parent) { - parent.AddChild(this); + parent?.AddChild(this); } public void RemoveParent() From 54008af8bf763e0948ea7524aebeff38b15950b1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 10:40:38 -0600 Subject: [PATCH 073/338] Deep clone for containers --- mRemoteV1/Container/ContainerInfo.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index e31a72385..c53f44e3e 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -63,21 +63,13 @@ namespace mRemoteNG.Container } // Deep clone, recursive - public ContainerInfo DeepClone() - { + public override ConnectionInfo Clone() + { var newContainer = new ContainerInfo(); newContainer.CopyFrom(base.Clone()); foreach (var child in Children) newContainer.AddChild(child.Clone()); return newContainer; - } - - public new ContainerInfo Clone() - { - var newContainer = new ContainerInfo(); - newContainer.CopyFrom(base.Clone()); - newContainer.Children = new List(); - return newContainer; } private new void SetDefaults() From b843a55a2584a5ead0a1d9b2b48d70f45d4f30ac Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 12:41:07 -0600 Subject: [PATCH 074/338] AddNode is working --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 40 +++------------------ 1 file changed, 4 insertions(+), 36 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 1ea228a71..1564e17d6 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -717,43 +717,11 @@ namespace mRemoteNG.UI.Window { try { - if (tvConnections.SelectedNode == null) - { - tvConnections.SelectedNode = tvConnections.Nodes[0]; - } - - TreeNode newTreeNode = ConnectionTreeNode.AddNode(TreeNodeType.Connection); - if (newTreeNode == null) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "UI.Window.Tree.AddConnection() failed." + Environment.NewLine + "mRemoteNG.Tree.Node.AddNode() returned Nothing.", true); - return ; - } - - TreeNode containerNode = tvConnections.SelectedNode; - if (ConnectionTreeNode.GetNodeType(containerNode) == TreeNodeType.Connection) - { - containerNode = containerNode.Parent; - } - - ConnectionInfo newConnectionInfo = new ConnectionInfo(); - newConnectionInfo.CopyFrom(DefaultConnectionInfo.Instance); - if (ConnectionTreeNode.GetNodeType(containerNode) == TreeNodeType.Root) - { - newConnectionInfo.Inheritance.DisableInheritance(); - } - else - { - newConnectionInfo.Parent = (ContainerInfo)containerNode.Tag; - } - - newConnectionInfo.TreeNode = newTreeNode; - newTreeNode.Tag = newConnectionInfo; + var newConnectionInfo = new ConnectionInfo(); + var selectedContainer = SelectedNode as ContainerInfo; + newConnectionInfo.SetParent(selectedContainer ?? SelectedNode.Parent); + olvConnections.RebuildAll(true); Runtime.ConnectionList.Add(newConnectionInfo); - - containerNode.Nodes.Add(newTreeNode); - - tvConnections.SelectedNode = newTreeNode; - tvConnections.SelectedNode.BeginEdit(); } catch (Exception ex) { From ff46d39a6a51eba2e5c81394a7424814dc7333cb Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 12:45:44 -0600 Subject: [PATCH 075/338] AddFolder now working --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 42 ++------------------- 1 file changed, 4 insertions(+), 38 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 1564e17d6..32bb7822f 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -712,7 +712,6 @@ namespace mRemoteNG.UI.Window #endregion #region Context Menu Actions - //TODO Fix for TreeListView public void AddConnection() { try @@ -729,48 +728,15 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView public void AddFolder() { try { - TreeNode newNode = ConnectionTreeNode.AddNode(TreeNodeType.Container); - ContainerInfo newContainerInfo = new ContainerInfo(); - newContainerInfo.CopyFrom(DefaultConnectionInfo.Instance); - newNode.Tag = newContainerInfo; - newContainerInfo.TreeNode = newNode; - - TreeNode selectedNode = ConnectionTree.SelectedNode; - TreeNode parentNode; - if (selectedNode == null) - { - parentNode = tvConnections.Nodes[0]; - } - else - { - if (ConnectionTreeNode.GetNodeType(selectedNode) == TreeNodeType.Connection) - parentNode = selectedNode.Parent; - else - parentNode = selectedNode; - } - - newContainerInfo.Name = newNode.Text; - - // We can only inherit from a container node, not the root node or connection nodes - if (ConnectionTreeNode.GetNodeType(parentNode) == TreeNodeType.Container) - { - newContainerInfo.Parent = (ContainerInfo)parentNode.Tag; - } - else - { - newContainerInfo.Inheritance.DisableInheritance(); - } - + var newContainerInfo = new ContainerInfo(); + var selectedContainer = SelectedNode as ContainerInfo; + newContainerInfo.SetParent(selectedContainer ?? SelectedNode.Parent); + olvConnections.RebuildAll(true); Runtime.ContainerList.Add(newContainerInfo); - parentNode.Nodes.Add(newNode); - - tvConnections.SelectedNode = newNode; - tvConnections.SelectedNode.BeginEdit(); } catch (Exception ex) { From 89538e7289efcf99412da65b24e6e933918ea3e2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 12:47:51 -0600 Subject: [PATCH 076/338] New folders created with "New Folder" as the text --- mRemoteV1/Container/ContainerInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index c53f44e3e..378c70c82 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -74,6 +74,7 @@ namespace mRemoteNG.Container private new void SetDefaults() { + Name = "New Folder"; IsExpanded = true; } From 8bf500414707822a6c3c07461ba6aed8e9f5405e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 12:49:41 -0600 Subject: [PATCH 077/338] Fixed nullref error when attempting to delete a node when nothing is selected --- mRemoteV1/Tree/ConnectionTreeModel.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index 425e9ad7d..83071e16a 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -35,7 +35,8 @@ namespace mRemoteNG.Tree if (connectionInfo is RootNodeInfo) return; - connectionInfo.Dispose(); + connectionInfo?.Dispose(); + } } } } \ No newline at end of file From 5ea2304d5e4c1f3162035fe9ef609ae07a4f8eb2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 14:36:52 -0600 Subject: [PATCH 078/338] Duplicating nodes now works --- mRemoteV1/Connection/ConnectionInfo.cs | 5 +++-- mRemoteV1/Container/ContainerInfo.cs | 15 ++++++++++++--- mRemoteV1/Tree/ConnectionTreeModel.cs | 4 ++++ mRemoteV1/Tree/ConnectionTreeNode.cs | 2 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 5 +++-- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index 764690733..acc78596a 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -670,7 +670,8 @@ namespace mRemoteNG.Connection #region Public Methods public virtual ConnectionInfo Clone() { - var newConnectionInfo = (ConnectionInfo)MemberwiseClone(); + var newConnectionInfo = new ConnectionInfo(); + newConnectionInfo.CopyFrom(this); newConnectionInfo.ConstantID = MiscTools.CreateConstantID(); newConnectionInfo.SetParent(Parent); newConnectionInfo.OpenConnections = new ProtocolList(); @@ -718,7 +719,7 @@ namespace mRemoteNG.Connection return filteredProperties; } - public void SetParent(ContainerInfo parent) + public virtual void SetParent(ContainerInfo parent) { parent?.AddChild(this); } diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 378c70c82..1627db27e 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using mRemoteNG.Connection; using System.ComponentModel; +using mRemoteNG.Connection.Protocol; using mRemoteNG.Tools; using mRemoteNG.Tree; @@ -66,9 +67,17 @@ namespace mRemoteNG.Container public override ConnectionInfo Clone() { var newContainer = new ContainerInfo(); - newContainer.CopyFrom(base.Clone()); - foreach (var child in Children) - newContainer.AddChild(child.Clone()); + newContainer.CopyFrom(this); + newContainer.ConstantID = MiscTools.CreateConstantID(); + newContainer.SetParent(Parent); + newContainer.OpenConnections = new ProtocolList(); + newContainer.Inheritance = Inheritance.Clone(); + foreach (var child in Children.ToArray()) + { + var newChild = child.Clone(); + newChild.RemoveParent(); + newContainer.AddChild(newChild); + } return newContainer; } diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index 83071e16a..5234e1349 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -37,6 +37,10 @@ namespace mRemoteNG.Tree connectionInfo?.Dispose(); } + + public void CloneNode(ConnectionInfo connectionInfo) + { + connectionInfo.Clone(); } } } \ No newline at end of file diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 44917312d..8727e027a 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -175,7 +175,7 @@ namespace mRemoteNG.Tree { ContainerInfo oldContainerInfo = (ContainerInfo) oldTreeNode.Tag; - ContainerInfo newContainerInfo = oldContainerInfo.Clone(); + ContainerInfo newContainerInfo = (ContainerInfo)oldContainerInfo.Clone(); ConnectionInfo newConnectionInfo = oldContainerInfo.Clone(); newContainerInfo.CopyFrom(newConnectionInfo); diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 32bb7822f..5760f6c15 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -654,9 +654,10 @@ namespace mRemoteNG.UI.Window //TODO Fix for TreeListView private void cMenTreeDuplicate_Click(object sender, EventArgs e) - { - ConnectionTreeNode.CloneNode(tvConnections.SelectedNode); + { + SelectedNode.Clone(); Runtime.SaveConnectionsBG(); + olvConnections.RebuildAll(true); } private void cMenTreeRename_Click(object sender, EventArgs e) From c8db438ccab6d4ca4fc962e5490d7527db7c5b5d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 7 Sep 2016 15:28:22 -0600 Subject: [PATCH 079/338] Fixed single mouse click on node --- mRemoteV1/App/Runtime.cs | 14 +++++- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 49 ++++++++++----------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 56590c425..444b6ea0f 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -627,7 +627,8 @@ namespace mRemoteNG.App return null; } } - + + //TODO Fix for TreeListView public static void OpenConnection() { try @@ -640,6 +641,7 @@ namespace mRemoteNG.App } } + //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo.Force Force) { try @@ -673,6 +675,8 @@ namespace mRemoteNG.App } } + + //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo ConnectionInfo) { try @@ -685,6 +689,8 @@ namespace mRemoteNG.App } } + + //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo ConnectionInfo, Form ConnectionForm) { try @@ -697,6 +703,8 @@ namespace mRemoteNG.App } } + + //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo ConnectionInfo, Form ConnectionForm, ConnectionInfo.Force Force) { try @@ -709,6 +717,8 @@ namespace mRemoteNG.App } } + + //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force) { try @@ -721,6 +731,8 @@ namespace mRemoteNG.App } } + + //TODO Fix for TreeListView private static void OpenConnectionFinal(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force, Form ConForm) { try diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 5760f6c15..aa05f3bfc 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -94,6 +94,8 @@ namespace mRemoteNG.UI.Window olvConnections.BeforeLabelEdit += tvConnections_BeforeLabelEdit; olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; olvConnections.SelectionChanged += tvConnections_AfterSelect; + olvConnections.MouseClick += tvConnections_NodeMouseClick; + } @@ -213,7 +215,6 @@ namespace mRemoteNG.UI.Window } #region Private Methods - //TODO Fix for TreeListView private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) { cMenTreeDelete.ShortcutKeys = Keys.None; @@ -249,33 +250,28 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView private void tvConnections_NodeMouseClick(object sender, MouseEventArgs e) { - //try - //{ - // ShowHideTreeContextMenuItems(tvConnections.SelectedNode); - // tvConnections.SelectedNode = e.Node; + try + { + ShowHideTreeContextMenuItems(SelectedNode); - // if (e.Button == MouseButtons.Left) - // { - // if (Settings.Default.SingleClickOnConnectionOpensIt && - // (ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection | - // ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.PuttySession)) - // { - // Runtime.OpenConnection(); - // } + if (e.Button != MouseButtons.Left) return; + if (Settings.Default.SingleClickOnConnectionOpensIt && + (SelectedNode.GetTreeNodeType() == TreeNodeType.Connection | SelectedNode.GetTreeNodeType() == TreeNodeType.PuttySession)) + { + Runtime.OpenConnection(); + } - // if (Settings.Default.SingleClickSwitchesToOpenConnection && ConnectionTreeNode.GetNodeType(e.Node) == TreeNodeType.Connection) - // { - // Runtime.SwitchToOpenConnection((ConnectionInfo)e.Node.Tag); - // } - // } - //} - //catch (Exception ex) - //{ - // Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_NodeMouseClick (UI.Window.ConnectionTreeWindow) failed", ex); - //} + if (Settings.Default.SingleClickSwitchesToOpenConnection && SelectedNode.GetTreeNodeType() == TreeNodeType.Connection) + { + Runtime.SwitchToOpenConnection(SelectedNode); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_NodeMouseClick (UI.Window.ConnectionTreeWindow) failed", ex); + } } //TODO Fix for TreeListView @@ -642,17 +638,18 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } + //TODO Fix for TreeListView private void cMenTree_DropDownOpening(object sender, EventArgs e) { AddExternalApps(); } - + + //TODO Fix for TreeListView private void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e) { StartExternalApp((Tools.ExternalTool)((ToolStripMenuItem)sender).Tag); } - //TODO Fix for TreeListView private void cMenTreeDuplicate_Click(object sender, EventArgs e) { SelectedNode.Clone(); From 4ca07d534b04edac1d9f3f9ca0acb5cbb3772c1a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 8 Sep 2016 08:22:23 -0600 Subject: [PATCH 080/338] Double click actions on tree nodes now working --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index aa05f3bfc..79e7fabbd 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -8,6 +8,7 @@ using System; using System.Drawing; using System.Linq; using System.Windows.Forms; +using BrightIdeasSoftware; using mRemoteNG.Root.PuttySessions; using mRemoteNG.Tree.Root; using WeifenLuo.WinFormsUI.Docking; @@ -95,8 +96,7 @@ namespace mRemoteNG.UI.Window olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; olvConnections.SelectionChanged += tvConnections_AfterSelect; olvConnections.MouseClick += tvConnections_NodeMouseClick; - - + olvConnections.CellClick += tvConnections_NodeMouseDoubleClick; } private void PopulateTreeView() @@ -274,11 +274,13 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView - private static void tvConnections_NodeMouseDoubleClick(object sender, MouseEventArgs e) - { - if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | - ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) + private void tvConnections_NodeMouseDoubleClick(object sender, CellClickEventArgs e) + { + if (e.ClickCount < 2) return; + var clickedNode = e.Model as ConnectionInfo; + + if (clickedNode?.GetTreeNodeType() == TreeNodeType.Connection | + clickedNode?.GetTreeNodeType() == TreeNodeType.PuttySession) { Runtime.OpenConnection(); } From 08466f5179a159ca311a6f64813d2664c2fa21fa Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 8 Sep 2016 08:24:01 -0600 Subject: [PATCH 081/338] Refactored the single node click event handler to handle the CellClick event instead of MouseClick to be more in line with the double click event handler --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 79e7fabbd..43b2176eb 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -95,7 +95,7 @@ namespace mRemoteNG.UI.Window olvConnections.BeforeLabelEdit += tvConnections_BeforeLabelEdit; olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; olvConnections.SelectionChanged += tvConnections_AfterSelect; - olvConnections.MouseClick += tvConnections_NodeMouseClick; + olvConnections.CellClick += tvConnections_NodeMouseSingleClick; olvConnections.CellClick += tvConnections_NodeMouseDoubleClick; } @@ -250,23 +250,21 @@ namespace mRemoteNG.UI.Window } } - private void tvConnections_NodeMouseClick(object sender, MouseEventArgs e) + private void tvConnections_NodeMouseSingleClick(object sender, CellClickEventArgs e) { try { + if (e.ClickCount > 1) return; + var clickedNode = (ConnectionInfo)e.Model; ShowHideTreeContextMenuItems(SelectedNode); - - if (e.Button != MouseButtons.Left) return; - if (Settings.Default.SingleClickOnConnectionOpensIt && - (SelectedNode.GetTreeNodeType() == TreeNodeType.Connection | SelectedNode.GetTreeNodeType() == TreeNodeType.PuttySession)) - { + + //if (e.Button != MouseButtons.Left) return; + if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; + if (Settings.Default.SingleClickOnConnectionOpensIt) Runtime.OpenConnection(); - } - if (Settings.Default.SingleClickSwitchesToOpenConnection && SelectedNode.GetTreeNodeType() == TreeNodeType.Connection) - { + if (Settings.Default.SingleClickSwitchesToOpenConnection) Runtime.SwitchToOpenConnection(SelectedNode); - } } catch (Exception ex) { From bf23d78e410db37689aced83ee3efe5295dadcbf Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 8 Sep 2016 08:32:08 -0600 Subject: [PATCH 082/338] Node tool tips now working. Removed unnecessary code --- mRemoteV1/Tree/ConnectionTree.cs | 34 --------------------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 8 +++-- 2 files changed, 5 insertions(+), 37 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index 4f6393e38..86cb81235 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -117,40 +117,6 @@ namespace mRemoteNG.Tree SelectedNode?.BeginEdit(); } - //TODO Fix for TreeListView - public static void SetNodeToolTip(MouseEventArgs e, ToolTip tTip) - { - try - { - if (!Settings.Default.ShowDescriptionTooltipsInTree) return; - //Find the node under the mouse. - TreeNode new_node = TreeView.GetNodeAt(e.X, e.Y); - if (new_node == null || new_node.Equals(SetNodeToolTip_old_node)) - { - return; - } - SetNodeToolTip_old_node = new_node; - - //See if we have a node. - if (SetNodeToolTip_old_node == null) - { - tTip.SetToolTip(TreeView, ""); - } - else - { - //Get this node's object data. - if (ConnectionTreeNode.GetNodeType(SetNodeToolTip_old_node) == TreeNodeType.Connection) - { - tTip.SetToolTip(TreeView, ((ConnectionInfo) SetNodeToolTip_old_node.Tag).Description); - } - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "SetNodeToolTip failed" + Environment.NewLine + ex.Message, true); - } - } - //TODO Fix for TreeListView public static void ExpandAllNodes() { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 43b2176eb..fb4226c4c 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -97,6 +97,8 @@ namespace mRemoteNG.UI.Window olvConnections.SelectionChanged += tvConnections_AfterSelect; olvConnections.CellClick += tvConnections_NodeMouseSingleClick; olvConnections.CellClick += tvConnections_NodeMouseDoubleClick; + olvConnections.CellToolTipShowing += tvConnections_CellToolTipShowing; + } private void PopulateTreeView() @@ -284,12 +286,12 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView - private void tvConnections_MouseMove(object sender, MouseEventArgs e) + private void tvConnections_CellToolTipShowing(object sender, ToolTipShowingEventArgs e) { try { - ConnectionTree.SetNodeToolTip(e, DescriptionTooltip); + var nodeProducingTooltip = (ConnectionInfo) e.Model; + e.Text = nodeProducingTooltip.Description; } catch (Exception ex) { From 30ccc0c76c28752ce5952362b353f4de9a71e1f6 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 8 Sep 2016 09:01:21 -0600 Subject: [PATCH 083/338] Resolved bug that broke the "child node only ever has one parent" rule --- mRemoteV1/Connection/ConnectionInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index acc78596a..70f1b048d 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -721,6 +721,7 @@ namespace mRemoteNG.Connection public virtual void SetParent(ContainerInfo parent) { + RemoveParent(); parent?.AddChild(this); } From 092171982baa645907c5d50cf4da64c9291a077d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 8 Sep 2016 09:10:52 -0600 Subject: [PATCH 084/338] Modified the IHasParent interface to include another common method --- mRemoteV1/Connection/IHasParent.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mRemoteV1/Connection/IHasParent.cs b/mRemoteV1/Connection/IHasParent.cs index d43997fc7..16275a0e7 100644 --- a/mRemoteV1/Connection/IHasParent.cs +++ b/mRemoteV1/Connection/IHasParent.cs @@ -7,5 +7,7 @@ namespace mRemoteNG.Connection ContainerInfo Parent { get; } void SetParent(ContainerInfo containerInfo); + + void RemoveParent(); } } \ No newline at end of file From 5f8d274b945b1c0c4dff90531a49194797b2f557 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 8 Sep 2016 10:50:47 -0600 Subject: [PATCH 085/338] Drag and drop now working --- .../Window/ConnectionTreeWindow.Designer.cs | 2 ++ mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 34 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 7cb62c53f..0627f978a 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -112,6 +112,8 @@ namespace mRemoteNG.UI.Window this.olvConnections.Cursor = System.Windows.Forms.Cursors.Default; this.olvConnections.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; this.olvConnections.HideSelection = false; + this.olvConnections.IsSimpleDragSource = true; + this.olvConnections.IsSimpleDropSink = true; this.olvConnections.LabelEdit = true; this.olvConnections.Location = new System.Drawing.Point(0, 0); this.olvConnections.MultiSelect = false; diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index fb4226c4c..1d29820cf 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -98,9 +98,13 @@ namespace mRemoteNG.UI.Window olvConnections.CellClick += tvConnections_NodeMouseSingleClick; olvConnections.CellClick += tvConnections_NodeMouseDoubleClick; olvConnections.CellToolTipShowing += tvConnections_CellToolTipShowing; - + olvConnections.ModelCanDrop += OlvConnections_OnModelCanDrop; + olvConnections.ModelDropped += OlvConnections_OnModelDropped; } + + + private void PopulateTreeView() { olvConnections.Roots = ConnectionTreeModel.RootNodes; @@ -432,6 +436,34 @@ namespace mRemoteNG.UI.Window #endregion #region Drag and Drop + private void OlvConnections_OnModelCanDrop(object sender, ModelDropEventArgs e) + { + var draggedObject = e.SourceModels[0] as ConnectionInfo; + if (!NodeIsDraggable(draggedObject)) return; + var dropTarget = e.TargetModel as ContainerInfo; + if (dropTarget != null) + e.Effect = DragDropEffects.Move; + else + { + e.Effect = DragDropEffects.None; + } + } + + private bool NodeIsDraggable(ConnectionInfo node) + { + if (node == null || node is RootNodeInfo || node is PuttySessionInfo) return false; + return true; + } + + private void OlvConnections_OnModelDropped(object sender, ModelDropEventArgs e) + { + var draggedObject = (IHasParent)e.SourceModels[0]; + var dropTarget = e.TargetModel as ContainerInfo; + if (dropTarget != null) + draggedObject.SetParent(dropTarget); + e.RefreshObjects(); + } + //TODO Fix for TreeListView private static void tvConnections_DragDrop(object sender, DragEventArgs e) { From cfbcb502d8bd7434e83879082091f7b17c759b0f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 8 Sep 2016 10:54:36 -0600 Subject: [PATCH 086/338] Removed unnecessary code --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 119 -------------------- 1 file changed, 119 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 1d29820cf..8e958efc5 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -463,125 +463,6 @@ namespace mRemoteNG.UI.Window draggedObject.SetParent(dropTarget); e.RefreshObjects(); } - - //TODO Fix for TreeListView - private static void tvConnections_DragDrop(object sender, DragEventArgs e) - { - try - { - //Check that there is a TreeNode being dragged - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true) == false) - return; - - TreeView treeviewThatSentTheEvent = (TreeView)sender; - TreeNode nodeBeingDragged = (TreeNode)(e.Data.GetData("System.Windows.Forms.TreeNode")); - TreeNode nodeBeingTargetedByDragOverEvent = treeviewThatSentTheEvent.SelectedNode; - - TreeNodeMover treeNodeMover = new TreeNodeMover(nodeBeingDragged); - treeNodeMover.MoveNode(nodeBeingTargetedByDragOverEvent); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_DragDrop (UI.Window.ConnectionTreeWindow) failed", ex); - } - } - - //TODO Fix for TreeListView - private static void tvConnections_DragEnter(object sender, DragEventArgs e) - { - try - { - //See if there is a TreeNode being dragged - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) - { - //TreeNode found allow move effect - e.Effect = DragDropEffects.Move; - } - else - { - //No TreeNode found, prevent move - e.Effect = DragDropEffects.None; - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_DragEnter (UI.Window.ConnectionTreeWindow) failed", ex); - } - } - - //TODO Fix for TreeListView - private static void tvConnections_DragOver(object sender, DragEventArgs e) - { - try - { - //Check that there is a TreeNode being dragged - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true) == false) - { - return; - } - - //Get the TreeView raising the event (in case multiple on form) - TreeView selectedTreeview = (TreeView) sender; - - //As the mouse moves over nodes, provide feedback to - //the user by highlighting the node that is the - //current drop target - Point pt = ((TreeView) sender).PointToClient(new Point(e.X, e.Y)); - TreeNode targetNode = selectedTreeview.GetNodeAt(pt); - - //Select the node currently under the cursor - selectedTreeview.SelectedNode = targetNode; - - //Check that the selected node is not the dropNode and - //also that it is not a child of the dropNode and - //therefore an invalid target - TreeNode dropNode = (TreeNode) (e.Data.GetData("System.Windows.Forms.TreeNode")); - - while (targetNode != null) - { - var puttyRootInfo = targetNode.Tag as Root.PuttySessions.RootPuttySessionsNodeInfo; - if (puttyRootInfo != null || targetNode == dropNode) - { - e.Effect = DragDropEffects.None; - return ; - } - targetNode = targetNode.Parent; - } - - //Currently selected node is a suitable target - e.Effect = DragDropEffects.Move; - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_DragOver (UI.Window.ConnectionTreeWindow) failed", ex); - } - } - - //TODO Fix for TreeListView - private void tvConnections_ItemDrag(object sender, ItemDragEventArgs e) - { - try - { - TreeNode dragTreeNode = e.Item as TreeNode; - - if (dragTreeNode?.Tag == null) - { - return; - } - if (dragTreeNode.Tag is PuttySessionInfo|| !(dragTreeNode.Tag is ConnectionInfo|| dragTreeNode.Tag is ContainerInfo)) - { - tvConnections.SelectedNode = dragTreeNode; - return; - } - - //Set the drag node and initiate the DragDrop - DoDragDrop(e.Item, DragDropEffects.Move); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_ItemDrag (UI.Window.ConnectionTreeWindow) failed", ex); - } - } #endregion #region Tree Context Menu From 866aeab76b1e84e4dbb19a7ad9c50bc513d835b2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 08:25:56 -0600 Subject: [PATCH 087/338] Changed the drag-drop highlight color --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 8e958efc5..07083ddd0 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -45,6 +45,7 @@ namespace mRemoteNG.UI.Window }; FillImageList(); + SetDragAndDropProperties(); LinkModelToView(); SetEventHandlers(); } @@ -70,6 +71,12 @@ namespace mRemoteNG.UI.Window } } + private void SetDragAndDropProperties() + { + var dropSink = (SimpleDropSink)olvConnections.DropSink; + dropSink.FeedbackColor = Color.SteelBlue; + } + private void LinkModelToView() { olvNameColumn.AspectGetter = item => ((ConnectionInfo)item).Name; From d66f333bd50d673a04daa9ecdaf764ccaa955080 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 09:35:13 -0600 Subject: [PATCH 088/338] Refactored drag-n-drop code to its own class --- .../Tree/ConnectionTreeDragAndDropHandler.cs | 48 ++++++++++ mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 95 +++++-------------- mRemoteV1/mRemoteV1.csproj | 1 + 3 files changed, 73 insertions(+), 71 deletions(-) create mode 100644 mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs new file mode 100644 index 000000000..016b39f6a --- /dev/null +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -0,0 +1,48 @@ +using System.Linq; +using System.Windows.Forms; +using BrightIdeasSoftware; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree.Root; + +namespace mRemoteNG.Tree +{ + internal class ConnectionTreeDragAndDropHandler + { + internal void OnModelCanDrop(object sender, ModelDropEventArgs e) + { + e.Effect = DragDropEffects.None; + var draggedObject = e.SourceModels.Cast().First(); + var dropTarget = e.TargetModel as ContainerInfo; + if (AncestorDraggingOntoChild(draggedObject, dropTarget)) + e.InfoMessage = "Cannot drag parent node onto child."; + else if (!NodeIsDraggable(draggedObject)) + e.InfoMessage = "This node is not draggable"; + else + e.Effect = DragDropEffects.Move; + e.Handled = true; + } + + private bool NodeIsDraggable(ConnectionInfo node) + { + if (node == null || node is RootNodeInfo || node is PuttySessionInfo) return false; + return true; + } + + private bool AncestorDraggingOntoChild(ConnectionInfo source, ConnectionInfo target) + { + var sourceAsContainer = source as ContainerInfo; + return sourceAsContainer != null && sourceAsContainer.GetRecursiveChildList().Contains(target); + } + + internal void OnModelDropped(object sender, ModelDropEventArgs e) + { + var draggedObject = (IHasParent)e.SourceModels[0]; + var dropTarget = e.TargetModel as ContainerInfo; + if (dropTarget != null) + draggedObject.SetParent(dropTarget); + e.Handled = true; + e.RefreshObjects(); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 07083ddd0..29a676bcf 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -19,6 +19,7 @@ namespace mRemoteNG.UI.Window public partial class ConnectionTreeWindow { private ConnectionTreeModel _connectionTreeModel; + private ConnectionTreeDragAndDropHandler _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); private ToolTip DescriptionTooltip { get; } private ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; @@ -105,13 +106,10 @@ namespace mRemoteNG.UI.Window olvConnections.CellClick += tvConnections_NodeMouseSingleClick; olvConnections.CellClick += tvConnections_NodeMouseDoubleClick; olvConnections.CellToolTipShowing += tvConnections_CellToolTipShowing; - olvConnections.ModelCanDrop += OlvConnections_OnModelCanDrop; - olvConnections.ModelDropped += OlvConnections_OnModelDropped; + olvConnections.ModelCanDrop += _dragAndDropHandler.OnModelCanDrop; + olvConnections.ModelDropped += _dragAndDropHandler.OnModelDropped; } - - - private void PopulateTreeView() { olvConnections.Roots = ConnectionTreeModel.RootNodes; @@ -442,82 +440,44 @@ namespace mRemoteNG.UI.Window } #endregion - #region Drag and Drop - private void OlvConnections_OnModelCanDrop(object sender, ModelDropEventArgs e) - { - var draggedObject = e.SourceModels[0] as ConnectionInfo; - if (!NodeIsDraggable(draggedObject)) return; - var dropTarget = e.TargetModel as ContainerInfo; - if (dropTarget != null) - e.Effect = DragDropEffects.Move; - else - { - e.Effect = DragDropEffects.None; - } - } - - private bool NodeIsDraggable(ConnectionInfo node) - { - if (node == null || node is RootNodeInfo || node is PuttySessionInfo) return false; - return true; - } - - private void OlvConnections_OnModelDropped(object sender, ModelDropEventArgs e) - { - var draggedObject = (IHasParent)e.SourceModels[0]; - var dropTarget = e.TargetModel as ContainerInfo; - if (dropTarget != null) - draggedObject.SetParent(dropTarget); - e.RefreshObjects(); - } - #endregion - #region Tree Context Menu - //TODO Fix for TreeListView private void cMenTreeAddConnection_Click(object sender, EventArgs e) { AddConnection(); Runtime.SaveConnectionsBG(); } - //TODO Fix for TreeListView private void cMenTreeAddFolder_Click(object sender, EventArgs e) { AddFolder(); Runtime.SaveConnectionsBG(); } - //TODO Fix for TreeListView private void cMenTreeConnect_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.DoNotJump); } - //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); } - //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsNoCredentials_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.NoCredentials); } - //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); } - //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsConnectInFullscreen_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); } - //TODO Fix for TreeListView private void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(object sender, EventArgs e) { Runtime.OpenConnection(ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); @@ -525,7 +485,7 @@ namespace mRemoteNG.UI.Window private void cMenTreeDisconnect_Click(object sender, EventArgs e) { - DisconnectConnection(); + DisconnectConnection(SelectedNode); } private void cMenTreeToolsTransferFile_Click(object sender, EventArgs e) @@ -665,36 +625,29 @@ namespace mRemoteNG.UI.Window } //TODO Fix for TreeListView - private void DisconnectConnection() + private void DisconnectConnection(ConnectionInfo connectionInfo) { try { - if (tvConnections.SelectedNode != null) - { - if (tvConnections.SelectedNode.Tag is ConnectionInfo) - { - ConnectionInfo conI = (ConnectionInfo)tvConnections.SelectedNode.Tag; - for (int i = 0; i <= conI.OpenConnections.Count - 1; i++) - { - conI.OpenConnections[i].Disconnect(); - } - } - - if (tvConnections.SelectedNode.Tag is ContainerInfo) - { - foreach (TreeNode n in tvConnections.SelectedNode.Nodes) - { - if (n.Tag is ConnectionInfo) - { - ConnectionInfo conI = (ConnectionInfo)n.Tag; - for (int i = 0; i <= conI.OpenConnections.Count - 1; i++) - { - conI.OpenConnections[i].Disconnect(); - } - } - } - } - } + if (connectionInfo == null) return; + var nodeAsContainer = connectionInfo as ContainerInfo; + if (nodeAsContainer != null) + { + foreach (var child in nodeAsContainer.Children) + { + for (var i = 0; i <= child.OpenConnections.Count - 1; i++) + { + child.OpenConnections[i].Disconnect(); + } + } + } + else + { + for (var i = 0; i <= connectionInfo.OpenConnections.Count - 1; i++) + { + connectionInfo.OpenConnections[i].Disconnect(); + } + } } catch (Exception ex) { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 0f1f7fabe..4410073e7 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -194,6 +194,7 @@ + From 7c7d791f3193aff05619eaffc527cede43b7e1f0 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 09:40:18 -0600 Subject: [PATCH 089/338] Renamed a few variables and created a check for dragging a node onto itself --- .../Tree/ConnectionTreeDragAndDropHandler.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 016b39f6a..e7a8a060f 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -12,12 +12,14 @@ namespace mRemoteNG.Tree internal void OnModelCanDrop(object sender, ModelDropEventArgs e) { e.Effect = DragDropEffects.None; - var draggedObject = e.SourceModels.Cast().First(); + var dropSource = e.SourceModels.Cast().First(); var dropTarget = e.TargetModel as ContainerInfo; - if (AncestorDraggingOntoChild(draggedObject, dropTarget)) - e.InfoMessage = "Cannot drag parent node onto child."; - else if (!NodeIsDraggable(draggedObject)) + if (!NodeIsDraggable(dropSource)) e.InfoMessage = "This node is not draggable"; + else if (NodeDraggingOntoSelf(dropSource, dropTarget)) + e.InfoMessage = "Cannot drag node onto itself"; + else if (AncestorDraggingOntoChild(dropSource, dropTarget)) + e.InfoMessage = "Cannot drag parent node onto child."; else e.Effect = DragDropEffects.Move; e.Handled = true; @@ -29,6 +31,11 @@ namespace mRemoteNG.Tree return true; } + private bool NodeDraggingOntoSelf(ConnectionInfo source, ConnectionInfo target) + { + return source.Equals(target); + } + private bool AncestorDraggingOntoChild(ConnectionInfo source, ConnectionInfo target) { var sourceAsContainer = source as ContainerInfo; From b65fdbdd78985021657d7278f5a7a999d821f514 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 09:50:06 -0600 Subject: [PATCH 090/338] Overrode the Equals method for ConnectionInfo. Equality based on ConstantID --- mRemoteV1/Connection/ConnectionInfo.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index 70f1b048d..c157dfdbf 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -734,7 +734,15 @@ namespace mRemoteNG.Connection { RemoveParent(); } - #endregion + + public override bool Equals(object otherObject) + { + var otherObjectAsConnectionInfo = otherObject as ConnectionInfo; + if (otherObjectAsConnectionInfo == null) return false; + return otherObjectAsConnectionInfo.ConstantID == ConstantID; + } + + #endregion #region Public Enumerations [Flags()] From 00abd53b199c9df2c8604cb1f5b89497e511e802 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 09:56:30 -0600 Subject: [PATCH 091/338] Fixed issue with preventing dragging node onto itself. Feedback highlighting is disabled when attempting to drag un-draggable node. --- mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index e7a8a060f..8cad56ec6 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -12,16 +12,22 @@ namespace mRemoteNG.Tree internal void OnModelCanDrop(object sender, ModelDropEventArgs e) { e.Effect = DragDropEffects.None; + e.DropSink.EnableFeedback = true; var dropSource = e.SourceModels.Cast().First(); - var dropTarget = e.TargetModel as ContainerInfo; + var dropTarget = e.TargetModel as ConnectionInfo; + if (!NodeIsDraggable(dropSource)) + { e.InfoMessage = "This node is not draggable"; + e.DropSink.EnableFeedback = false; + } else if (NodeDraggingOntoSelf(dropSource, dropTarget)) e.InfoMessage = "Cannot drag node onto itself"; else if (AncestorDraggingOntoChild(dropSource, dropTarget)) e.InfoMessage = "Cannot drag parent node onto child."; else e.Effect = DragDropEffects.Move; + e.Handled = true; } From 4cdfeeecf21802356814882e8f40139f4c1b057f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 09:57:21 -0600 Subject: [PATCH 092/338] Turns out we didn't need a custom Equals comparer for ConnectionInfo. Rolling back since it's probably best to keep the default implementation unless we actually need a custom one. --- mRemoteV1/Connection/ConnectionInfo.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index c157dfdbf..eec907c31 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -734,14 +734,6 @@ namespace mRemoteNG.Connection { RemoveParent(); } - - public override bool Equals(object otherObject) - { - var otherObjectAsConnectionInfo = otherObject as ConnectionInfo; - if (otherObjectAsConnectionInfo == null) return false; - return otherObjectAsConnectionInfo.ConstantID == ConstantID; - } - #endregion #region Public Enumerations From 96485d9b9f81c68f74102e5795c0294459872592 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 10:11:53 -0600 Subject: [PATCH 093/338] Added check to prevent dragging a node onto the folder in which it already resides --- mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 8cad56ec6..0b83acaf3 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -25,6 +25,8 @@ namespace mRemoteNG.Tree e.InfoMessage = "Cannot drag node onto itself"; else if (AncestorDraggingOntoChild(dropSource, dropTarget)) e.InfoMessage = "Cannot drag parent node onto child."; + else if (DraggingOntoCurrentParent(dropSource, dropTarget)) + e.InfoMessage = "This node is already in this folder."; else e.Effect = DragDropEffects.Move; @@ -48,6 +50,12 @@ namespace mRemoteNG.Tree return sourceAsContainer != null && sourceAsContainer.GetRecursiveChildList().Contains(target); } + private bool DraggingOntoCurrentParent(ConnectionInfo source, ConnectionInfo target) + { + var targetAsContainer = target as ContainerInfo; + return targetAsContainer != null && targetAsContainer.Children.Contains(source); + } + internal void OnModelDropped(object sender, ModelDropEventArgs e) { var draggedObject = (IHasParent)e.SourceModels[0]; From 07c364cf0b7c0de5b55e06e917faba3a76689dc2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 10:18:52 -0600 Subject: [PATCH 094/338] Added support for changing the feedback color when dropping a node is allowed/denied. Removed unnecessary code --- mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs | 10 +++++++++- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 7 ------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 0b83acaf3..9a824987e 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Drawing; +using System.Linq; using System.Windows.Forms; using BrightIdeasSoftware; using mRemoteNG.Connection; @@ -9,10 +10,14 @@ namespace mRemoteNG.Tree { internal class ConnectionTreeDragAndDropHandler { + internal Color DropAllowedFeedbackColor = Color.Green; + internal Color DropDeniedFeedbackColor = Color.Red; + internal void OnModelCanDrop(object sender, ModelDropEventArgs e) { e.Effect = DragDropEffects.None; e.DropSink.EnableFeedback = true; + e.DropSink.FeedbackColor = DropDeniedFeedbackColor; var dropSource = e.SourceModels.Cast().First(); var dropTarget = e.TargetModel as ConnectionInfo; @@ -28,7 +33,10 @@ namespace mRemoteNG.Tree else if (DraggingOntoCurrentParent(dropSource, dropTarget)) e.InfoMessage = "This node is already in this folder."; else + { e.Effect = DragDropEffects.Move; + e.DropSink.FeedbackColor = DropAllowedFeedbackColor; + } e.Handled = true; } diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 29a676bcf..6a118ef2c 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -46,7 +46,6 @@ namespace mRemoteNG.UI.Window }; FillImageList(); - SetDragAndDropProperties(); LinkModelToView(); SetEventHandlers(); } @@ -72,12 +71,6 @@ namespace mRemoteNG.UI.Window } } - private void SetDragAndDropProperties() - { - var dropSink = (SimpleDropSink)olvConnections.DropSink; - dropSink.FeedbackColor = Color.SteelBlue; - } - private void LinkModelToView() { olvNameColumn.AspectGetter = item => ((ConnectionInfo)item).Name; From 22f43d63ecd196d4abd537aa0507113ee3b4f816 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 10:32:25 -0600 Subject: [PATCH 095/338] Renamed drag-n-drop handlers --- .../Tree/ConnectionTreeDragAndDropHandler.cs | 22 +++++++++---------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 9a824987e..04dbef8ce 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -13,7 +13,17 @@ namespace mRemoteNG.Tree internal Color DropAllowedFeedbackColor = Color.Green; internal Color DropDeniedFeedbackColor = Color.Red; - internal void OnModelCanDrop(object sender, ModelDropEventArgs e) + internal void HandleEvent_ModelDropped(object sender, ModelDropEventArgs e) + { + var draggedObject = (IHasParent)e.SourceModels[0]; + var dropTarget = e.TargetModel as ContainerInfo; + if (dropTarget != null) + draggedObject.SetParent(dropTarget); + e.Handled = true; + e.RefreshObjects(); + } + + internal void HandleEvent_ModelCanDrop(object sender, ModelDropEventArgs e) { e.Effect = DragDropEffects.None; e.DropSink.EnableFeedback = true; @@ -63,15 +73,5 @@ namespace mRemoteNG.Tree var targetAsContainer = target as ContainerInfo; return targetAsContainer != null && targetAsContainer.Children.Contains(source); } - - internal void OnModelDropped(object sender, ModelDropEventArgs e) - { - var draggedObject = (IHasParent)e.SourceModels[0]; - var dropTarget = e.TargetModel as ContainerInfo; - if (dropTarget != null) - draggedObject.SetParent(dropTarget); - e.Handled = true; - e.RefreshObjects(); - } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 6a118ef2c..ebe4a35ca 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -99,8 +99,8 @@ namespace mRemoteNG.UI.Window olvConnections.CellClick += tvConnections_NodeMouseSingleClick; olvConnections.CellClick += tvConnections_NodeMouseDoubleClick; olvConnections.CellToolTipShowing += tvConnections_CellToolTipShowing; - olvConnections.ModelCanDrop += _dragAndDropHandler.OnModelCanDrop; - olvConnections.ModelDropped += _dragAndDropHandler.OnModelDropped; + olvConnections.ModelCanDrop += _dragAndDropHandler.HandleEvent_ModelCanDrop; + olvConnections.ModelDropped += _dragAndDropHandler.HandleEvent_ModelDropped; } private void PopulateTreeView() From c3e14afe0aad8b84c2193467e70b01ecfd6dc98a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 10:33:20 -0600 Subject: [PATCH 096/338] Created localization strings for drag-n-drop feedback messages --- .../Resources/Language/Language.Designer.cs | 36 +++++++++++++++++++ mRemoteV1/Resources/Language/Language.resx | 12 +++++++ .../Tree/ConnectionTreeDragAndDropHandler.cs | 8 ++--- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/mRemoteV1/Resources/Language/Language.Designer.cs b/mRemoteV1/Resources/Language/Language.Designer.cs index 94b0df436..106ad4ec1 100644 --- a/mRemoteV1/Resources/Language/Language.Designer.cs +++ b/mRemoteV1/Resources/Language/Language.Designer.cs @@ -3477,6 +3477,42 @@ namespace mRemoteNG { } } + /// + /// Looks up a localized string similar to This node is already in this folder.. + /// + internal static string strNodeAlreadyInFolder { + get { + return ResourceManager.GetString("strNodeAlreadyInFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot drag node onto itself.. + /// + internal static string strNodeCannotDragOnSelf { + get { + return ResourceManager.GetString("strNodeCannotDragOnSelf", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot drag parent node onto child.. + /// + internal static string strNodeCannotDragParentOnChild { + get { + return ResourceManager.GetString("strNodeCannotDragParentOnChild", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This node is not draggable.. + /// + internal static string strNodeNotDraggable { + get { + return ResourceManager.GetString("strNodeNotDraggable", resourceCulture); + } + } + /// /// Looks up a localized string similar to No Ext. App specified.. /// diff --git a/mRemoteV1/Resources/Language/Language.resx b/mRemoteV1/Resources/Language/Language.resx index afdc2012a..0b8f3a895 100644 --- a/mRemoteV1/Resources/Language/Language.resx +++ b/mRemoteV1/Resources/Language/Language.resx @@ -2385,4 +2385,16 @@ mRemoteNG will now quit and begin with the installation. RDP Connection Timeout + + This node is already in this folder. + + + Cannot drag node onto itself. + + + Cannot drag parent node onto child. + + + This node is not draggable. + \ No newline at end of file diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 04dbef8ce..ffbd5d3db 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -33,15 +33,15 @@ namespace mRemoteNG.Tree if (!NodeIsDraggable(dropSource)) { - e.InfoMessage = "This node is not draggable"; + e.InfoMessage = Language.strNodeNotDraggable; e.DropSink.EnableFeedback = false; } else if (NodeDraggingOntoSelf(dropSource, dropTarget)) - e.InfoMessage = "Cannot drag node onto itself"; + e.InfoMessage = Language.strNodeCannotDragOnSelf; else if (AncestorDraggingOntoChild(dropSource, dropTarget)) - e.InfoMessage = "Cannot drag parent node onto child."; + e.InfoMessage = Language.strNodeCannotDragParentOnChild; else if (DraggingOntoCurrentParent(dropSource, dropTarget)) - e.InfoMessage = "This node is already in this folder."; + e.InfoMessage = Language.strNodeAlreadyInFolder; else { e.Effect = DragDropEffects.Move; From d439a0df000bec02e00b244e492a6a609367722e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 12:03:35 -0600 Subject: [PATCH 097/338] Created functions to rearrange child nodes. Moving nodes up/down now working --- mRemoteV1/Container/ContainerInfo.cs | 21 +++++++++++++++++++++ mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 6 ++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 1627db27e..bf0442858 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -55,6 +55,27 @@ namespace mRemoteNG.Container } } + public void SetChildPosition(ConnectionInfo child, int newIndex) + { + var originalIndex = Children.IndexOf(child); + if (originalIndex < 0 || originalIndex == newIndex || newIndex < 0) return; + if (newIndex > Children.Count) newIndex = Children.Count; + Children.Remove(child); + Children.Insert(newIndex, child); + } + + public void PromoteChild(ConnectionInfo child) + { + var originalIndex = Children.IndexOf(child); + SetChildPosition(child, originalIndex - 1); + } + + public void DemoteChild(ConnectionInfo child) + { + var originalIndex = Children.IndexOf(child); + SetChildPosition(child, originalIndex + 1); + } + public override void Dispose() { var tempChildList = Children.ToArray(); diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index ebe4a35ca..c0f7363ca 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -572,14 +572,16 @@ namespace mRemoteNG.UI.Window //TODO Fix for TreeListView private void cMenTreeMoveUp_Click(object sender, EventArgs e) { - ConnectionTree.MoveNodeUp(); + SelectedNode.Parent.PromoteChild(SelectedNode); + olvConnections.RefreshObject(SelectedNode); Runtime.SaveConnectionsBG(); } //TODO Fix for TreeListView private void cMenTreeMoveDown_Click(object sender, EventArgs e) { - ConnectionTree.MoveNodeDown(); + SelectedNode.Parent.DemoteChild(SelectedNode); + olvConnections.RefreshObject(SelectedNode); Runtime.SaveConnectionsBG(); } #endregion From e6f846107a3501bffb21c3c50cc7316ff038fbfe Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 9 Sep 2016 14:05:22 -0600 Subject: [PATCH 098/338] drag-n-drop now supports rearranging nodes. Fixed a small bug with child rearrangement --- mRemoteV1/Container/ContainerInfo.cs | 24 ++++++- .../Tree/ConnectionTreeDragAndDropHandler.cs | 67 ++++++++++++++++--- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 11 ++- 3 files changed, 87 insertions(+), 15 deletions(-) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index bf0442858..6b3996092 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -59,11 +59,33 @@ namespace mRemoteNG.Container { var originalIndex = Children.IndexOf(child); if (originalIndex < 0 || originalIndex == newIndex || newIndex < 0) return; - if (newIndex > Children.Count) newIndex = Children.Count; Children.Remove(child); + if (newIndex > Children.Count) newIndex = Children.Count; Children.Insert(newIndex, child); } + public void SetChildAbove(ConnectionInfo childToPromote, ConnectionInfo reference) + { + var originalIndex = Children.IndexOf(childToPromote); + var newIndex = Children.IndexOf(reference); + if (newIndex < 0) return; + if (originalIndex < newIndex) + SetChildPosition(childToPromote, newIndex - 1); + else if (originalIndex > newIndex) + SetChildPosition(childToPromote, newIndex); + } + + public void SetChildBelow(ConnectionInfo childToPromote, ConnectionInfo reference) + { + var originalIndex = Children.IndexOf(childToPromote); + var newIndex = Children.IndexOf(reference); + if (newIndex < 0) return; + if (originalIndex < newIndex) + SetChildPosition(childToPromote, newIndex); + else if (originalIndex > newIndex) + SetChildPosition(childToPromote, newIndex + 1); + } + public void PromoteChild(ConnectionInfo child) { var originalIndex = Children.IndexOf(child); diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index ffbd5d3db..d559f8600 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -15,10 +15,28 @@ namespace mRemoteNG.Tree internal void HandleEvent_ModelDropped(object sender, ModelDropEventArgs e) { - var draggedObject = (IHasParent)e.SourceModels[0]; - var dropTarget = e.TargetModel as ContainerInfo; - if (dropTarget != null) - draggedObject.SetParent(dropTarget); + var draggedObject = (ConnectionInfo)e.SourceModels[0]; + var dropTarget = e.TargetModel as ConnectionInfo; + if (dropTarget == null) return; + if (e.DropTargetLocation == DropTargetLocation.Item) + { + var dropTargetAsContainer = dropTarget as ContainerInfo; + if (dropTargetAsContainer == null) return; + draggedObject.SetParent(dropTargetAsContainer); + } + else if (e.DropTargetLocation == DropTargetLocation.AboveItem) + { + if (!draggedObject.Parent.Equals(dropTarget.Parent)) + draggedObject.SetParent(dropTarget.Parent); + + dropTarget.Parent.SetChildAbove(draggedObject, dropTarget); + } + else if (e.DropTargetLocation == DropTargetLocation.BelowItem) + { + if (!draggedObject.Parent.Equals(dropTarget.Parent)) + draggedObject.SetParent(dropTarget.Parent); + dropTarget.Parent.SetChildBelow(draggedObject, dropTarget); + } e.Handled = true; e.RefreshObjects(); } @@ -36,19 +54,46 @@ namespace mRemoteNG.Tree e.InfoMessage = Language.strNodeNotDraggable; e.DropSink.EnableFeedback = false; } - else if (NodeDraggingOntoSelf(dropSource, dropTarget)) - e.InfoMessage = Language.strNodeCannotDragOnSelf; - else if (AncestorDraggingOntoChild(dropSource, dropTarget)) + else if (e.DropTargetLocation == DropTargetLocation.Item) + HandleCanDropOnItem(dropSource, dropTarget, e); + else if (e.DropTargetLocation == DropTargetLocation.AboveItem || e.DropTargetLocation == DropTargetLocation.BelowItem) + HandleCanDropBetweenItems(dropSource, dropTarget, e); + else + return; + e.Handled = true; + } + + private void HandleCanDropOnItem(ConnectionInfo dropSource, ConnectionInfo dropTarget, ModelDropEventArgs e) + { + if (dropTarget is ContainerInfo) + { + if (NodeDraggingOntoSelf(dropSource, dropTarget)) + e.InfoMessage = Language.strNodeCannotDragOnSelf; + else if (AncestorDraggingOntoChild(dropSource, dropTarget)) + e.InfoMessage = Language.strNodeCannotDragParentOnChild; + else if (DraggingOntoCurrentParent(dropSource, dropTarget)) + e.InfoMessage = Language.strNodeAlreadyInFolder; + else + { + e.Effect = DragDropEffects.Move; + e.DropSink.FeedbackColor = DropAllowedFeedbackColor; + } + } + else + { + e.DropSink.EnableFeedback = false; + } + } + + private void HandleCanDropBetweenItems(ConnectionInfo dropSource, ConnectionInfo dropTarget, ModelDropEventArgs e) + { + if (AncestorDraggingOntoChild(dropSource, dropTarget)) e.InfoMessage = Language.strNodeCannotDragParentOnChild; - else if (DraggingOntoCurrentParent(dropSource, dropTarget)) - e.InfoMessage = Language.strNodeAlreadyInFolder; else { e.Effect = DragDropEffects.Move; e.DropSink.FeedbackColor = DropAllowedFeedbackColor; } - - e.Handled = true; } private bool NodeIsDraggable(ConnectionInfo node) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index c0f7363ca..d38aa631f 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -47,7 +47,8 @@ namespace mRemoteNG.UI.Window FillImageList(); LinkModelToView(); - SetEventHandlers(); + SetupDropSink(); + SetEventHandlers(); } private void FillImageList() @@ -79,6 +80,12 @@ namespace mRemoteNG.UI.Window olvConnections.ChildrenGetter = item => ((ContainerInfo)item).Children; } + private void SetupDropSink() + { + var dropSink = (SimpleDropSink)olvConnections.DropSink; + dropSink.CanDropBetween = true; + } + private object ConnectionImageGetter(object rowObject) { if (rowObject is RootNodeInfo) return "Root"; @@ -569,7 +576,6 @@ namespace mRemoteNG.UI.Window Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); } - //TODO Fix for TreeListView private void cMenTreeMoveUp_Click(object sender, EventArgs e) { SelectedNode.Parent.PromoteChild(SelectedNode); @@ -577,7 +583,6 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - //TODO Fix for TreeListView private void cMenTreeMoveDown_Click(object sender, EventArgs e) { SelectedNode.Parent.DemoteChild(SelectedNode); From c79ee465511ecef9aff346199846ce40168ff88b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 12 Sep 2016 08:49:32 -0600 Subject: [PATCH 099/338] Removed unnecessary code --- mRemoteV1/App/Runtime.cs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 444b6ea0f..f3619e25c 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -675,7 +675,6 @@ namespace mRemoteNG.App } } - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo ConnectionInfo) { @@ -689,21 +688,6 @@ namespace mRemoteNG.App } } - - //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo ConnectionInfo, Form ConnectionForm) - { - try - { - OpenConnectionFinal(ConnectionInfo, ConnectionInfo.Force.None, ConnectionForm); - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo ConnectionInfo, Form ConnectionForm, ConnectionInfo.Force Force) { @@ -717,7 +701,6 @@ namespace mRemoteNG.App } } - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force) { @@ -731,7 +714,6 @@ namespace mRemoteNG.App } } - //TODO Fix for TreeListView private static void OpenConnectionFinal(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force, Form ConForm) { From 3ad8a1478646e5b567a9489cf772c3b11a98b1a5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 12 Sep 2016 09:52:12 -0600 Subject: [PATCH 100/338] Initial refactor of connection initiation (which is heavily tied into how the connection tree was previously being managed) --- mRemoteV1/App/Runtime.cs | 227 +----------- mRemoteV1/Connection/ConnectionInitiator.cs | 383 ++++++++++++++++++++ mRemoteV1/mRemoteV1.csproj | 1 + 3 files changed, 385 insertions(+), 226 deletions(-) create mode 100644 mRemoteV1/Connection/ConnectionInitiator.cs diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index f3619e25c..804f1ba66 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -647,9 +647,7 @@ namespace mRemoteNG.App try { if (Windows.treeForm.tvConnections.SelectedNode.Tag == null) - { return; - } if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) { @@ -717,148 +715,7 @@ namespace mRemoteNG.App //TODO Fix for TreeListView private static void OpenConnectionFinal(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force, Form ConForm) { - try - { - if (ConnectionInfo.Hostname == "" && ConnectionInfo.Protocol != ProtocolType.IntApp) - { - MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strConnectionOpenFailedNoHostname); - return; - } - - StartPreConnectionExternalApp(ConnectionInfo); - - if ((Force & ConnectionInfo.Force.DoNotJump) != ConnectionInfo.Force.DoNotJump) - { - if (SwitchToOpenConnection(ConnectionInfo)) - { - return; - } - } - - ProtocolFactory protocolFactory = new ProtocolFactory(); - ProtocolBase newProtocol = protocolFactory.CreateProtocol(ConnectionInfo); - - string connectionPanel = SetConnectionPanel(ConnectionInfo, Force); - Form connectionForm = SetConnectionForm(ConForm, connectionPanel); - Control connectionContainer = SetConnectionContainer(ConnectionInfo, connectionForm); - SetConnectionFormEventHandlers(newProtocol, connectionForm); - SetConnectionEventHandlers(newProtocol); - BuildConnectionInterfaceController(ConnectionInfo, newProtocol, connectionContainer); - - newProtocol.Force = Force; - - if (newProtocol.Initialize() == false) - { - newProtocol.Close(); - return; - } - - if (newProtocol.Connect() == false) - { - newProtocol.Close(); - return; - } - - ConnectionInfo.OpenConnections.Add(newProtocol); - SetTreeNodeImages(ConnectionInfo); - frmMain.Default.SelectedConnection = ConnectionInfo; - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - - private static void BuildConnectionInterfaceController(ConnectionInfo ConnectionInfo, ProtocolBase newProtocol, Control connectionContainer) - { - newProtocol.InterfaceControl = new InterfaceControl(connectionContainer, newProtocol, ConnectionInfo); - } - - private static void SetConnectionFormEventHandlers(ProtocolBase newProtocol, Form connectionForm) - { - newProtocol.Closed += ((ConnectionWindow)connectionForm).Prot_Event_Closed; - } - - private static Control SetConnectionContainer(ConnectionInfo ConnectionInfo, Form connectionForm) - { - Control connectionContainer = ((ConnectionWindow)connectionForm).AddConnectionTab(ConnectionInfo); - - if (ConnectionInfo.Protocol == ProtocolType.IntApp) - { - if (GetExtAppByName(ConnectionInfo.ExtApp).Icon != null) - ((TabPage) connectionContainer).Icon = GetExtAppByName(ConnectionInfo.ExtApp).Icon; - } - return connectionContainer; - } - - private static void SetTreeNodeImages(ConnectionInfo ConnectionInfo) - { - if (ConnectionInfo.IsQuickConnect == false) - { - if (ConnectionInfo.Protocol != ProtocolType.IntApp) - { - ConnectionTreeNode.SetNodeImage(ConnectionInfo.TreeNode, TreeImageType.ConnectionOpen); - } - else - { - ExternalTool extApp = GetExtAppByName(ConnectionInfo.ExtApp); - if (extApp != null) - { - if (extApp.TryIntegrate && ConnectionInfo.TreeNode != null) - { - ConnectionTreeNode.SetNodeImage(ConnectionInfo.TreeNode, TreeImageType.ConnectionOpen); - } - } - } - } - } - - private static void SetConnectionEventHandlers(ProtocolBase newProtocol) - { - newProtocol.Disconnected += Prot_Event_Disconnected; - newProtocol.Connected += Prot_Event_Connected; - newProtocol.Closed += Prot_Event_Closed; - newProtocol.ErrorOccured += Prot_Event_ErrorOccured; - } - - private static Form SetConnectionForm(Form ConForm, string connectionPanel) - { - var connectionForm = ConForm ?? WindowList.FromString(connectionPanel); - - if (connectionForm == null) - connectionForm = AddPanel(connectionPanel); - else - ((ConnectionWindow)connectionForm).Show(frmMain.Default.pnlDock); - - connectionForm.Focus(); - return connectionForm; - } - - private static string SetConnectionPanel(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force) - { - string connectionPanel = ""; - if (ConnectionInfo.Panel == "" || (Force & ConnectionInfo.Force.OverridePanel) == ConnectionInfo.Force.OverridePanel | Settings.Default.AlwaysShowPanelSelectionDlg) - { - frmChoosePanel frmPnl = new frmChoosePanel(); - if (frmPnl.ShowDialog() == DialogResult.OK) - { - connectionPanel = frmPnl.Panel; - } - } - else - { - connectionPanel = ConnectionInfo.Panel; - } - return connectionPanel; - } - - private static void StartPreConnectionExternalApp(ConnectionInfo ConnectionInfo) - { - if (ConnectionInfo.PreExtApp != "") - { - ExternalTool extA = GetExtAppByName(ConnectionInfo.PreExtApp); - extA?.Start(ConnectionInfo); - } + ConnectionInitiator.OpenConnection(ConnectionInfo, Force, ConForm); } public static bool SwitchToOpenConnection(ConnectionInfo nCi) @@ -878,87 +735,6 @@ namespace mRemoteNG.App } #endregion - #region Event Handlers - - private static void Prot_Event_Disconnected(object sender, string DisconnectedMessage) - { - try - { - MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(Language.strProtocolEventDisconnected, DisconnectedMessage), true); - - ProtocolBase Prot = (ProtocolBase)sender; - if (Prot.InterfaceControl.Info.Protocol == ProtocolType.RDP) - { - string ReasonCode = DisconnectedMessage.Split("\r\n".ToCharArray())[0]; - string desc = DisconnectedMessage.Replace("\r\n", " "); - - if (Convert.ToInt32(ReasonCode) > 3) - { - MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strRdpDisconnected + Environment.NewLine + desc); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, string.Format(Language.strProtocolEventDisconnectFailed, ex.Message), true); - } - } - - private static void Prot_Event_Closed(object sender) - { - try - { - ProtocolBase Prot = (ProtocolBase)sender; - MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnenctionCloseEvent, true); - MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnenctionClosedByUser, Prot.InterfaceControl.Info.Hostname, Prot.InterfaceControl.Info.Protocol.ToString(), Environment.UserName)); - Prot.InterfaceControl.Info.OpenConnections.Remove(Prot); - - if (Prot.InterfaceControl.Info.OpenConnections.Count < 1 && Prot.InterfaceControl.Info.IsQuickConnect == false) - { - ConnectionTreeNode.SetNodeImage(Prot.InterfaceControl.Info.TreeNode, TreeImageType.ConnectionClosed); - } - - if (Prot.InterfaceControl.Info.PostExtApp != "") - { - ExternalTool extA = GetExtAppByName(Prot.InterfaceControl.Info.PostExtApp); - extA?.Start(Prot.InterfaceControl.Info); - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnenctionCloseEventFailed + Environment.NewLine + ex.Message, true); - } - } - - private static void Prot_Event_Connected(object sender) - { - ProtocolBase prot = (ProtocolBase)sender; - MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnectionEventConnected, true); - MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnectionEventConnectedDetail, prot.InterfaceControl.Info.Hostname, prot.InterfaceControl.Info.Protocol.ToString(), Environment.UserName, prot.InterfaceControl.Info.Description, prot.InterfaceControl.Info.UserField)); - } - - private static void Prot_Event_ErrorOccured(object sender, string ErrorMessage) - { - try - { - MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnectionEventErrorOccured, true); - ProtocolBase Prot = (ProtocolBase)sender; - - if (Prot.InterfaceControl.Info.Protocol == ProtocolType.RDP) - { - if (Convert.ToInt32(ErrorMessage) > -1) - { - MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strConnectionRdpErrorDetail, ErrorMessage, ProtocolRDP.FatalErrors.GetError(ErrorMessage))); - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionEventConnectionFailed + Environment.NewLine + ex.Message, true); - } - } - #endregion - #region External Apps public static ExternalTool GetExtAppByName(string Name) { @@ -972,7 +748,6 @@ namespace mRemoteNG.App #endregion #region Misc - private static void GoToURL(string URL) { ConnectionInfo connectionInfo = new ConnectionInfo(); diff --git a/mRemoteV1/Connection/ConnectionInitiator.cs b/mRemoteV1/Connection/ConnectionInitiator.cs new file mode 100644 index 000000000..487ad1d8e --- /dev/null +++ b/mRemoteV1/Connection/ConnectionInitiator.cs @@ -0,0 +1,383 @@ +using System; +using System.Windows.Forms; +using mRemoteNG.App; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Messages; +using mRemoteNG.Tools; +using mRemoteNG.Tree; +using mRemoteNG.UI.Forms; +using mRemoteNG.UI.Window; +using TabPage = Crownwood.Magic.Controls.TabPage; + + +namespace mRemoteNG.Connection +{ + public static class ConnectionInitiator + { + //TODO Fix for TreeListView + public static void OpenConnection() + { + try + { + OpenConnection(ConnectionInfo.Force.None); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); + } + } + + //TODO Fix for TreeListView + public static void OpenConnection(ConnectionInfo.Force Force) + { + try + { + if (Windows.treeForm.tvConnections.SelectedNode.Tag == null) + return; + + if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) + { + OpenConnection((ConnectionInfo)Windows.treeForm.tvConnections.SelectedNode.Tag, Force); + } + else if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Container) + { + foreach (TreeNode tNode in ConnectionTree.SelectedNode.Nodes) + { + if (ConnectionTreeNode.GetNodeType(tNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) + { + if (tNode.Tag != null) + { + OpenConnection((ConnectionInfo)tNode.Tag, Force); + } + } + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); + } + } + + //TODO Fix for TreeListView + public static void OpenConnection(ConnectionInfo ConnectionInfo) + { + try + { + OpenConnection(ConnectionInfo, ConnectionInfo.Force.None); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); + } + } + + //TODO Fix for TreeListView + public static void OpenConnection(ConnectionInfo ConnectionInfo, Form ConnectionForm, ConnectionInfo.Force Force) + { + try + { + OpenConnection(ConnectionInfo, Force, ConnectionForm); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); + } + } + + //TODO Fix for TreeListView + public static void OpenConnection(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force) + { + try + { + OpenConnection(ConnectionInfo, Force, null); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); + } + } + + //TODO Fix for TreeListView + public static void OpenConnection(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force, Form ConForm) + { + try + { + if (ConnectionInfo.Hostname == "" && ConnectionInfo.Protocol != ProtocolType.IntApp) + { + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strConnectionOpenFailedNoHostname); + return; + } + + StartPreConnectionExternalApp(ConnectionInfo); + + if ((Force & ConnectionInfo.Force.DoNotJump) != ConnectionInfo.Force.DoNotJump) + { + if (SwitchToOpenConnection(ConnectionInfo)) + return; + } + + var protocolFactory = new ProtocolFactory(); + var newProtocol = protocolFactory.CreateProtocol(ConnectionInfo); + + string connectionPanel = SetConnectionPanel(ConnectionInfo, Force); + Form connectionForm = SetConnectionForm(ConForm, connectionPanel); + Control connectionContainer = SetConnectionContainer(ConnectionInfo, connectionForm); + SetConnectionFormEventHandlers(newProtocol, connectionForm); + SetConnectionEventHandlers(newProtocol); + BuildConnectionInterfaceController(ConnectionInfo, newProtocol, connectionContainer); + + newProtocol.Force = Force; + + if (newProtocol.Initialize() == false) + { + newProtocol.Close(); + return; + } + + if (newProtocol.Connect() == false) + { + newProtocol.Close(); + return; + } + + ConnectionInfo.OpenConnections.Add(newProtocol); + SetTreeNodeImages(ConnectionInfo); + frmMain.Default.SelectedConnection = ConnectionInfo; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); + } + } + + private static void StartPreConnectionExternalApp(ConnectionInfo ConnectionInfo) + { + if (ConnectionInfo.PreExtApp != "") + { + var extA = GetExtAppByName(ConnectionInfo.PreExtApp); + extA?.Start(ConnectionInfo); + } + } + + public static ExternalTool GetExtAppByName(string Name) + { + foreach (ExternalTool extA in Runtime.ExternalTools) + { + if (extA.DisplayName == Name) + return extA; + } + return null; + } + + public static bool SwitchToOpenConnection(ConnectionInfo nCi) + { + var IC = FindConnectionContainer(nCi); + if (IC != null) + { + var connectionWindow = (ConnectionWindow)IC.FindForm(); + connectionWindow?.Focus(); + var findForm = (ConnectionWindow)IC.FindForm(); + findForm?.Show(frmMain.Default.pnlDock); + var tabPage = (TabPage)IC.Parent; + tabPage.Selected = true; + return true; + } + return false; + } + + private static InterfaceControl FindConnectionContainer(ConnectionInfo connectionInfo) + { + if (connectionInfo.OpenConnections.Count > 0) + { + for (int i = 0; i <= Runtime.WindowList.Count - 1; i++) + { + if (Runtime.WindowList[i] is ConnectionWindow) + { + var connectionWindow = (ConnectionWindow)Runtime.WindowList[i]; + if (connectionWindow.TabController != null) + { + foreach (TabPage t in connectionWindow.TabController.TabPages) + { + if (t.Controls[0] != null && t.Controls[0] is InterfaceControl) + { + var IC = (InterfaceControl)t.Controls[0]; + if (IC.Info == connectionInfo) + { + return IC; + } + } + } + } + } + } + } + return null; + } + + private static string SetConnectionPanel(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force) + { + string connectionPanel = ""; + if (ConnectionInfo.Panel == "" || (Force & ConnectionInfo.Force.OverridePanel) == ConnectionInfo.Force.OverridePanel | Settings.Default.AlwaysShowPanelSelectionDlg) + { + frmChoosePanel frmPnl = new frmChoosePanel(); + if (frmPnl.ShowDialog() == DialogResult.OK) + { + connectionPanel = frmPnl.Panel; + } + } + else + { + connectionPanel = ConnectionInfo.Panel; + } + return connectionPanel; + } + + private static Form SetConnectionForm(Form ConForm, string connectionPanel) + { + var connectionForm = ConForm ?? Runtime.WindowList.FromString(connectionPanel); + + if (connectionForm == null) + connectionForm = Runtime.AddPanel(connectionPanel); + else + ((ConnectionWindow)connectionForm).Show(frmMain.Default.pnlDock); + + connectionForm.Focus(); + return connectionForm; + } + + private static Control SetConnectionContainer(ConnectionInfo ConnectionInfo, Form connectionForm) + { + Control connectionContainer = ((ConnectionWindow)connectionForm).AddConnectionTab(ConnectionInfo); + + if (ConnectionInfo.Protocol == ProtocolType.IntApp) + { + if (GetExtAppByName(ConnectionInfo.ExtApp).Icon != null) + ((TabPage)connectionContainer).Icon = GetExtAppByName(ConnectionInfo.ExtApp).Icon; + } + return connectionContainer; + } + + private static void SetConnectionFormEventHandlers(ProtocolBase newProtocol, Form connectionForm) + { + newProtocol.Closed += ((ConnectionWindow)connectionForm).Prot_Event_Closed; + } + + private static void SetConnectionEventHandlers(ProtocolBase newProtocol) + { + newProtocol.Disconnected += Prot_Event_Disconnected; + newProtocol.Connected += Prot_Event_Connected; + newProtocol.Closed += Prot_Event_Closed; + newProtocol.ErrorOccured += Prot_Event_ErrorOccured; + } + + private static void SetTreeNodeImages(ConnectionInfo ConnectionInfo) + { + if (ConnectionInfo.IsQuickConnect == false) + { + if (ConnectionInfo.Protocol != ProtocolType.IntApp) + { + ConnectionTreeNode.SetNodeImage(ConnectionInfo.TreeNode, TreeImageType.ConnectionOpen); + } + else + { + ExternalTool extApp = GetExtAppByName(ConnectionInfo.ExtApp); + if (extApp != null) + { + if (extApp.TryIntegrate && ConnectionInfo.TreeNode != null) + { + ConnectionTreeNode.SetNodeImage(ConnectionInfo.TreeNode, TreeImageType.ConnectionOpen); + } + } + } + } + } + + private static void BuildConnectionInterfaceController(ConnectionInfo ConnectionInfo, ProtocolBase newProtocol, Control connectionContainer) + { + newProtocol.InterfaceControl = new InterfaceControl(connectionContainer, newProtocol, ConnectionInfo); + } + + + + + private static void Prot_Event_Disconnected(object sender, string DisconnectedMessage) + { + try + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(Language.strProtocolEventDisconnected, DisconnectedMessage), true); + + ProtocolBase Prot = (ProtocolBase)sender; + if (Prot.InterfaceControl.Info.Protocol == ProtocolType.RDP) + { + string ReasonCode = DisconnectedMessage.Split("\r\n".ToCharArray())[0]; + string desc = DisconnectedMessage.Replace("\r\n", " "); + + if (Convert.ToInt32(ReasonCode) > 3) + { + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strRdpDisconnected + Environment.NewLine + desc); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, string.Format(Language.strProtocolEventDisconnectFailed, ex.Message), true); + } + } + + private static void Prot_Event_Closed(object sender) + { + try + { + ProtocolBase Prot = (ProtocolBase)sender; + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnenctionCloseEvent, true); + Runtime.MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnenctionClosedByUser, Prot.InterfaceControl.Info.Hostname, Prot.InterfaceControl.Info.Protocol.ToString(), Environment.UserName)); + Prot.InterfaceControl.Info.OpenConnections.Remove(Prot); + + if (Prot.InterfaceControl.Info.OpenConnections.Count < 1 && Prot.InterfaceControl.Info.IsQuickConnect == false) + { + ConnectionTreeNode.SetNodeImage(Prot.InterfaceControl.Info.TreeNode, TreeImageType.ConnectionClosed); + } + + if (Prot.InterfaceControl.Info.PostExtApp != "") + { + ExternalTool extA = GetExtAppByName(Prot.InterfaceControl.Info.PostExtApp); + extA?.Start(Prot.InterfaceControl.Info); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnenctionCloseEventFailed + Environment.NewLine + ex.Message, true); + } + } + + private static void Prot_Event_Connected(object sender) + { + ProtocolBase prot = (ProtocolBase)sender; + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnectionEventConnected, true); + Runtime.MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnectionEventConnectedDetail, prot.InterfaceControl.Info.Hostname, prot.InterfaceControl.Info.Protocol.ToString(), Environment.UserName, prot.InterfaceControl.Info.Description, prot.InterfaceControl.Info.UserField)); + } + + private static void Prot_Event_ErrorOccured(object sender, string ErrorMessage) + { + try + { + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnectionEventErrorOccured, true); + ProtocolBase Prot = (ProtocolBase)sender; + + if (Prot.InterfaceControl.Info.Protocol == ProtocolType.RDP) + { + if (Convert.ToInt32(ErrorMessage) > -1) + { + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strConnectionRdpErrorDetail, ErrorMessage, ProtocolRDP.FatalErrors.GetError(ErrorMessage))); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionEventConnectionFailed + Environment.NewLine + ex.Message, true); + } + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 7094a5662..812761ceb 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -171,6 +171,7 @@ + From 6ccbe69c02d7a75a96e7892e2cafd66ab523af3e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 12 Sep 2016 10:00:53 -0600 Subject: [PATCH 101/338] Retargeted all Runtime.OpenConnection() to ConnectionInitiator.OpenConnection(). Will help with later iterative refactors --- mRemoteV1/App/Runtime.cs | 108 +----------------- .../Connections/SqlConnectionsLoader.cs | 2 +- mRemoteV1/Tools/ExternalTool.cs | 2 +- mRemoteV1/Tools/Tools.Controls.cs | 3 +- mRemoteV1/UI/Forms/frmMain.cs | 6 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 22 ++-- mRemoteV1/UI/Window/ConnectionWindow.cs | 6 +- 7 files changed, 22 insertions(+), 127 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 804f1ba66..c5d7008e3 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -627,112 +627,6 @@ namespace mRemoteNG.App return null; } } - - //TODO Fix for TreeListView - public static void OpenConnection() - { - try - { - OpenConnection(ConnectionInfo.Force.None); - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - - //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo.Force Force) - { - try - { - if (Windows.treeForm.tvConnections.SelectedNode.Tag == null) - return; - - if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) - { - OpenConnection((ConnectionInfo)Windows.treeForm.tvConnections.SelectedNode.Tag, Force); - } - else if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Container) - { - foreach (TreeNode tNode in ConnectionTree.SelectedNode.Nodes) - { - if (ConnectionTreeNode.GetNodeType(tNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) - { - if (tNode.Tag != null) - { - OpenConnection((ConnectionInfo)tNode.Tag, Force); - } - } - } - } - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - - //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo ConnectionInfo) - { - try - { - OpenConnection(ConnectionInfo, ConnectionInfo.Force.None); - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - - //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo ConnectionInfo, Form ConnectionForm, ConnectionInfo.Force Force) - { - try - { - OpenConnectionFinal(ConnectionInfo, Force, ConnectionForm); - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - - //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force) - { - try - { - OpenConnectionFinal(ConnectionInfo, Force, null); - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - - //TODO Fix for TreeListView - private static void OpenConnectionFinal(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force, Form ConForm) - { - ConnectionInitiator.OpenConnection(ConnectionInfo, Force, ConForm); - } - - public static bool SwitchToOpenConnection(ConnectionInfo nCi) - { - InterfaceControl IC = FindConnectionContainer(nCi); - if (IC != null) - { - var connectionWindow = (ConnectionWindow)IC.FindForm(); - connectionWindow?.Focus(); - var findForm = (ConnectionWindow)IC.FindForm(); - findForm?.Show(frmMain.Default.pnlDock); - TabPage tabPage = (TabPage)IC.Parent; - tabPage.Selected = true; - return true; - } - return false; - } #endregion #region External Apps @@ -765,7 +659,7 @@ namespace mRemoteNG.App } connectionInfo.SetDefaultPort(); connectionInfo.IsQuickConnect = true; - OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump); } public static void GoToWebsite() diff --git a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs index 4312652ca..980fb89ac 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs @@ -138,7 +138,7 @@ namespace mRemoteNG.Config.Connections foreach (ConnectionInfo conI in ConnectionList) { if (conI.PleaseConnect) - Runtime.OpenConnection(conI); + ConnectionInitiator.OpenConnection(conI); } } diff --git a/mRemoteV1/Tools/ExternalTool.cs b/mRemoteV1/Tools/ExternalTool.cs index 80c015d73..709c7a02b 100644 --- a/mRemoteV1/Tools/ExternalTool.cs +++ b/mRemoteV1/Tools/ExternalTool.cs @@ -80,7 +80,7 @@ namespace mRemoteNG.Tools try { ConnectionInfo newConnectionInfo = BuildConnectionInfoForIntegratedApp(); - Runtime.OpenConnection(newConnectionInfo); + ConnectionInitiator.OpenConnection(newConnectionInfo); } catch (Exception ex) { diff --git a/mRemoteV1/Tools/Tools.Controls.cs b/mRemoteV1/Tools/Tools.Controls.cs index 03a41879b..fcdac3baf 100644 --- a/mRemoteV1/Tools/Tools.Controls.cs +++ b/mRemoteV1/Tools/Tools.Controls.cs @@ -1,6 +1,7 @@ using System; using System.Windows.Forms; using mRemoteNG.App; +using mRemoteNG.Connection; using mRemoteNG.UI.Forms; @@ -210,7 +211,7 @@ namespace mRemoteNG.Tools { ShowForm(); } - App.Runtime.OpenConnection((mRemoteNG.Connection.ConnectionInfo)((System.Windows.Forms.Control)sender).Tag); + ConnectionInitiator.OpenConnection((mRemoteNG.Connection.ConnectionInfo)((System.Windows.Forms.Control)sender).Tag); } } } diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index bd658916e..3416e2982 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -616,7 +616,7 @@ namespace mRemoteNG.UI.Forms foreach (var i in ICList) { i.Protocol.Close(); - Runtime.OpenConnection(i.Info, ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(i.Info, ConnectionInfo.Force.DoNotJump); } // throw it on the garbage collector @@ -887,7 +887,7 @@ namespace mRemoteNG.UI.Forms return ; } cmbQuickConnect.Add(connectionInfo); - Runtime.OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump); } catch (Exception ex) { @@ -1009,7 +1009,7 @@ namespace mRemoteNG.UI.Forms var tag = ((ToolStripMenuItem)sender).Tag as ConnectionInfo; if (tag != null) { - Runtime.OpenConnection(tag); + ConnectionInitiator.OpenConnection(tag); } } } diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index d38aa631f..ae3220e71 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -216,7 +216,7 @@ namespace mRemoteNG.UI.Window var previouslyOpenedConnections = connectionInfoList.Where(item => item.PleaseConnect); foreach (var connectionInfo in previouslyOpenedConnections) { - Runtime.OpenConnection(connectionInfo); + ConnectionInitiator.OpenConnection(connectionInfo); } } @@ -272,10 +272,10 @@ namespace mRemoteNG.UI.Window //if (e.Button != MouseButtons.Left) return; if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; if (Settings.Default.SingleClickOnConnectionOpensIt) - Runtime.OpenConnection(); + ConnectionInitiator.OpenConnection(); if (Settings.Default.SingleClickSwitchesToOpenConnection) - Runtime.SwitchToOpenConnection(SelectedNode); + ConnectionInitiator.SwitchToOpenConnection(SelectedNode); } catch (Exception ex) { @@ -291,7 +291,7 @@ namespace mRemoteNG.UI.Window if (clickedNode?.GetTreeNodeType() == TreeNodeType.Connection | clickedNode?.GetTreeNodeType() == TreeNodeType.PuttySession) { - Runtime.OpenConnection(); + ConnectionInitiator.OpenConnection(); } } @@ -455,32 +455,32 @@ namespace mRemoteNG.UI.Window private void cMenTreeConnect_Click(object sender, EventArgs e) { - Runtime.OpenConnection(ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(ConnectionInfo.Force.DoNotJump); } private void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(object sender, EventArgs e) { - Runtime.OpenConnection(ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); } private void cMenTreeConnectWithOptionsNoCredentials_Click(object sender, EventArgs e) { - Runtime.OpenConnection(ConnectionInfo.Force.NoCredentials); + ConnectionInitiator.OpenConnection(ConnectionInfo.Force.NoCredentials); } private void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(object sender, EventArgs e) { - Runtime.OpenConnection(ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); } private void cMenTreeConnectWithOptionsConnectInFullscreen_Click(object sender, EventArgs e) { - Runtime.OpenConnection(ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); } private void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(object sender, EventArgs e) { - Runtime.OpenConnection(ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); } private void cMenTreeDisconnect_Click(object sender, EventArgs e) @@ -838,7 +838,7 @@ namespace mRemoteNG.UI.Window if (tvConnections.SelectedNode.Tag is ConnectionInfo) { e.Handled = true; - Runtime.OpenConnection(); + ConnectionInitiator.OpenConnection(); } else { diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index 756469363..bd8b3de76 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -550,7 +550,7 @@ namespace mRemoteNG.UI.Window { if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) { - Runtime.OpenConnection((ConnectionInfo)((TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode", true)).Tag, this, ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection((ConnectionInfo)((TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode", true)).Tag, this, ConnectionInfo.Force.DoNotJump); } } @@ -1001,7 +1001,7 @@ namespace mRemoteNG.UI.Window if (TabController.SelectedTab?.Tag is InterfaceControl) { InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - Runtime.OpenConnection(IC.Info, ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(IC.Info, ConnectionInfo.Force.DoNotJump); _ignoreChangeSelectedTabClick = false; } } @@ -1019,7 +1019,7 @@ namespace mRemoteNG.UI.Window { InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; IC.Protocol.Close(); - Runtime.OpenConnection(IC.Info, ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(IC.Info, ConnectionInfo.Force.DoNotJump); } } catch (Exception ex) From 79dee21f9b07b8c05bfc1a7bea7bef40fdcea06a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 12 Sep 2016 10:07:05 -0600 Subject: [PATCH 102/338] Removed empty arg overload for OpenConnection(). We always require a connectioninfo object --- mRemoteV1/Connection/ConnectionInitiator.cs | 13 ------------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 6 +++--- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInitiator.cs b/mRemoteV1/Connection/ConnectionInitiator.cs index 487ad1d8e..a1587dbc7 100644 --- a/mRemoteV1/Connection/ConnectionInitiator.cs +++ b/mRemoteV1/Connection/ConnectionInitiator.cs @@ -15,19 +15,6 @@ namespace mRemoteNG.Connection { public static class ConnectionInitiator { - //TODO Fix for TreeListView - public static void OpenConnection() - { - try - { - OpenConnection(ConnectionInfo.Force.None); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo.Force Force) { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index ae3220e71..1535240dd 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -272,7 +272,7 @@ namespace mRemoteNG.UI.Window //if (e.Button != MouseButtons.Left) return; if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; if (Settings.Default.SingleClickOnConnectionOpensIt) - ConnectionInitiator.OpenConnection(); + ConnectionInitiator.OpenConnection(SelectedNode); if (Settings.Default.SingleClickSwitchesToOpenConnection) ConnectionInitiator.SwitchToOpenConnection(SelectedNode); @@ -291,7 +291,7 @@ namespace mRemoteNG.UI.Window if (clickedNode?.GetTreeNodeType() == TreeNodeType.Connection | clickedNode?.GetTreeNodeType() == TreeNodeType.PuttySession) { - ConnectionInitiator.OpenConnection(); + ConnectionInitiator.OpenConnection(SelectedNode); } } @@ -838,7 +838,7 @@ namespace mRemoteNG.UI.Window if (tvConnections.SelectedNode.Tag is ConnectionInfo) { e.Handled = true; - ConnectionInitiator.OpenConnection(); + ConnectionInitiator.OpenConnection(SelectedNode); } else { From dabed1568c1ac78a2a6803ed5be5ccc6dd88a969 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 12 Sep 2016 10:09:15 -0600 Subject: [PATCH 103/338] Removed another OpenConnection overload that didnt take a connectioninfo object --- mRemoteV1/Connection/ConnectionInitiator.cs | 32 --------------------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 12 ++++---- 2 files changed, 6 insertions(+), 38 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInitiator.cs b/mRemoteV1/Connection/ConnectionInitiator.cs index a1587dbc7..a975983f6 100644 --- a/mRemoteV1/Connection/ConnectionInitiator.cs +++ b/mRemoteV1/Connection/ConnectionInitiator.cs @@ -15,38 +15,6 @@ namespace mRemoteNG.Connection { public static class ConnectionInitiator { - //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo.Force Force) - { - try - { - if (Windows.treeForm.tvConnections.SelectedNode.Tag == null) - return; - - if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) - { - OpenConnection((ConnectionInfo)Windows.treeForm.tvConnections.SelectedNode.Tag, Force); - } - else if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Container) - { - foreach (TreeNode tNode in ConnectionTree.SelectedNode.Nodes) - { - if (ConnectionTreeNode.GetNodeType(tNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) - { - if (tNode.Tag != null) - { - OpenConnection((ConnectionInfo)tNode.Tag, Force); - } - } - } - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo ConnectionInfo) { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 1535240dd..e12d43606 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -455,32 +455,32 @@ namespace mRemoteNG.UI.Window private void cMenTreeConnect_Click(object sender, EventArgs e) { - ConnectionInitiator.OpenConnection(ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DoNotJump); } private void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(object sender, EventArgs e) { - ConnectionInitiator.OpenConnection(ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); } private void cMenTreeConnectWithOptionsNoCredentials_Click(object sender, EventArgs e) { - ConnectionInitiator.OpenConnection(ConnectionInfo.Force.NoCredentials); + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.NoCredentials); } private void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(object sender, EventArgs e) { - ConnectionInitiator.OpenConnection(ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); } private void cMenTreeConnectWithOptionsConnectInFullscreen_Click(object sender, EventArgs e) { - ConnectionInitiator.OpenConnection(ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); } private void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(object sender, EventArgs e) { - ConnectionInitiator.OpenConnection(ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); } private void cMenTreeDisconnect_Click(object sender, EventArgs e) From 4c6f5dd72daa54131e1209dd7ddc6a244b399678 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 12 Sep 2016 10:12:00 -0600 Subject: [PATCH 104/338] Renamed some variables to adhere to style guidelines --- mRemoteV1/Connection/ConnectionInitiator.cs | 104 ++++++++++---------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInitiator.cs b/mRemoteV1/Connection/ConnectionInitiator.cs index a975983f6..bf52a2f28 100644 --- a/mRemoteV1/Connection/ConnectionInitiator.cs +++ b/mRemoteV1/Connection/ConnectionInitiator.cs @@ -16,11 +16,11 @@ namespace mRemoteNG.Connection public static class ConnectionInitiator { //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo ConnectionInfo) + public static void OpenConnection(ConnectionInfo connectionInfo) { try { - OpenConnection(ConnectionInfo, ConnectionInfo.Force.None); + OpenConnection(connectionInfo, ConnectionInfo.Force.None); } catch (Exception ex) { @@ -29,11 +29,11 @@ namespace mRemoteNG.Connection } //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo ConnectionInfo, Form ConnectionForm, ConnectionInfo.Force Force) + public static void OpenConnection(ConnectionInfo connectionInfo, Form connectionForm, ConnectionInfo.Force force) { try { - OpenConnection(ConnectionInfo, Force, ConnectionForm); + OpenConnection(connectionInfo, force, connectionForm); } catch (Exception ex) { @@ -42,11 +42,11 @@ namespace mRemoteNG.Connection } //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force) + public static void OpenConnection(ConnectionInfo connectionInfo, ConnectionInfo.Force force) { try { - OpenConnection(ConnectionInfo, Force, null); + OpenConnection(connectionInfo, force, null); } catch (Exception ex) { @@ -55,35 +55,35 @@ namespace mRemoteNG.Connection } //TODO Fix for TreeListView - public static void OpenConnection(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force, Form ConForm) + public static void OpenConnection(ConnectionInfo connectionInfo, ConnectionInfo.Force force, Form conForm) { try { - if (ConnectionInfo.Hostname == "" && ConnectionInfo.Protocol != ProtocolType.IntApp) + if (connectionInfo.Hostname == "" && connectionInfo.Protocol != ProtocolType.IntApp) { Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strConnectionOpenFailedNoHostname); return; } - StartPreConnectionExternalApp(ConnectionInfo); + StartPreConnectionExternalApp(connectionInfo); - if ((Force & ConnectionInfo.Force.DoNotJump) != ConnectionInfo.Force.DoNotJump) + if ((force & ConnectionInfo.Force.DoNotJump) != ConnectionInfo.Force.DoNotJump) { - if (SwitchToOpenConnection(ConnectionInfo)) + if (SwitchToOpenConnection(connectionInfo)) return; } var protocolFactory = new ProtocolFactory(); - var newProtocol = protocolFactory.CreateProtocol(ConnectionInfo); + var newProtocol = protocolFactory.CreateProtocol(connectionInfo); - string connectionPanel = SetConnectionPanel(ConnectionInfo, Force); - Form connectionForm = SetConnectionForm(ConForm, connectionPanel); - Control connectionContainer = SetConnectionContainer(ConnectionInfo, connectionForm); + var connectionPanel = SetConnectionPanel(connectionInfo, force); + var connectionForm = SetConnectionForm(conForm, connectionPanel); + var connectionContainer = SetConnectionContainer(connectionInfo, connectionForm); SetConnectionFormEventHandlers(newProtocol, connectionForm); SetConnectionEventHandlers(newProtocol); - BuildConnectionInterfaceController(ConnectionInfo, newProtocol, connectionContainer); + BuildConnectionInterfaceController(connectionInfo, newProtocol, connectionContainer); - newProtocol.Force = Force; + newProtocol.Force = force; if (newProtocol.Initialize() == false) { @@ -97,9 +97,9 @@ namespace mRemoteNG.Connection return; } - ConnectionInfo.OpenConnections.Add(newProtocol); - SetTreeNodeImages(ConnectionInfo); - frmMain.Default.SelectedConnection = ConnectionInfo; + connectionInfo.OpenConnections.Add(newProtocol); + SetTreeNodeImages(connectionInfo); + frmMain.Default.SelectedConnection = connectionInfo; } catch (Exception ex) { @@ -107,20 +107,20 @@ namespace mRemoteNG.Connection } } - private static void StartPreConnectionExternalApp(ConnectionInfo ConnectionInfo) + private static void StartPreConnectionExternalApp(ConnectionInfo connectionInfo) { - if (ConnectionInfo.PreExtApp != "") + if (connectionInfo.PreExtApp != "") { - var extA = GetExtAppByName(ConnectionInfo.PreExtApp); - extA?.Start(ConnectionInfo); + var extA = GetExtAppByName(connectionInfo.PreExtApp); + extA?.Start(connectionInfo); } } - public static ExternalTool GetExtAppByName(string Name) + public static ExternalTool GetExtAppByName(string name) { foreach (ExternalTool extA in Runtime.ExternalTools) { - if (extA.DisplayName == Name) + if (extA.DisplayName == name) return extA; } return null; @@ -171,10 +171,10 @@ namespace mRemoteNG.Connection return null; } - private static string SetConnectionPanel(ConnectionInfo ConnectionInfo, ConnectionInfo.Force Force) + private static string SetConnectionPanel(ConnectionInfo connectionInfo, ConnectionInfo.Force Force) { string connectionPanel = ""; - if (ConnectionInfo.Panel == "" || (Force & ConnectionInfo.Force.OverridePanel) == ConnectionInfo.Force.OverridePanel | Settings.Default.AlwaysShowPanelSelectionDlg) + if (connectionInfo.Panel == "" || (Force & ConnectionInfo.Force.OverridePanel) == ConnectionInfo.Force.OverridePanel | Settings.Default.AlwaysShowPanelSelectionDlg) { frmChoosePanel frmPnl = new frmChoosePanel(); if (frmPnl.ShowDialog() == DialogResult.OK) @@ -184,14 +184,14 @@ namespace mRemoteNG.Connection } else { - connectionPanel = ConnectionInfo.Panel; + connectionPanel = connectionInfo.Panel; } return connectionPanel; } - private static Form SetConnectionForm(Form ConForm, string connectionPanel) + private static Form SetConnectionForm(Form conForm, string connectionPanel) { - var connectionForm = ConForm ?? Runtime.WindowList.FromString(connectionPanel); + var connectionForm = conForm ?? Runtime.WindowList.FromString(connectionPanel); if (connectionForm == null) connectionForm = Runtime.AddPanel(connectionPanel); @@ -202,14 +202,14 @@ namespace mRemoteNG.Connection return connectionForm; } - private static Control SetConnectionContainer(ConnectionInfo ConnectionInfo, Form connectionForm) + private static Control SetConnectionContainer(ConnectionInfo connectionInfo, Form connectionForm) { - Control connectionContainer = ((ConnectionWindow)connectionForm).AddConnectionTab(ConnectionInfo); + Control connectionContainer = ((ConnectionWindow)connectionForm).AddConnectionTab(connectionInfo); - if (ConnectionInfo.Protocol == ProtocolType.IntApp) + if (connectionInfo.Protocol == ProtocolType.IntApp) { - if (GetExtAppByName(ConnectionInfo.ExtApp).Icon != null) - ((TabPage)connectionContainer).Icon = GetExtAppByName(ConnectionInfo.ExtApp).Icon; + if (GetExtAppByName(connectionInfo.ExtApp).Icon != null) + ((TabPage)connectionContainer).Icon = GetExtAppByName(connectionInfo.ExtApp).Icon; } return connectionContainer; } @@ -227,47 +227,47 @@ namespace mRemoteNG.Connection newProtocol.ErrorOccured += Prot_Event_ErrorOccured; } - private static void SetTreeNodeImages(ConnectionInfo ConnectionInfo) + private static void SetTreeNodeImages(ConnectionInfo connectionInfo) { - if (ConnectionInfo.IsQuickConnect == false) + if (connectionInfo.IsQuickConnect == false) { - if (ConnectionInfo.Protocol != ProtocolType.IntApp) + if (connectionInfo.Protocol != ProtocolType.IntApp) { - ConnectionTreeNode.SetNodeImage(ConnectionInfo.TreeNode, TreeImageType.ConnectionOpen); + ConnectionTreeNode.SetNodeImage(connectionInfo.TreeNode, TreeImageType.ConnectionOpen); } else { - ExternalTool extApp = GetExtAppByName(ConnectionInfo.ExtApp); + ExternalTool extApp = GetExtAppByName(connectionInfo.ExtApp); if (extApp != null) { - if (extApp.TryIntegrate && ConnectionInfo.TreeNode != null) + if (extApp.TryIntegrate && connectionInfo.TreeNode != null) { - ConnectionTreeNode.SetNodeImage(ConnectionInfo.TreeNode, TreeImageType.ConnectionOpen); + ConnectionTreeNode.SetNodeImage(connectionInfo.TreeNode, TreeImageType.ConnectionOpen); } } } } } - private static void BuildConnectionInterfaceController(ConnectionInfo ConnectionInfo, ProtocolBase newProtocol, Control connectionContainer) + private static void BuildConnectionInterfaceController(ConnectionInfo connectionInfo, ProtocolBase newProtocol, Control connectionContainer) { - newProtocol.InterfaceControl = new InterfaceControl(connectionContainer, newProtocol, ConnectionInfo); + newProtocol.InterfaceControl = new InterfaceControl(connectionContainer, newProtocol, connectionInfo); } - private static void Prot_Event_Disconnected(object sender, string DisconnectedMessage) + private static void Prot_Event_Disconnected(object sender, string disconnectedMessage) { try { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(Language.strProtocolEventDisconnected, DisconnectedMessage), true); + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(Language.strProtocolEventDisconnected, disconnectedMessage), true); ProtocolBase Prot = (ProtocolBase)sender; if (Prot.InterfaceControl.Info.Protocol == ProtocolType.RDP) { - string ReasonCode = DisconnectedMessage.Split("\r\n".ToCharArray())[0]; - string desc = DisconnectedMessage.Replace("\r\n", " "); + string ReasonCode = disconnectedMessage.Split("\r\n".ToCharArray())[0]; + string desc = disconnectedMessage.Replace("\r\n", " "); if (Convert.ToInt32(ReasonCode) > 3) { @@ -314,7 +314,7 @@ namespace mRemoteNG.Connection Runtime.MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnectionEventConnectedDetail, prot.InterfaceControl.Info.Hostname, prot.InterfaceControl.Info.Protocol.ToString(), Environment.UserName, prot.InterfaceControl.Info.Description, prot.InterfaceControl.Info.UserField)); } - private static void Prot_Event_ErrorOccured(object sender, string ErrorMessage) + private static void Prot_Event_ErrorOccured(object sender, string errorMessage) { try { @@ -323,9 +323,9 @@ namespace mRemoteNG.Connection if (Prot.InterfaceControl.Info.Protocol == ProtocolType.RDP) { - if (Convert.ToInt32(ErrorMessage) > -1) + if (Convert.ToInt32(errorMessage) > -1) { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strConnectionRdpErrorDetail, ErrorMessage, ProtocolRDP.FatalErrors.GetError(ErrorMessage))); + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strConnectionRdpErrorDetail, errorMessage, ProtocolRDP.FatalErrors.GetError(errorMessage))); } } } From a09ce702c1ed12bed0a370cf1017feda5298ad23 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 12 Sep 2016 10:17:14 -0600 Subject: [PATCH 105/338] Removed unnecessary code --- mRemoteV1/Connection/ConnectionInitiator.cs | 71 +++++---------------- 1 file changed, 16 insertions(+), 55 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInitiator.cs b/mRemoteV1/Connection/ConnectionInitiator.cs index bf52a2f28..d98bdb895 100644 --- a/mRemoteV1/Connection/ConnectionInitiator.cs +++ b/mRemoteV1/Connection/ConnectionInitiator.cs @@ -15,7 +15,6 @@ namespace mRemoteNG.Connection { public static class ConnectionInitiator { - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo connectionInfo) { try @@ -28,7 +27,6 @@ namespace mRemoteNG.Connection } } - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo connectionInfo, Form connectionForm, ConnectionInfo.Force force) { try @@ -41,7 +39,6 @@ namespace mRemoteNG.Connection } } - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo connectionInfo, ConnectionInfo.Force force) { try @@ -54,7 +51,6 @@ namespace mRemoteNG.Connection } } - //TODO Fix for TreeListView public static void OpenConnection(ConnectionInfo connectionInfo, ConnectionInfo.Force force, Form conForm) { try @@ -98,7 +94,6 @@ namespace mRemoteNG.Connection } connectionInfo.OpenConnections.Add(newProtocol); - SetTreeNodeImages(connectionInfo); frmMain.Default.SelectedConnection = connectionInfo; } catch (Exception ex) @@ -227,28 +222,6 @@ namespace mRemoteNG.Connection newProtocol.ErrorOccured += Prot_Event_ErrorOccured; } - private static void SetTreeNodeImages(ConnectionInfo connectionInfo) - { - if (connectionInfo.IsQuickConnect == false) - { - if (connectionInfo.Protocol != ProtocolType.IntApp) - { - ConnectionTreeNode.SetNodeImage(connectionInfo.TreeNode, TreeImageType.ConnectionOpen); - } - else - { - ExternalTool extApp = GetExtAppByName(connectionInfo.ExtApp); - if (extApp != null) - { - if (extApp.TryIntegrate && connectionInfo.TreeNode != null) - { - ConnectionTreeNode.SetNodeImage(connectionInfo.TreeNode, TreeImageType.ConnectionOpen); - } - } - } - } - } - private static void BuildConnectionInterfaceController(ConnectionInfo connectionInfo, ProtocolBase newProtocol, Control connectionContainer) { newProtocol.InterfaceControl = new InterfaceControl(connectionContainer, newProtocol, connectionInfo); @@ -263,17 +236,13 @@ namespace mRemoteNG.Connection { Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format(Language.strProtocolEventDisconnected, disconnectedMessage), true); - ProtocolBase Prot = (ProtocolBase)sender; - if (Prot.InterfaceControl.Info.Protocol == ProtocolType.RDP) - { - string ReasonCode = disconnectedMessage.Split("\r\n".ToCharArray())[0]; - string desc = disconnectedMessage.Replace("\r\n", " "); + var Prot = (ProtocolBase)sender; + if (Prot.InterfaceControl.Info.Protocol != ProtocolType.RDP) return; + var ReasonCode = disconnectedMessage.Split("\r\n".ToCharArray())[0]; + var desc = disconnectedMessage.Replace("\r\n", " "); - if (Convert.ToInt32(ReasonCode) > 3) - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strRdpDisconnected + Environment.NewLine + desc); - } - } + if (Convert.ToInt32(ReasonCode) > 3) + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, Language.strRdpDisconnected + Environment.NewLine + desc); } catch (Exception ex) { @@ -285,21 +254,17 @@ namespace mRemoteNG.Connection { try { - ProtocolBase Prot = (ProtocolBase)sender; + var Prot = (ProtocolBase)sender; Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnenctionCloseEvent, true); Runtime.MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnenctionClosedByUser, Prot.InterfaceControl.Info.Hostname, Prot.InterfaceControl.Info.Protocol.ToString(), Environment.UserName)); Prot.InterfaceControl.Info.OpenConnections.Remove(Prot); if (Prot.InterfaceControl.Info.OpenConnections.Count < 1 && Prot.InterfaceControl.Info.IsQuickConnect == false) - { ConnectionTreeNode.SetNodeImage(Prot.InterfaceControl.Info.TreeNode, TreeImageType.ConnectionClosed); - } - if (Prot.InterfaceControl.Info.PostExtApp != "") - { - ExternalTool extA = GetExtAppByName(Prot.InterfaceControl.Info.PostExtApp); - extA?.Start(Prot.InterfaceControl.Info); - } + if (Prot.InterfaceControl.Info.PostExtApp == "") return; + var extA = GetExtAppByName(Prot.InterfaceControl.Info.PostExtApp); + extA?.Start(Prot.InterfaceControl.Info); } catch (Exception ex) { @@ -309,9 +274,9 @@ namespace mRemoteNG.Connection private static void Prot_Event_Connected(object sender) { - ProtocolBase prot = (ProtocolBase)sender; + var prot = (ProtocolBase)sender; Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnectionEventConnected, true); - Runtime.MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnectionEventConnectedDetail, prot.InterfaceControl.Info.Hostname, prot.InterfaceControl.Info.Protocol.ToString(), Environment.UserName, prot.InterfaceControl.Info.Description, prot.InterfaceControl.Info.UserField)); + Runtime.MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnectionEventConnectedDetail, prot.InterfaceControl.Info.Hostname, prot.InterfaceControl.Info.Protocol, Environment.UserName, prot.InterfaceControl.Info.Description, prot.InterfaceControl.Info.UserField)); } private static void Prot_Event_ErrorOccured(object sender, string errorMessage) @@ -319,15 +284,11 @@ namespace mRemoteNG.Connection try { Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strConnectionEventErrorOccured, true); - ProtocolBase Prot = (ProtocolBase)sender; + var Prot = (ProtocolBase)sender; - if (Prot.InterfaceControl.Info.Protocol == ProtocolType.RDP) - { - if (Convert.ToInt32(errorMessage) > -1) - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strConnectionRdpErrorDetail, errorMessage, ProtocolRDP.FatalErrors.GetError(errorMessage))); - } - } + if (Prot.InterfaceControl.Info.Protocol != ProtocolType.RDP) return; + if (Convert.ToInt32(errorMessage) > -1) + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strConnectionRdpErrorDetail, errorMessage, ProtocolRDP.FatalErrors.GetError(errorMessage))); } catch (Exception ex) { From cf7e4d1f52863bf8d114c57bf9e980fced87c5a2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 12 Sep 2016 10:20:35 -0600 Subject: [PATCH 106/338] Moved GetExtAppByName() back to Runtime. Will make more sense for later refactoring --- mRemoteV1/Connection/ConnectionInitiator.cs | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInitiator.cs b/mRemoteV1/Connection/ConnectionInitiator.cs index d98bdb895..7994d861e 100644 --- a/mRemoteV1/Connection/ConnectionInitiator.cs +++ b/mRemoteV1/Connection/ConnectionInitiator.cs @@ -4,7 +4,6 @@ using mRemoteNG.App; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Messages; -using mRemoteNG.Tools; using mRemoteNG.Tree; using mRemoteNG.UI.Forms; using mRemoteNG.UI.Window; @@ -106,21 +105,11 @@ namespace mRemoteNG.Connection { if (connectionInfo.PreExtApp != "") { - var extA = GetExtAppByName(connectionInfo.PreExtApp); + var extA = Runtime.GetExtAppByName(connectionInfo.PreExtApp); extA?.Start(connectionInfo); } } - public static ExternalTool GetExtAppByName(string name) - { - foreach (ExternalTool extA in Runtime.ExternalTools) - { - if (extA.DisplayName == name) - return extA; - } - return null; - } - public static bool SwitchToOpenConnection(ConnectionInfo nCi) { var IC = FindConnectionContainer(nCi); @@ -203,8 +192,8 @@ namespace mRemoteNG.Connection if (connectionInfo.Protocol == ProtocolType.IntApp) { - if (GetExtAppByName(connectionInfo.ExtApp).Icon != null) - ((TabPage)connectionContainer).Icon = GetExtAppByName(connectionInfo.ExtApp).Icon; + if (Runtime.GetExtAppByName(connectionInfo.ExtApp).Icon != null) + ((TabPage)connectionContainer).Icon = Runtime.GetExtAppByName(connectionInfo.ExtApp).Icon; } return connectionContainer; } @@ -263,7 +252,7 @@ namespace mRemoteNG.Connection ConnectionTreeNode.SetNodeImage(Prot.InterfaceControl.Info.TreeNode, TreeImageType.ConnectionClosed); if (Prot.InterfaceControl.Info.PostExtApp == "") return; - var extA = GetExtAppByName(Prot.InterfaceControl.Info.PostExtApp); + var extA = Runtime.GetExtAppByName(Prot.InterfaceControl.Info.PostExtApp); extA?.Start(Prot.InterfaceControl.Info); } catch (Exception ex) From 023570298b539c64fd811e62138ed70eee993939 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 07:41:38 -0600 Subject: [PATCH 107/338] Removed unnecessary code --- mRemoteV1/Connection/ConnectionInitiator.cs | 3 --- mRemoteV1/Tree/ConnectionTreeNode.cs | 5 ----- 2 files changed, 8 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInitiator.cs b/mRemoteV1/Connection/ConnectionInitiator.cs index 7994d861e..fb8ca9d20 100644 --- a/mRemoteV1/Connection/ConnectionInitiator.cs +++ b/mRemoteV1/Connection/ConnectionInitiator.cs @@ -248,9 +248,6 @@ namespace mRemoteNG.Connection Runtime.MessageCollector.AddMessage(MessageClass.ReportMsg, string.Format(Language.strConnenctionClosedByUser, Prot.InterfaceControl.Info.Hostname, Prot.InterfaceControl.Info.Protocol.ToString(), Environment.UserName)); Prot.InterfaceControl.Info.OpenConnections.Remove(Prot); - if (Prot.InterfaceControl.Info.OpenConnections.Count < 1 && Prot.InterfaceControl.Info.IsQuickConnect == false) - ConnectionTreeNode.SetNodeImage(Prot.InterfaceControl.Info.TreeNode, TreeImageType.ConnectionClosed); - if (Prot.InterfaceControl.Info.PostExtApp == "") return; var extA = Runtime.GetExtAppByName(Prot.InterfaceControl.Info.PostExtApp); extA?.Start(Prot.InterfaceControl.Info); diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 8727e027a..1b383a5d6 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -240,11 +240,6 @@ namespace mRemoteNG.Tree parentNode.Nodes.Add(newTreeNode); } } - - public static void SetNodeImage(TreeNode treeNode, TreeImageType Img) - { - SetNodeImageIndex(treeNode, (int)Img); - } #endregion #region Private Methods From 2ba3e95379314281ee56fcbd35cad7a1438fbc9d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 07:59:36 -0600 Subject: [PATCH 108/338] Removed unnecessary tooltip code --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index e12d43606..6ab934c08 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -2,7 +2,6 @@ using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; -using mRemoteNG.Messages; using mRemoteNG.Tree; using System; using System.Drawing; @@ -21,7 +20,6 @@ namespace mRemoteNG.UI.Window private ConnectionTreeModel _connectionTreeModel; private ConnectionTreeDragAndDropHandler _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); - private ToolTip DescriptionTooltip { get; } private ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; public ConnectionTreeModel ConnectionTreeModel @@ -39,11 +37,6 @@ namespace mRemoteNG.UI.Window WindowType = WindowType.Tree; DockPnl = panel; InitializeComponent(); - DescriptionTooltip = new ToolTip - { - InitialDelay = 300, - ReshowDelay = 0 - }; FillImageList(); LinkModelToView(); From 3a2f35f697f3579cfee183c9b6377c540c9d2d1b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 08:36:58 -0600 Subject: [PATCH 109/338] Duplicating a node now places it under the node that it was copied from, rather than the bottom of the list. (this was the previous behavior) --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 6ab934c08..a6a08b218 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -527,9 +527,10 @@ namespace mRemoteNG.UI.Window private void cMenTreeDuplicate_Click(object sender, EventArgs e) { - SelectedNode.Clone(); + var newNode = SelectedNode.Clone(); + newNode.Parent.SetChildBelow(newNode, SelectedNode); Runtime.SaveConnectionsBG(); - olvConnections.RebuildAll(true); + olvConnections.RefreshObject(SelectedNode); } private void cMenTreeRename_Click(object sender, EventArgs e) From eba5fc9caf627d5c1ca5a05c56415f7f87b0ae67 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 08:39:12 -0600 Subject: [PATCH 110/338] Slight optimization of updating the tree when deleting a node. Refresh one row rather than the whole tree --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index a6a08b218..db10146eb 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -543,7 +543,7 @@ namespace mRemoteNG.UI.Window { ConnectionTreeModel.DeleteNode(SelectedNode); Runtime.SaveConnectionsBG(); - olvConnections.RebuildAll(true); + olvConnections.RefreshObject(SelectedNode); } //TODO Fix for TreeListView From 88d005caf622ce556ad7c8e800b8d70c5fe7c3d3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 08:59:03 -0600 Subject: [PATCH 111/338] Rearranged some event handler declarations --- .../Window/ConnectionTreeWindow.Designer.cs | 3 - mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 73 +++++++++++-------- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 0627f978a..7711b8707 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -264,7 +264,6 @@ namespace mRemoteNG.UI.Window this.cMenTreeDuplicate.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); this.cMenTreeDuplicate.Size = new System.Drawing.Size(199, 22); this.cMenTreeDuplicate.Text = "Duplicate"; - this.cMenTreeDuplicate.Click += new System.EventHandler(this.cMenTreeDuplicate_Click); // // cMenTreeRename // @@ -273,7 +272,6 @@ namespace mRemoteNG.UI.Window this.cMenTreeRename.ShortcutKeys = System.Windows.Forms.Keys.F2; this.cMenTreeRename.Size = new System.Drawing.Size(199, 22); this.cMenTreeRename.Text = "Rename"; - this.cMenTreeRename.Click += new System.EventHandler(this.cMenTreeRename_Click); // // cMenTreeDelete // @@ -282,7 +280,6 @@ namespace mRemoteNG.UI.Window this.cMenTreeDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; this.cMenTreeDelete.Size = new System.Drawing.Size(199, 22); this.cMenTreeDelete.Text = "Delete"; - this.cMenTreeDelete.Click += new System.EventHandler(this.cMenTreeDelete_Click); // // cMenTreeSep3 // diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index db10146eb..967f38cd9 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -91,17 +91,30 @@ namespace mRemoteNG.UI.Window private void SetEventHandlers() { - olvConnections.Collapsed += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = false; - olvConnections.Expanded += (sender, args) => ((ContainerInfo) args.Model).IsExpanded = true; - olvConnections.BeforeLabelEdit += tvConnections_BeforeLabelEdit; - olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; - olvConnections.SelectionChanged += tvConnections_AfterSelect; - olvConnections.CellClick += tvConnections_NodeMouseSingleClick; - olvConnections.CellClick += tvConnections_NodeMouseDoubleClick; - olvConnections.CellToolTipShowing += tvConnections_CellToolTipShowing; + SetTreeEventHandlers(); + SetMenuEventHandlers(); + } + + private void SetTreeEventHandlers() + { + olvConnections.Collapsed += (sender, args) => ((ContainerInfo)args.Model).IsExpanded = false; + olvConnections.Expanded += (sender, args) => ((ContainerInfo)args.Model).IsExpanded = true; + olvConnections.BeforeLabelEdit += tvConnections_BeforeLabelEdit; + olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; + olvConnections.SelectionChanged += tvConnections_AfterSelect; + olvConnections.CellClick += tvConnections_NodeMouseSingleClick; + olvConnections.CellClick += tvConnections_NodeMouseDoubleClick; + olvConnections.CellToolTipShowing += tvConnections_CellToolTipShowing; olvConnections.ModelCanDrop += _dragAndDropHandler.HandleEvent_ModelCanDrop; olvConnections.ModelDropped += _dragAndDropHandler.HandleEvent_ModelDropped; - } + } + + private void SetMenuEventHandlers() + { + cMenTreeDuplicate.Click += (sender, args) => DuplicateSelectedNode(); + cMenTreeRename.Click += (sender, args) => RenameSelectedNode(); + cMenTreeDelete.Click += (sender, args) => DeleteSelectedNode(); + } private void PopulateTreeView() { @@ -218,6 +231,27 @@ namespace mRemoteNG.UI.Window olvConnections.EnsureModelVisible(GetRootConnectionNode()); } + public void DuplicateSelectedNode() + { + var newNode = SelectedNode.Clone(); + newNode.Parent.SetChildBelow(newNode, SelectedNode); + Runtime.SaveConnectionsBG(); + olvConnections.RefreshObject(SelectedNode); + } + + public void RenameSelectedNode() + { + olvConnections.SelectedItem.BeginEdit(); + Runtime.SaveConnectionsBG(); + } + + public void DeleteSelectedNode() + { + ConnectionTreeModel.DeleteNode(SelectedNode); + Runtime.SaveConnectionsBG(); + olvConnections.RefreshObject(SelectedNode); + } + #region Private Methods private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) { @@ -525,27 +559,6 @@ namespace mRemoteNG.UI.Window StartExternalApp((Tools.ExternalTool)((ToolStripMenuItem)sender).Tag); } - private void cMenTreeDuplicate_Click(object sender, EventArgs e) - { - var newNode = SelectedNode.Clone(); - newNode.Parent.SetChildBelow(newNode, SelectedNode); - Runtime.SaveConnectionsBG(); - olvConnections.RefreshObject(SelectedNode); - } - - private void cMenTreeRename_Click(object sender, EventArgs e) - { - olvConnections.SelectedItem.BeginEdit(); - Runtime.SaveConnectionsBG(); - } - - private void cMenTreeDelete_Click(object sender, EventArgs e) - { - ConnectionTreeModel.DeleteNode(SelectedNode); - Runtime.SaveConnectionsBG(); - olvConnections.RefreshObject(SelectedNode); - } - //TODO Fix for TreeListView private void cMenTreeImportFile_Click(object sender, EventArgs e) { From 9882dda905f73e3b3e9f9cc8948747dcafc08665 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 09:27:05 -0600 Subject: [PATCH 112/338] Resolved issue with tree actions from the File menu. This is still an ugly fix, but its working --- mRemoteV1/UI/Forms/frmMain.cs | 28 ++++++++++----------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 3416e2982..73cf8414b 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -39,6 +39,7 @@ namespace mRemoteNG.UI.Forms private ConnectionInfo _selectedConnection; private SystemMenu _systemMenu; private MiscTools.Fullscreen _fullscreen; + private ConnectionTreeWindow ConnectionTreeWindow { get; set; } @@ -168,10 +169,8 @@ namespace mRemoteNG.UI.Forms Microsoft.Win32.SystemEvents.DisplaySettingsChanged += DisplayChanged; Opacity = 1; - Windows.treeForm.ConnectionTreeModel = Runtime.ConnectionTreeModel; - //Windows.treeForm.ExpandPreviouslyOpenedFolders(); - //Windows.treeForm.EnsureRootNodeVisible(); - //Windows.treeForm.OpenConnectionsFromLastSession(); + ConnectionTreeWindow = Windows.treeForm; + ConnectionTreeWindow.ConnectionTreeModel = Runtime.ConnectionTreeModel; } private void ApplySpecialSettingsForPortableVersion() @@ -456,8 +455,9 @@ namespace mRemoteNG.UI.Forms #region Menu #region File private void mMenFile_DropDownOpening(Object sender, EventArgs e) - { - if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Root) + { + var selectedNodeType = ConnectionTreeWindow.SelectedNode?.GetTreeNodeType(); + if (selectedNodeType == TreeNodeType.Root) { mMenFileNewConnection.Enabled = true; mMenFileNewFolder.Enabled = true; @@ -470,7 +470,7 @@ namespace mRemoteNG.UI.Forms mMenFileDuplicate.Text = Language.strMenuDuplicate; mMenReconnectAll.Text = Language.strMenuReconnectAll; } - else if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Container) + else if (selectedNodeType == TreeNodeType.Container) { mMenFileNewConnection.Enabled = true; mMenFileNewFolder.Enabled = true; @@ -484,7 +484,7 @@ namespace mRemoteNG.UI.Forms mMenReconnectAll.Text = Language.strMenuReconnectAll; } - else if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection) + else if (selectedNodeType == TreeNodeType.Connection) { mMenFileNewConnection.Enabled = true; mMenFileNewFolder.Enabled = true; @@ -497,7 +497,7 @@ namespace mRemoteNG.UI.Forms mMenFileDuplicate.Text = Language.strMenuDuplicateConnection; mMenReconnectAll.Text = Language.strMenuReconnectAll; } - else if ((ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttyRoot) || (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession)) + else if (selectedNodeType == TreeNodeType.PuttyRoot || selectedNodeType == TreeNodeType.PuttySession) { mMenFileNewConnection.Enabled = false; mMenFileNewFolder.Enabled = false; @@ -527,13 +527,13 @@ namespace mRemoteNG.UI.Forms private void mMenFileNewConnection_Click(object sender, EventArgs e) { - Windows.treeForm.AddConnection(); + ConnectionTreeWindow.AddConnection(); Runtime.SaveConnectionsBG(); } private void mMenFileNewFolder_Click(object sender, EventArgs e) { - Windows.treeForm.AddFolder(); + ConnectionTreeWindow.AddFolder(); Runtime.SaveConnectionsBG(); } @@ -578,19 +578,19 @@ namespace mRemoteNG.UI.Forms private void mMenFileDelete_Click(object sender, EventArgs e) { - ConnectionTree.DeleteSelectedNode(); + ConnectionTreeWindow.DeleteSelectedNode(); Runtime.SaveConnectionsBG(); } private void mMenFileRename_Click(object sender, EventArgs e) { - ConnectionTree.StartRenameSelectedNode(); + ConnectionTreeWindow.RenameSelectedNode(); Runtime.SaveConnectionsBG(); } private void mMenFileDuplicate_Click(object sender, EventArgs e) { - ConnectionTreeNode.CloneNode(ConnectionTree.SelectedNode); + ConnectionTreeWindow.DuplicateSelectedNode(); Runtime.SaveConnectionsBG(); } diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 967f38cd9..4582091bf 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -20,7 +20,7 @@ namespace mRemoteNG.UI.Window private ConnectionTreeModel _connectionTreeModel; private ConnectionTreeDragAndDropHandler _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); - private ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; + public ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; public ConnectionTreeModel ConnectionTreeModel { From 2ff2e448be2f0845bcacc11ed192cf699c82de63 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 09:40:15 -0600 Subject: [PATCH 113/338] Removed unnecessary code --- mRemoteV1/Tree/ConnectionTreeNode.cs | 85 ---------------------------- 1 file changed, 85 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 1b383a5d6..5de29e5e3 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -155,91 +155,6 @@ namespace mRemoteNG.Tree return null; } - - public static void CloneNode(TreeNode oldTreeNode, TreeNode parentNode = null) - { - try - { - if (GetNodeType(oldTreeNode) == TreeNodeType.Connection) - CloneConnectionNode(oldTreeNode, parentNode); - else if (GetNodeType(oldTreeNode) == TreeNodeType.Container) - CloneContainerNode(oldTreeNode, parentNode); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strErrorCloneNodeFailed, ex.Message)); - } - } - - private static void CloneContainerNode(TreeNode oldTreeNode, TreeNode parentNode) - { - ContainerInfo oldContainerInfo = (ContainerInfo) oldTreeNode.Tag; - - ContainerInfo newContainerInfo = (ContainerInfo)oldContainerInfo.Clone(); - ConnectionInfo newConnectionInfo = oldContainerInfo.Clone(); - newContainerInfo.CopyFrom(newConnectionInfo); - - TreeNode newTreeNode = new TreeNode(newContainerInfo.Name); - newTreeNode.Tag = newContainerInfo; - newTreeNode.ImageIndex = (int)TreeImageType.Container; - newTreeNode.SelectedImageIndex = (int)TreeImageType.Container; - newContainerInfo.Parent = newContainerInfo; - - Runtime.ContainerList.Add(newContainerInfo); - - if (parentNode == null) - { - oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode); - ConnectionTree.SelectedNode = newTreeNode; - } - else - { - parentNode.Nodes.Add(newTreeNode); - } - - foreach (TreeNode childTreeNode in oldTreeNode.Nodes) - { - CloneNode(childTreeNode, newTreeNode); - } - - newTreeNode.Expand(); - } - - private static void CloneConnectionNode(TreeNode oldTreeNode, TreeNode parentNode) - { - ConnectionInfo oldConnectionInfo = (ConnectionInfo)oldTreeNode.Tag; - - ConnectionInfo newConnectionInfo = oldConnectionInfo.Clone(); - ConnectionInfoInheritance newInheritance = oldConnectionInfo.Inheritance.Clone(); - newInheritance.Parent = newConnectionInfo; - newConnectionInfo.Inheritance = newInheritance; - - Runtime.ConnectionList.Add(newConnectionInfo); - - TreeNode newTreeNode = new TreeNode(newConnectionInfo.Name) - { - Tag = newConnectionInfo, - ImageIndex = (int) TreeImageType.ConnectionClosed, - SelectedImageIndex = (int) TreeImageType.ConnectionClosed - }; - - newConnectionInfo.TreeNode = newTreeNode; - - if (parentNode == null) - { - oldTreeNode.Parent.Nodes.Insert(oldTreeNode.Index + 1, newTreeNode); - ConnectionTree.SelectedNode = newTreeNode; - } - else - { - ContainerInfo parentContainerInfo = parentNode.Tag as ContainerInfo; - if (parentContainerInfo != null) - { - newConnectionInfo.Parent = parentContainerInfo; - } - parentNode.Nodes.Add(newTreeNode); - } - } #endregion #region Private Methods From ddf5e38396d9358ff05b2bab837bac019db68b9b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 09:44:15 -0600 Subject: [PATCH 114/338] Fixed minor bug where folders with no contents had an expand button --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 4582091bf..67f2eb835 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -69,7 +69,7 @@ namespace mRemoteNG.UI.Window { olvNameColumn.AspectGetter = item => ((ConnectionInfo)item).Name; olvNameColumn.ImageGetter = ConnectionImageGetter; - olvConnections.CanExpandGetter = item => item is ContainerInfo; + olvConnections.CanExpandGetter = item => item is ContainerInfo && ((ContainerInfo)item).Children.Count > 0; olvConnections.ChildrenGetter = item => ((ContainerInfo)item).Children; } From 6860ddced34d7a99402e6c48dce62b03e9be0f64 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 09:59:57 -0600 Subject: [PATCH 115/338] Reimplemented confirmation boxes when deleting tree nodes --- mRemoteV1/Tree/ConnectionTree.cs | 86 +-------------------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 35 +++++++++ 2 files changed, 36 insertions(+), 85 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index 86cb81235..c24e96d8a 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -19,7 +19,7 @@ namespace mRemoteNG.Tree { get { - return TreeView.SelectedNode; + return TreeView?.SelectedNode; } set { @@ -28,90 +28,6 @@ namespace mRemoteNG.Tree } } - //TODO Fix for TreeListView - public static void DeleteSelectedNode() - { - try - { - if (!SelectedNodeIsAValidDeletionTarget()) - return; - - if (ConnectionTreeNode.GetNodeType(SelectedNode) == TreeNodeType.Container) - { - if (ConnectionTreeNode.IsEmpty(SelectedNode)) - { - if (UserConfirmsEmptyFolderDeletion()) - SelectedNode.Remove(); - } - else - { - if (UserConfirmsNonEmptyFolderDeletion()) - { - TreeView.BeginUpdate(); - SelectedNode.Nodes.Clear(); - SelectedNode.Remove(); - TreeView.EndUpdate(); - } - } - } - else if (ConnectionTreeNode.GetNodeType(SelectedNode) == TreeNodeType.Connection) - { - if (UserConfirmsConnectionDeletion()) - SelectedNode.Remove(); - } - else - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "Tree item type is unknown so it cannot be deleted!"); - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Deleting selected node failed" + Environment.NewLine + ex.Message, true); - } - } - - //TODO Fix for TreeListView - private static bool SelectedNodeIsAValidDeletionTarget() - { - bool validDeletionTarget = true; - if (SelectedNode == null) - validDeletionTarget = false; - else if (ConnectionTreeNode.GetNodeType(SelectedNode) == TreeNodeType.Root) - { - validDeletionTarget = false; - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "The root item cannot be deleted!"); - } - return validDeletionTarget; - } - - //TODO Fix for TreeListView - private static bool UserConfirmsEmptyFolderDeletion() - { - string messagePrompt = string.Format(Language.strConfirmDeleteNodeFolder, SelectedNode.Text); - return PromptUser(messagePrompt); - } - - //TODO Fix for TreeListView - private static bool UserConfirmsNonEmptyFolderDeletion() - { - string messagePrompt = string.Format(Language.strConfirmDeleteNodeFolderNotEmpty, SelectedNode.Text); - return PromptUser(messagePrompt); - } - - //TODO Fix for TreeListView - private static bool UserConfirmsConnectionDeletion() - { - string messagePrompt = string.Format(Language.strConfirmDeleteNodeConnection, SelectedNode.Text); - return PromptUser(messagePrompt); - } - - //TODO Fix for TreeListView - private static bool PromptUser(string PromptMessage) - { - DialogResult msgBoxResponse = MessageBox.Show(PromptMessage, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question); - return (msgBoxResponse == DialogResult.Yes); - } - public static void StartRenameSelectedNode() { SelectedNode?.BeginEdit(); diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 67f2eb835..52cae296f 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -247,11 +247,46 @@ namespace mRemoteNG.UI.Window public void DeleteSelectedNode() { + if (!UserConfirmsDeletion()) return; ConnectionTreeModel.DeleteNode(SelectedNode); Runtime.SaveConnectionsBG(); olvConnections.RefreshObject(SelectedNode); } + private bool UserConfirmsDeletion() + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo; + if (selectedNodeAsContainer != null) + return selectedNodeAsContainer.HasChildren() + ? UserConfirmsNonEmptyFolderDeletion() + : UserConfirmsEmptyFolderDeletion(); + return UserConfirmsConnectionDeletion(); + } + + private bool UserConfirmsEmptyFolderDeletion() + { + var messagePrompt = string.Format(Language.strConfirmDeleteNodeFolder, SelectedNode.Name); + return PromptUser(messagePrompt); + } + + private bool UserConfirmsNonEmptyFolderDeletion() + { + var messagePrompt = string.Format(Language.strConfirmDeleteNodeFolderNotEmpty, SelectedNode.Name); + return PromptUser(messagePrompt); + } + + private bool UserConfirmsConnectionDeletion() + { + var messagePrompt = string.Format(Language.strConfirmDeleteNodeConnection, SelectedNode.Name); + return PromptUser(messagePrompt); + } + + private bool PromptUser(string promptMessage) + { + var msgBoxResponse = MessageBox.Show(promptMessage, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question); + return (msgBoxResponse == DialogResult.Yes); + } + #region Private Methods private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) { From 6bc0c796240bd5b041a167faed3a27a3a40e0de0 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 10:00:27 -0600 Subject: [PATCH 116/338] Created a convenience function for determining if a container has children --- mRemoteV1/Container/ContainerInfo.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 6b3996092..b1fc714cf 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -27,6 +27,11 @@ namespace mRemoteNG.Container return TreeNodeType.Container; } + public bool HasChildren() + { + return Children.Count > 0; + } + public void AddChild(ConnectionInfo newChildItem) { newChildItem.Parent = this; From 0a120e402e1a414f670f592788b950c4b77f886e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 10:05:38 -0600 Subject: [PATCH 117/338] Removed unnecessary code --- mRemoteV1/Tree/ConnectionTreeNode.cs | 61 ---------------------------- 1 file changed, 61 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 5de29e5e3..5a1fd3fd6 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -12,32 +12,6 @@ namespace mRemoteNG.Tree public static class ConnectionTreeNode { //TODO Everything in this class needs to be updated / rewritten to work with the TreeListView/ConnectionTreeModel - #region Public Methods - public static string GetConstantID(TreeNode node) - { - if (GetNodeType(node) == TreeNodeType.Connection) - return ((ConnectionInfo) node.Tag).ConstantID; - if (GetNodeType(node) == TreeNodeType.Container) - return ((ContainerInfo) node.Tag).ConstantID; - - return null; - } - - public static TreeNode GetNodeFromPositionID(int id) - { - foreach (ConnectionInfo connection in Runtime.ConnectionList) - { - if (connection.PositionID == id) - { - if (connection.IsContainer) - return connection.Parent.TreeNode; - return connection.TreeNode; - } - } - - return null; - } - public static TreeNode GetNodeFromConstantID(string id) { foreach (ConnectionInfo connectionInfo in Runtime.ConnectionList) @@ -101,21 +75,6 @@ namespace mRemoteNG.Tree return TreeNodeType.None; } - public static bool IsEmpty(TreeNode treeNode) - { - try - { - if (treeNode.Nodes.Count > 0) - return false; - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "IsEmpty (Tree.Node) failed" + Environment.NewLine + ex.Message, true); - } - - return true; - } - public static TreeNode AddNode(TreeNodeType nodeType, string name = null) { try @@ -155,25 +114,5 @@ namespace mRemoteNG.Tree return null; } - #endregion - - #region Private Methods - private delegate void SetNodeImageIndexDelegate(TreeNode treeNode, int imageIndex); - private static void SetNodeImageIndex(TreeNode treeNode, int imageIndex) - { - if (treeNode?.TreeView == null) - { - return; - } - if (treeNode.TreeView.InvokeRequired) - { - treeNode.TreeView.Invoke(new SetNodeImageIndexDelegate(SetNodeImageIndex), new object[] { treeNode, imageIndex }); - return; - } - - treeNode.ImageIndex = imageIndex; - treeNode.SelectedImageIndex = imageIndex; - } - #endregion } } \ No newline at end of file From f743942e6527c82e9d717cc4fffd203ee1f0174b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 10:06:56 -0600 Subject: [PATCH 118/338] Fixed ExpandAll --- mRemoteV1/Tree/ConnectionTree.cs | 13 ------------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 3 +-- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index c24e96d8a..5c2febb1e 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -28,19 +28,6 @@ namespace mRemoteNG.Tree } } - public static void StartRenameSelectedNode() - { - SelectedNode?.BeginEdit(); - } - - //TODO Fix for TreeListView - public static void ExpandAllNodes() - { - TreeView.BeginUpdate(); - TreeView.ExpandAll(); - TreeView.EndUpdate(); - } - //TODO Fix for TreeListView public static void CollapseAllNodes() { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 52cae296f..0f840fc97 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -770,10 +770,9 @@ namespace mRemoteNG.UI.Window #endregion #region Menu - //TODO Fix for TreeListView private void mMenViewExpandAllFolders_Click(object sender, EventArgs e) { - ConnectionTree.ExpandAllNodes(); + olvConnections.ExpandAll(); } //TODO Fix for TreeListView From 29ad4209165da893f20c6cce0a126d04e4ed7871 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 10:17:43 -0600 Subject: [PATCH 119/338] ExpandAll and CollapseAll now work --- .../Window/ConnectionTreeWindow.Designer.cs | 2 - mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 44 +++++++++---------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 7711b8707..01c493b40 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -489,7 +489,6 @@ namespace mRemoteNG.UI.Window this.mMenViewExpandAllFolders.Name = "mMenViewExpandAllFolders"; this.mMenViewExpandAllFolders.Size = new System.Drawing.Size(172, 22); this.mMenViewExpandAllFolders.Text = "Expand all folders"; - this.mMenViewExpandAllFolders.Click += new System.EventHandler(this.mMenViewExpandAllFolders_Click); // // mMenViewCollapseAllFolders // @@ -497,7 +496,6 @@ namespace mRemoteNG.UI.Window this.mMenViewCollapseAllFolders.Name = "mMenViewCollapseAllFolders"; this.mMenViewCollapseAllFolders.Size = new System.Drawing.Size(172, 22); this.mMenViewCollapseAllFolders.Text = "Collapse all folders"; - this.mMenViewCollapseAllFolders.Click += new System.EventHandler(this.mMenViewCollapseAllFolders_Click); // // mMenSortAscending // diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 0f840fc97..5d598b6a4 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -96,9 +96,19 @@ namespace mRemoteNG.UI.Window } private void SetTreeEventHandlers() - { - olvConnections.Collapsed += (sender, args) => ((ContainerInfo)args.Model).IsExpanded = false; - olvConnections.Expanded += (sender, args) => ((ContainerInfo)args.Model).IsExpanded = true; + { + olvConnections.Collapsed += (sender, args) => + { + var container = args.Model as ContainerInfo; + if (container != null) + container.IsExpanded = false; + }; + olvConnections.Expanded += (sender, args) => + { + var container = args.Model as ContainerInfo; + if (container != null) + container.IsExpanded = true; + }; olvConnections.BeforeLabelEdit += tvConnections_BeforeLabelEdit; olvConnections.AfterLabelEdit += tvConnections_AfterLabelEdit; olvConnections.SelectionChanged += tvConnections_AfterSelect; @@ -114,7 +124,13 @@ namespace mRemoteNG.UI.Window cMenTreeDuplicate.Click += (sender, args) => DuplicateSelectedNode(); cMenTreeRename.Click += (sender, args) => RenameSelectedNode(); cMenTreeDelete.Click += (sender, args) => DeleteSelectedNode(); - } + mMenViewExpandAllFolders.Click += (sender, args) => olvConnections.ExpandAll(); + mMenViewCollapseAllFolders.Click += (sender, args) => + { + olvConnections.CollapseAll(); + olvConnections.Expand(GetRootConnectionNode()); + }; + } private void PopulateTreeView() { @@ -769,26 +785,6 @@ namespace mRemoteNG.UI.Window } #endregion - #region Menu - private void mMenViewExpandAllFolders_Click(object sender, EventArgs e) - { - olvConnections.ExpandAll(); - } - - //TODO Fix for TreeListView - private void mMenViewCollapseAllFolders_Click(object sender, EventArgs e) - { - if (tvConnections.SelectedNode != null) - { - if (tvConnections.SelectedNode.IsEditing) - { - tvConnections.SelectedNode.EndEdit(false); - } - } - ConnectionTree.CollapseAllNodes(); - } - #endregion - #region Search private void txtSearch_GotFocus(object sender, EventArgs e) { From 668e8de7dfcf35fb689322f143a52c874a31fe50 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 10:19:53 -0600 Subject: [PATCH 120/338] Removed unnecessary code --- mRemoteV1/Tree/ConnectionTree.cs | 55 -------------------------------- 1 file changed, 55 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index 5c2febb1e..224f1e380 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -28,61 +28,6 @@ namespace mRemoteNG.Tree } } - //TODO Fix for TreeListView - public static void CollapseAllNodes() - { - TreeView.BeginUpdate(); - foreach (TreeNode treeNode in TreeView.Nodes[0].Nodes) - { - treeNode.Collapse(false); - } - TreeView.EndUpdate(); - } - - //TODO Fix for TreeListView - public static void MoveNodeDown() - { - try - { - if (SelectedNode?.NextNode == null) return; - TreeView.BeginUpdate(); - TreeView.Sorted = false; - - TreeNode newNode = (TreeNode)SelectedNode.Clone(); - SelectedNode.Parent.Nodes.Insert(SelectedNode.Index + 2, newNode); - SelectedNode.Remove(); - SelectedNode = newNode; - - TreeView.EndUpdate(); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "MoveNodeDown failed" + Environment.NewLine + ex.Message, true); - } - } - - //TODO Fix for TreeListView - public static void MoveNodeUp() - { - try - { - if (SelectedNode?.PrevNode == null) return; - TreeView.BeginUpdate(); - TreeView.Sorted = false; - - TreeNode newNode = (TreeNode)SelectedNode.Clone(); - SelectedNode.Parent.Nodes.Insert(SelectedNode.Index - 1, newNode); - SelectedNode.Remove(); - SelectedNode = newNode; - - TreeView.EndUpdate(); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "MoveNodeUp failed" + Environment.NewLine + ex.Message, true); - } - } - //TODO Fix for TreeListView public static void Sort(TreeNode treeNode, SortOrder sorting) { From 7d882c3f7485e8475d103e9e7a614e4e39ffa259 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 11:42:56 -0600 Subject: [PATCH 121/338] Added function to get all children of the connectiontreemodel, including root nodes --- mRemoteV1/Tree/ConnectionTreeModel.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index 5234e1349..3859ec2da 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -15,6 +15,16 @@ namespace mRemoteNG.Tree RootNodes.Add(rootNode); } + public IEnumerable GetRecursiveChildList() + { + var list = new List(); + foreach (var rootNode in RootNodes) + { + list.AddRange(GetRecursiveChildList(rootNode)); + } + return list; + } + public IEnumerable GetRecursiveChildList(ContainerInfo container) { return container.GetRecursiveChildList(); From a992b41e265f7280a7da13a81aaccf761063f1f2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 11:43:40 -0600 Subject: [PATCH 122/338] Refactored node searching to a new class --- mRemoteV1/Tree/NodeSearcher.cs | 54 +++++++++++++++++++++ mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 17 +++---- mRemoteV1/mRemoteV1.csproj | 1 + 3 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 mRemoteV1/Tree/NodeSearcher.cs diff --git a/mRemoteV1/Tree/NodeSearcher.cs b/mRemoteV1/Tree/NodeSearcher.cs new file mode 100644 index 000000000..647ace718 --- /dev/null +++ b/mRemoteV1/Tree/NodeSearcher.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using System.Linq; +using mRemoteNG.Connection; + + +namespace mRemoteNG.Tree +{ + internal class NodeSearcher + { + private readonly ConnectionTreeModel _connectionTreeModel; + private ConnectionInfo _currentMatch; + + public List Matches { get; private set; } + + public NodeSearcher(ConnectionTreeModel connectionTreeModel) + { + _connectionTreeModel = connectionTreeModel; + } + + internal IEnumerable SearchByName(string searchText) + { + if (searchText == "") + ResetMatches(); + else + { + Matches = (List)_connectionTreeModel.GetRecursiveChildList().Where(node => node.Name.Contains(searchText)); + _currentMatch = Matches.First(); + } + return Matches; + } + + internal ConnectionInfo NextMatch() + { + var currentMatchIndex = Matches.IndexOf(_currentMatch); + if (currentMatchIndex < Matches.Count-1) + _currentMatch = Matches[currentMatchIndex + 1]; + return _currentMatch; + } + + internal ConnectionInfo PreviousMatch() + { + var currentMatchIndex = Matches.IndexOf(_currentMatch); + if (currentMatchIndex > 0) + _currentMatch = Matches[currentMatchIndex - 1]; + return _currentMatch; + } + + private void ResetMatches() + { + Matches = new List(); + _currentMatch = null; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 5d598b6a4..e53d200ca 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -19,6 +19,7 @@ namespace mRemoteNG.UI.Window { private ConnectionTreeModel _connectionTreeModel; private ConnectionTreeDragAndDropHandler _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); + private NodeSearcher _nodeSearcher; public ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; @@ -135,6 +136,7 @@ namespace mRemoteNG.UI.Window private void PopulateTreeView() { olvConnections.Roots = ConnectionTreeModel.RootNodes; + _nodeSearcher = new NodeSearcher(ConnectionTreeModel); ExpandPreviouslyOpenedFolders(); ExpandRootConnectionNode(); OpenConnectionsFromLastSession(); @@ -817,11 +819,13 @@ namespace mRemoteNG.UI.Window } else if (e.KeyCode == Keys.Up) { - tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode; + //tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode; + olvConnections.SelectObject(_nodeSearcher.PreviousMatch()); } else if (e.KeyCode == Keys.Down) { - tvConnections.SelectedNode = tvConnections.SelectedNode.NextVisibleNode; + //tvConnections.SelectedNode = tvConnections.SelectedNode.NextVisibleNode; + olvConnections.SelectObject(_nodeSearcher.NextMatch()); } else { @@ -837,13 +841,8 @@ namespace mRemoteNG.UI.Window //TODO Fix for TreeListView private void txtSearch_TextChanged(object sender, EventArgs e) { - try - { - tvConnections.SelectedNode = ConnectionTree.Find(tvConnections.Nodes[0], txtSearch.Text); - } - catch (Exception) - { - } + var matches = _nodeSearcher.SearchByName(txtSearch.Text); + olvConnections.SelectObject(matches.First()); } //TODO Fix for TreeListView diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 812761ceb..b7b553678 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -196,6 +196,7 @@ + From 764eb764cee4ddf94714dfd3d46567bdbeed6c81 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 12:23:42 -0600 Subject: [PATCH 123/338] Fixed case sensitivity when searching for nodes --- mRemoteV1/Tree/NodeSearcher.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mRemoteV1/Tree/NodeSearcher.cs b/mRemoteV1/Tree/NodeSearcher.cs index 647ace718..170fc89d4 100644 --- a/mRemoteV1/Tree/NodeSearcher.cs +++ b/mRemoteV1/Tree/NodeSearcher.cs @@ -19,13 +19,15 @@ namespace mRemoteNG.Tree internal IEnumerable SearchByName(string searchText) { - if (searchText == "") - ResetMatches(); - else + ResetMatches(); + if (searchText == "") return Matches; + var nodes = (List)_connectionTreeModel.GetRecursiveChildList(); + foreach (var node in nodes) { - Matches = (List)_connectionTreeModel.GetRecursiveChildList().Where(node => node.Name.Contains(searchText)); - _currentMatch = Matches.First(); + if (node.Name.ToLowerInvariant().Contains(searchText.ToLowerInvariant())) + Matches.Add(node); } + _currentMatch = Matches.First(); return Matches; } From 5e84b7cffefe07dc6287f52e9d683c8f05afc0fe Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 12:24:22 -0600 Subject: [PATCH 124/338] Made search match nodes highlighted in yellow --- mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 01c493b40..167aa4780 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -118,10 +118,12 @@ namespace mRemoteNG.UI.Window this.olvConnections.Location = new System.Drawing.Point(0, 0); this.olvConnections.MultiSelect = false; this.olvConnections.Name = "olvConnections"; + this.olvConnections.SelectedBackColor = System.Drawing.SystemColors.Highlight; this.olvConnections.ShowGroups = false; this.olvConnections.Size = new System.Drawing.Size(192, 410); this.olvConnections.SmallImageList = this.imgListTree; this.olvConnections.TabIndex = 20; + this.olvConnections.UnfocusedSelectedBackColor = System.Drawing.Color.Yellow; this.olvConnections.UseCompatibleStateImageBehavior = false; this.olvConnections.View = System.Windows.Forms.View.Details; this.olvConnections.VirtualMode = true; From d3e2976ff95e5d422a3ee10dcb5141bf0b2ab983 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 12:38:54 -0600 Subject: [PATCH 125/338] Scrolling through search results now ensures that the node is visible. Up/down keys no longer move the search box text cursor --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index e53d200ca..4e9082a3e 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -819,13 +819,19 @@ namespace mRemoteNG.UI.Window } else if (e.KeyCode == Keys.Up) { - //tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode; - olvConnections.SelectObject(_nodeSearcher.PreviousMatch()); + //tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode; + var match = _nodeSearcher.PreviousMatch(); + olvConnections.SelectObject(match); + olvConnections.EnsureModelVisible(match); + e.Handled = true; } else if (e.KeyCode == Keys.Down) { //tvConnections.SelectedNode = tvConnections.SelectedNode.NextVisibleNode; - olvConnections.SelectObject(_nodeSearcher.NextMatch()); + var match = _nodeSearcher.NextMatch(); + olvConnections.SelectObject(match); + olvConnections.EnsureModelVisible(match); + e.Handled = true; } else { @@ -842,7 +848,9 @@ namespace mRemoteNG.UI.Window private void txtSearch_TextChanged(object sender, EventArgs e) { var matches = _nodeSearcher.SearchByName(txtSearch.Text); - olvConnections.SelectObject(matches.First()); + var match = matches.First(); + olvConnections.SelectObject(match); + olvConnections.EnsureModelVisible(match); } //TODO Fix for TreeListView From b9718edfd3d47762be417e6b6d967e6fabfd1fb9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 13:07:08 -0600 Subject: [PATCH 126/338] Folders will now expand when scrolling through search results --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 29 ++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 4e9082a3e..898cb7c5e 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -821,17 +821,15 @@ namespace mRemoteNG.UI.Window { //tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode; var match = _nodeSearcher.PreviousMatch(); - olvConnections.SelectObject(match); - olvConnections.EnsureModelVisible(match); - e.Handled = true; + JumpToNode(match); + e.Handled = true; } else if (e.KeyCode == Keys.Down) { //tvConnections.SelectedNode = tvConnections.SelectedNode.NextVisibleNode; var match = _nodeSearcher.NextMatch(); - olvConnections.SelectObject(match); - olvConnections.EnsureModelVisible(match); - e.Handled = true; + JumpToNode(match); + e.Handled = true; } else { @@ -849,9 +847,22 @@ namespace mRemoteNG.UI.Window { var matches = _nodeSearcher.SearchByName(txtSearch.Text); var match = matches.First(); - olvConnections.SelectObject(match); - olvConnections.EnsureModelVisible(match); - } + JumpToNode(match); + } + + private void JumpToNode(ConnectionInfo connectionInfo) + { + ExpandParentsRecursive(connectionInfo); + olvConnections.SelectObject(connectionInfo); + olvConnections.EnsureModelVisible(connectionInfo); + } + + private void ExpandParentsRecursive(ConnectionInfo connectionInfo) + { + if (connectionInfo.Parent == null) return; + olvConnections.Expand(connectionInfo.Parent); + ExpandParentsRecursive(connectionInfo.Parent); + } //TODO Fix for TreeListView private void tvConnections_KeyPress(object sender, KeyPressEventArgs e) From b13382a6ee8874e8a213dab7fef1f27b717b86e5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 13:19:31 -0600 Subject: [PATCH 127/338] Hooked up the keydown event with the new connection tree --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 22 ++++----------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 898cb7c5e..c26c2c589 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -118,7 +118,8 @@ namespace mRemoteNG.UI.Window olvConnections.CellToolTipShowing += tvConnections_CellToolTipShowing; olvConnections.ModelCanDrop += _dragAndDropHandler.HandleEvent_ModelCanDrop; olvConnections.ModelDropped += _dragAndDropHandler.HandleEvent_ModelDropped; - } + olvConnections.KeyDown += tvConnections_KeyDown; + } private void SetMenuEventHandlers() { @@ -842,7 +843,6 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView private void txtSearch_TextChanged(object sender, EventArgs e) { var matches = _nodeSearcher.SearchByName(txtSearch.Text); @@ -890,22 +890,8 @@ namespace mRemoteNG.UI.Window { if (e.KeyCode == Keys.Enter) { - if (tvConnections.SelectedNode.Tag is ConnectionInfo) - { - e.Handled = true; - ConnectionInitiator.OpenConnection(SelectedNode); - } - else - { - if (tvConnections.SelectedNode.IsExpanded) - { - tvConnections.SelectedNode.Collapse(true); - } - else - { - tvConnections.SelectedNode.Expand(); - } - } + e.Handled = true; + ConnectionInitiator.OpenConnection(SelectedNode); } else if (e.KeyCode == Keys.Escape ^ e.KeyCode == Keys.Control | e.KeyCode == Keys.F) { From 92360eb2ceecf965d93f82ce2228e01c521ea2a3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 13:58:51 -0600 Subject: [PATCH 128/338] Fixed node search bug when no results are returned. --- mRemoteV1/Tree/NodeSearcher.cs | 20 +++++++++++--------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 17 +++++++++++------ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/mRemoteV1/Tree/NodeSearcher.cs b/mRemoteV1/Tree/NodeSearcher.cs index 170fc89d4..359585794 100644 --- a/mRemoteV1/Tree/NodeSearcher.cs +++ b/mRemoteV1/Tree/NodeSearcher.cs @@ -8,9 +8,10 @@ namespace mRemoteNG.Tree internal class NodeSearcher { private readonly ConnectionTreeModel _connectionTreeModel; - private ConnectionInfo _currentMatch; public List Matches { get; private set; } + public ConnectionInfo CurrentMatch { get; private set; } + public NodeSearcher(ConnectionTreeModel connectionTreeModel) { @@ -27,30 +28,31 @@ namespace mRemoteNG.Tree if (node.Name.ToLowerInvariant().Contains(searchText.ToLowerInvariant())) Matches.Add(node); } - _currentMatch = Matches.First(); + if (Matches.Count > 0) + CurrentMatch = Matches.First(); return Matches; } internal ConnectionInfo NextMatch() { - var currentMatchIndex = Matches.IndexOf(_currentMatch); + var currentMatchIndex = Matches.IndexOf(CurrentMatch); if (currentMatchIndex < Matches.Count-1) - _currentMatch = Matches[currentMatchIndex + 1]; - return _currentMatch; + CurrentMatch = Matches[currentMatchIndex + 1]; + return CurrentMatch; } internal ConnectionInfo PreviousMatch() { - var currentMatchIndex = Matches.IndexOf(_currentMatch); + var currentMatchIndex = Matches.IndexOf(CurrentMatch); if (currentMatchIndex > 0) - _currentMatch = Matches[currentMatchIndex - 1]; - return _currentMatch; + CurrentMatch = Matches[currentMatchIndex - 1]; + return CurrentMatch; } private void ResetMatches() { Matches = new List(); - _currentMatch = null; + CurrentMatch = null; } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index c26c2c589..acb7718f6 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -845,13 +845,17 @@ namespace mRemoteNG.UI.Window private void txtSearch_TextChanged(object sender, EventArgs e) { - var matches = _nodeSearcher.SearchByName(txtSearch.Text); - var match = matches.First(); - JumpToNode(match); + _nodeSearcher.SearchByName(txtSearch.Text); + JumpToNode(_nodeSearcher.CurrentMatch); } private void JumpToNode(ConnectionInfo connectionInfo) { + if (connectionInfo == null) + { + olvConnections.SelectedObject = null; + return; + } ExpandParentsRecursive(connectionInfo); olvConnections.SelectObject(connectionInfo); olvConnections.EnsureModelVisible(connectionInfo); @@ -859,7 +863,7 @@ namespace mRemoteNG.UI.Window private void ExpandParentsRecursive(ConnectionInfo connectionInfo) { - if (connectionInfo.Parent == null) return; + if (connectionInfo?.Parent == null) return; olvConnections.Expand(connectionInfo.Parent); ExpandParentsRecursive(connectionInfo.Parent); } @@ -893,10 +897,11 @@ namespace mRemoteNG.UI.Window e.Handled = true; ConnectionInitiator.OpenConnection(SelectedNode); } - else if (e.KeyCode == Keys.Escape ^ e.KeyCode == Keys.Control | e.KeyCode == Keys.F) + else if (e.Control && e.KeyCode == Keys.F) { txtSearch.Focus(); - txtSearch.SelectionStart = txtSearch.TextLength; + txtSearch.SelectAll(); + e.Handled = true; } } catch (Exception ex) From fa7c170540db441d9a517b0254990f78248b7826 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 13:59:30 -0600 Subject: [PATCH 129/338] Rather than yellow highlight, just make the node highlightling the same whether the contol has focus or not --- mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 167aa4780..802a9bd72 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -119,11 +119,13 @@ namespace mRemoteNG.UI.Window this.olvConnections.MultiSelect = false; this.olvConnections.Name = "olvConnections"; this.olvConnections.SelectedBackColor = System.Drawing.SystemColors.Highlight; + this.olvConnections.SelectedForeColor = System.Drawing.SystemColors.HighlightText; this.olvConnections.ShowGroups = false; this.olvConnections.Size = new System.Drawing.Size(192, 410); this.olvConnections.SmallImageList = this.imgListTree; this.olvConnections.TabIndex = 20; - this.olvConnections.UnfocusedSelectedBackColor = System.Drawing.Color.Yellow; + this.olvConnections.UnfocusedSelectedBackColor = System.Drawing.SystemColors.Highlight; + this.olvConnections.UnfocusedSelectedForeColor = System.Drawing.SystemColors.HighlightText; this.olvConnections.UseCompatibleStateImageBehavior = false; this.olvConnections.View = System.Windows.Forms.View.Details; this.olvConnections.VirtualMode = true; From 4accd71744b9a6ca64c1abbb45bef03a5360d1ec Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 14:19:43 -0600 Subject: [PATCH 130/338] Hitting escape while the search box has focus switches focus to the connections tree --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index acb7718f6..03ca5a4f1 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -816,18 +816,16 @@ namespace mRemoteNG.UI.Window if (e.KeyCode == Keys.Escape) { e.Handled = true; - tvConnections.Focus(); + olvConnections.Focus(); } else if (e.KeyCode == Keys.Up) { - //tvConnections.SelectedNode = tvConnections.SelectedNode.PrevVisibleNode; var match = _nodeSearcher.PreviousMatch(); JumpToNode(match); e.Handled = true; } else if (e.KeyCode == Keys.Down) { - //tvConnections.SelectedNode = tvConnections.SelectedNode.NextVisibleNode; var match = _nodeSearcher.NextMatch(); JumpToNode(match); e.Handled = true; From e74884bceafec876dd91d0abaab6362b2a225d09 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 14:27:31 -0600 Subject: [PATCH 131/338] any letter or number key press while the connections tree has focus will activate the search box --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 27 +++++++-------------- 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 03ca5a4f1..d1e7a8a7e 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -119,6 +119,7 @@ namespace mRemoteNG.UI.Window olvConnections.ModelCanDrop += _dragAndDropHandler.HandleEvent_ModelCanDrop; olvConnections.ModelDropped += _dragAndDropHandler.HandleEvent_ModelDropped; olvConnections.KeyDown += tvConnections_KeyDown; + olvConnections.KeyPress += tvConnections_KeyPress; } private void SetMenuEventHandlers() @@ -793,22 +794,16 @@ namespace mRemoteNG.UI.Window { txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextColor; if (txtSearch.Text == Language.strSearchPrompt) - { txtSearch.Text = ""; - } } - //TODO Fix for TreeListView private void txtSearch_LostFocus(object sender, EventArgs e) { - if (txtSearch.Text == "") - { - txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; - txtSearch.Text = Language.strSearchPrompt; - } + if (txtSearch.Text != "") return; + txtSearch.ForeColor = Themes.ThemeManager.ActiveTheme.SearchBoxTextPromptColor; + txtSearch.Text = Language.strSearchPrompt; } - //TODO Fix for TreeListView private void txtSearch_KeyDown(object sender, KeyEventArgs e) { try @@ -843,6 +838,7 @@ namespace mRemoteNG.UI.Window private void txtSearch_TextChanged(object sender, EventArgs e) { + if (txtSearch.Text == "") return; _nodeSearcher.SearchByName(txtSearch.Text); JumpToNode(_nodeSearcher.CurrentMatch); } @@ -866,18 +862,14 @@ namespace mRemoteNG.UI.Window ExpandParentsRecursive(connectionInfo.Parent); } - //TODO Fix for TreeListView private void tvConnections_KeyPress(object sender, KeyPressEventArgs e) { try { - if (char.IsLetterOrDigit(e.KeyChar)) - { - txtSearch.Text = e.KeyChar.ToString(); - - txtSearch.Focus(); - txtSearch.SelectionStart = txtSearch.TextLength; - } + if (!char.IsLetterOrDigit(e.KeyChar)) return; + txtSearch.Text = e.KeyChar.ToString(); + txtSearch.Focus(); + txtSearch.SelectionStart = txtSearch.TextLength; } catch (Exception ex) { @@ -885,7 +877,6 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView private void tvConnections_KeyDown(object sender, KeyEventArgs e) { try From b214efc029b4e420c2de874858c941e354237165 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 14:41:13 -0600 Subject: [PATCH 132/338] Fixed SSH transfer window creation from context menu --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index d1e7a8a7e..7efc443ce 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -686,7 +686,6 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView private void DisconnectConnection(ConnectionInfo connectionInfo) { try @@ -717,19 +716,15 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView - private static void SshTransferFile() + private void SshTransferFile() { try { - Windows.Show(WindowType.SSHTransfer); - - ConnectionInfo conI = (ConnectionInfo)ConnectionTree.SelectedNode.Tag; - - Windows.sshtransferForm.Hostname = conI.Hostname; - Windows.sshtransferForm.Username = conI.Username; - Windows.sshtransferForm.Password = conI.Password; - Windows.sshtransferForm.Port = Convert.ToString(conI.Port); + Windows.Show(WindowType.SSHTransfer); + Windows.sshtransferForm.Hostname = SelectedNode.Hostname; + Windows.sshtransferForm.Username = SelectedNode.Username; + Windows.sshtransferForm.Password = SelectedNode.Password; + Windows.sshtransferForm.Port = Convert.ToString(SelectedNode.Port); } catch (Exception ex) { From 7b2a30dcbf417d00a6aa2f0c30ea8e02f1d700e3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 14:52:47 -0600 Subject: [PATCH 133/338] Starting external tools from the connections tree now works --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 50 ++++++++++----------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 7efc443ce..553861057 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -732,33 +732,23 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView private void AddExternalApps() { try { - //clean up - //since new items are added below, we have to dispose of any previous items first - if (cMenTreeToolsExternalApps.DropDownItems.Count > 0) - { - for (int i = cMenTreeToolsExternalApps.DropDownItems.Count - 1; i >= 0; i--) - cMenTreeToolsExternalApps.DropDownItems[i].Dispose(); + ResetExternalAppMenu(); - cMenTreeToolsExternalApps.DropDownItems.Clear(); - } - - //add ext apps - foreach (Tools.ExternalTool extA in Runtime.ExternalTools) + foreach (Tools.ExternalTool extA in Runtime.ExternalTools) { - ToolStripMenuItem nItem = new ToolStripMenuItem(); - nItem.Text = extA.DisplayName; - nItem.Tag = extA; - - nItem.Image = extA.Image; - - nItem.Click += cMenTreeToolsExternalAppsEntry_Click; - - cMenTreeToolsExternalApps.DropDownItems.Add(nItem); + var menuItem = new ToolStripMenuItem + { + Text = extA.DisplayName, + Tag = extA, + Image = extA.Image + }; + + menuItem.Click += cMenTreeToolsExternalAppsEntry_Click; + cMenTreeToolsExternalApps.DropDownItems.Add(menuItem); } } catch (Exception ex) @@ -767,15 +757,21 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView - private static void StartExternalApp(Tools.ExternalTool externalTool) + private void ResetExternalAppMenu() + { + if (cMenTreeToolsExternalApps.DropDownItems.Count <= 0) return; + for (var i = cMenTreeToolsExternalApps.DropDownItems.Count - 1; i >= 0; i--) + cMenTreeToolsExternalApps.DropDownItems[i].Dispose(); + + cMenTreeToolsExternalApps.DropDownItems.Clear(); + } + + private void StartExternalApp(Tools.ExternalTool externalTool) { try { - if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) - { - externalTool.Start((ConnectionInfo)ConnectionTree.SelectedNode.Tag); - } + if (SelectedNode.GetTreeNodeType() == TreeNodeType.Connection | SelectedNode.GetTreeNodeType() == TreeNodeType.PuttySession) + externalTool.Start(SelectedNode); } catch (Exception ex) { From f0f9d2a6aa17bb790ac9194f886ff71682637761 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 15:07:19 -0600 Subject: [PATCH 134/338] Little bit of cleanup --- .../Window/ConnectionTreeWindow.Designer.cs | 3 -- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 49 +++---------------- 2 files changed, 6 insertions(+), 46 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 802a9bd72..208697f89 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -163,7 +163,6 @@ namespace mRemoteNG.UI.Window this.cMenTree.Name = "cMenTree"; this.cMenTree.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; this.cMenTree.Size = new System.Drawing.Size(200, 364); - this.cMenTree.Opening += new System.ComponentModel.CancelEventHandler(this.cMenTree_DropDownOpening); // // cMenTreeConnect // @@ -312,14 +311,12 @@ namespace mRemoteNG.UI.Window this.cMenTreeImportActiveDirectory.Name = "cMenTreeImportActiveDirectory"; this.cMenTreeImportActiveDirectory.Size = new System.Drawing.Size(226, 22); this.cMenTreeImportActiveDirectory.Text = "Import from &Active Directory..."; - this.cMenTreeImportActiveDirectory.Click += new System.EventHandler(this.cMenTreeImportActiveDirectory_Click); // // cMenTreeImportPortScan // this.cMenTreeImportPortScan.Name = "cMenTreeImportPortScan"; this.cMenTreeImportPortScan.Size = new System.Drawing.Size(226, 22); this.cMenTreeImportPortScan.Text = "Import from &Port Scan..."; - this.cMenTreeImportPortScan.Click += new System.EventHandler(this.cMenTreeImportPortScan_Click); // // cMenTreeExportFile // diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 553861057..ee9b3efc5 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -133,7 +133,10 @@ namespace mRemoteNG.UI.Window olvConnections.CollapseAll(); olvConnections.Expand(GetRootConnectionNode()); }; - } + cMenTree.Opening += (sender, args) => AddExternalApps(); + cMenTreeImport.Click += (sender, args) => Windows.Show(WindowType.ActiveDirectoryImport); + cMenTreeImportPortScan.Click += (sender, args) => Windows.Show(WindowType.PortScan); + } private void PopulateTreeView() { @@ -390,7 +393,6 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true) { foreach (ToolStripItem item in items) @@ -408,7 +410,6 @@ namespace mRemoteNG.UI.Window } } - //TODO Fix for TreeListView private void ShowHideTreeContextMenuItems(ConnectionInfo connectionInfo) { if (connectionInfo == null) @@ -456,19 +457,9 @@ namespace mRemoteNG.UI.Window cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; cMenTreeDisconnect.Enabled = false; - var openConnections = 0; - //foreach (TreeNode node in selectedNode.Nodes) - //{ - // if (node.Tag is ConnectionInfo) - // { - // var connectionInfo = (ConnectionInfo)node.Tag; - // openConnections = openConnections + connectionInfo.OpenConnections.Count; - // } - //} + var openConnections = ((ContainerInfo) connectionInfo).Children.Sum(child => child.OpenConnections.Count); if (openConnections == 0) - { cMenTreeDisconnect.Enabled = false; - } cMenTreeToolsTransferFile.Enabled = false; cMenTreeToolsExternalApps.Enabled = false; @@ -479,14 +470,10 @@ namespace mRemoteNG.UI.Window cMenTreeAddFolder.Enabled = false; if (connectionInfo.OpenConnections.Count == 0) - { cMenTreeDisconnect.Enabled = false; - } if (!(connectionInfo.Protocol == ProtocolType.SSH1 | connectionInfo.Protocol == ProtocolType.SSH2)) - { cMenTreeToolsTransferFile.Enabled = false; - } cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; @@ -602,36 +589,12 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - //TODO Fix for TreeListView - private void cMenTree_DropDownOpening(object sender, EventArgs e) - { - AddExternalApps(); - } - - //TODO Fix for TreeListView - private void cMenTreeToolsExternalAppsEntry_Click(object sender, EventArgs e) - { - StartExternalApp((Tools.ExternalTool)((ToolStripMenuItem)sender).Tag); - } - //TODO Fix for TreeListView private void cMenTreeImportFile_Click(object sender, EventArgs e) { Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true); } - //TODO Fix for TreeListView - private void cMenTreeImportActiveDirectory_Click(object sender, EventArgs e) - { - Windows.Show(WindowType.ActiveDirectoryImport); - } - - //TODO Fix for TreeListView - private void cMenTreeImportPortScan_Click(object sender, EventArgs e) - { - Windows.Show(WindowType.PortScan); - } - //TODO Fix for TreeListView private void cMenTreeExportFile_Click(object sender, EventArgs e) { @@ -747,7 +710,7 @@ namespace mRemoteNG.UI.Window Image = extA.Image }; - menuItem.Click += cMenTreeToolsExternalAppsEntry_Click; + menuItem.Click += (sender, args) => StartExternalApp((Tools.ExternalTool)((ToolStripMenuItem)sender).Tag); cMenTreeToolsExternalApps.DropDownItems.Add(menuItem); } } From 7d7d4e62a37c61f1e26f36da9e8a9edc42de80bd Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 14 Sep 2016 15:26:21 -0600 Subject: [PATCH 135/338] Began moving connection tree context menu to its own class --- .../UI/Controls/ConnectionContextMenu.cs | 340 ++++++++++++++++++ mRemoteV1/mRemoteV1.csproj | 3 + 2 files changed, 343 insertions(+) create mode 100644 mRemoteV1/UI/Controls/ConnectionContextMenu.cs diff --git a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs new file mode 100644 index 000000000..c44848cd4 --- /dev/null +++ b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs @@ -0,0 +1,340 @@ +using System.Windows.Forms; + + +namespace mRemoteNG.UI.Controls +{ + internal class ConnectionContextMenu : ContextMenuStrip + { + private ToolStripMenuItem cMenTreeAddConnection; + private ToolStripMenuItem cMenTreeAddFolder; + private ToolStripSeparator cMenTreeSep1; + private ToolStripMenuItem cMenTreeConnect; + private ToolStripMenuItem cMenTreeConnectWithOptions; + private ToolStripMenuItem cMenTreeConnectWithOptionsConnectToConsoleSession; + private ToolStripMenuItem cMenTreeConnectWithOptionsNoCredentials; + private ToolStripMenuItem cMenTreeConnectWithOptionsConnectInFullscreen; + private ToolStripMenuItem cMenTreeDisconnect; + private ToolStripSeparator cMenTreeSep2; + private ToolStripMenuItem cMenTreeToolsTransferFile; + private ToolStripMenuItem cMenTreeToolsSort; + private ToolStripMenuItem cMenTreeToolsSortAscending; + private ToolStripMenuItem cMenTreeToolsSortDescending; + private ToolStripSeparator cMenTreeSep3; + private ToolStripMenuItem cMenTreeRename; + private ToolStripMenuItem cMenTreeDelete; + private ToolStripSeparator cMenTreeSep4; + private ToolStripMenuItem cMenTreeMoveUp; + private ToolStripMenuItem cMenTreeMoveDown; + private PictureBox PictureBox1; + private ToolStripMenuItem cMenTreeToolsExternalApps; + private ToolStripMenuItem cMenTreeDuplicate; + private ToolStripMenuItem cMenTreeConnectWithOptionsChoosePanelBeforeConnecting; + private ToolStripMenuItem cMenTreeConnectWithOptionsDontConnectToConsoleSession; + private ToolStripMenuItem cMenTreeImport; + private ToolStripMenuItem cMenTreeExportFile; + private ToolStripSeparator ToolStripSeparator1; + private ToolStripMenuItem cMenTreeImportFile; + private ToolStripMenuItem cMenTreeImportActiveDirectory; + private ToolStripMenuItem cMenTreeImportPortScan; + + + public ConnectionContextMenu() + { + + } + + private void InitializeComponent() + { + cMenTreeConnect = new ToolStripMenuItem(); + cMenTreeConnectWithOptions = new ToolStripMenuItem(); + cMenTreeConnectWithOptionsConnectToConsoleSession = new ToolStripMenuItem(); + cMenTreeConnectWithOptionsDontConnectToConsoleSession = new ToolStripMenuItem(); + cMenTreeConnectWithOptionsConnectInFullscreen = new ToolStripMenuItem(); + cMenTreeConnectWithOptionsNoCredentials = new ToolStripMenuItem(); + cMenTreeConnectWithOptionsChoosePanelBeforeConnecting = new ToolStripMenuItem(); + cMenTreeDisconnect = new ToolStripMenuItem(); + cMenTreeSep1 = new ToolStripSeparator(); + cMenTreeToolsExternalApps = new ToolStripMenuItem(); + cMenTreeToolsTransferFile = new ToolStripMenuItem(); + cMenTreeSep2 = new ToolStripSeparator(); + cMenTreeDuplicate = new ToolStripMenuItem(); + cMenTreeRename = new ToolStripMenuItem(); + cMenTreeDelete = new ToolStripMenuItem(); + cMenTreeSep3 = new ToolStripSeparator(); + cMenTreeImport = new ToolStripMenuItem(); + cMenTreeImportFile = new ToolStripMenuItem(); + cMenTreeImportActiveDirectory = new ToolStripMenuItem(); + cMenTreeImportPortScan = new ToolStripMenuItem(); + cMenTreeExportFile = new ToolStripMenuItem(); + cMenTreeSep4 = new ToolStripSeparator(); + cMenTreeAddConnection = new ToolStripMenuItem(); + cMenTreeAddFolder = new ToolStripMenuItem(); + ToolStripSeparator1 = new ToolStripSeparator(); + cMenTreeToolsSort = new ToolStripMenuItem(); + cMenTreeToolsSortAscending = new ToolStripMenuItem(); + cMenTreeToolsSortDescending = new ToolStripMenuItem(); + cMenTreeMoveUp = new ToolStripMenuItem(); + cMenTreeMoveDown = new ToolStripMenuItem(); + + + // + // cMenTree + // + this.cMenTree.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cMenTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cMenTreeConnect, + this.cMenTreeConnectWithOptions, + this.cMenTreeDisconnect, + this.cMenTreeSep1, + this.cMenTreeToolsExternalApps, + this.cMenTreeToolsTransferFile, + this.cMenTreeSep2, + this.cMenTreeDuplicate, + this.cMenTreeRename, + this.cMenTreeDelete, + this.cMenTreeSep3, + this.cMenTreeImport, + this.cMenTreeExportFile, + this.cMenTreeSep4, + this.cMenTreeAddConnection, + this.cMenTreeAddFolder, + this.ToolStripSeparator1, + this.cMenTreeToolsSort, + this.cMenTreeMoveUp, + this.cMenTreeMoveDown}); + this.cMenTree.Name = "cMenTree"; + this.cMenTree.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.cMenTree.Size = new System.Drawing.Size(200, 364); + // + // cMenTreeConnect + // + this.cMenTreeConnect.Image = global::mRemoteNG.Resources.Play; + this.cMenTreeConnect.Name = "cMenTreeConnect"; + this.cMenTreeConnect.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.C))); + this.cMenTreeConnect.Size = new System.Drawing.Size(199, 22); + this.cMenTreeConnect.Text = "Connect"; + this.cMenTreeConnect.Click += new System.EventHandler(this.cMenTreeConnect_Click); + // + // cMenTreeConnectWithOptions + // + this.cMenTreeConnectWithOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cMenTreeConnectWithOptionsConnectToConsoleSession, + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession, + this.cMenTreeConnectWithOptionsConnectInFullscreen, + this.cMenTreeConnectWithOptionsNoCredentials, + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting}); + this.cMenTreeConnectWithOptions.Name = "cMenTreeConnectWithOptions"; + this.cMenTreeConnectWithOptions.Size = new System.Drawing.Size(199, 22); + this.cMenTreeConnectWithOptions.Text = "Connect (with options)"; + // + // cMenTreeConnectWithOptionsConnectToConsoleSession + // + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Image = global::mRemoteNG.Resources.monitor_go; + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsConnectToConsoleSession"; + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Text = "Connect to console session"; + this.cMenTreeConnectWithOptionsConnectToConsoleSession.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsConnectToConsoleSession_Click); + // + // cMenTreeConnectWithOptionsDontConnectToConsoleSession + // + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Image = global::mRemoteNG.Resources.monitor_delete; + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsDontConnectToConsoleSession"; + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = "Don\'t connect to console session"; + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Visible = false; + this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click); + // + // cMenTreeConnectWithOptionsConnectInFullscreen + // + this.cMenTreeConnectWithOptionsConnectInFullscreen.Image = global::mRemoteNG.Resources.arrow_out; + this.cMenTreeConnectWithOptionsConnectInFullscreen.Name = "cMenTreeConnectWithOptionsConnectInFullscreen"; + this.cMenTreeConnectWithOptionsConnectInFullscreen.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsConnectInFullscreen.Text = "Connect in fullscreen"; + this.cMenTreeConnectWithOptionsConnectInFullscreen.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsConnectInFullscreen_Click); + // + // cMenTreeConnectWithOptionsNoCredentials + // + this.cMenTreeConnectWithOptionsNoCredentials.Image = global::mRemoteNG.Resources.key_delete; + this.cMenTreeConnectWithOptionsNoCredentials.Name = "cMenTreeConnectWithOptionsNoCredentials"; + this.cMenTreeConnectWithOptionsNoCredentials.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsNoCredentials.Text = "Connect without credentials"; + this.cMenTreeConnectWithOptionsNoCredentials.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsNoCredentials_Click); + // + // cMenTreeConnectWithOptionsChoosePanelBeforeConnecting + // + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Image = global::mRemoteNG.Resources.Panels; + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Name = "cMenTreeConnectWithOptionsChoosePanelBeforeConnecting"; + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Size = new System.Drawing.Size(245, 22); + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = "Choose panel before connecting"; + this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click); + // + // cMenTreeDisconnect + // + this.cMenTreeDisconnect.Image = global::mRemoteNG.Resources.Pause; + this.cMenTreeDisconnect.Name = "cMenTreeDisconnect"; + this.cMenTreeDisconnect.Size = new System.Drawing.Size(199, 22); + this.cMenTreeDisconnect.Text = "Disconnect"; + this.cMenTreeDisconnect.Click += new System.EventHandler(this.cMenTreeDisconnect_Click); + // + // cMenTreeSep1 + // + this.cMenTreeSep1.Name = "cMenTreeSep1"; + this.cMenTreeSep1.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeToolsExternalApps + // + this.cMenTreeToolsExternalApps.Image = global::mRemoteNG.Resources.ExtApp; + this.cMenTreeToolsExternalApps.Name = "cMenTreeToolsExternalApps"; + this.cMenTreeToolsExternalApps.Size = new System.Drawing.Size(199, 22); + this.cMenTreeToolsExternalApps.Text = "External Applications"; + // + // cMenTreeToolsTransferFile + // + this.cMenTreeToolsTransferFile.Image = global::mRemoteNG.Resources.SSHTransfer; + this.cMenTreeToolsTransferFile.Name = "cMenTreeToolsTransferFile"; + this.cMenTreeToolsTransferFile.Size = new System.Drawing.Size(199, 22); + this.cMenTreeToolsTransferFile.Text = "Transfer File (SSH)"; + this.cMenTreeToolsTransferFile.Click += new System.EventHandler(this.cMenTreeToolsTransferFile_Click); + // + // cMenTreeSep2 + // + this.cMenTreeSep2.Name = "cMenTreeSep2"; + this.cMenTreeSep2.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeDuplicate + // + this.cMenTreeDuplicate.Image = global::mRemoteNG.Resources.page_copy; + this.cMenTreeDuplicate.Name = "cMenTreeDuplicate"; + this.cMenTreeDuplicate.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); + this.cMenTreeDuplicate.Size = new System.Drawing.Size(199, 22); + this.cMenTreeDuplicate.Text = "Duplicate"; + // + // cMenTreeRename + // + this.cMenTreeRename.Image = global::mRemoteNG.Resources.Rename; + this.cMenTreeRename.Name = "cMenTreeRename"; + this.cMenTreeRename.ShortcutKeys = System.Windows.Forms.Keys.F2; + this.cMenTreeRename.Size = new System.Drawing.Size(199, 22); + this.cMenTreeRename.Text = "Rename"; + // + // cMenTreeDelete + // + this.cMenTreeDelete.Image = global::mRemoteNG.Resources.Delete; + this.cMenTreeDelete.Name = "cMenTreeDelete"; + this.cMenTreeDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; + this.cMenTreeDelete.Size = new System.Drawing.Size(199, 22); + this.cMenTreeDelete.Text = "Delete"; + // + // cMenTreeSep3 + // + this.cMenTreeSep3.Name = "cMenTreeSep3"; + this.cMenTreeSep3.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeImport + // + this.cMenTreeImport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cMenTreeImportFile, + this.cMenTreeImportActiveDirectory, + this.cMenTreeImportPortScan}); + this.cMenTreeImport.Name = "cMenTreeImport"; + this.cMenTreeImport.Size = new System.Drawing.Size(199, 22); + this.cMenTreeImport.Text = "&Import"; + // + // cMenTreeImportFile + // + this.cMenTreeImportFile.Name = "cMenTreeImportFile"; + this.cMenTreeImportFile.Size = new System.Drawing.Size(226, 22); + this.cMenTreeImportFile.Text = "Import from &File..."; + this.cMenTreeImportFile.Click += new System.EventHandler(this.cMenTreeImportFile_Click); + // + // cMenTreeImportActiveDirectory + // + this.cMenTreeImportActiveDirectory.Name = "cMenTreeImportActiveDirectory"; + this.cMenTreeImportActiveDirectory.Size = new System.Drawing.Size(226, 22); + this.cMenTreeImportActiveDirectory.Text = "Import from &Active Directory..."; + // + // cMenTreeImportPortScan + // + this.cMenTreeImportPortScan.Name = "cMenTreeImportPortScan"; + this.cMenTreeImportPortScan.Size = new System.Drawing.Size(226, 22); + this.cMenTreeImportPortScan.Text = "Import from &Port Scan..."; + // + // cMenTreeExportFile + // + this.cMenTreeExportFile.Name = "cMenTreeExportFile"; + this.cMenTreeExportFile.Size = new System.Drawing.Size(199, 22); + this.cMenTreeExportFile.Text = "&Export to File..."; + this.cMenTreeExportFile.Click += new System.EventHandler(this.cMenTreeExportFile_Click); + // + // cMenTreeSep4 + // + this.cMenTreeSep4.Name = "cMenTreeSep4"; + this.cMenTreeSep4.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeAddConnection + // + this.cMenTreeAddConnection.Image = global::mRemoteNG.Resources.Connection_Add; + this.cMenTreeAddConnection.Name = "cMenTreeAddConnection"; + this.cMenTreeAddConnection.Size = new System.Drawing.Size(199, 22); + this.cMenTreeAddConnection.Text = "New Connection"; + this.cMenTreeAddConnection.Click += new System.EventHandler(this.cMenTreeAddConnection_Click); + // + // cMenTreeAddFolder + // + this.cMenTreeAddFolder.Image = global::mRemoteNG.Resources.Folder_Add; + this.cMenTreeAddFolder.Name = "cMenTreeAddFolder"; + this.cMenTreeAddFolder.Size = new System.Drawing.Size(199, 22); + this.cMenTreeAddFolder.Text = "New Folder"; + this.cMenTreeAddFolder.Click += new System.EventHandler(this.cMenTreeAddFolder_Click); + // + // ToolStripSeparator1 + // + this.ToolStripSeparator1.Name = "ToolStripSeparator1"; + this.ToolStripSeparator1.Size = new System.Drawing.Size(196, 6); + // + // cMenTreeToolsSort + // + this.cMenTreeToolsSort.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cMenTreeToolsSortAscending, + this.cMenTreeToolsSortDescending}); + this.cMenTreeToolsSort.Name = "cMenTreeToolsSort"; + this.cMenTreeToolsSort.Size = new System.Drawing.Size(199, 22); + this.cMenTreeToolsSort.Text = "Sort"; + // + // cMenTreeToolsSortAscending + // + this.cMenTreeToolsSortAscending.Image = global::mRemoteNG.Resources.Sort_AZ; + this.cMenTreeToolsSortAscending.Name = "cMenTreeToolsSortAscending"; + this.cMenTreeToolsSortAscending.Size = new System.Drawing.Size(161, 22); + this.cMenTreeToolsSortAscending.Text = "Ascending (A-Z)"; + this.cMenTreeToolsSortAscending.Click += new System.EventHandler(this.cMenTreeToolsSortAscending_Click); + // + // cMenTreeToolsSortDescending + // + this.cMenTreeToolsSortDescending.Image = global::mRemoteNG.Resources.Sort_ZA; + this.cMenTreeToolsSortDescending.Name = "cMenTreeToolsSortDescending"; + this.cMenTreeToolsSortDescending.Size = new System.Drawing.Size(161, 22); + this.cMenTreeToolsSortDescending.Text = "Descending (Z-A)"; + this.cMenTreeToolsSortDescending.Click += new System.EventHandler(this.cMenTreeToolsSortDescending_Click); + // + // cMenTreeMoveUp + // + this.cMenTreeMoveUp.Image = global::mRemoteNG.Resources.Arrow_Up; + this.cMenTreeMoveUp.Name = "cMenTreeMoveUp"; + this.cMenTreeMoveUp.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); + this.cMenTreeMoveUp.Size = new System.Drawing.Size(199, 22); + this.cMenTreeMoveUp.Text = "Move up"; + this.cMenTreeMoveUp.Click += new System.EventHandler(this.cMenTreeMoveUp_Click); + // + // cMenTreeMoveDown + // + this.cMenTreeMoveDown.Image = global::mRemoteNG.Resources.Arrow_Down; + this.cMenTreeMoveDown.Name = "cMenTreeMoveDown"; + this.cMenTreeMoveDown.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); + this.cMenTreeMoveDown.Size = new System.Drawing.Size(199, 22); + this.cMenTreeMoveDown.Text = "Move down"; + this.cMenTreeMoveDown.Click += new System.EventHandler(this.cMenTreeMoveDown_Click); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index b7b553678..d37c93220 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -201,6 +201,9 @@ + + Component + Component From eed85b364190f7709334d4f983756e599b4837ab Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 15 Sep 2016 09:06:54 -0600 Subject: [PATCH 136/338] Finished creating pass-through events for the underlying context menu --- .../UI/Controls/ConnectionContextMenu.cs | 614 +++++++++++------- 1 file changed, 386 insertions(+), 228 deletions(-) diff --git a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs index c44848cd4..dff5ae682 100644 --- a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs +++ b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs @@ -1,340 +1,498 @@ -using System.Windows.Forms; +using System; +using System.Windows.Forms; namespace mRemoteNG.UI.Controls { internal class ConnectionContextMenu : ContextMenuStrip { - private ToolStripMenuItem cMenTreeAddConnection; - private ToolStripMenuItem cMenTreeAddFolder; - private ToolStripSeparator cMenTreeSep1; - private ToolStripMenuItem cMenTreeConnect; - private ToolStripMenuItem cMenTreeConnectWithOptions; - private ToolStripMenuItem cMenTreeConnectWithOptionsConnectToConsoleSession; - private ToolStripMenuItem cMenTreeConnectWithOptionsNoCredentials; - private ToolStripMenuItem cMenTreeConnectWithOptionsConnectInFullscreen; - private ToolStripMenuItem cMenTreeDisconnect; - private ToolStripSeparator cMenTreeSep2; - private ToolStripMenuItem cMenTreeToolsTransferFile; - private ToolStripMenuItem cMenTreeToolsSort; - private ToolStripMenuItem cMenTreeToolsSortAscending; - private ToolStripMenuItem cMenTreeToolsSortDescending; - private ToolStripSeparator cMenTreeSep3; - private ToolStripMenuItem cMenTreeRename; - private ToolStripMenuItem cMenTreeDelete; - private ToolStripSeparator cMenTreeSep4; - private ToolStripMenuItem cMenTreeMoveUp; - private ToolStripMenuItem cMenTreeMoveDown; - private PictureBox PictureBox1; - private ToolStripMenuItem cMenTreeToolsExternalApps; - private ToolStripMenuItem cMenTreeDuplicate; - private ToolStripMenuItem cMenTreeConnectWithOptionsChoosePanelBeforeConnecting; - private ToolStripMenuItem cMenTreeConnectWithOptionsDontConnectToConsoleSession; - private ToolStripMenuItem cMenTreeImport; - private ToolStripMenuItem cMenTreeExportFile; - private ToolStripSeparator ToolStripSeparator1; - private ToolStripMenuItem cMenTreeImportFile; - private ToolStripMenuItem cMenTreeImportActiveDirectory; - private ToolStripMenuItem cMenTreeImportPortScan; + private ToolStripMenuItem _cMenTreeAddConnection; + private ToolStripMenuItem _cMenTreeAddFolder; + private ToolStripSeparator _cMenTreeSep1; + private ToolStripMenuItem _cMenTreeConnect; + private ToolStripMenuItem _cMenTreeConnectWithOptions; + private ToolStripMenuItem _cMenTreeConnectWithOptionsConnectToConsoleSession; + private ToolStripMenuItem _cMenTreeConnectWithOptionsNoCredentials; + private ToolStripMenuItem _cMenTreeConnectWithOptionsConnectInFullscreen; + private ToolStripMenuItem _cMenTreeDisconnect; + private ToolStripSeparator _cMenTreeSep2; + private ToolStripMenuItem _cMenTreeToolsTransferFile; + private ToolStripMenuItem _cMenTreeToolsSort; + private ToolStripMenuItem _cMenTreeToolsSortAscending; + private ToolStripMenuItem _cMenTreeToolsSortDescending; + private ToolStripSeparator _cMenTreeSep3; + private ToolStripMenuItem _cMenTreeRename; + private ToolStripMenuItem _cMenTreeDelete; + private ToolStripSeparator _cMenTreeSep4; + private ToolStripMenuItem _cMenTreeMoveUp; + private ToolStripMenuItem _cMenTreeMoveDown; + private PictureBox _pictureBox1; + private ToolStripMenuItem _cMenTreeToolsExternalApps; + private ToolStripMenuItem _cMenTreeDuplicate; + private ToolStripMenuItem _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting; + private ToolStripMenuItem _cMenTreeConnectWithOptionsDontConnectToConsoleSession; + private ToolStripMenuItem _cMenTreeImport; + private ToolStripMenuItem _cMenTreeExportFile; + private ToolStripSeparator _toolStripSeparator1; + private ToolStripMenuItem _cMenTreeImportFile; + private ToolStripMenuItem _cMenTreeImportActiveDirectory; + private ToolStripMenuItem _cMenTreeImportPortScan; public ConnectionContextMenu() { - + InitializeComponent(); } private void InitializeComponent() { - cMenTreeConnect = new ToolStripMenuItem(); - cMenTreeConnectWithOptions = new ToolStripMenuItem(); - cMenTreeConnectWithOptionsConnectToConsoleSession = new ToolStripMenuItem(); - cMenTreeConnectWithOptionsDontConnectToConsoleSession = new ToolStripMenuItem(); - cMenTreeConnectWithOptionsConnectInFullscreen = new ToolStripMenuItem(); - cMenTreeConnectWithOptionsNoCredentials = new ToolStripMenuItem(); - cMenTreeConnectWithOptionsChoosePanelBeforeConnecting = new ToolStripMenuItem(); - cMenTreeDisconnect = new ToolStripMenuItem(); - cMenTreeSep1 = new ToolStripSeparator(); - cMenTreeToolsExternalApps = new ToolStripMenuItem(); - cMenTreeToolsTransferFile = new ToolStripMenuItem(); - cMenTreeSep2 = new ToolStripSeparator(); - cMenTreeDuplicate = new ToolStripMenuItem(); - cMenTreeRename = new ToolStripMenuItem(); - cMenTreeDelete = new ToolStripMenuItem(); - cMenTreeSep3 = new ToolStripSeparator(); - cMenTreeImport = new ToolStripMenuItem(); - cMenTreeImportFile = new ToolStripMenuItem(); - cMenTreeImportActiveDirectory = new ToolStripMenuItem(); - cMenTreeImportPortScan = new ToolStripMenuItem(); - cMenTreeExportFile = new ToolStripMenuItem(); - cMenTreeSep4 = new ToolStripSeparator(); - cMenTreeAddConnection = new ToolStripMenuItem(); - cMenTreeAddFolder = new ToolStripMenuItem(); - ToolStripSeparator1 = new ToolStripSeparator(); - cMenTreeToolsSort = new ToolStripMenuItem(); - cMenTreeToolsSortAscending = new ToolStripMenuItem(); - cMenTreeToolsSortDescending = new ToolStripMenuItem(); - cMenTreeMoveUp = new ToolStripMenuItem(); - cMenTreeMoveDown = new ToolStripMenuItem(); + _cMenTreeConnect = new ToolStripMenuItem(); + _cMenTreeConnectWithOptions = new ToolStripMenuItem(); + _cMenTreeConnectWithOptionsConnectToConsoleSession = new ToolStripMenuItem(); + _cMenTreeConnectWithOptionsDontConnectToConsoleSession = new ToolStripMenuItem(); + _cMenTreeConnectWithOptionsConnectInFullscreen = new ToolStripMenuItem(); + _cMenTreeConnectWithOptionsNoCredentials = new ToolStripMenuItem(); + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting = new ToolStripMenuItem(); + _cMenTreeDisconnect = new ToolStripMenuItem(); + _cMenTreeSep1 = new ToolStripSeparator(); + _cMenTreeToolsExternalApps = new ToolStripMenuItem(); + _cMenTreeToolsTransferFile = new ToolStripMenuItem(); + _cMenTreeSep2 = new ToolStripSeparator(); + _cMenTreeDuplicate = new ToolStripMenuItem(); + _cMenTreeRename = new ToolStripMenuItem(); + _cMenTreeDelete = new ToolStripMenuItem(); + _cMenTreeSep3 = new ToolStripSeparator(); + _cMenTreeImport = new ToolStripMenuItem(); + _cMenTreeImportFile = new ToolStripMenuItem(); + _cMenTreeImportActiveDirectory = new ToolStripMenuItem(); + _cMenTreeImportPortScan = new ToolStripMenuItem(); + _cMenTreeExportFile = new ToolStripMenuItem(); + _cMenTreeSep4 = new ToolStripSeparator(); + _cMenTreeAddConnection = new ToolStripMenuItem(); + _cMenTreeAddFolder = new ToolStripMenuItem(); + _toolStripSeparator1 = new ToolStripSeparator(); + _cMenTreeToolsSort = new ToolStripMenuItem(); + _cMenTreeToolsSortAscending = new ToolStripMenuItem(); + _cMenTreeToolsSortDescending = new ToolStripMenuItem(); + _cMenTreeMoveUp = new ToolStripMenuItem(); + _cMenTreeMoveDown = new ToolStripMenuItem(); // // cMenTree // - this.cMenTree.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.cMenTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cMenTreeConnect, - this.cMenTreeConnectWithOptions, - this.cMenTreeDisconnect, - this.cMenTreeSep1, - this.cMenTreeToolsExternalApps, - this.cMenTreeToolsTransferFile, - this.cMenTreeSep2, - this.cMenTreeDuplicate, - this.cMenTreeRename, - this.cMenTreeDelete, - this.cMenTreeSep3, - this.cMenTreeImport, - this.cMenTreeExportFile, - this.cMenTreeSep4, - this.cMenTreeAddConnection, - this.cMenTreeAddFolder, - this.ToolStripSeparator1, - this.cMenTreeToolsSort, - this.cMenTreeMoveUp, - this.cMenTreeMoveDown}); - this.cMenTree.Name = "cMenTree"; - this.cMenTree.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this.cMenTree.Size = new System.Drawing.Size(200, 364); + Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 0); + Items.AddRange(new ToolStripItem[] { + _cMenTreeConnect, + _cMenTreeConnectWithOptions, + _cMenTreeDisconnect, + _cMenTreeSep1, + _cMenTreeToolsExternalApps, + _cMenTreeToolsTransferFile, + _cMenTreeSep2, + _cMenTreeDuplicate, + _cMenTreeRename, + _cMenTreeDelete, + _cMenTreeSep3, + _cMenTreeImport, + _cMenTreeExportFile, + _cMenTreeSep4, + _cMenTreeAddConnection, + _cMenTreeAddFolder, + _toolStripSeparator1, + _cMenTreeToolsSort, + _cMenTreeMoveUp, + _cMenTreeMoveDown + }); + Name = "cMenTree"; + RenderMode = ToolStripRenderMode.Professional; + Size = new System.Drawing.Size(200, 364); // // cMenTreeConnect // - this.cMenTreeConnect.Image = global::mRemoteNG.Resources.Play; - this.cMenTreeConnect.Name = "cMenTreeConnect"; - this.cMenTreeConnect.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.C))); - this.cMenTreeConnect.Size = new System.Drawing.Size(199, 22); - this.cMenTreeConnect.Text = "Connect"; - this.cMenTreeConnect.Click += new System.EventHandler(this.cMenTreeConnect_Click); + _cMenTreeConnect.Image = Resources.Play; + _cMenTreeConnect.Name = "_cMenTreeConnect"; + _cMenTreeConnect.ShortcutKeys = ((Keys.Control | Keys.Shift) | Keys.C); + _cMenTreeConnect.Size = new System.Drawing.Size(199, 22); + _cMenTreeConnect.Text = "Connect"; + _cMenTreeConnect.Click += (sender, args) => OnConnectClicked(args); // // cMenTreeConnectWithOptions // - this.cMenTreeConnectWithOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cMenTreeConnectWithOptionsConnectToConsoleSession, - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession, - this.cMenTreeConnectWithOptionsConnectInFullscreen, - this.cMenTreeConnectWithOptionsNoCredentials, - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting}); - this.cMenTreeConnectWithOptions.Name = "cMenTreeConnectWithOptions"; - this.cMenTreeConnectWithOptions.Size = new System.Drawing.Size(199, 22); - this.cMenTreeConnectWithOptions.Text = "Connect (with options)"; + _cMenTreeConnectWithOptions.DropDownItems.AddRange(new ToolStripItem[] { + _cMenTreeConnectWithOptionsConnectToConsoleSession, + _cMenTreeConnectWithOptionsDontConnectToConsoleSession, + _cMenTreeConnectWithOptionsConnectInFullscreen, + _cMenTreeConnectWithOptionsNoCredentials, + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting + }); + _cMenTreeConnectWithOptions.Name = "_cMenTreeConnectWithOptions"; + _cMenTreeConnectWithOptions.Size = new System.Drawing.Size(199, 22); + _cMenTreeConnectWithOptions.Text = "Connect (with options)"; // // cMenTreeConnectWithOptionsConnectToConsoleSession // - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Image = global::mRemoteNG.Resources.monitor_go; - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsConnectToConsoleSession"; - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Text = "Connect to console session"; - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsConnectToConsoleSession_Click); + _cMenTreeConnectWithOptionsConnectToConsoleSession.Image = Resources.monitor_go; + _cMenTreeConnectWithOptionsConnectToConsoleSession.Name = "_cMenTreeConnectWithOptionsConnectToConsoleSession"; + _cMenTreeConnectWithOptionsConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); + _cMenTreeConnectWithOptionsConnectToConsoleSession.Text = "Connect to console session"; + _cMenTreeConnectWithOptionsConnectToConsoleSession.Click += (sender, args) => OnConnectToConsoleSessionClicked(args); // // cMenTreeConnectWithOptionsDontConnectToConsoleSession // - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Image = global::mRemoteNG.Resources.monitor_delete; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsDontConnectToConsoleSession"; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = "Don\'t connect to console session"; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Visible = false; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click); + _cMenTreeConnectWithOptionsDontConnectToConsoleSession.Image = Resources.monitor_delete; + _cMenTreeConnectWithOptionsDontConnectToConsoleSession.Name = "_cMenTreeConnectWithOptionsDontConnectToConsoleSession"; + _cMenTreeConnectWithOptionsDontConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); + _cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = "Don\'t connect to console session"; + _cMenTreeConnectWithOptionsDontConnectToConsoleSession.Visible = false; + _cMenTreeConnectWithOptionsDontConnectToConsoleSession.Click += (sender, args) => OnDontConnectToConsoleSessionClicked(args); // // cMenTreeConnectWithOptionsConnectInFullscreen // - this.cMenTreeConnectWithOptionsConnectInFullscreen.Image = global::mRemoteNG.Resources.arrow_out; - this.cMenTreeConnectWithOptionsConnectInFullscreen.Name = "cMenTreeConnectWithOptionsConnectInFullscreen"; - this.cMenTreeConnectWithOptionsConnectInFullscreen.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsConnectInFullscreen.Text = "Connect in fullscreen"; - this.cMenTreeConnectWithOptionsConnectInFullscreen.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsConnectInFullscreen_Click); + _cMenTreeConnectWithOptionsConnectInFullscreen.Image = Resources.arrow_out; + _cMenTreeConnectWithOptionsConnectInFullscreen.Name = "_cMenTreeConnectWithOptionsConnectInFullscreen"; + _cMenTreeConnectWithOptionsConnectInFullscreen.Size = new System.Drawing.Size(245, 22); + _cMenTreeConnectWithOptionsConnectInFullscreen.Text = "Connect in fullscreen"; + _cMenTreeConnectWithOptionsConnectInFullscreen.Click += (sender, args) => OnConnectInFullscreenClicked(args); // // cMenTreeConnectWithOptionsNoCredentials // - this.cMenTreeConnectWithOptionsNoCredentials.Image = global::mRemoteNG.Resources.key_delete; - this.cMenTreeConnectWithOptionsNoCredentials.Name = "cMenTreeConnectWithOptionsNoCredentials"; - this.cMenTreeConnectWithOptionsNoCredentials.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsNoCredentials.Text = "Connect without credentials"; - this.cMenTreeConnectWithOptionsNoCredentials.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsNoCredentials_Click); + _cMenTreeConnectWithOptionsNoCredentials.Image = Resources.key_delete; + _cMenTreeConnectWithOptionsNoCredentials.Name = "_cMenTreeConnectWithOptionsNoCredentials"; + _cMenTreeConnectWithOptionsNoCredentials.Size = new System.Drawing.Size(245, 22); + _cMenTreeConnectWithOptionsNoCredentials.Text = "Connect without credentials"; + _cMenTreeConnectWithOptionsNoCredentials.Click += (sender, args) => OnConnectWithNoCredentialsClick(args); // // cMenTreeConnectWithOptionsChoosePanelBeforeConnecting // - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Image = global::mRemoteNG.Resources.Panels; - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Name = "cMenTreeConnectWithOptionsChoosePanelBeforeConnecting"; - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = "Choose panel before connecting"; - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click); + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Image = Resources.Panels; + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Name = "_cMenTreeConnectWithOptionsChoosePanelBeforeConnecting"; + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Size = new System.Drawing.Size(245, 22); + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = "Choose panel before connecting"; + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Click += (sender, args) => OnChoosePanelBeforeConnectingClicked(args); // // cMenTreeDisconnect // - this.cMenTreeDisconnect.Image = global::mRemoteNG.Resources.Pause; - this.cMenTreeDisconnect.Name = "cMenTreeDisconnect"; - this.cMenTreeDisconnect.Size = new System.Drawing.Size(199, 22); - this.cMenTreeDisconnect.Text = "Disconnect"; - this.cMenTreeDisconnect.Click += new System.EventHandler(this.cMenTreeDisconnect_Click); + _cMenTreeDisconnect.Image = Resources.Pause; + _cMenTreeDisconnect.Name = "_cMenTreeDisconnect"; + _cMenTreeDisconnect.Size = new System.Drawing.Size(199, 22); + _cMenTreeDisconnect.Text = "Disconnect"; + _cMenTreeDisconnect.Click += (sender, args) => OnDisconnectClicked(args); // // cMenTreeSep1 // - this.cMenTreeSep1.Name = "cMenTreeSep1"; - this.cMenTreeSep1.Size = new System.Drawing.Size(196, 6); + _cMenTreeSep1.Name = "_cMenTreeSep1"; + _cMenTreeSep1.Size = new System.Drawing.Size(196, 6); // // cMenTreeToolsExternalApps // - this.cMenTreeToolsExternalApps.Image = global::mRemoteNG.Resources.ExtApp; - this.cMenTreeToolsExternalApps.Name = "cMenTreeToolsExternalApps"; - this.cMenTreeToolsExternalApps.Size = new System.Drawing.Size(199, 22); - this.cMenTreeToolsExternalApps.Text = "External Applications"; + _cMenTreeToolsExternalApps.Image = Resources.ExtApp; + _cMenTreeToolsExternalApps.Name = "_cMenTreeToolsExternalApps"; + _cMenTreeToolsExternalApps.Size = new System.Drawing.Size(199, 22); + _cMenTreeToolsExternalApps.Text = "External Applications"; // // cMenTreeToolsTransferFile // - this.cMenTreeToolsTransferFile.Image = global::mRemoteNG.Resources.SSHTransfer; - this.cMenTreeToolsTransferFile.Name = "cMenTreeToolsTransferFile"; - this.cMenTreeToolsTransferFile.Size = new System.Drawing.Size(199, 22); - this.cMenTreeToolsTransferFile.Text = "Transfer File (SSH)"; - this.cMenTreeToolsTransferFile.Click += new System.EventHandler(this.cMenTreeToolsTransferFile_Click); + _cMenTreeToolsTransferFile.Image = Resources.SSHTransfer; + _cMenTreeToolsTransferFile.Name = "_cMenTreeToolsTransferFile"; + _cMenTreeToolsTransferFile.Size = new System.Drawing.Size(199, 22); + _cMenTreeToolsTransferFile.Text = "Transfer File (SSH)"; + _cMenTreeToolsTransferFile.Click += (sender, args) => OnTransferFileClicked(args); // // cMenTreeSep2 // - this.cMenTreeSep2.Name = "cMenTreeSep2"; - this.cMenTreeSep2.Size = new System.Drawing.Size(196, 6); + _cMenTreeSep2.Name = "_cMenTreeSep2"; + _cMenTreeSep2.Size = new System.Drawing.Size(196, 6); // // cMenTreeDuplicate // - this.cMenTreeDuplicate.Image = global::mRemoteNG.Resources.page_copy; - this.cMenTreeDuplicate.Name = "cMenTreeDuplicate"; - this.cMenTreeDuplicate.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); - this.cMenTreeDuplicate.Size = new System.Drawing.Size(199, 22); - this.cMenTreeDuplicate.Text = "Duplicate"; + _cMenTreeDuplicate.Image = Resources.page_copy; + _cMenTreeDuplicate.Name = "_cMenTreeDuplicate"; + _cMenTreeDuplicate.ShortcutKeys = Keys.Control | Keys.D; + _cMenTreeDuplicate.Size = new System.Drawing.Size(199, 22); + _cMenTreeDuplicate.Text = "Duplicate"; + _cMenTreeDuplicate.Click += (sender, args) => OnDuplicateClicked(args); // // cMenTreeRename // - this.cMenTreeRename.Image = global::mRemoteNG.Resources.Rename; - this.cMenTreeRename.Name = "cMenTreeRename"; - this.cMenTreeRename.ShortcutKeys = System.Windows.Forms.Keys.F2; - this.cMenTreeRename.Size = new System.Drawing.Size(199, 22); - this.cMenTreeRename.Text = "Rename"; + _cMenTreeRename.Image = Resources.Rename; + _cMenTreeRename.Name = "_cMenTreeRename"; + _cMenTreeRename.ShortcutKeys = Keys.F2; + _cMenTreeRename.Size = new System.Drawing.Size(199, 22); + _cMenTreeRename.Text = "Rename"; + _cMenTreeRename.Click += (sender, args) => OnRenameClicked(args); // // cMenTreeDelete // - this.cMenTreeDelete.Image = global::mRemoteNG.Resources.Delete; - this.cMenTreeDelete.Name = "cMenTreeDelete"; - this.cMenTreeDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; - this.cMenTreeDelete.Size = new System.Drawing.Size(199, 22); - this.cMenTreeDelete.Text = "Delete"; + _cMenTreeDelete.Image = Resources.Delete; + _cMenTreeDelete.Name = "_cMenTreeDelete"; + _cMenTreeDelete.ShortcutKeys = Keys.Delete; + _cMenTreeDelete.Size = new System.Drawing.Size(199, 22); + _cMenTreeDelete.Text = "Delete"; + _cMenTreeDelete.Click += (sender, args) => OnDeleteClicked(args); // // cMenTreeSep3 // - this.cMenTreeSep3.Name = "cMenTreeSep3"; - this.cMenTreeSep3.Size = new System.Drawing.Size(196, 6); + _cMenTreeSep3.Name = "_cMenTreeSep3"; + _cMenTreeSep3.Size = new System.Drawing.Size(196, 6); // // cMenTreeImport // - this.cMenTreeImport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cMenTreeImportFile, - this.cMenTreeImportActiveDirectory, - this.cMenTreeImportPortScan}); - this.cMenTreeImport.Name = "cMenTreeImport"; - this.cMenTreeImport.Size = new System.Drawing.Size(199, 22); - this.cMenTreeImport.Text = "&Import"; + _cMenTreeImport.DropDownItems.AddRange(new ToolStripItem[] { + _cMenTreeImportFile, + _cMenTreeImportActiveDirectory, + _cMenTreeImportPortScan + }); + _cMenTreeImport.Name = "_cMenTreeImport"; + _cMenTreeImport.Size = new System.Drawing.Size(199, 22); + _cMenTreeImport.Text = "&Import"; // // cMenTreeImportFile // - this.cMenTreeImportFile.Name = "cMenTreeImportFile"; - this.cMenTreeImportFile.Size = new System.Drawing.Size(226, 22); - this.cMenTreeImportFile.Text = "Import from &File..."; - this.cMenTreeImportFile.Click += new System.EventHandler(this.cMenTreeImportFile_Click); + _cMenTreeImportFile.Name = "_cMenTreeImportFile"; + _cMenTreeImportFile.Size = new System.Drawing.Size(226, 22); + _cMenTreeImportFile.Text = "Import from &File..."; + _cMenTreeImportFile.Click += (sender, args) => OnImportFileClicked(args); // // cMenTreeImportActiveDirectory // - this.cMenTreeImportActiveDirectory.Name = "cMenTreeImportActiveDirectory"; - this.cMenTreeImportActiveDirectory.Size = new System.Drawing.Size(226, 22); - this.cMenTreeImportActiveDirectory.Text = "Import from &Active Directory..."; + _cMenTreeImportActiveDirectory.Name = "_cMenTreeImportActiveDirectory"; + _cMenTreeImportActiveDirectory.Size = new System.Drawing.Size(226, 22); + _cMenTreeImportActiveDirectory.Text = "Import from &Active Directory..."; + _cMenTreeImportActiveDirectory.Click += (sender, args) => OnImportActiveDirectoryClicked(args); // // cMenTreeImportPortScan // - this.cMenTreeImportPortScan.Name = "cMenTreeImportPortScan"; - this.cMenTreeImportPortScan.Size = new System.Drawing.Size(226, 22); - this.cMenTreeImportPortScan.Text = "Import from &Port Scan..."; + _cMenTreeImportPortScan.Name = "_cMenTreeImportPortScan"; + _cMenTreeImportPortScan.Size = new System.Drawing.Size(226, 22); + _cMenTreeImportPortScan.Text = "Import from &Port Scan..."; + _cMenTreeImportPortScan.Click += (sender, args) => OnImportPortScanClicked(args); // // cMenTreeExportFile // - this.cMenTreeExportFile.Name = "cMenTreeExportFile"; - this.cMenTreeExportFile.Size = new System.Drawing.Size(199, 22); - this.cMenTreeExportFile.Text = "&Export to File..."; - this.cMenTreeExportFile.Click += new System.EventHandler(this.cMenTreeExportFile_Click); + _cMenTreeExportFile.Name = "_cMenTreeExportFile"; + _cMenTreeExportFile.Size = new System.Drawing.Size(199, 22); + _cMenTreeExportFile.Text = "&Export to File..."; + _cMenTreeExportFile.Click += (sender, args) => OnExportFileClicked(args); // // cMenTreeSep4 // - this.cMenTreeSep4.Name = "cMenTreeSep4"; - this.cMenTreeSep4.Size = new System.Drawing.Size(196, 6); + _cMenTreeSep4.Name = "_cMenTreeSep4"; + _cMenTreeSep4.Size = new System.Drawing.Size(196, 6); // // cMenTreeAddConnection // - this.cMenTreeAddConnection.Image = global::mRemoteNG.Resources.Connection_Add; - this.cMenTreeAddConnection.Name = "cMenTreeAddConnection"; - this.cMenTreeAddConnection.Size = new System.Drawing.Size(199, 22); - this.cMenTreeAddConnection.Text = "New Connection"; - this.cMenTreeAddConnection.Click += new System.EventHandler(this.cMenTreeAddConnection_Click); + _cMenTreeAddConnection.Image = Resources.Connection_Add; + _cMenTreeAddConnection.Name = "_cMenTreeAddConnection"; + _cMenTreeAddConnection.Size = new System.Drawing.Size(199, 22); + _cMenTreeAddConnection.Text = "New Connection"; + _cMenTreeAddConnection.Click += (sender, args) => OnAddConnectionClicked(args); // // cMenTreeAddFolder // - this.cMenTreeAddFolder.Image = global::mRemoteNG.Resources.Folder_Add; - this.cMenTreeAddFolder.Name = "cMenTreeAddFolder"; - this.cMenTreeAddFolder.Size = new System.Drawing.Size(199, 22); - this.cMenTreeAddFolder.Text = "New Folder"; - this.cMenTreeAddFolder.Click += new System.EventHandler(this.cMenTreeAddFolder_Click); + _cMenTreeAddFolder.Image = Resources.Folder_Add; + _cMenTreeAddFolder.Name = "_cMenTreeAddFolder"; + _cMenTreeAddFolder.Size = new System.Drawing.Size(199, 22); + _cMenTreeAddFolder.Text = "New Folder"; + _cMenTreeAddFolder.Click += (sender, args) => OnAddFolderClicked(args); // // ToolStripSeparator1 // - this.ToolStripSeparator1.Name = "ToolStripSeparator1"; - this.ToolStripSeparator1.Size = new System.Drawing.Size(196, 6); + _toolStripSeparator1.Name = "_toolStripSeparator1"; + _toolStripSeparator1.Size = new System.Drawing.Size(196, 6); // // cMenTreeToolsSort // - this.cMenTreeToolsSort.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cMenTreeToolsSortAscending, - this.cMenTreeToolsSortDescending}); - this.cMenTreeToolsSort.Name = "cMenTreeToolsSort"; - this.cMenTreeToolsSort.Size = new System.Drawing.Size(199, 22); - this.cMenTreeToolsSort.Text = "Sort"; + _cMenTreeToolsSort.DropDownItems.AddRange(new ToolStripItem[] { + _cMenTreeToolsSortAscending, + _cMenTreeToolsSortDescending + }); + _cMenTreeToolsSort.Name = "_cMenTreeToolsSort"; + _cMenTreeToolsSort.Size = new System.Drawing.Size(199, 22); + _cMenTreeToolsSort.Text = "Sort"; // // cMenTreeToolsSortAscending // - this.cMenTreeToolsSortAscending.Image = global::mRemoteNG.Resources.Sort_AZ; - this.cMenTreeToolsSortAscending.Name = "cMenTreeToolsSortAscending"; - this.cMenTreeToolsSortAscending.Size = new System.Drawing.Size(161, 22); - this.cMenTreeToolsSortAscending.Text = "Ascending (A-Z)"; - this.cMenTreeToolsSortAscending.Click += new System.EventHandler(this.cMenTreeToolsSortAscending_Click); + _cMenTreeToolsSortAscending.Image = Resources.Sort_AZ; + _cMenTreeToolsSortAscending.Name = "_cMenTreeToolsSortAscending"; + _cMenTreeToolsSortAscending.Size = new System.Drawing.Size(161, 22); + _cMenTreeToolsSortAscending.Text = "Ascending (A-Z)"; + _cMenTreeToolsSortAscending.Click += (sender, args) => OnSortAscendingClicked(args); // // cMenTreeToolsSortDescending // - this.cMenTreeToolsSortDescending.Image = global::mRemoteNG.Resources.Sort_ZA; - this.cMenTreeToolsSortDescending.Name = "cMenTreeToolsSortDescending"; - this.cMenTreeToolsSortDescending.Size = new System.Drawing.Size(161, 22); - this.cMenTreeToolsSortDescending.Text = "Descending (Z-A)"; - this.cMenTreeToolsSortDescending.Click += new System.EventHandler(this.cMenTreeToolsSortDescending_Click); + _cMenTreeToolsSortDescending.Image = Resources.Sort_ZA; + _cMenTreeToolsSortDescending.Name = "_cMenTreeToolsSortDescending"; + _cMenTreeToolsSortDescending.Size = new System.Drawing.Size(161, 22); + _cMenTreeToolsSortDescending.Text = "Descending (Z-A)"; + _cMenTreeToolsSortDescending.Click += (sender, args) => OnSortDescendingClicked(args); // // cMenTreeMoveUp // - this.cMenTreeMoveUp.Image = global::mRemoteNG.Resources.Arrow_Up; - this.cMenTreeMoveUp.Name = "cMenTreeMoveUp"; - this.cMenTreeMoveUp.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); - this.cMenTreeMoveUp.Size = new System.Drawing.Size(199, 22); - this.cMenTreeMoveUp.Text = "Move up"; - this.cMenTreeMoveUp.Click += new System.EventHandler(this.cMenTreeMoveUp_Click); + _cMenTreeMoveUp.Image = Resources.Arrow_Up; + _cMenTreeMoveUp.Name = "_cMenTreeMoveUp"; + _cMenTreeMoveUp.ShortcutKeys = Keys.Control | Keys.Up; + _cMenTreeMoveUp.Size = new System.Drawing.Size(199, 22); + _cMenTreeMoveUp.Text = "Move up"; + _cMenTreeMoveUp.Click += (sender, args) => OnMoveUpClicked(args); // // cMenTreeMoveDown // - this.cMenTreeMoveDown.Image = global::mRemoteNG.Resources.Arrow_Down; - this.cMenTreeMoveDown.Name = "cMenTreeMoveDown"; - this.cMenTreeMoveDown.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); - this.cMenTreeMoveDown.Size = new System.Drawing.Size(199, 22); - this.cMenTreeMoveDown.Text = "Move down"; - this.cMenTreeMoveDown.Click += new System.EventHandler(this.cMenTreeMoveDown_Click); + _cMenTreeMoveDown.Image = Resources.Arrow_Down; + _cMenTreeMoveDown.Name = "_cMenTreeMoveDown"; + _cMenTreeMoveDown.ShortcutKeys = Keys.Control | Keys.Down; + _cMenTreeMoveDown.Size = new System.Drawing.Size(199, 22); + _cMenTreeMoveDown.Text = "Move down"; + _cMenTreeMoveDown.Click += (sender, args) => OnMoveDownClicked(args); + } + + + public event EventHandler ConnectClicked; + protected virtual void OnConnectClicked(EventArgs e) + { + var handler = ConnectClicked; + handler?.Invoke(this, e); + } + + public event EventHandler ConnectToConsoleSessionClicked; + protected virtual void OnConnectToConsoleSessionClicked(EventArgs e) + { + var handler = ConnectToConsoleSessionClicked; + handler?.Invoke(this, e); + } + + public event EventHandler DontConnectToConsoleSessionClicked; + protected virtual void OnDontConnectToConsoleSessionClicked(EventArgs e) + { + var handler = DontConnectToConsoleSessionClicked; + handler?.Invoke(this, e); + } + + public event EventHandler ConnectInFullscreenClicked; + protected virtual void OnConnectInFullscreenClicked(EventArgs e) + { + var handler = ConnectInFullscreenClicked; + handler?.Invoke(this, e); + } + + public event EventHandler ConnectWithNoCredentialsClick; + protected virtual void OnConnectWithNoCredentialsClick(EventArgs e) + { + var handler = ConnectWithNoCredentialsClick; + handler?.Invoke(this, e); + } + + public event EventHandler ChoosePanelBeforeConnectingClicked; + protected virtual void OnChoosePanelBeforeConnectingClicked(EventArgs e) + { + var handler = ChoosePanelBeforeConnectingClicked; + handler?.Invoke(this, e); + } + + + public event EventHandler DisconnectClicked; + protected virtual void OnDisconnectClicked(EventArgs e) + { + var handler = DisconnectClicked; + handler?.Invoke(this, e); + } + + public event EventHandler TransferFileClicked; + protected virtual void OnTransferFileClicked(EventArgs e) + { + var handler = TransferFileClicked; + handler?.Invoke(this, e); + } + + public event EventHandler DuplicateClicked; + protected virtual void OnDuplicateClicked(EventArgs e) + { + var handler = DuplicateClicked; + handler?.Invoke(this, e); + } + + public event EventHandler RenameClicked; + protected virtual void OnRenameClicked(EventArgs e) + { + var handler = RenameClicked; + handler?.Invoke(this, e); + } + + public event EventHandler DeleteClicked; + protected virtual void OnDeleteClicked(EventArgs e) + { + var handler = DeleteClicked; + handler?.Invoke(this, e); + } + + public event EventHandler ImportFileClicked; + protected virtual void OnImportFileClicked(EventArgs e) + { + var handler = ImportFileClicked; + handler?.Invoke(this, e); + } + + public event EventHandler ImportActiveDirectoryClicked; + protected virtual void OnImportActiveDirectoryClicked(EventArgs e) + { + var handler = ImportActiveDirectoryClicked; + handler?.Invoke(this, e); + } + + public event EventHandler ImportPortScanClicked; + protected virtual void OnImportPortScanClicked(EventArgs e) + { + var handler = ImportPortScanClicked; + handler?.Invoke(this, e); + } + + public event EventHandler ExportFileClicked; + protected virtual void OnExportFileClicked(EventArgs e) + { + var handler = ExportFileClicked; + handler?.Invoke(this, e); + } + + public event EventHandler AddConnectionClicked; + protected virtual void OnAddConnectionClicked(EventArgs e) + { + var handler = AddConnectionClicked; + handler?.Invoke(this, e); + } + + public event EventHandler AddFolderClicked; + protected virtual void OnAddFolderClicked(EventArgs e) + { + var handler = AddFolderClicked; + handler?.Invoke(this, e); + } + + public event EventHandler SortAscendingClicked; + protected virtual void OnSortAscendingClicked(EventArgs e) + { + var handler = SortAscendingClicked; + handler?.Invoke(this, e); + } + + public event EventHandler SortDescendingClicked; + protected virtual void OnSortDescendingClicked(EventArgs e) + { + var handler = SortDescendingClicked; + handler?.Invoke(this, e); + } + + public event EventHandler MoveUpClicked; + protected virtual void OnMoveUpClicked(EventArgs e) + { + var handler = MoveUpClicked; + handler?.Invoke(this, e); + } + + public event EventHandler MoveDownClicked; + protected virtual void OnMoveDownClicked(EventArgs e) + { + var handler = MoveDownClicked; + handler?.Invoke(this, e); } } } \ No newline at end of file From 9807231b72bea14ff836529ab2e8cc15f8eb85b7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 15 Sep 2016 09:56:04 -0600 Subject: [PATCH 137/338] Basic switch has been completed. Most context menu actions are working as expected. --- .../UI/Controls/ConnectionContextMenu.cs | 201 +++++++++++ .../Window/ConnectionTreeWindow.Designer.cs | 323 ------------------ mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 287 +++------------- mRemoteV1/UI/Window/ConnectionTreeWindow.resx | 3 - 4 files changed, 242 insertions(+), 572 deletions(-) diff --git a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs index dff5ae682..8fbf1e4c4 100644 --- a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs +++ b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs @@ -1,5 +1,13 @@ using System; +using System.Linq; using System.Windows.Forms; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Container; +using mRemoteNG.Root.PuttySessions; +using mRemoteNG.Tools; +using mRemoteNG.Tree.Root; namespace mRemoteNG.UI.Controls @@ -42,6 +50,8 @@ namespace mRemoteNG.UI.Controls public ConnectionContextMenu() { InitializeComponent(); + ApplyLanguage(); + Opening += (sender, args) => AddExternalApps(); } private void InitializeComponent() @@ -346,7 +356,190 @@ namespace mRemoteNG.UI.Controls _cMenTreeMoveDown.Click += (sender, args) => OnMoveDownClicked(args); } + private void ApplyLanguage() + { + _cMenTreeConnect.Text = Language.strConnect; + _cMenTreeConnectWithOptions.Text = Language.strConnectWithOptions; + _cMenTreeConnectWithOptionsConnectToConsoleSession.Text = Language.strConnectToConsoleSession; + _cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = Language.strDontConnectToConsoleSessionMenuItem; + _cMenTreeConnectWithOptionsConnectInFullscreen.Text = Language.strConnectInFullscreen; + _cMenTreeConnectWithOptionsNoCredentials.Text = Language.strConnectNoCredentials; + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = Language.strChoosePanelBeforeConnecting; + _cMenTreeDisconnect.Text = Language.strMenuDisconnect; + _cMenTreeToolsExternalApps.Text = Language.strMenuExternalTools; + _cMenTreeToolsTransferFile.Text = Language.strMenuTransferFile; + + _cMenTreeDuplicate.Text = Language.strDuplicate; + _cMenTreeRename.Text = Language.strRename; + _cMenTreeDelete.Text = Language.strMenuDelete; + + _cMenTreeImport.Text = Language.strImportMenuItem; + _cMenTreeImportFile.Text = Language.strImportFromFileMenuItem; + _cMenTreeImportActiveDirectory.Text = Language.strImportAD; + _cMenTreeImportPortScan.Text = Language.strImportPortScan; + _cMenTreeExportFile.Text = Language.strExportToFileMenuItem; + + _cMenTreeAddConnection.Text = Language.strAddConnection; + _cMenTreeAddFolder.Text = Language.strAddFolder; + + _cMenTreeToolsSort.Text = Language.strSort; + _cMenTreeToolsSortAscending.Text = Language.strSortAsc; + _cMenTreeToolsSortDescending.Text = Language.strSortDesc; + _cMenTreeMoveUp.Text = Language.strMoveUp; + _cMenTreeMoveDown.Text = Language.strMoveDown; + } + + internal void ShowHideTreeContextMenuItems(ConnectionInfo connectionInfo) + { + if (connectionInfo == null) + return; + + try + { + Enabled = true; + EnableMenuItemsRecursive(Items); + if (connectionInfo is RootPuttySessionsNodeInfo) + { + _cMenTreeAddConnection.Enabled = false; + _cMenTreeAddFolder.Enabled = false; + _cMenTreeConnect.Enabled = false; + _cMenTreeConnectWithOptions.Enabled = false; + _cMenTreeDisconnect.Enabled = false; + _cMenTreeToolsTransferFile.Enabled = false; + _cMenTreeConnectWithOptions.Enabled = false; + _cMenTreeToolsSort.Enabled = false; + _cMenTreeToolsExternalApps.Enabled = false; + _cMenTreeDuplicate.Enabled = false; + _cMenTreeRename.Enabled = true; + _cMenTreeDelete.Enabled = false; + _cMenTreeMoveUp.Enabled = false; + _cMenTreeMoveDown.Enabled = false; + } + else if (connectionInfo is RootNodeInfo) + { + _cMenTreeConnect.Enabled = false; + _cMenTreeConnectWithOptions.Enabled = false; + _cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + _cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + _cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = false; + _cMenTreeDisconnect.Enabled = false; + _cMenTreeToolsTransferFile.Enabled = false; + _cMenTreeToolsExternalApps.Enabled = false; + _cMenTreeDuplicate.Enabled = false; + _cMenTreeDelete.Enabled = false; + _cMenTreeMoveUp.Enabled = false; + _cMenTreeMoveDown.Enabled = false; + } + else if (connectionInfo is ContainerInfo) + { + _cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + _cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + _cMenTreeDisconnect.Enabled = false; + + var openConnections = ((ContainerInfo)connectionInfo).Children.Sum(child => child.OpenConnections.Count); + if (openConnections == 0) + _cMenTreeDisconnect.Enabled = false; + + _cMenTreeToolsTransferFile.Enabled = false; + _cMenTreeToolsExternalApps.Enabled = false; + } + else if (connectionInfo is PuttySessionInfo) + { + _cMenTreeAddConnection.Enabled = false; + _cMenTreeAddFolder.Enabled = false; + + if (connectionInfo.OpenConnections.Count == 0) + _cMenTreeDisconnect.Enabled = false; + + if (!(connectionInfo.Protocol == ProtocolType.SSH1 | connectionInfo.Protocol == ProtocolType.SSH2)) + _cMenTreeToolsTransferFile.Enabled = false; + + _cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + _cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + _cMenTreeToolsSort.Enabled = false; + _cMenTreeDuplicate.Enabled = false; + _cMenTreeRename.Enabled = false; + _cMenTreeDelete.Enabled = false; + _cMenTreeMoveUp.Enabled = false; + _cMenTreeMoveDown.Enabled = false; + } + else + { + if (connectionInfo.OpenConnections.Count == 0) + _cMenTreeDisconnect.Enabled = false; + + if (!(connectionInfo.Protocol == ProtocolType.SSH1 | connectionInfo.Protocol == ProtocolType.SSH2)) + _cMenTreeToolsTransferFile.Enabled = false; + + if (!(connectionInfo.Protocol == ProtocolType.RDP | connectionInfo.Protocol == ProtocolType.ICA)) + { + _cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; + _cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; + } + + if (connectionInfo.Protocol == ProtocolType.IntApp) + _cMenTreeConnectWithOptionsNoCredentials.Enabled = false; + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace("ShowHideTreeContextMenuItems (UI.Window.ConnectionTreeWindow) failed", ex); + } + } + + private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true) + { + foreach (ToolStripItem item in items) + { + var menuItem = item as ToolStripMenuItem; + if (menuItem == null) + { + continue; + } + menuItem.Enabled = enable; + if (menuItem.HasDropDownItems) + { + EnableMenuItemsRecursive(menuItem.DropDownItems, enable); + } + } + } + + private void AddExternalApps() + { + try + { + ResetExternalAppMenu(); + + foreach (ExternalTool extA in Runtime.ExternalTools) + { + var menuItem = new ToolStripMenuItem + { + Text = extA.DisplayName, + Tag = extA, + Image = extA.Image + }; + + menuItem.Click += OnExternalToolClicked; + _cMenTreeToolsExternalApps.DropDownItems.Add(menuItem); + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace("cMenTreeTools_DropDownOpening failed (UI.Window.ConnectionTreeWindow)", ex); + } + } + + private void ResetExternalAppMenu() + { + if (_cMenTreeToolsExternalApps.DropDownItems.Count <= 0) return; + for (var i = _cMenTreeToolsExternalApps.DropDownItems.Count - 1; i >= 0; i--) + _cMenTreeToolsExternalApps.DropDownItems[i].Dispose(); + + _cMenTreeToolsExternalApps.DropDownItems.Clear(); + } + + #region Events public event EventHandler ConnectClicked; protected virtual void OnConnectClicked(EventArgs e) { @@ -494,5 +687,13 @@ namespace mRemoteNG.UI.Controls var handler = MoveDownClicked; handler?.Invoke(this, e); } + + public event EventHandler ExternalToolClicked; + protected virtual void OnExternalToolClicked(object sender, EventArgs e) + { + var handler = ExternalToolClicked; + handler?.Invoke(sender, e); + } + #endregion } } \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 208697f89..5bec8207d 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -12,32 +12,7 @@ namespace mRemoteNG.UI.Window internal System.Windows.Forms.ToolStripMenuItem mMenView; internal System.Windows.Forms.ToolStripMenuItem mMenViewExpandAllFolders; internal System.Windows.Forms.ToolStripMenuItem mMenViewCollapseAllFolders; - internal System.Windows.Forms.ContextMenuStrip cMenTree; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeAddConnection; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeAddFolder; - internal System.Windows.Forms.ToolStripSeparator cMenTreeSep1; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeConnect; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeConnectWithOptions; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeConnectWithOptionsConnectToConsoleSession; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeConnectWithOptionsNoCredentials; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeConnectWithOptionsConnectInFullscreen; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeDisconnect; - internal System.Windows.Forms.ToolStripSeparator cMenTreeSep2; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeToolsTransferFile; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeToolsSort; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeToolsSortAscending; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeToolsSortDescending; - internal System.Windows.Forms.ToolStripSeparator cMenTreeSep3; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeRename; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeDelete; - internal System.Windows.Forms.ToolStripSeparator cMenTreeSep4; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeMoveUp; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeMoveDown; internal System.Windows.Forms.PictureBox PictureBox1; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeToolsExternalApps; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeDuplicate; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeConnectWithOptionsChoosePanelBeforeConnecting; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeConnectWithOptionsDontConnectToConsoleSession; internal System.Windows.Forms.ToolStripMenuItem mMenSortAscending; internal System.Windows.Forms.ToolStripMenuItem mMenAddConnection; internal System.Windows.Forms.ToolStripMenuItem mMenAddFolder; @@ -48,37 +23,6 @@ namespace mRemoteNG.UI.Window this.components = new System.ComponentModel.Container(); this.olvConnections = new BrightIdeasSoftware.TreeListView(); this.olvNameColumn = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); - this.cMenTree = new System.Windows.Forms.ContextMenuStrip(this.components); - this.cMenTreeConnect = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptions = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsConnectToConsoleSession = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsConnectInFullscreen = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsNoCredentials = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeDisconnect = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeSep1 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeToolsExternalApps = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeToolsTransferFile = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeSep2 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeDuplicate = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeRename = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeDelete = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeSep3 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeImport = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeImportFile = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeImportActiveDirectory = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeImportPortScan = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeExportFile = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeSep4 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeAddConnection = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeAddFolder = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.cMenTreeToolsSort = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeToolsSortAscending = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeToolsSortDescending = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeMoveUp = new System.Windows.Forms.ToolStripMenuItem(); - this.cMenTreeMoveDown = new System.Windows.Forms.ToolStripMenuItem(); this.imgListTree = new System.Windows.Forms.ImageList(this.components); this.pnlConnections = new System.Windows.Forms.Panel(); this.PictureBox1 = new System.Windows.Forms.PictureBox(); @@ -91,7 +35,6 @@ namespace mRemoteNG.UI.Window this.mMenViewCollapseAllFolders = new System.Windows.Forms.ToolStripMenuItem(); this.mMenSortAscending = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.olvConnections)).BeginInit(); - this.cMenTree.SuspendLayout(); this.pnlConnections.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit(); this.msMain.SuspendLayout(); @@ -108,7 +51,6 @@ namespace mRemoteNG.UI.Window this.olvConnections.CellEditUseWholeCell = false; this.olvConnections.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.olvNameColumn}); - this.olvConnections.ContextMenuStrip = this.cMenTree; this.olvConnections.Cursor = System.Windows.Forms.Cursors.Default; this.olvConnections.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; this.olvConnections.HideSelection = false; @@ -136,264 +78,6 @@ namespace mRemoteNG.UI.Window this.olvNameColumn.FillsFreeSpace = true; this.olvNameColumn.IsButton = true; // - // cMenTree - // - this.cMenTree.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.cMenTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cMenTreeConnect, - this.cMenTreeConnectWithOptions, - this.cMenTreeDisconnect, - this.cMenTreeSep1, - this.cMenTreeToolsExternalApps, - this.cMenTreeToolsTransferFile, - this.cMenTreeSep2, - this.cMenTreeDuplicate, - this.cMenTreeRename, - this.cMenTreeDelete, - this.cMenTreeSep3, - this.cMenTreeImport, - this.cMenTreeExportFile, - this.cMenTreeSep4, - this.cMenTreeAddConnection, - this.cMenTreeAddFolder, - this.ToolStripSeparator1, - this.cMenTreeToolsSort, - this.cMenTreeMoveUp, - this.cMenTreeMoveDown}); - this.cMenTree.Name = "cMenTree"; - this.cMenTree.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this.cMenTree.Size = new System.Drawing.Size(200, 364); - // - // cMenTreeConnect - // - this.cMenTreeConnect.Image = global::mRemoteNG.Resources.Play; - this.cMenTreeConnect.Name = "cMenTreeConnect"; - this.cMenTreeConnect.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) - | System.Windows.Forms.Keys.C))); - this.cMenTreeConnect.Size = new System.Drawing.Size(199, 22); - this.cMenTreeConnect.Text = "Connect"; - this.cMenTreeConnect.Click += new System.EventHandler(this.cMenTreeConnect_Click); - // - // cMenTreeConnectWithOptions - // - this.cMenTreeConnectWithOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cMenTreeConnectWithOptionsConnectToConsoleSession, - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession, - this.cMenTreeConnectWithOptionsConnectInFullscreen, - this.cMenTreeConnectWithOptionsNoCredentials, - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting}); - this.cMenTreeConnectWithOptions.Name = "cMenTreeConnectWithOptions"; - this.cMenTreeConnectWithOptions.Size = new System.Drawing.Size(199, 22); - this.cMenTreeConnectWithOptions.Text = "Connect (with options)"; - // - // cMenTreeConnectWithOptionsConnectToConsoleSession - // - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Image = global::mRemoteNG.Resources.monitor_go; - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsConnectToConsoleSession"; - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Text = "Connect to console session"; - this.cMenTreeConnectWithOptionsConnectToConsoleSession.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsConnectToConsoleSession_Click); - // - // cMenTreeConnectWithOptionsDontConnectToConsoleSession - // - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Image = global::mRemoteNG.Resources.monitor_delete; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Name = "cMenTreeConnectWithOptionsDontConnectToConsoleSession"; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = "Don\'t connect to console session"; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Visible = false; - this.cMenTreeConnectWithOptionsDontConnectToConsoleSession.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click); - // - // cMenTreeConnectWithOptionsConnectInFullscreen - // - this.cMenTreeConnectWithOptionsConnectInFullscreen.Image = global::mRemoteNG.Resources.arrow_out; - this.cMenTreeConnectWithOptionsConnectInFullscreen.Name = "cMenTreeConnectWithOptionsConnectInFullscreen"; - this.cMenTreeConnectWithOptionsConnectInFullscreen.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsConnectInFullscreen.Text = "Connect in fullscreen"; - this.cMenTreeConnectWithOptionsConnectInFullscreen.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsConnectInFullscreen_Click); - // - // cMenTreeConnectWithOptionsNoCredentials - // - this.cMenTreeConnectWithOptionsNoCredentials.Image = global::mRemoteNG.Resources.key_delete; - this.cMenTreeConnectWithOptionsNoCredentials.Name = "cMenTreeConnectWithOptionsNoCredentials"; - this.cMenTreeConnectWithOptionsNoCredentials.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsNoCredentials.Text = "Connect without credentials"; - this.cMenTreeConnectWithOptionsNoCredentials.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsNoCredentials_Click); - // - // cMenTreeConnectWithOptionsChoosePanelBeforeConnecting - // - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Image = global::mRemoteNG.Resources.Panels; - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Name = "cMenTreeConnectWithOptionsChoosePanelBeforeConnecting"; - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Size = new System.Drawing.Size(245, 22); - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = "Choose panel before connecting"; - this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Click += new System.EventHandler(this.cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click); - // - // cMenTreeDisconnect - // - this.cMenTreeDisconnect.Image = global::mRemoteNG.Resources.Pause; - this.cMenTreeDisconnect.Name = "cMenTreeDisconnect"; - this.cMenTreeDisconnect.Size = new System.Drawing.Size(199, 22); - this.cMenTreeDisconnect.Text = "Disconnect"; - this.cMenTreeDisconnect.Click += new System.EventHandler(this.cMenTreeDisconnect_Click); - // - // cMenTreeSep1 - // - this.cMenTreeSep1.Name = "cMenTreeSep1"; - this.cMenTreeSep1.Size = new System.Drawing.Size(196, 6); - // - // cMenTreeToolsExternalApps - // - this.cMenTreeToolsExternalApps.Image = global::mRemoteNG.Resources.ExtApp; - this.cMenTreeToolsExternalApps.Name = "cMenTreeToolsExternalApps"; - this.cMenTreeToolsExternalApps.Size = new System.Drawing.Size(199, 22); - this.cMenTreeToolsExternalApps.Text = "External Applications"; - // - // cMenTreeToolsTransferFile - // - this.cMenTreeToolsTransferFile.Image = global::mRemoteNG.Resources.SSHTransfer; - this.cMenTreeToolsTransferFile.Name = "cMenTreeToolsTransferFile"; - this.cMenTreeToolsTransferFile.Size = new System.Drawing.Size(199, 22); - this.cMenTreeToolsTransferFile.Text = "Transfer File (SSH)"; - this.cMenTreeToolsTransferFile.Click += new System.EventHandler(this.cMenTreeToolsTransferFile_Click); - // - // cMenTreeSep2 - // - this.cMenTreeSep2.Name = "cMenTreeSep2"; - this.cMenTreeSep2.Size = new System.Drawing.Size(196, 6); - // - // cMenTreeDuplicate - // - this.cMenTreeDuplicate.Image = global::mRemoteNG.Resources.page_copy; - this.cMenTreeDuplicate.Name = "cMenTreeDuplicate"; - this.cMenTreeDuplicate.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D))); - this.cMenTreeDuplicate.Size = new System.Drawing.Size(199, 22); - this.cMenTreeDuplicate.Text = "Duplicate"; - // - // cMenTreeRename - // - this.cMenTreeRename.Image = global::mRemoteNG.Resources.Rename; - this.cMenTreeRename.Name = "cMenTreeRename"; - this.cMenTreeRename.ShortcutKeys = System.Windows.Forms.Keys.F2; - this.cMenTreeRename.Size = new System.Drawing.Size(199, 22); - this.cMenTreeRename.Text = "Rename"; - // - // cMenTreeDelete - // - this.cMenTreeDelete.Image = global::mRemoteNG.Resources.Delete; - this.cMenTreeDelete.Name = "cMenTreeDelete"; - this.cMenTreeDelete.ShortcutKeys = System.Windows.Forms.Keys.Delete; - this.cMenTreeDelete.Size = new System.Drawing.Size(199, 22); - this.cMenTreeDelete.Text = "Delete"; - // - // cMenTreeSep3 - // - this.cMenTreeSep3.Name = "cMenTreeSep3"; - this.cMenTreeSep3.Size = new System.Drawing.Size(196, 6); - // - // cMenTreeImport - // - this.cMenTreeImport.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cMenTreeImportFile, - this.cMenTreeImportActiveDirectory, - this.cMenTreeImportPortScan}); - this.cMenTreeImport.Name = "cMenTreeImport"; - this.cMenTreeImport.Size = new System.Drawing.Size(199, 22); - this.cMenTreeImport.Text = "&Import"; - // - // cMenTreeImportFile - // - this.cMenTreeImportFile.Name = "cMenTreeImportFile"; - this.cMenTreeImportFile.Size = new System.Drawing.Size(226, 22); - this.cMenTreeImportFile.Text = "Import from &File..."; - this.cMenTreeImportFile.Click += new System.EventHandler(this.cMenTreeImportFile_Click); - // - // cMenTreeImportActiveDirectory - // - this.cMenTreeImportActiveDirectory.Name = "cMenTreeImportActiveDirectory"; - this.cMenTreeImportActiveDirectory.Size = new System.Drawing.Size(226, 22); - this.cMenTreeImportActiveDirectory.Text = "Import from &Active Directory..."; - // - // cMenTreeImportPortScan - // - this.cMenTreeImportPortScan.Name = "cMenTreeImportPortScan"; - this.cMenTreeImportPortScan.Size = new System.Drawing.Size(226, 22); - this.cMenTreeImportPortScan.Text = "Import from &Port Scan..."; - // - // cMenTreeExportFile - // - this.cMenTreeExportFile.Name = "cMenTreeExportFile"; - this.cMenTreeExportFile.Size = new System.Drawing.Size(199, 22); - this.cMenTreeExportFile.Text = "&Export to File..."; - this.cMenTreeExportFile.Click += new System.EventHandler(this.cMenTreeExportFile_Click); - // - // cMenTreeSep4 - // - this.cMenTreeSep4.Name = "cMenTreeSep4"; - this.cMenTreeSep4.Size = new System.Drawing.Size(196, 6); - // - // cMenTreeAddConnection - // - this.cMenTreeAddConnection.Image = global::mRemoteNG.Resources.Connection_Add; - this.cMenTreeAddConnection.Name = "cMenTreeAddConnection"; - this.cMenTreeAddConnection.Size = new System.Drawing.Size(199, 22); - this.cMenTreeAddConnection.Text = "New Connection"; - this.cMenTreeAddConnection.Click += new System.EventHandler(this.cMenTreeAddConnection_Click); - // - // cMenTreeAddFolder - // - this.cMenTreeAddFolder.Image = global::mRemoteNG.Resources.Folder_Add; - this.cMenTreeAddFolder.Name = "cMenTreeAddFolder"; - this.cMenTreeAddFolder.Size = new System.Drawing.Size(199, 22); - this.cMenTreeAddFolder.Text = "New Folder"; - this.cMenTreeAddFolder.Click += new System.EventHandler(this.cMenTreeAddFolder_Click); - // - // ToolStripSeparator1 - // - this.ToolStripSeparator1.Name = "ToolStripSeparator1"; - this.ToolStripSeparator1.Size = new System.Drawing.Size(196, 6); - // - // cMenTreeToolsSort - // - this.cMenTreeToolsSort.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cMenTreeToolsSortAscending, - this.cMenTreeToolsSortDescending}); - this.cMenTreeToolsSort.Name = "cMenTreeToolsSort"; - this.cMenTreeToolsSort.Size = new System.Drawing.Size(199, 22); - this.cMenTreeToolsSort.Text = "Sort"; - // - // cMenTreeToolsSortAscending - // - this.cMenTreeToolsSortAscending.Image = global::mRemoteNG.Resources.Sort_AZ; - this.cMenTreeToolsSortAscending.Name = "cMenTreeToolsSortAscending"; - this.cMenTreeToolsSortAscending.Size = new System.Drawing.Size(161, 22); - this.cMenTreeToolsSortAscending.Text = "Ascending (A-Z)"; - this.cMenTreeToolsSortAscending.Click += new System.EventHandler(this.cMenTreeToolsSortAscending_Click); - // - // cMenTreeToolsSortDescending - // - this.cMenTreeToolsSortDescending.Image = global::mRemoteNG.Resources.Sort_ZA; - this.cMenTreeToolsSortDescending.Name = "cMenTreeToolsSortDescending"; - this.cMenTreeToolsSortDescending.Size = new System.Drawing.Size(161, 22); - this.cMenTreeToolsSortDescending.Text = "Descending (Z-A)"; - this.cMenTreeToolsSortDescending.Click += new System.EventHandler(this.cMenTreeToolsSortDescending_Click); - // - // cMenTreeMoveUp - // - this.cMenTreeMoveUp.Image = global::mRemoteNG.Resources.Arrow_Up; - this.cMenTreeMoveUp.Name = "cMenTreeMoveUp"; - this.cMenTreeMoveUp.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up))); - this.cMenTreeMoveUp.Size = new System.Drawing.Size(199, 22); - this.cMenTreeMoveUp.Text = "Move up"; - this.cMenTreeMoveUp.Click += new System.EventHandler(this.cMenTreeMoveUp_Click); - // - // cMenTreeMoveDown - // - this.cMenTreeMoveDown.Image = global::mRemoteNG.Resources.Arrow_Down; - this.cMenTreeMoveDown.Name = "cMenTreeMoveDown"; - this.cMenTreeMoveDown.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down))); - this.cMenTreeMoveDown.Size = new System.Drawing.Size(199, 22); - this.cMenTreeMoveDown.Text = "Move down"; - this.cMenTreeMoveDown.Click += new System.EventHandler(this.cMenTreeMoveDown_Click); - // // imgListTree // this.imgListTree.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; @@ -519,7 +203,6 @@ namespace mRemoteNG.UI.Window this.Text = "Connections"; this.Load += new System.EventHandler(this.Tree_Load); ((System.ComponentModel.ISupportInitialize)(this.olvConnections)).EndInit(); - this.cMenTree.ResumeLayout(false); this.pnlConnections.ResumeLayout(false); this.pnlConnections.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit(); @@ -529,12 +212,6 @@ namespace mRemoteNG.UI.Window this.PerformLayout(); } - internal System.Windows.Forms.ToolStripMenuItem cMenTreeImport; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeExportFile; - internal System.Windows.Forms.ToolStripSeparator ToolStripSeparator1; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeImportFile; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeImportActiveDirectory; - internal System.Windows.Forms.ToolStripMenuItem cMenTreeImportPortScan; #endregion private System.ComponentModel.IContainer components; diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index ee9b3efc5..0895001dd 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -1,6 +1,5 @@ using mRemoteNG.App; using mRemoteNG.Connection; -using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; using mRemoteNG.Tree; using System; @@ -8,8 +7,9 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; using BrightIdeasSoftware; -using mRemoteNG.Root.PuttySessions; +using mRemoteNG.Tools; using mRemoteNG.Tree.Root; +using mRemoteNG.UI.Controls; using WeifenLuo.WinFormsUI.Docking; @@ -20,6 +20,7 @@ namespace mRemoteNG.UI.Window private ConnectionTreeModel _connectionTreeModel; private ConnectionTreeDragAndDropHandler _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); private NodeSearcher _nodeSearcher; + private ConnectionContextMenu _contextMenu = new ConnectionContextMenu(); public ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; @@ -72,7 +73,8 @@ namespace mRemoteNG.UI.Window olvNameColumn.ImageGetter = ConnectionImageGetter; olvConnections.CanExpandGetter = item => item is ContainerInfo && ((ContainerInfo)item).Children.Count > 0; olvConnections.ChildrenGetter = item => ((ContainerInfo)item).Children; - } + olvConnections.ContextMenuStrip = _contextMenu; + } private void SetupDropSink() { @@ -93,7 +95,8 @@ namespace mRemoteNG.UI.Window private void SetEventHandlers() { SetTreeEventHandlers(); - SetMenuEventHandlers(); + SetContextMenuEventHandlers(); + SetMenuEventHandlers(); } private void SetTreeEventHandlers() @@ -122,20 +125,40 @@ namespace mRemoteNG.UI.Window olvConnections.KeyPress += tvConnections_KeyPress; } + private void SetContextMenuEventHandlers() + { + _contextMenu.ConnectClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DoNotJump); + _contextMenu.ConnectToConsoleSessionClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); + _contextMenu.DontConnectToConsoleSessionClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); + _contextMenu.ConnectInFullscreenClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); + _contextMenu.ConnectWithNoCredentialsClick += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.NoCredentials); + _contextMenu.ChoosePanelBeforeConnectingClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); + _contextMenu.DisconnectClicked += (sender, args) => DisconnectConnection(SelectedNode); + _contextMenu.TransferFileClicked += (sender, args) => SshTransferFile(); + _contextMenu.DuplicateClicked += (sender, args) => DuplicateSelectedNode(); + _contextMenu.RenameClicked += (sender, args) => RenameSelectedNode(); + _contextMenu.DeleteClicked += (sender, args) => DeleteSelectedNode(); + _contextMenu.ImportFileClicked += (sender, args) => Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true); + _contextMenu.ImportActiveDirectoryClicked += (sender, args) => Windows.Show(WindowType.ActiveDirectoryImport); + _contextMenu.ImportPortScanClicked += (sender, args) => Windows.Show(WindowType.PortScan); + _contextMenu.ExportFileClicked += (sender, args) => Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); + _contextMenu.AddConnectionClicked += cMenTreeAddConnection_Click; + _contextMenu.AddFolderClicked += cMenTreeAddFolder_Click; + _contextMenu.SortAscendingClicked += cMenTreeToolsSortAscending_Click; + _contextMenu.SortDescendingClicked += cMenTreeToolsSortDescending_Click; + _contextMenu.MoveUpClicked += cMenTreeMoveUp_Click; + _contextMenu.MoveDownClicked += cMenTreeMoveDown_Click; + _contextMenu.ExternalToolClicked += (sender, args) => StartExternalApp((ExternalTool)((ToolStripMenuItem)sender).Tag); + } + private void SetMenuEventHandlers() { - cMenTreeDuplicate.Click += (sender, args) => DuplicateSelectedNode(); - cMenTreeRename.Click += (sender, args) => RenameSelectedNode(); - cMenTreeDelete.Click += (sender, args) => DeleteSelectedNode(); mMenViewExpandAllFolders.Click += (sender, args) => olvConnections.ExpandAll(); mMenViewCollapseAllFolders.Click += (sender, args) => { olvConnections.CollapseAll(); olvConnections.Expand(GetRootConnectionNode()); }; - cMenTree.Opening += (sender, args) => AddExternalApps(); - cMenTreeImport.Click += (sender, args) => Windows.Show(WindowType.ActiveDirectoryImport); - cMenTreeImportPortScan.Click += (sender, args) => Windows.Show(WindowType.PortScan); } private void PopulateTreeView() @@ -183,37 +206,6 @@ namespace mRemoteNG.UI.Window mMenViewCollapseAllFolders.Text = Language.strCollapseAllFolders; mMenSortAscending.ToolTipText = Language.strSortAsc; - cMenTreeConnect.Text = Language.strConnect; - cMenTreeConnectWithOptions.Text = Language.strConnectWithOptions; - cMenTreeConnectWithOptionsConnectToConsoleSession.Text = Language.strConnectToConsoleSession; - cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = Language.strDontConnectToConsoleSessionMenuItem; - cMenTreeConnectWithOptionsConnectInFullscreen.Text = Language.strConnectInFullscreen; - cMenTreeConnectWithOptionsNoCredentials.Text = Language.strConnectNoCredentials; - cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = Language.strChoosePanelBeforeConnecting; - cMenTreeDisconnect.Text = Language.strMenuDisconnect; - - cMenTreeToolsExternalApps.Text = Language.strMenuExternalTools; - cMenTreeToolsTransferFile.Text = Language.strMenuTransferFile; - - cMenTreeDuplicate.Text = Language.strDuplicate; - cMenTreeRename.Text = Language.strRename; - cMenTreeDelete.Text = Language.strMenuDelete; - - cMenTreeImport.Text = Language.strImportMenuItem; - cMenTreeImportFile.Text = Language.strImportFromFileMenuItem; - cMenTreeImportActiveDirectory.Text = Language.strImportAD; - cMenTreeImportPortScan.Text = Language.strImportPortScan; - cMenTreeExportFile.Text = Language.strExportToFileMenuItem; - - cMenTreeAddConnection.Text = Language.strAddConnection; - cMenTreeAddFolder.Text = Language.strAddFolder; - - cMenTreeToolsSort.Text = Language.strSort; - cMenTreeToolsSortAscending.Text = Language.strSortAsc; - cMenTreeToolsSortDescending.Text = Language.strSortDesc; - cMenTreeMoveUp.Text = Language.strMoveUp; - cMenTreeMoveDown.Text = Language.strMoveDown; - txtSearch.Text = Language.strSearchPrompt; } @@ -313,17 +305,17 @@ namespace mRemoteNG.UI.Window #region Private Methods private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) { - cMenTreeDelete.ShortcutKeys = Keys.None; + //cMenTreeDelete.ShortcutKeys = Keys.None; } private void tvConnections_AfterLabelEdit(object sender, LabelEditEventArgs e) { try { - cMenTreeDelete.ShortcutKeys = Keys.Delete; + //cMenTreeDelete.ShortcutKeys = Keys.Delete; ConnectionTreeModel.RenameNode(SelectedNode, e.Label); Windows.configForm.pGrid_SelectedObjectChanged(); - ShowHideTreeContextMenuItems(SelectedNode); + //ShowHideTreeContextMenuItems(SelectedNode); Runtime.SaveConnectionsBG(); } catch (Exception ex) @@ -337,7 +329,7 @@ namespace mRemoteNG.UI.Window try { Windows.configForm.SetPropertyGridObject(olvConnections.SelectedObject); - ShowHideTreeContextMenuItems((ConnectionInfo)olvConnections.SelectedObject); + //ShowHideTreeContextMenuItems((ConnectionInfo)olvConnections.SelectedObject); Runtime.LastSelected = ((ConnectionInfo)olvConnections.SelectedObject)?.ConstantID; } catch (Exception ex) @@ -352,7 +344,7 @@ namespace mRemoteNG.UI.Window { if (e.ClickCount > 1) return; var clickedNode = (ConnectionInfo)e.Model; - ShowHideTreeContextMenuItems(SelectedNode); + //ShowHideTreeContextMenuItems(SelectedNode); //if (e.Button != MouseButtons.Left) return; if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; @@ -393,120 +385,9 @@ namespace mRemoteNG.UI.Window } } - private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true) - { - foreach (ToolStripItem item in items) - { - var menuItem = item as ToolStripMenuItem; - if (menuItem == null) - { - continue; - } - menuItem.Enabled = enable; - if (menuItem.HasDropDownItems) - { - EnableMenuItemsRecursive(menuItem.DropDownItems, enable); - } - } - } + - private void ShowHideTreeContextMenuItems(ConnectionInfo connectionInfo) - { - if (connectionInfo == null) - return ; - - try - { - cMenTree.Enabled = true; - EnableMenuItemsRecursive(cMenTree.Items); - if (connectionInfo is RootPuttySessionsNodeInfo) - { - cMenTreeAddConnection.Enabled = false; - cMenTreeAddFolder.Enabled = false; - cMenTreeConnect.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeDisconnect.Enabled = false; - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeToolsSort.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - cMenTreeDuplicate.Enabled = false; - cMenTreeRename.Enabled = true; - cMenTreeDelete.Enabled = false; - cMenTreeMoveUp.Enabled = false; - cMenTreeMoveDown.Enabled = false; - } - else if (connectionInfo is RootNodeInfo) - { - cMenTreeConnect.Enabled = false; - cMenTreeConnectWithOptions.Enabled = false; - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Enabled = false; - cMenTreeDisconnect.Enabled = false; - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - cMenTreeDuplicate.Enabled = false; - cMenTreeDelete.Enabled = false; - cMenTreeMoveUp.Enabled = false; - cMenTreeMoveDown.Enabled = false; - } - else if (connectionInfo is ContainerInfo) - { - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - cMenTreeDisconnect.Enabled = false; - - var openConnections = ((ContainerInfo) connectionInfo).Children.Sum(child => child.OpenConnections.Count); - if (openConnections == 0) - cMenTreeDisconnect.Enabled = false; - - cMenTreeToolsTransferFile.Enabled = false; - cMenTreeToolsExternalApps.Enabled = false; - } - else if (connectionInfo is PuttySessionInfo) - { - cMenTreeAddConnection.Enabled = false; - cMenTreeAddFolder.Enabled = false; - - if (connectionInfo.OpenConnections.Count == 0) - cMenTreeDisconnect.Enabled = false; - - if (!(connectionInfo.Protocol == ProtocolType.SSH1 | connectionInfo.Protocol == ProtocolType.SSH2)) - cMenTreeToolsTransferFile.Enabled = false; - - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - cMenTreeToolsSort.Enabled = false; - cMenTreeDuplicate.Enabled = false; - cMenTreeRename.Enabled = false; - cMenTreeDelete.Enabled = false; - cMenTreeMoveUp.Enabled = false; - cMenTreeMoveDown.Enabled = false; - } - else - { - if (connectionInfo.OpenConnections.Count == 0) - cMenTreeDisconnect.Enabled = false; - - if (!(connectionInfo.Protocol == ProtocolType.SSH1 | connectionInfo.Protocol == ProtocolType.SSH2)) - cMenTreeToolsTransferFile.Enabled = false; - - if (!(connectionInfo.Protocol == ProtocolType.RDP | connectionInfo.Protocol == ProtocolType.ICA)) - { - cMenTreeConnectWithOptionsConnectInFullscreen.Enabled = false; - cMenTreeConnectWithOptionsConnectToConsoleSession.Enabled = false; - } - - if (connectionInfo.Protocol == ProtocolType.IntApp) - cMenTreeConnectWithOptionsNoCredentials.Enabled = false; - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("ShowHideTreeContextMenuItems (UI.Window.ConnectionTreeWindow) failed", ex); - } - } + #endregion #region Tree Context Menu @@ -522,46 +403,6 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - private void cMenTreeConnect_Click(object sender, EventArgs e) - { - ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DoNotJump); - } - - private void cMenTreeConnectWithOptionsConnectToConsoleSession_Click(object sender, EventArgs e) - { - ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); - } - - private void cMenTreeConnectWithOptionsNoCredentials_Click(object sender, EventArgs e) - { - ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.NoCredentials); - } - - private void cMenTreeConnectWithOptionsDontConnectToConsoleSession_Click(object sender, EventArgs e) - { - ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); - } - - private void cMenTreeConnectWithOptionsConnectInFullscreen_Click(object sender, EventArgs e) - { - ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); - } - - private void cMenTreeConnectWithOptionsChoosePanelBeforeConnecting_Click(object sender, EventArgs e) - { - ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); - } - - private void cMenTreeDisconnect_Click(object sender, EventArgs e) - { - DisconnectConnection(SelectedNode); - } - - private void cMenTreeToolsTransferFile_Click(object sender, EventArgs e) - { - SshTransferFile(); - } - //TODO Fix for TreeListView private void mMenSortAscending_Click(object sender, EventArgs e) { @@ -589,18 +430,6 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - //TODO Fix for TreeListView - private void cMenTreeImportFile_Click(object sender, EventArgs e) - { - Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true); - } - - //TODO Fix for TreeListView - private void cMenTreeExportFile_Click(object sender, EventArgs e) - { - Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); - } - private void cMenTreeMoveUp_Click(object sender, EventArgs e) { SelectedNode.Parent.PromoteChild(SelectedNode); @@ -695,41 +524,7 @@ namespace mRemoteNG.UI.Window } } - private void AddExternalApps() - { - try - { - ResetExternalAppMenu(); - - foreach (Tools.ExternalTool extA in Runtime.ExternalTools) - { - var menuItem = new ToolStripMenuItem - { - Text = extA.DisplayName, - Tag = extA, - Image = extA.Image - }; - - menuItem.Click += (sender, args) => StartExternalApp((Tools.ExternalTool)((ToolStripMenuItem)sender).Tag); - cMenTreeToolsExternalApps.DropDownItems.Add(menuItem); - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("cMenTreeTools_DropDownOpening failed (UI.Window.ConnectionTreeWindow)", ex); - } - } - - private void ResetExternalAppMenu() - { - if (cMenTreeToolsExternalApps.DropDownItems.Count <= 0) return; - for (var i = cMenTreeToolsExternalApps.DropDownItems.Count - 1; i >= 0; i--) - cMenTreeToolsExternalApps.DropDownItems[i].Dispose(); - - cMenTreeToolsExternalApps.DropDownItems.Clear(); - } - - private void StartExternalApp(Tools.ExternalTool externalTool) + private void StartExternalApp(ExternalTool externalTool) { try { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.resx b/mRemoteV1/UI/Window/ConnectionTreeWindow.resx index 45d7100e9..dfeabba7a 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.resx +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.resx @@ -117,9 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 208, 19 - 17, 17 From 3fe580136661291fa9494c18f0bd03d981875bd7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 15 Sep 2016 10:01:20 -0600 Subject: [PATCH 138/338] Context menu item enable/disabled based on node type is now working again --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 0895001dd..4cf01423a 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -127,6 +127,7 @@ namespace mRemoteNG.UI.Window private void SetContextMenuEventHandlers() { + _contextMenu.Opening += (sender, args) => _contextMenu.ShowHideTreeContextMenuItems(SelectedNode); _contextMenu.ConnectClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DoNotJump); _contextMenu.ConnectToConsoleSessionClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); _contextMenu.DontConnectToConsoleSessionClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); From ecb77238a33fa72ff65dafe4a895c99101d30940 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 15 Sep 2016 12:05:46 -0600 Subject: [PATCH 139/338] Sorting nodes now works (ascending/descending) --- mRemoteV1/App/Runtime.cs | 1 - .../Connection/ConnectionInfoComparer.cs | 33 +++++++++++++ mRemoteV1/Container/ContainerInfo.cs | 32 ++++++++++++ .../Window/ConnectionTreeWindow.Designer.cs | 1 - mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 49 ++++++++----------- mRemoteV1/mRemoteV1.csproj | 1 + 6 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 mRemoteV1/Connection/ConnectionInfoComparer.cs diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index c5d7008e3..a30e612f9 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -2,7 +2,6 @@ using mRemoteNG.App.Info; using mRemoteNG.Config.Connections; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; -using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Container; using mRemoteNG.Credential; using mRemoteNG.Messages; diff --git a/mRemoteV1/Connection/ConnectionInfoComparer.cs b/mRemoteV1/Connection/ConnectionInfoComparer.cs new file mode 100644 index 000000000..0783c2b1a --- /dev/null +++ b/mRemoteV1/Connection/ConnectionInfoComparer.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; + + +namespace mRemoteNG.Connection +{ + public class ConnectionInfoComparer : IComparer where TProperty : IComparable + { + private readonly Func _sortExpression; + public ListSortDirection SortDirection { get; set; } = ListSortDirection.Ascending; + + public ConnectionInfoComparer(Func sortExpression) + { + _sortExpression = sortExpression; + } + + public int Compare(ConnectionInfo x, ConnectionInfo y) + { + return SortDirection == ListSortDirection.Ascending ? CompareAscending(x, y) : CompareDescending(x, y); + } + + private int CompareAscending(ConnectionInfo x, ConnectionInfo y) + { + return _sortExpression(x).CompareTo(_sortExpression(y)); + } + + private int CompareDescending(ConnectionInfo x, ConnectionInfo y) + { + return _sortExpression(y).CompareTo(_sortExpression(x)); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index b1fc714cf..790e7439f 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -1,6 +1,10 @@ +using System; +using System.Collections; using System.Collections.Generic; using mRemoteNG.Connection; using System.ComponentModel; +using System.Globalization; +using System.Linq; using mRemoteNG.Connection.Protocol; using mRemoteNG.Tools; using mRemoteNG.Tree; @@ -103,6 +107,34 @@ namespace mRemoteNG.Container SetChildPosition(child, originalIndex + 1); } + public void Sort(ListSortDirection sortDirection = ListSortDirection.Ascending) + { + SortOn(connectionInfo => connectionInfo.Name, sortDirection); + } + + public void SortOn(Func propertyToCompare, ListSortDirection sortDirection = ListSortDirection.Ascending) + where TProperty : IComparable + { + var connectionComparer = new ConnectionInfoComparer(propertyToCompare) + { + SortDirection = sortDirection + }; + Children.Sort(connectionComparer); + } + + public void SortRecursive(ListSortDirection sortDirection = ListSortDirection.Ascending) + { + SortOnRecursive(connectionInfo => connectionInfo.Name, sortDirection); + } + + public void SortOnRecursive(Func propertyToCompare, ListSortDirection sortDirection = ListSortDirection.Ascending) + where TProperty : IComparable + { + foreach (var child in Children.OfType()) + child.SortOnRecursive(propertyToCompare, sortDirection); + SortOn(propertyToCompare, sortDirection); + } + public override void Dispose() { var tempChildList = Children.ToArray(); diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs index 5bec8207d..82865b44a 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.Designer.cs @@ -188,7 +188,6 @@ namespace mRemoteNG.UI.Window this.mMenSortAscending.Image = global::mRemoteNG.Resources.Sort_AZ; this.mMenSortAscending.Name = "mMenSortAscending"; this.mMenSortAscending.Size = new System.Drawing.Size(28, 20); - this.mMenSortAscending.Click += new System.EventHandler(this.mMenSortAscending_Click); // // ConnectionTreeWindow // diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 4cf01423a..580660a73 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -3,6 +3,7 @@ using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Tree; using System; +using System.ComponentModel; using System.Drawing; using System.Linq; using System.Windows.Forms; @@ -18,9 +19,9 @@ namespace mRemoteNG.UI.Window public partial class ConnectionTreeWindow { private ConnectionTreeModel _connectionTreeModel; - private ConnectionTreeDragAndDropHandler _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); + private readonly ConnectionTreeDragAndDropHandler _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); private NodeSearcher _nodeSearcher; - private ConnectionContextMenu _contextMenu = new ConnectionContextMenu(); + private readonly ConnectionContextMenu _contextMenu = new ConnectionContextMenu(); public ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; @@ -145,8 +146,8 @@ namespace mRemoteNG.UI.Window _contextMenu.ExportFileClicked += (sender, args) => Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); _contextMenu.AddConnectionClicked += cMenTreeAddConnection_Click; _contextMenu.AddFolderClicked += cMenTreeAddFolder_Click; - _contextMenu.SortAscendingClicked += cMenTreeToolsSortAscending_Click; - _contextMenu.SortDescendingClicked += cMenTreeToolsSortDescending_Click; + _contextMenu.SortAscendingClicked += (sender, args) => SortNodes(ListSortDirection.Ascending); + _contextMenu.SortDescendingClicked += (sender, args) => SortNodes(ListSortDirection.Descending); ; _contextMenu.MoveUpClicked += cMenTreeMoveUp_Click; _contextMenu.MoveDownClicked += cMenTreeMoveDown_Click; _contextMenu.ExternalToolClicked += (sender, args) => StartExternalApp((ExternalTool)((ToolStripMenuItem)sender).Tag); @@ -160,7 +161,8 @@ namespace mRemoteNG.UI.Window olvConnections.CollapseAll(); olvConnections.Expand(GetRootConnectionNode()); }; - } + mMenSortAscending.Click += (sender, args) => SortNodesRecursive(GetRootConnectionNode(), ListSortDirection.Ascending); + } private void PopulateTreeView() { @@ -404,32 +406,23 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsBG(); } - //TODO Fix for TreeListView - private void mMenSortAscending_Click(object sender, EventArgs e) - { - tvConnections.BeginUpdate(); - ConnectionTree.Sort(tvConnections.Nodes[0], SortOrder.Ascending); - tvConnections.EndUpdate(); + private void SortNodes(ListSortDirection sortDirection) + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo; + if (selectedNodeAsContainer != null) + selectedNodeAsContainer.Sort(sortDirection); + else + SelectedNode.Parent.Sort(sortDirection); + olvConnections.RefreshObject(SelectedNode); Runtime.SaveConnectionsBG(); - } + } - //TODO Fix for TreeListView - private void cMenTreeToolsSortAscending_Click(object sender, EventArgs e) - { - tvConnections.BeginUpdate(); - ConnectionTree.Sort(tvConnections.SelectedNode, SortOrder.Ascending); - tvConnections.EndUpdate(); + private void SortNodesRecursive(ContainerInfo rootSortTarget, ListSortDirection sortDirection) + { + rootSortTarget.SortRecursive(sortDirection); + olvConnections.RefreshObject(rootSortTarget); Runtime.SaveConnectionsBG(); - } - - //TODO Fix for TreeListView - private void cMenTreeToolsSortDescending_Click(object sender, EventArgs e) - { - tvConnections.BeginUpdate(); - ConnectionTree.Sort(tvConnections.SelectedNode, SortOrder.Descending); - tvConnections.EndUpdate(); - Runtime.SaveConnectionsBG(); - } + } private void cMenTreeMoveUp_Click(object sender, EventArgs e) { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index d37c93220..8b9906ce2 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -169,6 +169,7 @@ + From a50f96606bc112e0ec97e73ef88002cd13132f2e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 15 Sep 2016 13:31:00 -0600 Subject: [PATCH 140/338] Resolved bug when editing a tree node name - the context menu would steal keyboard input for its shortcut keys --- .../UI/Controls/ConnectionContextMenu.cs | 27 ++++++++++++++----- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 15 +++-------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs index 8fbf1e4c4..52b34b152 100644 --- a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs +++ b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs @@ -51,6 +51,7 @@ namespace mRemoteNG.UI.Controls { InitializeComponent(); ApplyLanguage(); + EnableShortcutKeys(); Opening += (sender, args) => AddExternalApps(); } @@ -122,7 +123,6 @@ namespace mRemoteNG.UI.Controls // _cMenTreeConnect.Image = Resources.Play; _cMenTreeConnect.Name = "_cMenTreeConnect"; - _cMenTreeConnect.ShortcutKeys = ((Keys.Control | Keys.Shift) | Keys.C); _cMenTreeConnect.Size = new System.Drawing.Size(199, 22); _cMenTreeConnect.Text = "Connect"; _cMenTreeConnect.Click += (sender, args) => OnConnectClicked(args); @@ -218,7 +218,6 @@ namespace mRemoteNG.UI.Controls // _cMenTreeDuplicate.Image = Resources.page_copy; _cMenTreeDuplicate.Name = "_cMenTreeDuplicate"; - _cMenTreeDuplicate.ShortcutKeys = Keys.Control | Keys.D; _cMenTreeDuplicate.Size = new System.Drawing.Size(199, 22); _cMenTreeDuplicate.Text = "Duplicate"; _cMenTreeDuplicate.Click += (sender, args) => OnDuplicateClicked(args); @@ -227,7 +226,6 @@ namespace mRemoteNG.UI.Controls // _cMenTreeRename.Image = Resources.Rename; _cMenTreeRename.Name = "_cMenTreeRename"; - _cMenTreeRename.ShortcutKeys = Keys.F2; _cMenTreeRename.Size = new System.Drawing.Size(199, 22); _cMenTreeRename.Text = "Rename"; _cMenTreeRename.Click += (sender, args) => OnRenameClicked(args); @@ -236,7 +234,6 @@ namespace mRemoteNG.UI.Controls // _cMenTreeDelete.Image = Resources.Delete; _cMenTreeDelete.Name = "_cMenTreeDelete"; - _cMenTreeDelete.ShortcutKeys = Keys.Delete; _cMenTreeDelete.Size = new System.Drawing.Size(199, 22); _cMenTreeDelete.Text = "Delete"; _cMenTreeDelete.Click += (sender, args) => OnDeleteClicked(args); @@ -341,7 +338,6 @@ namespace mRemoteNG.UI.Controls // _cMenTreeMoveUp.Image = Resources.Arrow_Up; _cMenTreeMoveUp.Name = "_cMenTreeMoveUp"; - _cMenTreeMoveUp.ShortcutKeys = Keys.Control | Keys.Up; _cMenTreeMoveUp.Size = new System.Drawing.Size(199, 22); _cMenTreeMoveUp.Text = "Move up"; _cMenTreeMoveUp.Click += (sender, args) => OnMoveUpClicked(args); @@ -350,7 +346,6 @@ namespace mRemoteNG.UI.Controls // _cMenTreeMoveDown.Image = Resources.Arrow_Down; _cMenTreeMoveDown.Name = "_cMenTreeMoveDown"; - _cMenTreeMoveDown.ShortcutKeys = Keys.Control | Keys.Down; _cMenTreeMoveDown.Size = new System.Drawing.Size(199, 22); _cMenTreeMoveDown.Text = "Move down"; _cMenTreeMoveDown.Click += (sender, args) => OnMoveDownClicked(args); @@ -488,6 +483,26 @@ namespace mRemoteNG.UI.Controls } } + internal void DisableShortcutKeys() + { + _cMenTreeConnect.ShortcutKeys = Keys.None; + _cMenTreeDuplicate.ShortcutKeys = Keys.None; + _cMenTreeRename.ShortcutKeys = Keys.None; + _cMenTreeDelete.ShortcutKeys = Keys.None; + _cMenTreeMoveUp.ShortcutKeys = Keys.None; + _cMenTreeMoveDown.ShortcutKeys = Keys.None; + } + + internal void EnableShortcutKeys() + { + _cMenTreeConnect.ShortcutKeys = ((Keys.Control | Keys.Shift) | Keys.C); + _cMenTreeDuplicate.ShortcutKeys = Keys.Control | Keys.D; + _cMenTreeRename.ShortcutKeys = Keys.F2; + _cMenTreeDelete.ShortcutKeys = Keys.Delete; + _cMenTreeMoveUp.ShortcutKeys = Keys.Control | Keys.Up; + _cMenTreeMoveDown.ShortcutKeys = Keys.Control | Keys.Down; + } + private static void EnableMenuItemsRecursive(ToolStripItemCollection items, bool enable = true) { foreach (ToolStripItem item in items) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 580660a73..8662aeb4d 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -307,18 +307,17 @@ namespace mRemoteNG.UI.Window #region Private Methods private void tvConnections_BeforeLabelEdit(object sender, LabelEditEventArgs e) - { - //cMenTreeDelete.ShortcutKeys = Keys.None; - } + { + _contextMenu.DisableShortcutKeys(); + } private void tvConnections_AfterLabelEdit(object sender, LabelEditEventArgs e) { try { - //cMenTreeDelete.ShortcutKeys = Keys.Delete; + _contextMenu.EnableShortcutKeys(); ConnectionTreeModel.RenameNode(SelectedNode, e.Label); Windows.configForm.pGrid_SelectedObjectChanged(); - //ShowHideTreeContextMenuItems(SelectedNode); Runtime.SaveConnectionsBG(); } catch (Exception ex) @@ -332,7 +331,6 @@ namespace mRemoteNG.UI.Window try { Windows.configForm.SetPropertyGridObject(olvConnections.SelectedObject); - //ShowHideTreeContextMenuItems((ConnectionInfo)olvConnections.SelectedObject); Runtime.LastSelected = ((ConnectionInfo)olvConnections.SelectedObject)?.ConstantID; } catch (Exception ex) @@ -347,7 +345,6 @@ namespace mRemoteNG.UI.Window { if (e.ClickCount > 1) return; var clickedNode = (ConnectionInfo)e.Model; - //ShowHideTreeContextMenuItems(SelectedNode); //if (e.Button != MouseButtons.Left) return; if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; @@ -387,10 +384,6 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_MouseMove (UI.Window.ConnectionTreeWindow) failed", ex); } } - - - - #endregion #region Tree Context Menu From 0e4ffde6ca35a72b1dea97b81c92d5c664527564 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 15 Sep 2016 13:41:32 -0600 Subject: [PATCH 141/338] Some file/class renaming --- mRemoteV1/Config/Putty/Config.Putty.Sessions.cs | 14 +++++++------- ...utty.Provider.cs => PuttySessionsProvider.cs} | 2 +- ...vider.cs => PuttySessionsRegistryProvider.cs} | 2 +- ...Provider.cs => PuttySessionsXmingProvider.cs} | 16 ++++++++-------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 1 - mRemoteV1/mRemoteV1.csproj | 6 +++--- 6 files changed, 20 insertions(+), 21 deletions(-) rename mRemoteV1/Config/Putty/{Config.Putty.Provider.cs => PuttySessionsProvider.cs} (98%) rename mRemoteV1/Config/Putty/{Config.Putty.RegistryProvider.cs => PuttySessionsRegistryProvider.cs} (98%) rename mRemoteV1/Config/Putty/{Config.Putty.XmingProvider.cs => PuttySessionsXmingProvider.cs} (93%) diff --git a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs b/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs index 45307fd76..9a735e50e 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs +++ b/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs @@ -133,15 +133,15 @@ namespace mRemoteNG.Config.Putty } } - public static void SessionChanged(object sender, Provider.SessionChangedEventArgs e) + public static void SessionChanged(object sender, PuttySessionsProvider.SessionChangedEventArgs e) { AddSessionsToTree(Windows.treeForm.tvConnections); } #endregion #region Private Methods - private static List _providers; - private static List Providers + private static List _providers; + private static List Providers { get { @@ -155,7 +155,7 @@ namespace mRemoteNG.Config.Putty private static void AddProviders() { - _providers = new List {new RegistryProvider(), new XmingProvider()}; + _providers = new List {new PuttySessionsRegistryProvider(), new PuttySessionsXmingProvider()}; } private static string[] GetSessionNames(bool raw = false) @@ -172,17 +172,17 @@ namespace mRemoteNG.Config.Putty return sessionNames.ToArray(); } - private static bool IsProviderEnabled(Provider provider) + private static bool IsProviderEnabled(PuttySessionsProvider puttySessionsProvider) { var enabled = true; if (PuttyTypeDetector.GetPuttyType() == PuttyTypeDetector.PuttyType.Xming) { - if ((provider) is RegistryProvider) + if ((puttySessionsProvider) is PuttySessionsRegistryProvider) enabled = false; } else { - if ((provider) is XmingProvider) + if ((puttySessionsProvider) is PuttySessionsXmingProvider) enabled = false; } return enabled; diff --git a/mRemoteV1/Config/Putty/Config.Putty.Provider.cs b/mRemoteV1/Config/Putty/PuttySessionsProvider.cs similarity index 98% rename from mRemoteV1/Config/Putty/Config.Putty.Provider.cs rename to mRemoteV1/Config/Putty/PuttySessionsProvider.cs index 78bd98f17..231d25a90 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.Provider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsProvider.cs @@ -7,7 +7,7 @@ using mRemoteNG.Connection; namespace mRemoteNG.Config.Putty { - public abstract class Provider + public abstract class PuttySessionsProvider { #region Public Methods private TreeNode _rootTreeNode; diff --git a/mRemoteV1/Config/Putty/Config.Putty.RegistryProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs similarity index 98% rename from mRemoteV1/Config/Putty/Config.Putty.RegistryProvider.cs rename to mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs index 7c8be84b1..05754b184 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.RegistryProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs @@ -11,7 +11,7 @@ using System.Security.Principal; namespace mRemoteNG.Config.Putty { - public class RegistryProvider : Provider + public class PuttySessionsRegistryProvider : PuttySessionsProvider { #region Private Fields private const string PuttySessionsKey = "Software\\SimonTatham\\PuTTY\\Sessions"; diff --git a/mRemoteV1/Config/Putty/Config.Putty.XmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs similarity index 93% rename from mRemoteV1/Config/Putty/Config.Putty.XmingProvider.cs rename to mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index bd7872ee8..6d19764be 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.XmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -10,12 +10,12 @@ using System.Text.RegularExpressions; namespace mRemoteNG.Config.Putty { - public class XmingProvider : Provider + public class PuttySessionsXmingProvider : PuttySessionsProvider { #region Private Fields private const string RegistrySessionNameFormat = "{0} [registry]"; private const string RegistrySessionNamePattern = "(.*)\\ \\[registry\\]"; - private static readonly RegistryProvider RegistryProvider = new RegistryProvider(); + private static readonly PuttySessionsRegistryProvider PuttySessionsRegistryProvider = new PuttySessionsRegistryProvider(); private static FileSystemWatcher _eventWatcher; #endregion @@ -58,7 +58,7 @@ namespace mRemoteNG.Config.Putty } List registrySessionNames = new List(); - foreach (string sessionName in RegistryProvider.GetSessionNames(raw)) + foreach (string sessionName in PuttySessionsRegistryProvider.GetSessionNames(raw)) { registrySessionNames.Add(string.Format(RegistrySessionNameFormat, sessionName)); } @@ -74,7 +74,7 @@ namespace mRemoteNG.Config.Putty string registrySessionName = GetRegistrySessionName(sessionName); if (!string.IsNullOrEmpty(registrySessionName)) { - return ModifyRegistrySessionInfo(RegistryProvider.GetSession(registrySessionName)); + return ModifyRegistrySessionInfo(PuttySessionsRegistryProvider.GetSession(registrySessionName)); } string sessionsFolderPath = GetSessionsFolderPath(); @@ -144,8 +144,8 @@ namespace mRemoteNG.Config.Putty public override void StartWatcher() { - RegistryProvider.StartWatcher(); - RegistryProvider.SessionChanged += OnRegistrySessionChanged; + PuttySessionsRegistryProvider.StartWatcher(); + PuttySessionsRegistryProvider.SessionChanged += OnRegistrySessionChanged; if (_eventWatcher != null) { @@ -170,8 +170,8 @@ namespace mRemoteNG.Config.Putty public override void StopWatcher() { - RegistryProvider.StopWatcher(); - RegistryProvider.SessionChanged -= OnRegistrySessionChanged; + PuttySessionsRegistryProvider.StopWatcher(); + PuttySessionsRegistryProvider.SessionChanged -= OnRegistrySessionChanged; if (_eventWatcher == null) { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 8662aeb4d..010bc6a32 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -346,7 +346,6 @@ namespace mRemoteNG.UI.Window if (e.ClickCount > 1) return; var clickedNode = (ConnectionInfo)e.Model; - //if (e.Button != MouseButtons.Left) return; if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; if (Settings.Default.SingleClickOnConnectionOpensIt) ConnectionInitiator.OpenConnection(SelectedNode); diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 8b9906ce2..07aea99ee 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -163,10 +163,10 @@ - - + + - + From f0828d38702471148bfc0c3685f2c09d4cb884be Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 08:08:34 -0600 Subject: [PATCH 142/338] Some code cleanup --- .../Putty/PuttySessionsRegistryProvider.cs | 75 +++------ .../Putty/PuttySessionsXmingProvider.cs | 149 +++++++----------- 2 files changed, 80 insertions(+), 144 deletions(-) diff --git a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs index 05754b184..9c0c70d1e 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs @@ -7,37 +7,29 @@ using System; using System.Collections.Generic; using System.Management; using System.Security.Principal; +using System.Web; namespace mRemoteNG.Config.Putty { public class PuttySessionsRegistryProvider : PuttySessionsProvider { - #region Private Fields private const string PuttySessionsKey = "Software\\SimonTatham\\PuTTY\\Sessions"; private static ManagementEventWatcher _eventWatcher; - #endregion #region Public Methods public override string[] GetSessionNames(bool raw = false) { - RegistryKey sessionsKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey); + var sessionsKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey); if (sessionsKey == null) { return new string[] {}; } - - List sessionNames = new List(); - foreach (string sessionName in sessionsKey.GetSubKeyNames()) + + var sessionNames = new List(); + foreach (var sessionName in sessionsKey.GetSubKeyNames()) { - if (raw) - { - sessionNames.Add(sessionName); - } - else - { - sessionNames.Add(System.Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B"))); - } + sessionNames.Add(raw ? sessionName : HttpUtility.UrlDecode(sessionName.Replace("+", "%2B"))); } if (raw) @@ -60,31 +52,25 @@ namespace mRemoteNG.Config.Putty public override PuttySessionInfo GetSession(string sessionName) { - RegistryKey sessionsKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey); - if (sessionsKey == null) - { - return null; - } - - RegistryKey sessionKey = sessionsKey.OpenSubKey(sessionName); + var sessionsKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey); + + var sessionKey = sessionsKey?.OpenSubKey(sessionName); if (sessionKey == null) { return null; } sessionName = System.Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B")); - - PuttySessionInfo sessionInfo = new PuttySessionInfo(); - sessionInfo.PuttySession = sessionName; - sessionInfo.Name = sessionName; - sessionInfo.Hostname = Convert.ToString(sessionKey.GetValue("HostName")); - sessionInfo.Username = Convert.ToString(sessionKey.GetValue("UserName")); - string protocol = Convert.ToString(sessionKey.GetValue("Protocol")); - if (protocol == null) - { - protocol = "ssh"; - } - switch (protocol.ToLowerInvariant()) + + var sessionInfo = new PuttySessionInfo + { + PuttySession = sessionName, + Name = sessionName, + Hostname = Convert.ToString(sessionKey.GetValue("HostName")), + Username = Convert.ToString(sessionKey.GetValue("UserName")) + }; + var protocol = Convert.ToString(sessionKey.GetValue("Protocol")) ?? "ssh"; + switch (protocol.ToLowerInvariant()) { case "raw": sessionInfo.Protocol = ProtocolType.RAW; @@ -95,18 +81,11 @@ namespace mRemoteNG.Config.Putty case "serial": return null; case "ssh": - object sshVersionObject = sessionKey.GetValue("SshProt"); + var sshVersionObject = sessionKey.GetValue("SshProt"); if (sshVersionObject != null) { - int sshVersion = Convert.ToInt32(sshVersionObject); - if (sshVersion >= 2) - { - sessionInfo.Protocol = ProtocolType.SSH2; - } - else - { - sessionInfo.Protocol = ProtocolType.SSH1; - } + var sshVersion = Convert.ToInt32(sshVersionObject); + sessionInfo.Protocol = sshVersion >= 2 ? ProtocolType.SSH2 : ProtocolType.SSH1; } else { @@ -133,9 +112,9 @@ namespace mRemoteNG.Config.Putty try { - string currentUserSid = WindowsIdentity.GetCurrent().User.Value; - string key = Convert.ToString(string.Join("\\", new[] {currentUserSid, PuttySessionsKey}).Replace("\\", "\\\\")); - WqlEventQuery query = new WqlEventQuery(string.Format("SELECT * FROM RegistryTreeChangeEvent WHERE Hive = \'HKEY_USERS\' AND RootPath = \'{0}\'", key)); + var currentUserSid = WindowsIdentity.GetCurrent().User.Value; + var key = Convert.ToString(string.Join("\\", currentUserSid, PuttySessionsKey).Replace("\\", "\\\\")); + var query = new WqlEventQuery($"SELECT * FROM RegistryTreeChangeEvent WHERE Hive = \'HKEY_USERS\' AND RootPath = \'{key}\'"); _eventWatcher = new ManagementEventWatcher(query); _eventWatcher.EventArrived += OnManagementEventArrived; _eventWatcher.Start(); @@ -158,11 +137,9 @@ namespace mRemoteNG.Config.Putty } #endregion - #region Private Methods private void OnManagementEventArrived(object sender, EventArrivedEventArgs e) { OnSessionChanged(new SessionChangedEventArgs()); } - #endregion } -} +} \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index 6d19764be..8eb73177f 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -5,6 +5,7 @@ using mRemoteNG.Messages; using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text.RegularExpressions; @@ -12,37 +13,28 @@ namespace mRemoteNG.Config.Putty { public class PuttySessionsXmingProvider : PuttySessionsProvider { - #region Private Fields private const string RegistrySessionNameFormat = "{0} [registry]"; private const string RegistrySessionNamePattern = "(.*)\\ \\[registry\\]"; private static readonly PuttySessionsRegistryProvider PuttySessionsRegistryProvider = new PuttySessionsRegistryProvider(); private static FileSystemWatcher _eventWatcher; - #endregion #region Public Methods public override string[] GetSessionNames(bool raw = false) { - string sessionsFolderPath = GetSessionsFolderPath(); + var sessionsFolderPath = GetSessionsFolderPath(); if (!Directory.Exists(sessionsFolderPath)) { return new string[] {}; } - List sessionNames = new List(); - foreach (string sessionName in Directory.GetFiles(sessionsFolderPath)) + var sessionNames = new List(); + foreach (var sessionName in Directory.GetFiles(sessionsFolderPath)) { - string _sessionFileName = Path.GetFileName(sessionName); - if (raw) - { - sessionNames.Add(_sessionFileName); - } - else - { - sessionNames.Add(System.Web.HttpUtility.UrlDecode(_sessionFileName.Replace("+", "%2B"))); - } + var sessionFileName = Path.GetFileName(sessionName); + sessionNames.Add(raw ? sessionFileName : System.Web.HttpUtility.UrlDecode(sessionFileName?.Replace("+", "%2B"))); } - - if (raw) + + if (raw) { if (!sessionNames.Contains("Default%20Settings")) // Do not localize { @@ -57,13 +49,9 @@ namespace mRemoteNG.Config.Putty } } - List registrySessionNames = new List(); - foreach (string sessionName in PuttySessionsRegistryProvider.GetSessionNames(raw)) - { - registrySessionNames.Add(string.Format(RegistrySessionNameFormat, sessionName)); - } - - sessionNames.AddRange(registrySessionNames); + var registrySessionNames = PuttySessionsRegistryProvider.GetSessionNames(raw).Select(sessionName => string.Format(RegistrySessionNameFormat, sessionName)).ToList(); + + sessionNames.AddRange(registrySessionNames); sessionNames.Sort(); return sessionNames.ToArray(); @@ -71,38 +59,36 @@ namespace mRemoteNG.Config.Putty public override PuttySessionInfo GetSession(string sessionName) { - string registrySessionName = GetRegistrySessionName(sessionName); + var registrySessionName = GetRegistrySessionName(sessionName); if (!string.IsNullOrEmpty(registrySessionName)) { return ModifyRegistrySessionInfo(PuttySessionsRegistryProvider.GetSession(registrySessionName)); } - - string sessionsFolderPath = GetSessionsFolderPath(); + + var sessionsFolderPath = GetSessionsFolderPath(); if (!Directory.Exists(sessionsFolderPath)) { return null; } - - string sessionFile = Path.Combine(sessionsFolderPath, sessionName); + + var sessionFile = Path.Combine(sessionsFolderPath, sessionName); if (!File.Exists(sessionFile)) { return null; } sessionName = System.Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B")); - - SessionFileReader sessionFileReader = new SessionFileReader(sessionFile); - PuttySessionInfo sessionInfo = new PuttySessionInfo(); - sessionInfo.PuttySession = sessionName; - sessionInfo.Name = sessionName; - sessionInfo.Hostname = sessionFileReader.GetValue("HostName"); - sessionInfo.Username = sessionFileReader.GetValue("UserName"); - string protocol = sessionFileReader.GetValue("Protocol"); - if (protocol == null) - { - protocol = "ssh"; - } - switch (protocol.ToLowerInvariant()) + + var sessionFileReader = new SessionFileReader(sessionFile); + var sessionInfo = new PuttySessionInfo + { + PuttySession = sessionName, + Name = sessionName, + Hostname = sessionFileReader.GetValue("HostName"), + Username = sessionFileReader.GetValue("UserName") + }; + var protocol = sessionFileReader.GetValue("Protocol") ?? "ssh"; + switch (protocol.ToLowerInvariant()) { case "raw": sessionInfo.Protocol = ProtocolType.RAW; @@ -116,15 +102,8 @@ namespace mRemoteNG.Config.Putty object sshVersionObject = sessionFileReader.GetValue("SshProt"); if (sshVersionObject != null) { - int sshVersion = Convert.ToInt32(sshVersionObject); - if (sshVersion >= 2) - { - sessionInfo.Protocol = ProtocolType.SSH2; - } - else - { - sessionInfo.Protocol = ProtocolType.SSH1; - } + var sshVersion = Convert.ToInt32(sshVersionObject); + sessionInfo.Protocol = sshVersion >= 2 ? ProtocolType.SSH2 : ProtocolType.SSH1; } else { @@ -154,9 +133,11 @@ namespace mRemoteNG.Config.Putty try { - _eventWatcher = new FileSystemWatcher(GetSessionsFolderPath()); - _eventWatcher.NotifyFilter = (System.IO.NotifyFilters) (NotifyFilters.FileName | NotifyFilters.LastWrite); - _eventWatcher.Changed += OnFileSystemEventArrived; + _eventWatcher = new FileSystemWatcher(GetSessionsFolderPath()) + { + NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite + }; + _eventWatcher.Changed += OnFileSystemEventArrived; _eventWatcher.Created += OnFileSystemEventArrived; _eventWatcher.Deleted += OnFileSystemEventArrived; _eventWatcher.Renamed += OnFileSystemEventArrived; @@ -186,43 +167,31 @@ namespace mRemoteNG.Config.Putty #region Private Methods private static string GetPuttyConfPath() { - string puttyPath = ""; - if (mRemoteNG.Settings.Default.UseCustomPuttyPath) - { - puttyPath = Convert.ToString(mRemoteNG.Settings.Default.CustomPuttyPath); - } - else - { - puttyPath = App.Info.GeneralAppInfo.PuttyPath; - } + var puttyPath = ""; + puttyPath = mRemoteNG.Settings.Default.UseCustomPuttyPath ? Convert.ToString(mRemoteNG.Settings.Default.CustomPuttyPath) : App.Info.GeneralAppInfo.PuttyPath; return Path.Combine(Path.GetDirectoryName(puttyPath), "putty.conf"); } private static string GetSessionsFolderPath() { - string puttyConfPath = GetPuttyConfPath(); - PuttyConfFileReader sessionFileReader = new PuttyConfFileReader(puttyConfPath); - string basePath = Environment.ExpandEnvironmentVariables(sessionFileReader.GetValue("sshk&sess")); + var puttyConfPath = GetPuttyConfPath(); + var sessionFileReader = new PuttyConfFileReader(puttyConfPath); + var basePath = Environment.ExpandEnvironmentVariables(sessionFileReader.GetValue("sshk&sess")); return Path.Combine(basePath, "sessions"); } private static string GetRegistrySessionName(string sessionName) { - Regex regex = new Regex(RegistrySessionNamePattern); - - MatchCollection matches = regex.Matches(sessionName); + var regex = new Regex(RegistrySessionNamePattern); + + var matches = regex.Matches(sessionName); if (matches.Count < 1) { return string.Empty; } - - GroupCollection groups = matches[0].Groups; - if (groups.Count < 1) - { - return string.Empty; // This should always include at least one item, but check anyway - } - - return groups[1].Value; + + var groups = matches[0].Groups; + return groups.Count < 1 ? string.Empty : groups[1].Value; } private static PuttySessionInfo ModifyRegistrySessionInfo(PuttySessionInfo sessionInfo) @@ -264,12 +233,11 @@ namespace mRemoteNG.Config.Putty { return ; } - using (StreamReader streamReader = new StreamReader(_puttyConfFile)) + using (var streamReader = new StreamReader(_puttyConfFile)) { - string line = ""; - do + do { - line = streamReader.ReadLine(); + var line = streamReader.ReadLine(); if (line == null) { break; @@ -283,7 +251,7 @@ namespace mRemoteNG.Config.Putty { continue; // Comment } - string[] parts = line.Split(new char[] {'='}, 2); + var parts = line.Split(new[] {'='}, 2); if (parts.Length < 2) { continue; @@ -309,11 +277,7 @@ namespace mRemoteNG.Config.Putty { LoadConfiguration(); } - if (!_configuration.ContainsKey(setting)) - { - return string.Empty; - } - return _configuration[setting]; + return !_configuration.ContainsKey(setting) ? string.Empty : _configuration[setting]; } } @@ -339,15 +303,14 @@ namespace mRemoteNG.Config.Putty } using (StreamReader streamReader = new StreamReader(_sessionFile)) { - string line = ""; - do + do { - line = streamReader.ReadLine(); + var line = streamReader.ReadLine(); if (line == null) { break; } - string[] parts = line.Split(new char[] {'\\'}); + var parts = line.Split('\\'); if (parts.Length < 2) { continue; @@ -369,11 +332,7 @@ namespace mRemoteNG.Config.Putty { LoadSessionInfo(); } - if (!_sessionInfo.ContainsKey(setting)) - { - return string.Empty; - } - return _sessionInfo[setting]; + return !_sessionInfo.ContainsKey(setting) ? string.Empty : _sessionInfo[setting]; } } #endregion From 77ca139363fab8fdfa1e0b73439cc6842a1e6416 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 08:13:12 -0600 Subject: [PATCH 143/338] Renamed class "Sessions" to "PuttySessionsManager" --- mRemoteV1/App/Shutdown.cs | 2 +- .../Config/Connections/ConnectionsLoader.cs | 2 +- ...ty.Sessions.cs => PuttySessionsManager.cs} | 39 ++++++++++--------- mRemoteV1/Connection/ConnectionInfo.cs | 2 +- .../UI/Forms/OptionsPages/AdvancedPage.cs | 2 +- mRemoteV1/UI/Forms/frmMain.cs | 2 +- mRemoteV1/mRemoteV1.csproj | 2 +- 7 files changed, 27 insertions(+), 24 deletions(-) rename mRemoteV1/Config/Putty/{Config.Putty.Sessions.cs => PuttySessionsManager.cs} (92%) diff --git a/mRemoteV1/App/Shutdown.cs b/mRemoteV1/App/Shutdown.cs index e93acf242..d63600739 100644 --- a/mRemoteV1/App/Shutdown.cs +++ b/mRemoteV1/App/Shutdown.cs @@ -36,7 +36,7 @@ namespace mRemoteNG.App private static void StopPuttySessionWatcher() { - Config.Putty.Sessions.StopWatcher(); + Config.Putty.PuttySessionsManager.StopWatcher(); } private static void DisposeNotificationAreaIcon() diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 16844aaab..f8577674c 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -66,7 +66,7 @@ namespace mRemoteNG.Config.Connections frmMain.Default.ConnectionsFileName = ConnectionFileName; if (!import) - Putty.Sessions.AddSessionsToTree(Windows.treeForm.tvConnections); + Putty.PuttySessionsManager.AddSessionsToTree(Windows.treeForm.tvConnections); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs similarity index 92% rename from mRemoteV1/Config/Putty/Config.Putty.Sessions.cs rename to mRemoteV1/Config/Putty/PuttySessionsManager.cs index 9a735e50e..ea6369f9d 100644 --- a/mRemoteV1/Config/Putty/Config.Putty.Sessions.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -9,10 +9,24 @@ using mRemoteNG.App; namespace mRemoteNG.Config.Putty { - public class Sessions + public class PuttySessionsManager { + private static List _providers; + private static List Providers + { + get + { + if (_providers == null || _providers.Count == 0) + { + AddProviders(); + } + return _providers; + } + } + + #region Public Methods - private delegate void AddSessionsToTreeDelegate(TreeView treeView); + private delegate void AddSessionsToTreeDelegate(TreeView treeView); public static void AddSessionsToTree(TreeView treeView) { if (treeView == null) @@ -114,7 +128,7 @@ namespace mRemoteNG.Config.Putty treeView.EndUpdate(); } } - + public static void StartWatcher() { foreach (var provider in Providers) @@ -123,7 +137,7 @@ namespace mRemoteNG.Config.Putty provider.SessionChanged += SessionChanged; } } - + public static void StopWatcher() { foreach (var provider in Providers) @@ -132,26 +146,15 @@ namespace mRemoteNG.Config.Putty provider.SessionChanged -= SessionChanged; } } - + public static void SessionChanged(object sender, PuttySessionsProvider.SessionChangedEventArgs e) { AddSessionsToTree(Windows.treeForm.tvConnections); } #endregion - + #region Private Methods - private static List _providers; - private static List Providers - { - get - { - if (_providers == null || _providers.Count == 0) - { - AddProviders(); - } - return _providers; - } - } + private static void AddProviders() { diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index eec907c31..22eb9969b 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -189,7 +189,7 @@ namespace mRemoteNG.Connection [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), LocalizedAttributes.LocalizedDisplayName("strPropertyNamePuttySession"), LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPuttySession"), - TypeConverter(typeof(Config.Putty.Sessions.SessionList))] + TypeConverter(typeof(Config.Putty.PuttySessionsManager.SessionList))] public virtual string PuttySession { get { return GetPropertyValue("PuttySession", _puttySession); } diff --git a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs index 3b54c0004..804a8e5a3 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs @@ -80,7 +80,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages if (puttyPathChanged) { PuttyBase.PuttyPath = Settings.Default.UseCustomPuttyPath ? Settings.Default.CustomPuttyPath : GeneralAppInfo.PuttyPath; - Sessions.AddSessionsToTree(Windows.treeForm.tvConnections); + PuttySessionsManager.AddSessionsToTree(Windows.treeForm.tvConnections); } Settings.Default.MaxPuttyWaitTime = (int) numPuttyWaitTime.Value; diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 73cf8414b..9fe96012f 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -156,7 +156,7 @@ namespace mRemoteNG.UI.Forms Windows.treePanel.Focus(); ConnectionTree.TreeView = Windows.treeForm.tvConnections; - Config.Putty.Sessions.StartWatcher(); + Config.Putty.PuttySessionsManager.StartWatcher(); if (Settings.Default.StartupComponentsCheck) { Windows.Show(WindowType.ComponentsCheck); diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 07aea99ee..fec176cc5 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -165,7 +165,7 @@ - + From fd559b61b1a17d193b9993dd94d12d50741c4312 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 08:44:08 -0600 Subject: [PATCH 144/338] Renamed PuttySessionsProvider to AbstractPuttySessionsProvider --- ...er.cs => AbstractPuttySessionsProvider.cs} | 46 ++++++++----------- .../Config/Putty/PuttySessionsManager.cs | 25 ++++++---- .../Putty/PuttySessionsRegistryProvider.cs | 24 +++------- .../Putty/PuttySessionsXmingProvider.cs | 2 +- mRemoteV1/mRemoteV1.csproj | 2 +- 5 files changed, 44 insertions(+), 55 deletions(-) rename mRemoteV1/Config/Putty/{PuttySessionsProvider.cs => AbstractPuttySessionsProvider.cs} (66%) diff --git a/mRemoteV1/Config/Putty/PuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs similarity index 66% rename from mRemoteV1/Config/Putty/PuttySessionsProvider.cs rename to mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 231d25a90..6cecd99b7 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -3,11 +3,12 @@ using System; using System.Windows.Forms; using mRemoteNG.Tree; using mRemoteNG.Connection; +using mRemoteNG.Root.PuttySessions; namespace mRemoteNG.Config.Putty { - public abstract class PuttySessionsProvider + public abstract class AbstractPuttySessionsProvider { #region Public Methods private TreeNode _rootTreeNode; @@ -23,36 +24,25 @@ namespace mRemoteNG.Config.Putty } } - private Root.PuttySessions.RootPuttySessionsNodeInfo _rootInfo; - public Root.PuttySessions.RootPuttySessionsNodeInfo RootInfo - { - get - { - if (_rootInfo == null) - { - _rootInfo = CreateRootInfo(); - } - return _rootInfo; - } - } - - public abstract string[] GetSessionNames(bool raw = false); + private RootPuttySessionsNodeInfo _rootInfo; + public RootPuttySessionsNodeInfo RootInfo => _rootInfo ?? (_rootInfo = CreateRootInfo()); + + public abstract string[] GetSessionNames(bool raw = false); public abstract PuttySessionInfo GetSession(string sessionName); - public virtual PuttySessionInfo[] GetSessions() + public virtual IEnumerable GetSessions() { - List sessionList = new List(); - PuttySessionInfo sessionInfo = (PuttySessionInfo)default(ConnectionInfo); - foreach (string sessionName in GetSessionNames(true)) + var sessionList = new List(); + foreach (var sessionName in GetSessionNames(true)) { - sessionInfo = GetSession(sessionName); - if (sessionInfo == null || string.IsNullOrEmpty(sessionInfo.Hostname)) + var sessionInfo = GetSession(sessionName); + if (string.IsNullOrEmpty(sessionInfo?.Hostname)) { continue; } sessionList.Add(sessionInfo); } - return sessionList.ToArray(); + return sessionList; } public virtual void StartWatcher() @@ -74,11 +64,11 @@ namespace mRemoteNG.Config.Putty { add { - SessionChangedEvent = (SessionChangedEventHandler) System.Delegate.Combine(SessionChangedEvent, value); + SessionChangedEvent = (SessionChangedEventHandler) Delegate.Combine(SessionChangedEvent, value); } remove { - SessionChangedEvent = (SessionChangedEventHandler) System.Delegate.Remove(SessionChangedEvent, value); + SessionChangedEvent = (SessionChangedEventHandler) Delegate.Remove(SessionChangedEvent, value); } } #endregion @@ -115,9 +105,9 @@ namespace mRemoteNG.Config.Putty return newTreeNode; } - protected virtual Root.PuttySessions.RootPuttySessionsNodeInfo CreateRootInfo() + protected virtual RootPuttySessionsNodeInfo CreateRootInfo() { - Root.PuttySessions.RootPuttySessionsNodeInfo newRootInfo = new Root.PuttySessions.RootPuttySessionsNodeInfo(); + var newRootInfo = new RootPuttySessionsNodeInfo(); if (string.IsNullOrEmpty(Convert.ToString(mRemoteNG.Settings.Default.PuttySavedSessionsName))) { @@ -142,9 +132,9 @@ namespace mRemoteNG.Config.Putty protected virtual void OnSessionChanged(SessionChangedEventArgs e) { - if (SessionChangedEvent != null) - SessionChangedEvent(this, new SessionChangedEventArgs()); + SessionChangedEvent?.Invoke(this, new SessionChangedEventArgs()); } + #endregion } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index ea6369f9d..970a4a71c 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -11,8 +11,8 @@ namespace mRemoteNG.Config.Putty { public class PuttySessionsManager { - private static List _providers; - private static List Providers + private static List _providers; + public static IEnumerable Providers { get { @@ -25,6 +25,11 @@ namespace mRemoteNG.Config.Putty } + public PuttySessionsManager() + { + + } + #region Public Methods private delegate void AddSessionsToTreeDelegate(TreeView treeView); public static void AddSessionsToTree(TreeView treeView) @@ -147,18 +152,22 @@ namespace mRemoteNG.Config.Putty } } - public static void SessionChanged(object sender, PuttySessionsProvider.SessionChangedEventArgs e) + public static void SessionChanged(object sender, AbstractPuttySessionsProvider.SessionChangedEventArgs e) { AddSessionsToTree(Windows.treeForm.tvConnections); } #endregion #region Private Methods - + + public void AddProvider(AbstractPuttySessionsProvider provider) + { + _providers.Add(provider); + } private static void AddProviders() { - _providers = new List {new PuttySessionsRegistryProvider(), new PuttySessionsXmingProvider()}; + _providers = new List {new PuttySessionsRegistryProvider(), new PuttySessionsXmingProvider()}; } private static string[] GetSessionNames(bool raw = false) @@ -175,17 +184,17 @@ namespace mRemoteNG.Config.Putty return sessionNames.ToArray(); } - private static bool IsProviderEnabled(PuttySessionsProvider puttySessionsProvider) + private static bool IsProviderEnabled(AbstractPuttySessionsProvider puttySessionsProvider) { var enabled = true; if (PuttyTypeDetector.GetPuttyType() == PuttyTypeDetector.PuttyType.Xming) { - if ((puttySessionsProvider) is PuttySessionsRegistryProvider) + if (puttySessionsProvider is PuttySessionsRegistryProvider) enabled = false; } else { - if ((puttySessionsProvider) is PuttySessionsXmingProvider) + if (puttySessionsProvider is PuttySessionsXmingProvider) enabled = false; } return enabled; diff --git a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs index 9c0c70d1e..7e1c028d0 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs @@ -12,7 +12,7 @@ using System.Web; namespace mRemoteNG.Config.Putty { - public class PuttySessionsRegistryProvider : PuttySessionsProvider + public class PuttySessionsRegistryProvider : AbstractPuttySessionsProvider { private const string PuttySessionsKey = "Software\\SimonTatham\\PuTTY\\Sessions"; private static ManagementEventWatcher _eventWatcher; @@ -32,20 +32,10 @@ namespace mRemoteNG.Config.Putty sessionNames.Add(raw ? sessionName : HttpUtility.UrlDecode(sessionName.Replace("+", "%2B"))); } - if (raw) - { - if (!sessionNames.Contains("Default%20Settings")) // Do not localize - { - sessionNames.Insert(0, "Default%20Settings"); - } - } - else - { - if (!sessionNames.Contains("Default Settings")) - { - sessionNames.Insert(0, "Default Settings"); - } - } + if (raw && !sessionNames.Contains("Default%20Settings")) + sessionNames.Insert(0, "Default%20Settings"); + else if (!sessionNames.Contains("Default Settings")) + sessionNames.Insert(0, "Default Settings"); return sessionNames.ToArray(); } @@ -60,7 +50,7 @@ namespace mRemoteNG.Config.Putty return null; } - sessionName = System.Web.HttpUtility.UrlDecode(sessionName.Replace("+", "%2B")); + sessionName = HttpUtility.UrlDecode(sessionName.Replace("+", "%2B")); var sessionInfo = new PuttySessionInfo { @@ -112,7 +102,7 @@ namespace mRemoteNG.Config.Putty try { - var currentUserSid = WindowsIdentity.GetCurrent().User.Value; + var currentUserSid = WindowsIdentity.GetCurrent().User?.Value; var key = Convert.ToString(string.Join("\\", currentUserSid, PuttySessionsKey).Replace("\\", "\\\\")); var query = new WqlEventQuery($"SELECT * FROM RegistryTreeChangeEvent WHERE Hive = \'HKEY_USERS\' AND RootPath = \'{key}\'"); _eventWatcher = new ManagementEventWatcher(query); diff --git a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index 8eb73177f..f63e24738 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -11,7 +11,7 @@ using System.Text.RegularExpressions; namespace mRemoteNG.Config.Putty { - public class PuttySessionsXmingProvider : PuttySessionsProvider + public class PuttySessionsXmingProvider : AbstractPuttySessionsProvider { private const string RegistrySessionNameFormat = "{0} [registry]"; private const string RegistrySessionNamePattern = "(.*)\\ \\[registry\\]"; diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index fec176cc5..ff7f25b18 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -166,7 +166,7 @@ - + From 3c55446e86f1e58e5985dfab7afdacb8afc2c584 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 10:38:08 -0600 Subject: [PATCH 145/338] Putty sessions now being shown in connection tree again --- .../Config/Connections/ConnectionsLoader.cs | 6 +- .../Putty/AbstractPuttySessionsProvider.cs | 91 +--------- .../Config/Putty/PuttySessionsManager.cs | 167 +++++++----------- mRemoteV1/Container/ContainerInfo.cs | 2 - mRemoteV1/Tree/Root/RootNodeInfo.cs | 46 ++--- .../Tree/Root/RootPuttySessionsNodeInfo.cs | 23 +-- 6 files changed, 96 insertions(+), 239 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index f8577674c..e9ec4707d 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -1,6 +1,7 @@ using System.Windows.Forms; using mRemoteNG.App; using mRemoteNG.Config.DataProviders; +using mRemoteNG.Config.Putty; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.UI; @@ -65,8 +66,9 @@ namespace mRemoteNG.Config.Connections frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; frmMain.Default.ConnectionsFileName = ConnectionFileName; - if (!import) - Putty.PuttySessionsManager.AddSessionsToTree(Windows.treeForm.tvConnections); + if (import) return; + PuttySessionsManager.AddSessionsToTree(Windows.treeForm.tvConnections); + Runtime.ConnectionTreeModel.RootNodes.AddRange(PuttySessionsManager.RootPuttySessionsNodes); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 6cecd99b7..a5b49c36f 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System; -using System.Windows.Forms; -using mRemoteNG.Tree; +using System.Linq; using mRemoteNG.Connection; using mRemoteNG.Root.PuttySessions; @@ -10,50 +9,27 @@ namespace mRemoteNG.Config.Putty { public abstract class AbstractPuttySessionsProvider { - #region Public Methods - private TreeNode _rootTreeNode; - public TreeNode RootTreeNode - { - get - { - if (_rootTreeNode == null) - { - _rootTreeNode = CreateRootTreeNode(); - } - return _rootTreeNode; - } - } - - private RootPuttySessionsNodeInfo _rootInfo; - public RootPuttySessionsNodeInfo RootInfo => _rootInfo ?? (_rootInfo = CreateRootInfo()); + public RootPuttySessionsNodeInfo RootInfo { get; } = new RootPuttySessionsNodeInfo(); + #region Public Methods public abstract string[] GetSessionNames(bool raw = false); public abstract PuttySessionInfo GetSession(string sessionName); public virtual IEnumerable GetSessions() { - var sessionList = new List(); foreach (var sessionName in GetSessionNames(true)) { var sessionInfo = GetSession(sessionName); - if (string.IsNullOrEmpty(sessionInfo?.Hostname)) - { + if (string.IsNullOrEmpty(sessionInfo?.Hostname) || RootInfo.Children.Any(child => child.Name == sessionInfo.Name)) continue; - } - sessionList.Add(sessionInfo); + RootInfo.AddChild(sessionInfo); } - return sessionList; + return RootInfo.Children.OfType(); } - public virtual void StartWatcher() - { - - } + public virtual void StartWatcher() { } - public virtual void StopWatcher() - { - - } + public virtual void StopWatcher() { } #endregion #region Public Events @@ -80,61 +56,10 @@ namespace mRemoteNG.Config.Putty #endregion #region Protected Methods - private delegate TreeNode CreateRootTreeNodeDelegate(); - protected virtual TreeNode CreateRootTreeNode() - { - TreeView treeView = ConnectionTree.TreeView; - if (treeView == null) - { - return null; - } - if (treeView.InvokeRequired) - { - return (TreeNode)treeView.Invoke(new CreateRootTreeNodeDelegate(CreateRootTreeNode)); - } - - TreeNode newTreeNode = new TreeNode(); - RootInfo.TreeNode = newTreeNode; - - newTreeNode.Name = _rootInfo.Name; - newTreeNode.Text = _rootInfo.Name; - newTreeNode.Tag = _rootInfo; - newTreeNode.ImageIndex = (int)TreeImageType.PuttySessions; - newTreeNode.SelectedImageIndex = (int)TreeImageType.PuttySessions; - - return newTreeNode; - } - - protected virtual RootPuttySessionsNodeInfo CreateRootInfo() - { - var newRootInfo = new RootPuttySessionsNodeInfo(); - - if (string.IsNullOrEmpty(Convert.ToString(mRemoteNG.Settings.Default.PuttySavedSessionsName))) - { - newRootInfo.Name = Language.strPuttySavedSessionsRootName; - } - else - { - newRootInfo.Name = Convert.ToString(mRemoteNG.Settings.Default.PuttySavedSessionsName); - } - - if (string.IsNullOrEmpty(Convert.ToString(mRemoteNG.Settings.Default.PuttySavedSessionsPanel))) - { - newRootInfo.Panel = Language.strGeneral; - } - else - { - newRootInfo.Panel = Convert.ToString(mRemoteNG.Settings.Default.PuttySavedSessionsPanel); - } - - return newRootInfo; - } - protected virtual void OnSessionChanged(SessionChangedEventArgs e) { SessionChangedEvent?.Invoke(this, new SessionChangedEventArgs()); } - #endregion } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index 970a4a71c..260dd560a 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -1,10 +1,9 @@ -using mRemoteNG.Connection; using mRemoteNG.Tools; -using mRemoteNG.Tree; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; using mRemoteNG.App; +using mRemoteNG.Root.PuttySessions; namespace mRemoteNG.Config.Putty @@ -17,122 +16,77 @@ namespace mRemoteNG.Config.Putty get { if (_providers == null || _providers.Count == 0) - { AddProviders(); - } return _providers; } } - - public PuttySessionsManager() - { - - } + public static List RootPuttySessionsNodes { get; } = new List(); #region Public Methods - private delegate void AddSessionsToTreeDelegate(TreeView treeView); public static void AddSessionsToTree(TreeView treeView) { - if (treeView == null) - { - return ; - } - if (treeView.InvokeRequired) - { - treeView.Invoke(new AddSessionsToTreeDelegate(AddSessionsToTree)); - return ; - } - foreach (var provider in Providers) { - var rootTreeNode = provider.RootTreeNode; - var inUpdate = false; - - var savedSessions = new List(provider.GetSessions()); - if (!IsProviderEnabled(provider) || savedSessions == null || savedSessions.Count == 0) - { - if (rootTreeNode != null && treeView.Nodes.Contains(rootTreeNode)) - { - treeView.BeginUpdate(); - treeView.Nodes.Remove(rootTreeNode); - treeView.EndUpdate(); - } - continue; - } - - if (!treeView.Nodes.Contains(rootTreeNode)) - { - if (!inUpdate) - { - treeView.BeginUpdate(); - inUpdate = true; - } - treeView.Nodes.Add(rootTreeNode); - } - - var newTreeNodes = new List(); - foreach (PuttySessionInfo sessionInfo in savedSessions) - { - TreeNode treeNode; - bool isNewNode; - if (rootTreeNode.Nodes.ContainsKey(sessionInfo.Name)) - { - treeNode = rootTreeNode.Nodes[sessionInfo.Name]; - isNewNode = false; - } - else - { - treeNode = ConnectionTreeNode.AddNode(TreeNodeType.PuttySession, sessionInfo.Name); - if (treeNode == null) - { - continue; - } - treeNode.Name = treeNode.Text; - treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; - treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; - isNewNode = true; - } - - sessionInfo.RootRootPuttySessionsInfo = provider.RootInfo; - sessionInfo.TreeNode = treeNode; - //sessionInfo.IInheritable.TurnOffInheritanceCompletely(); - - treeNode.Tag = sessionInfo; - - if (isNewNode) - { - newTreeNodes.Add(treeNode); - } - } - - foreach (TreeNode treeNode in rootTreeNode.Nodes) - { - if (savedSessions.Contains((ConnectionInfo) treeNode.Tag)) continue; - if (!inUpdate) - { - treeView.BeginUpdate(); - inUpdate = true; - } - rootTreeNode.Nodes.Remove(treeNode); - } - - if (newTreeNodes.Count != 0) - { - if (!inUpdate) - { - treeView.BeginUpdate(); - inUpdate = true; - } - rootTreeNode.Nodes.AddRange(newTreeNodes.ToArray()); - } - - if (!inUpdate) continue; - ConnectionTree.Sort(rootTreeNode, SortOrder.Ascending); - rootTreeNode.Expand(); - treeView.EndUpdate(); + AddSessionsToTreeForProvider(provider); } } + + private static void AddSessionsToTreeForProvider(AbstractPuttySessionsProvider provider) + { + var rootTreeNode = provider.RootInfo; + provider.GetSessions(); + //var savedSessions = new List(provider.GetSessions()); + //if (!IsProviderEnabled(provider) || savedSessions == null || savedSessions.Count == 0) + //{ + // if (rootTreeNode != null && treeView.Nodes.Contains(rootTreeNode)) + // { + // treeView.BeginUpdate(); + // treeView.Nodes.Remove(rootTreeNode); + // treeView.EndUpdate(); + // } + // continue; + //} + + //var newTreeNodes = new List(); + //foreach (var sessionInfo in savedSessions) + //{ + // TreeNode treeNode; + // bool isNewNode; + // if (rootTreeNode.Nodes.ContainsKey(sessionInfo.Name)) + // { + // treeNode = rootTreeNode.Nodes[sessionInfo.Name]; + // isNewNode = false; + // } + // else + // { + // treeNode = ConnectionTreeNode.AddNode(TreeNodeType.PuttySession, sessionInfo.Name); + // if (treeNode == null) + // { + // continue; + // } + // treeNode.Name = treeNode.Text; + // treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; + // treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; + // isNewNode = true; + // } + + // sessionInfo.RootRootPuttySessionsInfo = provider.RootInfo; + // sessionInfo.TreeNode = treeNode; + // //sessionInfo.IInheritable.TurnOffInheritanceCompletely(); + + // treeNode.Tag = sessionInfo; + + // if (isNewNode) + // { + // newTreeNodes.Add(treeNode); + // } + //} + + if (!RootPuttySessionsNodes.Contains(rootTreeNode)) + RootPuttySessionsNodes.Add(rootTreeNode); + rootTreeNode.SortRecursive(); + } public static void StartWatcher() { @@ -159,8 +113,7 @@ namespace mRemoteNG.Config.Putty #endregion #region Private Methods - - public void AddProvider(AbstractPuttySessionsProvider provider) + public static void AddProvider(AbstractPuttySessionsProvider provider) { _providers.Add(provider); } diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 790e7439f..d320ddd26 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -1,9 +1,7 @@ using System; -using System.Collections; using System.Collections.Generic; using mRemoteNG.Connection; using System.ComponentModel; -using System.Globalization; using System.Linq; using mRemoteNG.Connection.Protocol; using mRemoteNG.Tools; diff --git a/mRemoteV1/Tree/Root/RootNodeInfo.cs b/mRemoteV1/Tree/Root/RootNodeInfo.cs index b1000721d..93c27226e 100644 --- a/mRemoteV1/Tree/Root/RootNodeInfo.cs +++ b/mRemoteV1/Tree/Root/RootNodeInfo.cs @@ -7,41 +7,29 @@ namespace mRemoteNG.Tree.Root { [DefaultProperty("Name")] public class RootNodeInfo : ContainerInfo - { - private string _name; + { + private string _name; - - public RootNodeInfo(RootNodeType rootType) + public RootNodeInfo(RootNodeType rootType) { - _name = Language.strConnections; + _name = Language.strConnections; Type = rootType; } - + #region Public Properties - [LocalizedAttributes.LocalizedCategory("strCategoryDisplay"), - Browsable(true), - LocalizedAttributes.LocalizedDefaultValue("strConnections"), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameName"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionName")] - public override string Name - { - get { return _name; } - set - { - if (_name == value) - { - return ; - } - _name = value; - if (TreeNode != null) - { - TreeNode.Name = value; - TreeNode.Text = value; - } - } - } - [LocalizedAttributes.LocalizedCategory("strCategoryDisplay"), + [LocalizedAttributes.LocalizedCategory("strCategoryDisplay"), + Browsable(true), + LocalizedAttributes.LocalizedDefaultValue("strConnections"), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameName"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionName")] + public override string Name + { + get { return _name; } + set { _name = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryDisplay"), Browsable(true), LocalizedAttributes.LocalizedDisplayName("strPasswordProtect"), TypeConverter(typeof(Tools.MiscTools.YesNoTypeConverter))] diff --git a/mRemoteV1/Tree/Root/RootPuttySessionsNodeInfo.cs b/mRemoteV1/Tree/Root/RootPuttySessionsNodeInfo.cs index 22967138d..f9dc31216 100644 --- a/mRemoteV1/Tree/Root/RootPuttySessionsNodeInfo.cs +++ b/mRemoteV1/Tree/Root/RootPuttySessionsNodeInfo.cs @@ -12,9 +12,12 @@ namespace mRemoteNG.Root.PuttySessions public RootPuttySessionsNodeInfo() : base(RootNodeType.PuttySessions) - { - _name = Language.strPuttySavedSessionsRootName; - _panel = Language.strGeneral; + { + _name = Language.strPuttySavedSessionsRootName; + _panel = + string.IsNullOrEmpty(Settings.Default.PuttySavedSessionsPanel) + ? Language.strGeneral + : Settings.Default.PuttySavedSessionsPanel; } #region Public Properties @@ -24,16 +27,8 @@ namespace mRemoteNG.Root.PuttySessions get { return _name; } set { - if (_name == value) - { - return ; - } _name = value; - if (TreeNode != null) - { - TreeNode.Text = value; - } - Settings.Default.PuttySavedSessionsName = value; + //Settings.Default.PuttySavedSessionsName = value; } } @@ -45,10 +40,6 @@ namespace mRemoteNG.Root.PuttySessions get { return _panel; } set { - if (_panel == value) - { - return ; - } _panel = value; Settings.Default.PuttySavedSessionsPanel = value; } From c67971035d2c8d4fbfbf7b0412fe20d1b9b204b6 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 10:40:40 -0600 Subject: [PATCH 146/338] Only show putty provider if it has sessions --- mRemoteV1/Config/Putty/PuttySessionsManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index 260dd560a..fd67fb5bc 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -83,7 +83,7 @@ namespace mRemoteNG.Config.Putty // } //} - if (!RootPuttySessionsNodes.Contains(rootTreeNode)) + if (!RootPuttySessionsNodes.Contains(rootTreeNode) && rootTreeNode.HasChildren()) RootPuttySessionsNodes.Add(rootTreeNode); rootTreeNode.SortRecursive(); } From ab3e00f42cbc5182e92a8cd85e43e778c45148b1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 10:44:23 -0600 Subject: [PATCH 147/338] Fixed issue with using the proper tree images for the putty nodes --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 010bc6a32..e484f1ba0 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -8,6 +8,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; using BrightIdeasSoftware; +using mRemoteNG.Root.PuttySessions; using mRemoteNG.Tools; using mRemoteNG.Tree.Root; using mRemoteNG.UI.Controls; @@ -85,9 +86,9 @@ namespace mRemoteNG.UI.Window private object ConnectionImageGetter(object rowObject) { + if (rowObject is RootPuttySessionsNodeInfo) return "PuttySessions"; if (rowObject is RootNodeInfo) return "Root"; if (rowObject is ContainerInfo) return "Folder"; - if (rowObject is PuttySessionInfo) return "PuttySessions"; var connection = rowObject as ConnectionInfo; if (connection == null) return ""; return connection.OpenConnections.Count > 0 ? "Play" : "Pause"; From f0638b0dd8df4dbf2c97e5ba2a29bf4ccba0b3f7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 10:58:37 -0600 Subject: [PATCH 148/338] Cleanup --- .../Config/Connections/ConnectionsLoader.cs | 2 +- .../Config/Putty/PuttySessionsManager.cs | 50 +------------------ .../UI/Forms/OptionsPages/AdvancedPage.cs | 2 +- mRemoteV1/UI/Forms/frmMain.cs | 3 +- 4 files changed, 6 insertions(+), 51 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index e9ec4707d..035071a15 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -67,7 +67,7 @@ namespace mRemoteNG.Config.Connections frmMain.Default.ConnectionsFileName = ConnectionFileName; if (import) return; - PuttySessionsManager.AddSessionsToTree(Windows.treeForm.tvConnections); + PuttySessionsManager.AddSessionsToTree(); Runtime.ConnectionTreeModel.RootNodes.AddRange(PuttySessionsManager.RootPuttySessionsNodes); } } diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index fd67fb5bc..ea32d20aa 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -24,7 +24,7 @@ namespace mRemoteNG.Config.Putty public static List RootPuttySessionsNodes { get; } = new List(); #region Public Methods - public static void AddSessionsToTree(TreeView treeView) + public static void AddSessionsToTree() { foreach (var provider in Providers) { @@ -36,52 +36,6 @@ namespace mRemoteNG.Config.Putty { var rootTreeNode = provider.RootInfo; provider.GetSessions(); - //var savedSessions = new List(provider.GetSessions()); - //if (!IsProviderEnabled(provider) || savedSessions == null || savedSessions.Count == 0) - //{ - // if (rootTreeNode != null && treeView.Nodes.Contains(rootTreeNode)) - // { - // treeView.BeginUpdate(); - // treeView.Nodes.Remove(rootTreeNode); - // treeView.EndUpdate(); - // } - // continue; - //} - - //var newTreeNodes = new List(); - //foreach (var sessionInfo in savedSessions) - //{ - // TreeNode treeNode; - // bool isNewNode; - // if (rootTreeNode.Nodes.ContainsKey(sessionInfo.Name)) - // { - // treeNode = rootTreeNode.Nodes[sessionInfo.Name]; - // isNewNode = false; - // } - // else - // { - // treeNode = ConnectionTreeNode.AddNode(TreeNodeType.PuttySession, sessionInfo.Name); - // if (treeNode == null) - // { - // continue; - // } - // treeNode.Name = treeNode.Text; - // treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; - // treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; - // isNewNode = true; - // } - - // sessionInfo.RootRootPuttySessionsInfo = provider.RootInfo; - // sessionInfo.TreeNode = treeNode; - // //sessionInfo.IInheritable.TurnOffInheritanceCompletely(); - - // treeNode.Tag = sessionInfo; - - // if (isNewNode) - // { - // newTreeNodes.Add(treeNode); - // } - //} if (!RootPuttySessionsNodes.Contains(rootTreeNode) && rootTreeNode.HasChildren()) RootPuttySessionsNodes.Add(rootTreeNode); @@ -108,7 +62,7 @@ namespace mRemoteNG.Config.Putty public static void SessionChanged(object sender, AbstractPuttySessionsProvider.SessionChangedEventArgs e) { - AddSessionsToTree(Windows.treeForm.tvConnections); + AddSessionsToTree(); } #endregion diff --git a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs index 804a8e5a3..b2cf25594 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs @@ -80,7 +80,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages if (puttyPathChanged) { PuttyBase.PuttyPath = Settings.Default.UseCustomPuttyPath ? Settings.Default.CustomPuttyPath : GeneralAppInfo.PuttyPath; - PuttySessionsManager.AddSessionsToTree(Windows.treeForm.tvConnections); + PuttySessionsManager.AddSessionsToTree(); } Settings.Default.MaxPuttyWaitTime = (int) numPuttyWaitTime.Value; diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 9fe96012f..71ca0916b 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using System.Collections.Generic; using mRemoteNG.App; using mRemoteNG.Config; +using mRemoteNG.Config.Putty; using mRemoteNG.Config.Settings; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; @@ -156,7 +157,7 @@ namespace mRemoteNG.UI.Forms Windows.treePanel.Focus(); ConnectionTree.TreeView = Windows.treeForm.tvConnections; - Config.Putty.PuttySessionsManager.StartWatcher(); + PuttySessionsManager.StartWatcher(); if (Settings.Default.StartupComponentsCheck) { Windows.Show(WindowType.ComponentsCheck); From a03e2783d4f7fc848aa8f2c717795e077de46e6f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 11:25:58 -0600 Subject: [PATCH 149/338] Created another level of abstraction between the data shared by all connection info objects and the behavior shown by certain connection info objects --- .../Connection/AbstractConnectionInfoData.cs | 610 +++++++++++++++ mRemoteV1/Connection/ConnectionInfo.cs | 701 ++---------------- mRemoteV1/mRemoteV1.csproj | 1 + 3 files changed, 666 insertions(+), 646 deletions(-) create mode 100644 mRemoteV1/Connection/AbstractConnectionInfoData.cs diff --git a/mRemoteV1/Connection/AbstractConnectionInfoData.cs b/mRemoteV1/Connection/AbstractConnectionInfoData.cs new file mode 100644 index 000000000..4b72cd295 --- /dev/null +++ b/mRemoteV1/Connection/AbstractConnectionInfoData.cs @@ -0,0 +1,610 @@ +using System.ComponentModel; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Connection.Protocol.Http; +using mRemoteNG.Connection.Protocol.ICA; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Connection.Protocol.VNC; +using mRemoteNG.Tools; + + +namespace mRemoteNG.Connection +{ + public abstract class AbstractConnectionInfoData + { + #region Fields + private string _description; + private string _icon; + private string _panel; + private string _hostname; + private string _username; + private string _password; + private string _domain; + private ProtocolType _protocol; + private string _extApp; + private int _port; + private string _puttySession; + private ProtocolICA.EncryptionStrength _icaEncryption; + private bool _useConsoleSession; + private ProtocolRDP.AuthenticationLevel _rdpAuthenticationLevel; + private string _loadBalanceInfo; + private HTTPBase.RenderingEngine _renderingEngine; + private bool _useCredSsp; + private ProtocolRDP.RDGatewayUsageMethod _rdGatewayUsageMethod; + private string _rdGatewayHostname; + private ProtocolRDP.RDGatewayUseConnectionCredentials _rdGatewayUseConnectionCredentials; + private string _rdGatewayUsername; + private string _rdGatewayPassword; + private string _rdGatewayDomain; + private ProtocolRDP.RDPResolutions _resolution; + private bool _automaticResize; + private ProtocolRDP.RDPColors _colors; + private bool _cacheBitmaps; + private bool _displayWallpaper; + private bool _displayThemes; + private bool _enableFontSmoothing; + private bool _enableDesktopComposition; + private bool _redirectKeys; + private bool _redirectDiskDrives; + private bool _redirectPrinters; + private bool _redirectPorts; + private bool _redirectSmartCards; + private ProtocolRDP.RDPSounds _redirectSound; + private string _preExtApp; + private string _postExtApp; + private string _macAddress; + private string _userField; + private ProtocolVNC.Compression _vncCompression; + private ProtocolVNC.Encoding _vncEncoding; + private ProtocolVNC.AuthMode _vncAuthMode; + private ProtocolVNC.ProxyType _vncProxyType; + private string _vncProxyIp; + private int _vncProxyPort; + private string _vncProxyUsername; + private string _vncProxyPassword; + private ProtocolVNC.Colors _vncColors; + private ProtocolVNC.SmartSizeMode _vncSmartSizeMode; + private bool _vncViewOnly; + #endregion + + #region Properties + #region Display + [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameName"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionName")] + public virtual string Name { get; set; } + + [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameDescription"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionDescription")] + public virtual string Description + { + get { return GetPropertyValue("Description", _description); } + set { _description = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), + TypeConverter(typeof(ConnectionIcon)), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameIcon"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionIcon")] + public virtual string Icon + { + get { return GetPropertyValue("Icon", _icon); } + set { _icon = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), + LocalizedAttributes.LocalizedDisplayName("strPropertyNamePanel"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPanel")] + public virtual string Panel + { + get { return GetPropertyValue("Panel", _panel); } + set { _panel = value; } + } + #endregion + #region Connection + [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameAddress"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionAddress")] + public virtual string Hostname + { + get { return _hostname.Trim(); } + set + { + _hostname = string.IsNullOrEmpty(value) ? string.Empty : value.Trim(); + } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameUsername"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionUsername")] + public virtual string Username + { + get { return GetPropertyValue("Username", _username); } + set { _username = value.Trim(); } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), + LocalizedAttributes.LocalizedDisplayName("strPropertyNamePassword"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPassword"), + PasswordPropertyText(true)] + public virtual string Password + { + get { return GetPropertyValue("Password", _password); } + set { _password = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameDomain"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionDomain")] + public string Domain + { + get { return GetPropertyValue("Domain", _domain).Trim(); } + set { _domain = value.Trim(); } + } + #endregion + #region Protocol + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameProtocol"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionProtocol"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public virtual ProtocolType Protocol + { + get { return GetPropertyValue("Protocol", _protocol); } + set { _protocol = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameExternalTool"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionExternalTool"), + TypeConverter(typeof(ExternalToolsTypeConverter))] + public string ExtApp + { + get { return GetPropertyValue("ExtApp", _extApp); } + set { _extApp = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNamePort"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPort")] + public virtual int Port + { + get { return GetPropertyValue("Port", _port); } + set { _port = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNamePuttySession"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPuttySession"), + TypeConverter(typeof(Config.Putty.PuttySessionsManager.SessionList))] + public virtual string PuttySession + { + get { return GetPropertyValue("PuttySession", _puttySession); } + set { _puttySession = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameEncryptionStrength"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionEncryptionStrength"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolICA.EncryptionStrength ICAEncryptionStrength + { + get { return GetPropertyValue("ICAEncryptionStrength", _icaEncryption); } + set { _icaEncryption = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameUseConsoleSession"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionUseConsoleSession"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool UseConsoleSession + { + get { return GetPropertyValue("UseConsoleSession", _useConsoleSession); } + set { _useConsoleSession = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameAuthenticationLevel"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionAuthenticationLevel"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolRDP.AuthenticationLevel RDPAuthenticationLevel + { + get { return GetPropertyValue("RDPAuthenticationLevel", _rdpAuthenticationLevel); } + set { _rdpAuthenticationLevel = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameLoadBalanceInfo"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionLoadBalanceInfo")] + public string LoadBalanceInfo + { + get { return GetPropertyValue("LoadBalanceInfo", _loadBalanceInfo).Trim(); } + set { _loadBalanceInfo = value.Trim(); } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRenderingEngine"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRenderingEngine"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public HTTPBase.RenderingEngine RenderingEngine + { + get { return GetPropertyValue("RenderingEngine", _renderingEngine); } + set { _renderingEngine = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameUseCredSsp"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionUseCredSsp"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool UseCredSsp + { + get { return GetPropertyValue("UseCredSsp", _useCredSsp); } + set { _useCredSsp = value; } + } + #endregion + #region RD Gateway + [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayUsageMethod"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayUsageMethod"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolRDP.RDGatewayUsageMethod RDGatewayUsageMethod + { + get { return GetPropertyValue("RDGatewayUsageMethod", _rdGatewayUsageMethod); } + set { _rdGatewayUsageMethod = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayHostname"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayHostname")] + public string RDGatewayHostname + { + get { return GetPropertyValue("RDGatewayHostname", _rdGatewayHostname).Trim(); } + set { _rdGatewayHostname = value.Trim(); } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayUseConnectionCredentials"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayUseConnectionCredentials"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolRDP.RDGatewayUseConnectionCredentials RDGatewayUseConnectionCredentials + { + get { return GetPropertyValue("RDGatewayUseConnectionCredentials", _rdGatewayUseConnectionCredentials); } + set { _rdGatewayUseConnectionCredentials = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayUsername"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayUsername")] + public string RDGatewayUsername + { + get { return GetPropertyValue("RDGatewayUsername", _rdGatewayUsername).Trim(); } + set { _rdGatewayUsername = value.Trim(); } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayPassword"), + LocalizedAttributes.LocalizedDescription("strPropertyNameRDGatewayPassword"), + PasswordPropertyText(true)] + public string RDGatewayPassword + { + get { return GetPropertyValue("RDGatewayPassword", _rdGatewayPassword); } + set { _rdGatewayPassword = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayDomain"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayDomain")] + public string RDGatewayDomain + { + get { return GetPropertyValue("RDGatewayDomain", _rdGatewayDomain).Trim(); } + set { _rdGatewayDomain = value.Trim(); } + } + #endregion + #region Appearance + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameResolution"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionResolution"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolRDP.RDPResolutions Resolution + { + get { return GetPropertyValue("Resolution", _resolution); } + set { _resolution = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameAutomaticResize"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionAutomaticResize"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool AutomaticResize + { + get { return GetPropertyValue("AutomaticResize", _automaticResize); } + set { _automaticResize = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameColors"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionColors"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolRDP.RDPColors Colors + { + get { return GetPropertyValue("Colors", _colors); } + set { _colors = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameCacheBitmaps"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionCacheBitmaps"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool CacheBitmaps + { + get { return GetPropertyValue("CacheBitmaps", _cacheBitmaps); } + set { _cacheBitmaps = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameDisplayWallpaper"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionDisplayWallpaper"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool DisplayWallpaper + { + get { return GetPropertyValue("DisplayWallpaper", _displayWallpaper); } + set { _displayWallpaper = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameDisplayThemes"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionDisplayThemes"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool DisplayThemes + { + get { return GetPropertyValue("DisplayThemes", _displayThemes); } + set { _displayThemes = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameEnableFontSmoothing"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionEnableFontSmoothing"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool EnableFontSmoothing + { + get { return GetPropertyValue("EnableFontSmoothing", _enableFontSmoothing); } + set { _enableFontSmoothing = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameEnableDesktopComposition"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionEnableDesktopComposition"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool EnableDesktopComposition + { + get { return GetPropertyValue("EnableDesktopComposition", _enableDesktopComposition); } + set { _enableDesktopComposition = value; } + } + #endregion + #region Redirect + [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectKeys"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectKeys"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool RedirectKeys + { + get { return GetPropertyValue("RedirectKeys", _redirectKeys); } + set { _redirectKeys = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectDrives"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectDrives"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool RedirectDiskDrives + { + get { return GetPropertyValue("RedirectDiskDrives", _redirectDiskDrives); } + set { _redirectDiskDrives = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectPrinters"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectPrinters"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool RedirectPrinters + { + get { return GetPropertyValue("RedirectPrinters", _redirectPrinters); } + set { _redirectPrinters = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectPorts"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectPorts"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool RedirectPorts + { + get { return GetPropertyValue("RedirectPorts", _redirectPorts); } + set { _redirectPorts = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectSmartCards"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectSmartCards"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool RedirectSmartCards + { + get { return GetPropertyValue("RedirectSmartCards", _redirectSmartCards); } + set { _redirectSmartCards = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectSounds"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectSounds"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolRDP.RDPSounds RedirectSound + { + get { return GetPropertyValue("RedirectSound", _redirectSound); } + set { _redirectSound = value; } + } + #endregion + #region Misc + [Browsable(false)] + public string ConstantID { get; set; } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameExternalToolBefore"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionExternalToolBefore"), + TypeConverter(typeof(ExternalToolsTypeConverter))] + public virtual string PreExtApp + { + get { return GetPropertyValue("PreExtApp", _preExtApp); } + set { _preExtApp = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameExternalToolAfter"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionExternalToolAfter"), + TypeConverter(typeof(ExternalToolsTypeConverter))] + public virtual string PostExtApp + { + get { return GetPropertyValue("PostExtApp", _postExtApp); } + set { _postExtApp = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameMACAddress"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionMACAddress")] + public virtual string MacAddress + { + get { return GetPropertyValue("MacAddress", _macAddress); } + set { _macAddress = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameUser1"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionUser1")] + public virtual string UserField + { + get { return GetPropertyValue("UserField", _userField); } + set { _userField = value; } + } + #endregion + #region VNC + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameCompression"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionCompression"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolVNC.Compression VNCCompression + { + get { return GetPropertyValue("VNCCompression", _vncCompression); } + set { _vncCompression = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameEncoding"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionEncoding"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolVNC.Encoding VNCEncoding + { + get { return GetPropertyValue("VNCEncoding", _vncEncoding); } + set { _vncEncoding = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameAuthenticationMode"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionAuthenticationMode"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolVNC.AuthMode VNCAuthMode + { + get { return GetPropertyValue("VNCAuthMode", _vncAuthMode); } + set { _vncAuthMode = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyType"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyType"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolVNC.ProxyType VNCProxyType + { + get { return GetPropertyValue("VNCProxyType", _vncProxyType); } + set { _vncProxyType = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyAddress"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyAddress")] + public string VNCProxyIP + { + get { return GetPropertyValue("VNCProxyIP", _vncProxyIp); } + set { _vncProxyIp = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyPort"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyPort")] + public int VNCProxyPort + { + get { return GetPropertyValue("VNCProxyPort", _vncProxyPort); } + set { _vncProxyPort = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyUsername"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyUsername")] + public string VNCProxyUsername + { + get { return GetPropertyValue("VNCProxyUsername", _vncProxyUsername); } + set { _vncProxyUsername = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyPassword"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyPassword"), + PasswordPropertyText(true)] + public string VNCProxyPassword + { + get { return GetPropertyValue("VNCProxyPassword", _vncProxyPassword); } + set { _vncProxyPassword = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + Browsable(false), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameColors"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionColors"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolVNC.Colors VNCColors + { + get { return GetPropertyValue("VNCColors", _vncColors); } + set { _vncColors = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameSmartSizeMode"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionSmartSizeMode"), + TypeConverter(typeof(MiscTools.EnumTypeConverter))] + public ProtocolVNC.SmartSizeMode VNCSmartSizeMode + { + get { return GetPropertyValue("VNCSmartSizeMode", _vncSmartSizeMode); } + set { _vncSmartSizeMode = value; } + } + + [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), + LocalizedAttributes.LocalizedDisplayName("strPropertyNameViewOnly"), + LocalizedAttributes.LocalizedDescription("strPropertyDescriptionViewOnly"), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool VNCViewOnly + { + get { return GetPropertyValue("VNCViewOnly", _vncViewOnly); } + set { _vncViewOnly = value; } + } + #endregion + #endregion + + protected virtual TPropertyType GetPropertyValue(string propertyName, TPropertyType value) + { + return (TPropertyType)GetType().GetProperty(propertyName).GetValue(this, null); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index 22eb9969b..4d7118769 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -23,595 +23,9 @@ using mRemoteNG.Tree; namespace mRemoteNG.Connection { [DefaultProperty("Name")] - public class ConnectionInfo : IHasParent, IInheritable, IDisposable - { - #region Private Properties - private string _description; - private string _icon; - private string _panel; - private string _hostname; - private string _username; - private string _password; - private string _domain; - private ProtocolType _protocol; - private string _extApp; - private int _port; - private string _puttySession; - private ProtocolICA.EncryptionStrength _icaEncryption; - private bool _useConsoleSession; - private ProtocolRDP.AuthenticationLevel _rdpAuthenticationLevel; - private string _loadBalanceInfo; - private HTTPBase.RenderingEngine _renderingEngine; - private bool _useCredSsp; - private ProtocolRDP.RDGatewayUsageMethod _rdGatewayUsageMethod; - private string _rdGatewayHostname; - private ProtocolRDP.RDGatewayUseConnectionCredentials _rdGatewayUseConnectionCredentials; - private string _rdGatewayUsername; - private string _rdGatewayPassword; - private string _rdGatewayDomain; - private ProtocolRDP.RDPResolutions _resolution; - private bool _automaticResize; - private ProtocolRDP.RDPColors _colors; - private bool _cacheBitmaps; - private bool _displayWallpaper; - private bool _displayThemes; - private bool _enableFontSmoothing; - private bool _enableDesktopComposition; - private bool _redirectKeys; - private bool _redirectDiskDrives; - private bool _redirectPrinters; - private bool _redirectPorts; - private bool _redirectSmartCards; - private ProtocolRDP.RDPSounds _redirectSound; - private string _preExtApp; - private string _postExtApp; - private string _macAddress; - private string _userField; - private ProtocolVNC.Compression _vncCompression; - private ProtocolVNC.Encoding _vncEncoding; - private ProtocolVNC.AuthMode _vncAuthMode; - private ProtocolVNC.ProxyType _vncProxyType; - private string _vncProxyIp; - private int _vncProxyPort; - private string _vncProxyUsername; - private string _vncProxyPassword; - private ProtocolVNC.Colors _vncColors; - private ProtocolVNC.SmartSizeMode _vncSmartSizeMode; - private bool _vncViewOnly; - private ContainerInfo _parent; - #endregion - + public class ConnectionInfo : AbstractConnectionInfoData, IHasParent, IInheritable, IDisposable + { #region Public Properties - #region Display - [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameName"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionName")] - public virtual string Name { get; set; } - - [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameDescription"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionDescription")] - public virtual string Description - { - get { return GetPropertyValue("Description", _description); } - set { _description = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), - TypeConverter(typeof(ConnectionIcon)), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameIcon"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionIcon")] - public virtual string Icon - { - get { return GetPropertyValue("Icon", _icon); } - set { _icon = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), - LocalizedAttributes.LocalizedDisplayName("strPropertyNamePanel"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPanel")] - public virtual string Panel - { - get { return GetPropertyValue("Panel", _panel); } - set { _panel = value; } - } - #endregion - #region Connection - [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameAddress"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionAddress")] - public virtual string Hostname - { - get { return _hostname.Trim(); } - set { - _hostname = string.IsNullOrEmpty(value) ? string.Empty : value.Trim(); - } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameUsername"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionUsername")] - public virtual string Username - { - get { return GetPropertyValue("Username", _username); } - set { _username = value.Trim(); } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), - LocalizedAttributes.LocalizedDisplayName("strPropertyNamePassword"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPassword"), - PasswordPropertyText(true)] - public virtual string Password - { - get { return GetPropertyValue("Password", _password); } - set { _password = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameDomain"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionDomain")] - public string Domain - { - get { return GetPropertyValue("Domain", _domain).Trim(); } - set { _domain = value.Trim(); } - } - #endregion - #region Protocol - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameProtocol"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionProtocol"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public virtual ProtocolType Protocol - { - get { return GetPropertyValue("Protocol", _protocol); } - set { _protocol = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameExternalTool"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionExternalTool"), - TypeConverter(typeof(ExternalToolsTypeConverter))] - public string ExtApp - { - get { return GetPropertyValue("ExtApp", _extApp); } - set { _extApp = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNamePort"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPort")] - public virtual int Port - { - get { return GetPropertyValue("Port", _port); } - set { _port = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNamePuttySession"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionPuttySession"), - TypeConverter(typeof(Config.Putty.PuttySessionsManager.SessionList))] - public virtual string PuttySession - { - get { return GetPropertyValue("PuttySession", _puttySession); } - set { _puttySession = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameEncryptionStrength"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionEncryptionStrength"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolICA.EncryptionStrength ICAEncryptionStrength - { - get { return GetPropertyValue("ICAEncryptionStrength", _icaEncryption); } - set { _icaEncryption = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameUseConsoleSession"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionUseConsoleSession"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool UseConsoleSession - { - get { return GetPropertyValue("UseConsoleSession", _useConsoleSession); } - set { _useConsoleSession = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameAuthenticationLevel"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionAuthenticationLevel"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolRDP.AuthenticationLevel RDPAuthenticationLevel - { - get { return GetPropertyValue("RDPAuthenticationLevel", _rdpAuthenticationLevel); } - set { _rdpAuthenticationLevel = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameLoadBalanceInfo"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionLoadBalanceInfo")] - public string LoadBalanceInfo - { - get { return GetPropertyValue("LoadBalanceInfo", _loadBalanceInfo).Trim(); } - set { _loadBalanceInfo = value.Trim(); } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRenderingEngine"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRenderingEngine"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public HTTPBase.RenderingEngine RenderingEngine - { - get { return GetPropertyValue("RenderingEngine", _renderingEngine); } - set { _renderingEngine = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameUseCredSsp"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionUseCredSsp"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool UseCredSsp - { - get { return GetPropertyValue("UseCredSsp", _useCredSsp); } - set { _useCredSsp = value; } - } - #endregion - #region RD Gateway - [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayUsageMethod"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayUsageMethod"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolRDP.RDGatewayUsageMethod RDGatewayUsageMethod - { - get { return GetPropertyValue("RDGatewayUsageMethod", _rdGatewayUsageMethod); } - set { _rdGatewayUsageMethod = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayHostname"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayHostname")] - public string RDGatewayHostname - { - get { return GetPropertyValue("RDGatewayHostname", _rdGatewayHostname).Trim(); } - set { _rdGatewayHostname = value.Trim(); } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayUseConnectionCredentials"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayUseConnectionCredentials"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolRDP.RDGatewayUseConnectionCredentials RDGatewayUseConnectionCredentials - { - get { return GetPropertyValue("RDGatewayUseConnectionCredentials", _rdGatewayUseConnectionCredentials); } - set { _rdGatewayUseConnectionCredentials = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayUsername"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayUsername")] - public string RDGatewayUsername - { - get { return GetPropertyValue("RDGatewayUsername", _rdGatewayUsername).Trim(); } - set { _rdGatewayUsername = value.Trim(); } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayPassword"), - LocalizedAttributes.LocalizedDescription("strPropertyNameRDGatewayPassword"), - PasswordPropertyText(true)] - public string RDGatewayPassword - { - get { return GetPropertyValue("RDGatewayPassword", _rdGatewayPassword); } - set { _rdGatewayPassword = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayDomain"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRDGatewayDomain")] - public string RDGatewayDomain - { - get { return GetPropertyValue("RDGatewayDomain", _rdGatewayDomain).Trim(); } - set { _rdGatewayDomain = value.Trim(); } - } - #endregion - #region Appearance - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameResolution"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionResolution"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolRDP.RDPResolutions Resolution - { - get { return GetPropertyValue("Resolution", _resolution); } - set { _resolution = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameAutomaticResize"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionAutomaticResize"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool AutomaticResize - { - get { return GetPropertyValue("AutomaticResize", _automaticResize); } - set { _automaticResize = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameColors"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionColors"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolRDP.RDPColors Colors - { - get { return GetPropertyValue("Colors", _colors); } - set { _colors = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameCacheBitmaps"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionCacheBitmaps"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool CacheBitmaps - { - get { return GetPropertyValue("CacheBitmaps", _cacheBitmaps); } - set { _cacheBitmaps = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameDisplayWallpaper"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionDisplayWallpaper"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool DisplayWallpaper - { - get { return GetPropertyValue("DisplayWallpaper", _displayWallpaper); } - set { _displayWallpaper = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameDisplayThemes"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionDisplayThemes"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool DisplayThemes - { - get { return GetPropertyValue("DisplayThemes", _displayThemes); } - set { _displayThemes = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameEnableFontSmoothing"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionEnableFontSmoothing"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool EnableFontSmoothing - { - get { return GetPropertyValue("EnableFontSmoothing", _enableFontSmoothing); } - set { _enableFontSmoothing = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameEnableDesktopComposition"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionEnableDesktopComposition"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool EnableDesktopComposition - { - get { return GetPropertyValue("EnableDesktopComposition", _enableDesktopComposition); } - set { _enableDesktopComposition = value; } - } - #endregion - #region Redirect - [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectKeys"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectKeys"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool RedirectKeys - { - get { return GetPropertyValue("RedirectKeys", _redirectKeys); } - set { _redirectKeys = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectDrives"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectDrives"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool RedirectDiskDrives - { - get { return GetPropertyValue("RedirectDiskDrives", _redirectDiskDrives); } - set { _redirectDiskDrives = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectPrinters"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectPrinters"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool RedirectPrinters - { - get { return GetPropertyValue("RedirectPrinters", _redirectPrinters); } - set { _redirectPrinters = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectPorts"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectPorts"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool RedirectPorts - { - get { return GetPropertyValue("RedirectPorts", _redirectPorts); } - set { _redirectPorts = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectSmartCards"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectSmartCards"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool RedirectSmartCards - { - get { return GetPropertyValue("RedirectSmartCards", _redirectSmartCards); } - set { _redirectSmartCards = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectSounds"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionRedirectSounds"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolRDP.RDPSounds RedirectSound - { - get { return GetPropertyValue("RedirectSound", _redirectSound); } - set { _redirectSound = value; } - } - #endregion - #region Misc - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameExternalToolBefore"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionExternalToolBefore"), - TypeConverter(typeof(ExternalToolsTypeConverter))] - public virtual string PreExtApp - { - get { return GetPropertyValue("PreExtApp", _preExtApp); } - set { _preExtApp = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameExternalToolAfter"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionExternalToolAfter"), - TypeConverter(typeof(ExternalToolsTypeConverter))] - public virtual string PostExtApp - { - get { return GetPropertyValue("PostExtApp", _postExtApp); } - set { _postExtApp = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameMACAddress"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionMACAddress")] - public virtual string MacAddress - { - get { return GetPropertyValue("MacAddress", _macAddress); } - set { _macAddress = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameUser1"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionUser1")] - public virtual string UserField - { - get { return GetPropertyValue("UserField", _userField); } - set { _userField = value; } - } - #endregion - #region VNC - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameCompression"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionCompression"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolVNC.Compression VNCCompression - { - get { return GetPropertyValue("VNCCompression", _vncCompression); } - set { _vncCompression = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameEncoding"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionEncoding"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolVNC.Encoding VNCEncoding - { - get { return GetPropertyValue("VNCEncoding", _vncEncoding); } - set { _vncEncoding = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameAuthenticationMode"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionAuthenticationMode"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolVNC.AuthMode VNCAuthMode - { - get { return GetPropertyValue("VNCAuthMode", _vncAuthMode); } - set { _vncAuthMode = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyType"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyType"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolVNC.ProxyType VNCProxyType - { - get { return GetPropertyValue("VNCProxyType", _vncProxyType); } - set { _vncProxyType = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyAddress"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyAddress")] - public string VNCProxyIP - { - get { return GetPropertyValue("VNCProxyIP", _vncProxyIp); } - set { _vncProxyIp = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyPort"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyPort")] - public int VNCProxyPort - { - get { return GetPropertyValue("VNCProxyPort", _vncProxyPort); } - set { _vncProxyPort = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyUsername"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyUsername")] - public string VNCProxyUsername - { - get { return GetPropertyValue("VNCProxyUsername", _vncProxyUsername); } - set { _vncProxyUsername = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameVNCProxyPassword"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionVNCProxyPassword"), - PasswordPropertyText(true)] - public string VNCProxyPassword - { - get { return GetPropertyValue("VNCProxyPassword", _vncProxyPassword); } - set { _vncProxyPassword = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - Browsable(false), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameColors"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionColors"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolVNC.Colors VNCColors - { - get { return GetPropertyValue("VNCColors", _vncColors); } - set { _vncColors = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameSmartSizeMode"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionSmartSizeMode"), - TypeConverter(typeof(MiscTools.EnumTypeConverter))] - public ProtocolVNC.SmartSizeMode VNCSmartSizeMode - { - get { return GetPropertyValue("VNCSmartSizeMode", _vncSmartSizeMode); } - set { _vncSmartSizeMode = value; } - } - - [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), - LocalizedAttributes.LocalizedDisplayName("strPropertyNameViewOnly"), - LocalizedAttributes.LocalizedDescription("strPropertyDescriptionViewOnly"), - TypeConverter(typeof(MiscTools.YesNoTypeConverter))] - public bool VNCViewOnly - { - get { return GetPropertyValue("VNCViewOnly", _vncViewOnly); } - set { _vncViewOnly = value; } - } - #endregion - #region Non-browsable public properties [Browsable(false)] public ConnectionInfoInheritance Inheritance { get; set; } @@ -630,9 +44,6 @@ namespace mRemoteNG.Connection [Browsable(false)] public int PositionID { get; set; } - [Browsable(false)] - public string ConstantID { get; set; } - [Browsable(false)] public TreeNode TreeNode { get; set; } @@ -641,9 +52,7 @@ namespace mRemoteNG.Connection [Browsable(false)] public bool PleaseConnect { get; set; } - #endregion - #endregion #region Constructors public ConnectionInfo() @@ -751,7 +160,7 @@ namespace mRemoteNG.Connection #endregion #region Private Methods - private TPropertyType GetPropertyValue(string propertyName, TPropertyType value) + protected override TPropertyType GetPropertyValue(string propertyName, TPropertyType value) { return ShouldThisPropertyBeInherited(propertyName) ? GetInheritedPropertyValue(propertyName) : value; } @@ -824,87 +233,87 @@ namespace mRemoteNG.Connection private void SetTreeDisplayDefaults() { Name = Language.strNewConnection; - _description = Settings.Default.ConDefaultDescription; - _icon = Settings.Default.ConDefaultIcon; - _panel = Language.strGeneral; + Description = Settings.Default.ConDefaultDescription; + Icon = Settings.Default.ConDefaultIcon; + Panel = Language.strGeneral; } private void SetConnectionDefaults() { - _hostname = string.Empty; - _username = Settings.Default.ConDefaultUsername; - _password = Settings.Default.ConDefaultPassword; - _domain = Settings.Default.ConDefaultDomain; + Hostname = string.Empty; + Username = Settings.Default.ConDefaultUsername; + Password = Settings.Default.ConDefaultPassword; + Domain = Settings.Default.ConDefaultDomain; } private void SetProtocolDefaults() { - _protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), Settings.Default.ConDefaultProtocol); - _extApp = Settings.Default.ConDefaultExtApp; - _port = 0; - _puttySession = Settings.Default.ConDefaultPuttySession; - _icaEncryption = (ProtocolICA.EncryptionStrength) Enum.Parse(typeof(ProtocolICA.EncryptionStrength), Settings.Default.ConDefaultICAEncryptionStrength); - _useConsoleSession = Settings.Default.ConDefaultUseConsoleSession; - _rdpAuthenticationLevel = (ProtocolRDP.AuthenticationLevel) Enum.Parse(typeof(ProtocolRDP.AuthenticationLevel), Settings.Default.ConDefaultRDPAuthenticationLevel); - _loadBalanceInfo = Settings.Default.ConDefaultLoadBalanceInfo; - _renderingEngine = (HTTPBase.RenderingEngine) Enum.Parse(typeof(HTTPBase.RenderingEngine), Settings.Default.ConDefaultRenderingEngine); - _useCredSsp = Settings.Default.ConDefaultUseCredSsp; + Protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), Settings.Default.ConDefaultProtocol); + ExtApp = Settings.Default.ConDefaultExtApp; + Port = 0; + PuttySession = Settings.Default.ConDefaultPuttySession; + ICAEncryptionStrength = (ProtocolICA.EncryptionStrength) Enum.Parse(typeof(ProtocolICA.EncryptionStrength), Settings.Default.ConDefaultICAEncryptionStrength); + UseConsoleSession = Settings.Default.ConDefaultUseConsoleSession; + RDPAuthenticationLevel = (ProtocolRDP.AuthenticationLevel) Enum.Parse(typeof(ProtocolRDP.AuthenticationLevel), Settings.Default.ConDefaultRDPAuthenticationLevel); + LoadBalanceInfo = Settings.Default.ConDefaultLoadBalanceInfo; + RenderingEngine = (HTTPBase.RenderingEngine) Enum.Parse(typeof(HTTPBase.RenderingEngine), Settings.Default.ConDefaultRenderingEngine); + UseCredSsp = Settings.Default.ConDefaultUseCredSsp; } private void SetRdGatewayDefaults() { - _rdGatewayUsageMethod = (ProtocolRDP.RDGatewayUsageMethod) Enum.Parse(typeof(ProtocolRDP.RDGatewayUsageMethod), Settings.Default.ConDefaultRDGatewayUsageMethod); - _rdGatewayHostname = Settings.Default.ConDefaultRDGatewayHostname; - _rdGatewayUseConnectionCredentials = (ProtocolRDP.RDGatewayUseConnectionCredentials) Enum.Parse(typeof(ProtocolRDP.RDGatewayUseConnectionCredentials), Settings.Default.ConDefaultRDGatewayUseConnectionCredentials); ; - _rdGatewayUsername = Settings.Default.ConDefaultRDGatewayUsername; - _rdGatewayPassword = Settings.Default.ConDefaultRDGatewayPassword; - _rdGatewayDomain = Settings.Default.ConDefaultRDGatewayDomain; + RDGatewayUsageMethod = (ProtocolRDP.RDGatewayUsageMethod) Enum.Parse(typeof(ProtocolRDP.RDGatewayUsageMethod), Settings.Default.ConDefaultRDGatewayUsageMethod); + RDGatewayHostname = Settings.Default.ConDefaultRDGatewayHostname; + RDGatewayUseConnectionCredentials = (ProtocolRDP.RDGatewayUseConnectionCredentials) Enum.Parse(typeof(ProtocolRDP.RDGatewayUseConnectionCredentials), Settings.Default.ConDefaultRDGatewayUseConnectionCredentials); ; + RDGatewayUsername = Settings.Default.ConDefaultRDGatewayUsername; + RDGatewayPassword = Settings.Default.ConDefaultRDGatewayPassword; + RDGatewayDomain = Settings.Default.ConDefaultRDGatewayDomain; } private void SetAppearanceDefaults() { - _resolution = (ProtocolRDP.RDPResolutions) Enum.Parse(typeof(ProtocolRDP.RDPResolutions), Settings.Default.ConDefaultResolution); - _automaticResize = Settings.Default.ConDefaultAutomaticResize; - _colors = (ProtocolRDP.RDPColors) Enum.Parse(typeof(ProtocolRDP.RDPColors), Settings.Default.ConDefaultColors); - _cacheBitmaps = Settings.Default.ConDefaultCacheBitmaps; - _displayWallpaper = Settings.Default.ConDefaultDisplayWallpaper; - _displayThemes = Settings.Default.ConDefaultDisplayThemes; - _enableFontSmoothing = Settings.Default.ConDefaultEnableFontSmoothing; - _enableDesktopComposition = Settings.Default.ConDefaultEnableDesktopComposition; + Resolution = (ProtocolRDP.RDPResolutions) Enum.Parse(typeof(ProtocolRDP.RDPResolutions), Settings.Default.ConDefaultResolution); + AutomaticResize = Settings.Default.ConDefaultAutomaticResize; + Colors = (ProtocolRDP.RDPColors) Enum.Parse(typeof(ProtocolRDP.RDPColors), Settings.Default.ConDefaultColors); + CacheBitmaps = Settings.Default.ConDefaultCacheBitmaps; + DisplayWallpaper = Settings.Default.ConDefaultDisplayWallpaper; + DisplayThemes = Settings.Default.ConDefaultDisplayThemes; + EnableFontSmoothing = Settings.Default.ConDefaultEnableFontSmoothing; + EnableDesktopComposition = Settings.Default.ConDefaultEnableDesktopComposition; } private void SetRedirectDefaults() { - _redirectKeys = Settings.Default.ConDefaultRedirectKeys; - _redirectDiskDrives = Settings.Default.ConDefaultRedirectDiskDrives; - _redirectPrinters = Settings.Default.ConDefaultRedirectPrinters; - _redirectPorts = Settings.Default.ConDefaultRedirectPorts; - _redirectSmartCards = Settings.Default.ConDefaultRedirectSmartCards; - _redirectSound = (ProtocolRDP.RDPSounds) Enum.Parse(typeof(ProtocolRDP.RDPSounds), Settings.Default.ConDefaultRedirectSound); + RedirectKeys = Settings.Default.ConDefaultRedirectKeys; + RedirectDiskDrives = Settings.Default.ConDefaultRedirectDiskDrives; + RedirectPrinters = Settings.Default.ConDefaultRedirectPrinters; + RedirectPorts = Settings.Default.ConDefaultRedirectPorts; + RedirectSmartCards = Settings.Default.ConDefaultRedirectSmartCards; + RedirectSound = (ProtocolRDP.RDPSounds) Enum.Parse(typeof(ProtocolRDP.RDPSounds), Settings.Default.ConDefaultRedirectSound); } private void SetMiscDefaults() { ConstantID = MiscTools.CreateConstantID(); - _preExtApp = Settings.Default.ConDefaultPreExtApp; - _postExtApp = Settings.Default.ConDefaultPostExtApp; - _macAddress = Settings.Default.ConDefaultMacAddress; - _userField = Settings.Default.ConDefaultUserField; + PreExtApp = Settings.Default.ConDefaultPreExtApp; + PostExtApp = Settings.Default.ConDefaultPostExtApp; + MacAddress = Settings.Default.ConDefaultMacAddress; + UserField = Settings.Default.ConDefaultUserField; } private void SetVncDefaults() { - _vncCompression = (ProtocolVNC.Compression) Enum.Parse(typeof(ProtocolVNC.Compression), Settings.Default.ConDefaultVNCCompression); - _vncEncoding = (ProtocolVNC.Encoding) Enum.Parse(typeof(ProtocolVNC.Encoding), Settings.Default.ConDefaultVNCEncoding); - _vncAuthMode = (ProtocolVNC.AuthMode) Enum.Parse(typeof(ProtocolVNC.AuthMode), Settings.Default.ConDefaultVNCAuthMode); - _vncProxyType = (ProtocolVNC.ProxyType) Enum.Parse(typeof(ProtocolVNC.ProxyType), Settings.Default.ConDefaultVNCProxyType); - _vncProxyIp = Settings.Default.ConDefaultVNCProxyIP; - _vncProxyPort = Settings.Default.ConDefaultVNCProxyPort; - _vncProxyUsername = Settings.Default.ConDefaultVNCProxyUsername; - _vncProxyPassword = Settings.Default.ConDefaultVNCProxyPassword; - _vncColors = (ProtocolVNC.Colors) Enum.Parse(typeof(ProtocolVNC.Colors), Settings.Default.ConDefaultVNCColors); - _vncSmartSizeMode = (ProtocolVNC.SmartSizeMode) Enum.Parse(typeof(ProtocolVNC.SmartSizeMode), Settings.Default.ConDefaultVNCSmartSizeMode); - _vncViewOnly = Settings.Default.ConDefaultVNCViewOnly; + VNCCompression = (ProtocolVNC.Compression) Enum.Parse(typeof(ProtocolVNC.Compression), Settings.Default.ConDefaultVNCCompression); + VNCEncoding = (ProtocolVNC.Encoding) Enum.Parse(typeof(ProtocolVNC.Encoding), Settings.Default.ConDefaultVNCEncoding); + VNCAuthMode = (ProtocolVNC.AuthMode) Enum.Parse(typeof(ProtocolVNC.AuthMode), Settings.Default.ConDefaultVNCAuthMode); + VNCProxyType = (ProtocolVNC.ProxyType) Enum.Parse(typeof(ProtocolVNC.ProxyType), Settings.Default.ConDefaultVNCProxyType); + VNCProxyIP = Settings.Default.ConDefaultVNCProxyIP; + VNCProxyPort = Settings.Default.ConDefaultVNCProxyPort; + VNCProxyUsername = Settings.Default.ConDefaultVNCProxyUsername; + VNCProxyPassword = Settings.Default.ConDefaultVNCProxyPassword; + VNCColors = (ProtocolVNC.Colors) Enum.Parse(typeof(ProtocolVNC.Colors), Settings.Default.ConDefaultVNCColors); + VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode) Enum.Parse(typeof(ProtocolVNC.SmartSizeMode), Settings.Default.ConDefaultVNCSmartSizeMode); + VNCViewOnly = Settings.Default.ConDefaultVNCViewOnly; } private void SetNonBrowsablePropertiesDefaults() diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index ff7f25b18..6eddc4201 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -169,6 +169,7 @@ + From 95ddca0d7c95fe105b1b0207b8205559c67316d4 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 12:54:01 -0600 Subject: [PATCH 150/338] Implemented INotifyPropertyChanged on AbstractConnectionInfoData (and thus on every connectioninfo subtype) --- .../AbstractConnectionInfoDataTests.cs | 507 ++++++++++++++++++ mRemoteNGTests/mRemoteNGTests.csproj | 1 + .../Connection/AbstractConnectionInfoData.cs | 148 +++-- 3 files changed, 598 insertions(+), 58 deletions(-) create mode 100644 mRemoteNGTests/Connection/AbstractConnectionInfoDataTests.cs diff --git a/mRemoteNGTests/Connection/AbstractConnectionInfoDataTests.cs b/mRemoteNGTests/Connection/AbstractConnectionInfoDataTests.cs new file mode 100644 index 000000000..8d2ef51fe --- /dev/null +++ b/mRemoteNGTests/Connection/AbstractConnectionInfoDataTests.cs @@ -0,0 +1,507 @@ +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Connection.Protocol.Http; +using mRemoteNG.Connection.Protocol.ICA; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Connection.Protocol.VNC; +using NUnit.Framework; + + +namespace mRemoteNGTests.Connection +{ + public class AbstractConnectionInfoDataTests + { + private class TestAbstractConnectionInfoData : AbstractConnectionInfoData {} + private TestAbstractConnectionInfoData _testAbstractConnectionInfoData; + + [SetUp] + public void Setup() + { + _testAbstractConnectionInfoData = new TestAbstractConnectionInfoData(); + } + + [TearDown] + public void Teardown() + { + _testAbstractConnectionInfoData = null; + } + + + [Test] + public void NameNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Name = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void DescriptionNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Description = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void IconNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Icon = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void PanelNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Panel = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void HostnameNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Hostname = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void UsernameNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Username = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void PasswordNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Password = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void DomainNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Domain = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void ProtocolNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Protocol = ProtocolType.HTTP; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void ExtAppNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.ExtApp = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void PortNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Port = 9999; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void PuttySessionNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.PuttySession = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void IcaEncryptionNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.ICAEncryptionStrength = ProtocolICA.EncryptionStrength.Encr128BitLogonOnly; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void UseConsoleSessionNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.UseConsoleSession = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RdpAuthenticationLevelNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RDPAuthenticationLevel = ProtocolRDP.AuthenticationLevel.AuthRequired; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void LoadBalanceInfoNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.LoadBalanceInfo = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RenderingEngineNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RenderingEngine = HTTPBase.RenderingEngine.Gecko; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void UseCredSspNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.UseCredSsp = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RdGatewayUsageMethodNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RDGatewayUsageMethod = ProtocolRDP.RDGatewayUsageMethod.Always; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RdGatewayHostnameNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RDGatewayHostname = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RdGatewayUseConnectionCredentialsNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RDGatewayUseConnectionCredentials = ProtocolRDP.RDGatewayUseConnectionCredentials.SmartCard; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RdGatewayUsernameNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RDGatewayUsername = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RdGatewayPasswordNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RDGatewayPassword = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RdGatewayDomainNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RDGatewayDomain = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void ResolutionNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Resolution = ProtocolRDP.RDPResolutions.Res1366x768; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void AutomaticResizeNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.AutomaticResize = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void ColorsNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.Colors = ProtocolRDP.RDPColors.Colors16Bit; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void CacheBitmapsNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.CacheBitmaps = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void DisplayWallpaperNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.DisplayWallpaper = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void DisplayThemesNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.DisplayThemes = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void EnableFontSmoothingNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.EnableFontSmoothing = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void EnableDesktopCompositionNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.EnableDesktopComposition = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RedirectKeysNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RedirectKeys = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RedirectDiskDrivesNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RedirectDiskDrives = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RedirectPrintersNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RedirectPrinters = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RedirectPortsNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RedirectPorts = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RedirectSmartCardsNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RedirectSmartCards = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RedirectSoundNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.RedirectSound = ProtocolRDP.RDPSounds.DoNotPlay; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void PreExtAppNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.PreExtApp = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void PostExtAppNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.PostExtApp = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void MacAddressNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.MacAddress = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void UserFieldNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.UserField = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncCompressionNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCCompression = ProtocolVNC.Compression.Comp5; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncEncodingNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCEncoding = ProtocolVNC.Encoding.EncTight; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncAuthModeNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCAuthMode = ProtocolVNC.AuthMode.AuthWin; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncProxyTypeNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCProxyType = ProtocolVNC.ProxyType.ProxyUltra; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncProxyIpNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCProxyIP = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncProxyPortNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCProxyPort = 9999; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncProxyUsernameNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCProxyUsername = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncProxyPasswordNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCProxyPassword = "a"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncColorsNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCColors = ProtocolVNC.Colors.Col8Bit; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncSmartSizeModeNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCSmartSizeMode = ProtocolVNC.SmartSizeMode.SmartSFree; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void VncViewOnlyNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.VNCViewOnly = true; + Assert.That(wasCalled, Is.True); + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 6be6d5494..670965103 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -104,6 +104,7 @@ + diff --git a/mRemoteV1/Connection/AbstractConnectionInfoData.cs b/mRemoteV1/Connection/AbstractConnectionInfoData.cs index 4b72cd295..f2402c8b9 100644 --- a/mRemoteV1/Connection/AbstractConnectionInfoData.cs +++ b/mRemoteV1/Connection/AbstractConnectionInfoData.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System.Collections.Generic; +using System.ComponentModel; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.Http; using mRemoteNG.Connection.Protocol.ICA; @@ -9,16 +10,19 @@ using mRemoteNG.Tools; namespace mRemoteNG.Connection { - public abstract class AbstractConnectionInfoData + public abstract class AbstractConnectionInfoData : INotifyPropertyChanged { #region Fields + private string _name; private string _description; private string _icon; private string _panel; + private string _hostname; private string _username; private string _password; private string _domain; + private ProtocolType _protocol; private string _extApp; private int _port; @@ -29,12 +33,14 @@ namespace mRemoteNG.Connection private string _loadBalanceInfo; private HTTPBase.RenderingEngine _renderingEngine; private bool _useCredSsp; + private ProtocolRDP.RDGatewayUsageMethod _rdGatewayUsageMethod; private string _rdGatewayHostname; private ProtocolRDP.RDGatewayUseConnectionCredentials _rdGatewayUseConnectionCredentials; private string _rdGatewayUsername; private string _rdGatewayPassword; private string _rdGatewayDomain; + private ProtocolRDP.RDPResolutions _resolution; private bool _automaticResize; private ProtocolRDP.RDPColors _colors; @@ -43,16 +49,19 @@ namespace mRemoteNG.Connection private bool _displayThemes; private bool _enableFontSmoothing; private bool _enableDesktopComposition; + private bool _redirectKeys; private bool _redirectDiskDrives; private bool _redirectPrinters; private bool _redirectPorts; private bool _redirectSmartCards; private ProtocolRDP.RDPSounds _redirectSound; + private string _preExtApp; private string _postExtApp; private string _macAddress; private string _userField; + private ProtocolVNC.Compression _vncCompression; private ProtocolVNC.Encoding _vncEncoding; private ProtocolVNC.AuthMode _vncAuthMode; @@ -71,7 +80,11 @@ namespace mRemoteNG.Connection [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), LocalizedAttributes.LocalizedDisplayName("strPropertyNameName"), LocalizedAttributes.LocalizedDescription("strPropertyDescriptionName")] - public virtual string Name { get; set; } + public virtual string Name + { + get { return _name; } + set { SetField(ref _name, value, "Name"); } + } [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), LocalizedAttributes.LocalizedDisplayName("strPropertyNameDescription"), @@ -79,7 +92,7 @@ namespace mRemoteNG.Connection public virtual string Description { get { return GetPropertyValue("Description", _description); } - set { _description = value; } + set { SetField(ref _description, value, "Description"); } } [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), @@ -89,7 +102,7 @@ namespace mRemoteNG.Connection public virtual string Icon { get { return GetPropertyValue("Icon", _icon); } - set { _icon = value; } + set { SetField(ref _icon, value, "Icon"); } } [LocalizedAttributes.LocalizedCategory("strCategoryDisplay", 1), @@ -98,9 +111,10 @@ namespace mRemoteNG.Connection public virtual string Panel { get { return GetPropertyValue("Panel", _panel); } - set { _panel = value; } + set { SetField(ref _panel, value, "Panel"); } } #endregion + #region Connection [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), LocalizedAttributes.LocalizedDisplayName("strPropertyNameAddress"), @@ -108,10 +122,7 @@ namespace mRemoteNG.Connection public virtual string Hostname { get { return _hostname.Trim(); } - set - { - _hostname = string.IsNullOrEmpty(value) ? string.Empty : value.Trim(); - } + set { SetField(ref _hostname, value?.Trim(), "Hostname"); } } [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), @@ -120,7 +131,7 @@ namespace mRemoteNG.Connection public virtual string Username { get { return GetPropertyValue("Username", _username); } - set { _username = value.Trim(); } + set { SetField(ref _username, value?.Trim(), "Username"); } } [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), @@ -130,7 +141,7 @@ namespace mRemoteNG.Connection public virtual string Password { get { return GetPropertyValue("Password", _password); } - set { _password = value; } + set { SetField(ref _password, value, "Password"); } } [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), @@ -139,9 +150,10 @@ namespace mRemoteNG.Connection public string Domain { get { return GetPropertyValue("Domain", _domain).Trim(); } - set { _domain = value.Trim(); } + set { SetField(ref _domain, value?.Trim(), "Domain"); } } #endregion + #region Protocol [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), LocalizedAttributes.LocalizedDisplayName("strPropertyNameProtocol"), @@ -150,7 +162,7 @@ namespace mRemoteNG.Connection public virtual ProtocolType Protocol { get { return GetPropertyValue("Protocol", _protocol); } - set { _protocol = value; } + set { SetField(ref _protocol, value, "Protocol"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -160,7 +172,7 @@ namespace mRemoteNG.Connection public string ExtApp { get { return GetPropertyValue("ExtApp", _extApp); } - set { _extApp = value; } + set { SetField(ref _extApp, value, "ExtApp"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -169,7 +181,7 @@ namespace mRemoteNG.Connection public virtual int Port { get { return GetPropertyValue("Port", _port); } - set { _port = value; } + set { SetField(ref _port, value, "Port"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -179,7 +191,7 @@ namespace mRemoteNG.Connection public virtual string PuttySession { get { return GetPropertyValue("PuttySession", _puttySession); } - set { _puttySession = value; } + set { SetField(ref _puttySession, value, "PuttySession"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -189,7 +201,7 @@ namespace mRemoteNG.Connection public ProtocolICA.EncryptionStrength ICAEncryptionStrength { get { return GetPropertyValue("ICAEncryptionStrength", _icaEncryption); } - set { _icaEncryption = value; } + set { SetField(ref _icaEncryption, value, "ICAEncryptionStrength"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -199,7 +211,7 @@ namespace mRemoteNG.Connection public bool UseConsoleSession { get { return GetPropertyValue("UseConsoleSession", _useConsoleSession); } - set { _useConsoleSession = value; } + set { SetField(ref _useConsoleSession, value, "UseConsoleSession"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -209,7 +221,7 @@ namespace mRemoteNG.Connection public ProtocolRDP.AuthenticationLevel RDPAuthenticationLevel { get { return GetPropertyValue("RDPAuthenticationLevel", _rdpAuthenticationLevel); } - set { _rdpAuthenticationLevel = value; } + set { SetField(ref _rdpAuthenticationLevel, value, "RDPAuthenticationLevel"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -218,7 +230,7 @@ namespace mRemoteNG.Connection public string LoadBalanceInfo { get { return GetPropertyValue("LoadBalanceInfo", _loadBalanceInfo).Trim(); } - set { _loadBalanceInfo = value.Trim(); } + set { SetField(ref _loadBalanceInfo, value?.Trim(), "LoadBalanceInfo"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -228,7 +240,7 @@ namespace mRemoteNG.Connection public HTTPBase.RenderingEngine RenderingEngine { get { return GetPropertyValue("RenderingEngine", _renderingEngine); } - set { _renderingEngine = value; } + set { SetField(ref _renderingEngine, value, "RenderingEngine"); } } [LocalizedAttributes.LocalizedCategory("strCategoryProtocol", 3), @@ -238,9 +250,10 @@ namespace mRemoteNG.Connection public bool UseCredSsp { get { return GetPropertyValue("UseCredSsp", _useCredSsp); } - set { _useCredSsp = value; } + set { SetField(ref _useCredSsp, value, "UseCredSsp"); } } #endregion + #region RD Gateway [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), LocalizedAttributes.LocalizedDisplayName("strPropertyNameRDGatewayUsageMethod"), @@ -249,7 +262,7 @@ namespace mRemoteNG.Connection public ProtocolRDP.RDGatewayUsageMethod RDGatewayUsageMethod { get { return GetPropertyValue("RDGatewayUsageMethod", _rdGatewayUsageMethod); } - set { _rdGatewayUsageMethod = value; } + set { SetField(ref _rdGatewayUsageMethod, value, "RDGatewayUsageMethod"); } } [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), @@ -258,7 +271,7 @@ namespace mRemoteNG.Connection public string RDGatewayHostname { get { return GetPropertyValue("RDGatewayHostname", _rdGatewayHostname).Trim(); } - set { _rdGatewayHostname = value.Trim(); } + set { SetField(ref _rdGatewayHostname, value?.Trim(), "RDGatewayHostname"); } } [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), @@ -268,7 +281,7 @@ namespace mRemoteNG.Connection public ProtocolRDP.RDGatewayUseConnectionCredentials RDGatewayUseConnectionCredentials { get { return GetPropertyValue("RDGatewayUseConnectionCredentials", _rdGatewayUseConnectionCredentials); } - set { _rdGatewayUseConnectionCredentials = value; } + set { SetField(ref _rdGatewayUseConnectionCredentials, value, "RDGatewayUseConnectionCredentials"); } } [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), @@ -277,7 +290,7 @@ namespace mRemoteNG.Connection public string RDGatewayUsername { get { return GetPropertyValue("RDGatewayUsername", _rdGatewayUsername).Trim(); } - set { _rdGatewayUsername = value.Trim(); } + set { SetField(ref _rdGatewayUsername, value?.Trim(), "RDGatewayUsername"); } } [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), @@ -287,7 +300,7 @@ namespace mRemoteNG.Connection public string RDGatewayPassword { get { return GetPropertyValue("RDGatewayPassword", _rdGatewayPassword); } - set { _rdGatewayPassword = value; } + set { SetField(ref _rdGatewayPassword, value, "RDGatewayPassword"); } } [LocalizedAttributes.LocalizedCategory("strCategoryGateway", 4), @@ -296,9 +309,10 @@ namespace mRemoteNG.Connection public string RDGatewayDomain { get { return GetPropertyValue("RDGatewayDomain", _rdGatewayDomain).Trim(); } - set { _rdGatewayDomain = value.Trim(); } + set { SetField(ref _rdGatewayDomain, value?.Trim(), "RDGatewayDomain"); } } #endregion + #region Appearance [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), LocalizedAttributes.LocalizedDisplayName("strPropertyNameResolution"), @@ -307,7 +321,7 @@ namespace mRemoteNG.Connection public ProtocolRDP.RDPResolutions Resolution { get { return GetPropertyValue("Resolution", _resolution); } - set { _resolution = value; } + set { SetField(ref _resolution, value, "Resolution"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -317,7 +331,7 @@ namespace mRemoteNG.Connection public bool AutomaticResize { get { return GetPropertyValue("AutomaticResize", _automaticResize); } - set { _automaticResize = value; } + set { SetField(ref _automaticResize, value, "AutomaticResize"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -327,7 +341,7 @@ namespace mRemoteNG.Connection public ProtocolRDP.RDPColors Colors { get { return GetPropertyValue("Colors", _colors); } - set { _colors = value; } + set { SetField(ref _colors, value, "Colors"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -337,7 +351,7 @@ namespace mRemoteNG.Connection public bool CacheBitmaps { get { return GetPropertyValue("CacheBitmaps", _cacheBitmaps); } - set { _cacheBitmaps = value; } + set { SetField(ref _cacheBitmaps, value, "CacheBitmaps"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -347,7 +361,7 @@ namespace mRemoteNG.Connection public bool DisplayWallpaper { get { return GetPropertyValue("DisplayWallpaper", _displayWallpaper); } - set { _displayWallpaper = value; } + set { SetField(ref _displayWallpaper, value, "DisplayWallpaper"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -357,7 +371,7 @@ namespace mRemoteNG.Connection public bool DisplayThemes { get { return GetPropertyValue("DisplayThemes", _displayThemes); } - set { _displayThemes = value; } + set { SetField(ref _displayThemes, value, "DisplayThemes"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -367,7 +381,7 @@ namespace mRemoteNG.Connection public bool EnableFontSmoothing { get { return GetPropertyValue("EnableFontSmoothing", _enableFontSmoothing); } - set { _enableFontSmoothing = value; } + set { SetField(ref _enableFontSmoothing, value, "EnableFontSmoothing"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -377,9 +391,10 @@ namespace mRemoteNG.Connection public bool EnableDesktopComposition { get { return GetPropertyValue("EnableDesktopComposition", _enableDesktopComposition); } - set { _enableDesktopComposition = value; } + set { SetField(ref _enableDesktopComposition, value, "EnableDesktopComposition"); } } #endregion + #region Redirect [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), LocalizedAttributes.LocalizedDisplayName("strPropertyNameRedirectKeys"), @@ -388,7 +403,7 @@ namespace mRemoteNG.Connection public bool RedirectKeys { get { return GetPropertyValue("RedirectKeys", _redirectKeys); } - set { _redirectKeys = value; } + set { SetField(ref _redirectKeys, value, "RedirectKeys"); } } [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), @@ -398,7 +413,7 @@ namespace mRemoteNG.Connection public bool RedirectDiskDrives { get { return GetPropertyValue("RedirectDiskDrives", _redirectDiskDrives); } - set { _redirectDiskDrives = value; } + set { SetField(ref _redirectDiskDrives, value, "RedirectDiskDrives"); } } [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), @@ -408,7 +423,7 @@ namespace mRemoteNG.Connection public bool RedirectPrinters { get { return GetPropertyValue("RedirectPrinters", _redirectPrinters); } - set { _redirectPrinters = value; } + set { SetField(ref _redirectPrinters, value, "RedirectPrinters"); } } [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), @@ -418,7 +433,7 @@ namespace mRemoteNG.Connection public bool RedirectPorts { get { return GetPropertyValue("RedirectPorts", _redirectPorts); } - set { _redirectPorts = value; } + set { SetField(ref _redirectPorts, value, "RedirectPorts"); } } [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), @@ -428,7 +443,7 @@ namespace mRemoteNG.Connection public bool RedirectSmartCards { get { return GetPropertyValue("RedirectSmartCards", _redirectSmartCards); } - set { _redirectSmartCards = value; } + set { SetField(ref _redirectSmartCards, value, "RedirectSmartCards"); } } [LocalizedAttributes.LocalizedCategory("strCategoryRedirect", 6), @@ -438,9 +453,10 @@ namespace mRemoteNG.Connection public ProtocolRDP.RDPSounds RedirectSound { get { return GetPropertyValue("RedirectSound", _redirectSound); } - set { _redirectSound = value; } + set { SetField(ref _redirectSound, value, "RedirectSound"); } } #endregion + #region Misc [Browsable(false)] public string ConstantID { get; set; } @@ -452,7 +468,7 @@ namespace mRemoteNG.Connection public virtual string PreExtApp { get { return GetPropertyValue("PreExtApp", _preExtApp); } - set { _preExtApp = value; } + set { SetField(ref _preExtApp, value, "PreExtApp"); } } [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), @@ -462,7 +478,7 @@ namespace mRemoteNG.Connection public virtual string PostExtApp { get { return GetPropertyValue("PostExtApp", _postExtApp); } - set { _postExtApp = value; } + set { SetField(ref _postExtApp, value, "PostExtApp"); } } [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), @@ -471,7 +487,7 @@ namespace mRemoteNG.Connection public virtual string MacAddress { get { return GetPropertyValue("MacAddress", _macAddress); } - set { _macAddress = value; } + set { SetField(ref _macAddress, value, "MacAddress"); } } [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), @@ -480,9 +496,10 @@ namespace mRemoteNG.Connection public virtual string UserField { get { return GetPropertyValue("UserField", _userField); } - set { _userField = value; } + set { SetField(ref _userField, value, "UserField"); } } #endregion + #region VNC [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), Browsable(false), @@ -492,7 +509,7 @@ namespace mRemoteNG.Connection public ProtocolVNC.Compression VNCCompression { get { return GetPropertyValue("VNCCompression", _vncCompression); } - set { _vncCompression = value; } + set { SetField(ref _vncCompression, value, "VNCCompression"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -503,7 +520,7 @@ namespace mRemoteNG.Connection public ProtocolVNC.Encoding VNCEncoding { get { return GetPropertyValue("VNCEncoding", _vncEncoding); } - set { _vncEncoding = value; } + set { SetField(ref _vncEncoding, value, "VNCEncoding"); } } [LocalizedAttributes.LocalizedCategory("strCategoryConnection", 2), @@ -514,7 +531,7 @@ namespace mRemoteNG.Connection public ProtocolVNC.AuthMode VNCAuthMode { get { return GetPropertyValue("VNCAuthMode", _vncAuthMode); } - set { _vncAuthMode = value; } + set { SetField(ref _vncAuthMode, value, "VNCAuthMode"); } } [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), @@ -525,7 +542,7 @@ namespace mRemoteNG.Connection public ProtocolVNC.ProxyType VNCProxyType { get { return GetPropertyValue("VNCProxyType", _vncProxyType); } - set { _vncProxyType = value; } + set { SetField(ref _vncProxyType, value, "VNCProxyType"); } } [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), @@ -535,7 +552,7 @@ namespace mRemoteNG.Connection public string VNCProxyIP { get { return GetPropertyValue("VNCProxyIP", _vncProxyIp); } - set { _vncProxyIp = value; } + set { SetField(ref _vncProxyIp, value, "VNCProxyIP"); } } [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), @@ -545,7 +562,7 @@ namespace mRemoteNG.Connection public int VNCProxyPort { get { return GetPropertyValue("VNCProxyPort", _vncProxyPort); } - set { _vncProxyPort = value; } + set { SetField(ref _vncProxyPort, value, "VNCProxyPort"); } } [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), @@ -555,7 +572,7 @@ namespace mRemoteNG.Connection public string VNCProxyUsername { get { return GetPropertyValue("VNCProxyUsername", _vncProxyUsername); } - set { _vncProxyUsername = value; } + set { SetField(ref _vncProxyUsername, value, "VNCProxyUsername"); } } [LocalizedAttributes.LocalizedCategory("strCategoryMiscellaneous", 7), @@ -566,7 +583,7 @@ namespace mRemoteNG.Connection public string VNCProxyPassword { get { return GetPropertyValue("VNCProxyPassword", _vncProxyPassword); } - set { _vncProxyPassword = value; } + set { SetField(ref _vncProxyPassword, value, "VNCProxyPassword"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -577,7 +594,7 @@ namespace mRemoteNG.Connection public ProtocolVNC.Colors VNCColors { get { return GetPropertyValue("VNCColors", _vncColors); } - set { _vncColors = value; } + set { SetField(ref _vncColors, value, "VNCColors"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -587,7 +604,7 @@ namespace mRemoteNG.Connection public ProtocolVNC.SmartSizeMode VNCSmartSizeMode { get { return GetPropertyValue("VNCSmartSizeMode", _vncSmartSizeMode); } - set { _vncSmartSizeMode = value; } + set { SetField(ref _vncSmartSizeMode, value, "VNCSmartSizeMode"); } } [LocalizedAttributes.LocalizedCategory("strCategoryAppearance", 5), @@ -597,7 +614,7 @@ namespace mRemoteNG.Connection public bool VNCViewOnly { get { return GetPropertyValue("VNCViewOnly", _vncViewOnly); } - set { _vncViewOnly = value; } + set { SetField(ref _vncViewOnly, value, "VNCViewOnly"); } } #endregion #endregion @@ -606,5 +623,20 @@ namespace mRemoteNG.Connection { return (TPropertyType)GetType().GetProperty(propertyName).GetValue(this, null); } + + public event PropertyChangedEventHandler PropertyChanged; + protected virtual void OnPropertyChanged(string propertyName) + { + var handler = PropertyChanged; + handler?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + protected bool SetField(ref T field, T value, string propertyName = null) + { + if (EqualityComparer.Default.Equals(field, value)) return false; + field = value; + OnPropertyChanged(propertyName); + return true; + } } } \ No newline at end of file From 5838ff045a7ce6216c11f202bd032bb4c99b8333 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 19 Sep 2016 13:00:23 -0600 Subject: [PATCH 151/338] Implemented INotifyPropertyChanged for the Children proptery of the ContainerInfo object --- mRemoteV1/Container/ContainerInfo.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index d320ddd26..8bcb03f3a 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -36,8 +36,10 @@ namespace mRemoteNG.Container public void AddChild(ConnectionInfo newChildItem) { + if (Children.Contains(newChildItem)) return; newChildItem.Parent = this; Children.Add(newChildItem); + OnPropertyChanged("Children"); } public void AddChildRange(IEnumerable newChildren) @@ -50,8 +52,10 @@ namespace mRemoteNG.Container public void RemoveChild(ConnectionInfo removalTarget) { + if (!Children.Contains(removalTarget)) return; removalTarget.Parent = null; Children.Remove(removalTarget); + OnPropertyChanged("Children"); } public void RemoveChildRange(IEnumerable removalTargets) @@ -69,6 +73,7 @@ namespace mRemoteNG.Container Children.Remove(child); if (newIndex > Children.Count) newIndex = Children.Count; Children.Insert(newIndex, child); + OnPropertyChanged("Children"); } public void SetChildAbove(ConnectionInfo childToPromote, ConnectionInfo reference) @@ -118,6 +123,7 @@ namespace mRemoteNG.Container SortDirection = sortDirection }; Children.Sort(connectionComparer); + OnPropertyChanged("Children"); } public void SortRecursive(ListSortDirection sortDirection = ListSortDirection.Ascending) From 86cb233cf69a8af544187af62330a7a91d3d33e5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 08:37:44 -0600 Subject: [PATCH 152/338] Implemented INotifyCollectionChanged on the container children list rather than the INotifyPropertyChanged. It makes more sense, though we will need to implement UI refresh listeners on the TreeListView manually now (objectlistview currently only respects INotifyPropertyChanged events) --- .../Container/ContainerInfoTests.cs | 41 +++++++++++++++++++ .../Connection/AbstractConnectionInfoData.cs | 6 +++ mRemoteV1/Container/ContainerInfo.cs | 23 ++++++++--- 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/mRemoteNGTests/Container/ContainerInfoTests.cs b/mRemoteNGTests/Container/ContainerInfoTests.cs index 61a99a0af..fefccc4f3 100644 --- a/mRemoteNGTests/Container/ContainerInfoTests.cs +++ b/mRemoteNGTests/Container/ContainerInfoTests.cs @@ -80,5 +80,46 @@ namespace mRemoteNGTests.Container _containerInfo.RemoveChildRange(collection); Assert.That(_containerInfo.Children, Does.Contain(_connectionInfo)); } + + [Test] + public void AddingChildTriggersCollectionChangedEvent() + { + var wasCalled = false; + _containerInfo.CollectionChanged += (sender, args) => wasCalled = true; + _containerInfo.AddChild(_connectionInfo); + Assert.That(wasCalled, Is.True); + } + + [Test] + public void RemovingChildTriggersCollectionChangedEvent() + { + var wasCalled = false; + _containerInfo.AddChild(_connectionInfo); + _containerInfo.CollectionChanged += (sender, args) => wasCalled = true; + _containerInfo.RemoveChild(_connectionInfo); + Assert.That(wasCalled, Is.True); + } + + [Test] + public void ChangingChildPropertyTriggersPropertyChangedEvent() + { + var wasCalled = false; + _containerInfo.AddChild(_connectionInfo); + _containerInfo.PropertyChanged += (sender, args) => wasCalled = true; + _connectionInfo.Name = "somethinghere"; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void ChangingSubChildPropertyTriggersPropertyChangedEvent() + { + var wasCalled = false; + var container2 = new ContainerInfo(); + _containerInfo.AddChild(container2); + container2.AddChild(_connectionInfo); + _containerInfo.PropertyChanged += (sender, args) => wasCalled = true; + _connectionInfo.Name = "somethinghere"; + Assert.That(wasCalled, Is.True); + } } } \ No newline at end of file diff --git a/mRemoteV1/Connection/AbstractConnectionInfoData.cs b/mRemoteV1/Connection/AbstractConnectionInfoData.cs index f2402c8b9..58ac0d127 100644 --- a/mRemoteV1/Connection/AbstractConnectionInfoData.cs +++ b/mRemoteV1/Connection/AbstractConnectionInfoData.cs @@ -631,6 +631,12 @@ namespace mRemoteNG.Connection handler?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } + protected virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs args) + { + var handler = PropertyChanged; + handler?.Invoke(this, new PropertyChangedEventArgs(args.PropertyName)); + } + protected bool SetField(ref T field, T value, string propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 8bcb03f3a..8f5b94c77 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using mRemoteNG.Connection; using System.ComponentModel; using System.Linq; @@ -10,7 +11,7 @@ using mRemoteNG.Tree; namespace mRemoteNG.Container { [DefaultProperty("Name")] - public class ContainerInfo : ConnectionInfo + public class ContainerInfo : ConnectionInfo, INotifyCollectionChanged { [Browsable(false)] public List Children { get; set; } = new List(); @@ -39,7 +40,8 @@ namespace mRemoteNG.Container if (Children.Contains(newChildItem)) return; newChildItem.Parent = this; Children.Add(newChildItem); - OnPropertyChanged("Children"); + newChildItem.PropertyChanged += OnPropertyChanged; + RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newChildItem)); } public void AddChildRange(IEnumerable newChildren) @@ -55,7 +57,8 @@ namespace mRemoteNG.Container if (!Children.Contains(removalTarget)) return; removalTarget.Parent = null; Children.Remove(removalTarget); - OnPropertyChanged("Children"); + removalTarget.PropertyChanged -= OnPropertyChanged; + RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, removalTarget)); } public void RemoveChildRange(IEnumerable removalTargets) @@ -73,7 +76,7 @@ namespace mRemoteNG.Container Children.Remove(child); if (newIndex > Children.Count) newIndex = Children.Count; Children.Insert(newIndex, child); - OnPropertyChanged("Children"); + RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, child, newIndex, originalIndex)); } public void SetChildAbove(ConnectionInfo childToPromote, ConnectionInfo reference) @@ -123,7 +126,7 @@ namespace mRemoteNG.Container SortDirection = sortDirection }; Children.Sort(connectionComparer); - OnPropertyChanged("Children"); + RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, Children)); } public void SortRecursive(ListSortDirection sortDirection = ListSortDirection.Ascending) @@ -196,5 +199,13 @@ namespace mRemoteNG.Container } return childList; } - } + + public event NotifyCollectionChangedEventHandler CollectionChanged; + + private void RaiseCollectionChangedEvent(NotifyCollectionChangedEventArgs args) + { + var handler = CollectionChanged; + handler?.Invoke(this, args); + } + } } \ No newline at end of file From 05799767a08539d7d15df0bab575fee6585f6910 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 08:54:41 -0600 Subject: [PATCH 153/338] Added more ContainerInfo tests. Refactored a bit --- .../Container/ContainerInfoTests.cs | 88 +++++++++++++------ 1 file changed, 63 insertions(+), 25 deletions(-) diff --git a/mRemoteNGTests/Container/ContainerInfoTests.cs b/mRemoteNGTests/Container/ContainerInfoTests.cs index fefccc4f3..8618ed72c 100644 --- a/mRemoteNGTests/Container/ContainerInfoTests.cs +++ b/mRemoteNGTests/Container/ContainerInfoTests.cs @@ -8,40 +8,46 @@ namespace mRemoteNGTests.Container public class ContainerInfoTests { private ContainerInfo _containerInfo; - private ConnectionInfo _connectionInfo; + private ConnectionInfo _con1; + private ConnectionInfo _con2; + private ConnectionInfo _con3; [SetUp] public void Setup() { _containerInfo = new ContainerInfo(); - _connectionInfo = new ConnectionInfo(); + _con1 = new ConnectionInfo {Name = "a"}; + _con2 = new ConnectionInfo {Name = "b"}; + _con3 = new ConnectionInfo {Name = "c"}; } [TearDown] public void Teardown() { _containerInfo = null; - _connectionInfo = null; + _con1 = null; + _con2 = null; + _con3 = null; } [Test] public void AddSetsParentPropertyOnTheChild() { - _containerInfo.AddChild(_connectionInfo); - Assert.That(_connectionInfo.Parent, Is.EqualTo(_containerInfo)); + _containerInfo.AddChild(_con1); + Assert.That(_con1.Parent, Is.EqualTo(_containerInfo)); } [Test] public void AddAddsChildToChildrenList() { - _containerInfo.AddChild(_connectionInfo); - Assert.That(_containerInfo.Children, Does.Contain(_connectionInfo)); + _containerInfo.AddChild(_con1); + Assert.That(_containerInfo.Children, Does.Contain(_con1)); } [Test] public void AddRangeAddsAllItems() { - var collection = new[] {new ConnectionInfo(),new ConnectionInfo(), new ContainerInfo()}; + var collection = new[] { _con1, _con2, _con3 }; _containerInfo.AddChildRange(collection); Assert.That(_containerInfo.Children, Is.EquivalentTo(collection)); } @@ -49,23 +55,23 @@ namespace mRemoteNGTests.Container [Test] public void RemoveUnsetsParentPropertyOnChild() { - _containerInfo.AddChild(_connectionInfo); - _containerInfo.RemoveChild(_connectionInfo); - Assert.That(_connectionInfo.Parent, Is.Not.EqualTo(_containerInfo)); + _containerInfo.AddChild(_con1); + _containerInfo.RemoveChild(_con1); + Assert.That(_con1.Parent, Is.Not.EqualTo(_containerInfo)); } [Test] public void RemoveRemovesChildFromChildrenList() { - _containerInfo.AddChild(_connectionInfo); - _containerInfo.RemoveChild(_connectionInfo); - Assert.That(_containerInfo.Children, Does.Not.Contains(_connectionInfo)); + _containerInfo.AddChild(_con1); + _containerInfo.RemoveChild(_con1); + Assert.That(_containerInfo.Children, Does.Not.Contains(_con1)); } [Test] public void RemoveRangeRemovesAllIndicatedItems() { - var collection = new[] { new ConnectionInfo(), new ConnectionInfo(), new ContainerInfo() }; + var collection = new[] { _con1, _con2, new ContainerInfo() }; _containerInfo.AddChildRange(collection); _containerInfo.RemoveChildRange(collection); Assert.That(_containerInfo.Children, Does.Not.Contains(collection[0]).And.Not.Contains(collection[1]).And.Not.Contains(collection[2])); @@ -74,11 +80,11 @@ namespace mRemoteNGTests.Container [Test] public void RemoveRangeDoesNotRemoveUntargetedMembers() { - var collection = new[] { new ConnectionInfo(), new ConnectionInfo(), new ContainerInfo() }; + var collection = new[] { _con1, _con2, new ContainerInfo() }; _containerInfo.AddChildRange(collection); - _containerInfo.AddChild(_connectionInfo); + _containerInfo.AddChild(_con3); _containerInfo.RemoveChildRange(collection); - Assert.That(_containerInfo.Children, Does.Contain(_connectionInfo)); + Assert.That(_containerInfo.Children, Does.Contain(_con3)); } [Test] @@ -86,7 +92,7 @@ namespace mRemoteNGTests.Container { var wasCalled = false; _containerInfo.CollectionChanged += (sender, args) => wasCalled = true; - _containerInfo.AddChild(_connectionInfo); + _containerInfo.AddChild(_con1); Assert.That(wasCalled, Is.True); } @@ -94,9 +100,9 @@ namespace mRemoteNGTests.Container public void RemovingChildTriggersCollectionChangedEvent() { var wasCalled = false; - _containerInfo.AddChild(_connectionInfo); + _containerInfo.AddChild(_con1); _containerInfo.CollectionChanged += (sender, args) => wasCalled = true; - _containerInfo.RemoveChild(_connectionInfo); + _containerInfo.RemoveChild(_con1); Assert.That(wasCalled, Is.True); } @@ -104,9 +110,9 @@ namespace mRemoteNGTests.Container public void ChangingChildPropertyTriggersPropertyChangedEvent() { var wasCalled = false; - _containerInfo.AddChild(_connectionInfo); + _containerInfo.AddChild(_con1); _containerInfo.PropertyChanged += (sender, args) => wasCalled = true; - _connectionInfo.Name = "somethinghere"; + _con1.Name = "somethinghere"; Assert.That(wasCalled, Is.True); } @@ -116,10 +122,42 @@ namespace mRemoteNGTests.Container var wasCalled = false; var container2 = new ContainerInfo(); _containerInfo.AddChild(container2); - container2.AddChild(_connectionInfo); + container2.AddChild(_con1); _containerInfo.PropertyChanged += (sender, args) => wasCalled = true; - _connectionInfo.Name = "somethinghere"; + _con1.Name = "somethinghere"; Assert.That(wasCalled, Is.True); } + + [Test] + public void SetChildPositionPutsChildInCorrectPosition() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + _containerInfo.SetChildPosition(_con2, 2); + Assert.That(_containerInfo.Children.IndexOf(_con2), Is.EqualTo(2)); + } + + [Test] + public void SettingChildPositionAboveArrayBoundsPutsItAtEndOfList() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + var finalIndex = _containerInfo.Children.Count - 1; + _containerInfo.SetChildPosition(_con2, 5); + Assert.That(_containerInfo.Children.IndexOf(_con2), Is.EqualTo(finalIndex)); + } + + [Test] + public void SettingChildPositionBelowArrayBoundsDoesNotMoveTheChild() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + var originalIndex = _containerInfo.Children.IndexOf(_con2); + _containerInfo.SetChildPosition(_con2, -1); + Assert.That(_containerInfo.Children.IndexOf(_con2), Is.EqualTo(originalIndex)); + } } } \ No newline at end of file From 1b0f9fcd8873fe85e2a88047fef8d8272309193a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 09:02:03 -0600 Subject: [PATCH 154/338] Created more ContainerInfo tests --- .../Container/ContainerInfoTests.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/mRemoteNGTests/Container/ContainerInfoTests.cs b/mRemoteNGTests/Container/ContainerInfoTests.cs index 8618ed72c..699d45c05 100644 --- a/mRemoteNGTests/Container/ContainerInfoTests.cs +++ b/mRemoteNGTests/Container/ContainerInfoTests.cs @@ -159,5 +159,29 @@ namespace mRemoteNGTests.Container _containerInfo.SetChildPosition(_con2, -1); Assert.That(_containerInfo.Children.IndexOf(_con2), Is.EqualTo(originalIndex)); } + + [Test] + public void SetChildAbovePutsChildInCorrectPosition() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + var referenceChildIndexBeforeMove = _containerInfo.Children.IndexOf(_con2); + _containerInfo.SetChildAbove(_con3, _con2); + var targetsNewIndex = _containerInfo.Children.IndexOf(_con3); + Assert.That(targetsNewIndex, Is.EqualTo(referenceChildIndexBeforeMove)); + } + + [Test] + public void SetChildBelowPutsChildInCorrectPosition() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + var referenceChildIndexBeforeMove = _containerInfo.Children.IndexOf(_con1); + _containerInfo.SetChildBelow(_con3, _con1); + var targetsNewIndex = _containerInfo.Children.IndexOf(_con3); + Assert.That(targetsNewIndex, Is.EqualTo(referenceChildIndexBeforeMove+1)); + } } } \ No newline at end of file From 20f527ae9456f16d2a78b4d1d9aa18494f52c3e5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 09:07:30 -0600 Subject: [PATCH 155/338] Created more ContainerInfo tests --- .../Container/ContainerInfoTests.cs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/mRemoteNGTests/Container/ContainerInfoTests.cs b/mRemoteNGTests/Container/ContainerInfoTests.cs index 699d45c05..94ee11d80 100644 --- a/mRemoteNGTests/Container/ContainerInfoTests.cs +++ b/mRemoteNGTests/Container/ContainerInfoTests.cs @@ -183,5 +183,53 @@ namespace mRemoteNGTests.Container var targetsNewIndex = _containerInfo.Children.IndexOf(_con3); Assert.That(targetsNewIndex, Is.EqualTo(referenceChildIndexBeforeMove+1)); } + + [Test] + public void PromoteChildMovesTargetUpOne() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + var targetsIndexBeforeMove = _containerInfo.Children.IndexOf(_con3); + _containerInfo.PromoteChild(_con3); + var targetsNewIndex = _containerInfo.Children.IndexOf(_con3); + Assert.That(targetsNewIndex, Is.EqualTo(targetsIndexBeforeMove - 1)); + } + + [Test] + public void PromoteChildDoesNothingWhenAlreadyAtTopOfList() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + var targetsIndexBeforeMove = _containerInfo.Children.IndexOf(_con1); + _containerInfo.PromoteChild(_con1); + var targetsNewIndex = _containerInfo.Children.IndexOf(_con1); + Assert.That(targetsNewIndex, Is.EqualTo(targetsIndexBeforeMove)); + } + + [Test] + public void DemoteChildMovesTargetDownOne() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + var targetsIndexBeforeMove = _containerInfo.Children.IndexOf(_con1); + _containerInfo.DemoteChild(_con1); + var targetsNewIndex = _containerInfo.Children.IndexOf(_con1); + Assert.That(targetsNewIndex, Is.EqualTo(targetsIndexBeforeMove + 1)); + } + + [Test] + public void DemoteChildDoesNothingWhenAlreadyAtTopOfList() + { + _containerInfo.AddChild(_con1); + _containerInfo.AddChild(_con2); + _containerInfo.AddChild(_con3); + var targetsIndexBeforeMove = _containerInfo.Children.IndexOf(_con3); + _containerInfo.DemoteChild(_con3); + var targetsNewIndex = _containerInfo.Children.IndexOf(_con3); + Assert.That(targetsNewIndex, Is.EqualTo(targetsIndexBeforeMove)); + } } } \ No newline at end of file From e64ebf06f123399c002290715bbcc10b50ec114b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 09:34:22 -0600 Subject: [PATCH 156/338] Fixed bug with calling CollectionChanged when sorting container children --- mRemoteV1/Container/ContainerInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 8f5b94c77..6626cda3e 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -126,7 +126,7 @@ namespace mRemoteNG.Container SortDirection = sortDirection }; Children.Sort(connectionComparer); - RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, Children)); + RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } public void SortRecursive(ListSortDirection sortDirection = ListSortDirection.Ascending) From c13ff71f9ab9631d6fdf5bd9d61fe3ea60f60cb2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 09:36:39 -0600 Subject: [PATCH 157/338] Abstracted the way we refresh tree model objects --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 31 ++++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index e484f1ba0..c1a548e72 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -3,6 +3,7 @@ using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Tree; using System; +using System.Collections; using System.ComponentModel; using System.Drawing; using System.Linq; @@ -255,7 +256,7 @@ namespace mRemoteNG.UI.Window var newNode = SelectedNode.Clone(); newNode.Parent.SetChildBelow(newNode, SelectedNode); Runtime.SaveConnectionsBG(); - olvConnections.RefreshObject(SelectedNode); + RefreshTreeObject(SelectedNode); } public void RenameSelectedNode() @@ -269,7 +270,7 @@ namespace mRemoteNG.UI.Window if (!UserConfirmsDeletion()) return; ConnectionTreeModel.DeleteNode(SelectedNode); Runtime.SaveConnectionsBG(); - olvConnections.RefreshObject(SelectedNode); + RefreshTreeObject(SelectedNode); } private bool UserConfirmsDeletion() @@ -384,6 +385,16 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionStackTrace("tvConnections_MouseMove (UI.Window.ConnectionTreeWindow) failed", ex); } } + + private void RefreshTreeObject(object modelObject) + { + RefreshTreeObjects(new[] { modelObject }); + } + + private void RefreshTreeObjects(IList modelObjects) + { + olvConnections.RefreshObjects(modelObjects); + } #endregion #region Tree Context Menu @@ -406,28 +417,28 @@ namespace mRemoteNG.UI.Window selectedNodeAsContainer.Sort(sortDirection); else SelectedNode.Parent.Sort(sortDirection); - olvConnections.RefreshObject(SelectedNode); + RefreshTreeObject(SelectedNode); Runtime.SaveConnectionsBG(); } private void SortNodesRecursive(ContainerInfo rootSortTarget, ListSortDirection sortDirection) { rootSortTarget.SortRecursive(sortDirection); - olvConnections.RefreshObject(rootSortTarget); + RefreshTreeObject(rootSortTarget); Runtime.SaveConnectionsBG(); } private void cMenTreeMoveUp_Click(object sender, EventArgs e) { SelectedNode.Parent.PromoteChild(SelectedNode); - olvConnections.RefreshObject(SelectedNode); + RefreshTreeObject(SelectedNode); Runtime.SaveConnectionsBG(); } private void cMenTreeMoveDown_Click(object sender, EventArgs e) { SelectedNode.Parent.DemoteChild(SelectedNode); - olvConnections.RefreshObject(SelectedNode); + RefreshTreeObject(SelectedNode); Runtime.SaveConnectionsBG(); } #endregion @@ -440,9 +451,9 @@ namespace mRemoteNG.UI.Window var newConnectionInfo = new ConnectionInfo(); var selectedContainer = SelectedNode as ContainerInfo; newConnectionInfo.SetParent(selectedContainer ?? SelectedNode.Parent); - olvConnections.RebuildAll(true); Runtime.ConnectionList.Add(newConnectionInfo); - } + RefreshTreeObject(newConnectionInfo.Parent); + } catch (Exception ex) { Runtime.MessageCollector.AddExceptionStackTrace("UI.Window.Tree.AddConnection() failed.", ex); @@ -456,9 +467,9 @@ namespace mRemoteNG.UI.Window var newContainerInfo = new ContainerInfo(); var selectedContainer = SelectedNode as ContainerInfo; newContainerInfo.SetParent(selectedContainer ?? SelectedNode.Parent); - olvConnections.RebuildAll(true); Runtime.ContainerList.Add(newContainerInfo); - } + RefreshTreeObject(newContainerInfo.Parent); + } catch (Exception ex) { Runtime.MessageCollector.AddExceptionStackTrace(Language.strErrorAddFolderFailed, ex); From 94ab1ddfbc72918bee73d55a4b20065cf27fc993 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 09:49:47 -0600 Subject: [PATCH 158/338] Slight optimization of the treelistview CanExpandGetter --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index c1a548e72..820a1888f 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -74,7 +74,11 @@ namespace mRemoteNG.UI.Window { olvNameColumn.AspectGetter = item => ((ConnectionInfo)item).Name; olvNameColumn.ImageGetter = ConnectionImageGetter; - olvConnections.CanExpandGetter = item => item is ContainerInfo && ((ContainerInfo)item).Children.Count > 0; + olvConnections.CanExpandGetter = item => + { + var itemAsContainer = item as ContainerInfo; + return itemAsContainer?.Children.Count > 0; + }; olvConnections.ChildrenGetter = item => ((ContainerInfo)item).Children; olvConnections.ContextMenuStrip = _contextMenu; } From 9949907adcf5dfbea29324b87eec9b98059aa813 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 09:50:20 -0600 Subject: [PATCH 159/338] Slightly better way to set root nodes on the treelistview --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 820a1888f..dabd1a761 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -172,7 +172,7 @@ namespace mRemoteNG.UI.Window private void PopulateTreeView() { - olvConnections.Roots = ConnectionTreeModel.RootNodes; + olvConnections.SetObjects(ConnectionTreeModel.RootNodes); _nodeSearcher = new NodeSearcher(ConnectionTreeModel); ExpandPreviouslyOpenedFolders(); ExpandRootConnectionNode(); From 00b0552e5e4941f6f2c77286d2b16c02ae5c7034 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 09:55:05 -0600 Subject: [PATCH 160/338] Made PuttySessionManager a singleton rather than static. Began implementing collectionchanged event to notify when the putty session list changes --- mRemoteV1/App/Shutdown.cs | 5 ++- .../Config/Connections/ConnectionsLoader.cs | 4 +- .../Config/Putty/PuttySessionsManager.cs | 42 ++++++++++++------- .../UI/Forms/OptionsPages/AdvancedPage.cs | 2 +- mRemoteV1/UI/Forms/frmMain.cs | 2 +- 5 files changed, 33 insertions(+), 22 deletions(-) diff --git a/mRemoteV1/App/Shutdown.cs b/mRemoteV1/App/Shutdown.cs index d63600739..a3a804051 100644 --- a/mRemoteV1/App/Shutdown.cs +++ b/mRemoteV1/App/Shutdown.cs @@ -1,6 +1,7 @@ using mRemoteNG.Tools; using System; using System.Diagnostics; +using mRemoteNG.Config.Putty; using mRemoteNG.UI.Forms; namespace mRemoteNG.App @@ -36,7 +37,7 @@ namespace mRemoteNG.App private static void StopPuttySessionWatcher() { - Config.Putty.PuttySessionsManager.StopWatcher(); + PuttySessionsManager.Instance.StopWatcher(); } private static void DisposeNotificationAreaIcon() @@ -47,7 +48,7 @@ namespace mRemoteNG.App private static void SaveConnections() { - if (mRemoteNG.Settings.Default.SaveConsOnExit) + if (Settings.Default.SaveConsOnExit) Runtime.SaveConnections(); } diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 035071a15..1b9ef0c47 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -67,8 +67,8 @@ namespace mRemoteNG.Config.Connections frmMain.Default.ConnectionsFileName = ConnectionFileName; if (import) return; - PuttySessionsManager.AddSessionsToTree(); - Runtime.ConnectionTreeModel.RootNodes.AddRange(PuttySessionsManager.RootPuttySessionsNodes); + PuttySessionsManager.Instance.AddSessionsToTree(); + Runtime.ConnectionTreeModel.RootNodes.AddRange(PuttySessionsManager.Instance.RootPuttySessionsNodes); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index ea32d20aa..e581598d7 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -1,8 +1,7 @@ using mRemoteNG.Tools; using System.Collections.Generic; +using System.Collections.Specialized; using System.ComponentModel; -using System.Windows.Forms; -using mRemoteNG.App; using mRemoteNG.Root.PuttySessions; @@ -10,8 +9,10 @@ namespace mRemoteNG.Config.Putty { public class PuttySessionsManager { - private static List _providers; - public static IEnumerable Providers + public static PuttySessionsManager Instance { get; } = new PuttySessionsManager(); + + private List _providers; + public IEnumerable Providers { get { @@ -20,11 +21,13 @@ namespace mRemoteNG.Config.Putty return _providers; } } + public List RootPuttySessionsNodes { get; } = new List(); - public static List RootPuttySessionsNodes { get; } = new List(); + private PuttySessionsManager() + { } #region Public Methods - public static void AddSessionsToTree() + public void AddSessionsToTree() { foreach (var provider in Providers) { @@ -32,7 +35,7 @@ namespace mRemoteNG.Config.Putty } } - private static void AddSessionsToTreeForProvider(AbstractPuttySessionsProvider provider) + private void AddSessionsToTreeForProvider(AbstractPuttySessionsProvider provider) { var rootTreeNode = provider.RootInfo; provider.GetSessions(); @@ -42,7 +45,7 @@ namespace mRemoteNG.Config.Putty rootTreeNode.SortRecursive(); } - public static void StartWatcher() + public void StartWatcher() { foreach (var provider in Providers) { @@ -51,7 +54,7 @@ namespace mRemoteNG.Config.Putty } } - public static void StopWatcher() + public void StopWatcher() { foreach (var provider in Providers) { @@ -60,24 +63,24 @@ namespace mRemoteNG.Config.Putty } } - public static void SessionChanged(object sender, AbstractPuttySessionsProvider.SessionChangedEventArgs e) + public void SessionChanged(object sender, AbstractPuttySessionsProvider.SessionChangedEventArgs e) { AddSessionsToTree(); } #endregion #region Private Methods - public static void AddProvider(AbstractPuttySessionsProvider provider) + public void AddProvider(AbstractPuttySessionsProvider provider) { _providers.Add(provider); } - private static void AddProviders() + private void AddProviders() { _providers = new List {new PuttySessionsRegistryProvider(), new PuttySessionsXmingProvider()}; } - private static string[] GetSessionNames(bool raw = false) + private string[] GetSessionNames(bool raw = false) { var sessionNames = new List(); foreach (var provider in Providers) @@ -91,7 +94,7 @@ namespace mRemoteNG.Config.Putty return sessionNames.ToArray(); } - private static bool IsProviderEnabled(AbstractPuttySessionsProvider puttySessionsProvider) + private bool IsProviderEnabled(AbstractPuttySessionsProvider puttySessionsProvider) { var enabled = true; if (PuttyTypeDetector.GetPuttyType() == PuttyTypeDetector.PuttyType.Xming) @@ -111,7 +114,7 @@ namespace mRemoteNG.Config.Putty #region Public Classes public class SessionList : StringConverter { - public static string[] Names => GetSessionNames(); + public static string[] Names => Instance.GetSessionNames(); public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { @@ -129,5 +132,12 @@ namespace mRemoteNG.Config.Putty } } #endregion - } + + public event NotifyCollectionChangedEventHandler PuttySessionsCollectionChanged; + + protected void RaiseCollectionChangedEvent(NotifyCollectionChangedEventArgs args) + { + PuttySessionsCollectionChanged?.Invoke(this, args); + } + } } \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs index b2cf25594..f0d7665cc 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs @@ -80,7 +80,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages if (puttyPathChanged) { PuttyBase.PuttyPath = Settings.Default.UseCustomPuttyPath ? Settings.Default.CustomPuttyPath : GeneralAppInfo.PuttyPath; - PuttySessionsManager.AddSessionsToTree(); + PuttySessionsManager.Instance.AddSessionsToTree(); } Settings.Default.MaxPuttyWaitTime = (int) numPuttyWaitTime.Value; diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 71ca0916b..a7fa0401f 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -157,7 +157,7 @@ namespace mRemoteNG.UI.Forms Windows.treePanel.Focus(); ConnectionTree.TreeView = Windows.treeForm.tvConnections; - PuttySessionsManager.StartWatcher(); + PuttySessionsManager.Instance.StartWatcher(); if (Settings.Default.StartupComponentsCheck) { Windows.Show(WindowType.ComponentsCheck); From 0907a1982116f7748d17b39d012c4500506f92eb Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:12:46 -0600 Subject: [PATCH 161/338] Renamed PuttySessionManager.AddSessionsToTree to just AddSessions to reflect that it does not directly work on any tree objects. Implemented the CollectionChanged event for the sessions providers collection --- .../Config/Connections/ConnectionsLoader.cs | 2 +- .../Config/Putty/PuttySessionsManager.cs | 74 +++++++++++-------- .../UI/Forms/OptionsPages/AdvancedPage.cs | 2 +- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 1b9ef0c47..567127c31 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -67,7 +67,7 @@ namespace mRemoteNG.Config.Connections frmMain.Default.ConnectionsFileName = ConnectionFileName; if (import) return; - PuttySessionsManager.Instance.AddSessionsToTree(); + PuttySessionsManager.Instance.AddSessions(); Runtime.ConnectionTreeModel.RootNodes.AddRange(PuttySessionsManager.Instance.RootPuttySessionsNodes); } } diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index e581598d7..16f42badb 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -11,31 +11,27 @@ namespace mRemoteNG.Config.Putty { public static PuttySessionsManager Instance { get; } = new PuttySessionsManager(); - private List _providers; - public IEnumerable Providers - { - get - { - if (_providers == null || _providers.Count == 0) - AddProviders(); - return _providers; - } - } - public List RootPuttySessionsNodes { get; } = new List(); + private readonly List _providers = new List(); + public IEnumerable Providers => _providers; + public List RootPuttySessionsNodes { get; } = new List(); + + private PuttySessionsManager() + { + AddProvider(new PuttySessionsRegistryProvider()); + AddProvider(new PuttySessionsXmingProvider()); + } - private PuttySessionsManager() - { } #region Public Methods - public void AddSessionsToTree() + public void AddSessions() { foreach (var provider in Providers) { - AddSessionsToTreeForProvider(provider); + AddSessionsFromProvider(provider); } } - private void AddSessionsToTreeForProvider(AbstractPuttySessionsProvider provider) + private void AddSessionsFromProvider(AbstractPuttySessionsProvider provider) { var rootTreeNode = provider.RootInfo; provider.GetSessions(); @@ -62,24 +58,33 @@ namespace mRemoteNG.Config.Putty provider.SessionChanged -= SessionChanged; } } - - public void SessionChanged(object sender, AbstractPuttySessionsProvider.SessionChangedEventArgs e) + + public void AddProvider(AbstractPuttySessionsProvider newProvider) + { + _providers.Add(newProvider); + RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newProvider)); + } + + public void AddProviders(IEnumerable newProviders) + { + _providers.AddRange(newProviders); + RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newProviders)); + } + + public void RemoveProvider(AbstractPuttySessionsProvider providerToRemove) + { + var wasRemoved = _providers.Remove(providerToRemove); + if (wasRemoved) + RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, providerToRemove)); + } + + public void SessionChanged(object sender, AbstractPuttySessionsProvider.SessionChangedEventArgs e) { - AddSessionsToTree(); + AddSessions(); } #endregion - + #region Private Methods - public void AddProvider(AbstractPuttySessionsProvider provider) - { - _providers.Add(provider); - } - - private void AddProviders() - { - _providers = new List {new PuttySessionsRegistryProvider(), new PuttySessionsXmingProvider()}; - } - private string[] GetSessionNames(bool raw = false) { var sessionNames = new List(); @@ -135,9 +140,16 @@ namespace mRemoteNG.Config.Putty public event NotifyCollectionChangedEventHandler PuttySessionsCollectionChanged; - protected void RaiseCollectionChangedEvent(NotifyCollectionChangedEventArgs args) + protected void RaisePuttySessionCollectionChangedEvent(NotifyCollectionChangedEventArgs args) { PuttySessionsCollectionChanged?.Invoke(this, args); } + + public event NotifyCollectionChangedEventHandler SessionProvidersCollectionChanged; + + protected void RaiseSessionProvidersCollectionChangedEvent(NotifyCollectionChangedEventArgs args) + { + SessionProvidersCollectionChanged?.Invoke(this, args); + } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs index f0d7665cc..6cb5e7807 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/AdvancedPage.cs @@ -80,7 +80,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages if (puttyPathChanged) { PuttyBase.PuttyPath = Settings.Default.UseCustomPuttyPath ? Settings.Default.CustomPuttyPath : GeneralAppInfo.PuttyPath; - PuttySessionsManager.Instance.AddSessionsToTree(); + PuttySessionsManager.Instance.AddSessions(); } Settings.Default.MaxPuttyWaitTime = (int) numPuttyWaitTime.Value; From fb315fd7824e9975c9e10ab43985366964597613 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:23:03 -0600 Subject: [PATCH 162/338] Moved the SessionChangedEventArgs to its own class file. Embeded classes are generally not a good idea --- mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs | 3 --- mRemoteV1/Config/Putty/SessionChangedEventArgs.cs | 9 +++++++++ mRemoteV1/mRemoteV1.csproj | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 mRemoteV1/Config/Putty/SessionChangedEventArgs.cs diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index a5b49c36f..28434413f 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -50,9 +50,6 @@ namespace mRemoteNG.Config.Putty #endregion #region Public Classes - public class SessionChangedEventArgs : EventArgs - { - } #endregion #region Protected Methods diff --git a/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs b/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs new file mode 100644 index 000000000..cbccee048 --- /dev/null +++ b/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs @@ -0,0 +1,9 @@ +using System; + + +namespace mRemoteNG.Config.Putty +{ + public class SessionChangedEventArgs : EventArgs + { + } +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 6eddc4201..d1c840c14 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -149,6 +149,7 @@ + From cdc6567628d7923a67cc8c77ee71d925f0926c65 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:23:46 -0600 Subject: [PATCH 163/338] Forgot to commit this change to the Args change --- mRemoteV1/Config/Putty/PuttySessionsManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index 16f42badb..f6a82bfda 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -78,7 +78,7 @@ namespace mRemoteNG.Config.Putty RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, providerToRemove)); } - public void SessionChanged(object sender, AbstractPuttySessionsProvider.SessionChangedEventArgs e) + public void SessionChanged(object sender, SessionChangedEventArgs e) { AddSessions(); } From d7c339ccea00134e685989319b79b1124e1ec690 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:24:42 -0600 Subject: [PATCH 164/338] Refactored some of the eventing code in AbstractPuttySessionsProvider to make it less complex --- .../Putty/AbstractPuttySessionsProvider.cs | 23 ++++--------------- .../Putty/PuttySessionsRegistryProvider.cs | 2 +- .../Putty/PuttySessionsXmingProvider.cs | 4 ++-- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 28434413f..416157092 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -34,29 +34,14 @@ namespace mRemoteNG.Config.Putty #region Public Events public delegate void SessionChangedEventHandler(object sender, SessionChangedEventArgs e); - private SessionChangedEventHandler SessionChangedEvent; - - public event SessionChangedEventHandler SessionChanged - { - add - { - SessionChangedEvent = (SessionChangedEventHandler) Delegate.Combine(SessionChangedEvent, value); - } - remove - { - SessionChangedEvent = (SessionChangedEventHandler) Delegate.Remove(SessionChangedEvent, value); - } - } - #endregion - - #region Public Classes + public event SessionChangedEventHandler SessionChanged; #endregion #region Protected Methods - protected virtual void OnSessionChanged(SessionChangedEventArgs e) + protected virtual void RaiseSessionChangedEvent(SessionChangedEventArgs e) { - SessionChangedEvent?.Invoke(this, new SessionChangedEventArgs()); + SessionChanged?.Invoke(this, new SessionChangedEventArgs()); } #endregion - } + } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs index 7e1c028d0..1be96a51f 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs @@ -129,7 +129,7 @@ namespace mRemoteNG.Config.Putty private void OnManagementEventArrived(object sender, EventArrivedEventArgs e) { - OnSessionChanged(new SessionChangedEventArgs()); + RaiseSessionChangedEvent(new SessionChangedEventArgs()); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index f63e24738..0ddcb22ff 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -203,12 +203,12 @@ namespace mRemoteNG.Config.Putty private void OnFileSystemEventArrived(object sender, FileSystemEventArgs e) { - OnSessionChanged(new SessionChangedEventArgs()); + RaiseSessionChangedEvent(new SessionChangedEventArgs()); } private void OnRegistrySessionChanged(object sender, SessionChangedEventArgs e) { - OnSessionChanged(new SessionChangedEventArgs()); + RaiseSessionChangedEvent(new SessionChangedEventArgs()); } #endregion From 28fa043b3228d1426a83531802d25db8b3e656c4 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:35:20 -0600 Subject: [PATCH 165/338] Added support to the SessionChangedEventArgs to allow providing which session changed --- .../Putty/AbstractPuttySessionsProvider.cs | 18 +++++++----------- .../Config/Putty/SessionChangedEventArgs.cs | 7 +++++++ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 416157092..d4cb19ea8 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -14,7 +14,7 @@ namespace mRemoteNG.Config.Putty #region Public Methods public abstract string[] GetSessionNames(bool raw = false); public abstract PuttySessionInfo GetSession(string sessionName); - + public virtual IEnumerable GetSessions() { foreach (var sessionName in GetSessionNames(true)) @@ -26,22 +26,18 @@ namespace mRemoteNG.Config.Putty } return RootInfo.Children.OfType(); } - + public virtual void StartWatcher() { } - + public virtual void StopWatcher() { } #endregion - - #region Public Events + public delegate void SessionChangedEventHandler(object sender, SessionChangedEventArgs e); public event SessionChangedEventHandler SessionChanged; - #endregion - - #region Protected Methods - protected virtual void RaiseSessionChangedEvent(SessionChangedEventArgs e) + + protected virtual void RaiseSessionChangedEvent(SessionChangedEventArgs args) { - SessionChanged?.Invoke(this, new SessionChangedEventArgs()); + SessionChanged?.Invoke(this, args); } - #endregion } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs b/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs index cbccee048..31270e3c6 100644 --- a/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs +++ b/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs @@ -1,9 +1,16 @@ using System; +using mRemoteNG.Connection; namespace mRemoteNG.Config.Putty { public class SessionChangedEventArgs : EventArgs { + public PuttySessionInfo Session { get; set; } + + public SessionChangedEventArgs(PuttySessionInfo sessionChanged = null) + { + Session = sessionChanged; + } } } \ No newline at end of file From 6a7dedfe674baa35454f97745a066fee1ac75fb8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:35:58 -0600 Subject: [PATCH 166/338] Renamed SessionChangedEventArgs to PuttySessionChangedEventArgs --- mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs | 4 ++-- ...nChangedEventArgs.cs => PuttySessionChangedEventArgs.cs} | 4 ++-- mRemoteV1/Config/Putty/PuttySessionsManager.cs | 2 +- mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs | 2 +- mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs | 6 +++--- mRemoteV1/mRemoteV1.csproj | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) rename mRemoteV1/Config/Putty/{SessionChangedEventArgs.cs => PuttySessionChangedEventArgs.cs} (59%) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index d4cb19ea8..a02f82685 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -32,10 +32,10 @@ namespace mRemoteNG.Config.Putty public virtual void StopWatcher() { } #endregion - public delegate void SessionChangedEventHandler(object sender, SessionChangedEventArgs e); + public delegate void SessionChangedEventHandler(object sender, PuttySessionChangedEventArgs e); public event SessionChangedEventHandler SessionChanged; - protected virtual void RaiseSessionChangedEvent(SessionChangedEventArgs args) + protected virtual void RaiseSessionChangedEvent(PuttySessionChangedEventArgs args) { SessionChanged?.Invoke(this, args); } diff --git a/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs b/mRemoteV1/Config/Putty/PuttySessionChangedEventArgs.cs similarity index 59% rename from mRemoteV1/Config/Putty/SessionChangedEventArgs.cs rename to mRemoteV1/Config/Putty/PuttySessionChangedEventArgs.cs index 31270e3c6..febb5f425 100644 --- a/mRemoteV1/Config/Putty/SessionChangedEventArgs.cs +++ b/mRemoteV1/Config/Putty/PuttySessionChangedEventArgs.cs @@ -4,11 +4,11 @@ using mRemoteNG.Connection; namespace mRemoteNG.Config.Putty { - public class SessionChangedEventArgs : EventArgs + public class PuttySessionChangedEventArgs : EventArgs { public PuttySessionInfo Session { get; set; } - public SessionChangedEventArgs(PuttySessionInfo sessionChanged = null) + public PuttySessionChangedEventArgs(PuttySessionInfo sessionChanged = null) { Session = sessionChanged; } diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index f6a82bfda..2167a9c21 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -78,7 +78,7 @@ namespace mRemoteNG.Config.Putty RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, providerToRemove)); } - public void SessionChanged(object sender, SessionChangedEventArgs e) + public void SessionChanged(object sender, PuttySessionChangedEventArgs e) { AddSessions(); } diff --git a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs index 1be96a51f..3de295059 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs @@ -129,7 +129,7 @@ namespace mRemoteNG.Config.Putty private void OnManagementEventArrived(object sender, EventArrivedEventArgs e) { - RaiseSessionChangedEvent(new SessionChangedEventArgs()); + RaiseSessionChangedEvent(new PuttySessionChangedEventArgs()); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index 0ddcb22ff..8d506879b 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -203,12 +203,12 @@ namespace mRemoteNG.Config.Putty private void OnFileSystemEventArrived(object sender, FileSystemEventArgs e) { - RaiseSessionChangedEvent(new SessionChangedEventArgs()); + RaiseSessionChangedEvent(new PuttySessionChangedEventArgs()); } - private void OnRegistrySessionChanged(object sender, SessionChangedEventArgs e) + private void OnRegistrySessionChanged(object sender, PuttySessionChangedEventArgs e) { - RaiseSessionChangedEvent(new SessionChangedEventArgs()); + RaiseSessionChangedEvent(new PuttySessionChangedEventArgs()); } #endregion diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index d1c840c14..b4941365c 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -149,7 +149,7 @@ - + From 45e641067b050ed5e6b4e0ae8245b71fff6963a2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:36:39 -0600 Subject: [PATCH 167/338] Renamed SessionChangedEventHandler to PuttySessionChangedEventHandler --- mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index a02f82685..22b6551c5 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -32,8 +32,8 @@ namespace mRemoteNG.Config.Putty public virtual void StopWatcher() { } #endregion - public delegate void SessionChangedEventHandler(object sender, PuttySessionChangedEventArgs e); - public event SessionChangedEventHandler SessionChanged; + public delegate void PuttySessionChangedEventHandler(object sender, PuttySessionChangedEventArgs e); + public event PuttySessionChangedEventHandler SessionChanged; protected virtual void RaiseSessionChangedEvent(PuttySessionChangedEventArgs args) { From 9a1327372679544459b0a3e66954af7f9c204b38 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:37:39 -0600 Subject: [PATCH 168/338] Renamed event SessionChanged to PuttySessionChanged --- mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs | 4 ++-- mRemoteV1/Config/Putty/PuttySessionsManager.cs | 6 +++--- mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 22b6551c5..4276dcd19 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -33,11 +33,11 @@ namespace mRemoteNG.Config.Putty #endregion public delegate void PuttySessionChangedEventHandler(object sender, PuttySessionChangedEventArgs e); - public event PuttySessionChangedEventHandler SessionChanged; + public event PuttySessionChangedEventHandler PuttySessionChanged; protected virtual void RaiseSessionChangedEvent(PuttySessionChangedEventArgs args) { - SessionChanged?.Invoke(this, args); + PuttySessionChanged?.Invoke(this, args); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index 2167a9c21..5e0b53665 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -46,7 +46,7 @@ namespace mRemoteNG.Config.Putty foreach (var provider in Providers) { provider.StartWatcher(); - provider.SessionChanged += SessionChanged; + provider.PuttySessionChanged += PuttySessionChanged; } } @@ -55,7 +55,7 @@ namespace mRemoteNG.Config.Putty foreach (var provider in Providers) { provider.StopWatcher(); - provider.SessionChanged -= SessionChanged; + provider.PuttySessionChanged -= PuttySessionChanged; } } @@ -78,7 +78,7 @@ namespace mRemoteNG.Config.Putty RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, providerToRemove)); } - public void SessionChanged(object sender, PuttySessionChangedEventArgs e) + public void PuttySessionChanged(object sender, PuttySessionChangedEventArgs e) { AddSessions(); } diff --git a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index 8d506879b..a4b2310fe 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -124,7 +124,7 @@ namespace mRemoteNG.Config.Putty public override void StartWatcher() { PuttySessionsRegistryProvider.StartWatcher(); - PuttySessionsRegistryProvider.SessionChanged += OnRegistrySessionChanged; + PuttySessionsRegistryProvider.PuttySessionChanged += OnRegistrySessionChanged; if (_eventWatcher != null) { @@ -152,7 +152,7 @@ namespace mRemoteNG.Config.Putty public override void StopWatcher() { PuttySessionsRegistryProvider.StopWatcher(); - PuttySessionsRegistryProvider.SessionChanged -= OnRegistrySessionChanged; + PuttySessionsRegistryProvider.PuttySessionChanged -= OnRegistrySessionChanged; if (_eventWatcher == null) { From 55e48742a9c28e9b9db5b7a500f14e2d190b0667 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 10:48:20 -0600 Subject: [PATCH 169/338] Code cleanup --- .../Putty/AbstractPuttySessionsProvider.cs | 1 - .../Putty/PuttySessionsRegistryProvider.cs | 21 ++++--------------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 4276dcd19..fb469920b 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System; using System.Linq; using mRemoteNG.Connection; using mRemoteNG.Root.PuttySessions; diff --git a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs index 3de295059..7956a757c 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs @@ -21,10 +21,7 @@ namespace mRemoteNG.Config.Putty public override string[] GetSessionNames(bool raw = false) { var sessionsKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey); - if (sessionsKey == null) - { - return new string[] {}; - } + if (sessionsKey == null) return new string[] {}; var sessionNames = new List(); foreach (var sessionName in sessionsKey.GetSubKeyNames()) @@ -43,12 +40,8 @@ namespace mRemoteNG.Config.Putty public override PuttySessionInfo GetSession(string sessionName) { var sessionsKey = Registry.CurrentUser.OpenSubKey(PuttySessionsKey); - var sessionKey = sessionsKey?.OpenSubKey(sessionName); - if (sessionKey == null) - { - return null; - } + if (sessionKey == null) return null; sessionName = HttpUtility.UrlDecode(sessionName.Replace("+", "%2B")); @@ -95,10 +88,7 @@ namespace mRemoteNG.Config.Putty public override void StartWatcher() { - if (_eventWatcher != null) - { - return ; - } + if (_eventWatcher != null) return; try { @@ -117,10 +107,7 @@ namespace mRemoteNG.Config.Putty public override void StopWatcher() { - if (_eventWatcher == null) - { - return ; - } + if (_eventWatcher == null) return; _eventWatcher.Stop(); _eventWatcher.Dispose(); _eventWatcher = null; From 6c5fedb63147c8554b0ac85a8c985d82ff436f10 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 11:13:45 -0600 Subject: [PATCH 170/338] Made the puttyrootnode property on puttysessionsproviders virtual to allow overriding --- mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs | 2 +- mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index fb469920b..973e33b9b 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -8,7 +8,7 @@ namespace mRemoteNG.Config.Putty { public abstract class AbstractPuttySessionsProvider { - public RootPuttySessionsNodeInfo RootInfo { get; } = new RootPuttySessionsNodeInfo(); + public virtual RootPuttySessionsNodeInfo RootInfo { get; } = new RootPuttySessionsNodeInfo(); #region Public Methods public abstract string[] GetSessionNames(bool raw = false); diff --git a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index a4b2310fe..79278964d 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -7,12 +7,14 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; +using mRemoteNG.Root.PuttySessions; namespace mRemoteNG.Config.Putty { public class PuttySessionsXmingProvider : AbstractPuttySessionsProvider { + public override RootPuttySessionsNodeInfo RootInfo { get; } = new RootPuttySessionsNodeInfo { Name = "Xming Putty Sessions" }; private const string RegistrySessionNameFormat = "{0} [registry]"; private const string RegistrySessionNamePattern = "(.*)\\ \\[registry\\]"; private static readonly PuttySessionsRegistryProvider PuttySessionsRegistryProvider = new PuttySessionsRegistryProvider(); From 1bda39bc7e3136c1d384ddca9f85b9a834583c9e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 11:29:05 -0600 Subject: [PATCH 171/338] Implemented collectionchanged event on puttysessionprovider --- .../Putty/AbstractPuttySessionsProvider.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 973e33b9b..3fb333f01 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Collections.Specialized; using System.Linq; using mRemoteNG.Connection; using mRemoteNG.Root.PuttySessions; @@ -19,12 +20,18 @@ namespace mRemoteNG.Config.Putty foreach (var sessionName in GetSessionNames(true)) { var sessionInfo = GetSession(sessionName); - if (string.IsNullOrEmpty(sessionInfo?.Hostname) || RootInfo.Children.Any(child => child.Name == sessionInfo.Name)) - continue; - RootInfo.AddChild(sessionInfo); + AddSession(sessionInfo); } return RootInfo.Children.OfType(); } + + protected virtual void AddSession(PuttySessionInfo sessionInfo) + { + if (string.IsNullOrEmpty(sessionInfo?.Name) || RootInfo.Children.Any(child => child.Name == sessionInfo.Name)) + return; + RootInfo.AddChild(sessionInfo); + RaisePuttySessionCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, sessionInfo)); + } public virtual void StartWatcher() { } @@ -38,5 +45,12 @@ namespace mRemoteNG.Config.Putty { PuttySessionChanged?.Invoke(this, args); } + + public event NotifyCollectionChangedEventHandler PuttySessionsCollectionChanged; + + protected void RaisePuttySessionCollectionChangedEvent(NotifyCollectionChangedEventArgs args) + { + PuttySessionsCollectionChanged?.Invoke(this, args); + } } } \ No newline at end of file From a938e098e528c9b669f17774f424ede6a44bf80b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 11:36:45 -0600 Subject: [PATCH 172/338] Added support for propogating child session collection changed events --- mRemoteV1/Config/Putty/PuttySessionsManager.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index 5e0b53665..6510a26c8 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -61,21 +61,24 @@ namespace mRemoteNG.Config.Putty public void AddProvider(AbstractPuttySessionsProvider newProvider) { + if (_providers.Contains(newProvider)) return; _providers.Add(newProvider); + newProvider.PuttySessionsCollectionChanged += PuttySessionsCollectionChanged; RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newProvider)); } public void AddProviders(IEnumerable newProviders) { - _providers.AddRange(newProviders); - RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newProviders)); + foreach (var provider in newProviders) + AddProvider(provider); } public void RemoveProvider(AbstractPuttySessionsProvider providerToRemove) { - var wasRemoved = _providers.Remove(providerToRemove); - if (wasRemoved) - RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, providerToRemove)); + if (!_providers.Contains(providerToRemove)) return; + _providers.Remove(providerToRemove); + providerToRemove.PuttySessionsCollectionChanged -= PuttySessionsCollectionChanged; + RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, providerToRemove)); } public void PuttySessionChanged(object sender, PuttySessionChangedEventArgs e) From 941e3d5904ec23bddef475a6c0bc7cd175de780d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 12:00:04 -0600 Subject: [PATCH 173/338] Added putty model update code to tree view. Adding putty sessions works as expected --- mRemoteV1/Config/Putty/PuttySessionsManager.cs | 14 ++++++-------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 8 ++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/mRemoteV1/Config/Putty/PuttySessionsManager.cs b/mRemoteV1/Config/Putty/PuttySessionsManager.cs index 6510a26c8..19f293f1c 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsManager.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsManager.cs @@ -63,7 +63,7 @@ namespace mRemoteNG.Config.Putty { if (_providers.Contains(newProvider)) return; _providers.Add(newProvider); - newProvider.PuttySessionsCollectionChanged += PuttySessionsCollectionChanged; + newProvider.PuttySessionsCollectionChanged += RaisePuttySessionCollectionChangedEvent; RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newProvider)); } @@ -77,7 +77,7 @@ namespace mRemoteNG.Config.Putty { if (!_providers.Contains(providerToRemove)) return; _providers.Remove(providerToRemove); - providerToRemove.PuttySessionsCollectionChanged -= PuttySessionsCollectionChanged; + providerToRemove.PuttySessionsCollectionChanged -= RaisePuttySessionCollectionChangedEvent; RaiseSessionProvidersCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, providerToRemove)); } @@ -142,14 +142,12 @@ namespace mRemoteNG.Config.Putty #endregion public event NotifyCollectionChangedEventHandler PuttySessionsCollectionChanged; - - protected void RaisePuttySessionCollectionChangedEvent(NotifyCollectionChangedEventArgs args) - { - PuttySessionsCollectionChanged?.Invoke(this, args); - } + protected void RaisePuttySessionCollectionChangedEvent(object sender, NotifyCollectionChangedEventArgs args) + { + PuttySessionsCollectionChanged?.Invoke(sender, args); + } public event NotifyCollectionChangedEventHandler SessionProvidersCollectionChanged; - protected void RaiseSessionProvidersCollectionChangedEvent(NotifyCollectionChangedEventArgs args) { SessionProvidersCollectionChanged?.Invoke(this, args); diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index dabd1a761..b55470a29 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -9,6 +9,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; using BrightIdeasSoftware; +using mRemoteNG.Config.Putty; using mRemoteNG.Root.PuttySessions; using mRemoteNG.Tools; using mRemoteNG.Tree.Root; @@ -24,6 +25,7 @@ namespace mRemoteNG.UI.Window private readonly ConnectionTreeDragAndDropHandler _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); private NodeSearcher _nodeSearcher; private readonly ConnectionContextMenu _contextMenu = new ConnectionContextMenu(); + private readonly PuttySessionsManager _puttySessionsManager = PuttySessionsManager.Instance; public ConnectionInfo SelectedNode => (ConnectionInfo) olvConnections.SelectedObject; @@ -104,6 +106,7 @@ namespace mRemoteNG.UI.Window SetTreeEventHandlers(); SetContextMenuEventHandlers(); SetMenuEventHandlers(); + SetModelUpdateHandlers(); } private void SetTreeEventHandlers() @@ -170,6 +173,11 @@ namespace mRemoteNG.UI.Window mMenSortAscending.Click += (sender, args) => SortNodesRecursive(GetRootConnectionNode(), ListSortDirection.Ascending); } + private void SetModelUpdateHandlers() + { + _puttySessionsManager.PuttySessionsCollectionChanged += (sender, args) => RefreshTreeObjects(olvConnections.Objects.OfType().ToList()); + } + private void PopulateTreeView() { olvConnections.SetObjects(ConnectionTreeModel.RootNodes); From 688dbd1ce9263592c539d80910f7cfe2da5b1ea9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 12:07:05 -0600 Subject: [PATCH 174/338] Added a convenience property and a way to remove sessions that triggers eventing --- .../Config/Putty/AbstractPuttySessionsProvider.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 3fb333f01..7ef17ab5a 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -10,6 +10,7 @@ namespace mRemoteNG.Config.Putty public abstract class AbstractPuttySessionsProvider { public virtual RootPuttySessionsNodeInfo RootInfo { get; } = new RootPuttySessionsNodeInfo(); + protected virtual List Sessions => RootInfo.Children.OfType().ToList(); #region Public Methods public abstract string[] GetSessionNames(bool raw = false); @@ -22,16 +23,23 @@ namespace mRemoteNG.Config.Putty var sessionInfo = GetSession(sessionName); AddSession(sessionInfo); } - return RootInfo.Children.OfType(); + return Sessions; } protected virtual void AddSession(PuttySessionInfo sessionInfo) { - if (string.IsNullOrEmpty(sessionInfo?.Name) || RootInfo.Children.Any(child => child.Name == sessionInfo.Name)) + if (string.IsNullOrEmpty(sessionInfo?.Name) || Sessions.Any(child => child.Name == sessionInfo.Name)) return; RootInfo.AddChild(sessionInfo); RaisePuttySessionCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, sessionInfo)); } + + protected virtual void RemoveSession(PuttySessionInfo sessionInfo) + { + if (!Sessions.Contains(sessionInfo)) return; + RootInfo.RemoveChild(sessionInfo); + RaisePuttySessionCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, sessionInfo)); + } public virtual void StartWatcher() { } @@ -40,14 +48,12 @@ namespace mRemoteNG.Config.Putty public delegate void PuttySessionChangedEventHandler(object sender, PuttySessionChangedEventArgs e); public event PuttySessionChangedEventHandler PuttySessionChanged; - protected virtual void RaiseSessionChangedEvent(PuttySessionChangedEventArgs args) { PuttySessionChanged?.Invoke(this, args); } public event NotifyCollectionChangedEventHandler PuttySessionsCollectionChanged; - protected void RaisePuttySessionCollectionChangedEvent(NotifyCollectionChangedEventArgs args) { PuttySessionsCollectionChanged?.Invoke(this, args); From 62b1402b43c630199a867d4de4b36cb3c2317396 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 12:23:55 -0600 Subject: [PATCH 175/338] Removing putty sessions now updates the treelistview as expected --- .../Putty/AbstractPuttySessionsProvider.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 7ef17ab5a..999a27253 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -18,14 +18,34 @@ namespace mRemoteNG.Config.Putty public virtual IEnumerable GetSessions() { - foreach (var sessionName in GetSessionNames(true)) + var sessionNamesFromProvider = GetSessionNames(true); + foreach (var sessionName in GetSessionNamesToAdd(sessionNamesFromProvider)) { var sessionInfo = GetSession(sessionName); AddSession(sessionInfo); } + foreach (var session in GetSessionToRemove(sessionNamesFromProvider)) + { + RemoveSession(session); + } + RootInfo.SortRecursive(); return Sessions; } + private IEnumerable GetSessionNamesToAdd(IEnumerable sessionNamesFromProvider) + { + var currentlyKnownSessionNames = Sessions.Select(session => session.Name); + var sessionNamesToAdd = sessionNamesFromProvider.Except(currentlyKnownSessionNames); + return sessionNamesToAdd; + } + + private IEnumerable GetSessionToRemove(IEnumerable sessionNamesFromProvider) + { + var currentlyKnownSessionNames = Sessions.Select(session => session.Name); + var sessionNamesToRemove = currentlyKnownSessionNames.Except(sessionNamesFromProvider); + return Sessions.Where(session => sessionNamesToRemove.Contains(session.Name)); + } + protected virtual void AddSession(PuttySessionInfo sessionInfo) { if (string.IsNullOrEmpty(sessionInfo?.Name) || Sessions.Any(child => child.Name == sessionInfo.Name)) From 75b4ea175b022976062316db11682f5150898b6a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 12:27:20 -0600 Subject: [PATCH 176/338] Small cleanup --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index b55470a29..60c6226c9 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -4,6 +4,7 @@ using mRemoteNG.Container; using mRemoteNG.Tree; using System; using System.Collections; +using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; @@ -175,7 +176,7 @@ namespace mRemoteNG.UI.Window private void SetModelUpdateHandlers() { - _puttySessionsManager.PuttySessionsCollectionChanged += (sender, args) => RefreshTreeObjects(olvConnections.Objects.OfType().ToList()); + _puttySessionsManager.PuttySessionsCollectionChanged += (sender, args) => RefreshTreeObjects(GetRootPuttyNodes().ToList()); } private void PopulateTreeView() @@ -198,6 +199,11 @@ namespace mRemoteNG.UI.Window return (RootNodeInfo)olvConnections.Roots.Cast().First(item => item is RootNodeInfo); } + private IEnumerable GetRootPuttyNodes() + { + return olvConnections.Objects.OfType(); + } + #region Form Stuff private void Tree_Load(object sender, EventArgs e) { From 81a944a95c7101fdae8c6325be88364bdbd0db45 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 13:01:17 -0600 Subject: [PATCH 177/338] ContainerInfo objects now subscribe to child collection changed events --- mRemoteV1/Container/ContainerInfo.cs | 36 +++++++++++++++++++--------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 6626cda3e..73bd50875 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -40,8 +40,8 @@ namespace mRemoteNG.Container if (Children.Contains(newChildItem)) return; newChildItem.Parent = this; Children.Add(newChildItem); - newChildItem.PropertyChanged += OnPropertyChanged; - RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newChildItem)); + SubscribeToChildEvents(newChildItem); + RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newChildItem)); } public void AddChildRange(IEnumerable newChildren) @@ -57,8 +57,8 @@ namespace mRemoteNG.Container if (!Children.Contains(removalTarget)) return; removalTarget.Parent = null; Children.Remove(removalTarget); - removalTarget.PropertyChanged -= OnPropertyChanged; - RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, removalTarget)); + UnsubscribeToChildEvents(removalTarget); + RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, removalTarget)); } public void RemoveChildRange(IEnumerable removalTargets) @@ -76,7 +76,7 @@ namespace mRemoteNG.Container Children.Remove(child); if (newIndex > Children.Count) newIndex = Children.Count; Children.Insert(newIndex, child); - RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, child, newIndex, originalIndex)); + RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, child, newIndex, originalIndex)); } public void SetChildAbove(ConnectionInfo childToPromote, ConnectionInfo reference) @@ -126,7 +126,7 @@ namespace mRemoteNG.Container SortDirection = sortDirection }; Children.Sort(connectionComparer); - RaiseCollectionChangedEvent(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } public void SortRecursive(ListSortDirection sortDirection = ListSortDirection.Ascending) @@ -200,12 +200,26 @@ namespace mRemoteNG.Container return childList; } - public event NotifyCollectionChangedEventHandler CollectionChanged; - - private void RaiseCollectionChangedEvent(NotifyCollectionChangedEventArgs args) + protected virtual void SubscribeToChildEvents(ConnectionInfo child) { - var handler = CollectionChanged; - handler?.Invoke(this, args); + child.PropertyChanged += OnPropertyChanged; + var childAsContainer = child as ContainerInfo; + if (childAsContainer == null) return; + childAsContainer.CollectionChanged += RaiseCollectionChangedEvent; + } + + protected virtual void UnsubscribeToChildEvents(ConnectionInfo child) + { + child.PropertyChanged -= OnPropertyChanged; + var childAsContainer = child as ContainerInfo; + if (childAsContainer == null) return; + childAsContainer.CollectionChanged -= RaiseCollectionChangedEvent; + } + + public event NotifyCollectionChangedEventHandler CollectionChanged; + private void RaiseCollectionChangedEvent(object sender, NotifyCollectionChangedEventArgs args) + { + CollectionChanged?.Invoke(sender, args); } } } \ No newline at end of file From 522d13904415db216b76e6516fdf09af2a5b2c9c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 13:02:15 -0600 Subject: [PATCH 178/338] ConnectionTreeModel now listens for and propogates collection changed events on child members --- mRemoteV1/Tree/ConnectionTreeModel.cs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index 3859ec2da..e50e6c33f 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Collections.Specialized; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Tree.Root; @@ -6,13 +7,24 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Tree { - public class ConnectionTreeModel + public class ConnectionTreeModel : INotifyCollectionChanged { public List RootNodes { get; } = new List(); public void AddRootNode(ContainerInfo rootNode) { + if (RootNodes.Contains(rootNode)) return; RootNodes.Add(rootNode); + rootNode.CollectionChanged += RaiseCollectionChangedEvent; + RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, rootNode)); + } + + public void RemoveRootNode(ContainerInfo rootNode) + { + if (!RootNodes.Contains(rootNode)) return; + rootNode.CollectionChanged -= RaiseCollectionChangedEvent; + RootNodes.Remove(rootNode); + RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, rootNode)); } public IEnumerable GetRecursiveChildList() @@ -52,5 +64,11 @@ namespace mRemoteNG.Tree { connectionInfo.Clone(); } + + public event NotifyCollectionChangedEventHandler CollectionChanged; + private void RaiseCollectionChangedEvent(object sender, NotifyCollectionChangedEventArgs args) + { + CollectionChanged?.Invoke(sender, args); + } } } \ No newline at end of file From 10420d9e7f7dda8fd87e92d5eb71dfb9274b3d29 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 13:03:25 -0600 Subject: [PATCH 179/338] ConnectionTreeWindow now updates its treelistview based on eventing from its ConnectionTreeModel --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 35 +++++++++++++++------ 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 60c6226c9..c8c8d75d3 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -5,6 +5,7 @@ using mRemoteNG.Tree; using System; using System.Collections; using System.Collections.Generic; +using System.Collections.Specialized; using System.ComponentModel; using System.Drawing; using System.Linq; @@ -107,7 +108,6 @@ namespace mRemoteNG.UI.Window SetTreeEventHandlers(); SetContextMenuEventHandlers(); SetMenuEventHandlers(); - SetModelUpdateHandlers(); } private void SetTreeEventHandlers() @@ -177,11 +177,13 @@ namespace mRemoteNG.UI.Window private void SetModelUpdateHandlers() { _puttySessionsManager.PuttySessionsCollectionChanged += (sender, args) => RefreshTreeObjects(GetRootPuttyNodes().ToList()); + ConnectionTreeModel.CollectionChanged += HandleCollectionChanged; } private void PopulateTreeView() { olvConnections.SetObjects(ConnectionTreeModel.RootNodes); + SetModelUpdateHandlers(); _nodeSearcher = new NodeSearcher(ConnectionTreeModel); ExpandPreviouslyOpenedFolders(); ExpandRootConnectionNode(); @@ -274,7 +276,6 @@ namespace mRemoteNG.UI.Window var newNode = SelectedNode.Clone(); newNode.Parent.SetChildBelow(newNode, SelectedNode); Runtime.SaveConnectionsBG(); - RefreshTreeObject(SelectedNode); } public void RenameSelectedNode() @@ -288,7 +289,6 @@ namespace mRemoteNG.UI.Window if (!UserConfirmsDeletion()) return; ConnectionTreeModel.DeleteNode(SelectedNode); Runtime.SaveConnectionsBG(); - RefreshTreeObject(SelectedNode); } private bool UserConfirmsDeletion() @@ -404,6 +404,29 @@ namespace mRemoteNG.UI.Window } } + private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs args) + { + switch (args?.Action) + { + case NotifyCollectionChangedAction.Add: + RefreshTreeObject(sender); + break; + case NotifyCollectionChangedAction.Remove: + RefreshTreeObjects(args.OldItems); + break; + case NotifyCollectionChangedAction.Move: + RefreshTreeObject(sender); + break; + case NotifyCollectionChangedAction.Reset: + RefreshTreeObject(sender); + break; + case NotifyCollectionChangedAction.Replace: + break; + case null: + break; + } + } + private void RefreshTreeObject(object modelObject) { RefreshTreeObjects(new[] { modelObject }); @@ -435,28 +458,24 @@ namespace mRemoteNG.UI.Window selectedNodeAsContainer.Sort(sortDirection); else SelectedNode.Parent.Sort(sortDirection); - RefreshTreeObject(SelectedNode); Runtime.SaveConnectionsBG(); } private void SortNodesRecursive(ContainerInfo rootSortTarget, ListSortDirection sortDirection) { rootSortTarget.SortRecursive(sortDirection); - RefreshTreeObject(rootSortTarget); Runtime.SaveConnectionsBG(); } private void cMenTreeMoveUp_Click(object sender, EventArgs e) { SelectedNode.Parent.PromoteChild(SelectedNode); - RefreshTreeObject(SelectedNode); Runtime.SaveConnectionsBG(); } private void cMenTreeMoveDown_Click(object sender, EventArgs e) { SelectedNode.Parent.DemoteChild(SelectedNode); - RefreshTreeObject(SelectedNode); Runtime.SaveConnectionsBG(); } #endregion @@ -470,7 +489,6 @@ namespace mRemoteNG.UI.Window var selectedContainer = SelectedNode as ContainerInfo; newConnectionInfo.SetParent(selectedContainer ?? SelectedNode.Parent); Runtime.ConnectionList.Add(newConnectionInfo); - RefreshTreeObject(newConnectionInfo.Parent); } catch (Exception ex) { @@ -486,7 +504,6 @@ namespace mRemoteNG.UI.Window var selectedContainer = SelectedNode as ContainerInfo; newContainerInfo.SetParent(selectedContainer ?? SelectedNode.Parent); Runtime.ContainerList.Add(newContainerInfo); - RefreshTreeObject(newContainerInfo.Parent); } catch (Exception ex) { From a4ec3291cab1dbcd90b856ce093f855bade2ce9d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 20 Sep 2016 13:56:03 -0600 Subject: [PATCH 180/338] Small drop-n-drop optimization --- mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index d559f8600..ca595f52b 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -6,6 +6,7 @@ using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Tree.Root; + namespace mRemoteNG.Tree { internal class ConnectionTreeDragAndDropHandler @@ -15,9 +16,9 @@ namespace mRemoteNG.Tree internal void HandleEvent_ModelDropped(object sender, ModelDropEventArgs e) { - var draggedObject = (ConnectionInfo)e.SourceModels[0]; var dropTarget = e.TargetModel as ConnectionInfo; if (dropTarget == null) return; + var draggedObject = (ConnectionInfo)e.SourceModels[0]; if (e.DropTargetLocation == DropTargetLocation.Item) { var dropTargetAsContainer = dropTarget as ContainerInfo; @@ -38,7 +39,6 @@ namespace mRemoteNG.Tree dropTarget.Parent.SetChildBelow(draggedObject, dropTarget); } e.Handled = true; - e.RefreshObjects(); } internal void HandleEvent_ModelCanDrop(object sender, ModelDropEventArgs e) From 536d6f7c29ff2b5de3daf097c2a1893a5cf9eb03 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 09:03:11 -0600 Subject: [PATCH 181/338] Refactored ConnectionTreeDragAndDropHandler to be more unit-test friendly. Began creating unit tests for it --- .../ConnectionTreeDragAndDropHandlerTests.cs | 134 ++++++++++++++++++ mRemoteNGTests/mRemoteNGTests.csproj | 5 + mRemoteNGTests/packages.config | 1 + .../Tree/ConnectionTreeDragAndDropHandler.cs | 87 +++++++----- 4 files changed, 192 insertions(+), 35 deletions(-) create mode 100644 mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs diff --git a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs new file mode 100644 index 000000000..76ccdb355 --- /dev/null +++ b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs @@ -0,0 +1,134 @@ +using System.Windows.Forms; +using BrightIdeasSoftware; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; +using NUnit.Framework; + + +namespace mRemoteNGTests.Tree +{ + public class ConnectionTreeDragAndDropHandlerTests + { + private ConnectionTreeDragAndDropHandler _dragAndDropHandler; + private RootNodeInfo _rootNode; + private ContainerInfo _container1; + private ContainerInfo _container2; + private ContainerInfo _container3; + private ConnectionInfo _connection1; + private ConnectionInfo _connection2; + private ConnectionInfo _connection3; + private ConnectionInfo _connection4; + private ConnectionInfo _connection5; + + [SetUp] + public void Setup() + { + _dragAndDropHandler = new ConnectionTreeDragAndDropHandler(); + InitializeNodes(); + CreateSimpleTreeModel(); + } + + [TearDown] + public void Teardown() + { + _dragAndDropHandler = null; + DestroyNodes(); + } + + [Test] + public void CanDragConnectionOntoContainer() + { + var source = _connection3; + var target = _container1; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.Move)); + } + + [Test] + public void CanDragContainerOntoContainer() + { + var source = _container1; + var target = _container2; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.Move)); + } + + [Test] + public void CantDragConnectionOntoItself() + { + var source = _connection1; + var target = _connection1; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + [Test] + public void CantDragContainerOntoItself() + { + var source = _container1; + var target = _container1; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + [Test] + public void CantDragContainerOntoItsChild() + { + var source = _container2; + var target = _container3; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + private void InitializeNodes() + { + _rootNode = new RootNodeInfo(RootNodeType.Connection); + _container1 = new ContainerInfo(); + _container2 = new ContainerInfo(); + _container3 = new ContainerInfo(); + _connection1 = new ConnectionInfo(); + _connection2 = new ConnectionInfo(); + _connection3 = new ConnectionInfo(); + _connection4 = new ConnectionInfo(); + _connection5 = new ConnectionInfo(); + } + + private void CreateSimpleTreeModel() + { + /* + * Root + * |-- container1 + * | L-- connection1 + * L-- container2 + * |-- container3 + * | |-- connection3 + * | |-- connection4 + * | L-- connection5 + * L-- connection2 + */ + _rootNode.AddChild(_container1); + _rootNode.AddChild(_container2); + _container1.AddChild(_connection1); + _container2.AddChild(_container3); + _container2.AddChild(_connection2); + _container3.AddChild(_connection3); + _container3.AddChild(_connection4); + _container3.AddChild(_connection5); + } + + private void DestroyNodes() + { + _rootNode = null; + _container1 = null; + _container2 = null; + _container3 = null; + _connection1 = null; + _connection2 = null; + _connection3 = null; + _connection4 = null; + _connection5 = null; + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 670965103..fb0a9e03c 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -73,6 +73,10 @@ nUnitForms\bin\NUnitForms.dll + + ..\packages\ObjectListView.Official.2.9.1\lib\net20\ObjectListView.dll + True + @@ -105,6 +109,7 @@ + diff --git a/mRemoteNGTests/packages.config b/mRemoteNGTests/packages.config index 135a90b84..8b8b5aff6 100644 --- a/mRemoteNGTests/packages.config +++ b/mRemoteNGTests/packages.config @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index ca595f52b..80e2c17d3 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -9,12 +9,16 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Tree { - internal class ConnectionTreeDragAndDropHandler + public class ConnectionTreeDragAndDropHandler { - internal Color DropAllowedFeedbackColor = Color.Green; - internal Color DropDeniedFeedbackColor = Color.Red; + public Color DropAllowedFeedbackColor = Color.Green; + public Color DropDeniedFeedbackColor = Color.Red; + private string _infoMessage; + private Color _currentFeedbackColor; + private bool _enableFeedback; - internal void HandleEvent_ModelDropped(object sender, ModelDropEventArgs e) + + public void HandleEvent_ModelDropped(object sender, ModelDropEventArgs e) { var dropTarget = e.TargetModel as ConnectionInfo; if (dropTarget == null) return; @@ -28,72 +32,85 @@ namespace mRemoteNG.Tree else if (e.DropTargetLocation == DropTargetLocation.AboveItem) { if (!draggedObject.Parent.Equals(dropTarget.Parent)) - draggedObject.SetParent(dropTarget.Parent); - - dropTarget.Parent.SetChildAbove(draggedObject, dropTarget); + dropTarget.Parent.AddChildAbove(draggedObject, dropTarget); + else + dropTarget.Parent.SetChildAbove(draggedObject, dropTarget); } else if (e.DropTargetLocation == DropTargetLocation.BelowItem) { if (!draggedObject.Parent.Equals(dropTarget.Parent)) - draggedObject.SetParent(dropTarget.Parent); - dropTarget.Parent.SetChildBelow(draggedObject, dropTarget); + dropTarget.Parent.AddChildBelow(draggedObject, dropTarget); + else + dropTarget.Parent.SetChildBelow(draggedObject, dropTarget); } e.Handled = true; } - internal void HandleEvent_ModelCanDrop(object sender, ModelDropEventArgs e) + public void HandleEvent_ModelCanDrop(object sender, ModelDropEventArgs e) { - e.Effect = DragDropEffects.None; - e.DropSink.EnableFeedback = true; - e.DropSink.FeedbackColor = DropDeniedFeedbackColor; + + _enableFeedback = true; + _currentFeedbackColor = DropDeniedFeedbackColor; var dropSource = e.SourceModels.Cast().First(); var dropTarget = e.TargetModel as ConnectionInfo; - if (!NodeIsDraggable(dropSource)) - { - e.InfoMessage = Language.strNodeNotDraggable; - e.DropSink.EnableFeedback = false; - } - else if (e.DropTargetLocation == DropTargetLocation.Item) - HandleCanDropOnItem(dropSource, dropTarget, e); - else if (e.DropTargetLocation == DropTargetLocation.AboveItem || e.DropTargetLocation == DropTargetLocation.BelowItem) - HandleCanDropBetweenItems(dropSource, dropTarget, e); - else - return; + e.Effect = CanModelDrop(dropSource, dropTarget, e.DropTargetLocation); + e.InfoMessage = _infoMessage; + e.DropSink.EnableFeedback = _enableFeedback; + e.DropSink.FeedbackColor = _currentFeedbackColor; e.Handled = true; } - private void HandleCanDropOnItem(ConnectionInfo dropSource, ConnectionInfo dropTarget, ModelDropEventArgs e) + public DragDropEffects CanModelDrop(ConnectionInfo dropSource, ConnectionInfo dropTarget, DropTargetLocation dropTargetLocation) { + var dragDropEffect = DragDropEffects.None; + if (!NodeIsDraggable(dropSource)) + { + _infoMessage = Language.strNodeNotDraggable; + _enableFeedback = false; + } + else if (dropTargetLocation == DropTargetLocation.Item) + dragDropEffect = HandleCanDropOnItem(dropSource, dropTarget); + else if (dropTargetLocation == DropTargetLocation.AboveItem || dropTargetLocation == DropTargetLocation.BelowItem) + dragDropEffect = HandleCanDropBetweenItems(dropSource, dropTarget); + return dragDropEffect; + } + + private DragDropEffects HandleCanDropOnItem(ConnectionInfo dropSource, ConnectionInfo dropTarget) + { + var dragDropEffect = DragDropEffects.None; if (dropTarget is ContainerInfo) { if (NodeDraggingOntoSelf(dropSource, dropTarget)) - e.InfoMessage = Language.strNodeCannotDragOnSelf; + _infoMessage = Language.strNodeCannotDragOnSelf; else if (AncestorDraggingOntoChild(dropSource, dropTarget)) - e.InfoMessage = Language.strNodeCannotDragParentOnChild; + _infoMessage = Language.strNodeCannotDragParentOnChild; else if (DraggingOntoCurrentParent(dropSource, dropTarget)) - e.InfoMessage = Language.strNodeAlreadyInFolder; + _infoMessage = Language.strNodeAlreadyInFolder; else { - e.Effect = DragDropEffects.Move; - e.DropSink.FeedbackColor = DropAllowedFeedbackColor; + dragDropEffect = DragDropEffects.Move; + _currentFeedbackColor = DropAllowedFeedbackColor; } } else { - e.DropSink.EnableFeedback = false; + _enableFeedback = false; } + return dragDropEffect; } - private void HandleCanDropBetweenItems(ConnectionInfo dropSource, ConnectionInfo dropTarget, ModelDropEventArgs e) + private DragDropEffects HandleCanDropBetweenItems(ConnectionInfo dropSource, ConnectionInfo dropTarget) { + var dragDropEffect = DragDropEffects.None; if (AncestorDraggingOntoChild(dropSource, dropTarget)) - e.InfoMessage = Language.strNodeCannotDragParentOnChild; + _infoMessage = Language.strNodeCannotDragParentOnChild; else { - e.Effect = DragDropEffects.Move; - e.DropSink.FeedbackColor = DropAllowedFeedbackColor; + dragDropEffect = DragDropEffects.Move; + _currentFeedbackColor = DropAllowedFeedbackColor; } + return dragDropEffect; } private bool NodeIsDraggable(ConnectionInfo node) From 82804c1390dbedef394da79e3aa3657eea08c41d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 09:10:32 -0600 Subject: [PATCH 182/338] Fixed small bug in the drag and drop handler refactor that was causing info messages to not refresh all the time. --- mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 80e2c17d3..4d203a72e 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -48,9 +48,9 @@ namespace mRemoteNG.Tree public void HandleEvent_ModelCanDrop(object sender, ModelDropEventArgs e) { - _enableFeedback = true; _currentFeedbackColor = DropDeniedFeedbackColor; + _infoMessage = null; var dropSource = e.SourceModels.Cast().First(); var dropTarget = e.TargetModel as ConnectionInfo; From 07fab69221595f2fd2d72875a996a9a9e859848f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 09:35:07 -0600 Subject: [PATCH 183/338] Created more tests for drag and drop handler --- .../ConnectionTreeDragAndDropHandlerTests.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs index 76ccdb355..f656c7849 100644 --- a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs +++ b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs @@ -82,6 +82,33 @@ namespace mRemoteNGTests.Tree Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); } + [Test] + public void CantDragNodeOntoItsCurrentParent() + { + var source = _container3; + var target = _container2; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + [Test] + public void CantDragRootNodeInfo() + { + var source = _rootNode; + var target = new ContainerInfo(); + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + [Test] + public void CantDragPuttySessionInfo() + { + var source = new PuttySessionInfo(); + var target = _container2; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + private void InitializeNodes() { _rootNode = new RootNodeInfo(RootNodeType.Connection); From a352516176db98359cb69dbe93ee5f66ae83f95f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 09:38:54 -0600 Subject: [PATCH 184/338] Fixed a bug where you could try to drag connection/containers onto a root putty session node --- .../ConnectionTreeDragAndDropHandlerTests.cs | 20 +++++++++++++++++++ .../Tree/ConnectionTreeDragAndDropHandler.cs | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs index f656c7849..a241653b3 100644 --- a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs +++ b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs @@ -2,6 +2,7 @@ using BrightIdeasSoftware; using mRemoteNG.Connection; using mRemoteNG.Container; +using mRemoteNG.Root.PuttySessions; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; using NUnit.Framework; @@ -109,6 +110,25 @@ namespace mRemoteNGTests.Tree Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); } + [Test] + public void CantDragConnectionOntoRootPuttySessionNode() + { + var source = _connection1; + var target = new RootPuttySessionsNodeInfo(); + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + [Test] + public void CantDragContainerOntoRootPuttySessionNode() + { + var source = _container1; + var target = new RootPuttySessionsNodeInfo(); + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.Item); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + private void InitializeNodes() { _rootNode = new RootNodeInfo(RootNodeType.Connection); diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 4d203a72e..fb13a0e4f 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -4,6 +4,7 @@ using System.Windows.Forms; using BrightIdeasSoftware; using mRemoteNG.Connection; using mRemoteNG.Container; +using mRemoteNG.Root.PuttySessions; using mRemoteNG.Tree.Root; @@ -79,7 +80,7 @@ namespace mRemoteNG.Tree private DragDropEffects HandleCanDropOnItem(ConnectionInfo dropSource, ConnectionInfo dropTarget) { var dragDropEffect = DragDropEffects.None; - if (dropTarget is ContainerInfo) + if (dropTarget is ContainerInfo && !(dropTarget is RootPuttySessionsNodeInfo)) { if (NodeDraggingOntoSelf(dropSource, dropTarget)) _infoMessage = Language.strNodeCannotDragOnSelf; From 0324225c38b7bd60085521d49f19a153681d69a1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 09:40:33 -0600 Subject: [PATCH 185/338] Added new convenience/optimization functions to containerinfo --- mRemoteV1/Container/ContainerInfo.cs | 51 ++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 73bd50875..4adad3d1e 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -19,6 +19,7 @@ namespace mRemoteNG.Container [Category(""), Browsable(false), ReadOnly(false), Bindable(false), DefaultValue(""), DesignOnly(false)] public bool IsExpanded { get; set; } + public ContainerInfo() { SetDefaults(); @@ -36,10 +37,32 @@ namespace mRemoteNG.Container } public void AddChild(ConnectionInfo newChildItem) + { + AddChildAt(newChildItem, Children.Count); + } + + public void AddChildAbove(ConnectionInfo newChildItem, ConnectionInfo reference) + { + var newChildIndex = Children.IndexOf(reference); + if (newChildIndex < 0) + newChildIndex = Children.Count; + AddChildAt(newChildItem, newChildIndex); + } + + public void AddChildBelow(ConnectionInfo newChildItem, ConnectionInfo reference) + { + var newChildIndex = Children.IndexOf(reference) + 1; + if (newChildIndex > Children.Count) + newChildIndex = 0; + AddChildAt(newChildItem, newChildIndex); + } + + public void AddChildAt(ConnectionInfo newChildItem, int index) { if (Children.Contains(newChildItem)) return; + newChildItem.Parent?.RemoveChild(newChildItem); newChildItem.Parent = this; - Children.Add(newChildItem); + Children.Insert(index, newChildItem); SubscribeToChildEvents(newChildItem); RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newChildItem)); } @@ -80,25 +103,33 @@ namespace mRemoteNG.Container } public void SetChildAbove(ConnectionInfo childToPromote, ConnectionInfo reference) + { + var newIndex = GetNewChildIndexAboveReference(childToPromote, reference); + SetChildPosition(childToPromote, newIndex); + } + + private int GetNewChildIndexAboveReference(ConnectionInfo childToPromote, ConnectionInfo reference) { var originalIndex = Children.IndexOf(childToPromote); var newIndex = Children.IndexOf(reference); - if (newIndex < 0) return; if (originalIndex < newIndex) - SetChildPosition(childToPromote, newIndex - 1); - else if (originalIndex > newIndex) - SetChildPosition(childToPromote, newIndex); + newIndex -= 1; + return newIndex < 0 ? 0 : newIndex; } public void SetChildBelow(ConnectionInfo childToPromote, ConnectionInfo reference) + { + var newIndex = GetNewChildIndexBelowReference(childToPromote, reference); + SetChildPosition(childToPromote, newIndex); + } + + private int GetNewChildIndexBelowReference(ConnectionInfo childToPromote, ConnectionInfo reference) { var originalIndex = Children.IndexOf(childToPromote); var newIndex = Children.IndexOf(reference); - if (newIndex < 0) return; - if (originalIndex < newIndex) - SetChildPosition(childToPromote, newIndex); - else if (originalIndex > newIndex) - SetChildPosition(childToPromote, newIndex + 1); + if (originalIndex > newIndex) + newIndex += 1; + return newIndex < 0 ? 0 : newIndex; } public void PromoteChild(ConnectionInfo child) From f035872592a279f0b5b8f774e563e141a61ca909 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 09:55:33 -0600 Subject: [PATCH 186/338] Extracted a method to increase readability --- .../Tree/ConnectionTreeDragAndDropHandler.cs | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index fb13a0e4f..b555b44d3 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -82,17 +82,9 @@ namespace mRemoteNG.Tree var dragDropEffect = DragDropEffects.None; if (dropTarget is ContainerInfo && !(dropTarget is RootPuttySessionsNodeInfo)) { - if (NodeDraggingOntoSelf(dropSource, dropTarget)) - _infoMessage = Language.strNodeCannotDragOnSelf; - else if (AncestorDraggingOntoChild(dropSource, dropTarget)) - _infoMessage = Language.strNodeCannotDragParentOnChild; - else if (DraggingOntoCurrentParent(dropSource, dropTarget)) - _infoMessage = Language.strNodeAlreadyInFolder; - else - { - dragDropEffect = DragDropEffects.Move; - _currentFeedbackColor = DropAllowedFeedbackColor; - } + if (!IsValidDrag(dropSource, dropTarget)) return dragDropEffect; + dragDropEffect = DragDropEffects.Move; + _currentFeedbackColor = DropAllowedFeedbackColor; } else { @@ -114,6 +106,20 @@ namespace mRemoteNG.Tree return dragDropEffect; } + private bool IsValidDrag(ConnectionInfo dropSource, ConnectionInfo dropTarget) + { + var validDrag = false; + if (NodeDraggingOntoSelf(dropSource, dropTarget)) + _infoMessage = Language.strNodeCannotDragOnSelf; + else if (AncestorDraggingOntoChild(dropSource, dropTarget)) + _infoMessage = Language.strNodeCannotDragParentOnChild; + else if (DraggingOntoCurrentParent(dropSource, dropTarget)) + _infoMessage = Language.strNodeAlreadyInFolder; + else + validDrag = true; + return validDrag; + } + private bool NodeIsDraggable(ConnectionInfo node) { if (node == null || node is RootNodeInfo || node is PuttySessionInfo) return false; From d39e2a506f6c039b8e8f9eb083afbe4ba1472247 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 09:55:46 -0600 Subject: [PATCH 187/338] Added tests --- .../ConnectionTreeDragAndDropHandlerTests.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs index a241653b3..2577f0730 100644 --- a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs +++ b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs @@ -56,6 +56,24 @@ namespace mRemoteNGTests.Tree Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.Move)); } + [Test] + public void CanDragContainerBetweenContainers() + { + var source = _container3; + var target = _container2; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.AboveItem); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.Move)); + } + + [Test] + public void CanDragConnectionBetweenConnections() + { + var source = _connection1; + var target = _connection4; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.AboveItem); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.Move)); + } + [Test] public void CantDragConnectionOntoItself() { @@ -83,6 +101,15 @@ namespace mRemoteNGTests.Tree Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); } + [Test] + public void CantDragContainerBetweenItsChildren() + { + var source = _container3; + var target = _connection4; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.BelowItem); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + [Test] public void CantDragNodeOntoItsCurrentParent() { From 759c072c11c0d194afc0d2c54b537484e65adf02 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 10:22:10 -0600 Subject: [PATCH 188/338] Refactored ModelDropped handler to be more test-friendly --- .../Tree/ConnectionTreeDragAndDropHandler.cs | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index b555b44d3..ecce7ef12 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -24,29 +24,43 @@ namespace mRemoteNG.Tree var dropTarget = e.TargetModel as ConnectionInfo; if (dropTarget == null) return; var draggedObject = (ConnectionInfo)e.SourceModels[0]; - if (e.DropTargetLocation == DropTargetLocation.Item) - { - var dropTargetAsContainer = dropTarget as ContainerInfo; - if (dropTargetAsContainer == null) return; - draggedObject.SetParent(dropTargetAsContainer); - } - else if (e.DropTargetLocation == DropTargetLocation.AboveItem) - { - if (!draggedObject.Parent.Equals(dropTarget.Parent)) - dropTarget.Parent.AddChildAbove(draggedObject, dropTarget); - else - dropTarget.Parent.SetChildAbove(draggedObject, dropTarget); - } - else if (e.DropTargetLocation == DropTargetLocation.BelowItem) - { - if (!draggedObject.Parent.Equals(dropTarget.Parent)) - dropTarget.Parent.AddChildBelow(draggedObject, dropTarget); - else - dropTarget.Parent.SetChildBelow(draggedObject, dropTarget); - } + DropModel(draggedObject, dropTarget, e.DropTargetLocation); e.Handled = true; } + public void DropModel(ConnectionInfo dropSource, ConnectionInfo dropTarget, DropTargetLocation dropTargetLocation) + { + if (dropTargetLocation == DropTargetLocation.Item) + DropModelOntoTarget(dropSource, dropTarget); + else if (dropTargetLocation == DropTargetLocation.AboveItem) + DropModelAboveTarget(dropSource, dropTarget); + else if (dropTargetLocation == DropTargetLocation.BelowItem) + DropModelBelowTarget(dropSource, dropTarget); + } + + private void DropModelOntoTarget(ConnectionInfo dropSource, ConnectionInfo dropTarget) + { + var dropTargetAsContainer = dropTarget as ContainerInfo; + if (dropTargetAsContainer == null) return; + dropSource.SetParent(dropTargetAsContainer); + } + + private void DropModelAboveTarget(ConnectionInfo dropSource, ConnectionInfo dropTarget) + { + if (!dropSource.Parent.Equals(dropTarget.Parent)) + dropTarget.Parent.AddChildAbove(dropSource, dropTarget); + else + dropTarget.Parent.SetChildAbove(dropSource, dropTarget); + } + + private void DropModelBelowTarget(ConnectionInfo dropSource, ConnectionInfo dropTarget) + { + if (!dropSource.Parent.Equals(dropTarget.Parent)) + dropTarget.Parent.AddChildBelow(dropSource, dropTarget); + else + dropTarget.Parent.SetChildBelow(dropSource, dropTarget); + } + public void HandleEvent_ModelCanDrop(object sender, ModelDropEventArgs e) { _enableFeedback = true; From cbe0c1a5507c75d6dcf053a3282f1c2470597a19 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 10:22:25 -0600 Subject: [PATCH 189/338] Created tests for model-dropped --- .../ConnectionTreeDragAndDropHandlerTests.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs index 2577f0730..8fc9dcc63 100644 --- a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs +++ b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs @@ -155,6 +155,50 @@ namespace mRemoteNGTests.Tree Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); } + [Test] + public void DraggingNodeBelowSiblingRearrangesTheUnderlyingModelCorrectly() + { + var source = _connection3; + var target = _connection5; + var location = DropTargetLocation.BelowItem; + _dragAndDropHandler.DropModel(source, target, location); + var actualIndex = _container3.Children.IndexOf(source); + var expectedIndex = _container3.Children.IndexOf(target) + 1; + Assert.That(actualIndex, Is.EqualTo(expectedIndex)); + } + + [Test] + public void DraggingNodeAboveSiblingRearrangesTheUnderlyingModelCorrectly() + { + var source = _connection3; + var target = _connection5; + var location = DropTargetLocation.AboveItem; + _dragAndDropHandler.DropModel(source, target, location); + var actualIndex = _container3.Children.IndexOf(source); + var expectedIndex = _container3.Children.IndexOf(target) - 1; + Assert.That(actualIndex, Is.EqualTo(expectedIndex)); + } + + [Test] + public void DraggingNodeToNewContainerAddsNodeToTheNewContainer() + { + var source = _connection3; + var target = _container1; + var location = DropTargetLocation.Item; + _dragAndDropHandler.DropModel(source, target, location); + Assert.That(target.Children.Contains(source)); + } + + [Test] + public void DraggingNodeToNewContainerRemovesNodeFromOldContainer() + { + var source = _connection3; + var target = _container1; + var location = DropTargetLocation.Item; + _dragAndDropHandler.DropModel(source, target, location); + Assert.That(!_container3.Children.Contains(source)); + } + private void InitializeNodes() { From 2b6367a8a9da218aea00bb6824d3e44c4e9b65ef Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 10:38:41 -0600 Subject: [PATCH 190/338] Fixed bug where connections/containers could be dragged between putty session nodes --- .../ConnectionTreeDragAndDropHandlerTests.cs | 18 ++++++++++++++++++ .../Tree/ConnectionTreeDragAndDropHandler.cs | 2 ++ 2 files changed, 20 insertions(+) diff --git a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs index 8fc9dcc63..51c9783f5 100644 --- a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs +++ b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs @@ -155,6 +155,24 @@ namespace mRemoteNGTests.Tree Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); } + [Test] + public void CantDragNodeAbovePuttySessionNodes() + { + var source = _connection1; + var target = new PuttySessionInfo(); + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.AboveItem); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + [Test] + public void CantDragNodeBelowPuttySessionNodes() + { + var source = _connection1; + var target = new PuttySessionInfo(); + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.BelowItem); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + [Test] public void DraggingNodeBelowSiblingRearrangesTheUnderlyingModelCorrectly() { diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index ecce7ef12..f4ab1d008 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -112,6 +112,8 @@ namespace mRemoteNG.Tree var dragDropEffect = DragDropEffects.None; if (AncestorDraggingOntoChild(dropSource, dropTarget)) _infoMessage = Language.strNodeCannotDragParentOnChild; + else if (dropTarget is PuttySessionInfo || dropTarget is RootPuttySessionsNodeInfo) + _enableFeedback = false; else { dragDropEffect = DragDropEffects.Move; From 42fcdd226786173de8711ab98257963f10c7ce59 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 10:43:01 -0600 Subject: [PATCH 191/338] Renamed variable to be more in line with other uses in the class --- mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index f4ab1d008..0ce76b44a 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -23,8 +23,8 @@ namespace mRemoteNG.Tree { var dropTarget = e.TargetModel as ConnectionInfo; if (dropTarget == null) return; - var draggedObject = (ConnectionInfo)e.SourceModels[0]; - DropModel(draggedObject, dropTarget, e.DropTargetLocation); + var dropSource = (ConnectionInfo)e.SourceModels[0]; + DropModel(dropSource, dropTarget, e.DropTargetLocation); e.Handled = true; } From 981919335d2bec42fd7903858206ea8a10aeb31a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 21 Sep 2016 14:06:05 -0600 Subject: [PATCH 192/338] Resolved a severe performance issue with refreshing the tree after drag-n-drop operations --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index c8c8d75d3..525a4d179 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -406,19 +406,20 @@ namespace mRemoteNG.UI.Window private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs args) { + var senderAsConnectionInfo = sender as ConnectionInfo; switch (args?.Action) { case NotifyCollectionChangedAction.Add: - RefreshTreeObject(sender); + RefreshTreeObject(senderAsConnectionInfo); break; case NotifyCollectionChangedAction.Remove: RefreshTreeObjects(args.OldItems); break; case NotifyCollectionChangedAction.Move: - RefreshTreeObject(sender); + RefreshTreeObjects(args.OldItems); break; case NotifyCollectionChangedAction.Reset: - RefreshTreeObject(sender); + RefreshTreeObject(senderAsConnectionInfo); break; case NotifyCollectionChangedAction.Replace: break; @@ -427,9 +428,9 @@ namespace mRemoteNG.UI.Window } } - private void RefreshTreeObject(object modelObject) + private void RefreshTreeObject(ConnectionInfo modelObject) { - RefreshTreeObjects(new[] { modelObject }); + olvConnections.RefreshObject(modelObject); } private void RefreshTreeObjects(IList modelObjects) From b646e7ef70543a2a63ca8bd7dca1e59f88f766cd Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 10:36:37 -0600 Subject: [PATCH 193/338] Minor optimization tree refresh when dragging nodes between containers. There is still a small disruption in the UI (~200ms) when moving nodes between containers. --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 525a4d179..8430a10a6 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -406,12 +406,16 @@ namespace mRemoteNG.UI.Window private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs args) { - var senderAsConnectionInfo = sender as ConnectionInfo; + var senderAsContainerInfo = sender as ContainerInfo; switch (args?.Action) { case NotifyCollectionChangedAction.Add: - RefreshTreeObject(senderAsConnectionInfo); - break; + var otherChild = senderAsContainerInfo?.Children.First(child => !args.NewItems.Contains(child)); + if (otherChild != null) + RefreshTreeObject(otherChild); + else + RefreshTreeObject(senderAsContainerInfo); + break; case NotifyCollectionChangedAction.Remove: RefreshTreeObjects(args.OldItems); break; @@ -419,7 +423,7 @@ namespace mRemoteNG.UI.Window RefreshTreeObjects(args.OldItems); break; case NotifyCollectionChangedAction.Reset: - RefreshTreeObject(senderAsConnectionInfo); + RefreshTreeObject(senderAsContainerInfo); break; case NotifyCollectionChangedAction.Replace: break; From ff4e6ab3ca12cfdde3b9907af86bf7b62d54c0f7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 10:45:00 -0600 Subject: [PATCH 194/338] Fixed bug where nodes could be dragged (with errors) above or below the root connections node --- .../ConnectionTreeDragAndDropHandlerTests.cs | 18 ++++++++++++++++++ .../Tree/ConnectionTreeDragAndDropHandler.cs | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs index 51c9783f5..1bf478be6 100644 --- a/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs +++ b/mRemoteNGTests/Tree/ConnectionTreeDragAndDropHandlerTests.cs @@ -128,6 +128,24 @@ namespace mRemoteNGTests.Tree Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); } + [Test] + public void CantDragNodeAboveRootNodeInfo() + { + var source = _connection1; + var target = _rootNode; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.AboveItem); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + + [Test] + public void CantDragNodeBelowRootNodeInfo() + { + var source = _connection1; + var target = _rootNode; + var dragDropEffects = _dragAndDropHandler.CanModelDrop(source, target, DropTargetLocation.BelowItem); + Assert.That(dragDropEffects, Is.EqualTo(DragDropEffects.None)); + } + [Test] public void CantDragPuttySessionInfo() { diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 0ce76b44a..4bee15e02 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -112,7 +112,7 @@ namespace mRemoteNG.Tree var dragDropEffect = DragDropEffects.None; if (AncestorDraggingOntoChild(dropSource, dropTarget)) _infoMessage = Language.strNodeCannotDragParentOnChild; - else if (dropTarget is PuttySessionInfo || dropTarget is RootPuttySessionsNodeInfo) + else if (dropTarget is PuttySessionInfo || dropTarget is RootNodeInfo) _enableFeedback = false; else { From c3c9bb33a217df82d49d516b0e544c2ef839bf42 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 11:46:26 -0600 Subject: [PATCH 195/338] Code cleanup --- mRemoteV1/UI/Window/ConfigWindow.cs | 67 +++++++++++++++-------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/mRemoteV1/UI/Window/ConfigWindow.cs b/mRemoteV1/UI/Window/ConfigWindow.cs index cebc38af4..ae8634cc9 100644 --- a/mRemoteV1/UI/Window/ConfigWindow.cs +++ b/mRemoteV1/UI/Window/ConfigWindow.cs @@ -16,6 +16,7 @@ using System.Windows.Forms; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; using mRemoteNG.Security; +using mRemoteNG.Themes; using mRemoteNG.UI.Controls.FilteredPropertyGrid; using WeifenLuo.WinFormsUI.Docking; @@ -40,6 +41,7 @@ namespace mRemoteNG.UI.Window private ToolStripSeparator ToolStripSeparator1; private FilteredPropertyGrid pGrid; + private AbstractConnectionInfoData _selectedNode; private void InitializeComponent() { @@ -209,7 +211,7 @@ namespace mRemoteNG.UI.Window } } } - + public bool InheritanceVisible { get @@ -227,7 +229,7 @@ namespace mRemoteNG.UI.Window } } } - + public bool DefaultPropertiesVisible { get @@ -245,7 +247,7 @@ namespace mRemoteNG.UI.Window } } } - + public bool DefaultInheritanceVisible { get { return btnShowDefaultInheritance.Checked; } @@ -307,7 +309,7 @@ namespace mRemoteNG.UI.Window return base.ProcessCmdKey(ref msg, keyData); } } - + private void FindChildGridItems(GridItem item, ref List gridItems) { gridItems.Add(item); @@ -320,7 +322,7 @@ namespace mRemoteNG.UI.Window } } } - + private bool ContainsGridItemProperty(List gridItems) { foreach (var item in gridItems) @@ -332,7 +334,7 @@ namespace mRemoteNG.UI.Window } return false; } - + private GridItem FindPreviousGridItemProperty(List gridItems, GridItem startItem) { if (gridItems.Count == 0 || startItem == null) @@ -377,7 +379,7 @@ namespace mRemoteNG.UI.Window return null; return gridItems[previousIndex]; } - + private GridItem FindNextGridItemProperty(List gridItems, GridItem startItem) { if (gridItems.Count == 0 || startItem == null) @@ -422,7 +424,7 @@ namespace mRemoteNG.UI.Window return null; return gridItems[nextIndex]; } - + public void SetPropertyGridObject(object Obj) { try @@ -603,9 +605,10 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConfigPropertyGridObjectFailed + Environment.NewLine + ex.Message, true); } } - - public void pGrid_SelectedObjectChanged() + + public void pGrid_SelectedObjectChanged(AbstractConnectionInfoData selectedObject) { + _selectedNode = selectedObject; ShowHideGridItems(); } #endregion @@ -623,7 +626,7 @@ namespace mRemoteNG.UI.Window TabText = Language.strMenuConfig; propertyGridContextMenuShowHelpText.Text = Language.strMenuShowHelpText; } - + private void ApplyTheme() { pGrid.BackColor = Themes.ThemeManager.ActiveTheme.ToolbarBackgroundColor; @@ -690,21 +693,21 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConfigUiLoadFailed + Environment.NewLine + ex.Message, true); } } - + private void Config_Load(object sender, EventArgs e) { ApplyLanguage(); - Themes.ThemeManager.ThemeChanged += ApplyTheme; + ThemeManager.ThemeChanged += ApplyTheme; ApplyTheme(); AddToolStripItems(); pGrid.HelpVisible = Settings.Default.ShowConfigHelpText; } - + private void Config_SystemColorsChanged(object sender, EventArgs e) { AddToolStripItems(); } - + private void pGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { try @@ -796,13 +799,12 @@ namespace mRemoteNG.UI.Window if (pGrid.PropertySort == PropertySort.CategorizedAlphabetical) pGrid.PropertySort = PropertySort.Categorized; } - + private void ShowHideGridItems() { try { var strHide = new List(); - if (pGrid.SelectedObject is RootNodeInfo) { var rootInfo = (RootNodeInfo)pGrid.SelectedObject; @@ -865,7 +867,6 @@ namespace mRemoteNG.UI.Window else if (pGrid.SelectedObject is ConnectionInfo) { var conI = (ConnectionInfo)pGrid.SelectedObject; - switch (conI.Protocol) { case ProtocolType.RDP: @@ -1442,7 +1443,7 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConfigPropertyGridHideItemsFailed + Environment.NewLine + ex.Message, true); } } - + private void btnShowProperties_Click(object sender, EventArgs e) { if (pGrid.SelectedObject is ConnectionInfoInheritance) @@ -1453,7 +1454,7 @@ namespace mRemoteNG.UI.Window InheritanceVisible = false; DefaultPropertiesVisible = false; DefaultInheritanceVisible = false; - SetPropertyGridObject((RootNodeInfo)Windows.treeForm.tvConnections.SelectedNode.Tag); + SetPropertyGridObject((RootNodeInfo)_selectedNode); } else { @@ -1471,10 +1472,10 @@ namespace mRemoteNG.UI.Window InheritanceVisible = false; DefaultPropertiesVisible = false; DefaultInheritanceVisible = false; - SetPropertyGridObject((RootNodeInfo)Windows.treeForm.tvConnections.SelectedNode.Tag); + SetPropertyGridObject((RootNodeInfo)_selectedNode); } } - + private void btnShowDefaultProperties_Click(object sender, EventArgs e) { if (!(pGrid.SelectedObject is RootNodeInfo) && !(pGrid.SelectedObject is ConnectionInfoInheritance)) return; @@ -1484,7 +1485,7 @@ namespace mRemoteNG.UI.Window DefaultInheritanceVisible = false; SetPropertyGridObject(DefaultConnectionInfo.Instance); } - + private void btnShowInheritance_Click(object sender, EventArgs e) { if (!(pGrid.SelectedObject is ConnectionInfo)) return; @@ -1494,7 +1495,7 @@ namespace mRemoteNG.UI.Window DefaultInheritanceVisible = false; SetPropertyGridObject(((ConnectionInfo)pGrid.SelectedObject).Inheritance); } - + private void btnShowDefaultInheritance_Click(object sender, EventArgs e) { if (pGrid.SelectedObject is RootNodeInfo || pGrid.SelectedObject is ConnectionInfo) @@ -1506,12 +1507,12 @@ namespace mRemoteNG.UI.Window SetPropertyGridObject(DefaultConnectionInheritance.Instance); } } - + private void btnHostStatus_Click(object sender, EventArgs e) { SetHostStatus(pGrid.SelectedObject); } - + private void btnIcon_Click(object sender, MouseEventArgs e) { try @@ -1540,7 +1541,7 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConfigPropertyGridButtonIconClickFailed + Environment.NewLine + ex.Message, true); } } - + private void IconMenu_Click(object sender, EventArgs e) { try @@ -1586,7 +1587,7 @@ namespace mRemoteNG.UI.Window #region Host Status (Ping) private string HostName; private Thread pThread; - + private void CheckHostAlive() { var pingSender = new Ping(); @@ -1617,7 +1618,7 @@ namespace mRemoteNG.UI.Window } } } - + delegate void ShowStatusImageCB(Image image); private void ShowStatusImage(Image image) { @@ -1632,7 +1633,7 @@ namespace mRemoteNG.UI.Window btnHostStatus.Tag = "checkfinished"; } } - + public void SetHostStatus(object connectionInfo) { try @@ -1679,7 +1680,7 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionMessage("UI.Window.Config.propertyGridContextMenu_Opening() failed.", ex, MessageClass.ErrorMsg, true); } } - + private void propertyGridContextMenuReset_Click(object sender, EventArgs e) { try @@ -1695,12 +1696,12 @@ namespace mRemoteNG.UI.Window Runtime.MessageCollector.AddExceptionMessage("UI.Window.Config.propertyGridContextMenuReset_Click() failed.", ex, MessageClass.ErrorMsg, true); } } - + private void propertyGridContextMenuShowHelpText_Click(object sender, EventArgs e) { propertyGridContextMenuShowHelpText.Checked = !propertyGridContextMenuShowHelpText.Checked; } - + private void propertyGridContextMenuShowHelpText_CheckedChanged(object sender, EventArgs e) { Settings.Default.ShowConfigHelpText = propertyGridContextMenuShowHelpText.Checked; From 6de57ee0d4539bcea72afb0001a09e2cc1be06d2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 11:55:28 -0600 Subject: [PATCH 196/338] ConnectionTreeModel now implements INotifyPropertyChanged and subscribes to child events --- mRemoteV1/Tree/ConnectionTreeModel.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index e50e6c33f..a31a5ac53 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Collections.Specialized; +using System.ComponentModel; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Tree.Root; @@ -7,7 +8,7 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Tree { - public class ConnectionTreeModel : INotifyCollectionChanged + public class ConnectionTreeModel : INotifyCollectionChanged, INotifyPropertyChanged { public List RootNodes { get; } = new List(); @@ -16,6 +17,7 @@ namespace mRemoteNG.Tree if (RootNodes.Contains(rootNode)) return; RootNodes.Add(rootNode); rootNode.CollectionChanged += RaiseCollectionChangedEvent; + rootNode.PropertyChanged += RaisePropertyChangedEvent; RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, rootNode)); } @@ -23,6 +25,7 @@ namespace mRemoteNG.Tree { if (!RootNodes.Contains(rootNode)) return; rootNode.CollectionChanged -= RaiseCollectionChangedEvent; + rootNode.PropertyChanged -= RaisePropertyChangedEvent; RootNodes.Remove(rootNode); RaiseCollectionChangedEvent(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, rootNode)); } @@ -70,5 +73,11 @@ namespace mRemoteNG.Tree { CollectionChanged?.Invoke(sender, args); } + + public event PropertyChangedEventHandler PropertyChanged; + protected virtual void RaisePropertyChangedEvent(object sender, PropertyChangedEventArgs args) + { + PropertyChanged?.Invoke(this, args); + } } } \ No newline at end of file From d4e48e8b63d58f50bf1cac841b167e44a708d256 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 11:56:12 -0600 Subject: [PATCH 197/338] Fixed bug where app would crash when changing node name from config window --- mRemoteV1/UI/Window/ConfigWindow.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConfigWindow.cs b/mRemoteV1/UI/Window/ConfigWindow.cs index ae8634cc9..6f6a3c1e9 100644 --- a/mRemoteV1/UI/Window/ConfigWindow.cs +++ b/mRemoteV1/UI/Window/ConfigWindow.cs @@ -734,7 +734,6 @@ namespace mRemoteNG.UI.Window } else if (e.ChangedItem.Label == Language.strPropertyNameName) { - Windows.treeForm.tvConnections.SelectedNode.Text = Convert.ToString(selectedGridObject.Name); if (Settings.Default.SetHostnameLikeDisplayName) { var connectionInfo = selectedGridObject; From bce8d2e4b8980fd5d0385f45cc0438e834e3a799 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 11:56:46 -0600 Subject: [PATCH 198/338] Forgot to commit this bit --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 8430a10a6..87eefedf4 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -337,7 +337,7 @@ namespace mRemoteNG.UI.Window { _contextMenu.EnableShortcutKeys(); ConnectionTreeModel.RenameNode(SelectedNode, e.Label); - Windows.configForm.pGrid_SelectedObjectChanged(); + Windows.configForm.pGrid_SelectedObjectChanged(SelectedNode); Runtime.SaveConnectionsBG(); } catch (Exception ex) @@ -350,8 +350,8 @@ namespace mRemoteNG.UI.Window { try { - Windows.configForm.SetPropertyGridObject(olvConnections.SelectedObject); - Runtime.LastSelected = ((ConnectionInfo)olvConnections.SelectedObject)?.ConstantID; + Windows.configForm.SetPropertyGridObject(SelectedNode); + Runtime.LastSelected = (SelectedNode)?.ConstantID; } catch (Exception ex) { From d7d15a0ab341175ac8dbd68a3e86f193e06996c1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 12:04:30 -0600 Subject: [PATCH 199/338] Fixed a typo in the ConnectionTreeModel's NotifyPropertyChanged event propogation --- mRemoteV1/Tree/ConnectionTreeModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index a31a5ac53..b36c75ecb 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -77,7 +77,7 @@ namespace mRemoteNG.Tree public event PropertyChangedEventHandler PropertyChanged; protected virtual void RaisePropertyChangedEvent(object sender, PropertyChangedEventArgs args) { - PropertyChanged?.Invoke(this, args); + PropertyChanged?.Invoke(sender, args); } } } \ No newline at end of file From 45b207f39952461121e2b7d630828d8048de604b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 12:06:18 -0600 Subject: [PATCH 200/338] Added property changed event handler to the connection tree. Model property updates will now be immediately reflected by the tree view --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 87eefedf4..af3210b5c 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -178,6 +178,15 @@ namespace mRemoteNG.UI.Window { _puttySessionsManager.PuttySessionsCollectionChanged += (sender, args) => RefreshTreeObjects(GetRootPuttyNodes().ToList()); ConnectionTreeModel.CollectionChanged += HandleCollectionChanged; + ConnectionTreeModel.PropertyChanged += HandleCollectionPropertyChanged; + } + + private void HandleCollectionPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) + { + if (propertyChangedEventArgs.PropertyName != "Name") return; + var senderAsConnectionInfo = sender as ConnectionInfo; + if (senderAsConnectionInfo != null) + RefreshTreeObject(senderAsConnectionInfo); } private void PopulateTreeView() From 91ff0786cc5151843f5a7e7098ac1e2756ec549d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 12:30:18 -0600 Subject: [PATCH 201/338] Rearranged some functions --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index af3210b5c..b5a43c5c9 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -174,21 +174,6 @@ namespace mRemoteNG.UI.Window mMenSortAscending.Click += (sender, args) => SortNodesRecursive(GetRootConnectionNode(), ListSortDirection.Ascending); } - private void SetModelUpdateHandlers() - { - _puttySessionsManager.PuttySessionsCollectionChanged += (sender, args) => RefreshTreeObjects(GetRootPuttyNodes().ToList()); - ConnectionTreeModel.CollectionChanged += HandleCollectionChanged; - ConnectionTreeModel.PropertyChanged += HandleCollectionPropertyChanged; - } - - private void HandleCollectionPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) - { - if (propertyChangedEventArgs.PropertyName != "Name") return; - var senderAsConnectionInfo = sender as ConnectionInfo; - if (senderAsConnectionInfo != null) - RefreshTreeObject(senderAsConnectionInfo); - } - private void PopulateTreeView() { olvConnections.SetObjects(ConnectionTreeModel.RootNodes); @@ -199,7 +184,22 @@ namespace mRemoteNG.UI.Window OpenConnectionsFromLastSession(); } - private void ExpandRootConnectionNode() + private void SetModelUpdateHandlers() + { + _puttySessionsManager.PuttySessionsCollectionChanged += (sender, args) => RefreshTreeObjects(GetRootPuttyNodes().ToList()); + ConnectionTreeModel.CollectionChanged += HandleCollectionChanged; + ConnectionTreeModel.PropertyChanged += HandleCollectionPropertyChanged; + } + + private void HandleCollectionPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) + { + if (propertyChangedEventArgs.PropertyName != "Name") return; + var senderAsConnectionInfo = sender as ConnectionInfo; + if (senderAsConnectionInfo != null) + RefreshTreeObject(senderAsConnectionInfo); + } + + private void ExpandRootConnectionNode() { var rootConnectionNode = GetRootConnectionNode(); olvConnections.Expand(rootConnectionNode); From 3ac09748db87ae83040cef01130c1dab641796d1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 12:31:22 -0600 Subject: [PATCH 202/338] Opening a loading a putty session and showing the putty configuration window will no longer freeze mRemoteNG --- mRemoteV1/Connection/PuttySessionInfo.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/mRemoteV1/Connection/PuttySessionInfo.cs b/mRemoteV1/Connection/PuttySessionInfo.cs index b3720d0f0..45c832305 100644 --- a/mRemoteV1/Connection/PuttySessionInfo.cs +++ b/mRemoteV1/Connection/PuttySessionInfo.cs @@ -83,7 +83,6 @@ namespace mRemoteNG.Connection } puttyProcess.SetControlText("Button", "&Cancel", "&Close"); puttyProcess.SetControlVisible("Button", "&Open", false); - puttyProcess.WaitForExit(); } catch (Exception ex) { From 21475e0596ada1a221e63774fcc595677f373b8b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 12:38:50 -0600 Subject: [PATCH 203/338] Small code cleanup --- mRemoteV1/Connection/AbstractConnectionInfoData.cs | 13 +++---------- mRemoteV1/Container/ContainerInfo.cs | 4 ++-- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/mRemoteV1/Connection/AbstractConnectionInfoData.cs b/mRemoteV1/Connection/AbstractConnectionInfoData.cs index 58ac0d127..f4212ad28 100644 --- a/mRemoteV1/Connection/AbstractConnectionInfoData.cs +++ b/mRemoteV1/Connection/AbstractConnectionInfoData.cs @@ -625,23 +625,16 @@ namespace mRemoteNG.Connection } public event PropertyChangedEventHandler PropertyChanged; - protected virtual void OnPropertyChanged(string propertyName) + protected virtual void RaisePropertyChangedEvent(object sender, PropertyChangedEventArgs args) { - var handler = PropertyChanged; - handler?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - protected virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs args) - { - var handler = PropertyChanged; - handler?.Invoke(this, new PropertyChangedEventArgs(args.PropertyName)); + PropertyChanged?.Invoke(sender, new PropertyChangedEventArgs(args.PropertyName)); } protected bool SetField(ref T field, T value, string propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; - OnPropertyChanged(propertyName); + RaisePropertyChangedEvent(this, new PropertyChangedEventArgs(propertyName)); return true; } } diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 4adad3d1e..6cec738fe 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -233,7 +233,7 @@ namespace mRemoteNG.Container protected virtual void SubscribeToChildEvents(ConnectionInfo child) { - child.PropertyChanged += OnPropertyChanged; + child.PropertyChanged += RaisePropertyChangedEvent; var childAsContainer = child as ContainerInfo; if (childAsContainer == null) return; childAsContainer.CollectionChanged += RaiseCollectionChangedEvent; @@ -241,7 +241,7 @@ namespace mRemoteNG.Container protected virtual void UnsubscribeToChildEvents(ConnectionInfo child) { - child.PropertyChanged -= OnPropertyChanged; + child.PropertyChanged -= RaisePropertyChangedEvent; var childAsContainer = child as ContainerInfo; if (childAsContainer == null) return; childAsContainer.CollectionChanged -= RaiseCollectionChangedEvent; From 44053f92c64fb88b61024dfc8dd2a77919f36054 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 14:17:34 -0600 Subject: [PATCH 204/338] Importing mremoteng export files now works again --- mRemoteV1/App/Import.cs | 31 ++------- mRemoteV1/App/Runtime.cs | 3 - .../Config/Import/IConnectionImporter.cs | 10 +++ mRemoteV1/Config/Import/mRemoteNGImporter.cs | 69 ++++++++----------- mRemoteV1/UI/Forms/frmMain.cs | 7 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 6 +- mRemoteV1/mRemoteV1.csproj | 1 + 7 files changed, 58 insertions(+), 69 deletions(-) create mode 100644 mRemoteV1/Config/Import/IConnectionImporter.cs diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 028cf9a39..a8a47cbcd 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -13,8 +13,6 @@ namespace mRemoteNG.App { public class Import { - #region Private Enumerations - private enum FileType { Unknown = 0, @@ -25,12 +23,9 @@ namespace mRemoteNG.App PuttyConnectionManager } - #endregion - #region Public Methods //TODO Fix for TreeListView - public static void ImportFromFile(TreeNode rootTreeNode, TreeNode selectedTreeNode, - bool alwaysUseSelectedTreeNode = false) + public static void ImportFromFile(ContainerInfo importDestinationContainer, bool alwaysUseSelectedTreeNode = false) { try { @@ -55,12 +50,7 @@ namespace mRemoteNG.App return; } - var parentTreeNode = GetParentTreeNode(rootTreeNode, selectedTreeNode, alwaysUseSelectedTreeNode); - if (parentTreeNode == null) - { - return; - } - + IConnectionImporter importer; foreach (var fileName in openFileDialog.FileNames) { try @@ -68,16 +58,17 @@ namespace mRemoteNG.App switch (DetermineFileType(fileName)) { case FileType.mRemoteXml: - Config.Import.mRemoteNGImporter.Import(fileName, parentTreeNode); + importer = new mRemoteNGImporter(); + importer.Import(fileName, importDestinationContainer); break; case FileType.RemoteDesktopConnection: - RemoteDesktopConnection.Import(fileName, parentTreeNode); + //RemoteDesktopConnection.Import(fileName, importDestinationContainer); break; case FileType.RemoteDesktopConnectionManager: - RemoteDesktopConnectionManager.Import(fileName, parentTreeNode); + //RemoteDesktopConnectionManager.Import(fileName, importDestinationContainer); break; case FileType.PuttyConnectionManager: - PuttyConnectionManager.Import(fileName, parentTreeNode); + //PuttyConnectionManager.Import(fileName, importDestinationContainer); break; default: throw new FileFormatException("Unrecognized file format."); @@ -91,13 +82,6 @@ namespace mRemoteNG.App } } - parentTreeNode.Expand(); - var parentContainer = (ContainerInfo) parentTreeNode.Tag; - if (parentContainer != null) - { - parentContainer.IsExpanded = true; - } - Runtime.SaveConnectionsBG(); } } @@ -245,7 +229,6 @@ namespace mRemoteNG.App return FileType.Unknown; } } - #endregion } } \ No newline at end of file diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index a30e612f9..504fdcdf0 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -242,12 +242,10 @@ namespace mRemoteNG.App connectionsLoader.ConnectionList = ConnectionList; connectionsLoader.ContainerList = ContainerList; ConnectionTree.ResetTree(); - connectionsLoader.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; // Load config connectionsLoader.ConnectionFileName = filename; connectionsLoader.LoadConnections(false); - Windows.treeForm.tvConnections.SelectedNode = connectionsLoader.RootTreeNode; } catch (Exception ex) { @@ -562,7 +560,6 @@ namespace mRemoteNG.App connectionsSave.SaveSecurity = new Security.Save(); connectionsSave.ConnectionList = ConnectionList; connectionsSave.ContainerList = ContainerList; - connectionsSave.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; connectionsSave.ConnectionTreeModel = ConnectionTreeModel; connectionsSave.SaveConnections(); diff --git a/mRemoteV1/Config/Import/IConnectionImporter.cs b/mRemoteV1/Config/Import/IConnectionImporter.cs new file mode 100644 index 000000000..f09f9ae99 --- /dev/null +++ b/mRemoteV1/Config/Import/IConnectionImporter.cs @@ -0,0 +1,10 @@ +using mRemoteNG.Container; + + +namespace mRemoteNG.Config.Import +{ + public interface IConnectionImporter + { + void Import(object source, ContainerInfo destinationContainer); + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Import/mRemoteNGImporter.cs b/mRemoteV1/Config/Import/mRemoteNGImporter.cs index ea8cfe618..ead64f8b6 100644 --- a/mRemoteV1/Config/Import/mRemoteNGImporter.cs +++ b/mRemoteV1/Config/Import/mRemoteNGImporter.cs @@ -1,53 +1,44 @@ -using System.Windows.Forms; using System.IO; +using System.Linq; using mRemoteNG.App; using mRemoteNG.Config.Connections; +using mRemoteNG.Config.DataProviders; using mRemoteNG.Container; -using mRemoteNG.Connection; -using mRemoteNG.Tree; +using mRemoteNG.Messages; + namespace mRemoteNG.Config.Import { // ReSharper disable once InconsistentNaming - public class mRemoteNGImporter + public class mRemoteNGImporter : IConnectionImporter { - public static void Import(string fileName, TreeNode parentTreeNode) + public void Import(object filePath, ContainerInfo destinationContainer) + { + var filePathAsString = filePath as string; + if (filePathAsString == null) + { + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Unable to import file. File path is null."); + return; + } + + if(File.Exists(filePathAsString)) + Import(filePathAsString, destinationContainer); + else + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, $"Unable to import file. File does not exist. Path: {filePathAsString}"); + } + + + + public static void Import(string fileName, ContainerInfo destinationContainer) { - var name = Path.GetFileNameWithoutExtension(fileName); - var treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); + var dataProvider = new FileDataProvider(fileName); + var xmlString = dataProvider.Load(); + var xmlConnectionsDeserializer = new XmlConnectionsDeserializer(xmlString); + var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(true); - var containerInfo = new ContainerInfo - { - TreeNode = treeNode, - Name = name, - IsContainer = true - }; - - containerInfo.Inheritance = new ConnectionInfoInheritance(containerInfo); - - // We can only inherit from a container node, not the root node or connection nodes - var parent = parentTreeNode.Tag as ContainerInfo; - if (parent != null) - containerInfo.Parent = parent; - else - containerInfo.Inheritance.DisableInheritance(); - - treeNode.Name = name; - treeNode.Tag = containerInfo; - treeNode.ImageIndex = (int)TreeImageType.Container; - treeNode.SelectedImageIndex = (int)TreeImageType.Container; - - var connectionsLoad = new ConnectionsLoader - { - ConnectionFileName = fileName, - RootTreeNode = treeNode, - ConnectionList = Runtime.ConnectionList, - ContainerList = Runtime.ContainerList - }; - - connectionsLoad.LoadConnections(true); - Runtime.ContainerList.Add(containerInfo); + var rootImportContainer = new ContainerInfo { Name = Path.GetFileNameWithoutExtension(fileName) }; + rootImportContainer.Children.AddRange(connectionTreeModel.RootNodes.First().Children); + destinationContainer.AddChild(rootImportContainer); } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index a7fa0401f..0f7bf41d2 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -13,6 +13,7 @@ using mRemoteNG.Config.Putty; using mRemoteNG.Config.Settings; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; +using mRemoteNG.Container; using mRemoteNG.Messages; using mRemoteNG.Themes; using mRemoteNG.Tools; @@ -627,8 +628,10 @@ namespace mRemoteNG.UI.Forms } private void mMenFileImportFromFile_Click(object sender, EventArgs e) - { - Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode); + { + var selectedNode = ConnectionTreeWindow.SelectedNode; + var selectedNodeAsContainer = selectedNode as ContainerInfo ?? selectedNode.Parent; + Import.ImportFromFile(selectedNodeAsContainer); } private void mMenFileImportFromActiveDirectory_Click(object sender, EventArgs e) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index b5a43c5c9..c10676c08 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -150,7 +150,11 @@ namespace mRemoteNG.UI.Window _contextMenu.DuplicateClicked += (sender, args) => DuplicateSelectedNode(); _contextMenu.RenameClicked += (sender, args) => RenameSelectedNode(); _contextMenu.DeleteClicked += (sender, args) => DeleteSelectedNode(); - _contextMenu.ImportFileClicked += (sender, args) => Import.ImportFromFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, true); + _contextMenu.ImportFileClicked += (sender, args) => + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo ?? SelectedNode.Parent; + Import.ImportFromFile(selectedNodeAsContainer, true); + }; _contextMenu.ImportActiveDirectoryClicked += (sender, args) => Windows.Show(WindowType.ActiveDirectoryImport); _contextMenu.ImportPortScanClicked += (sender, args) => Windows.Show(WindowType.PortScan); _contextMenu.ExportFileClicked += (sender, args) => Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index b4941365c..dbe70f2f0 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -138,6 +138,7 @@ + From 9a07ac075f1538d2632b4873e4f5ae99b44f282a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 14:21:20 -0600 Subject: [PATCH 205/338] Renamed RemoteDesktopConnection to RemoteDesktopConnectionImporter --- ...eDesktopConnection.cs => RemoteDesktopConnectionImporter.cs} | 2 +- mRemoteV1/mRemoteV1.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename mRemoteV1/Config/Import/{RemoteDesktopConnection.cs => RemoteDesktopConnectionImporter.cs} (99%) diff --git a/mRemoteV1/Config/Import/RemoteDesktopConnection.cs b/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs similarity index 99% rename from mRemoteV1/Config/Import/RemoteDesktopConnection.cs rename to mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs index 4f873d8b4..e8e73454c 100644 --- a/mRemoteV1/Config/Import/RemoteDesktopConnection.cs +++ b/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs @@ -9,7 +9,7 @@ using mRemoteNG.Tree; namespace mRemoteNG.Config.Import { - public class RemoteDesktopConnection + public class RemoteDesktopConnectionImporter { public static void Import(string fileName, TreeNode parentTreeNode) { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index dbe70f2f0..bdead19b2 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -163,7 +163,7 @@ - + From 00adac42b88ea408cb7cafa84cdefd0f40538b67 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 15:17:54 -0600 Subject: [PATCH 206/338] mRemoteNG import doesnt need to be static --- mRemoteV1/Config/Import/mRemoteNGImporter.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mRemoteV1/Config/Import/mRemoteNGImporter.cs b/mRemoteV1/Config/Import/mRemoteNGImporter.cs index ead64f8b6..9172380c7 100644 --- a/mRemoteV1/Config/Import/mRemoteNGImporter.cs +++ b/mRemoteV1/Config/Import/mRemoteNGImporter.cs @@ -27,9 +27,7 @@ namespace mRemoteNG.Config.Import Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, $"Unable to import file. File does not exist. Path: {filePathAsString}"); } - - - public static void Import(string fileName, ContainerInfo destinationContainer) + public void Import(string fileName, ContainerInfo destinationContainer) { var dataProvider = new FileDataProvider(fileName); var xmlString = dataProvider.Load(); From 0a3f201cb75d6d1004769dd60b1fd9385866cf63 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 15:20:28 -0600 Subject: [PATCH 207/338] Created a deserializer for microsoft RDC and updated the importer --- mRemoteV1/App/Import.cs | 3 +- .../RemoteDesktopConnectionDeserializer.cs | 134 ++++++++++ .../Import/RemoteDesktopConnectionImporter.cs | 235 ++---------------- mRemoteV1/mRemoteV1.csproj | 1 + 4 files changed, 164 insertions(+), 209 deletions(-) create mode 100644 mRemoteV1/Config/Connections/RemoteDesktopConnectionDeserializer.cs diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index a8a47cbcd..a6265d59a 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -62,7 +62,8 @@ namespace mRemoteNG.App importer.Import(fileName, importDestinationContainer); break; case FileType.RemoteDesktopConnection: - //RemoteDesktopConnection.Import(fileName, importDestinationContainer); + importer = new RemoteDesktopConnectionImporter(); + importer.Import(fileName, importDestinationContainer); break; case FileType.RemoteDesktopConnectionManager: //RemoteDesktopConnectionManager.Import(fileName, importDestinationContainer); diff --git a/mRemoteV1/Config/Connections/RemoteDesktopConnectionDeserializer.cs b/mRemoteV1/Config/Connections/RemoteDesktopConnectionDeserializer.cs new file mode 100644 index 000000000..bdefe4a95 --- /dev/null +++ b/mRemoteV1/Config/Connections/RemoteDesktopConnectionDeserializer.cs @@ -0,0 +1,134 @@ +using System; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class RemoteDesktopConnectionDeserializer : IDeserializer + { + private readonly string[] _fileContent; + + public RemoteDesktopConnectionDeserializer(string[] fileContent) + { + _fileContent = fileContent; + } + + public ConnectionTreeModel Deserialize() + { + var connectionTreeModel = new ConnectionTreeModel(); + var root = new RootNodeInfo(RootNodeType.Connection); + connectionTreeModel.AddRootNode(root); + var connectionInfo = new ConnectionInfo(); + foreach (var line in _fileContent) + { + var parts = line.Split(new[] { ':' }, 3); + if (parts.Length < 3) + { + continue; + } + + var key = parts[0]; + var value = parts[2]; + + SetConnectionInfoParameter(connectionInfo, key, value); + } + root.AddChild(connectionInfo); + + return connectionTreeModel; + } + + + private void SetConnectionInfoParameter(ConnectionInfo connectionInfo, string key, string value) + { + switch (key.ToLower()) + { + case "full address": + var uri = new Uri("dummyscheme" + Uri.SchemeDelimiter + value); + if (!string.IsNullOrEmpty(uri.Host)) + connectionInfo.Hostname = uri.Host; + if (uri.Port != -1) + connectionInfo.Port = uri.Port; + break; + case "server port": + connectionInfo.Port = Convert.ToInt32(value); + break; + case "username": + connectionInfo.Username = value; + break; + case "domain": + connectionInfo.Domain = value; + break; + case "session bpp": + switch (value) + { + case "8": + connectionInfo.Colors = ProtocolRDP.RDPColors.Colors256; + break; + case "15": + connectionInfo.Colors = ProtocolRDP.RDPColors.Colors15Bit; + break; + case "16": + connectionInfo.Colors = ProtocolRDP.RDPColors.Colors16Bit; + break; + case "24": + connectionInfo.Colors = ProtocolRDP.RDPColors.Colors24Bit; + break; + case "32": + connectionInfo.Colors = ProtocolRDP.RDPColors.Colors32Bit; + break; + } + break; + case "bitmapcachepersistenable": + connectionInfo.CacheBitmaps = value == "1"; + break; + case "screen mode id": + connectionInfo.Resolution = value == "2" ? ProtocolRDP.RDPResolutions.Fullscreen : ProtocolRDP.RDPResolutions.FitToWindow; + break; + case "connect to console": + connectionInfo.UseConsoleSession = value == "1"; + break; + case "disable wallpaper": + connectionInfo.DisplayWallpaper = value == "1"; + break; + case "disable themes": + connectionInfo.DisplayThemes = value == "1"; + break; + case "allow font smoothing": + connectionInfo.EnableFontSmoothing = value == "1"; + break; + case "allow desktop composition": + connectionInfo.EnableDesktopComposition = value == "1"; + break; + case "redirectsmartcards": + connectionInfo.RedirectSmartCards = value == "1"; + break; + case "redirectdrives": + connectionInfo.RedirectDiskDrives = value == "1"; + break; + case "redirectcomports": + connectionInfo.RedirectPorts = value == "1"; + break; + case "redirectprinters": + connectionInfo.RedirectPrinters = value == "1"; + break; + case "audiomode": + switch (value) + { + case "0": + connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.BringToThisComputer; + break; + case "1": + connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.LeaveAtRemoteComputer; + break; + case "2": + connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.DoNotPlay; + break; + } + break; + } + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs b/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs index e8e73454c..60e6c1c67 100644 --- a/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs +++ b/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs @@ -1,221 +1,40 @@ using System; -using System.Windows.Forms; using System.IO; +using System.Linq; using mRemoteNG.App; -using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Config.Connections; +using mRemoteNG.Config.DataProviders; using mRemoteNG.Container; using mRemoteNG.Connection; -using mRemoteNG.Tree; + namespace mRemoteNG.Config.Import { - public class RemoteDesktopConnectionImporter + public class RemoteDesktopConnectionImporter : IConnectionImporter { - public static void Import(string fileName, TreeNode parentTreeNode) + public void Import(object fileName, ContainerInfo destinationContainer) + { + var fileNameAsString = fileName as string; + if(fileNameAsString == null) + return; + if (File.Exists(fileNameAsString)) + Import(fileNameAsString, destinationContainer); + } + + public void Import(string fileName, ContainerInfo destinationContainer) { - string[] lines = File.ReadAllLines(fileName); - - string name = Path.GetFileNameWithoutExtension(fileName); - TreeNode treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - ConnectionInfo connectionInfo = new ConnectionInfo(); - connectionInfo.Inheritance = new ConnectionInfoInheritance(connectionInfo); - connectionInfo.Name = name; - connectionInfo.TreeNode = treeNode; - - if (treeNode.Parent.Tag is ContainerInfo) - { - connectionInfo.Parent = (ContainerInfo)treeNode.Parent.Tag; - } - - treeNode.Name = name; - treeNode.Tag = connectionInfo; - treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; - treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; - - foreach (string line in lines) - { - string[] parts = line.Split(new char[] {':'}, 3); - if (parts.Length < 3) - { - continue; - } - - string key = parts[0]; - string value = parts[2]; - - SetConnectionInfoParameter(connectionInfo, key, value); - } - - Runtime.ConnectionList.Add(connectionInfo); - } + var dataProvider = new FileDataProvider(fileName); + var content = dataProvider.Load(); + var lines = content.Split(Environment.NewLine.ToCharArray()); + + var deserializer = new RemoteDesktopConnectionDeserializer(lines); + var connectionTreeModel = deserializer.Deserialize(); + + var importedConnection = connectionTreeModel.RootNodes.First().Children.First(); - private static void SetConnectionInfoParameter(ConnectionInfo connectionInfo, string key, string value) - { - switch (key.ToLower()) - { - case "full address": - Uri uri = new Uri("dummyscheme" + Uri.SchemeDelimiter + value); - if (!string.IsNullOrEmpty(uri.Host)) - { - connectionInfo.Hostname = uri.Host; - } - if (!(uri.Port == -1)) - { - connectionInfo.Port = uri.Port; - } - break; - case "server port": - connectionInfo.Port = Convert.ToInt32(value); - break; - case "username": - connectionInfo.Username = value; - break; - case "domain": - connectionInfo.Domain = value; - break; - case "session bpp": - switch (value) - { - case "8": - connectionInfo.Colors = ProtocolRDP.RDPColors.Colors256; - break; - case "15": - connectionInfo.Colors = ProtocolRDP.RDPColors.Colors15Bit; - break; - case "16": - connectionInfo.Colors = ProtocolRDP.RDPColors.Colors16Bit; - break; - case "24": - connectionInfo.Colors = ProtocolRDP.RDPColors.Colors24Bit; - break; - case "32": - connectionInfo.Colors = ProtocolRDP.RDPColors.Colors32Bit; - break; - } - break; - case "bitmapcachepersistenable": - if (value == "1") - { - connectionInfo.CacheBitmaps = true; - } - else - { - connectionInfo.CacheBitmaps = false; - } - break; - case "screen mode id": - if (value == "2") - { - connectionInfo.Resolution = ProtocolRDP.RDPResolutions.Fullscreen; - } - else - { - connectionInfo.Resolution = ProtocolRDP.RDPResolutions.FitToWindow; - } - break; - case "connect to console": - if (value == "1") - { - connectionInfo.UseConsoleSession = true; - } - break; - case "disable wallpaper": - if (value == "1") - { - connectionInfo.DisplayWallpaper = true; - } - else - { - connectionInfo.DisplayWallpaper = false; - } - break; - case "disable themes": - if (value == "1") - { - connectionInfo.DisplayThemes = true; - } - else - { - connectionInfo.DisplayThemes = false; - } - break; - case "allow font smoothing": - if (value == "1") - { - connectionInfo.EnableFontSmoothing = true; - } - else - { - connectionInfo.EnableFontSmoothing = false; - } - break; - case "allow desktop composition": - if (value == "1") - { - connectionInfo.EnableDesktopComposition = true; - } - else - { - connectionInfo.EnableDesktopComposition = false; - } - break; - case "redirectsmartcards": - if (value == "1") - { - connectionInfo.RedirectSmartCards = true; - } - else - { - connectionInfo.RedirectSmartCards = false; - } - break; - case "redirectdrives": - if (value == "1") - { - connectionInfo.RedirectDiskDrives = true; - } - else - { - connectionInfo.RedirectDiskDrives = false; - } - break; - case "redirectcomports": - if (value == "1") - { - connectionInfo.RedirectPorts = true; - } - else - { - connectionInfo.RedirectPorts = false; - } - break; - case "redirectprinters": - if (value == "1") - { - connectionInfo.RedirectPrinters = true; - } - else - { - connectionInfo.RedirectPrinters = false; - } - break; - case "audiomode": - switch (value) - { - case "0": - connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.BringToThisComputer; - break; - case "1": - connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.LeaveAtRemoteComputer; - break; - case "2": - connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.DoNotPlay; - break; - } - break; - } + if (importedConnection == null) return; + importedConnection.Name = Path.GetFileNameWithoutExtension(fileName); + destinationContainer.AddChild(importedConnection); } - } + } } \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index bdead19b2..16cc306d3 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -130,6 +130,7 @@ + From d8ffed6e75345d1697dcf77fbf32be90a76a213b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 15:21:35 -0600 Subject: [PATCH 208/338] Renamed PortScan to PortScanImporter --- mRemoteV1/App/Import.cs | 2 +- mRemoteV1/Config/Import/{PortScan.cs => PortScanImporter.cs} | 2 +- mRemoteV1/mRemoteV1.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename mRemoteV1/Config/Import/{PortScan.cs => PortScanImporter.cs} (98%) diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index a6265d59a..5bd204efa 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -136,7 +136,7 @@ namespace mRemoteNG.App return; } - PortScan.Import(hosts, protocol, parentTreeNode); + PortScanImporter.Import(hosts, protocol, parentTreeNode); parentTreeNode.Expand(); var parentContainer = (ContainerInfo) parentTreeNode.Tag; diff --git a/mRemoteV1/Config/Import/PortScan.cs b/mRemoteV1/Config/Import/PortScanImporter.cs similarity index 98% rename from mRemoteV1/Config/Import/PortScan.cs rename to mRemoteV1/Config/Import/PortScanImporter.cs index 90374531a..acc4aeb6c 100644 --- a/mRemoteV1/Config/Import/PortScan.cs +++ b/mRemoteV1/Config/Import/PortScanImporter.cs @@ -9,7 +9,7 @@ using mRemoteNG.Tools; namespace mRemoteNG.Config.Import { - public static class PortScan + public static class PortScanImporter { public static void Import(IEnumerable hosts, ProtocolType protocol, TreeNode parentTreeNode) { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 16cc306d3..4ee88948c 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -162,7 +162,7 @@ - + From e8080aff582941ee2b5597a4e31aa9a96a09a84f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 15:22:46 -0600 Subject: [PATCH 209/338] Renamed ActiveDirectory to ActiveDirectoryImporter --- mRemoteV1/App/Import.cs | 2 +- .../Import/{ActiveDirectory.cs => ActiveDirectoryImporter.cs} | 2 +- mRemoteV1/mRemoteV1.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename mRemoteV1/Config/Import/{ActiveDirectory.cs => ActiveDirectoryImporter.cs} (98%) diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 5bd204efa..034bae143 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -105,7 +105,7 @@ namespace mRemoteNG.App return; } - ActiveDirectory.Import(ldapPath, parentTreeNode); + ActiveDirectoryImporter.Import(ldapPath, parentTreeNode); parentTreeNode.Expand(); var parentContainer = (ContainerInfo) parentTreeNode.Tag; diff --git a/mRemoteV1/Config/Import/ActiveDirectory.cs b/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs similarity index 98% rename from mRemoteV1/Config/Import/ActiveDirectory.cs rename to mRemoteV1/Config/Import/ActiveDirectoryImporter.cs index 045da331b..8eaf08fa2 100644 --- a/mRemoteV1/Config/Import/ActiveDirectory.cs +++ b/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs @@ -9,7 +9,7 @@ using mRemoteNG.Tree; namespace mRemoteNG.Config.Import { - public class ActiveDirectory + public class ActiveDirectoryImporter { public static void Import(string ldapPath, TreeNode parentTreeNode) { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 4ee88948c..772377083 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -160,7 +160,7 @@ - + From 7047f2580f579d987c212c35d4ca1bb2f15699da Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 22 Sep 2016 15:24:06 -0600 Subject: [PATCH 210/338] Cleanup --- mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs b/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs index 60e6c1c67..51eb73f45 100644 --- a/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs +++ b/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs @@ -1,11 +1,9 @@ using System; using System.IO; using System.Linq; -using mRemoteNG.App; using mRemoteNG.Config.Connections; using mRemoteNG.Config.DataProviders; using mRemoteNG.Container; -using mRemoteNG.Connection; namespace mRemoteNG.Config.Import From 79a423fc18fb47113bd2b6a7c80f84514720e0d0 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 08:38:08 -0600 Subject: [PATCH 211/338] Renamed RemoteDesktopConnectionManager to RemoteDesktopConnectionManagerImporter --- ...ectionManager.cs => RemoteDesktopConnectionManagerImporter.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename mRemoteV1/Config/Import/{RemoteDesktopConnectionManager.cs => RemoteDesktopConnectionManagerImporter.cs} (100%) diff --git a/mRemoteV1/Config/Import/RemoteDesktopConnectionManager.cs b/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs similarity index 100% rename from mRemoteV1/Config/Import/RemoteDesktopConnectionManager.cs rename to mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs From b0be42815d59ea9e146b0dce27d9bf148488fc15 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 08:49:29 -0600 Subject: [PATCH 212/338] Cleanup of RDCM Importer --- .../RemoteDesktopConnectionManagerImporter.cs | 199 ++++++++---------- 1 file changed, 91 insertions(+), 108 deletions(-) diff --git a/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs b/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs index 00ef91bf0..62a36c316 100644 --- a/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs +++ b/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs @@ -11,44 +11,46 @@ using mRemoteNG.Tree; namespace mRemoteNG.Config.Import { - public class RemoteDesktopConnectionManager + public class RemoteDesktopConnectionManagerImporter { - public static void Import(string fileName, TreeNode parentTreeNode) + public static void Import(string fileName, TreeNode parentTreeNode) { - XmlDocument xmlDocument = new XmlDocument(); + var xmlDocument = new XmlDocument(); xmlDocument.Load(fileName); - - XmlNode rdcManNode = xmlDocument.SelectSingleNode("/RDCMan"); - int schemaVersion = Convert.ToInt32(rdcManNode.Attributes["schemaVersion"].Value); - if (!(schemaVersion == 1)) + + var rdcManNode = xmlDocument.SelectSingleNode("/RDCMan"); + var schemaVersion = Convert.ToInt32(rdcManNode?.Attributes?["schemaVersion"].Value); + if (schemaVersion != 1) { - throw (new FileFormatException(string.Format("Unsupported schema version ({0}).", schemaVersion))); + throw (new FileFormatException($"Unsupported schema version ({schemaVersion}).")); } - XmlNode versionNode = rdcManNode.SelectSingleNode("./version"); - Version version = new Version(versionNode.InnerText); + var versionNode = rdcManNode.SelectSingleNode("./version"); + var version = new Version(versionNode.InnerText); if (!(version == new Version(2, 2))) { - throw (new FileFormatException(string.Format("Unsupported file version ({0}).", version))); + throw (new FileFormatException($"Unsupported file version ({version}).")); } - - XmlNode fileNode = rdcManNode.SelectSingleNode("./file"); + + var fileNode = rdcManNode.SelectSingleNode("./file"); ImportFileOrGroup(fileNode, parentTreeNode); } private static void ImportFileOrGroup(XmlNode xmlNode, TreeNode parentTreeNode) { - XmlNode propertiesNode = xmlNode.SelectSingleNode("./properties"); - string name = propertiesNode.SelectSingleNode("./name").InnerText; - - TreeNode treeNode = new TreeNode(name); + var propertiesNode = xmlNode.SelectSingleNode("./properties"); + var name = propertiesNode?.SelectSingleNode("./name")?.InnerText; + + var treeNode = new TreeNode(name); parentTreeNode.Nodes.Add(treeNode); - ContainerInfo containerInfo = new ContainerInfo(); - containerInfo.TreeNode = treeNode; - containerInfo.Name = name; + var containerInfo = new ContainerInfo + { + TreeNode = treeNode, + Name = name + }; - ConnectionInfo connectionInfo = ConnectionInfoFromXml(propertiesNode); + var connectionInfo = ConnectionInfoFromXml(propertiesNode); connectionInfo.Parent = containerInfo; connectionInfo.IsContainer = true; containerInfo.CopyFrom(connectionInfo); @@ -81,7 +83,7 @@ namespace mRemoteNG.Config.Import } } - containerInfo.IsExpanded = bool.Parse(propertiesNode.SelectSingleNode("./expanded").InnerText); + containerInfo.IsExpanded = bool.Parse(propertiesNode.SelectSingleNode("./expanded")?.InnerText); if (containerInfo.IsExpanded) { treeNode.Expand(); @@ -92,11 +94,11 @@ namespace mRemoteNG.Config.Import private static void ImportServer(XmlNode serverNode, TreeNode parentTreeNode) { - string name = serverNode.SelectSingleNode("./displayName").InnerText; - TreeNode treeNode = new TreeNode(name); + var name = serverNode.SelectSingleNode("./displayName")?.InnerText ?? ""; + var treeNode = new TreeNode(name); parentTreeNode.Nodes.Add(treeNode); - - ConnectionInfo connectionInfo = ConnectionInfoFromXml(serverNode); + + var connectionInfo = ConnectionInfoFromXml(serverNode); connectionInfo.TreeNode = treeNode; connectionInfo.Parent = (ContainerInfo)parentTreeNode.Tag; @@ -110,42 +112,28 @@ namespace mRemoteNG.Config.Import private static ConnectionInfo ConnectionInfoFromXml(XmlNode xmlNode) { - ConnectionInfo connectionInfo = new ConnectionInfo(); + var connectionInfo = new ConnectionInfo(); connectionInfo.Inheritance = new ConnectionInfoInheritance(connectionInfo); - - string name = xmlNode.SelectSingleNode("./name").InnerText; - - string displayName = ""; - XmlNode displayNameNode = xmlNode.SelectSingleNode("./displayName"); - if (displayNameNode == null) - { - displayName = name; - } - else - { - displayName = displayNameNode.InnerText; - } + + var name = xmlNode.SelectSingleNode("./name")?.InnerText; + + var displayName = ""; + var displayNameNode = xmlNode.SelectSingleNode("./displayName"); + displayName = displayNameNode?.InnerText ?? name; connectionInfo.Name = displayName; - connectionInfo.Description = xmlNode.SelectSingleNode("./comment").InnerText; + connectionInfo.Description = xmlNode.SelectSingleNode("./comment")?.InnerText; connectionInfo.Hostname = name; - - XmlNode logonCredentialsNode = xmlNode.SelectSingleNode("./logonCredentials"); - if (logonCredentialsNode.Attributes["inherit"].Value == "None") + + var logonCredentialsNode = xmlNode.SelectSingleNode("./logonCredentials"); + if (logonCredentialsNode?.Attributes?["inherit"].Value == "None") { - connectionInfo.Username = logonCredentialsNode.SelectSingleNode("userName").InnerText; + connectionInfo.Username = logonCredentialsNode.SelectSingleNode("userName")?.InnerText; + + var passwordNode = logonCredentialsNode.SelectSingleNode("./password"); + connectionInfo.Password = passwordNode?.Attributes?["storeAsClearText"].Value == "True" ? passwordNode.InnerText : DecryptPassword(passwordNode?.InnerText); - XmlNode passwordNode = logonCredentialsNode.SelectSingleNode("./password"); - if (passwordNode.Attributes["storeAsClearText"].Value == "True") - { - connectionInfo.Password = passwordNode.InnerText; - } - else - { - connectionInfo.Password = DecryptPassword(passwordNode.InnerText); - } - - connectionInfo.Domain = logonCredentialsNode.SelectSingleNode("./domain").InnerText; + connectionInfo.Domain = logonCredentialsNode.SelectSingleNode("./domain")?.InnerText; } else { @@ -153,38 +141,31 @@ namespace mRemoteNG.Config.Import connectionInfo.Inheritance.Password = true; connectionInfo.Inheritance.Domain = true; } - - XmlNode connectionSettingsNode = xmlNode.SelectSingleNode("./connectionSettings"); - if (connectionSettingsNode.Attributes["inherit"].Value == "None") + + var connectionSettingsNode = xmlNode.SelectSingleNode("./connectionSettings"); + if (connectionSettingsNode?.Attributes?["inherit"].Value == "None") { - connectionInfo.UseConsoleSession = bool.Parse(connectionSettingsNode.SelectSingleNode("./connectToConsole").InnerText); + connectionInfo.UseConsoleSession = bool.Parse(connectionSettingsNode.SelectSingleNode("./connectToConsole")?.InnerText); // ./startProgram // ./workingDir - connectionInfo.Port = Convert.ToInt32(connectionSettingsNode.SelectSingleNode("./port").InnerText); + connectionInfo.Port = Convert.ToInt32(connectionSettingsNode.SelectSingleNode("./port")?.InnerText); } else { connectionInfo.Inheritance.UseConsoleSession = true; connectionInfo.Inheritance.Port = true; } - - XmlNode gatewaySettingsNode = xmlNode.SelectSingleNode("./gatewaySettings"); - if (gatewaySettingsNode.Attributes["inherit"].Value == "None") + + var gatewaySettingsNode = xmlNode.SelectSingleNode("./gatewaySettings"); + if (gatewaySettingsNode?.Attributes?["inherit"].Value == "None") { - if (gatewaySettingsNode.SelectSingleNode("./enabled").InnerText == "True") - { - connectionInfo.RDGatewayUsageMethod = ProtocolRDP.RDGatewayUsageMethod.Always; - } - else - { - connectionInfo.RDGatewayUsageMethod = ProtocolRDP.RDGatewayUsageMethod.Never; - } + connectionInfo.RDGatewayUsageMethod = gatewaySettingsNode.SelectSingleNode("./enabled")?.InnerText == "True" ? ProtocolRDP.RDGatewayUsageMethod.Always : ProtocolRDP.RDGatewayUsageMethod.Never; - connectionInfo.RDGatewayHostname = gatewaySettingsNode.SelectSingleNode("./hostName").InnerText; - connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName").InnerText; - - XmlNode passwordNode = logonCredentialsNode.SelectSingleNode("./password"); - if (passwordNode.Attributes["storeAsClearText"].Value == "True") + connectionInfo.RDGatewayHostname = gatewaySettingsNode.SelectSingleNode("./hostName")?.InnerText; + connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName")?.InnerText; + + var passwordNode = logonCredentialsNode.SelectSingleNode("./password"); + if (passwordNode?.Attributes?["storeAsClearText"].Value == "True") { connectionInfo.RDGatewayPassword = passwordNode.InnerText; } @@ -193,7 +174,7 @@ namespace mRemoteNG.Config.Import connectionInfo.Password = DecryptPassword(passwordNode.InnerText); } - connectionInfo.RDGatewayDomain = gatewaySettingsNode.SelectSingleNode("./domain").InnerText; + connectionInfo.RDGatewayDomain = gatewaySettingsNode.SelectSingleNode("./domain")?.InnerText; // ./logonMethod // ./localBypass // ./credSharing @@ -206,11 +187,11 @@ namespace mRemoteNG.Config.Import connectionInfo.Inheritance.RDGatewayPassword = true; connectionInfo.Inheritance.RDGatewayDomain = true; } - - XmlNode remoteDesktopNode = xmlNode.SelectSingleNode("./remoteDesktop"); - if (remoteDesktopNode.Attributes["inherit"].Value == "None") + + var remoteDesktopNode = xmlNode.SelectSingleNode("./remoteDesktop"); + if (remoteDesktopNode?.Attributes?["inherit"].Value == "None") { - string resolutionString = Convert.ToString(remoteDesktopNode.SelectSingleNode("./size").InnerText.Replace(" ", "")); + var resolutionString = Convert.ToString(remoteDesktopNode.SelectSingleNode("./size")?.InnerText.Replace(" ", "")); try { connectionInfo.Resolution = (ProtocolRDP.RDPResolutions)Enum.Parse(typeof(ProtocolRDP.RDPResolutions), "Res" + resolutionString); @@ -220,12 +201,12 @@ namespace mRemoteNG.Config.Import connectionInfo.Resolution = ProtocolRDP.RDPResolutions.FitToWindow; } - if (remoteDesktopNode.SelectSingleNode("./sameSizeAsClientArea").InnerText == "True") + if (remoteDesktopNode.SelectSingleNode("./sameSizeAsClientArea")?.InnerText == "True") { connectionInfo.Resolution = ProtocolRDP.RDPResolutions.FitToWindow; } - if (remoteDesktopNode.SelectSingleNode("./fullScreen").InnerText == "True") + if (remoteDesktopNode.SelectSingleNode("./fullScreen")?.InnerText == "True") { connectionInfo.Resolution = ProtocolRDP.RDPResolutions.Fullscreen; } @@ -238,11 +219,11 @@ namespace mRemoteNG.Config.Import connectionInfo.Inheritance.Resolution = true; connectionInfo.Inheritance.Colors = true; } - - XmlNode localResourcesNode = xmlNode.SelectSingleNode("./localResources"); - if (localResourcesNode.Attributes["inherit"].Value == "None") + + var localResourcesNode = xmlNode.SelectSingleNode("./localResources"); + if (localResourcesNode?.Attributes?["inherit"].Value == "None") { - switch (localResourcesNode.SelectSingleNode("./audioRedirection").InnerText) + switch (localResourcesNode.SelectSingleNode("./audioRedirection")?.InnerText) { case "0": // Bring to this computer connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.BringToThisComputer; @@ -258,7 +239,7 @@ namespace mRemoteNG.Config.Import // ./audioRedirectionQuality // ./audioCaptureRedirection - switch (localResourcesNode.SelectSingleNode("./keyboardHook").InnerText) + switch (localResourcesNode.SelectSingleNode("./keyboardHook")?.InnerText) { case "0": // On the local computer connectionInfo.RedirectKeys = false; @@ -286,11 +267,11 @@ namespace mRemoteNG.Config.Import connectionInfo.Inheritance.RedirectPrinters = true; connectionInfo.Inheritance.RedirectSmartCards = true; } - - XmlNode securitySettingsNode = xmlNode.SelectSingleNode("./securitySettings"); - if (securitySettingsNode.Attributes["inherit"].Value == "None") + + var securitySettingsNode = xmlNode.SelectSingleNode("./securitySettings"); + if (securitySettingsNode?.Attributes?["inherit"].Value == "None") { - switch (securitySettingsNode.SelectSingleNode("./authentication").InnerText) + switch (securitySettingsNode.SelectSingleNode("./authentication")?.InnerText) { case "0": // No authentication connectionInfo.RDPAuthenticationLevel = ProtocolRDP.AuthenticationLevel.NoAuth; @@ -321,34 +302,36 @@ namespace mRemoteNG.Config.Import { return null; } - - GCHandle gcHandle = new GCHandle(); - NativeMethods.DATA_BLOB plaintextData = new NativeMethods.DATA_BLOB(); + + var gcHandle = new GCHandle(); + var plaintextData = new NativeMethods.DATA_BLOB(); try { - byte[] ciphertextArray = Convert.FromBase64String(ciphertext); + var ciphertextArray = Convert.FromBase64String(ciphertext); gcHandle = GCHandle.Alloc(ciphertextArray, GCHandleType.Pinned); - - NativeMethods.DATA_BLOB ciphertextData = new NativeMethods.DATA_BLOB(); - ciphertextData.cbData = ciphertextArray.Length; - ciphertextData.pbData = gcHandle.AddrOfPinnedObject(); - NativeMethods.DATA_BLOB temp_optionalEntropy = new NativeMethods.DATA_BLOB(); - IntPtr temp_promptStruct = IntPtr.Zero; - if (!NativeMethods.CryptUnprotectData(ref ciphertextData, null, ref temp_optionalEntropy, IntPtr.Zero, ref temp_promptStruct, 0, ref plaintextData)) + var ciphertextData = new NativeMethods.DATA_BLOB + { + cbData = ciphertextArray.Length, + pbData = gcHandle.AddrOfPinnedObject() + }; + + var tempOptionalEntropy = new NativeMethods.DATA_BLOB(); + var tempPromptStruct = IntPtr.Zero; + if (!NativeMethods.CryptUnprotectData(ref ciphertextData, null, ref tempOptionalEntropy, IntPtr.Zero, ref tempPromptStruct, 0, ref plaintextData)) { return null; } - - int plaintextLength = (int) ((double) plaintextData.cbData / 2); // Char = 2 bytes - char[] plaintextArray = new char[plaintextLength - 1 + 1]; + + var plaintextLength = (int) ((double) plaintextData.cbData / 2); // Char = 2 bytes + var plaintextArray = new char[plaintextLength - 1 + 1]; Marshal.Copy(plaintextData.pbData, plaintextArray, 0, plaintextLength); return new string(plaintextArray); } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage(message: "RemoteDesktopConnectionManager.DecryptPassword() failed.", ex: ex, logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("RemoteDesktopConnectionManager.DecryptPassword() failed.", ex, logOnly: true); return null; } finally From 6bf493f9a101b8d2f56d8d70137b025dc8c713e8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 10:12:18 -0600 Subject: [PATCH 213/338] Created a RemoteDesktopConnectionManagerDeserializer. Importing from RDCM now works --- mRemoteV1/App/Import.cs | 3 +- ...oteDesktopConnectionManagerDeserializer.cs | 363 +++++++++++++++++ .../RemoteDesktopConnectionManagerImporter.cs | 383 ++---------------- mRemoteV1/mRemoteV1.csproj | 3 +- 4 files changed, 391 insertions(+), 361 deletions(-) create mode 100644 mRemoteV1/Config/Connections/RemoteDesktopConnectionManagerDeserializer.cs diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 034bae143..e54a2ab7d 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -66,7 +66,8 @@ namespace mRemoteNG.App importer.Import(fileName, importDestinationContainer); break; case FileType.RemoteDesktopConnectionManager: - //RemoteDesktopConnectionManager.Import(fileName, importDestinationContainer); + importer = new RemoteDesktopConnectionManagerImporter(); + importer.Import(fileName, importDestinationContainer); break; case FileType.PuttyConnectionManager: //PuttyConnectionManager.Import(fileName, importDestinationContainer); diff --git a/mRemoteV1/Config/Connections/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Connections/RemoteDesktopConnectionManagerDeserializer.cs new file mode 100644 index 000000000..ac335ea3e --- /dev/null +++ b/mRemoteV1/Config/Connections/RemoteDesktopConnectionManagerDeserializer.cs @@ -0,0 +1,363 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Xml; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class RemoteDesktopConnectionManagerDeserializer : IDeserializer + { + private readonly string _rdcmConnectionsXml; + + public RemoteDesktopConnectionManagerDeserializer(string xml) + { + _rdcmConnectionsXml = xml; + } + + public ConnectionTreeModel Deserialize() + { + var connectionTreeModel = new ConnectionTreeModel(); + var root = new RootNodeInfo(RootNodeType.Connection); + + var xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(_rdcmConnectionsXml); + + + var rdcManNode = xmlDocument.SelectSingleNode("/RDCMan"); + VerifySchemaVersion(rdcManNode); + VerifyFileVersion(rdcManNode); + + var fileNode = rdcManNode?.SelectSingleNode("./file"); + ImportFileOrGroup(fileNode, root); + + connectionTreeModel.AddRootNode(root); + return connectionTreeModel; + } + + private void VerifySchemaVersion(XmlNode rdcManNode) + { + var schemaVersion = Convert.ToInt32(rdcManNode?.Attributes?["schemaVersion"].Value); + if (schemaVersion != 1) + { + throw (new FileFormatException($"Unsupported schema version ({schemaVersion}).")); + } + } + + private void VerifyFileVersion(XmlNode rdcManNode) + { + var versionNode = rdcManNode.SelectSingleNode("./version"); + var version = new Version(versionNode.InnerText); + if (!(version == new Version(2, 2))) + { + throw (new FileFormatException($"Unsupported file version ({version}).")); + } + } + + private void ImportFileOrGroup(XmlNode xmlNode, ContainerInfo parentContainer) + { + var propertiesNode = xmlNode.SelectSingleNode("./properties"); + var newContainer = ImportContainer(propertiesNode, parentContainer); + + var childNodes = xmlNode.SelectNodes("./group|./server"); + if (childNodes == null) return; + foreach (XmlNode childNode in childNodes) + { + switch (childNode.Name) + { + case "group": + ImportFileOrGroup(childNode, newContainer); + break; + case "server": + ImportServer(childNode, newContainer); + break; + } + } + + Runtime.ContainerList.Add(newContainer); + } + + private ContainerInfo ImportContainer(XmlNode containerPropertiesNode, ContainerInfo parentContainer) + { + var newContainer = new ContainerInfo(); + var connectionInfo = ConnectionInfoFromXml(containerPropertiesNode); + newContainer.CopyFrom(connectionInfo); + newContainer.Name = containerPropertiesNode?.SelectSingleNode("./name")?.InnerText ?? Language.strNewFolder; + newContainer.IsExpanded = bool.Parse(containerPropertiesNode?.SelectSingleNode("./expanded")?.InnerText ?? "false"); + parentContainer.AddChild(newContainer); + return newContainer; + } + + private void ImportServer(XmlNode serverNode, ContainerInfo parentContainer) + { + var newConnectionInfo = ConnectionInfoFromXml(serverNode); + parentContainer.AddChild(newConnectionInfo); + + Runtime.ConnectionList.Add(newConnectionInfo); + } + + private ConnectionInfo ConnectionInfoFromXml(XmlNode xmlNode) + { + var connectionInfo = new ConnectionInfo {Protocol = ProtocolType.RDP}; + + var name = xmlNode.SelectSingleNode("./name")?.InnerText; + + var displayNameNode = xmlNode.SelectSingleNode("./displayName"); + var displayName = displayNameNode?.InnerText ?? Language.strNewConnection; + + connectionInfo.Name = displayName; + connectionInfo.Description = xmlNode.SelectSingleNode("./comment")?.InnerText; + connectionInfo.Hostname = name; + + var logonCredentialsNode = xmlNode.SelectSingleNode("./logonCredentials"); + if (logonCredentialsNode?.Attributes?["inherit"].Value == "None") + { + connectionInfo.Username = logonCredentialsNode.SelectSingleNode("userName")?.InnerText; + + var passwordNode = logonCredentialsNode.SelectSingleNode("./password"); + connectionInfo.Password = passwordNode?.Attributes?["storeAsClearText"].Value == "True" ? passwordNode.InnerText : DecryptPassword(passwordNode?.InnerText); + + connectionInfo.Domain = logonCredentialsNode.SelectSingleNode("./domain")?.InnerText; + } + else + { + connectionInfo.Inheritance.Username = true; + connectionInfo.Inheritance.Password = true; + connectionInfo.Inheritance.Domain = true; + } + + var connectionSettingsNode = xmlNode.SelectSingleNode("./connectionSettings"); + if (connectionSettingsNode?.Attributes?["inherit"].Value == "None") + { + connectionInfo.UseConsoleSession = bool.Parse(connectionSettingsNode.SelectSingleNode("./connectToConsole")?.InnerText); + // ./startProgram + // ./workingDir + connectionInfo.Port = Convert.ToInt32(connectionSettingsNode.SelectSingleNode("./port")?.InnerText); + } + else + { + connectionInfo.Inheritance.UseConsoleSession = true; + connectionInfo.Inheritance.Port = true; + } + + var gatewaySettingsNode = xmlNode.SelectSingleNode("./gatewaySettings"); + if (gatewaySettingsNode?.Attributes?["inherit"].Value == "None") + { + connectionInfo.RDGatewayUsageMethod = gatewaySettingsNode.SelectSingleNode("./enabled")?.InnerText == "True" ? ProtocolRDP.RDGatewayUsageMethod.Always : ProtocolRDP.RDGatewayUsageMethod.Never; + + connectionInfo.RDGatewayHostname = gatewaySettingsNode.SelectSingleNode("./hostName")?.InnerText; + connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName")?.InnerText; + + var passwordNode = logonCredentialsNode.SelectSingleNode("./password"); + if (passwordNode?.Attributes?["storeAsClearText"].Value == "True") + { + connectionInfo.RDGatewayPassword = passwordNode.InnerText; + } + else + { + connectionInfo.Password = DecryptPassword(passwordNode.InnerText); + } + + connectionInfo.RDGatewayDomain = gatewaySettingsNode.SelectSingleNode("./domain")?.InnerText; + // ./logonMethod + // ./localBypass + // ./credSharing + } + else + { + connectionInfo.Inheritance.RDGatewayUsageMethod = true; + connectionInfo.Inheritance.RDGatewayHostname = true; + connectionInfo.Inheritance.RDGatewayUsername = true; + connectionInfo.Inheritance.RDGatewayPassword = true; + connectionInfo.Inheritance.RDGatewayDomain = true; + } + + var remoteDesktopNode = xmlNode.SelectSingleNode("./remoteDesktop"); + if (remoteDesktopNode?.Attributes?["inherit"].Value == "None") + { + var resolutionString = Convert.ToString(remoteDesktopNode.SelectSingleNode("./size")?.InnerText.Replace(" ", "")); + try + { + connectionInfo.Resolution = (ProtocolRDP.RDPResolutions)Enum.Parse(typeof(ProtocolRDP.RDPResolutions), "Res" + resolutionString); + } + catch (ArgumentException) + { + connectionInfo.Resolution = ProtocolRDP.RDPResolutions.FitToWindow; + } + + if (remoteDesktopNode.SelectSingleNode("./sameSizeAsClientArea")?.InnerText == "True") + { + connectionInfo.Resolution = ProtocolRDP.RDPResolutions.FitToWindow; + } + + if (remoteDesktopNode.SelectSingleNode("./fullScreen")?.InnerText == "True") + { + connectionInfo.Resolution = ProtocolRDP.RDPResolutions.Fullscreen; + } + + + connectionInfo.Colors = (ProtocolRDP.RDPColors)Enum.Parse(typeof(ProtocolRDP.RDPColors), remoteDesktopNode.SelectSingleNode("./colorDepth").InnerText); + } + else + { + connectionInfo.Inheritance.Resolution = true; + connectionInfo.Inheritance.Colors = true; + } + + var localResourcesNode = xmlNode.SelectSingleNode("./localResources"); + if (localResourcesNode?.Attributes?["inherit"].Value == "None") + { + switch (localResourcesNode.SelectSingleNode("./audioRedirection")?.InnerText) + { + case "0": // Bring to this computer + connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.BringToThisComputer; + break; + case "1": // Leave at remote computer + connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.LeaveAtRemoteComputer; + break; + case "2": // Do not play + connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.DoNotPlay; + break; + } + + // ./audioRedirectionQuality + // ./audioCaptureRedirection + + switch (localResourcesNode.SelectSingleNode("./keyboardHook")?.InnerText) + { + case "0": // On the local computer + connectionInfo.RedirectKeys = false; + break; + case "1": // On the remote computer + connectionInfo.RedirectKeys = true; + break; + case "2": // In full screen mode only + connectionInfo.RedirectKeys = false; + break; + } + + // ./redirectClipboard + connectionInfo.RedirectDiskDrives = bool.Parse(localResourcesNode.SelectSingleNode("./redirectDrives").InnerText); + connectionInfo.RedirectPorts = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPorts").InnerText); + connectionInfo.RedirectPrinters = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPrinters").InnerText); + connectionInfo.RedirectSmartCards = bool.Parse(localResourcesNode.SelectSingleNode("./redirectSmartCards").InnerText); + } + else + { + connectionInfo.Inheritance.RedirectSound = true; + connectionInfo.Inheritance.RedirectKeys = true; + connectionInfo.Inheritance.RedirectDiskDrives = true; + connectionInfo.Inheritance.RedirectPorts = true; + connectionInfo.Inheritance.RedirectPrinters = true; + connectionInfo.Inheritance.RedirectSmartCards = true; + } + + var securitySettingsNode = xmlNode.SelectSingleNode("./securitySettings"); + if (securitySettingsNode?.Attributes?["inherit"].Value == "None") + { + switch (securitySettingsNode.SelectSingleNode("./authentication")?.InnerText) + { + case "0": // No authentication + connectionInfo.RDPAuthenticationLevel = ProtocolRDP.AuthenticationLevel.NoAuth; + break; + case "1": // Do not connect if authentication fails + connectionInfo.RDPAuthenticationLevel = ProtocolRDP.AuthenticationLevel.AuthRequired; + break; + case "2": // Warn if authentication fails + connectionInfo.RDPAuthenticationLevel = ProtocolRDP.AuthenticationLevel.WarnOnFailedAuth; + break; + } + } + else + { + connectionInfo.Inheritance.RDPAuthenticationLevel = true; + } + + // ./displaySettings/thumbnailScale + // ./displaySettings/liveThumbnailUpdates + // ./displaySettings/showDisconnectedThumbnails + + return connectionInfo; + } + + private string DecryptPassword(string ciphertext) + { + if (string.IsNullOrEmpty(ciphertext)) + { + return null; + } + + var gcHandle = new GCHandle(); + var plaintextData = new NativeMethods.DATA_BLOB(); + try + { + var ciphertextArray = Convert.FromBase64String(ciphertext); + gcHandle = GCHandle.Alloc(ciphertextArray, GCHandleType.Pinned); + + var ciphertextData = new NativeMethods.DATA_BLOB + { + cbData = ciphertextArray.Length, + pbData = gcHandle.AddrOfPinnedObject() + }; + + var tempOptionalEntropy = new NativeMethods.DATA_BLOB(); + var tempPromptStruct = IntPtr.Zero; + if (!NativeMethods.CryptUnprotectData(ref ciphertextData, null, ref tempOptionalEntropy, IntPtr.Zero, ref tempPromptStruct, 0, ref plaintextData)) + { + return null; + } + + var plaintextLength = (int)((double)plaintextData.cbData / 2); // Char = 2 bytes + var plaintextArray = new char[plaintextLength - 1 + 1]; + Marshal.Copy(plaintextData.pbData, plaintextArray, 0, plaintextLength); + + return new string(plaintextArray); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage("RemoteDesktopConnectionManager.DecryptPassword() failed.", ex, logOnly: true); + return null; + } + finally + { + if (gcHandle.IsAllocated) + { + gcHandle.Free(); + } + if (!(plaintextData.pbData == IntPtr.Zero)) + { + NativeMethods.LocalFree(plaintextData.pbData); + } + } + } + + // ReSharper disable once ClassNeverInstantiated.Local + private class NativeMethods + { + // ReSharper disable InconsistentNaming + // ReSharper disable IdentifierTypo + // ReSharper disable StringLiteralTypo + [DllImport("crypt32.dll", CharSet = CharSet.Unicode)] + public static extern bool CryptUnprotectData(ref DATA_BLOB dataIn, string description, ref DATA_BLOB optionalEntropy, IntPtr reserved, ref IntPtr promptStruct, int flags, ref DATA_BLOB dataOut); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + public static extern void LocalFree(IntPtr ptr); + + public struct DATA_BLOB + { + public int cbData; + public IntPtr pbData; + } + // ReSharper restore StringLiteralTypo + // ReSharper restore IdentifierTypo + // ReSharper restore InconsistentNaming + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs b/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs index 62a36c316..89212fc78 100644 --- a/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs +++ b/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs @@ -1,370 +1,35 @@ -using System; -using System.Windows.Forms; -using System.Xml; using System.IO; -using System.Runtime.InteropServices; -using mRemoteNG.App; -using mRemoteNG.Connection.Protocol.RDP; -using mRemoteNG.Connection; +using System.Linq; +using mRemoteNG.Config.Connections; +using mRemoteNG.Config.DataProviders; using mRemoteNG.Container; -using mRemoteNG.Tree; + namespace mRemoteNG.Config.Import { - public class RemoteDesktopConnectionManagerImporter + public class RemoteDesktopConnectionManagerImporter : IConnectionImporter { - public static void Import(string fileName, TreeNode parentTreeNode) + public void Import(object filePath, ContainerInfo destinationContainer) + { + var fileNameAsString = filePath as string; + if (fileNameAsString == null) + return; + if (File.Exists(fileNameAsString)) + Import(fileNameAsString, destinationContainer); + } + + public void Import(string filePath, ContainerInfo destinationContainer) { - var xmlDocument = new XmlDocument(); - xmlDocument.Load(fileName); + var dataProvider = new FileDataProvider(filePath); + var fileContent = dataProvider.Load(); - var rdcManNode = xmlDocument.SelectSingleNode("/RDCMan"); - var schemaVersion = Convert.ToInt32(rdcManNode?.Attributes?["schemaVersion"].Value); - if (schemaVersion != 1) - { - throw (new FileFormatException($"Unsupported schema version ({schemaVersion}).")); - } - - var versionNode = rdcManNode.SelectSingleNode("./version"); - var version = new Version(versionNode.InnerText); - if (!(version == new Version(2, 2))) - { - throw (new FileFormatException($"Unsupported file version ({version}).")); - } + var deserializer = new RemoteDesktopConnectionManagerDeserializer(fileContent); + var connectionTreeModel = deserializer.Deserialize(); - var fileNode = rdcManNode.SelectSingleNode("./file"); - ImportFileOrGroup(fileNode, parentTreeNode); - } - - private static void ImportFileOrGroup(XmlNode xmlNode, TreeNode parentTreeNode) - { - var propertiesNode = xmlNode.SelectSingleNode("./properties"); - var name = propertiesNode?.SelectSingleNode("./name")?.InnerText; - - var treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - var containerInfo = new ContainerInfo - { - TreeNode = treeNode, - Name = name - }; - - var connectionInfo = ConnectionInfoFromXml(propertiesNode); - connectionInfo.Parent = containerInfo; - connectionInfo.IsContainer = true; - containerInfo.CopyFrom(connectionInfo); - - // We can only inherit from a container node, not the root node or connection nodes - if (ConnectionTreeNode.GetNodeType(parentTreeNode) == TreeNodeType.Container) - { - containerInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - } - else - { - connectionInfo.Inheritance.DisableInheritance(); - } - - treeNode.Name = name; - treeNode.Tag = containerInfo; - treeNode.ImageIndex = (int)TreeImageType.Container; - treeNode.SelectedImageIndex = (int)TreeImageType.Container; - - foreach (XmlNode childNode in xmlNode.SelectNodes("./group|./server")) - { - switch (childNode.Name) - { - case "group": - ImportFileOrGroup(childNode, treeNode); - break; - case "server": - ImportServer(childNode, treeNode); - break; - } - } - - containerInfo.IsExpanded = bool.Parse(propertiesNode.SelectSingleNode("./expanded")?.InnerText); - if (containerInfo.IsExpanded) - { - treeNode.Expand(); - } - - Runtime.ContainerList.Add(containerInfo); - } - - private static void ImportServer(XmlNode serverNode, TreeNode parentTreeNode) - { - var name = serverNode.SelectSingleNode("./displayName")?.InnerText ?? ""; - var treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - var connectionInfo = ConnectionInfoFromXml(serverNode); - connectionInfo.TreeNode = treeNode; - connectionInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - - treeNode.Name = name; - treeNode.Tag = connectionInfo; - treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; - treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; - - Runtime.ConnectionList.Add(connectionInfo); - } - - private static ConnectionInfo ConnectionInfoFromXml(XmlNode xmlNode) - { - var connectionInfo = new ConnectionInfo(); - connectionInfo.Inheritance = new ConnectionInfoInheritance(connectionInfo); - - var name = xmlNode.SelectSingleNode("./name")?.InnerText; - - var displayName = ""; - var displayNameNode = xmlNode.SelectSingleNode("./displayName"); - displayName = displayNameNode?.InnerText ?? name; - - connectionInfo.Name = displayName; - connectionInfo.Description = xmlNode.SelectSingleNode("./comment")?.InnerText; - connectionInfo.Hostname = name; - - var logonCredentialsNode = xmlNode.SelectSingleNode("./logonCredentials"); - if (logonCredentialsNode?.Attributes?["inherit"].Value == "None") - { - connectionInfo.Username = logonCredentialsNode.SelectSingleNode("userName")?.InnerText; - - var passwordNode = logonCredentialsNode.SelectSingleNode("./password"); - connectionInfo.Password = passwordNode?.Attributes?["storeAsClearText"].Value == "True" ? passwordNode.InnerText : DecryptPassword(passwordNode?.InnerText); - - connectionInfo.Domain = logonCredentialsNode.SelectSingleNode("./domain")?.InnerText; - } - else - { - connectionInfo.Inheritance.Username = true; - connectionInfo.Inheritance.Password = true; - connectionInfo.Inheritance.Domain = true; - } - - var connectionSettingsNode = xmlNode.SelectSingleNode("./connectionSettings"); - if (connectionSettingsNode?.Attributes?["inherit"].Value == "None") - { - connectionInfo.UseConsoleSession = bool.Parse(connectionSettingsNode.SelectSingleNode("./connectToConsole")?.InnerText); - // ./startProgram - // ./workingDir - connectionInfo.Port = Convert.ToInt32(connectionSettingsNode.SelectSingleNode("./port")?.InnerText); - } - else - { - connectionInfo.Inheritance.UseConsoleSession = true; - connectionInfo.Inheritance.Port = true; - } - - var gatewaySettingsNode = xmlNode.SelectSingleNode("./gatewaySettings"); - if (gatewaySettingsNode?.Attributes?["inherit"].Value == "None") - { - connectionInfo.RDGatewayUsageMethod = gatewaySettingsNode.SelectSingleNode("./enabled")?.InnerText == "True" ? ProtocolRDP.RDGatewayUsageMethod.Always : ProtocolRDP.RDGatewayUsageMethod.Never; - - connectionInfo.RDGatewayHostname = gatewaySettingsNode.SelectSingleNode("./hostName")?.InnerText; - connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName")?.InnerText; - - var passwordNode = logonCredentialsNode.SelectSingleNode("./password"); - if (passwordNode?.Attributes?["storeAsClearText"].Value == "True") - { - connectionInfo.RDGatewayPassword = passwordNode.InnerText; - } - else - { - connectionInfo.Password = DecryptPassword(passwordNode.InnerText); - } - - connectionInfo.RDGatewayDomain = gatewaySettingsNode.SelectSingleNode("./domain")?.InnerText; - // ./logonMethod - // ./localBypass - // ./credSharing - } - else - { - connectionInfo.Inheritance.RDGatewayUsageMethod = true; - connectionInfo.Inheritance.RDGatewayHostname = true; - connectionInfo.Inheritance.RDGatewayUsername = true; - connectionInfo.Inheritance.RDGatewayPassword = true; - connectionInfo.Inheritance.RDGatewayDomain = true; - } - - var remoteDesktopNode = xmlNode.SelectSingleNode("./remoteDesktop"); - if (remoteDesktopNode?.Attributes?["inherit"].Value == "None") - { - var resolutionString = Convert.ToString(remoteDesktopNode.SelectSingleNode("./size")?.InnerText.Replace(" ", "")); - try - { - connectionInfo.Resolution = (ProtocolRDP.RDPResolutions)Enum.Parse(typeof(ProtocolRDP.RDPResolutions), "Res" + resolutionString); - } - catch (ArgumentException) - { - connectionInfo.Resolution = ProtocolRDP.RDPResolutions.FitToWindow; - } - - if (remoteDesktopNode.SelectSingleNode("./sameSizeAsClientArea")?.InnerText == "True") - { - connectionInfo.Resolution = ProtocolRDP.RDPResolutions.FitToWindow; - } - - if (remoteDesktopNode.SelectSingleNode("./fullScreen")?.InnerText == "True") - { - connectionInfo.Resolution = ProtocolRDP.RDPResolutions.Fullscreen; - } - - - connectionInfo.Colors = (ProtocolRDP.RDPColors)Enum.Parse(typeof(ProtocolRDP.RDPColors), remoteDesktopNode.SelectSingleNode("./colorDepth").InnerText); - } - else - { - connectionInfo.Inheritance.Resolution = true; - connectionInfo.Inheritance.Colors = true; - } - - var localResourcesNode = xmlNode.SelectSingleNode("./localResources"); - if (localResourcesNode?.Attributes?["inherit"].Value == "None") - { - switch (localResourcesNode.SelectSingleNode("./audioRedirection")?.InnerText) - { - case "0": // Bring to this computer - connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.BringToThisComputer; - break; - case "1": // Leave at remote computer - connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.LeaveAtRemoteComputer; - break; - case "2": // Do not play - connectionInfo.RedirectSound = ProtocolRDP.RDPSounds.DoNotPlay; - break; - } - - // ./audioRedirectionQuality - // ./audioCaptureRedirection - - switch (localResourcesNode.SelectSingleNode("./keyboardHook")?.InnerText) - { - case "0": // On the local computer - connectionInfo.RedirectKeys = false; - break; - case "1": // On the remote computer - connectionInfo.RedirectKeys = true; - break; - case "2": // In full screen mode only - connectionInfo.RedirectKeys = false; - break; - } - - // ./redirectClipboard - connectionInfo.RedirectDiskDrives = bool.Parse(localResourcesNode.SelectSingleNode("./redirectDrives").InnerText); - connectionInfo.RedirectPorts = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPorts").InnerText); - connectionInfo.RedirectPrinters = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPrinters").InnerText); - connectionInfo.RedirectSmartCards = bool.Parse(localResourcesNode.SelectSingleNode("./redirectSmartCards").InnerText); - } - else - { - connectionInfo.Inheritance.RedirectSound = true; - connectionInfo.Inheritance.RedirectKeys = true; - connectionInfo.Inheritance.RedirectDiskDrives = true; - connectionInfo.Inheritance.RedirectPorts = true; - connectionInfo.Inheritance.RedirectPrinters = true; - connectionInfo.Inheritance.RedirectSmartCards = true; - } - - var securitySettingsNode = xmlNode.SelectSingleNode("./securitySettings"); - if (securitySettingsNode?.Attributes?["inherit"].Value == "None") - { - switch (securitySettingsNode.SelectSingleNode("./authentication")?.InnerText) - { - case "0": // No authentication - connectionInfo.RDPAuthenticationLevel = ProtocolRDP.AuthenticationLevel.NoAuth; - break; - case "1": // Do not connect if authentication fails - connectionInfo.RDPAuthenticationLevel = ProtocolRDP.AuthenticationLevel.AuthRequired; - break; - case "2": // Warn if authentication fails - connectionInfo.RDPAuthenticationLevel = ProtocolRDP.AuthenticationLevel.WarnOnFailedAuth; - break; - } - } - else - { - connectionInfo.Inheritance.RDPAuthenticationLevel = true; - } - - // ./displaySettings/thumbnailScale - // ./displaySettings/liveThumbnailUpdates - // ./displaySettings/showDisconnectedThumbnails - - return connectionInfo; - } - - private static string DecryptPassword(string ciphertext) - { - if (string.IsNullOrEmpty(ciphertext)) - { - return null; - } - - var gcHandle = new GCHandle(); - var plaintextData = new NativeMethods.DATA_BLOB(); - try - { - var ciphertextArray = Convert.FromBase64String(ciphertext); - gcHandle = GCHandle.Alloc(ciphertextArray, GCHandleType.Pinned); - - var ciphertextData = new NativeMethods.DATA_BLOB - { - cbData = ciphertextArray.Length, - pbData = gcHandle.AddrOfPinnedObject() - }; - - var tempOptionalEntropy = new NativeMethods.DATA_BLOB(); - var tempPromptStruct = IntPtr.Zero; - if (!NativeMethods.CryptUnprotectData(ref ciphertextData, null, ref tempOptionalEntropy, IntPtr.Zero, ref tempPromptStruct, 0, ref plaintextData)) - { - return null; - } - - var plaintextLength = (int) ((double) plaintextData.cbData / 2); // Char = 2 bytes - var plaintextArray = new char[plaintextLength - 1 + 1]; - Marshal.Copy(plaintextData.pbData, plaintextArray, 0, plaintextLength); - - return new string(plaintextArray); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionMessage("RemoteDesktopConnectionManager.DecryptPassword() failed.", ex, logOnly: true); - return null; - } - finally - { - if (gcHandle.IsAllocated) - { - gcHandle.Free(); - } - if (!(plaintextData.pbData == IntPtr.Zero)) - { - NativeMethods.LocalFree(plaintextData.pbData); - } - } - } - - // ReSharper disable once ClassNeverInstantiated.Local - private class NativeMethods - { - // ReSharper disable InconsistentNaming - // ReSharper disable IdentifierTypo - // ReSharper disable StringLiteralTypo - [DllImport("crypt32.dll", CharSet = CharSet.Unicode)]public static extern bool CryptUnprotectData(ref DATA_BLOB dataIn, string description, ref DATA_BLOB optionalEntropy, IntPtr reserved, ref IntPtr promptStruct, int flags, ref DATA_BLOB dataOut); - - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]public static extern void LocalFree(IntPtr ptr); - - public struct DATA_BLOB - { - public int cbData; - public IntPtr pbData; - } - // ReSharper restore StringLiteralTypo - // ReSharper restore IdentifierTypo - // ReSharper restore InconsistentNaming - } + var importedRootNode = connectionTreeModel.RootNodes.First(); + if (importedRootNode == null) return; + var childrenToAdd = importedRootNode.Children.ToArray(); + destinationContainer.AddChildRange(childrenToAdd); + } } } \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 772377083..a3f52d68a 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -131,6 +131,7 @@ + @@ -165,7 +166,7 @@ - + From c73aaa545515ef49a1e359bc1ec457202c9b08f7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 10:19:58 -0600 Subject: [PATCH 214/338] Renamed PuttyConnectionManager to PuttyConnectionManagerImporter --- ...uttyConnectionManager.cs => PuttyConnectionManagerImporter.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename mRemoteV1/Config/Import/{PuttyConnectionManager.cs => PuttyConnectionManagerImporter.cs} (100%) diff --git a/mRemoteV1/Config/Import/PuttyConnectionManager.cs b/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs similarity index 100% rename from mRemoteV1/Config/Import/PuttyConnectionManager.cs rename to mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs From 88f40841d4bc2bb297b79d4f9cf5814654367f68 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 10:33:01 -0600 Subject: [PATCH 215/338] Code cleanup --- .../Import/PuttyConnectionManagerImporter.cs | 116 +++++++++--------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git a/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs b/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs index da66322a0..82d659647 100644 --- a/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs +++ b/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs @@ -10,20 +10,18 @@ using mRemoteNG.Container; namespace mRemoteNG.Config.Import { - public class PuttyConnectionManager + public class PuttyConnectionManagerImporter { public static void Import(string fileName, TreeNode parentTreeNode) { - XmlDocument xmlDocument = new XmlDocument(); + var xmlDocument = new XmlDocument(); xmlDocument.Load(fileName); - XmlNode configurationNode = xmlDocument.SelectSingleNode("/configuration"); - //Dim version As New Version(configurationNode.Attributes("version").Value) - //If Not version = New Version(0, 7, 1, 136) Then - // Throw New FileFormatException(String.Format("Unsupported file version ({0}).", version)) - //End If - - foreach (XmlNode rootNode in configurationNode.SelectNodes("./root")) + var configurationNode = xmlDocument.SelectSingleNode("/configuration"); + + var rootNodes = configurationNode?.SelectNodes("./root"); + if (rootNodes == null) return; + foreach (XmlNode rootNode in rootNodes) { ImportRootOrContainer(rootNode, parentTreeNode); } @@ -31,45 +29,47 @@ namespace mRemoteNG.Config.Import private static void ImportRootOrContainer(XmlNode xmlNode, TreeNode parentTreeNode) { - string xmlNodeType = xmlNode.Attributes["type"].Value; - switch (xmlNode.Name) + var xmlNodeType = xmlNode?.Attributes?["type"].Value; + switch (xmlNode?.Name) { case "root": - if (!(string.Compare(xmlNodeType, "database", ignoreCase: true) == 0)) + if (string.Compare(xmlNodeType, "database", StringComparison.OrdinalIgnoreCase) != 0) { - throw (new FileFormatException(string.Format("Unrecognized root node type ({0}).", xmlNodeType))); + throw (new FileFormatException($"Unrecognized root node type ({xmlNodeType}).")); } break; case "container": - if (!(string.Compare(xmlNodeType, "folder", ignoreCase: true) == 0)) + if (string.Compare(xmlNodeType, "folder", StringComparison.OrdinalIgnoreCase) != 0) { - throw (new FileFormatException(string.Format("Unrecognized root node type ({0}).", xmlNodeType))); + throw (new FileFormatException($"Unrecognized root node type ({xmlNodeType}).")); } break; default: // ReSharper disable once LocalizableElement - throw (new ArgumentException("Argument must be either a root or a container node.", "xmlNode")); + throw (new ArgumentException("Argument must be either a root or a container node.", nameof(xmlNode))); } - + if (parentTreeNode == null) { throw (new InvalidOperationException("parentInfo.TreeNode must not be null.")); } - - string name = xmlNode.Attributes["name"].Value; - - TreeNode treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - ContainerInfo containerInfo = new ContainerInfo(); - containerInfo.TreeNode = treeNode; - containerInfo.Name = name; - ConnectionInfo connectionInfo = CreateConnectionInfo(name); + var name = xmlNode.Attributes?["name"].Value; + + var treeNode = new TreeNode(name); + parentTreeNode.Nodes.Add(treeNode); + + var containerInfo = new ContainerInfo + { + TreeNode = treeNode, + Name = name + }; + + var connectionInfo = CreateConnectionInfo(name); connectionInfo.Parent = containerInfo; connectionInfo.IsContainer = true; containerInfo.CopyFrom(connectionInfo); - + // We can only inherit from a container node, not the root node or connection nodes if (ConnectionTreeNode.GetNodeType(parentTreeNode) == TreeNodeType.Container) { @@ -79,13 +79,15 @@ namespace mRemoteNG.Config.Import { connectionInfo.Inheritance.DisableInheritance(); } - + treeNode.Name = name; treeNode.Tag = containerInfo; treeNode.ImageIndex = (int)TreeImageType.Container; treeNode.SelectedImageIndex = (int)TreeImageType.Container; - - foreach (XmlNode childNode in xmlNode.SelectNodes("./*")) + + var childNodes = xmlNode.SelectNodes("./*"); + if (childNodes == null) return; + foreach (XmlNode childNode in childNodes) { switch (childNode.Name) { @@ -96,11 +98,11 @@ namespace mRemoteNG.Config.Import ImportConnection(childNode, treeNode); break; default: - throw (new FileFormatException(string.Format("Unrecognized child node ({0}).", childNode.Name))); + throw (new FileFormatException($"Unrecognized child node ({childNode.Name}).")); } } - containerInfo.IsExpanded = bool.Parse(xmlNode.Attributes["expanded"].InnerText); + containerInfo.IsExpanded = bool.Parse(xmlNode?.Attributes?["expanded"].InnerText ?? "false"); if (containerInfo.IsExpanded) { treeNode.Expand(); @@ -111,17 +113,17 @@ namespace mRemoteNG.Config.Import private static void ImportConnection(XmlNode connectionNode, TreeNode parentTreeNode) { - string connectionNodeType = connectionNode.Attributes["type"].Value; - if (!(string.Compare(connectionNodeType, "PuTTY", ignoreCase: true) == 0)) + var connectionNodeType = connectionNode.Attributes?["type"].Value; + if (string.Compare(connectionNodeType, "PuTTY", StringComparison.OrdinalIgnoreCase) != 0) { - throw (new FileFormatException(string.Format("Unrecognized connection node type ({0}).", connectionNodeType))); + throw (new FileFormatException($"Unrecognized connection node type ({connectionNodeType}).")); } - - string name = connectionNode.Attributes["name"].Value; - TreeNode treeNode = new TreeNode(name); + + var name = connectionNode.Attributes?["name"].Value; + var treeNode = new TreeNode(name); parentTreeNode.Nodes.Add(treeNode); - ConnectionInfo connectionInfo = ConnectionInfoFromXml(connectionNode); + var connectionInfo = ConnectionInfoFromXml(connectionNode); connectionInfo.TreeNode = treeNode; connectionInfo.Parent = (ContainerInfo)parentTreeNode.Tag; @@ -135,7 +137,7 @@ namespace mRemoteNG.Config.Import private static ConnectionInfo CreateConnectionInfo(string name) { - ConnectionInfo connectionInfo = new ConnectionInfo(); + var connectionInfo = new ConnectionInfo(); connectionInfo.Inheritance = new ConnectionInfoInheritance(connectionInfo); connectionInfo.Name = name; return connectionInfo; @@ -143,13 +145,13 @@ namespace mRemoteNG.Config.Import private static ConnectionInfo ConnectionInfoFromXml(XmlNode xmlNode) { - XmlNode connectionInfoNode = xmlNode.SelectSingleNode("./connection_info"); - - string name = connectionInfoNode.SelectSingleNode("./name").InnerText; - ConnectionInfo connectionInfo = CreateConnectionInfo(name); - - string protocol = connectionInfoNode.SelectSingleNode("./protocol").InnerText; - switch (protocol.ToLowerInvariant()) + var connectionInfoNode = xmlNode.SelectSingleNode("./connection_info"); + + var name = connectionInfoNode?.SelectSingleNode("./name")?.InnerText; + var connectionInfo = CreateConnectionInfo(name); + + var protocol = connectionInfoNode?.SelectSingleNode("./protocol")?.InnerText; + switch (protocol?.ToLowerInvariant()) { case "telnet": connectionInfo.Protocol = ProtocolType.Telnet; @@ -158,18 +160,18 @@ namespace mRemoteNG.Config.Import connectionInfo.Protocol = ProtocolType.SSH2; break; default: - throw (new FileFormatException(string.Format("Unrecognized protocol ({0}).", protocol))); + throw (new FileFormatException($"Unrecognized protocol ({protocol}).")); } - connectionInfo.Hostname = connectionInfoNode.SelectSingleNode("./host").InnerText; - connectionInfo.Port = Convert.ToInt32(connectionInfoNode.SelectSingleNode("./port").InnerText); - connectionInfo.PuttySession = connectionInfoNode.SelectSingleNode("./session").InnerText; + connectionInfo.Hostname = connectionInfoNode.SelectSingleNode("./host")?.InnerText; + connectionInfo.Port = Convert.ToInt32(connectionInfoNode.SelectSingleNode("./port")?.InnerText); + connectionInfo.PuttySession = connectionInfoNode.SelectSingleNode("./session")?.InnerText; // ./commandline - connectionInfo.Description = connectionInfoNode.SelectSingleNode("./description").InnerText; - - XmlNode loginNode = xmlNode.SelectSingleNode("./login"); - connectionInfo.Username = loginNode.SelectSingleNode("login").InnerText; - connectionInfo.Password = loginNode.SelectSingleNode("password").InnerText; + connectionInfo.Description = connectionInfoNode.SelectSingleNode("./description")?.InnerText; + + var loginNode = xmlNode.SelectSingleNode("./login"); + connectionInfo.Username = loginNode?.SelectSingleNode("login")?.InnerText; + connectionInfo.Password = loginNode?.SelectSingleNode("password")?.InnerText; // ./prompt // ./timeout/connectiontimeout From dec411e8667bccf2126541b47eee7d80953e5c54 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 10:59:16 -0600 Subject: [PATCH 216/338] Created PuttyConnectionManagerDeserializer. Import is now working --- mRemoteV1/App/Import.cs | 8 +- .../PuttyConnectionManagerDeserializer.cs | 165 ++++++++++++++ .../Import/PuttyConnectionManagerImporter.cs | 208 ++---------------- mRemoteV1/mRemoteV1.csproj | 3 +- 4 files changed, 194 insertions(+), 190 deletions(-) create mode 100644 mRemoteV1/Config/Connections/PuttyConnectionManagerDeserializer.cs diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index e54a2ab7d..92da5badd 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -50,31 +50,29 @@ namespace mRemoteNG.App return; } - IConnectionImporter importer; foreach (var fileName in openFileDialog.FileNames) { try { + IConnectionImporter importer; switch (DetermineFileType(fileName)) { case FileType.mRemoteXml: importer = new mRemoteNGImporter(); - importer.Import(fileName, importDestinationContainer); break; case FileType.RemoteDesktopConnection: importer = new RemoteDesktopConnectionImporter(); - importer.Import(fileName, importDestinationContainer); break; case FileType.RemoteDesktopConnectionManager: importer = new RemoteDesktopConnectionManagerImporter(); - importer.Import(fileName, importDestinationContainer); break; case FileType.PuttyConnectionManager: - //PuttyConnectionManager.Import(fileName, importDestinationContainer); + importer = new PuttyConnectionManagerImporter(); break; default: throw new FileFormatException("Unrecognized file format."); } + importer.Import(fileName, importDestinationContainer); } catch (Exception ex) { diff --git a/mRemoteV1/Config/Connections/PuttyConnectionManagerDeserializer.cs b/mRemoteV1/Config/Connections/PuttyConnectionManagerDeserializer.cs new file mode 100644 index 000000000..d03e9f40f --- /dev/null +++ b/mRemoteV1/Config/Connections/PuttyConnectionManagerDeserializer.cs @@ -0,0 +1,165 @@ +using System; +using System.IO; +using System.Xml; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Connections +{ + public class PuttyConnectionManagerDeserializer : IDeserializer + { + private readonly string _puttycmConnectionsXml; + + public PuttyConnectionManagerDeserializer(string xml) + { + _puttycmConnectionsXml = xml; + } + + public ConnectionTreeModel Deserialize() + { + var connectionTreeModel = new ConnectionTreeModel(); + var root = new RootNodeInfo(RootNodeType.Connection); + connectionTreeModel.AddRootNode(root); + + var xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(_puttycmConnectionsXml); + + var configurationNode = xmlDocument.SelectSingleNode("/configuration"); + + var rootNodes = configurationNode?.SelectNodes("./root"); + if (rootNodes == null) return connectionTreeModel; + foreach (XmlNode rootNode in rootNodes) + { + ImportRootOrContainer(rootNode, root); + } + + return connectionTreeModel; + } + + private void ImportRootOrContainer(XmlNode xmlNode, ContainerInfo parentContainer) + { + VerifyNodeType(xmlNode); + + var newContainer = ImportContainer(xmlNode, parentContainer); + + var childNodes = xmlNode.SelectNodes("./*"); + if (childNodes == null) return; + foreach (XmlNode childNode in childNodes) + { + switch (childNode.Name) + { + case "container": + ImportRootOrContainer(childNode, newContainer); + break; + case "connection": + ImportConnection(childNode, newContainer); + break; + default: + throw (new FileFormatException($"Unrecognized child node ({childNode.Name}).")); + } + } + + Runtime.ContainerList.Add(newContainer); + } + + private void VerifyNodeType(XmlNode xmlNode) + { + var xmlNodeType = xmlNode?.Attributes?["type"].Value; + switch (xmlNode?.Name) + { + case "root": + if (string.Compare(xmlNodeType, "database", StringComparison.OrdinalIgnoreCase) != 0) + { + throw (new FileFormatException($"Unrecognized root node type ({xmlNodeType}).")); + } + break; + case "container": + if (string.Compare(xmlNodeType, "folder", StringComparison.OrdinalIgnoreCase) != 0) + { + throw (new FileFormatException($"Unrecognized root node type ({xmlNodeType}).")); + } + break; + default: + // ReSharper disable once LocalizableElement + throw (new ArgumentException("Argument must be either a root or a container node.", nameof(xmlNode))); + } + } + + private ContainerInfo ImportContainer(XmlNode containerNode, ContainerInfo parentContainer) + { + var containerInfo = new ContainerInfo + { + Name = containerNode.Attributes?["name"].Value, + IsExpanded = bool.Parse(containerNode.Attributes?["expanded"].InnerText ?? "false") + }; + parentContainer.AddChild(containerInfo); + return containerInfo; + } + + private void ImportConnection(XmlNode connectionNode, ContainerInfo parentContainer) + { + var connectionNodeType = connectionNode.Attributes?["type"].Value; + if (string.Compare(connectionNodeType, "PuTTY", StringComparison.OrdinalIgnoreCase) != 0) + throw (new FileFormatException($"Unrecognized connection node type ({connectionNodeType}).")); + + var connectionInfo = ConnectionInfoFromXml(connectionNode); + parentContainer.AddChild(connectionInfo); + + Runtime.ConnectionList.Add(connectionInfo); + } + + private ConnectionInfo ConnectionInfoFromXml(XmlNode xmlNode) + { + var connectionInfoNode = xmlNode.SelectSingleNode("./connection_info"); + + var name = connectionInfoNode?.SelectSingleNode("./name")?.InnerText; + var connectionInfo = new ConnectionInfo {Name = name}; + + var protocol = connectionInfoNode?.SelectSingleNode("./protocol")?.InnerText; + switch (protocol?.ToLowerInvariant()) + { + case "telnet": + connectionInfo.Protocol = ProtocolType.Telnet; + break; + case "ssh": + connectionInfo.Protocol = ProtocolType.SSH2; + break; + default: + throw (new FileFormatException($"Unrecognized protocol ({protocol}).")); + } + + connectionInfo.Hostname = connectionInfoNode.SelectSingleNode("./host")?.InnerText; + connectionInfo.Port = Convert.ToInt32(connectionInfoNode.SelectSingleNode("./port")?.InnerText); + connectionInfo.PuttySession = connectionInfoNode.SelectSingleNode("./session")?.InnerText; + // ./commandline + connectionInfo.Description = connectionInfoNode.SelectSingleNode("./description")?.InnerText; + + var loginNode = xmlNode.SelectSingleNode("./login"); + connectionInfo.Username = loginNode?.SelectSingleNode("login")?.InnerText; + connectionInfo.Password = loginNode?.SelectSingleNode("password")?.InnerText; + // ./prompt + + // ./timeout/connectiontimeout + // ./timeout/logintimeout + // ./timeout/passwordtimeout + // ./timeout/commandtimeout + + // ./command/command1 + // ./command/command2 + // ./command/command3 + // ./command/command4 + // ./command/command5 + + // ./options/loginmacro + // ./options/postcommands + // ./options/endlinechar + + return connectionInfo; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs b/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs index 82d659647..1e2b8f56e 100644 --- a/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs +++ b/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs @@ -1,195 +1,35 @@ -using System; -using System.Windows.Forms; -using System.Xml; using System.IO; -using mRemoteNG.App; -using mRemoteNG.Connection.Protocol; -using mRemoteNG.Connection; -using mRemoteNG.Tree; +using System.Linq; +using mRemoteNG.Config.Connections; +using mRemoteNG.Config.DataProviders; using mRemoteNG.Container; + namespace mRemoteNG.Config.Import { - public class PuttyConnectionManagerImporter + public class PuttyConnectionManagerImporter : IConnectionImporter { - public static void Import(string fileName, TreeNode parentTreeNode) + public void Import(object filePath, ContainerInfo destinationContainer) + { + var filePathAsString = filePath as string; + if (filePathAsString == null) + return; + if (File.Exists(filePathAsString)) + Import(filePathAsString, destinationContainer); + } + + public void Import(string filePath, ContainerInfo destinationContainer) { - var xmlDocument = new XmlDocument(); - xmlDocument.Load(fileName); - - var configurationNode = xmlDocument.SelectSingleNode("/configuration"); + var dataProvider = new FileDataProvider(filePath); + var xmlContent = dataProvider.Load(); - var rootNodes = configurationNode?.SelectNodes("./root"); - if (rootNodes == null) return; - foreach (XmlNode rootNode in rootNodes) - { - ImportRootOrContainer(rootNode, parentTreeNode); - } - } - - private static void ImportRootOrContainer(XmlNode xmlNode, TreeNode parentTreeNode) - { - var xmlNodeType = xmlNode?.Attributes?["type"].Value; - switch (xmlNode?.Name) - { - case "root": - if (string.Compare(xmlNodeType, "database", StringComparison.OrdinalIgnoreCase) != 0) - { - throw (new FileFormatException($"Unrecognized root node type ({xmlNodeType}).")); - } - break; - case "container": - if (string.Compare(xmlNodeType, "folder", StringComparison.OrdinalIgnoreCase) != 0) - { - throw (new FileFormatException($"Unrecognized root node type ({xmlNodeType}).")); - } - break; - default: - // ReSharper disable once LocalizableElement - throw (new ArgumentException("Argument must be either a root or a container node.", nameof(xmlNode))); - } - - if (parentTreeNode == null) - { - throw (new InvalidOperationException("parentInfo.TreeNode must not be null.")); - } + var deserializer = new PuttyConnectionManagerDeserializer(xmlContent); + var connectionTreeModel = deserializer.Deserialize(); - var name = xmlNode.Attributes?["name"].Value; - - var treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - var containerInfo = new ContainerInfo - { - TreeNode = treeNode, - Name = name - }; - - var connectionInfo = CreateConnectionInfo(name); - connectionInfo.Parent = containerInfo; - connectionInfo.IsContainer = true; - containerInfo.CopyFrom(connectionInfo); - - // We can only inherit from a container node, not the root node or connection nodes - if (ConnectionTreeNode.GetNodeType(parentTreeNode) == TreeNodeType.Container) - { - containerInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - } - else - { - connectionInfo.Inheritance.DisableInheritance(); - } - - treeNode.Name = name; - treeNode.Tag = containerInfo; - treeNode.ImageIndex = (int)TreeImageType.Container; - treeNode.SelectedImageIndex = (int)TreeImageType.Container; - - var childNodes = xmlNode.SelectNodes("./*"); - if (childNodes == null) return; - foreach (XmlNode childNode in childNodes) - { - switch (childNode.Name) - { - case "container": - ImportRootOrContainer(childNode, treeNode); - break; - case "connection": - ImportConnection(childNode, treeNode); - break; - default: - throw (new FileFormatException($"Unrecognized child node ({childNode.Name}).")); - } - } - - containerInfo.IsExpanded = bool.Parse(xmlNode?.Attributes?["expanded"].InnerText ?? "false"); - if (containerInfo.IsExpanded) - { - treeNode.Expand(); - } - - Runtime.ContainerList.Add(containerInfo); - } - - private static void ImportConnection(XmlNode connectionNode, TreeNode parentTreeNode) - { - var connectionNodeType = connectionNode.Attributes?["type"].Value; - if (string.Compare(connectionNodeType, "PuTTY", StringComparison.OrdinalIgnoreCase) != 0) - { - throw (new FileFormatException($"Unrecognized connection node type ({connectionNodeType}).")); - } - - var name = connectionNode.Attributes?["name"].Value; - var treeNode = new TreeNode(name); - parentTreeNode.Nodes.Add(treeNode); - - var connectionInfo = ConnectionInfoFromXml(connectionNode); - connectionInfo.TreeNode = treeNode; - connectionInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - - treeNode.Name = name; - treeNode.Tag = connectionInfo; - treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; - treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; - - Runtime.ConnectionList.Add(connectionInfo); - } - - private static ConnectionInfo CreateConnectionInfo(string name) - { - var connectionInfo = new ConnectionInfo(); - connectionInfo.Inheritance = new ConnectionInfoInheritance(connectionInfo); - connectionInfo.Name = name; - return connectionInfo; - } - - private static ConnectionInfo ConnectionInfoFromXml(XmlNode xmlNode) - { - var connectionInfoNode = xmlNode.SelectSingleNode("./connection_info"); - - var name = connectionInfoNode?.SelectSingleNode("./name")?.InnerText; - var connectionInfo = CreateConnectionInfo(name); - - var protocol = connectionInfoNode?.SelectSingleNode("./protocol")?.InnerText; - switch (protocol?.ToLowerInvariant()) - { - case "telnet": - connectionInfo.Protocol = ProtocolType.Telnet; - break; - case "ssh": - connectionInfo.Protocol = ProtocolType.SSH2; - break; - default: - throw (new FileFormatException($"Unrecognized protocol ({protocol}).")); - } - - connectionInfo.Hostname = connectionInfoNode.SelectSingleNode("./host")?.InnerText; - connectionInfo.Port = Convert.ToInt32(connectionInfoNode.SelectSingleNode("./port")?.InnerText); - connectionInfo.PuttySession = connectionInfoNode.SelectSingleNode("./session")?.InnerText; - // ./commandline - connectionInfo.Description = connectionInfoNode.SelectSingleNode("./description")?.InnerText; - - var loginNode = xmlNode.SelectSingleNode("./login"); - connectionInfo.Username = loginNode?.SelectSingleNode("login")?.InnerText; - connectionInfo.Password = loginNode?.SelectSingleNode("password")?.InnerText; - // ./prompt - - // ./timeout/connectiontimeout - // ./timeout/logintimeout - // ./timeout/passwordtimeout - // ./timeout/commandtimeout - - // ./command/command1 - // ./command/command2 - // ./command/command3 - // ./command/command4 - // ./command/command5 - - // ./options/loginmacro - // ./options/postcommands - // ./options/endlinechar - - return connectionInfo; - } + var importedRootNode = connectionTreeModel.RootNodes.First(); + if (importedRootNode == null) return; + var childrenToAdd = importedRootNode.Children.ToArray(); + destinationContainer.AddChildRange(childrenToAdd); + } } } \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index a3f52d68a..d90379737 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -130,6 +130,7 @@ + @@ -164,7 +165,7 @@ - + From 8a1f2cbca8f98812d74ce1154ccdace3c145af79 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 11:06:13 -0600 Subject: [PATCH 217/338] Moved all serializers/deserializers to the mRemoteNG.Config.Serializers namespace --- .../Connections/DataTableSerializerTests.cs | 2 +- .../XmlConnectionsDeserializerTests.cs | 2 +- .../Config/Connections/ConnectionsLoader.cs | 2 +- .../Config/Connections/ConnectionsSaver.cs | 1 + .../Import/PuttyConnectionManagerImporter.cs | 2 +- .../Import/RemoteDesktopConnectionImporter.cs | 2 +- .../RemoteDesktopConnectionManagerImporter.cs | 2 +- mRemoteV1/Config/Import/mRemoteNGImporter.cs | 2 +- ...CsvConnectionsSerializerMremotengFormat.cs | 3 +-- ...ctionsSerializerRemoteDesktop2008Format.cs | 3 +-- .../DataTableDeserializer.cs | 3 +-- .../DataTableSerializer.cs | 3 +-- .../Config/{ => Serializers}/IDeserializer.cs | 2 +- .../Config/{ => Serializers}/ISerializer.cs | 2 +- .../PuttyConnectionManagerDeserializer.cs | 3 +-- .../RemoteDesktopConnectionDeserializer.cs | 3 +-- ...oteDesktopConnectionManagerDeserializer.cs | 3 +-- .../SqlConnectionsSerializer.cs | 3 +-- .../XmlConnectionsDeserializer.cs | 4 ++-- .../XmlConnectionsSerializer.cs | 3 +-- mRemoteV1/mRemoteV1.csproj | 24 +++++++++---------- 21 files changed, 33 insertions(+), 41 deletions(-) rename mRemoteV1/Config/{Connections => Serializers}/CsvConnectionsSerializerMremotengFormat.cs (99%) rename mRemoteV1/Config/{Connections => Serializers}/CsvConnectionsSerializerRemoteDesktop2008Format.cs (97%) rename mRemoteV1/Config/{Connections => Serializers}/DataTableDeserializer.cs (99%) rename mRemoteV1/Config/{Connections => Serializers}/DataTableSerializer.cs (99%) rename mRemoteV1/Config/{ => Serializers}/IDeserializer.cs (75%) rename mRemoteV1/Config/{ => Serializers}/ISerializer.cs (78%) rename mRemoteV1/Config/{Connections => Serializers}/PuttyConnectionManagerDeserializer.cs (99%) rename mRemoteV1/Config/{Connections => Serializers}/RemoteDesktopConnectionDeserializer.cs (99%) rename mRemoteV1/Config/{Connections => Serializers}/RemoteDesktopConnectionManagerDeserializer.cs (99%) rename mRemoteV1/Config/{Connections => Serializers}/SqlConnectionsSerializer.cs (99%) rename mRemoteV1/Config/{Connections => Serializers}/XmlConnectionsDeserializer.cs (99%) rename mRemoteV1/Config/{Connections => Serializers}/XmlConnectionsSerializer.cs (99%) diff --git a/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs b/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs index 081735700..0c505b893 100644 --- a/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs +++ b/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs @@ -1,4 +1,4 @@ -using mRemoteNG.Config.Connections; +using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Security; diff --git a/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs b/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs index 07d630e21..764d78cc2 100644 --- a/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs +++ b/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using System.Linq; -using mRemoteNG.Config.Connections; +using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Tree; diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 567127c31..7cdf8b2d5 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -2,9 +2,9 @@ using System.Windows.Forms; using mRemoteNG.App; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Putty; +using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Container; -using mRemoteNG.UI; using mRemoteNG.UI.Forms; diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index aa058aae1..407ccfb1a 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -10,6 +10,7 @@ using System.Xml; using mRemoteNG.App; using mRemoteNG.App.Info; using mRemoteNG.Config.DataProviders; +using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.RDP; diff --git a/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs b/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs index 1e2b8f56e..5da1b343a 100644 --- a/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs +++ b/mRemoteV1/Config/Import/PuttyConnectionManagerImporter.cs @@ -1,7 +1,7 @@ using System.IO; using System.Linq; -using mRemoteNG.Config.Connections; using mRemoteNG.Config.DataProviders; +using mRemoteNG.Config.Serializers; using mRemoteNG.Container; diff --git a/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs b/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs index 51eb73f45..81f7ab7fd 100644 --- a/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs +++ b/mRemoteV1/Config/Import/RemoteDesktopConnectionImporter.cs @@ -1,8 +1,8 @@ using System; using System.IO; using System.Linq; -using mRemoteNG.Config.Connections; using mRemoteNG.Config.DataProviders; +using mRemoteNG.Config.Serializers; using mRemoteNG.Container; diff --git a/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs b/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs index 89212fc78..60ff988f0 100644 --- a/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs +++ b/mRemoteV1/Config/Import/RemoteDesktopConnectionManagerImporter.cs @@ -1,7 +1,7 @@ using System.IO; using System.Linq; -using mRemoteNG.Config.Connections; using mRemoteNG.Config.DataProviders; +using mRemoteNG.Config.Serializers; using mRemoteNG.Container; diff --git a/mRemoteV1/Config/Import/mRemoteNGImporter.cs b/mRemoteV1/Config/Import/mRemoteNGImporter.cs index 9172380c7..ef8fb7d3c 100644 --- a/mRemoteV1/Config/Import/mRemoteNGImporter.cs +++ b/mRemoteV1/Config/Import/mRemoteNGImporter.cs @@ -1,8 +1,8 @@ using System.IO; using System.Linq; using mRemoteNG.App; -using mRemoteNG.Config.Connections; using mRemoteNG.Config.DataProviders; +using mRemoteNG.Config.Serializers; using mRemoteNG.Container; using mRemoteNG.Messages; diff --git a/mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs similarity index 99% rename from mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs rename to mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs index 872fd816d..1babd4d27 100644 --- a/mRemoteV1/Config/Connections/CsvConnectionsSerializerMremotengFormat.cs +++ b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs @@ -7,8 +7,7 @@ using mRemoteNG.Security; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class CsvConnectionsSerializerMremotengFormat : ISerializer { diff --git a/mRemoteV1/Config/Connections/CsvConnectionsSerializerRemoteDesktop2008Format.cs b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs similarity index 97% rename from mRemoteV1/Config/Connections/CsvConnectionsSerializerRemoteDesktop2008Format.cs rename to mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs index 06582c462..11e519ae9 100644 --- a/mRemoteV1/Config/Connections/CsvConnectionsSerializerRemoteDesktop2008Format.cs +++ b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs @@ -7,8 +7,7 @@ using mRemoteNG.Container; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class CsvConnectionsSerializerRemoteDesktop2008Format : ISerializer { diff --git a/mRemoteV1/Config/Connections/DataTableDeserializer.cs b/mRemoteV1/Config/Serializers/DataTableDeserializer.cs similarity index 99% rename from mRemoteV1/Config/Connections/DataTableDeserializer.cs rename to mRemoteV1/Config/Serializers/DataTableDeserializer.cs index b6b027188..e9bceb437 100644 --- a/mRemoteV1/Config/Connections/DataTableDeserializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableDeserializer.cs @@ -12,8 +12,7 @@ using mRemoteNG.Container; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class DataTableDeserializer : IDeserializer { diff --git a/mRemoteV1/Config/Connections/DataTableSerializer.cs b/mRemoteV1/Config/Serializers/DataTableSerializer.cs similarity index 99% rename from mRemoteV1/Config/Connections/DataTableSerializer.cs rename to mRemoteV1/Config/Serializers/DataTableSerializer.cs index a3b1efe1b..b0a76c073 100644 --- a/mRemoteV1/Config/Connections/DataTableSerializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableSerializer.cs @@ -7,8 +7,7 @@ using mRemoteNG.Security; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class DataTableSerializer { diff --git a/mRemoteV1/Config/IDeserializer.cs b/mRemoteV1/Config/Serializers/IDeserializer.cs similarity index 75% rename from mRemoteV1/Config/IDeserializer.cs rename to mRemoteV1/Config/Serializers/IDeserializer.cs index d71e55c9f..4ba89abfd 100644 --- a/mRemoteV1/Config/IDeserializer.cs +++ b/mRemoteV1/Config/Serializers/IDeserializer.cs @@ -1,6 +1,6 @@ using mRemoteNG.Tree; -namespace mRemoteNG.Config +namespace mRemoteNG.Config.Serializers { public interface IDeserializer { diff --git a/mRemoteV1/Config/ISerializer.cs b/mRemoteV1/Config/Serializers/ISerializer.cs similarity index 78% rename from mRemoteV1/Config/ISerializer.cs rename to mRemoteV1/Config/Serializers/ISerializer.cs index c260d15a3..56084735a 100644 --- a/mRemoteV1/Config/ISerializer.cs +++ b/mRemoteV1/Config/Serializers/ISerializer.cs @@ -1,6 +1,6 @@ using mRemoteNG.Tree; -namespace mRemoteNG.Config +namespace mRemoteNG.Config.Serializers { public interface ISerializer { diff --git a/mRemoteV1/Config/Connections/PuttyConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs similarity index 99% rename from mRemoteV1/Config/Connections/PuttyConnectionManagerDeserializer.cs rename to mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs index d03e9f40f..159f3f275 100644 --- a/mRemoteV1/Config/Connections/PuttyConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs @@ -8,8 +8,7 @@ using mRemoteNG.Container; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class PuttyConnectionManagerDeserializer : IDeserializer { diff --git a/mRemoteV1/Config/Connections/RemoteDesktopConnectionDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionDeserializer.cs similarity index 99% rename from mRemoteV1/Config/Connections/RemoteDesktopConnectionDeserializer.cs rename to mRemoteV1/Config/Serializers/RemoteDesktopConnectionDeserializer.cs index bdefe4a95..bbe5c7283 100644 --- a/mRemoteV1/Config/Connections/RemoteDesktopConnectionDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionDeserializer.cs @@ -4,8 +4,7 @@ using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class RemoteDesktopConnectionDeserializer : IDeserializer { diff --git a/mRemoteV1/Config/Connections/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs similarity index 99% rename from mRemoteV1/Config/Connections/RemoteDesktopConnectionManagerDeserializer.cs rename to mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index ac335ea3e..d09947983 100644 --- a/mRemoteV1/Config/Connections/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -10,8 +10,7 @@ using mRemoteNG.Container; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class RemoteDesktopConnectionManagerDeserializer : IDeserializer { diff --git a/mRemoteV1/Config/Connections/SqlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs similarity index 99% rename from mRemoteV1/Config/Connections/SqlConnectionsSerializer.cs rename to mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs index 3c5f12509..194f79cd5 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs @@ -14,8 +14,7 @@ using mRemoteNG.Tools; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class SqlConnectionsSerializer : ISerializer { diff --git a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs similarity index 99% rename from mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs rename to mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs index 9cca6fe09..fa2019f30 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs @@ -4,6 +4,7 @@ using System.Security; using System.Windows.Forms; using System.Xml; using mRemoteNG.App; +using mRemoteNG.Config.Connections; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.Http; @@ -19,8 +20,7 @@ using mRemoteNG.Tree.Root; using mRemoteNG.UI.Forms; using mRemoteNG.UI.TaskDialog; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class XmlConnectionsDeserializer : IDeserializer { diff --git a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs similarity index 99% rename from mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs rename to mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs index e50b97695..7193ad8ed 100644 --- a/mRemoteV1/Config/Connections/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs @@ -15,8 +15,7 @@ using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Connections +namespace mRemoteNG.Config.Serializers { public class XmlConnectionsSerializer : ISerializer { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index d90379737..ab4b06f44 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -126,24 +126,24 @@ - - - - - - - - + + + + + + + + - + - - + + @@ -152,7 +152,7 @@ - + From 300fb55ec5a684c47b2b7ba5f9729ca3a4de24b9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 12:03:36 -0600 Subject: [PATCH 218/338] Created ActiveDirectoryDeserializer. Import is now working --- mRemoteV1/App/Import.cs | 35 +----- .../Config/Import/ActiveDirectoryImporter.cs | 117 +++--------------- .../ActiveDirectoryDeserializer.cs | 89 +++++++++++++ .../UI/Window/ActiveDirectoryImportWindow.cs | 15 +-- mRemoteV1/mRemoteV1.csproj | 1 + 5 files changed, 122 insertions(+), 135 deletions(-) create mode 100644 mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 92da5badd..8b7db78a3 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -24,7 +24,6 @@ namespace mRemoteNG.App } #region Public Methods - //TODO Fix for TreeListView public static void ImportFromFile(ContainerInfo importDestinationContainer, bool alwaysUseSelectedTreeNode = false) { try @@ -46,9 +45,7 @@ namespace mRemoteNG.App openFileDialog.Filter = string.Join("|", fileTypes.ToArray()); if (openFileDialog.ShowDialog() != DialogResult.OK) - { return; - } foreach (var fileName in openFileDialog.FileNames) { @@ -91,34 +88,17 @@ namespace mRemoteNG.App } } - public static void ImportFromActiveDirectory(string ldapPath) + public static void ImportFromActiveDirectory(string ldapPath, ContainerInfo importDestinationContainer) { try { - var rootTreeNode = ConnectionTree.TreeView.Nodes[0]; - var selectedTreeNode = ConnectionTree.TreeView.SelectedNode; - - var parentTreeNode = GetParentTreeNode(rootTreeNode, selectedTreeNode); - if (parentTreeNode == null) - { - return; - } - - ActiveDirectoryImporter.Import(ldapPath, parentTreeNode); - - parentTreeNode.Expand(); - var parentContainer = (ContainerInfo) parentTreeNode.Tag; - if (parentContainer != null) - { - parentContainer.IsExpanded = true; - } - + var importer = new ActiveDirectoryImporter(); + importer.Import(ldapPath, importDestinationContainer); Runtime.SaveConnectionsBG(); } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromActiveDirectory() failed.", ex, - logOnly: true); + Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromActiveDirectory() failed.", ex, logOnly: true); } } @@ -152,13 +132,9 @@ namespace mRemoteNG.App logOnly: true); } } - #endregion - #region Private Methods - - private static TreeNode GetParentTreeNode(TreeNode rootTreeNode, TreeNode selectedTreeNode, - bool alwaysUseSelectedTreeNode = false) + private static TreeNode GetParentTreeNode(TreeNode rootTreeNode, TreeNode selectedTreeNode, bool alwaysUseSelectedTreeNode = false) { TreeNode parentTreeNode; @@ -229,6 +205,5 @@ namespace mRemoteNG.App return FileType.Unknown; } } - #endregion } } \ No newline at end of file diff --git a/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs b/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs index 8eaf08fa2..39be73d71 100644 --- a/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs +++ b/mRemoteV1/Config/Import/ActiveDirectoryImporter.cs @@ -1,115 +1,36 @@ using System; -using System.Windows.Forms; -using System.DirectoryServices; +using System.Linq; using mRemoteNG.App; -using System.Text.RegularExpressions; -using mRemoteNG.Connection; +using mRemoteNG.Config.Serializers; using mRemoteNG.Container; -using mRemoteNG.Tree; + namespace mRemoteNG.Config.Import { - public class ActiveDirectoryImporter + public class ActiveDirectoryImporter : IConnectionImporter { - public static void Import(string ldapPath, TreeNode parentTreeNode) + public void Import(object ldapPath, ContainerInfo destinationContainer) + { + var ldapPathAsString = ldapPath as string; + if (ldapPathAsString == null) return; + Import(ldapPathAsString, destinationContainer); + } + + public void Import(string ldapPath, ContainerInfo destinationContainer) { try { - var treeNode = ConnectionTreeNode.AddNode(TreeNodeType.Container); - - var containerInfo = new ContainerInfo(); - containerInfo.TreeNode = treeNode; - - var name = ""; - var match = Regex.Match(ldapPath, "ou=([^,]*)", RegexOptions.IgnoreCase); - if (match.Success) - { - name = match.Groups[1].Captures[0].Value; - } - else - { - name = Language.strActiveDirectory; - } - - containerInfo.Name = name; - - // We can only inherit from a container node, not the root node or connection nodes - if (ConnectionTreeNode.GetNodeType(parentTreeNode) == TreeNodeType.Container) - { - containerInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - } - else - { - containerInfo.Inheritance.DisableInheritance(); - } - - treeNode.Text = name; - treeNode.Name = name; - treeNode.Tag = containerInfo; - Runtime.ContainerList.Add(containerInfo); - - ImportComputers(ldapPath, treeNode); - - parentTreeNode.Nodes.Add(treeNode); - } + var deserializer = new ActiveDirectoryDeserializer(ldapPath); + var connectionTreeModel = deserializer.Deserialize(); + var importedRootNode = connectionTreeModel.RootNodes.First(); + if (importedRootNode == null) return; + var childrenToAdd = importedRootNode.Children.ToArray(); + destinationContainer.AddChildRange(childrenToAdd); + } catch (Exception ex) { Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.Import() failed.", ex, logOnly: true); } } - - private static void ImportComputers(string ldapPath, TreeNode parentTreeNode) - { - try - { - const string ldapFilter = "(objectClass=computer)"; - - var ldapSearcher = new DirectorySearcher(); - var ldapResults = default(SearchResultCollection); - var ldapResult = default(SearchResult); - - ldapSearcher.SearchRoot = new DirectoryEntry(ldapPath); - ldapSearcher.PropertiesToLoad.AddRange(new[] {"securityEquals", "cn"}); - ldapSearcher.Filter = ldapFilter; - ldapSearcher.SearchScope = SearchScope.OneLevel; - - ldapResults = ldapSearcher.FindAll(); - - foreach (SearchResult tempLoopVar_ldapResult in ldapResults) - { - ldapResult = tempLoopVar_ldapResult; - var with_2 = ldapResult.GetDirectoryEntry(); - var displayName = Convert.ToString(with_2.Properties["cn"].Value); - var description = Convert.ToString(with_2.Properties["Description"].Value); - var hostName = Convert.ToString(with_2.Properties["dNSHostName"].Value); - - var treeNode = ConnectionTreeNode.AddNode(TreeNodeType.Connection, displayName); - - var connectionInfo = new ConnectionInfo(); - var inheritanceInfo = new ConnectionInfoInheritance(connectionInfo); - inheritanceInfo.TurnOnInheritanceCompletely(); - inheritanceInfo.Description = false; - if (parentTreeNode.Tag is ContainerInfo) - { - connectionInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - } - connectionInfo.Inheritance = inheritanceInfo; - connectionInfo.Name = displayName; - connectionInfo.Hostname = hostName; - connectionInfo.Description = description; - connectionInfo.TreeNode = treeNode; - treeNode.Name = displayName; - treeNode.Tag = connectionInfo; //set the nodes tag to the conI - //add connection to connections - Runtime.ConnectionList.Add(connectionInfo); - - parentTreeNode.Nodes.Add(treeNode); - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.ImportComputers() failed.", ex, logOnly: true); - } - } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs b/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs new file mode 100644 index 000000000..f97dd5d0e --- /dev/null +++ b/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs @@ -0,0 +1,89 @@ +using System; +using System.DirectoryServices; +using System.Text.RegularExpressions; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Serializers +{ + public class ActiveDirectoryDeserializer : IDeserializer + { + private readonly string _ldapPath; + + public ActiveDirectoryDeserializer(string ldapPath) + { + _ldapPath = ldapPath; + } + + public ConnectionTreeModel Deserialize() + { + var connectionTreeModel = new ConnectionTreeModel(); + var root = new RootNodeInfo(RootNodeType.Connection); + connectionTreeModel.AddRootNode(root); + + ImportContainers(_ldapPath, root); + + return connectionTreeModel; + } + + private void ImportContainers(string ldapPath, ContainerInfo parentContainer) + { + var match = Regex.Match(ldapPath, "ou=([^,]*)", RegexOptions.IgnoreCase); + var name = match.Success ? match.Groups[1].Captures[0].Value : Language.strActiveDirectory; + + var newContainer = new ContainerInfo {Name = name}; + parentContainer.AddChild(newContainer); + + ImportComputers(ldapPath, newContainer); + } + + private void ImportComputers(string ldapPath, ContainerInfo parentContainer) + { + try + { + const string ldapFilter = "(objectClass=computer)"; + using (var ldapSearcher = new DirectorySearcher()) + { + ldapSearcher.SearchRoot = new DirectoryEntry(ldapPath); + ldapSearcher.Filter = ldapFilter; + ldapSearcher.SearchScope = SearchScope.OneLevel; + ldapSearcher.PropertiesToLoad.AddRange(new[] { "securityEquals", "cn" }); + + var ldapResults = ldapSearcher.FindAll(); + foreach (SearchResult ldapResult in ldapResults) + { + using (var directoryEntry = ldapResult.GetDirectoryEntry()) + DeserializeConnection(directoryEntry, parentContainer); + } + } + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage("Config.Import.ActiveDirectory.ImportComputers() failed.", ex, logOnly: true); + } + } + + private void DeserializeConnection(DirectoryEntry directoryEntry, ContainerInfo parentContainer) + { + var displayName = Convert.ToString(directoryEntry.Properties["cn"].Value); + var description = Convert.ToString(directoryEntry.Properties["Description"].Value); + var hostName = Convert.ToString(directoryEntry.Properties["dNSHostName"].Value); + + var newConnectionInfo = new ConnectionInfo + { + Name = displayName, + Hostname = hostName, + Description = description + }; + newConnectionInfo.Inheritance.TurnOnInheritanceCompletely(); + newConnectionInfo.Inheritance.Description = false; + + parentContainer.AddChild(newConnectionInfo); + Runtime.ConnectionList.Add(newConnectionInfo); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs b/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs index 4ddc5b209..397b059e0 100644 --- a/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs +++ b/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs @@ -2,6 +2,7 @@ using System; using System.Windows.Forms; using WeifenLuo.WinFormsUI.Docking; using mRemoteNG.App; +using mRemoteNG.Container; namespace mRemoteNG.UI.Window @@ -27,22 +28,22 @@ namespace mRemoteNG.UI.Window EnableDisableImportButton(); } - public void btnImport_Click(Object sender, EventArgs e) + public void btnImport_Click(object sender, EventArgs e) { - Import.ImportFromActiveDirectory(ActiveDirectoryTree.ADPath); + var selectedNodeAsContainer = Windows.treeForm.SelectedNode as ContainerInfo ?? + Windows.treeForm.SelectedNode.Parent; + Import.ImportFromActiveDirectory(ActiveDirectoryTree.ADPath, selectedNodeAsContainer); DialogResult = DialogResult.OK; Close(); } - static public void txtDomain_PreviewKeyDown(Object sender, PreviewKeyDownEventArgs e) + public static void txtDomain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Enter) - { e.IsInputKey = true; - } } - public void txtDomain_KeyDown(Object sender, KeyEventArgs e) + public void txtDomain_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { @@ -51,7 +52,7 @@ namespace mRemoteNG.UI.Window } } - public void btnChangeDomain_Click(Object sender, EventArgs e) + public void btnChangeDomain_Click(object sender, EventArgs e) { ChangeDomain(); } diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index ab4b06f44..d9922c349 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -126,6 +126,7 @@ + From effc6fc9dd3ffdf999878811d091f89d96753ba4 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 12:47:48 -0600 Subject: [PATCH 219/338] PortScanDeserializer created. Import now working --- mRemoteV1/App/Import.cs | 23 +--- mRemoteV1/Config/Import/PortScanImporter.cs | 116 ++++-------------- .../Serializers/PortScanDeserializer.cs | 89 ++++++++++++++ mRemoteV1/UI/Window/PortScanWindow.cs | 6 +- mRemoteV1/mRemoteV1.csproj | 1 + 5 files changed, 125 insertions(+), 110 deletions(-) create mode 100644 mRemoteV1/Config/Serializers/PortScanDeserializer.cs diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 8b7db78a3..93f1c69cb 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -6,6 +6,7 @@ using System.Windows.Forms; using mRemoteNG.Config.Import; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; +using mRemoteNG.Tools; using mRemoteNG.Tree; using mRemoteNG.UI.TaskDialog; @@ -102,28 +103,12 @@ namespace mRemoteNG.App } } - public static void ImportFromPortScan(IEnumerable hosts, ProtocolType protocol) + public static void ImportFromPortScan(IEnumerable hosts, ProtocolType protocol, ContainerInfo importDestinationContainer) { try { - var rootTreeNode = ConnectionTree.TreeView.Nodes[0]; - var selectedTreeNode = ConnectionTree.TreeView.SelectedNode; - - var parentTreeNode = GetParentTreeNode(rootTreeNode, selectedTreeNode); - if (parentTreeNode == null) - { - return; - } - - PortScanImporter.Import(hosts, protocol, parentTreeNode); - - parentTreeNode.Expand(); - var parentContainer = (ContainerInfo) parentTreeNode.Tag; - if (parentContainer != null) - { - parentContainer.IsExpanded = true; - } - + var importer = new PortScanImporter(protocol); + importer.Import(hosts, importDestinationContainer); Runtime.SaveConnectionsBG(); } catch (Exception ex) diff --git a/mRemoteV1/Config/Import/PortScanImporter.cs b/mRemoteV1/Config/Import/PortScanImporter.cs index acc4aeb6c..dcd8a960f 100644 --- a/mRemoteV1/Config/Import/PortScanImporter.cs +++ b/mRemoteV1/Config/Import/PortScanImporter.cs @@ -1,7 +1,6 @@ -using System.Collections; -using System.Windows.Forms; -using mRemoteNG.App; -using mRemoteNG.Connection; +using System.Collections.Generic; +using System.Linq; +using mRemoteNG.Config.Serializers; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; using mRemoteNG.Tools; @@ -9,92 +8,31 @@ using mRemoteNG.Tools; namespace mRemoteNG.Config.Import { - public static class PortScanImporter + public class PortScanImporter : IConnectionImporter { - public static void Import(IEnumerable hosts, ProtocolType protocol, TreeNode parentTreeNode) + private readonly ProtocolType _targetProtocolType; + + public PortScanImporter(ProtocolType targetProtocolType) + { + _targetProtocolType = targetProtocolType; + } + + public void Import(object hosts, ContainerInfo destinationContainer) + { + var hostsAsEnumerableScanHost = hosts as IEnumerable; + if (hostsAsEnumerableScanHost == null) return; + Import(hostsAsEnumerableScanHost, destinationContainer); + } + + public void Import(IEnumerable hosts, ContainerInfo destinationContainer) { - foreach (ScanHost host in hosts) - { - var finalProtocol = default(ProtocolType); - var protocolValid = false; - - var treeNode = Tree.ConnectionTreeNode.AddNode(Tree.TreeNodeType.Connection, host.HostNameWithoutDomain); - - var connectionInfo = new ConnectionInfo(); - connectionInfo.Inheritance = new ConnectionInfoInheritance(connectionInfo); - - connectionInfo.Name = host.HostNameWithoutDomain; - connectionInfo.Hostname = host.HostName; - - switch (protocol) - { - case ProtocolType.SSH2: - if (host.SSH) - { - finalProtocol = ProtocolType.SSH2; - protocolValid = true; - } - break; - case ProtocolType.Telnet: - if (host.Telnet) - { - finalProtocol = ProtocolType.Telnet; - protocolValid = true; - } - break; - case ProtocolType.HTTP: - if (host.HTTP) - { - finalProtocol = ProtocolType.HTTP; - protocolValid = true; - } - break; - case ProtocolType.HTTPS: - if (host.HTTPS) - { - finalProtocol = ProtocolType.HTTPS; - protocolValid = true; - } - break; - case ProtocolType.Rlogin: - if (host.Rlogin) - { - finalProtocol = ProtocolType.Rlogin; - protocolValid = true; - } - break; - case ProtocolType.RDP: - if (host.RDP) - { - finalProtocol = ProtocolType.RDP; - protocolValid = true; - } - break; - case ProtocolType.VNC: - if (host.VNC) - { - finalProtocol = ProtocolType.VNC; - protocolValid = true; - } - break; - } - - if (protocolValid) - { - connectionInfo.Protocol = finalProtocol; - connectionInfo.SetDefaultPort(); - - treeNode.Tag = connectionInfo; - parentTreeNode.Nodes.Add(treeNode); - - if (parentTreeNode.Tag is ContainerInfo) - { - connectionInfo.Parent = (ContainerInfo)parentTreeNode.Tag; - } - - Runtime.ConnectionList.Add(connectionInfo); - } - } - } + var deserializer = new PortScanDeserializer(hosts, _targetProtocolType); + var connectionTreeModel = deserializer.Deserialize(); + + var importedRootNode = connectionTreeModel.RootNodes.First(); + if (importedRootNode == null) return; + var childrenToAdd = importedRootNode.Children.ToArray(); + destinationContainer.AddChildRange(childrenToAdd); + } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/PortScanDeserializer.cs b/mRemoteV1/Config/Serializers/PortScanDeserializer.cs new file mode 100644 index 000000000..6ebdd87e0 --- /dev/null +++ b/mRemoteV1/Config/Serializers/PortScanDeserializer.cs @@ -0,0 +1,89 @@ +using System.Collections.Generic; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Container; +using mRemoteNG.Tools; +using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; + + +namespace mRemoteNG.Config.Serializers +{ + public class PortScanDeserializer : IDeserializer + { + private readonly IEnumerable _scannedHosts; + private readonly ProtocolType _targetProtocolType; + + public PortScanDeserializer(IEnumerable scannedHosts, ProtocolType targetProtocolType) + { + _scannedHosts = scannedHosts; + _targetProtocolType = targetProtocolType; + } + + public ConnectionTreeModel Deserialize() + { + var connectionTreeModel = new ConnectionTreeModel(); + var root = new RootNodeInfo(RootNodeType.Connection); + connectionTreeModel.AddRootNode(root); + + foreach (var host in _scannedHosts) + ImportScannedHost(host, root); + + return connectionTreeModel; + } + + private void ImportScannedHost(ScanHost host, ContainerInfo parentContainer) + { + var finalProtocol = default(ProtocolType); + var protocolValid = true; + + switch (_targetProtocolType) + { + case ProtocolType.SSH2: + if (host.SSH) + finalProtocol = ProtocolType.SSH2; + break; + case ProtocolType.Telnet: + if (host.Telnet) + finalProtocol = ProtocolType.Telnet; + break; + case ProtocolType.HTTP: + if (host.HTTP) + finalProtocol = ProtocolType.HTTP; + break; + case ProtocolType.HTTPS: + if (host.HTTPS) + finalProtocol = ProtocolType.HTTPS; + break; + case ProtocolType.Rlogin: + if (host.Rlogin) + finalProtocol = ProtocolType.Rlogin; + break; + case ProtocolType.RDP: + if (host.RDP) + finalProtocol = ProtocolType.RDP; + break; + case ProtocolType.VNC: + if (host.VNC) + finalProtocol = ProtocolType.VNC; + break; + default: + protocolValid = false; + break; + } + + if (!protocolValid) return; + var newConnectionInfo = new ConnectionInfo + { + Name = host.HostNameWithoutDomain, + Hostname = host.HostName, + Protocol = finalProtocol + }; + newConnectionInfo.SetDefaultPort(); + + parentContainer.AddChild(newConnectionInfo); + Runtime.ConnectionList.Add(newConnectionInfo); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Window/PortScanWindow.cs b/mRemoteV1/UI/Window/PortScanWindow.cs index e3b640390..9bd784b4d 100644 --- a/mRemoteV1/UI/Window/PortScanWindow.cs +++ b/mRemoteV1/UI/Window/PortScanWindow.cs @@ -4,6 +4,7 @@ using System.Windows.Forms; using WeifenLuo.WinFormsUI.Docking; using mRemoteNG.App; using mRemoteNG.Connection.Protocol; +using mRemoteNG.Container; using mRemoteNG.Messages; using mRemoteNG.Tools; using static mRemoteNG.Tools.MiscTools; @@ -244,7 +245,7 @@ namespace mRemoteNG.UI.Window private void importSelectedHosts(ProtocolType protocol) { - List hosts = new List(); + var hosts = new List(); foreach (ListViewItem item in lvHosts.SelectedItems) { var scanHost = (ScanHost)item.Tag; @@ -260,7 +261,8 @@ namespace mRemoteNG.UI.Window return; } - Import.ImportFromPortScan(hosts, protocol); + var selectedTreeNodeAsContainer = Windows.treeForm.SelectedNode as ContainerInfo ?? Windows.treeForm.SelectedNode.Parent; + Import.ImportFromPortScan(hosts, protocol, selectedTreeNodeAsContainer); } private void importVNCToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index d9922c349..0e45ec38a 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -131,6 +131,7 @@ + From 02fea4ad5d540f180ea41262acf3a969f21e17d6 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 12:48:56 -0600 Subject: [PATCH 220/338] Code cleanup --- mRemoteV1/App/Import.cs | 57 +---------------------------------------- 1 file changed, 1 insertion(+), 56 deletions(-) diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 93f1c69cb..fbd563bec 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Collections.Generic; using System.IO; using System.Windows.Forms; @@ -7,8 +6,7 @@ using mRemoteNG.Config.Import; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; using mRemoteNG.Tools; -using mRemoteNG.Tree; -using mRemoteNG.UI.TaskDialog; + namespace mRemoteNG.App { @@ -119,59 +117,6 @@ namespace mRemoteNG.App } #endregion - private static TreeNode GetParentTreeNode(TreeNode rootTreeNode, TreeNode selectedTreeNode, bool alwaysUseSelectedTreeNode = false) - { - TreeNode parentTreeNode; - - selectedTreeNode = GetContainerTreeNode(selectedTreeNode); - if (selectedTreeNode == null || selectedTreeNode == rootTreeNode) - { - parentTreeNode = rootTreeNode; - } - else - { - if (alwaysUseSelectedTreeNode) - { - parentTreeNode = GetContainerTreeNode(selectedTreeNode); - } - else - { - CTaskDialog.ShowCommandBox(Application.ProductName, Language.strImportLocationMainInstruction, - Language.strImportLocationContent, "", "", "", - string.Format(Language.strImportLocationCommandButtons, Environment.NewLine, rootTreeNode.Text, - selectedTreeNode.Text), true, ESysIcons.Question, 0); - switch (CTaskDialog.CommandButtonResult) - { - case 0: // Root - parentTreeNode = rootTreeNode; - break; - case 1: // Selected Folder - parentTreeNode = GetContainerTreeNode(selectedTreeNode); - break; - default: // Cancel - parentTreeNode = null; - break; - } - } - } - - return parentTreeNode; - } - - private static TreeNode GetContainerTreeNode(TreeNode treeNode) - { - if ((ConnectionTreeNode.GetNodeType(treeNode) == TreeNodeType.Root) || - (ConnectionTreeNode.GetNodeType(treeNode) == TreeNodeType.Container)) - { - return treeNode; - } - if (ConnectionTreeNode.GetNodeType(treeNode) == TreeNodeType.Connection) - { - return treeNode.Parent; - } - return null; - } - private static FileType DetermineFileType(string fileName) { // TODO: Use the file contents to determine the file type instead of trusting the extension From d80497011b3527e1b4f5082edf5d581afe166448 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 13:00:58 -0600 Subject: [PATCH 221/338] Removed unnecessary code --- mRemoteV1/App/Runtime.cs | 6 +- mRemoteV1/Tree/ConnectionTree.cs | 157 +------------------------------ mRemoteV1/UI/Forms/frmMain.cs | 6 +- 3 files changed, 9 insertions(+), 160 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 504fdcdf0..a0787ee6e 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -13,9 +13,11 @@ using System.Collections; using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Linq; using System.Threading; using System.Windows.Forms; using System.Xml; +using mRemoteNG.Root.PuttySessions; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.UI.Forms; using mRemoteNG.UI.Forms.Input; @@ -241,7 +243,9 @@ namespace mRemoteNG.App connectionsLoader.ConnectionList = ConnectionList; connectionsLoader.ContainerList = ContainerList; - ConnectionTree.ResetTree(); + + var rootConnectionNode = ConnectionTreeModel.RootNodes.First(node => !(node is RootPuttySessionsNodeInfo)); + ConnectionTreeModel.RemoveRootNode(rootConnectionNode); // Load config connectionsLoader.ConnectionFileName = filename; diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs index 224f1e380..dccc773e1 100644 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ b/mRemoteV1/Tree/ConnectionTree.cs @@ -1,155 +1,15 @@ using mRemoteNG.App; -using mRemoteNG.Connection; -using mRemoteNG.Messages; -using mRemoteNG.Tools.Sorting; -using System; -using System.Collections.Generic; using System.Windows.Forms; + namespace mRemoteNG.Tree { public static class ConnectionTree { - private static TreeNode SetNodeToolTip_old_node; private static TreeNode treeNodeToBeSelected; public static TreeView TreeView { get; set; } - public static TreeNode SelectedNode - { - get - { - return TreeView?.SelectedNode; - } - set - { - treeNodeToBeSelected = value; - SelectNode(); - } - } - - //TODO Fix for TreeListView - public static void Sort(TreeNode treeNode, SortOrder sorting) - { - if (TreeView == null) - return; - - TreeView.BeginUpdate(); - - if (treeNode == null) - { - if (TreeView.Nodes.Count > 0) - treeNode = TreeView.Nodes[0]; - else - return; - } - else if (ConnectionTreeNode.GetNodeType(treeNode) == TreeNodeType.Connection) - { - treeNode = treeNode.Parent; - if (treeNode == null) - return; - } - - Sort(treeNode, new TreeNodeSorter(sorting)); - TreeView.EndUpdate(); - } - - //TODO Fix for TreeListView - private static void Sort(TreeNode treeNode, TreeNodeSorter nodeSorter) - { - // Adapted from http://www.codeproject.com/Tips/252234/ASP-NET-TreeView-Sort - foreach (TreeNode childNode in treeNode.Nodes) - { - Sort(childNode, nodeSorter); - } - - try - { - List sortedNodes = new List(); - TreeNode currentNode = null; - while (treeNode.Nodes.Count > 0) - { - foreach (TreeNode childNode in treeNode.Nodes) - { - if (currentNode == null || nodeSorter.Compare(childNode, currentNode) < 0) - { - currentNode = childNode; - } - } - if (currentNode != null) - { - treeNode.Nodes.Remove(currentNode); - sortedNodes.Add(currentNode); - } - currentNode = null; - } - - foreach (TreeNode childNode in sortedNodes) - { - treeNode.Nodes.Add(childNode); - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Sort nodes failed" + Environment.NewLine + ex.Message, true); - } - } - - //TODO Fix for TreeListView - public static TreeNode Find(TreeNode treeNode, string searchFor) - { - - try - { - if (IsThisTheNodeWeAreSearchingFor(treeNode, searchFor)) - return treeNode; - - foreach (TreeNode childNode in treeNode.Nodes) - { - TreeNode tmpNode = Find(childNode, searchFor); - if (tmpNode != null) - { - return tmpNode; - } - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Find node failed" + Environment.NewLine + ex.Message, true); - } - - return null; - } - - //TODO Fix for TreeListView - private static bool IsThisTheNodeWeAreSearchingFor(TreeNode treeNode, string searchFor) - { - return treeNode.Text.ToLower().IndexOf(searchFor.ToLower(), StringComparison.Ordinal) + 1 > 0; - } - - //TODO Fix for TreeListView - public static TreeNode Find(TreeNode treeNode, ConnectionInfo conInfo) - { - try - { - if (treeNode.Tag == conInfo) - return treeNode; - - foreach (TreeNode childNode in treeNode.Nodes) - { - TreeNode tmpNode = Find(childNode, conInfo); - if (tmpNode != null) - return tmpNode; - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Find node failed" + Environment.NewLine + ex.Message, true); - } - - return null; - } - //TODO Fix for TreeListView private delegate void ResetTreeDelegate(); public static void ResetTree() @@ -167,20 +27,5 @@ namespace mRemoteNG.Tree TreeView.EndUpdate(); } } - - //TODO Fix for TreeListView - private delegate void SelectNodeDelegate(); - private static void SelectNode() - { - if (TreeView.InvokeRequired) - { - SelectNodeDelegate d = SelectNode; - TreeView.Invoke(d); - } - else - { - TreeView.SelectedNode = treeNodeToBeSelected; - } - } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 0f7bf41d2..dec60b992 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -156,7 +156,6 @@ namespace mRemoteNG.UI.Forms } Windows.treePanel.Focus(); - ConnectionTree.TreeView = Windows.treeForm.tvConnections; PuttySessionsManager.Instance.StartWatcher(); if (Settings.Default.StartupComponentsCheck) @@ -426,9 +425,10 @@ namespace mRemoteNG.UI.Forms { var extA = (ExternalTool)((ToolStripButton)sender).Tag; - if (ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(ConnectionTree.SelectedNode) == TreeNodeType.PuttySession) + var selectedTreeNode = Windows.treeForm.SelectedNode; + if (selectedTreeNode.GetTreeNodeType() == TreeNodeType.Connection | selectedTreeNode.GetTreeNodeType() == TreeNodeType.PuttySession) { - extA.Start((ConnectionInfo)ConnectionTree.SelectedNode.Tag); + extA.Start(selectedTreeNode); } else { From 46d04541f117839fe9c70ac99908a150100d86c1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 23 Sep 2016 23:13:19 -0600 Subject: [PATCH 222/338] Began creating unit tests for RemoteDesktopConnectionDeserializer --- ...emoteDesktopConnectionDeserializerTests.cs | 96 ++++++++++++++++++ .../Properties/Resources.Designer.cs | 31 ++++++ mRemoteNGTests/Properties/Resources.resx | 3 + .../test_remotedesktopconnection.rdp.txt | Bin 0 -> 2426 bytes mRemoteNGTests/mRemoteNGTests.csproj | 3 + .../RemoteDesktopConnectionDeserializer.cs | 1 + 6 files changed, 134 insertions(+) create mode 100644 mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionDeserializerTests.cs create mode 100644 mRemoteNGTests/Resources/test_remotedesktopconnection.rdp.txt diff --git a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionDeserializerTests.cs new file mode 100644 index 000000000..24526a1a4 --- /dev/null +++ b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionDeserializerTests.cs @@ -0,0 +1,96 @@ +using System; +using System.Linq; +using mRemoteNG.Config.Serializers; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Tree; +using mRemoteNGTests.Properties; +using NUnit.Framework; + + +namespace mRemoteNGTests.Config.Serializers +{ + public class RemoteDesktopConnectionDeserializerTests + { + // .rdp file schema: https://technet.microsoft.com/en-us/library/ff393699(v=ws.10).aspx + private string[] _connectionFileContents; + private RemoteDesktopConnectionDeserializer _deserializer; + private ConnectionTreeModel _connectionTreeModel; + private const string ExpectedHostname = "testhostname.domain.com"; + private const string ExpectedUserName = "myusernamehere"; + private const string ExpectedDomain = "myspecialdomain"; + private const string ExpectedGatewayHostname = "gatewayhostname.domain.com"; + private const int ExpectedPort = 9933; + private const ProtocolRDP.RDPColors ExpectedColors = ProtocolRDP.RDPColors.Colors24Bit; + + [OneTimeSetUp] + public void OnetimeSetup() + { + _connectionFileContents = Resources.test_remotedesktopconnection_rdp.Split(Environment.NewLine.ToCharArray()); + _deserializer = new RemoteDesktopConnectionDeserializer(_connectionFileContents); + _connectionTreeModel = _deserializer.Deserialize(); + } + + [OneTimeTearDown] + public void OnetimeTeardown() + { + _deserializer = null; + } + + [Test] + public void ConnectionTreeModelHasARootNode() + { + var numberOfRootNodes = _connectionTreeModel.RootNodes.Count; + Assert.That(numberOfRootNodes, Is.GreaterThan(0)); + } + + [Test] + public void RootNodeHasConnectionInfo() + { + var rootNodeContents = _connectionTreeModel.RootNodes.First().Children.OfType(); + Assert.That(rootNodeContents, Is.Not.Empty); + } + + [Test] + public void HostnameImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.Hostname, Is.EqualTo(ExpectedHostname)); + } + + [Test] + public void PortImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.Port, Is.EqualTo(ExpectedPort)); + } + + [Test] + public void UsernameImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.Username, Is.EqualTo(ExpectedUserName)); + } + + [Test] + public void DomainImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.Domain, Is.EqualTo(ExpectedDomain)); + } + + [Test] + public void RdpColorsImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.Colors, Is.EqualTo(ExpectedColors)); + } + + //[Test] + //public void GatewayHostnameImportedCorrectly() + //{ + // var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + // Assert.That(connectionInfo.RDGatewayHostname, Is.EqualTo(_expectedGatewayHostname)); + //} + } +} \ No newline at end of file diff --git a/mRemoteNGTests/Properties/Resources.Designer.cs b/mRemoteNGTests/Properties/Resources.Designer.cs index fac011306..4b2141a99 100644 --- a/mRemoteNGTests/Properties/Resources.Designer.cs +++ b/mRemoteNGTests/Properties/Resources.Designer.cs @@ -60,6 +60,37 @@ namespace mRemoteNGTests.Properties { } } + /// + /// Looks up a localized string similar to screen mode id:i:2 + ///use multimon:i:0 + ///desktopwidth:i:800 + ///desktopheight:i:600 + ///session bpp:i:32 + ///winposstr:s:0,3,0,0,800,600 + ///compression:i:1 + ///keyboardhook:i:2 + ///audiocapturemode:i:0 + ///videoplaybackmode:i:1 + ///connection type:i:7 + ///networkautodetect:i:1 + ///bandwidthautodetect:i:1 + ///displayconnectionbar:i:1 + ///username:s:myusernamehere + ///enableworkspacereconnect:i:0 + ///disable wallpaper:i:0 + ///allow font smoothing:i:0 + ///allow desktop composition:i:0 + ///disable full window drag:i:1 + ///disable menu anims:i:1 + ///disable themes:i:0 + /// [rest of string was truncated]";. + /// + internal static string test_remotedesktopconnection_rdp { + get { + return ResourceManager.GetString("test_remotedesktopconnection_rdp", resourceCulture); + } + } + /// /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> ///<Connections Name="Connections" Export="False" Protected="95syzRuZ4mRxpNkZQzoyX8SDpQXLyMq3GncO8o4SyTBoYvn3TAWgn05ZEU2DrjkM" ConfVersion="2.5"> diff --git a/mRemoteNGTests/Properties/Resources.resx b/mRemoteNGTests/Properties/Resources.resx index 2710c157f..56e3032d9 100644 --- a/mRemoteNGTests/Properties/Resources.resx +++ b/mRemoteNGTests/Properties/Resources.resx @@ -121,4 +121,7 @@ ..\Resources\TestConfCons.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\test_remotedesktopconnection.rdp.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/test_remotedesktopconnection.rdp.txt b/mRemoteNGTests/Resources/test_remotedesktopconnection.rdp.txt new file mode 100644 index 0000000000000000000000000000000000000000..f9e45b69b2bc652ae51738bfe1a225256e5cc3da GIT binary patch literal 2426 zcmaKu>u#G+5QO)4rM?3X5JhQH_2Rc7w&Pf~Au=SbU%u^pXE;7Uk%e3+>}7U#c2EBP z>0%w{*y?Jcic_?)(Q_4h-BbKE-=<>HSGh$LRG1+h(wNNH%zOanRQ`-r`q^ z(Z}mx^CKQ~5o>DqDzAO)WY-Ut->#PA>~!r@t}31t_ieCxjISvgc^bWKlVz`JR(e_~ z#$7z=$DN<^-$jYOmd{C^)L*i=>MtqwL0>M)+D0v_jWD*l4p#(JQ;U&JLb%rRo2qzE z5i^&L=gL21NA>V?lr^zyb>MJiew-bAjjpXMV4VL|db-GaJ7D;paAMPo@m84+2@yRY zQ$Ki*O?CxUR6sYU5+!1eWog| zgwJY1hkNP0lak8^^vL+8%ICapQ6^ObndgCowX16d% zhw(yzY||;)rT&A#y+%_xBh@m6Rv#+rl9uyidZ&5C%vM_yhU86BQTje)y3Z|8(}i?->Ii%L(adI ZNa&f~u($JGDyJN$7HUS_$B7L-{{RZNuSoy^ literal 0 HcmV?d00001 diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index fb0a9e03c..15fc2dadb 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -108,6 +108,7 @@ + @@ -145,6 +146,7 @@ + @@ -163,6 +165,7 @@ + diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionDeserializer.cs index bbe5c7283..8000d8682 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionDeserializer.cs @@ -8,6 +8,7 @@ namespace mRemoteNG.Config.Serializers { public class RemoteDesktopConnectionDeserializer : IDeserializer { + // .rdp file schema: https://technet.microsoft.com/en-us/library/ff393699(v=ws.10).aspx private readonly string[] _fileContent; public RemoteDesktopConnectionDeserializer(string[] fileContent) From 775499a1ff7739a654b27e8dfee5164519ad754c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 24 Sep 2016 12:18:37 -0600 Subject: [PATCH 223/338] Created more tests for the RemoteDesktopConnectionDeserializer --- ...emoteDesktopConnectionDeserializerTests.cs | 89 ++++++++++++++++++ .../test_remotedesktopconnection.rdp.txt | Bin 2426 -> 2466 bytes 2 files changed, 89 insertions(+) diff --git a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionDeserializerTests.cs index 24526a1a4..1e77602e7 100644 --- a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionDeserializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionDeserializerTests.cs @@ -22,6 +22,18 @@ namespace mRemoteNGTests.Config.Serializers private const string ExpectedGatewayHostname = "gatewayhostname.domain.com"; private const int ExpectedPort = 9933; private const ProtocolRDP.RDPColors ExpectedColors = ProtocolRDP.RDPColors.Colors24Bit; + private const bool ExpectedBitmapCaching = false; + private const ProtocolRDP.RDPResolutions ExpectedResolutionMode = ProtocolRDP.RDPResolutions.FitToWindow; + private const bool ExpectedWallpaperDisplay = true; + private const bool ExpectedThemesDisplay = true; + private const bool ExpectedFontSmoothing = true; + private const bool ExpectedDesktopComposition = true; + private const bool ExpectedSmartcardRedirection = true; + private const bool ExpectedDriveRedirection = true; + private const bool ExpectedPortRedirection = true; + private const bool ExpectedPrinterRedirection = true; + private const ProtocolRDP.RDPSounds ExpectedSoundRedirection = ProtocolRDP.RDPSounds.BringToThisComputer; + [OneTimeSetUp] public void OnetimeSetup() @@ -86,6 +98,83 @@ namespace mRemoteNGTests.Config.Serializers Assert.That(connectionInfo.Colors, Is.EqualTo(ExpectedColors)); } + [Test] + public void BitmapCachingImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.CacheBitmaps, Is.EqualTo(ExpectedBitmapCaching)); + } + + [Test] + public void ResolutionImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.Resolution, Is.EqualTo(ExpectedResolutionMode)); + } + + [Test] + public void DisplayWallpaperImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.DisplayWallpaper, Is.EqualTo(ExpectedWallpaperDisplay)); + } + + [Test] + public void DisplayThemesImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.DisplayThemes, Is.EqualTo(ExpectedThemesDisplay)); + } + + [Test] + public void FontSmoothingImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.EnableFontSmoothing, Is.EqualTo(ExpectedFontSmoothing)); + } + + [Test] + public void DesktopCompositionImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.EnableDesktopComposition, Is.EqualTo(ExpectedDesktopComposition)); + } + + [Test] + public void SmartcardRedirectionImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.RedirectSmartCards, Is.EqualTo(ExpectedSmartcardRedirection)); + } + + [Test] + public void DriveRedirectionImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.RedirectDiskDrives, Is.EqualTo(ExpectedDriveRedirection)); + } + + [Test] + public void PortRedirectionImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.RedirectPorts, Is.EqualTo(ExpectedPortRedirection)); + } + + [Test] + public void PrinterRedirectionImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.RedirectPrinters, Is.EqualTo(ExpectedPrinterRedirection)); + } + + [Test] + public void SoundRedirectionImportedCorrectly() + { + var connectionInfo = _connectionTreeModel.RootNodes.First().Children.First(); + Assert.That(connectionInfo.RedirectSound, Is.EqualTo(ExpectedSoundRedirection)); + } + //[Test] //public void GatewayHostnameImportedCorrectly() //{ diff --git a/mRemoteNGTests/Resources/test_remotedesktopconnection.rdp.txt b/mRemoteNGTests/Resources/test_remotedesktopconnection.rdp.txt index f9e45b69b2bc652ae51738bfe1a225256e5cc3da..f144f9718d281134788b9b0390f8d045fe7d66e6 100644 GIT binary patch delta 69 zcmew*v`Bb@3Zvmh)r(AwhLgWD83RdeX4}b2n8ha7G1q} Date: Sun, 25 Sep 2016 09:56:43 -0600 Subject: [PATCH 224/338] Made the version checker a bit safer --- .../RemoteDesktopConnectionManagerDeserializer.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index d09947983..f5956a753 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -52,11 +52,18 @@ namespace mRemoteNG.Config.Serializers private void VerifyFileVersion(XmlNode rdcManNode) { - var versionNode = rdcManNode.SelectSingleNode("./version"); - var version = new Version(versionNode.InnerText); - if (!(version == new Version(2, 2))) + var versionNode = rdcManNode.SelectSingleNode("./version")?.InnerText; + if (versionNode != null) { - throw (new FileFormatException($"Unsupported file version ({version}).")); + var version = new Version(versionNode); + if (!(version == new Version(2, 2))) + { + throw new FileFormatException($"Unsupported file version ({version})."); + } + } + else + { + throw new FileFormatException("Unknown file version"); } } From cc43eab6eee3b6dbded1e707e4a39776cff36bed Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 10:38:29 -0600 Subject: [PATCH 225/338] Removed unnecessary code --- .../Serializers/RemoteDesktopConnectionManagerDeserializer.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index f5956a753..5cfd40ce8 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -86,8 +86,6 @@ namespace mRemoteNG.Config.Serializers break; } } - - Runtime.ContainerList.Add(newContainer); } private ContainerInfo ImportContainer(XmlNode containerPropertiesNode, ContainerInfo parentContainer) @@ -105,8 +103,6 @@ namespace mRemoteNG.Config.Serializers { var newConnectionInfo = ConnectionInfoFromXml(serverNode); parentContainer.AddChild(newConnectionInfo); - - Runtime.ConnectionList.Add(newConnectionInfo); } private ConnectionInfo ConnectionInfoFromXml(XmlNode xmlNode) From ae4ce70c485c11187439794b2bcd764dbc60308d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 10:39:06 -0600 Subject: [PATCH 226/338] Began creating tests for the RemoteDesktopConnectionManagerDeserializer --- ...sktopConnectionManagerDeserializerTests.cs | 56 +++++++ .../Properties/Resources.Designer.cs | 59 ++++++- mRemoteNGTests/Properties/Resources.resx | 8 +- .../Resources/test_rdcman_v2_2_schema1.rdg | 145 ++++++++++++++++++ .../Resources/test_rdcman_v2_7_schema3.rdg | 120 +++++++++++++++ ...p.txt => test_remotedesktopconnection.rdp} | Bin mRemoteNGTests/mRemoteNGTests.csproj | 6 +- 7 files changed, 385 insertions(+), 9 deletions(-) create mode 100644 mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs create mode 100644 mRemoteNGTests/Resources/test_rdcman_v2_2_schema1.rdg create mode 100644 mRemoteNGTests/Resources/test_rdcman_v2_7_schema3.rdg rename mRemoteNGTests/Resources/{test_remotedesktopconnection.rdp.txt => test_remotedesktopconnection.rdp} (100%) diff --git a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs new file mode 100644 index 000000000..b6a80d8b2 --- /dev/null +++ b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs @@ -0,0 +1,56 @@ +using System.Linq; +using mRemoteNG.Config.Serializers; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNGTests.Properties; +using NUnit.Framework; + + +namespace mRemoteNGTests.Config.Serializers +{ + public class RemoteDesktopConnectionManagerDeserializerTests + { + private string _connectionFileContents; + private RemoteDesktopConnectionManagerDeserializer _deserializer; + private ConnectionTreeModel _connectionTreeModel; + + + [OneTimeSetUp] + public void OnetimeSetup() + { + _connectionFileContents = Resources.test_rdcman_v2_2_schema1; + _deserializer = new RemoteDesktopConnectionManagerDeserializer(_connectionFileContents); + _connectionTreeModel = _deserializer.Deserialize(); + } + + [OneTimeTearDown] + public void OnetimeTeardown() + { + _deserializer = null; + } + + [Test] + public void ConnectionTreeModelHasARootNode() + { + var numberOfRootNodes = _connectionTreeModel.RootNodes.Count; + Assert.That(numberOfRootNodes, Is.GreaterThan(0)); + } + + [Test] + public void RootNodeHasContents() + { + var rootNodeContents = _connectionTreeModel.RootNodes.First().Children; + Assert.That(rootNodeContents, Is.Not.Empty); + } + + [Test] + public void AllSubRootFoldersImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var rootNodeContents = importedRdcmanRootNode.Children.Count(node => node.Name == "Group1" || node.Name == "Group2"); + Assert.That(rootNodeContents, Is.EqualTo(2)); + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/Properties/Resources.Designer.cs b/mRemoteNGTests/Properties/Resources.Designer.cs index 4b2141a99..5d83327cf 100644 --- a/mRemoteNGTests/Properties/Resources.Designer.cs +++ b/mRemoteNGTests/Properties/Resources.Designer.cs @@ -61,11 +61,58 @@ namespace mRemoteNGTests.Properties { } /// - /// Looks up a localized string similar to screen mode id:i:2 + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<RDCMan schemaVersion="1"> + /// <version>2.2</version> + /// <file> + /// <properties> + /// <name>test_rdcman_v2_2_schema1</name> + /// <expanded>False</expanded> + /// <comment /> + /// <logonCredentials inherit="FromParent" /> + /// <connectionSettings inherit="FromParent" /> + /// <gatewaySettings inherit="FromParent" /> + /// <remoteDesktop inherit="FromParent" /> + /// <localResources inherit="FromParent" [rest of string was truncated]";. + /// + internal static string test_rdcman_v2_2_schema1 { + get { + return ResourceManager.GetString("test_rdcman_v2_2_schema1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<RDCMan programVersion="2.7" schemaVersion="3"> + /// <file> + /// <credentialsProfiles /> + /// <properties> + /// <expanded>True</expanded> + /// <name>test_RDCMan_connections</name> + /// </properties> + /// <smartGroup> + /// <properties> + /// <expanded>False</expanded> + /// <name>AllServers</name> + /// </properties> + /// <ruleGroup operator="All"> + /// <rule> + /// <property>DisplayName</property> + /// <operator>Matches</operator> + /// [rest of string was truncated]";. + /// + internal static string test_rdcman_v2_7_schema3 { + get { + return ResourceManager.GetString("test_rdcman_v2_7_schema3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to screen mode id:i:1 ///use multimon:i:0 ///desktopwidth:i:800 ///desktopheight:i:600 - ///session bpp:i:32 + ///session bpp:i:24 ///winposstr:s:0,3,0,0,800,600 ///compression:i:1 ///keyboardhook:i:2 @@ -77,12 +124,12 @@ namespace mRemoteNGTests.Properties { ///displayconnectionbar:i:1 ///username:s:myusernamehere ///enableworkspacereconnect:i:0 - ///disable wallpaper:i:0 - ///allow font smoothing:i:0 - ///allow desktop composition:i:0 + ///disable wallpaper:i:1 + ///allow font smoothing:i:1 + ///allow desktop composition:i:1 ///disable full window drag:i:1 ///disable menu anims:i:1 - ///disable themes:i:0 + ///disable themes:i:1 /// [rest of string was truncated]";. /// internal static string test_remotedesktopconnection_rdp { diff --git a/mRemoteNGTests/Properties/Resources.resx b/mRemoteNGTests/Properties/Resources.resx index 56e3032d9..bf66714b5 100644 --- a/mRemoteNGTests/Properties/Resources.resx +++ b/mRemoteNGTests/Properties/Resources.resx @@ -121,7 +121,13 @@ ..\Resources\TestConfCons.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\test_rdcman_v2_2_schema1.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\Resources\test_RDCMan_v2_7_schema3.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + - ..\Resources\test_remotedesktopconnection.rdp.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 + ..\Resources\test_remotedesktopconnection.rdp;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 \ No newline at end of file diff --git a/mRemoteNGTests/Resources/test_rdcman_v2_2_schema1.rdg b/mRemoteNGTests/Resources/test_rdcman_v2_2_schema1.rdg new file mode 100644 index 000000000..b695d13a8 --- /dev/null +++ b/mRemoteNGTests/Resources/test_rdcman_v2_2_schema1.rdg @@ -0,0 +1,145 @@ + + + 2.2 + + + test_rdcman_v2_2_schema1 + True + + + + + + + + + + + + Group1 + True + + + + + + + + + + + server1 + server1_displayname + Comment text here + + myusername1 + mydomain + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/jk3lWsW+ku0n4AOVYyLTAAAAAACAAAAAAAQZgAAAAEAACAAAAC2ydwmIIkk4aAKzKc4Vo6xcHcSUDjwVSXcSTGEhaPUVwAAAAAOgAAAAAIAACAAAACKfrTHU1q7LWhKGfih70PJon3D8CDXHS3Mtj34fSWU9yAAAADf19KsxXuWlJ9Sx+SLe/ou8smSZi2u9MS90P5kGspJlEAAAAAHP5ARrJZnyTQ36URfabE7xPlnmy1qt/+RyqJezQ2G+qg/TecZC7fYRCSjMA9GhgiyLKG4ATVpYFTLJuvZZuRU + + + False + + + 9933 + + + David + Leviathan + + True + gatewayserverhost.innerdomain.net + 4 + False + False + + + 1024 x 768 + True + False + 16 + + + 0 + 0 + 0 + 2 + True + True + True + True + True + + + 2 + + + 1 + + + + server2 + server2 + + + + + + + + + + + + + Group2 + True + + + + + + + + + + + + Group3 + True + + + + + + + + + + + server3 + server3 + + + + + + + + + + + server4 + server4 + + + + + + + + + + + + + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/test_rdcman_v2_7_schema3.rdg b/mRemoteNGTests/Resources/test_rdcman_v2_7_schema3.rdg new file mode 100644 index 000000000..e4b61c7c3 --- /dev/null +++ b/mRemoteNGTests/Resources/test_rdcman_v2_7_schema3.rdg @@ -0,0 +1,120 @@ + + + + + + True + test_RDCMan_connections + + + + False + AllServers + + + + DisplayName + Matches + server + + + + + + True + Group1 + + + + server1 + + + Custom + someusername1 + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/jk3lWsW+ku0n4AOVYyLTAAAAAACAAAAAAAQZgAAAAEAACAAAACZryl2a4trJLcUdyg7jL/m51fxn4Vy+je6SBhT5FasmgAAAAAOgAAAAAIAACAAAAAcG6MQhKFvEcKRrRE74YKrrnYKxLFnVxbGzyfl7JoyvjAAAACAofcbQqcr6h9VQuwwWW5IBkW1zsugofl1MjsL9t2uWfuBgnrya1Xlyue5E7cG8BZAAAAApgx/XXqBqXhr6CV2SJTlXihg7n5epOIT02A8ymy3qRftDgXlmu3IaN7krK3gofv+iNdVrvIdJJMYCihm7dyqOw== + mydomain + + + False + + + 9933 + + + + True + gatewayserver.innerdomain.net + Any + True + True + Custom + + + + + + False + True + 24 + + + Client + Dynamic + DoNotRecord + FullScreenClient + True + True + + C:\ + D:\ + E:\ + F:\ + G:\ + + True + True + True + True + + + 1 + False + False + + + Warn + + + + + server2 + + + + + + True + Group2 + + + + True + Group3 + + + + server3 + + + + + server4 + + + + + + + + + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/test_remotedesktopconnection.rdp.txt b/mRemoteNGTests/Resources/test_remotedesktopconnection.rdp similarity index 100% rename from mRemoteNGTests/Resources/test_remotedesktopconnection.rdp.txt rename to mRemoteNGTests/Resources/test_remotedesktopconnection.rdp diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 15fc2dadb..b513cf1b6 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -109,6 +109,7 @@ + @@ -146,7 +147,6 @@ - @@ -165,7 +165,9 @@ - + + + From 12d8097774942dab302c6aeac16c929dc621c3fa Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 10:55:22 -0600 Subject: [PATCH 227/338] Ensured UseConsoleSession bool could be parsed --- .../Serializers/RemoteDesktopConnectionManagerDeserializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index 5cfd40ce8..fd59959c9 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -138,7 +138,7 @@ namespace mRemoteNG.Config.Serializers var connectionSettingsNode = xmlNode.SelectSingleNode("./connectionSettings"); if (connectionSettingsNode?.Attributes?["inherit"].Value == "None") { - connectionInfo.UseConsoleSession = bool.Parse(connectionSettingsNode.SelectSingleNode("./connectToConsole")?.InnerText); + connectionInfo.UseConsoleSession = bool.Parse(connectionSettingsNode.SelectSingleNode("./connectToConsole")?.InnerText ?? "false"); // ./startProgram // ./workingDir connectionInfo.Port = Convert.ToInt32(connectionSettingsNode.SelectSingleNode("./port")?.InnerText); From 63ae7d845c5c964d52d0de9d0553d72f85317214 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 10:55:41 -0600 Subject: [PATCH 228/338] Code cleanup --- .../RemoteDesktopConnectionManagerDeserializer.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index fd59959c9..607579823 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -109,14 +109,13 @@ namespace mRemoteNG.Config.Serializers { var connectionInfo = new ConnectionInfo {Protocol = ProtocolType.RDP}; - var name = xmlNode.SelectSingleNode("./name")?.InnerText; + var hostname = xmlNode.SelectSingleNode("./name")?.InnerText; - var displayNameNode = xmlNode.SelectSingleNode("./displayName"); - var displayName = displayNameNode?.InnerText ?? Language.strNewConnection; + var displayName = xmlNode.SelectSingleNode("./displayName")?.InnerText ?? Language.strNewConnection; connectionInfo.Name = displayName; connectionInfo.Description = xmlNode.SelectSingleNode("./comment")?.InnerText; - connectionInfo.Hostname = name; + connectionInfo.Hostname = hostname; var logonCredentialsNode = xmlNode.SelectSingleNode("./logonCredentials"); if (logonCredentialsNode?.Attributes?["inherit"].Value == "None") From 34f8a123a53c7b70701ea5d73a0419a79df25f5a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 11:11:06 -0600 Subject: [PATCH 229/338] Resolved bug with importing gateway password from RDCMan when not stored in clear text --- .../RemoteDesktopConnectionManagerDeserializer.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index 607579823..cb622be7f 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -152,19 +152,11 @@ namespace mRemoteNG.Config.Serializers if (gatewaySettingsNode?.Attributes?["inherit"].Value == "None") { connectionInfo.RDGatewayUsageMethod = gatewaySettingsNode.SelectSingleNode("./enabled")?.InnerText == "True" ? ProtocolRDP.RDGatewayUsageMethod.Always : ProtocolRDP.RDGatewayUsageMethod.Never; - connectionInfo.RDGatewayHostname = gatewaySettingsNode.SelectSingleNode("./hostName")?.InnerText; connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName")?.InnerText; - var passwordNode = logonCredentialsNode.SelectSingleNode("./password"); - if (passwordNode?.Attributes?["storeAsClearText"].Value == "True") - { - connectionInfo.RDGatewayPassword = passwordNode.InnerText; - } - else - { - connectionInfo.Password = DecryptPassword(passwordNode.InnerText); - } + var passwordNode = gatewaySettingsNode.SelectSingleNode("./password"); + connectionInfo.RDGatewayPassword = passwordNode?.Attributes?["storeAsClearText"].Value == "True" ? passwordNode.InnerText : DecryptPassword(passwordNode?.InnerText); connectionInfo.RDGatewayDomain = gatewaySettingsNode.SelectSingleNode("./domain")?.InnerText; // ./logonMethod From aa6f4679426c6f998420a4fe0e09885f20c7132d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 11:31:41 -0600 Subject: [PATCH 230/338] Made the parsing code a bit safer --- .../RemoteDesktopConnectionManagerDeserializer.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index cb622be7f..a07bf3c29 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -195,8 +195,9 @@ namespace mRemoteNG.Config.Serializers connectionInfo.Resolution = ProtocolRDP.RDPResolutions.Fullscreen; } - - connectionInfo.Colors = (ProtocolRDP.RDPColors)Enum.Parse(typeof(ProtocolRDP.RDPColors), remoteDesktopNode.SelectSingleNode("./colorDepth").InnerText); + var colorDepth = remoteDesktopNode.SelectSingleNode("./colorDepth")?.InnerText; + if (colorDepth != null) + connectionInfo.Colors = (ProtocolRDP.RDPColors)Enum.Parse(typeof(ProtocolRDP.RDPColors), colorDepth); } else { @@ -237,10 +238,10 @@ namespace mRemoteNG.Config.Serializers } // ./redirectClipboard - connectionInfo.RedirectDiskDrives = bool.Parse(localResourcesNode.SelectSingleNode("./redirectDrives").InnerText); - connectionInfo.RedirectPorts = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPorts").InnerText); - connectionInfo.RedirectPrinters = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPrinters").InnerText); - connectionInfo.RedirectSmartCards = bool.Parse(localResourcesNode.SelectSingleNode("./redirectSmartCards").InnerText); + connectionInfo.RedirectDiskDrives = bool.Parse(localResourcesNode.SelectSingleNode("./redirectDrives")?.InnerText ?? "false"); + connectionInfo.RedirectPorts = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPorts")?.InnerText ?? "false"); + connectionInfo.RedirectPrinters = bool.Parse(localResourcesNode.SelectSingleNode("./redirectPrinters")?.InnerText ?? "false"); + connectionInfo.RedirectSmartCards = bool.Parse(localResourcesNode.SelectSingleNode("./redirectSmartCards")?.InnerText ?? "false"); } else { From d0153da3d1aea5884e905cc79af5539e6bb2a277 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 11:32:02 -0600 Subject: [PATCH 231/338] Created more tests for teh RemoteDesktopConnectionManagerDeserializer --- ...sktopConnectionManagerDeserializerTests.cs | 255 +++++++++++++++++- .../Resources/test_rdcman_v2_2_schema1.rdg | 18 +- 2 files changed, 263 insertions(+), 10 deletions(-) diff --git a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs index b6a80d8b2..5069a1135 100644 --- a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs @@ -1,6 +1,7 @@ using System.Linq; using mRemoteNG.Config.Serializers; -using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Container; using mRemoteNG.Tree; using mRemoteNGTests.Properties; @@ -14,6 +15,28 @@ namespace mRemoteNGTests.Config.Serializers private string _connectionFileContents; private RemoteDesktopConnectionManagerDeserializer _deserializer; private ConnectionTreeModel _connectionTreeModel; + private const string ExpectedName = "server1_displayname"; + private const string ExpectedHostname = "server1"; + private const string ExpectedDescription = "Comment text here"; + private const string ExpectedUsername = "myusername1"; + private const string ExpectedDomain = "mydomain"; + private const string ExpectedPassword = "passwordHere!"; + private const bool ExpectedUseConsoleSession = true; + private const int ExpectedPort = 9933; + private const ProtocolRDP.RDGatewayUsageMethod ExpectedGatewayUsageMethod = ProtocolRDP.RDGatewayUsageMethod.Always; + private const string ExpectedGatewayHostname = "gatewayserverhost.innerdomain.net"; + private const string ExpectedGatewayUsername = "gatewayusername"; + private const string ExpectedGatewayDomain = "innerdomain"; + private const string ExpectedGatewayPassword = "gatewayPassword123"; + private const ProtocolRDP.RDPResolutions ExpectedRdpResolution = ProtocolRDP.RDPResolutions.FitToWindow; + private const ProtocolRDP.RDPColors ExpectedRdpColorDepth = ProtocolRDP.RDPColors.Colors24Bit; + private const ProtocolRDP.RDPSounds ExpectedAudioRedirection = ProtocolRDP.RDPSounds.DoNotPlay; + private const bool ExpectedKeyRedirection = true; + private const bool ExpectedSmartcardRedirection = true; + private const bool ExpectedDriveRedirection = true; + private const bool ExpectedPortRedirection = true; + private const bool ExpectedPrinterRedirection = true; + private const ProtocolRDP.AuthenticationLevel ExpectedAuthLevel = ProtocolRDP.AuthenticationLevel.AuthRequired; [OneTimeSetUp] @@ -52,5 +75,235 @@ namespace mRemoteNGTests.Config.Serializers var rootNodeContents = importedRdcmanRootNode.Children.Count(node => node.Name == "Group1" || node.Name == "Group2"); Assert.That(rootNodeContents, Is.EqualTo(2)); } + + [Test] + public void ConnectionDisplayNameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Name, Is.EqualTo(ExpectedName)); + } + + [Test] + public void ConnectionHostnameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Hostname, Is.EqualTo(ExpectedHostname)); + } + + [Test] + public void ConnectionDescriptionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Description, Is.EqualTo(ExpectedDescription)); + } + + [Test] + public void ConnectionUsernameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Username, Is.EqualTo(ExpectedUsername)); + } + + [Test] + public void ConnectionDomainImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Domain, Is.EqualTo(ExpectedDomain)); + } + + [Test] + public void ConnectionPasswordImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Password, Is.EqualTo(ExpectedPassword)); + } + + [Test] + public void ConnectionProtocolSetToRdp() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Protocol, Is.EqualTo(ProtocolType.RDP)); + } + + [Test] + public void ConnectionUseConsoleSessionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.UseConsoleSession, Is.EqualTo(ExpectedUseConsoleSession)); + } + + [Test] + public void ConnectionPortImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Port, Is.EqualTo(ExpectedPort)); + } + + [Test] + public void ConnectionGatewayUsageMethodImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayUsageMethod, Is.EqualTo(ExpectedGatewayUsageMethod)); + } + + [Test] + public void ConnectionGatewayHostnameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayHostname, Is.EqualTo(ExpectedGatewayHostname)); + } + + [Test] + public void ConnectionGatewayUsernameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayUsername, Is.EqualTo(ExpectedGatewayUsername)); + } + + [Test] + public void ConnectionGatewayPasswordImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayPassword, Is.EqualTo(ExpectedGatewayPassword)); + } + + [Test] + public void ConnectionGatewayDomainImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayDomain, Is.EqualTo(ExpectedGatewayDomain)); + } + + [Test] + public void ConnectionResolutionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Resolution, Is.EqualTo(ExpectedRdpResolution)); + } + + [Test] + public void ConnectionColorDepthImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Colors, Is.EqualTo(ExpectedRdpColorDepth)); + } + + [Test] + public void ConnectionAudioRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectSound, Is.EqualTo(ExpectedAudioRedirection)); + } + + [Test] + public void ConnectionKeyRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectKeys, Is.EqualTo(ExpectedKeyRedirection)); + } + + [Test] + public void ConnectionDriveRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectDiskDrives, Is.EqualTo(ExpectedDriveRedirection)); + } + + [Test] + public void ConnectionPortRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectPorts, Is.EqualTo(ExpectedPortRedirection)); + } + + [Test] + public void ConnectionPrinterRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectPrinters, Is.EqualTo(ExpectedPrinterRedirection)); + } + + [Test] + public void ConnectionSmartcardRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectSmartCards, Is.EqualTo(ExpectedSmartcardRedirection)); + } + + [Test] + public void ConnectionauthenticationLevelImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDPAuthenticationLevel, Is.EqualTo(ExpectedAuthLevel)); + } } } \ No newline at end of file diff --git a/mRemoteNGTests/Resources/test_rdcman_v2_2_schema1.rdg b/mRemoteNGTests/Resources/test_rdcman_v2_2_schema1.rdg index b695d13a8..74986a401 100644 --- a/mRemoteNGTests/Resources/test_rdcman_v2_2_schema1.rdg +++ b/mRemoteNGTests/Resources/test_rdcman_v2_2_schema1.rdg @@ -34,18 +34,18 @@ myusername1 mydomain - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/jk3lWsW+ku0n4AOVYyLTAAAAAACAAAAAAAQZgAAAAEAACAAAAC2ydwmIIkk4aAKzKc4Vo6xcHcSUDjwVSXcSTGEhaPUVwAAAAAOgAAAAAIAACAAAACKfrTHU1q7LWhKGfih70PJon3D8CDXHS3Mtj34fSWU9yAAAADf19KsxXuWlJ9Sx+SLe/ou8smSZi2u9MS90P5kGspJlEAAAAAHP5ARrJZnyTQ36URfabE7xPlnmy1qt/+RyqJezQ2G+qg/TecZC7fYRCSjMA9GhgiyLKG4ATVpYFTLJuvZZuRU + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/jk3lWsW+ku0n4AOVYyLTAAAAAACAAAAAAAQZgAAAAEAACAAAABhmrmYHd+c7VjWfPvxJ8pgi55yeV2brJDV/i9XzGUz6wAAAAAOgAAAAAIAACAAAAACJMhtb6tmkJn9vSv9J4VMWgt3S7Ikmf63xK/uKQ+YuyAAAACD3mJOT1910KD71zqbi+m/F6A0LK0tu0BhpOhr9v0yH0AAAADrb+Uv2btNYhfTUDGbw5pT5dbp5oXzc3I8QO7X1vgMXiI5TkrSxfHP/2j+Yak++vAjpVtzlxk49hpDLNAZnnhg - False + True 9933 - David - Leviathan - + gatewayusername + innerdomain + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/jk3lWsW+ku0n4AOVYyLTAAAAAACAAAAAAAQZgAAAAEAACAAAACgU917evQ54VsDf3nkofPOAPj0icRejg3yfyUwZqV3DgAAAAAOgAAAAAIAACAAAACuPdtJTxd2yvFuTpSOeZz1loraPu2WFqUXiJp4cfjbJTAAAAB8L5YX93h6pQoKJozrk+Y+spHWqP+eqBUXRJ45oLreKslslSWCEO7VWg4rgr0FYsNAAAAAU1i5aSTlBy99EkNEd2inrAJAopCfNig6osiEVdvA6eYnCogG5mhzYEK5d5Wt49S8HbEyuLF/8IxV0PKG53vCZQ== True gatewayserverhost.innerdomain.net 4 @@ -56,13 +56,13 @@ 1024 x 768 True False - 16 + 24 - 0 + 2 0 0 - 2 + 1 True True True @@ -70,7 +70,7 @@ True - 2 + 1 1 From 80a4d2af5926babc205020b44924af72efa0ba5b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 12:10:48 -0600 Subject: [PATCH 232/338] Created tests for various bad version/schema scenarios --- ...sktopConnectionManagerDeserializerTests.cs | 26 ++++++++++- .../Properties/Resources.Designer.cs | 45 ++++++++++++++++++- mRemoteNGTests/Properties/Resources.resx | 9 ++++ .../test_rdcman_badVersionNumber.rdg | 6 +++ .../Resources/test_rdcman_noversion.rdg | 5 +++ .../test_rdcman_v2_2_badschemaversion.rdg | 6 +++ mRemoteNGTests/mRemoteNGTests.csproj | 4 ++ 7 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 mRemoteNGTests/Resources/test_rdcman_badVersionNumber.rdg create mode 100644 mRemoteNGTests/Resources/test_rdcman_noversion.rdg create mode 100644 mRemoteNGTests/Resources/test_rdcman_v2_2_badschemaversion.rdg diff --git a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs index 5069a1135..4e8fc2f5f 100644 --- a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs @@ -6,7 +6,7 @@ using mRemoteNG.Container; using mRemoteNG.Tree; using mRemoteNGTests.Properties; using NUnit.Framework; - +using System.IO; namespace mRemoteNGTests.Config.Serializers { @@ -305,5 +305,29 @@ namespace mRemoteNGTests.Config.Serializers var connection = group1.Children.First(); Assert.That(connection.RDPAuthenticationLevel, Is.EqualTo(ExpectedAuthLevel)); } + + [Test] + public void ExceptionThrownOnBadSchemaVersion() + { + var badFileContents = Resources.test_rdcman_v2_2_badschemaversion; + var deserializer = new RemoteDesktopConnectionManagerDeserializer(badFileContents); + Assert.That(() => deserializer.Deserialize(), Throws.TypeOf()); + } + + [Test] + public void ExceptionThrownOnUnsupportedVersion() + { + var badFileContents = Resources.test_rdcman_badVersionNumber; + var deserializer = new RemoteDesktopConnectionManagerDeserializer(badFileContents); + Assert.That(() => deserializer.Deserialize(), Throws.TypeOf()); + } + + [Test] + public void ExceptionThrownOnNoVersion() + { + var badFileContents = Resources.test_rdcman_noversion; + var deserializer = new RemoteDesktopConnectionManagerDeserializer(badFileContents); + Assert.That(() => deserializer.Deserialize(), Throws.TypeOf()); + } } } \ No newline at end of file diff --git a/mRemoteNGTests/Properties/Resources.Designer.cs b/mRemoteNGTests/Properties/Resources.Designer.cs index 5d83327cf..f0aa49cdf 100644 --- a/mRemoteNGTests/Properties/Resources.Designer.cs +++ b/mRemoteNGTests/Properties/Resources.Designer.cs @@ -60,6 +60,47 @@ namespace mRemoteNGTests.Properties { } } + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<RDCMan schemaVersion="1"> + /// <version>99.99</version> + /// <file> + /// </file> + ///</RDCMan>. + /// + internal static string test_rdcman_badVersionNumber { + get { + return ResourceManager.GetString("test_rdcman_badVersionNumber", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<RDCMan schemaVersion="1"> + /// <file> + /// </file> + ///</RDCMan>. + /// + internal static string test_rdcman_noversion { + get { + return ResourceManager.GetString("test_rdcman_noversion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<RDCMan schemaVersion="-99"> + /// <version>2.2</version> + /// <file> + /// </file> + ///</RDCMan>. + /// + internal static string test_rdcman_v2_2_badschemaversion { + get { + return ResourceManager.GetString("test_rdcman_v2_2_badschemaversion", resourceCulture); + } + } + /// /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> ///<RDCMan schemaVersion="1"> @@ -67,13 +108,13 @@ namespace mRemoteNGTests.Properties { /// <file> /// <properties> /// <name>test_rdcman_v2_2_schema1</name> - /// <expanded>False</expanded> + /// <expanded>True</expanded> /// <comment /> /// <logonCredentials inherit="FromParent" /> /// <connectionSettings inherit="FromParent" /> /// <gatewaySettings inherit="FromParent" /> /// <remoteDesktop inherit="FromParent" /> - /// <localResources inherit="FromParent" [rest of string was truncated]";. + /// <localResources inherit="FromParent" [rest of string was truncated]";. /// internal static string test_rdcman_v2_2_schema1 { get { diff --git a/mRemoteNGTests/Properties/Resources.resx b/mRemoteNGTests/Properties/Resources.resx index bf66714b5..78cf04dc5 100644 --- a/mRemoteNGTests/Properties/Resources.resx +++ b/mRemoteNGTests/Properties/Resources.resx @@ -121,6 +121,15 @@ ..\Resources\TestConfCons.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\test_rdcman_badVersionNumber.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\Resources\test_rdcman_noversion.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\Resources\test_rdcman_v2_2_badschemaversion.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + ..\Resources\test_rdcman_v2_2_schema1.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 diff --git a/mRemoteNGTests/Resources/test_rdcman_badVersionNumber.rdg b/mRemoteNGTests/Resources/test_rdcman_badVersionNumber.rdg new file mode 100644 index 000000000..4ba46544b --- /dev/null +++ b/mRemoteNGTests/Resources/test_rdcman_badVersionNumber.rdg @@ -0,0 +1,6 @@ + + + 99.99 + + + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/test_rdcman_noversion.rdg b/mRemoteNGTests/Resources/test_rdcman_noversion.rdg new file mode 100644 index 000000000..b5a0d65eb --- /dev/null +++ b/mRemoteNGTests/Resources/test_rdcman_noversion.rdg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/mRemoteNGTests/Resources/test_rdcman_v2_2_badschemaversion.rdg b/mRemoteNGTests/Resources/test_rdcman_v2_2_badschemaversion.rdg new file mode 100644 index 000000000..185cfc423 --- /dev/null +++ b/mRemoteNGTests/Resources/test_rdcman_v2_2_badschemaversion.rdg @@ -0,0 +1,6 @@ + + + 2.2 + + + \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index b513cf1b6..87c591683 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -90,6 +90,7 @@ ..\packages\DockPanelSuite.ThemeVS2012Light.2.10.0\lib\net40\WeifenLuo.WinFormsUI.Docking.ThemeVS2012Light.dll True + @@ -165,6 +166,9 @@ + + + From 6e713ebd83158c260451490a1323dffcfc80e9a2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 12:16:19 -0600 Subject: [PATCH 233/338] Moved some tests to the right namespace --- .../{Connections => Serializers}/DataTableSerializerTests.cs | 3 +-- .../XmlConnectionsDeserializerTests.cs | 3 +-- mRemoteNGTests/mRemoteNGTests.csproj | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) rename mRemoteNGTests/Config/{Connections => Serializers}/DataTableSerializerTests.cs (98%) rename mRemoteNGTests/Config/{Connections => Serializers}/XmlConnectionsDeserializerTests.cs (98%) diff --git a/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs b/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs similarity index 98% rename from mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs rename to mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs index 0c505b893..a790deaaa 100644 --- a/mRemoteNGTests/Config/Connections/DataTableSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs @@ -6,8 +6,7 @@ using mRemoteNG.Tree; using mRemoteNG.Tree.Root; using NUnit.Framework; - -namespace mRemoteNGTests.Config.Connections +namespace mRemoteNGTests.Config.Serializers { public class DataTableSerializerTests { diff --git a/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/XmlConnectionsDeserializerTests.cs similarity index 98% rename from mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs rename to mRemoteNGTests/Config/Serializers/XmlConnectionsDeserializerTests.cs index 764d78cc2..68e29239f 100644 --- a/mRemoteNGTests/Config/Connections/XmlConnectionsDeserializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/XmlConnectionsDeserializerTests.cs @@ -7,8 +7,7 @@ using mRemoteNG.Tree; using mRemoteNGTests.Properties; using NUnit.Framework; - -namespace mRemoteNGTests.Config.Connections +namespace mRemoteNGTests.Config.Serializers { public class XmlConnectionsDeserializerTests { diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 87c591683..365f17569 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -107,8 +107,8 @@ - - + + From 636848ed265a28f7bc106a4c0d74959918b59602 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 12:27:58 -0600 Subject: [PATCH 234/338] Split the ScanHost class to its own file. --- mRemoteV1/Tools/ScanHost.cs | 131 ++++++++++++++++++++++++++ mRemoteV1/Tools/Tools.PortScan.cs | 148 +----------------------------- mRemoteV1/mRemoteV1.csproj | 1 + 3 files changed, 133 insertions(+), 147 deletions(-) create mode 100644 mRemoteV1/Tools/ScanHost.cs diff --git a/mRemoteV1/Tools/ScanHost.cs b/mRemoteV1/Tools/ScanHost.cs new file mode 100644 index 000000000..0947255c3 --- /dev/null +++ b/mRemoteV1/Tools/ScanHost.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections; +using System.Windows.Forms; +using mRemoteNG.App; +using mRemoteNG.Connection.Protocol.Http; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Connection.Protocol.Rlogin; +using mRemoteNG.Connection.Protocol.SSH; +using mRemoteNG.Connection.Protocol.Telnet; +using mRemoteNG.Connection.Protocol.VNC; +using mRemoteNG.Messages; + + +namespace mRemoteNG.Tools +{ + public class ScanHost + { + #region Properties + public static int SSHPort { get; set; } = (int)ProtocolSSH1.Defaults.Port; + public static int TelnetPort { get; set; } = (int)ProtocolTelnet.Defaults.Port; + public static int HTTPPort { get; set; } = (int)ProtocolHTTP.Defaults.Port; + public static int HTTPSPort { get; set; } = (int)ProtocolHTTPS.Defaults.Port; + public static int RloginPort { get; set; } = (int)ProtocolRlogin.Defaults.Port; + public static int RDPPort { get; set; } = (int)ProtocolRDP.Defaults.Port; + public static int VNCPort { get; set; } = (int)ProtocolVNC.Defaults.Port; + public ArrayList OpenPorts { get; set; } + public ArrayList ClosedPorts { get; set; } + public bool RDP { get; set; } + public bool VNC { get; set; } + public bool SSH { get; set; } + public bool Telnet { get; set; } + public bool Rlogin { get; set; } + public bool HTTP { get; set; } + public bool HTTPS { get; set; } + public string HostIp { get; set; } + public string HostName { get; set; } = ""; + public string HostNameWithoutDomain + { + get + { + if (string.IsNullOrEmpty(HostName) || HostName == HostIp) + { + return HostIp; + } + return HostName.Split('.')[0]; + } + } + #endregion + + #region Methods + public ScanHost(string host) + { + HostIp = host; + OpenPorts = new ArrayList(); + ClosedPorts = new ArrayList(); + } + + public override string ToString() + { + try + { + return "SSH: " + Convert.ToString(SSH) + " Telnet: " + Convert.ToString(Telnet) + " HTTP: " + Convert.ToString(HTTP) + " HTTPS: " + Convert.ToString(HTTPS) + " Rlogin: " + Convert.ToString(Rlogin) + " RDP: " + Convert.ToString(RDP) + " VNC: " + Convert.ToString(VNC); + } + catch (Exception) + { + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "ToString failed (Tools.PortScan)", true); + return ""; + } + } + + public ListViewItem ToListViewItem() + { + try + { + var listViewItem = new ListViewItem + { + Tag = this, + Text = !string.IsNullOrEmpty(HostName) ? HostName : HostIp + }; + + listViewItem.SubItems.Add(BoolToYesNo(SSH)); + listViewItem.SubItems.Add(BoolToYesNo(Telnet)); + listViewItem.SubItems.Add(BoolToYesNo(HTTP)); + listViewItem.SubItems.Add(BoolToYesNo(HTTPS)); + listViewItem.SubItems.Add(BoolToYesNo(Rlogin)); + listViewItem.SubItems.Add(BoolToYesNo(RDP)); + listViewItem.SubItems.Add(BoolToYesNo(VNC)); + + var strOpen = ""; + var strClosed = ""; + + foreach (int p in OpenPorts) + { + strOpen += p + ", "; + } + + foreach (int p in ClosedPorts) + { + strClosed += p + ", "; + } + + listViewItem.SubItems.Add(strOpen.Substring(0, strOpen.Length > 0 ? strOpen.Length - 2 : strOpen.Length)); + listViewItem.SubItems.Add(strClosed.Substring(0, strClosed.Length > 0 ? strClosed.Length - 2 : strClosed.Length)); + + return listViewItem; + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionStackTrace("Tools.PortScan.ToListViewItem() failed.", ex); + return null; + } + } + + private static string BoolToYesNo(bool value) + { + return value ? Language.strYes : Language.strNo; + } + + public void SetAllProtocols(bool value) + { + VNC = value; + Telnet = value; + SSH = value; + Rlogin = value; + RDP = value; + HTTPS = value; + HTTP = value; + } + #endregion + } +} \ No newline at end of file diff --git a/mRemoteV1/Tools/Tools.PortScan.cs b/mRemoteV1/Tools/Tools.PortScan.cs index 715cddbb4..c7d35e1b9 100644 --- a/mRemoteV1/Tools/Tools.PortScan.cs +++ b/mRemoteV1/Tools/Tools.PortScan.cs @@ -1,161 +1,15 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Net; using System.Net.NetworkInformation; using System.Threading; -using System.Windows.Forms; using mRemoteNG.App; -using mRemoteNG.Connection.Protocol.Http; -using mRemoteNG.Connection.Protocol.RDP; -using mRemoteNG.Connection.Protocol.Rlogin; -using mRemoteNG.Connection.Protocol.SSH; -using mRemoteNG.Connection.Protocol.Telnet; -using mRemoteNG.Connection.Protocol.VNC; using mRemoteNG.Messages; + namespace mRemoteNG.Tools { - public class ScanHost - { - #region Private Variables - - #endregion - - #region Properties - public static int SSHPort { get; set; } = (int)ProtocolSSH1.Defaults.Port; - - public static int TelnetPort { get; set; } = (int)ProtocolTelnet.Defaults.Port; - - public static int HTTPPort { get; set; } = (int)ProtocolHTTP.Defaults.Port; - - public static int HTTPSPort { get; set; } = (int)ProtocolHTTPS.Defaults.Port; - - public static int RloginPort { get; set; } = (int)ProtocolRlogin.Defaults.Port; - - public static int RDPPort { get; set; } = (int)ProtocolRDP.Defaults.Port; - - public static int VNCPort { get; set; } = (int)ProtocolVNC.Defaults.Port; - - public string HostName { get; set; } = ""; - - public string HostNameWithoutDomain - { - get - { - if (string.IsNullOrEmpty(HostName) || HostName == HostIp) - { - return HostIp; - } - return HostName.Split('.')[0]; - } - } - - public string HostIp { get; set; } - - public ArrayList OpenPorts { get; set; } - - public ArrayList ClosedPorts { get; set; } - - public bool RDP { get; set; } - - public bool VNC { get; set; } - - public bool SSH { get; set; } - - public bool Telnet { get; set; } - - public bool Rlogin { get; set; } - - public bool HTTP { get; set; } - - public bool HTTPS { get; set; } - - #endregion - - #region Methods - public ScanHost(string host) - { - HostIp = host; - OpenPorts = new ArrayList(); - ClosedPorts = new ArrayList(); - } - - public override string ToString() - { - try - { - return "SSH: " + Convert.ToString(SSH) + " Telnet: " + Convert.ToString(Telnet) + " HTTP: " + Convert.ToString(HTTP) + " HTTPS: " + Convert.ToString(HTTPS) + " Rlogin: " + Convert.ToString(Rlogin) + " RDP: " + Convert.ToString(RDP) + " VNC: " + Convert.ToString(VNC); - } - catch (Exception) - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "ToString failed (Tools.PortScan)", true); - return ""; - } - } - - public ListViewItem ToListViewItem() - { - try - { - ListViewItem listViewItem = new ListViewItem - { - Tag = this, - Text = !string.IsNullOrEmpty(HostName) ? HostName : HostIp - }; - - listViewItem.SubItems.Add(BoolToYesNo(SSH)); - listViewItem.SubItems.Add(BoolToYesNo(Telnet)); - listViewItem.SubItems.Add(BoolToYesNo(HTTP)); - listViewItem.SubItems.Add(BoolToYesNo(HTTPS)); - listViewItem.SubItems.Add(BoolToYesNo(Rlogin)); - listViewItem.SubItems.Add(BoolToYesNo(RDP)); - listViewItem.SubItems.Add(BoolToYesNo(VNC)); - - string strOpen = ""; - string strClosed = ""; - - foreach (int p in OpenPorts) - { - strOpen += p + ", "; - } - - foreach (int p in ClosedPorts) - { - strClosed += p + ", "; - } - - listViewItem.SubItems.Add(strOpen.Substring(0, strOpen.Length > 0 ? strOpen.Length - 2 : strOpen.Length)); - listViewItem.SubItems.Add(strClosed.Substring(0, strClosed.Length > 0 ? strClosed.Length - 2 : strClosed.Length)); - - return listViewItem; - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("Tools.PortScan.ToListViewItem() failed.", ex); - return null; - } - } - - private static string BoolToYesNo(bool value) - { - return value ? Language.strYes : Language.strNo; - } - - public void SetAllProtocols(bool value) - { - VNC = value; - Telnet = value; - SSH = value; - Rlogin = value; - RDP = value; - HTTPS = value; - HTTP = value; - } - #endregion - } - public class Scanner { #region Private Members diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 0e45ec38a..24b872906 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -200,6 +200,7 @@ + From b1fd47ff9da141d9f122a127a98ac64bf050f6dc Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 12:29:30 -0600 Subject: [PATCH 235/338] Renamed the Scanner class to PortScanner --- .../Serializers/PortScanDeserializerTests.cs | 33 +++++++++++++++++++ mRemoteNGTests/mRemoteNGTests.csproj | 1 + .../Protocol/ICA/Connection.Protocol.ICA.cs | 2 +- .../Protocol/RDP/Connection.Protocol.RDP.cs | 2 +- mRemoteV1/Tools/Tools.PortScan.cs | 4 +-- mRemoteV1/UI/Window/PortScanWindow.cs | 4 +-- 6 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 mRemoteNGTests/Config/Serializers/PortScanDeserializerTests.cs diff --git a/mRemoteNGTests/Config/Serializers/PortScanDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/PortScanDeserializerTests.cs new file mode 100644 index 000000000..4138e01b5 --- /dev/null +++ b/mRemoteNGTests/Config/Serializers/PortScanDeserializerTests.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using mRemoteNG.Config.Serializers; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Tools; +using NUnit.Framework; + + +namespace mRemoteNGTests.Config.Serializers +{ + public class PortScanDeserializerTests + { + private PortScanDeserializer _deserializer; + + [OneTimeSetUp] + public void OnetimeSetup() + { + var host = new ScanHost("10.20.30.40"); + _deserializer = new PortScanDeserializer(new [] {host}, ProtocolType.SSH2); + } + + [OneTimeTearDown] + public void OnetimeTeardown() + { + _deserializer = null; + } + + [Test] + public void test() + { + + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 365f17569..f75d44aeb 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -108,6 +108,7 @@ + diff --git a/mRemoteV1/Connection/Protocol/ICA/Connection.Protocol.ICA.cs b/mRemoteV1/Connection/Protocol/ICA/Connection.Protocol.ICA.cs index db93ef906..c9c09fc16 100644 --- a/mRemoteV1/Connection/Protocol/ICA/Connection.Protocol.ICA.cs +++ b/mRemoteV1/Connection/Protocol/ICA/Connection.Protocol.ICA.cs @@ -343,7 +343,7 @@ namespace mRemoteNG.Connection.Protocol.ICA #region Reconnect Stuff public void tmrReconnect_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { - bool srvReady = Scanner.IsPortOpen(_Info.Hostname, Convert.ToString(_Info.Port)); + bool srvReady = PortScanner.IsPortOpen(_Info.Hostname, Convert.ToString(_Info.Port)); ReconnectGroup.ServerReady = srvReady; diff --git a/mRemoteV1/Connection/Protocol/RDP/Connection.Protocol.RDP.cs b/mRemoteV1/Connection/Protocol/RDP/Connection.Protocol.RDP.cs index 377c1a05e..7f639ddb0 100644 --- a/mRemoteV1/Connection/Protocol/RDP/Connection.Protocol.RDP.cs +++ b/mRemoteV1/Connection/Protocol/RDP/Connection.Protocol.RDP.cs @@ -886,7 +886,7 @@ namespace mRemoteNG.Connection.Protocol.RDP #region Reconnect Stuff public void tmrReconnect_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { - bool srvReady = Scanner.IsPortOpen(_connectionInfo.Hostname, Convert.ToString(_connectionInfo.Port)); + bool srvReady = PortScanner.IsPortOpen(_connectionInfo.Hostname, Convert.ToString(_connectionInfo.Port)); ReconnectGroup.ServerReady = srvReady; diff --git a/mRemoteV1/Tools/Tools.PortScan.cs b/mRemoteV1/Tools/Tools.PortScan.cs index c7d35e1b9..90688a524 100644 --- a/mRemoteV1/Tools/Tools.PortScan.cs +++ b/mRemoteV1/Tools/Tools.PortScan.cs @@ -10,7 +10,7 @@ using mRemoteNG.Messages; namespace mRemoteNG.Tools { - public class Scanner + public class PortScanner { #region Private Members private List _ipAddresses = new List(); @@ -21,7 +21,7 @@ namespace mRemoteNG.Tools #region Public Methods - public Scanner(IPAddress ipAddress1, IPAddress ipAddress2, int port1, int port2) + public PortScanner(IPAddress ipAddress1, IPAddress ipAddress2, int port1, int port2) { IPAddress ipAddressStart = IpAddressMin(ipAddress1, ipAddress2); IPAddress ipAddressEnd = IpAddressMax(ipAddress1, ipAddress2); diff --git a/mRemoteV1/UI/Window/PortScanWindow.cs b/mRemoteV1/UI/Window/PortScanWindow.cs index 9bd784b4d..3ae2a7dd1 100644 --- a/mRemoteV1/UI/Window/PortScanWindow.cs +++ b/mRemoteV1/UI/Window/PortScanWindow.cs @@ -69,7 +69,7 @@ namespace mRemoteNG.UI.Window #endregion #region Private Fields - private Scanner _portScanner; + private PortScanner _portScanner; private bool _scanning; #endregion @@ -171,7 +171,7 @@ namespace mRemoteNG.UI.Window System.Net.IPAddress ipAddressStart = System.Net.IPAddress.Parse(ipStart.Text); System.Net.IPAddress ipAddressEnd = System.Net.IPAddress.Parse(ipEnd.Text); - _portScanner = new Scanner(ipAddressStart, ipAddressEnd, (int) portStart.Value, (int) portEnd.Value); + _portScanner = new PortScanner(ipAddressStart, ipAddressEnd, (int) portStart.Value, (int) portEnd.Value); _portScanner.BeginHostScan += PortScanner_BeginHostScan; _portScanner.HostScanned += PortScanner_HostScanned; From c4c255d560cba0a885b063f705b187da748ed719 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 13:28:01 -0600 Subject: [PATCH 236/338] Created tests for PortScanDeserializer --- .../Serializers/PortScanDeserializerTests.cs | 36 ++++++++++++++++--- .../Serializers/PortScanDeserializer.cs | 1 - 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/mRemoteNGTests/Config/Serializers/PortScanDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/PortScanDeserializerTests.cs index 4138e01b5..e7025d653 100644 --- a/mRemoteNGTests/Config/Serializers/PortScanDeserializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/PortScanDeserializerTests.cs @@ -1,5 +1,6 @@ -using System.Collections.Generic; +using System.Linq; using mRemoteNG.Config.Serializers; +using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Tools; using NUnit.Framework; @@ -10,24 +11,51 @@ namespace mRemoteNGTests.Config.Serializers public class PortScanDeserializerTests { private PortScanDeserializer _deserializer; + private ConnectionInfo _importedConnectionInfo; + private const string ExpectedHostName = "server1.domain.com"; + private const string ExpectedDisplayName = "server1"; + private const ProtocolType ExpectedProtocolType = ProtocolType.SSH2; + + [OneTimeSetUp] public void OnetimeSetup() { - var host = new ScanHost("10.20.30.40"); + var host = new ScanHost("10.20.30.40") + { + HostName = "server1.domain.com", + SSH = true + }; _deserializer = new PortScanDeserializer(new [] {host}, ProtocolType.SSH2); + _deserializer.Deserialize(); + var connectionTreeModel = _deserializer.Deserialize(); + var root = connectionTreeModel.RootNodes.First(); + _importedConnectionInfo = root.Children.First(); } [OneTimeTearDown] public void OnetimeTeardown() { _deserializer = null; + _importedConnectionInfo = null; } [Test] - public void test() + public void DisplayNameImported() { - + Assert.That(_importedConnectionInfo.Name, Is.EqualTo(ExpectedDisplayName)); + } + + [Test] + public void HostNameImported() + { + Assert.That(_importedConnectionInfo.Hostname, Is.EqualTo(ExpectedHostName)); + } + + [Test] + public void ProtocolImported() + { + Assert.That(_importedConnectionInfo.Protocol, Is.EqualTo(ExpectedProtocolType)); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/PortScanDeserializer.cs b/mRemoteV1/Config/Serializers/PortScanDeserializer.cs index 6ebdd87e0..f88ae583d 100644 --- a/mRemoteV1/Config/Serializers/PortScanDeserializer.cs +++ b/mRemoteV1/Config/Serializers/PortScanDeserializer.cs @@ -83,7 +83,6 @@ namespace mRemoteNG.Config.Serializers newConnectionInfo.SetDefaultPort(); parentContainer.AddChild(newConnectionInfo); - Runtime.ConnectionList.Add(newConnectionInfo); } } } \ No newline at end of file From ddfbb1d42e3f313a705430971322bcf8cbbcefaa Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 14:01:43 -0600 Subject: [PATCH 237/338] Created tests for PuttyConnectionManagerDeserializer --- ...PuttyConnectionManagerDeserializerTests.cs | 112 ++++++++++++++++++ .../Properties/Resources.Designer.cs | 16 +++ mRemoteNGTests/Properties/Resources.resx | 3 + .../test_puttyConnectionManager_database.dat | Bin 0 -> 3844 bytes ...puttyConnectionManager_database_backup.dat | Bin 0 -> 3742 bytes mRemoteNGTests/mRemoteNGTests.csproj | 2 + .../PuttyConnectionManagerDeserializer.cs | 6 +- 7 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 mRemoteNGTests/Config/Serializers/PuttyConnectionManagerDeserializerTests.cs create mode 100644 mRemoteNGTests/Resources/test_puttyConnectionManager_database.dat create mode 100644 mRemoteNGTests/Resources/test_puttyConnectionManager_database_backup.dat diff --git a/mRemoteNGTests/Config/Serializers/PuttyConnectionManagerDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/PuttyConnectionManagerDeserializerTests.cs new file mode 100644 index 000000000..f8d5fbe30 --- /dev/null +++ b/mRemoteNGTests/Config/Serializers/PuttyConnectionManagerDeserializerTests.cs @@ -0,0 +1,112 @@ +using System.Linq; +using mRemoteNG.Config.Serializers; +using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Container; +using mRemoteNGTests.Properties; +using NUnit.Framework; + + +namespace mRemoteNGTests.Config.Serializers +{ + public class PuttyConnectionManagerDeserializerTests + { + private PuttyConnectionManagerDeserializer _deserializer; + private ContainerInfo _rootImportedFolder; + private const string ExpectedRootFolderName = "test_puttyConnectionManager_database"; + private const string ExpectedConnectionDisplayName = "my ssh connection"; + private const string ExpectedConnectionHostname = "server1.mydomain.com"; + private const string ExpectedConnectionDescription = "My Description Here"; + private const int ExpectedConnectionPort = 22; + private const ProtocolType ExpectedProtocolType = ProtocolType.SSH2; + private const string ExpectedPuttySession = "MyCustomPuttySession"; + private const string ExpectedConnectionUsername = "mysshusername"; + private const string ExpectedConnectionPassword = "password123"; + + + [OneTimeSetUp] + public void OnetimeSetup() + { + var fileContents = Resources.test_puttyConnectionManager_database; + _deserializer = new PuttyConnectionManagerDeserializer(fileContents); + var connectionTreeModel = _deserializer.Deserialize(); + var rootNode = connectionTreeModel.RootNodes.First(); + _rootImportedFolder = rootNode.Children.Cast().First(); + } + + [OneTimeTearDown] + public void OnetimeTeardown() + { + _deserializer = null; + _rootImportedFolder = null; + } + + [Test] + public void RootFolderImportedWithCorrectName() + { + Assert.That(_rootImportedFolder.Name, Is.EqualTo(ExpectedRootFolderName)); + } + + [Test] + public void ConnectionDisplayNameImported() + { + var connection = GetSshConnection(); + Assert.That(connection.Name, Is.EqualTo(ExpectedConnectionDisplayName)); + } + + [Test] + public void ConnectionHostNameImported() + { + var connection = GetSshConnection(); + Assert.That(connection.Hostname, Is.EqualTo(ExpectedConnectionHostname)); + } + + [Test] + public void ConnectionDescriptionImported() + { + var connection = GetSshConnection(); + Assert.That(connection.Description, Is.EqualTo(ExpectedConnectionDescription)); + } + + [Test] + public void ConnectionPortImported() + { + var connection = GetSshConnection(); + Assert.That(connection.Port, Is.EqualTo(ExpectedConnectionPort)); + } + + [Test] + public void ConnectionProtocolTypeImported() + { + var connection = GetSshConnection(); + Assert.That(connection.Protocol, Is.EqualTo(ExpectedProtocolType)); + } + + [Test] + public void ConnectionPuttySessionImported() + { + var connection = GetSshConnection(); + Assert.That(connection.PuttySession, Is.EqualTo(ExpectedPuttySession)); + } + + [Test] + public void ConnectionUsernameImported() + { + var connection = GetSshConnection(); + Assert.That(connection.Username, Is.EqualTo(ExpectedConnectionUsername)); + } + + [Test] + public void ConnectionPasswordImported() + { + var connection = GetSshConnection(); + Assert.That(connection.Password, Is.EqualTo(ExpectedConnectionPassword)); + } + + private ConnectionInfo GetSshConnection() + { + var sshFolder = _rootImportedFolder.Children.OfType().First(node => node.Name == "SSHFolder"); + return sshFolder.Children.First(); + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/Properties/Resources.Designer.cs b/mRemoteNGTests/Properties/Resources.Designer.cs index f0aa49cdf..2048ae029 100644 --- a/mRemoteNGTests/Properties/Resources.Designer.cs +++ b/mRemoteNGTests/Properties/Resources.Designer.cs @@ -60,6 +60,22 @@ namespace mRemoteNGTests.Properties { } } + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-16"?> + ///<!-- ****************************************************************--> + ///<!-- * *--> + ///<!-- * PuTTY Configuration Manager save file - All right reserved. *--> + ///<!-- * *--> + ///<!-- ****************************************************************--> + ///<!-- The following lines can be modified at your own risks. --> + ///<configuration version="0.7.1.136" [rest of string was truncated]";. + /// + internal static string test_puttyConnectionManager_database { + get { + return ResourceManager.GetString("test_puttyConnectionManager_database", resourceCulture); + } + } + /// /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> ///<RDCMan schemaVersion="1"> diff --git a/mRemoteNGTests/Properties/Resources.resx b/mRemoteNGTests/Properties/Resources.resx index 78cf04dc5..91106699f 100644 --- a/mRemoteNGTests/Properties/Resources.resx +++ b/mRemoteNGTests/Properties/Resources.resx @@ -121,6 +121,9 @@ ..\Resources\TestConfCons.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\test_puttyConnectionManager_database.dat;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-16 + ..\Resources\test_rdcman_badVersionNumber.rdg;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 diff --git a/mRemoteNGTests/Resources/test_puttyConnectionManager_database.dat b/mRemoteNGTests/Resources/test_puttyConnectionManager_database.dat new file mode 100644 index 0000000000000000000000000000000000000000..552acdde5a52b792d8a9fdccb9a995523cbed178 GIT binary patch literal 3844 zcmc&%O^?$s5S=p;|H15WrTu8jvX_t*0^JfbLC9Y@0EP#mBKf==<_%04r#C%Bb zZi9&&kjfzio#5`8^KCougwB zZ;ny27sG1tT9$UOw`!1G7r9lAk%|`Tp$z4tJYv0Toy%IBGQW$#U#X9xuKy-;8JMC@ zB{Ge9M9uw3u0C$fCPC}5^1xNwKID2-&&glyQYd(A{zPsZd+q^M9QQkcX3U)(ZmwdD z`7OWnZ;!>}tl-UDO7U5BvqJNlSZ5f`4r*WPOc}EF2JBT{@yJ`)6dJiNef6r}#Jz}u z`q&Ik(W9B$d&NjB)YfMF(6c0}rf+-}a+c}JnD&ovTbGvKakK8}eesH4w>l5wo zI_#^gtXCW6B|$aR-K^}aiaH0mE3gxC=c~>(ehs=7A=Rp`VRsUrXQFt-3~TL1jLW@) z`&8R59-IHO>h3Mt=w}|(}wHJvEKhVX^qg~ b*6^Og|FrX#UkyZBolq^l8hhv;RVse~p{)-6 literal 0 HcmV?d00001 diff --git a/mRemoteNGTests/Resources/test_puttyConnectionManager_database_backup.dat b/mRemoteNGTests/Resources/test_puttyConnectionManager_database_backup.dat new file mode 100644 index 0000000000000000000000000000000000000000..a5496285e4f72a99f6e77a6df04c49639ad27e00 GIT binary patch literal 3742 zcmc&%O>fgc5S=p;|6%E|Qa_SXdNHmLsN#Zz)Lb}4A)gho6WIx+e;#;mHfDF7T}R;( zSxy}9%|Iu%Q4 zOsB1=SUnA7p`6d485v*6GZ<%w82sWDIXCDX>SpA-S{J)cqGnXWV3i8J;64>M8i)4O zua+M;ty(??_G78K@7KwGFJB|V9ZvRiPj0klUHzrP3qbdt1 z=Bwa$W~Otw1RFk&L(P`C*=gf@G}qZbg>vZh0$%K1tX5W57%`J8&z_UMiQ|7~P=*z< z!O18~>~C45|NdG!&H~=7m>i$Y%&N3{iFJb2VyEe)?o^;QufSB}m5#iIO{J0h(pN8c zC+$TPlA!mhV#_Db+h(U}l9a+6KSm3l+1BH*# z$fxM4L1mNIsWOm?5JSq0Vij_z<}&27!enG0c4gzN4&~jRT8Hgfn}u?ewqc%-;(+oyMP$lE@5a=Y6hZIh1M<~kkykY#$0u=>+G zblb(^lh<~Ex!Ofq#vnyN; za*lI$@mckN>!r@iunT>gm~OVyILG DVT$@U literal 0 HcmV?d00001 diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index f75d44aeb..d1910f750 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -109,6 +109,7 @@ + @@ -167,6 +168,7 @@ + diff --git a/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs index 159f3f275..955696f98 100644 --- a/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs @@ -62,8 +62,6 @@ namespace mRemoteNG.Config.Serializers throw (new FileFormatException($"Unrecognized child node ({childNode.Name}).")); } } - - Runtime.ContainerList.Add(newContainer); } private void VerifyNodeType(XmlNode xmlNode) @@ -108,8 +106,6 @@ namespace mRemoteNG.Config.Serializers var connectionInfo = ConnectionInfoFromXml(connectionNode); parentContainer.AddChild(connectionInfo); - - Runtime.ConnectionList.Add(connectionInfo); } private ConnectionInfo ConnectionInfoFromXml(XmlNode xmlNode) @@ -129,7 +125,7 @@ namespace mRemoteNG.Config.Serializers connectionInfo.Protocol = ProtocolType.SSH2; break; default: - throw (new FileFormatException($"Unrecognized protocol ({protocol}).")); + throw new FileFormatException($"Unrecognized protocol ({protocol})."); } connectionInfo.Hostname = connectionInfoNode.SelectSingleNode("./host")?.InnerText; From b8e05fc7dabba8150a735c6f9d9f6d4458197412 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 14:27:27 -0600 Subject: [PATCH 238/338] Refactored the DecryptPassword function in RemoteDesktopConnectionManagerDeserializer to use managed rather than native functions --- ...oteDesktopConnectionManagerDeserializer.cs | 71 +++---------------- mRemoteV1/mRemoteV1.csproj | 1 + 2 files changed, 10 insertions(+), 62 deletions(-) diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index a07bf3c29..ebf0354ee 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Runtime.InteropServices; using System.Xml; using mRemoteNG.App; using mRemoteNG.Connection; @@ -9,6 +8,9 @@ using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Container; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; +using System.Security.Cryptography; +using System.Text; + namespace mRemoteNG.Config.Serializers { @@ -123,7 +125,7 @@ namespace mRemoteNG.Config.Serializers connectionInfo.Username = logonCredentialsNode.SelectSingleNode("userName")?.InnerText; var passwordNode = logonCredentialsNode.SelectSingleNode("./password"); - connectionInfo.Password = passwordNode?.Attributes?["storeAsClearText"].Value == "True" ? passwordNode.InnerText : DecryptPassword(passwordNode?.InnerText); + connectionInfo.Password = passwordNode?.Attributes?["storeAsClearText"].Value == "True" ? passwordNode.InnerText : DecryptRdcManPassword(passwordNode?.InnerText); connectionInfo.Domain = logonCredentialsNode.SelectSingleNode("./domain")?.InnerText; } @@ -156,7 +158,7 @@ namespace mRemoteNG.Config.Serializers connectionInfo.RDGatewayUsername = gatewaySettingsNode.SelectSingleNode("./userName")?.InnerText; var passwordNode = gatewaySettingsNode.SelectSingleNode("./password"); - connectionInfo.RDGatewayPassword = passwordNode?.Attributes?["storeAsClearText"].Value == "True" ? passwordNode.InnerText : DecryptPassword(passwordNode?.InnerText); + connectionInfo.RDGatewayPassword = passwordNode?.Attributes?["storeAsClearText"].Value == "True" ? passwordNode.InnerText : DecryptRdcManPassword(passwordNode?.InnerText); connectionInfo.RDGatewayDomain = gatewaySettingsNode.SelectSingleNode("./domain")?.InnerText; // ./logonMethod @@ -281,77 +283,22 @@ namespace mRemoteNG.Config.Serializers return connectionInfo; } - private string DecryptPassword(string ciphertext) + private string DecryptRdcManPassword(string ciphertext) { if (string.IsNullOrEmpty(ciphertext)) - { return null; - } - var gcHandle = new GCHandle(); - var plaintextData = new NativeMethods.DATA_BLOB(); try { - var ciphertextArray = Convert.FromBase64String(ciphertext); - gcHandle = GCHandle.Alloc(ciphertextArray, GCHandleType.Pinned); - - var ciphertextData = new NativeMethods.DATA_BLOB - { - cbData = ciphertextArray.Length, - pbData = gcHandle.AddrOfPinnedObject() - }; - - var tempOptionalEntropy = new NativeMethods.DATA_BLOB(); - var tempPromptStruct = IntPtr.Zero; - if (!NativeMethods.CryptUnprotectData(ref ciphertextData, null, ref tempOptionalEntropy, IntPtr.Zero, ref tempPromptStruct, 0, ref plaintextData)) - { - return null; - } - - var plaintextLength = (int)((double)plaintextData.cbData / 2); // Char = 2 bytes - var plaintextArray = new char[plaintextLength - 1 + 1]; - Marshal.Copy(plaintextData.pbData, plaintextArray, 0, plaintextLength); - - return new string(plaintextArray); + var plaintextData = ProtectedData.Unprotect(Convert.FromBase64String(ciphertext), new byte[] { }, DataProtectionScope.LocalMachine); + var charArray = Encoding.Unicode.GetChars(plaintextData); + return new string(charArray); } catch (Exception ex) { Runtime.MessageCollector.AddExceptionMessage("RemoteDesktopConnectionManager.DecryptPassword() failed.", ex, logOnly: true); return null; } - finally - { - if (gcHandle.IsAllocated) - { - gcHandle.Free(); - } - if (!(plaintextData.pbData == IntPtr.Zero)) - { - NativeMethods.LocalFree(plaintextData.pbData); - } - } - } - - // ReSharper disable once ClassNeverInstantiated.Local - private class NativeMethods - { - // ReSharper disable InconsistentNaming - // ReSharper disable IdentifierTypo - // ReSharper disable StringLiteralTypo - [DllImport("crypt32.dll", CharSet = CharSet.Unicode)] - public static extern bool CryptUnprotectData(ref DATA_BLOB dataIn, string description, ref DATA_BLOB optionalEntropy, IntPtr reserved, ref IntPtr promptStruct, int flags, ref DATA_BLOB dataOut); - - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - public static extern void LocalFree(IntPtr ptr); - - public struct DATA_BLOB - { - public int cbData; - public IntPtr pbData; - } - // ReSharper restore StringLiteralTypo - // ReSharper restore IdentifierTypo - // ReSharper restore InconsistentNaming } } } \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 24b872906..35e767d6f 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -85,6 +85,7 @@ + From cf3443ace33e4a184ad737c97be720e5b796d90c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 14:32:01 -0600 Subject: [PATCH 239/338] Disabled password import tests for the RemoteDesktopConnectionManagerDeserializer. Since the passwords are encrypted using a machine key, decryption on other machines will always fail. --- ...sktopConnectionManagerDeserializerTests.cs | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs index 4e8fc2f5f..dd483ffbb 100644 --- a/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/RemoteDesktopConnectionManagerDeserializerTests.cs @@ -126,15 +126,16 @@ namespace mRemoteNGTests.Config.Serializers Assert.That(connection.Domain, Is.EqualTo(ExpectedDomain)); } - [Test] - public void ConnectionPasswordImported() - { - var rootNode = _connectionTreeModel.RootNodes.First(); - var importedRdcmanRootNode = rootNode.Children.OfType().First(); - var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); - var connection = group1.Children.First(); - Assert.That(connection.Password, Is.EqualTo(ExpectedPassword)); - } + // Since password is encrypted with a machine key, cant test decryption on another machine + //[Test] + //public void ConnectionPasswordImported() + //{ + // var rootNode = _connectionTreeModel.RootNodes.First(); + // var importedRdcmanRootNode = rootNode.Children.OfType().First(); + // var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + // var connection = group1.Children.First(); + // Assert.That(connection.Password, Is.EqualTo(ExpectedPassword)); + //} [Test] public void ConnectionProtocolSetToRdp() @@ -196,15 +197,16 @@ namespace mRemoteNGTests.Config.Serializers Assert.That(connection.RDGatewayUsername, Is.EqualTo(ExpectedGatewayUsername)); } - [Test] - public void ConnectionGatewayPasswordImported() - { - var rootNode = _connectionTreeModel.RootNodes.First(); - var importedRdcmanRootNode = rootNode.Children.OfType().First(); - var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); - var connection = group1.Children.First(); - Assert.That(connection.RDGatewayPassword, Is.EqualTo(ExpectedGatewayPassword)); - } + // Since password is encrypted with a machine key, cant test decryption on another machine + //[Test] + //public void ConnectionGatewayPasswordImported() + //{ + // var rootNode = _connectionTreeModel.RootNodes.First(); + // var importedRdcmanRootNode = rootNode.Children.OfType().First(); + // var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + // var connection = group1.Children.First(); + // Assert.That(connection.RDGatewayPassword, Is.EqualTo(ExpectedGatewayPassword)); + //} [Test] public void ConnectionGatewayDomainImported() From bda536cc62c7f473211fa24a2a446f7b57e02d83 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 14:35:18 -0600 Subject: [PATCH 240/338] Call to the message collector is causing tests to fail. Will need a test-safe way of indicating failure --- .../Serializers/RemoteDesktopConnectionManagerDeserializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index ebf0354ee..bdae05735 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -296,7 +296,7 @@ namespace mRemoteNG.Config.Serializers } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionMessage("RemoteDesktopConnectionManager.DecryptPassword() failed.", ex, logOnly: true); + //Runtime.MessageCollector.AddExceptionMessage("RemoteDesktopConnectionManager.DecryptPassword() failed.", ex, logOnly: true); return null; } } From d35540e691f716a8217b16803e8d3f1033db4fd6 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sun, 25 Sep 2016 14:42:03 -0600 Subject: [PATCH 241/338] Code cleanup --- mRemoteV1/Config/Serializers/PortScanDeserializer.cs | 1 - .../Config/Serializers/PuttyConnectionManagerDeserializer.cs | 1 - .../Serializers/RemoteDesktopConnectionManagerDeserializer.cs | 1 - 3 files changed, 3 deletions(-) diff --git a/mRemoteV1/Config/Serializers/PortScanDeserializer.cs b/mRemoteV1/Config/Serializers/PortScanDeserializer.cs index f88ae583d..86cd89aae 100644 --- a/mRemoteV1/Config/Serializers/PortScanDeserializer.cs +++ b/mRemoteV1/Config/Serializers/PortScanDeserializer.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; diff --git a/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs index 955696f98..8574ce317 100644 --- a/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/PuttyConnectionManagerDeserializer.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Xml; -using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; diff --git a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs index bdae05735..242ab3a2b 100644 --- a/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs +++ b/mRemoteV1/Config/Serializers/RemoteDesktopConnectionManagerDeserializer.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Xml; -using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.RDP; From e27424102bd7c6163952d8b7160aa9a90308232c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 09:15:17 -0600 Subject: [PATCH 242/338] Removed unused code --- mRemoteV1/Tree/ConnectionTreeNode.cs | 40 ---------------------------- 1 file changed, 40 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 5a1fd3fd6..14d55cd9d 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -74,45 +74,5 @@ namespace mRemoteNG.Tree return TreeNodeType.None; } - - public static TreeNode AddNode(TreeNodeType nodeType, string name = null) - { - try - { - TreeNode treeNode = new TreeNode(); - string defaultName = ""; - - switch (nodeType) - { - case TreeNodeType.Connection: - case TreeNodeType.PuttySession: - defaultName = Language.strNewConnection; - treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; - treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; - break; - case TreeNodeType.Container: - defaultName = Language.strNewFolder; - treeNode.ImageIndex = (int)TreeImageType.Container; - treeNode.SelectedImageIndex = (int)TreeImageType.Container; - break; - case TreeNodeType.Root: - defaultName = Language.strNewRoot; - treeNode.ImageIndex = (int)TreeImageType.Root; - treeNode.SelectedImageIndex = (int)TreeImageType.Root; - break; - } - - treeNode.Name = !string.IsNullOrEmpty(name) ? name : defaultName; - treeNode.Text = treeNode.Name; - - return treeNode; - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "AddNode failed" + Environment.NewLine + ex.Message, true); - } - - return null; - } } } \ No newline at end of file From 1a8d4ea7fd3bd244e58eb4d0e8c6f989b44658f5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 09:21:45 -0600 Subject: [PATCH 243/338] Removed unnecessary code --- .../Connections/SqlConnectionsLoader.cs | 8 ----- .../Serializers/XmlConnectionsDeserializer.cs | 11 ------- .../Config/Settings/LayoutSettingsLoader.cs | 1 - mRemoteV1/Tree/ConnectionTree.cs | 31 ------------------- mRemoteV1/mRemoteV1.csproj | 1 - 5 files changed, 52 deletions(-) delete mode 100644 mRemoteV1/Tree/ConnectionTree.cs diff --git a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs index 980fb89ac..e0cf86184 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs @@ -474,15 +474,8 @@ namespace mRemoteNG.Config.Connections return null; } - private delegate void SetSelectedNodeDelegate(TreeNode treeNode); private static void SetSelectedNode(TreeNode treeNode) { - if (ConnectionTree.TreeView != null && ConnectionTree.TreeView.InvokeRequired) - { - Windows.treeForm.Invoke(new SetSelectedNodeDelegate(SetSelectedNode), treeNode); - return; - } - Windows.treeForm.tvConnections.SelectedNode = treeNode; } private bool Authenticate(string value, bool compareToOriginalValue, RootNodeInfo rootInfo = null) @@ -517,6 +510,5 @@ namespace mRemoteNG.Config.Connections return true; } - } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs index fa2019f30..09c96ba6f 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs @@ -471,16 +471,5 @@ namespace mRemoteNG.Config.Serializers }; return rootInfo; } - - private delegate void SetSelectedNodeDelegate(TreeNode treeNode); - private static void SetSelectedNode(TreeNode treeNode) - { - if (ConnectionTree.TreeView != null && ConnectionTree.TreeView.InvokeRequired) - { - Windows.treeForm.Invoke(new SetSelectedNodeDelegate(SetSelectedNode), treeNode); - return; - } - Windows.treeForm.tvConnections.SelectedNode = treeNode; - } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Settings/LayoutSettingsLoader.cs b/mRemoteV1/Config/Settings/LayoutSettingsLoader.cs index 70a3150a0..b7538b82d 100644 --- a/mRemoteV1/Config/Settings/LayoutSettingsLoader.cs +++ b/mRemoteV1/Config/Settings/LayoutSettingsLoader.cs @@ -93,7 +93,6 @@ namespace mRemoteNG.Config.Settings Windows.treeForm = new ConnectionTreeWindow(Windows.treePanel); Windows.treePanel = Windows.treeForm; - ConnectionTree.TreeView = Windows.treeForm.tvConnections; Windows.errorsForm = new ErrorAndInfoWindow(Windows.errorsPanel); Windows.errorsPanel = Windows.errorsForm; diff --git a/mRemoteV1/Tree/ConnectionTree.cs b/mRemoteV1/Tree/ConnectionTree.cs deleted file mode 100644 index dccc773e1..000000000 --- a/mRemoteV1/Tree/ConnectionTree.cs +++ /dev/null @@ -1,31 +0,0 @@ -using mRemoteNG.App; -using System.Windows.Forms; - - -namespace mRemoteNG.Tree -{ - public static class ConnectionTree - { - private static TreeNode treeNodeToBeSelected; - - public static TreeView TreeView { get; set; } - - //TODO Fix for TreeListView - private delegate void ResetTreeDelegate(); - public static void ResetTree() - { - if (TreeView.InvokeRequired) - { - ResetTreeDelegate resetTreeDelegate = ResetTree; - Windows.treeForm.Invoke(resetTreeDelegate); - } - else - { - TreeView.BeginUpdate(); - TreeView.Nodes.Clear(); - TreeView.Nodes.Add(Language.strConnections); - TreeView.EndUpdate(); - } - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 35e767d6f..2fd49130c 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -204,7 +204,6 @@ - From 95f54b9330b10af333a0ce81ee94aa1f7628ea71 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 09:35:40 -0600 Subject: [PATCH 244/338] Made IDataProvider generic to support multiple data formatting types (mostly to help with database support and DataTables) --- mRemoteV1/Config/DataProviders/FileDataProvider.cs | 2 +- mRemoteV1/Config/DataProviders/IDataProvider.cs | 6 +++--- mRemoteV1/Config/DataProviders/SqlDataProvider.cs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mRemoteV1/Config/DataProviders/FileDataProvider.cs b/mRemoteV1/Config/DataProviders/FileDataProvider.cs index abed196bc..8d5431e63 100644 --- a/mRemoteV1/Config/DataProviders/FileDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/FileDataProvider.cs @@ -4,7 +4,7 @@ using mRemoteNG.App; namespace mRemoteNG.Config.DataProviders { - public class FileDataProvider : IDataProvider + public class FileDataProvider : IDataProvider { public string FilePath { get; set; } diff --git a/mRemoteV1/Config/DataProviders/IDataProvider.cs b/mRemoteV1/Config/DataProviders/IDataProvider.cs index 13dda938a..1f665f17a 100644 --- a/mRemoteV1/Config/DataProviders/IDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/IDataProvider.cs @@ -1,10 +1,10 @@  namespace mRemoteNG.Config.DataProviders { - public interface IDataProvider + public interface IDataProvider { - string Load(); + TFormat Load(); - void Save(string contents); + void Save(TFormat contents); } } \ No newline at end of file diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs index 5358c9bd2..047f32f02 100644 --- a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -5,7 +5,7 @@ using System.Data.SqlClient; namespace mRemoteNG.Config.DataProviders { - public class SqlDataProvider + public class SqlDataProvider : IDataProvider { public SqlConnection SqlConnection { get; } From 87b4dd09e4f1eae3c1687f5fdec07478f7be4300 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 11:19:53 -0600 Subject: [PATCH 245/338] Rewrote Sql connection loading to use the DataProvider/Deserializer --- mRemoteV1/App/Runtime.cs | 26 ---------- .../Config/Connections/ConnectionsLoader.cs | 52 ++++--------------- .../Config/DataProviders/SqlDataProvider.cs | 28 ++++++---- mRemoteV1/Config/SqlDatabaseConnector.cs | 16 +++--- 4 files changed, 38 insertions(+), 84 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index a0787ee6e..f4cff7931 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -241,9 +241,6 @@ namespace mRemoteNG.App } - connectionsLoader.ConnectionList = ConnectionList; - connectionsLoader.ContainerList = ContainerList; - var rootConnectionNode = ConnectionTreeModel.RootNodes.First(node => !(node is RootPuttySessionsNodeInfo)); ConnectionTreeModel.RemoveRootNode(rootConnectionNode); @@ -307,30 +304,7 @@ namespace mRemoteNG.App CreateBackupFile(Convert.ToString(connectionsLoader.ConnectionFileName)); } - connectionsLoader.ConnectionList = ConnectionList; - connectionsLoader.ContainerList = ContainerList; - - if (PreviousConnectionList != null && PreviousContainerList != null) - { - connectionsLoader.PreviousConnectionList = PreviousConnectionList; - connectionsLoader.PreviousContainerList = PreviousContainerList; - } - - if (update) - { - connectionsLoader.PreviousSelected = LastSelected; - } - - //ConnectionTree.ResetTree(); - - //connectionsLoader.RootTreeNode = Windows.treeForm.tvConnections.Nodes[0]; connectionsLoader.UseDatabase = Settings.Default.UseSQLServer; - connectionsLoader.DatabaseHost = Settings.Default.SQLHost; - connectionsLoader.DatabaseName = Settings.Default.SQLDatabaseName; - connectionsLoader.DatabaseUsername = Settings.Default.SQLUser; - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - connectionsLoader.DatabasePassword = cryptographyProvider.Decrypt(Convert.ToString(Settings.Default.SQLPass), GeneralAppInfo.EncryptionKey); - connectionsLoader.DatabaseUpdate = update; connectionsLoader.LoadConnections(false); if (Settings.Default.UseSQLServer) diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index 7cdf8b2d5..fd6189ed5 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -1,10 +1,7 @@ -using System.Windows.Forms; using mRemoteNG.App; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Putty; using mRemoteNG.Config.Serializers; -using mRemoteNG.Connection; -using mRemoteNG.Container; using mRemoteNG.UI.Forms; @@ -13,57 +10,30 @@ namespace mRemoteNG.Config.Connections public class ConnectionsLoader { public bool UseDatabase { get; set; } - public string DatabaseHost { get; set; } - public string DatabaseName { get; set; } - public string DatabaseUsername { get; set; } - public string DatabasePassword { get; set; } - public bool DatabaseUpdate { get; set; } - public string PreviousSelected { get; set; } public string ConnectionFileName { get; set; } - public TreeNode RootTreeNode { get; set; } - public ConnectionList ConnectionList { get; set; } - public ContainerList ContainerList { get; set; } - public ConnectionList PreviousConnectionList { get; set; } - public ContainerList PreviousContainerList { get; set; } public void LoadConnections(bool import) { + IDeserializer deserializer; if (UseDatabase) { - var sqlConnectionsLoader = new SqlConnectionsLoader() - { - ConnectionList = ConnectionList, - ContainerList = ContainerList, - PreviousConnectionList = PreviousConnectionList, - PreviousContainerList = PreviousContainerList, - PreviousSelected = PreviousSelected, - RootTreeNode = RootTreeNode, - DatabaseName = DatabaseName, - DatabaseHost = DatabaseHost, - DatabasePassword = DatabasePassword, - DatabaseUpdate = DatabaseUpdate, - DatabaseUsername = DatabaseUsername - }; - sqlConnectionsLoader.LoadFromSql(); + var connector = new SqlDatabaseConnector(); + var dataProvider = new SqlDataProvider(connector); + var dataTable = dataProvider.Load(); + deserializer = new DataTableDeserializer(dataTable); } else { var dataProvider = new FileDataProvider(ConnectionFileName); var xmlString = dataProvider.Load(); - var xmlConnectionsDeserializer = new XmlConnectionsDeserializer(xmlString) - { - ConnectionList = ConnectionList, - ContainerList = ContainerList - }; - var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(import); - //var connectionTreeViewBuilder = new ConnectionTreeViewBuilder(connectionTreeModel); - //connectionTreeViewBuilder.Build(); - //connectionTreeViewBuilder.AppendTo(Windows.treeForm.tvConnections); - Runtime.ConnectionTreeModel = connectionTreeModel; + deserializer = new XmlConnectionsDeserializer(xmlString); } - - frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; + + var connectionTreeModel = deserializer.Deserialize(); + Runtime.ConnectionTreeModel = connectionTreeModel; + + frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; frmMain.Default.ConnectionsFileName = ConnectionFileName; if (import) return; diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs index 047f32f02..3e40753d7 100644 --- a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -7,40 +7,50 @@ namespace mRemoteNG.Config.DataProviders { public class SqlDataProvider : IDataProvider { - public SqlConnection SqlConnection { get; } + public SqlDatabaseConnector SqlDatabaseConnector { get; } - public SqlDataProvider(SqlConnection sqlConnection) + public SqlDataProvider(SqlDatabaseConnector sqlDatabaseConnector) { - SqlConnection = sqlConnection; + SqlDatabaseConnector = sqlDatabaseConnector; } ~SqlDataProvider() { - SqlConnection.Dispose(); + SqlDatabaseConnector.Dispose(); } public DataTable Load() { - throw new NotImplementedException(); + var dataTable = new DataTable(); + var sqlQuery = new SqlCommand("SELECT * FROM tblCons ORDER BY PositionID ASC"); + SqlDatabaseConnector.AssociateItemToThisConnector(sqlQuery); + if (!SqlDatabaseConnector.IsConnected) + OpenConnection(); + var sqlDataReader = sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); + + if (sqlDataReader.HasRows) + dataTable.Load(sqlDataReader); + sqlDataReader.Close(); + return dataTable; } public void Save(DataTable dataTable) { - if (SqlConnection.State != ConnectionState.Open) + if (!SqlDatabaseConnector.IsConnected) OpenConnection(); - var sqlBulkCopy = new SqlBulkCopy(SqlConnection) {DestinationTableName = "dbo.tblCons"}; + var sqlBulkCopy = new SqlBulkCopy(SqlDatabaseConnector.SqlConnection) {DestinationTableName = "dbo.tblCons"}; sqlBulkCopy.WriteToServer(dataTable); sqlBulkCopy.Close(); } public void OpenConnection() { - SqlConnection.Open(); + SqlDatabaseConnector.Connect(); } public void CloseConnection() { - SqlConnection.Close(); + SqlDatabaseConnector.Disconnect(); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/SqlDatabaseConnector.cs b/mRemoteV1/Config/SqlDatabaseConnector.cs index e5232595f..8ee03dcf4 100644 --- a/mRemoteV1/Config/SqlDatabaseConnector.cs +++ b/mRemoteV1/Config/SqlDatabaseConnector.cs @@ -8,14 +8,14 @@ namespace mRemoteNG.Config { public class SqlDatabaseConnector : IDatabaseConnector { - private SqlConnection _sqlConnection = default(SqlConnection); + public SqlConnection SqlConnection { get; private set; } = default(SqlConnection); private string _sqlConnectionString = ""; private string _sqlHost; private string _sqlCatalog; private string _sqlUsername; private string _sqlPassword; - public bool IsConnected => (_sqlConnection.State == ConnectionState.Open); + public bool IsConnected => (SqlConnection.State == ConnectionState.Open); public SqlDatabaseConnector() { @@ -30,7 +30,7 @@ namespace mRemoteNG.Config private void Initialize() { BuildSqlConnectionString(); - _sqlConnection = new SqlConnection(_sqlConnectionString); + SqlConnection = new SqlConnection(_sqlConnectionString); } private void BuildSqlConnectionString() @@ -64,17 +64,17 @@ namespace mRemoteNG.Config public void Connect() { - _sqlConnection.Open(); + SqlConnection.Open(); } public void Disconnect() { - _sqlConnection.Close(); + SqlConnection.Close(); } public void AssociateItemToThisConnector(SqlCommand sqlCommand) { - sqlCommand.Connection = _sqlConnection; + sqlCommand.Connection = SqlConnection; } public void Dispose() @@ -84,8 +84,8 @@ namespace mRemoteNG.Config private void Dispose(bool itIsSafeToFreeManagedObjects) { if (!itIsSafeToFreeManagedObjects) return; - _sqlConnection.Close(); - _sqlConnection.Dispose(); + SqlConnection.Close(); + SqlConnection.Dispose(); } } } \ No newline at end of file From 3016ef854564b0f1d96f6ae61c79bcc648100cef Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 11:22:05 -0600 Subject: [PATCH 246/338] Removed unnecessary code --- .../Connections/SqlConnectionsLoader.cs | 514 ------------------ mRemoteV1/mRemoteV1.csproj | 1 - 2 files changed, 515 deletions(-) delete mode 100644 mRemoteV1/Config/Connections/SqlConnectionsLoader.cs diff --git a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs b/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs deleted file mode 100644 index e0cf86184..000000000 --- a/mRemoteV1/Config/Connections/SqlConnectionsLoader.cs +++ /dev/null @@ -1,514 +0,0 @@ -using System; -using System.Data; -using System.Data.SqlClient; -using System.Globalization; -using System.Security; -using System.Windows.Forms; -using mRemoteNG.App; -using mRemoteNG.App.Info; -using mRemoteNG.Connection; -using mRemoteNG.Connection.Protocol; -using mRemoteNG.Connection.Protocol.Http; -using mRemoteNG.Connection.Protocol.ICA; -using mRemoteNG.Connection.Protocol.RDP; -using mRemoteNG.Connection.Protocol.VNC; -using mRemoteNG.Container; -using mRemoteNG.Messages; -using mRemoteNG.Security; -using mRemoteNG.Security.SymmetricEncryption; -using mRemoteNG.Tree; -using mRemoteNG.Tree.Root; -using mRemoteNG.UI.Forms; -using mRemoteNG.UI.TaskDialog; - -namespace mRemoteNG.Config.Connections -{ - public class SqlConnectionsLoader - { - private SqlConnection _sqlConnection; - private SqlCommand _sqlQuery; - private SqlDataReader _sqlDataReader; - private TreeNode _selectedTreeNode; - private double _confVersion; - private SecureString _pW = GeneralAppInfo.EncryptionKey; - - - public string DatabaseHost { get; set; } - public string DatabaseName { get; set; } - public string DatabaseUsername { get; set; } - public string DatabasePassword { get; set; } - public bool DatabaseUpdate { get; set; } - public string PreviousSelected { get; set; } - public TreeNode RootTreeNode { get; set; } - public ConnectionList ConnectionList { get; set; } - public ContainerList ContainerList { get; set; } - public ConnectionList PreviousConnectionList { get; set; } - public ContainerList PreviousContainerList { get; set; } - - - private delegate void LoadFromSqlDelegate(); - public void LoadFromSql() - { - if (Windows.treeForm == null || Windows.treeForm.tvConnections == null) - return; - if (Windows.treeForm.tvConnections.InvokeRequired) - { - Windows.treeForm.tvConnections.Invoke(new LoadFromSqlDelegate(LoadFromSql)); - return; - } - - try - { - Runtime.IsConnectionsFileLoaded = false; - _sqlConnection = !string.IsNullOrEmpty(DatabaseUsername) ? new SqlConnection("Data Source=" + DatabaseHost + ";Initial Catalog=" + DatabaseName + ";User Id=" + DatabaseUsername + ";Password=" + DatabasePassword) : new SqlConnection("Data Source=" + DatabaseHost + ";Initial Catalog=" + DatabaseName + ";Integrated Security=True"); - - _sqlConnection.Open(); - _sqlQuery = new SqlCommand("SELECT * FROM tblRoot", _sqlConnection); - _sqlDataReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); - _sqlDataReader.Read(); - - //if (_sqlDataReader.HasRows == false) - //{ - // Runtime.SaveConnections(); - // _sqlQuery = new SqlCommand("SELECT * FROM tblRoot", _sqlConnection); - // _sqlDataReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); - // _sqlDataReader.Read(); - //} - - if (!_sqlDataReader.HasRows) - { - CreateRootTreeNode("Connections"); - return; - } - - _confVersion = Convert.ToDouble(_sqlDataReader["confVersion"], CultureInfo.InvariantCulture); - const double maxSupportedSchemaVersion = 2.5; - if (_confVersion > maxSupportedSchemaVersion) - { - CTaskDialog.ShowTaskDialogBox( - frmMain.Default, - Application.ProductName, - "Incompatible database schema", - $"The database schema on the server is not supported. Please upgrade to a newer version of {Application.ProductName}.", - string.Format("Schema Version: {1}{0}Highest Supported Version: {2}", Environment.NewLine, _confVersion, maxSupportedSchemaVersion), - "", - "", - "", - "", - ETaskDialogButtons.Ok, - ESysIcons.Error, - ESysIcons.Error - ); - throw (new Exception($"Incompatible database schema (schema version {_confVersion}).")); - } - - CreateRootTreeNode(Convert.ToString(_sqlDataReader["Name"])); - - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - if (cryptographyProvider.Decrypt(Convert.ToString(_sqlDataReader["Protected"]), _pW) != "ThisIsNotProtected") - { - if (Authenticate(Convert.ToString(_sqlDataReader["Protected"]), false, (RootNodeInfo)RootTreeNode.Tag) == false) - { - mRemoteNG.Settings.Default.LoadConsFromCustomLocation = false; - mRemoteNG.Settings.Default.CustomConsPath = ""; - RootTreeNode.Remove(); - return; - } - } - - _sqlDataReader.Close(); - Windows.treeForm.tvConnections.BeginUpdate(); - - // SECTION 3. Populate the TreeView with the DOM nodes. - AddNodesFromSql(RootTreeNode); - RootTreeNode.Expand(); - - //expand containers - foreach (ContainerInfo contI in ContainerList) - { - if (contI.IsExpanded) - contI.TreeNode.Expand(); - } - - Windows.treeForm.tvConnections.EndUpdate(); - - //open connections from last mremote session - if (mRemoteNG.Settings.Default.OpenConsFromLastSession && !mRemoteNG.Settings.Default.NoReconnect) - { - foreach (ConnectionInfo conI in ConnectionList) - { - if (conI.PleaseConnect) - ConnectionInitiator.OpenConnection(conI); - } - } - - Runtime.IsConnectionsFileLoaded = true; - SetSelectedNode(_selectedTreeNode); - } - finally - { - _sqlConnection?.Close(); - } - } - - private void CreateRootTreeNode(string name) - { - RootTreeNode = new TreeNode(name); - Windows.treeForm.tvConnections.Nodes.Add(RootTreeNode); - - var rootInfo = new RootNodeInfo(RootNodeType.Connection) - { - Name = RootTreeNode.Name, - TreeNode = RootTreeNode - }; - - RootTreeNode.Tag = rootInfo; - RootTreeNode.ImageIndex = (int)TreeImageType.Root; - RootTreeNode.SelectedImageIndex = (int)TreeImageType.Root; - } - - private void AddNodesFromSql(TreeNode baseNode) - { - try - { - _sqlConnection.Open(); - _sqlQuery = new SqlCommand("SELECT * FROM tblCons ORDER BY PositionID ASC", _sqlConnection); - _sqlDataReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); - - if (_sqlDataReader.HasRows == false) - return; - - //var deserializer = new DataTableDeserializer(_sqlDataReader); - //var connectionTreeModel = deserializer.Deserialize(); - - while (_sqlDataReader.Read()) - { - var tNode = new TreeNode(Convert.ToString(_sqlDataReader["Name"])); - var nodeType = ConnectionTreeNode.GetNodeTypeFromString(Convert.ToString(_sqlDataReader["Type"])); - - if (nodeType == TreeNodeType.Connection) - AddConnectionToList(tNode); - else if (nodeType == TreeNodeType.Container) - AddContainerToList(tNode); - - var parentId = Convert.ToString(_sqlDataReader["ParentID"].ToString().Trim()); - if (string.IsNullOrEmpty(parentId) || parentId == "0") - { - baseNode.Nodes.Add(tNode); - } - else - { - var pNode = ConnectionTreeNode.GetNodeFromConstantID(Convert.ToString(_sqlDataReader["ParentID"])); - if (pNode != null) - { - pNode.Nodes.Add(tNode); - - switch (ConnectionTreeNode.GetNodeType(tNode)) - { - case TreeNodeType.Connection: - ((ConnectionInfo) tNode.Tag).Parent = (ContainerInfo)pNode.Tag; - break; - case TreeNodeType.Container: - ((ContainerInfo) tNode.Tag).Parent = (ContainerInfo)pNode.Tag; - break; - } - } - else - { - baseNode.Nodes.Add(tNode); - } - } - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strAddNodesFromSqlFailed + Environment.NewLine + ex.Message, true); - } - } - - private void AddConnectionToList(TreeNode tNode) - { - var conI = GetConnectionInfoFromSql(); - conI.TreeNode = tNode; - ConnectionList.Add(conI); - tNode.Tag = conI; - - if (DatabaseUpdate) - { - var prevCon = PreviousConnectionList.FindByConstantID(conI.ConstantID); - if (prevCon != null) - { - foreach (ProtocolBase prot in prevCon.OpenConnections) - { - prot.InterfaceControl.Info = conI; - conI.OpenConnections.Add(prot); - } - - if (conI.OpenConnections.Count > 0) - { - tNode.ImageIndex = (int) TreeImageType.ConnectionOpen; - tNode.SelectedImageIndex = (int) TreeImageType.ConnectionOpen; - } - else - { - tNode.ImageIndex = (int) TreeImageType.ConnectionClosed; - tNode.SelectedImageIndex = (int) TreeImageType.ConnectionClosed; - } - } - else - { - tNode.ImageIndex = (int) TreeImageType.ConnectionClosed; - tNode.SelectedImageIndex = (int) TreeImageType.ConnectionClosed; - } - - if (conI.ConstantID == PreviousSelected) - _selectedTreeNode = tNode; - } - else - { - tNode.ImageIndex = (int) TreeImageType.ConnectionClosed; - tNode.SelectedImageIndex = (int) TreeImageType.ConnectionClosed; - } - } - - private void AddContainerToList(TreeNode tNode) - { - var containerInfo = new ContainerInfo(); - - var connectionInfo = GetConnectionInfoFromSql(); - containerInfo.CopyFrom(connectionInfo); - //connectionInfo.Parent = contI; - containerInfo.IsContainer = true; - containerInfo.Name = Convert.ToString(_sqlDataReader["Name"]); - containerInfo.TreeNode = tNode; - - if (DatabaseUpdate) - { - var prevCont = PreviousContainerList.FindByConstantID(connectionInfo.ConstantID); - if (prevCont != null) - containerInfo.IsExpanded = prevCont.IsExpanded; - - if (connectionInfo.ConstantID == PreviousSelected) - _selectedTreeNode = tNode; - } - else - { - containerInfo.IsExpanded = Convert.ToBoolean(_sqlDataReader["Expanded"]); - } - - ContainerList.Add(containerInfo); - ConnectionList.Add(connectionInfo); - tNode.Tag = containerInfo; - tNode.ImageIndex = (int)TreeImageType.Container; - tNode.SelectedImageIndex = (int)TreeImageType.Container; - } - - private ConnectionInfo GetConnectionInfoFromSql() - { - try - { - var connectionInfo = new ConnectionInfo - { - PositionID = Convert.ToInt32(_sqlDataReader["PositionID"]), - ConstantID = Convert.ToString(_sqlDataReader["ConstantID"]), - Name = Convert.ToString(_sqlDataReader["Name"]), - Description = Convert.ToString(_sqlDataReader["Description"]), - Hostname = Convert.ToString(_sqlDataReader["Hostname"]), - Username = Convert.ToString(_sqlDataReader["Username"]) - }; - - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - connectionInfo.Password = cryptographyProvider.Decrypt(Convert.ToString(_sqlDataReader["Password"]), _pW); - connectionInfo.Domain = Convert.ToString(_sqlDataReader["DomainName"]); - connectionInfo.DisplayWallpaper = Convert.ToBoolean(_sqlDataReader["DisplayWallpaper"]); - connectionInfo.DisplayThemes = Convert.ToBoolean(_sqlDataReader["DisplayThemes"]); - connectionInfo.CacheBitmaps = Convert.ToBoolean(_sqlDataReader["CacheBitmaps"]); - connectionInfo.UseConsoleSession = Convert.ToBoolean(_sqlDataReader["ConnectToConsole"]); - connectionInfo.RedirectDiskDrives = Convert.ToBoolean(_sqlDataReader["RedirectDiskDrives"]); - connectionInfo.RedirectPrinters = Convert.ToBoolean(_sqlDataReader["RedirectPrinters"]); - connectionInfo.RedirectPorts = Convert.ToBoolean(_sqlDataReader["RedirectPorts"]); - connectionInfo.RedirectSmartCards = Convert.ToBoolean(_sqlDataReader["RedirectSmartCards"]); - connectionInfo.RedirectKeys = Convert.ToBoolean(_sqlDataReader["RedirectKeys"]); - connectionInfo.RedirectSound = (ProtocolRDP.RDPSounds)Tools.MiscTools.StringToEnum(typeof(ProtocolRDP.RDPSounds), Convert.ToString(_sqlDataReader["RedirectSound"])); - connectionInfo.Protocol = (ProtocolType)Tools.MiscTools.StringToEnum(typeof(ProtocolType), Convert.ToString(_sqlDataReader["Protocol"])); - connectionInfo.Port = Convert.ToInt32(_sqlDataReader["Port"]); - connectionInfo.PuttySession = Convert.ToString(_sqlDataReader["PuttySession"]); - connectionInfo.Colors = (ProtocolRDP.RDPColors)Tools.MiscTools.StringToEnum(typeof(ProtocolRDP.RDPColors), Convert.ToString(_sqlDataReader["Colors"])); - connectionInfo.Resolution = (ProtocolRDP.RDPResolutions)Tools.MiscTools.StringToEnum(typeof(ProtocolRDP.RDPResolutions), Convert.ToString(_sqlDataReader["Resolution"])); - connectionInfo.Icon = Convert.ToString(_sqlDataReader["Icon"]); - connectionInfo.Panel = Convert.ToString(_sqlDataReader["Panel"]); - connectionInfo.Inheritance = new ConnectionInfoInheritance(connectionInfo) - { - CacheBitmaps = Convert.ToBoolean(_sqlDataReader["InheritCacheBitmaps"]), - Colors = Convert.ToBoolean(_sqlDataReader["InheritColors"]), - Description = Convert.ToBoolean(_sqlDataReader["InheritDescription"]), - DisplayThemes = Convert.ToBoolean(_sqlDataReader["InheritDisplayThemes"]), - DisplayWallpaper = Convert.ToBoolean(_sqlDataReader["InheritDisplayWallpaper"]), - Domain = Convert.ToBoolean(_sqlDataReader["InheritDomain"]), - Icon = Convert.ToBoolean(_sqlDataReader["InheritIcon"]), - Panel = Convert.ToBoolean(_sqlDataReader["InheritPanel"]), - Password = Convert.ToBoolean(_sqlDataReader["InheritPassword"]), - Port = Convert.ToBoolean(_sqlDataReader["InheritPort"]), - Protocol = Convert.ToBoolean(_sqlDataReader["InheritProtocol"]), - PuttySession = Convert.ToBoolean(_sqlDataReader["InheritPuttySession"]), - RedirectDiskDrives = Convert.ToBoolean(_sqlDataReader["InheritRedirectDiskDrives"]), - RedirectKeys = Convert.ToBoolean(_sqlDataReader["InheritRedirectKeys"]), - RedirectPorts = Convert.ToBoolean(_sqlDataReader["InheritRedirectPorts"]), - RedirectPrinters = Convert.ToBoolean(_sqlDataReader["InheritRedirectPrinters"]), - RedirectSmartCards = Convert.ToBoolean(_sqlDataReader["InheritRedirectSmartCards"]), - RedirectSound = Convert.ToBoolean(_sqlDataReader["InheritRedirectSound"]), - Resolution = Convert.ToBoolean(_sqlDataReader["InheritResolution"]), - UseConsoleSession = Convert.ToBoolean(_sqlDataReader["InheritUseConsoleSession"]), - Username = Convert.ToBoolean(_sqlDataReader["InheritUsername"]) - }; - - if (_confVersion > 1.5) //1.6 - { - connectionInfo.ICAEncryptionStrength = (ProtocolICA.EncryptionStrength)Tools.MiscTools.StringToEnum(typeof(ProtocolICA.EncryptionStrength), Convert.ToString(_sqlDataReader["ICAEncryptionStrength"])); - connectionInfo.Inheritance.ICAEncryptionStrength = Convert.ToBoolean(_sqlDataReader["InheritICAEncryptionStrength"]); - connectionInfo.PreExtApp = Convert.ToString(_sqlDataReader["PreExtApp"]); - connectionInfo.PostExtApp = Convert.ToString(_sqlDataReader["PostExtApp"]); - connectionInfo.Inheritance.PreExtApp = Convert.ToBoolean(_sqlDataReader["InheritPreExtApp"]); - connectionInfo.Inheritance.PostExtApp = Convert.ToBoolean(_sqlDataReader["InheritPostExtApp"]); - } - - if (_confVersion > 1.6) //1.7 - { - connectionInfo.VNCCompression = (ProtocolVNC.Compression)Tools.MiscTools.StringToEnum(typeof(ProtocolVNC.Compression), Convert.ToString(_sqlDataReader["VNCCompression"])); - connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)Tools.MiscTools.StringToEnum(typeof(ProtocolVNC.Encoding), Convert.ToString(_sqlDataReader["VNCEncoding"])); - connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)Tools.MiscTools.StringToEnum(typeof(ProtocolVNC.AuthMode), Convert.ToString(_sqlDataReader["VNCAuthMode"])); - connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)Tools.MiscTools.StringToEnum(typeof(ProtocolVNC.ProxyType), Convert.ToString(_sqlDataReader["VNCProxyType"])); - connectionInfo.VNCProxyIP = Convert.ToString(_sqlDataReader["VNCProxyIP"]); - connectionInfo.VNCProxyPort = Convert.ToInt32(_sqlDataReader["VNCProxyPort"]); - connectionInfo.VNCProxyUsername = Convert.ToString(_sqlDataReader["VNCProxyUsername"]); - connectionInfo.VNCProxyPassword = cryptographyProvider.Decrypt(Convert.ToString(_sqlDataReader["VNCProxyPassword"]), _pW); - connectionInfo.VNCColors = (ProtocolVNC.Colors)Tools.MiscTools.StringToEnum(typeof(ProtocolVNC.Colors), Convert.ToString(_sqlDataReader["VNCColors"])); - connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Tools.MiscTools.StringToEnum(typeof(ProtocolVNC.SmartSizeMode), Convert.ToString(_sqlDataReader["VNCSmartSizeMode"])); - connectionInfo.VNCViewOnly = Convert.ToBoolean(_sqlDataReader["VNCViewOnly"]); - connectionInfo.Inheritance.VNCCompression = Convert.ToBoolean(_sqlDataReader["InheritVNCCompression"]); - connectionInfo.Inheritance.VNCEncoding = Convert.ToBoolean(_sqlDataReader["InheritVNCEncoding"]); - connectionInfo.Inheritance.VNCAuthMode = Convert.ToBoolean(_sqlDataReader["InheritVNCAuthMode"]); - connectionInfo.Inheritance.VNCProxyType = Convert.ToBoolean(_sqlDataReader["InheritVNCProxyType"]); - connectionInfo.Inheritance.VNCProxyIP = Convert.ToBoolean(_sqlDataReader["InheritVNCProxyIP"]); - connectionInfo.Inheritance.VNCProxyPort = Convert.ToBoolean(_sqlDataReader["InheritVNCProxyPort"]); - connectionInfo.Inheritance.VNCProxyUsername = Convert.ToBoolean(_sqlDataReader["InheritVNCProxyUsername"]); - connectionInfo.Inheritance.VNCProxyPassword = Convert.ToBoolean(_sqlDataReader["InheritVNCProxyPassword"]); - connectionInfo.Inheritance.VNCColors = Convert.ToBoolean(_sqlDataReader["InheritVNCColors"]); - connectionInfo.Inheritance.VNCSmartSizeMode = Convert.ToBoolean(_sqlDataReader["InheritVNCSmartSizeMode"]); - connectionInfo.Inheritance.VNCViewOnly = Convert.ToBoolean(_sqlDataReader["InheritVNCViewOnly"]); - } - - if (_confVersion > 1.7) //1.8 - { - connectionInfo.RDPAuthenticationLevel = (ProtocolRDP.AuthenticationLevel)Tools.MiscTools.StringToEnum(typeof(ProtocolRDP.AuthenticationLevel), Convert.ToString(_sqlDataReader["RDPAuthenticationLevel"])); - connectionInfo.Inheritance.RDPAuthenticationLevel = Convert.ToBoolean(_sqlDataReader["InheritRDPAuthenticationLevel"]); - } - - if (_confVersion > 1.8) //1.9 - { - connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Tools.MiscTools.StringToEnum(typeof(HTTPBase.RenderingEngine), Convert.ToString(_sqlDataReader["RenderingEngine"])); - connectionInfo.MacAddress = Convert.ToString(_sqlDataReader["MacAddress"]); - connectionInfo.Inheritance.RenderingEngine = Convert.ToBoolean(_sqlDataReader["InheritRenderingEngine"]); - connectionInfo.Inheritance.MacAddress = Convert.ToBoolean(_sqlDataReader["InheritMacAddress"]); - } - - if (_confVersion > 1.9) //2.0 - { - connectionInfo.UserField = Convert.ToString(_sqlDataReader["UserField"]); - connectionInfo.Inheritance.UserField = Convert.ToBoolean(_sqlDataReader["InheritUserField"]); - } - - if (_confVersion > 2.0) //2.1 - { - connectionInfo.ExtApp = Convert.ToString(_sqlDataReader["ExtApp"]); - connectionInfo.Inheritance.ExtApp = Convert.ToBoolean(_sqlDataReader["InheritExtApp"]); - } - - if (_confVersion >= 2.2) - { - connectionInfo.RDGatewayUsageMethod = (ProtocolRDP.RDGatewayUsageMethod)Tools.MiscTools.StringToEnum(typeof(ProtocolRDP.RDGatewayUsageMethod), Convert.ToString(_sqlDataReader["RDGatewayUsageMethod"])); - connectionInfo.RDGatewayHostname = Convert.ToString(_sqlDataReader["RDGatewayHostname"]); - connectionInfo.RDGatewayUseConnectionCredentials = (ProtocolRDP.RDGatewayUseConnectionCredentials)Tools.MiscTools.StringToEnum(typeof(ProtocolRDP.RDGatewayUseConnectionCredentials), Convert.ToString(_sqlDataReader["RDGatewayUseConnectionCredentials"])); - connectionInfo.RDGatewayUsername = Convert.ToString(_sqlDataReader["RDGatewayUsername"]); - connectionInfo.RDGatewayPassword = cryptographyProvider.Decrypt(Convert.ToString(_sqlDataReader["RDGatewayPassword"]), _pW); - connectionInfo.RDGatewayDomain = Convert.ToString(_sqlDataReader["RDGatewayDomain"]); - connectionInfo.Inheritance.RDGatewayUsageMethod = Convert.ToBoolean(_sqlDataReader["InheritRDGatewayUsageMethod"]); - connectionInfo.Inheritance.RDGatewayHostname = Convert.ToBoolean(_sqlDataReader["InheritRDGatewayHostname"]); - connectionInfo.Inheritance.RDGatewayUsername = Convert.ToBoolean(_sqlDataReader["InheritRDGatewayUsername"]); - connectionInfo.Inheritance.RDGatewayPassword = Convert.ToBoolean(_sqlDataReader["InheritRDGatewayPassword"]); - connectionInfo.Inheritance.RDGatewayDomain = Convert.ToBoolean(_sqlDataReader["InheritRDGatewayDomain"]); - } - - if (_confVersion >= 2.3) - { - connectionInfo.EnableFontSmoothing = Convert.ToBoolean(_sqlDataReader["EnableFontSmoothing"]); - connectionInfo.EnableDesktopComposition = Convert.ToBoolean(_sqlDataReader["EnableDesktopComposition"]); - connectionInfo.Inheritance.EnableFontSmoothing = Convert.ToBoolean(_sqlDataReader["InheritEnableFontSmoothing"]); - connectionInfo.Inheritance.EnableDesktopComposition = Convert.ToBoolean(_sqlDataReader["InheritEnableDesktopComposition"]); - } - - if (_confVersion >= 2.4) - { - connectionInfo.UseCredSsp = Convert.ToBoolean(_sqlDataReader["UseCredSsp"]); - connectionInfo.Inheritance.UseCredSsp = Convert.ToBoolean(_sqlDataReader["InheritUseCredSsp"]); - } - - if (_confVersion >= 2.5) - { - connectionInfo.LoadBalanceInfo = Convert.ToString(_sqlDataReader["LoadBalanceInfo"]); - connectionInfo.AutomaticResize = Convert.ToBoolean(_sqlDataReader["AutomaticResize"]); - connectionInfo.Inheritance.LoadBalanceInfo = Convert.ToBoolean(_sqlDataReader["InheritLoadBalanceInfo"]); - connectionInfo.Inheritance.AutomaticResize = Convert.ToBoolean(_sqlDataReader["InheritAutomaticResize"]); - } - - if (DatabaseUpdate) - connectionInfo.PleaseConnect = Convert.ToBoolean(_sqlDataReader["Connected"]); - - return connectionInfo; - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strGetConnectionInfoFromSqlFailed + Environment.NewLine + ex.Message, true); - } - - return null; - } - - private static void SetSelectedNode(TreeNode treeNode) - { - } - - private bool Authenticate(string value, bool compareToOriginalValue, RootNodeInfo rootInfo = null) - { - var passwordName = ""; - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - passwordName = Language.strSQLServer.TrimEnd(':'); - - - if (compareToOriginalValue) - { - while (cryptographyProvider.Decrypt(value, _pW) == value) - { - _pW = Tools.MiscTools.PasswordDialog(passwordName, false); - if (_pW.Length == 0) - return false; - } - } - else - { - while (cryptographyProvider.Decrypt(value, _pW) != "ThisIsProtected") - { - _pW = Tools.MiscTools.PasswordDialog(passwordName, false); - if (_pW.Length == 0) - return false; - } - - if (rootInfo == null) return true; - rootInfo.Password = true; - rootInfo.PasswordString = _pW.ConvertToUnsecureString(); - } - - return true; - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 2fd49130c..2ff3a0fee 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -150,7 +150,6 @@ - From 425fdb502c153430469442a3838ff19f76b45b74 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 11:28:05 -0600 Subject: [PATCH 247/338] Removed unnecessary code and implemented directly in the calling class --- .../Serializers/XmlConnectionsDeserializer.cs | 3 ++- mRemoteV1/Tree/ConnectionTreeNode.cs | 22 ------------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs index 09c96ba6f..cfc17144b 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs @@ -135,7 +135,8 @@ namespace mRemoteNG.Config.Serializers if (!parentXmlNode.HasChildNodes) return; foreach (XmlNode xmlNode in parentXmlNode.ChildNodes) { - var nodeType = ConnectionTreeNode.GetNodeTypeFromString(xmlNode.Attributes?["Type"].Value); + var treeNodeTypeString = xmlNode.Attributes?["Type"].Value ?? "connection"; + var nodeType = (TreeNodeType)Enum.Parse(typeof(TreeNodeType), treeNodeTypeString, true); if (nodeType == TreeNodeType.Connection) { diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 14d55cd9d..1ade7a8c4 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -52,27 +52,5 @@ namespace mRemoteNG.Tree return TreeNodeType.None; } - - public static TreeNodeType GetNodeTypeFromString(string str) - { - try - { - switch (str.ToLower()) - { - case "root": - return TreeNodeType.Root; - case "container": - return TreeNodeType.Container; - case "connection": - return TreeNodeType.Connection; - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Couldn\'t get node type from string" + Environment.NewLine + ex.Message, true); - } - - return TreeNodeType.None; - } } } \ No newline at end of file From 598a39fcc103fa41954886714d788c1bfb98c02d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 11:28:37 -0600 Subject: [PATCH 248/338] Removed unnecessary code --- mRemoteV1/Tree/ConnectionTreeNode.cs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs index 1ade7a8c4..9fd0da454 100644 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ b/mRemoteV1/Tree/ConnectionTreeNode.cs @@ -11,22 +11,6 @@ namespace mRemoteNG.Tree { public static class ConnectionTreeNode { - //TODO Everything in this class needs to be updated / rewritten to work with the TreeListView/ConnectionTreeModel - public static TreeNode GetNodeFromConstantID(string id) - { - foreach (ConnectionInfo connectionInfo in Runtime.ConnectionList) - { - if (connectionInfo.ConstantID == id) - { - if (connectionInfo.IsContainer) - return connectionInfo.Parent.TreeNode; - return connectionInfo.TreeNode; - } - } - - return null; - } - public static TreeNodeType GetNodeType(TreeNode treeNode) { try From a63120b78f35e1fdccdfe526c1412bba590624ad Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 11:43:47 -0600 Subject: [PATCH 249/338] Code cleanup --- mRemoteV1/App/Export.cs | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index fe94f6526..e5289b449 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -1,6 +1,7 @@ using System; using System.Windows.Forms; using mRemoteNG.Config.Connections; +using mRemoteNG.Security; using mRemoteNG.Tree; using mRemoteNG.UI.Forms; @@ -13,27 +14,21 @@ namespace mRemoteNG.App { try { - Security.Save saveSecurity = new Security.Save(); + var saveSecurity = new Save(); - using (ExportForm exportForm = new ExportForm()) + using (var exportForm = new ExportForm()) { - if (Tree.ConnectionTreeNode.GetNodeType(selectedTreeNode) == Tree.TreeNodeType.Container) - { + if (ConnectionTreeNode.GetNodeType(selectedTreeNode) == TreeNodeType.Container) exportForm.SelectedFolder = selectedTreeNode; - } - else if (Tree.ConnectionTreeNode.GetNodeType(selectedTreeNode) == Tree.TreeNodeType.Connection) + else if (ConnectionTreeNode.GetNodeType(selectedTreeNode) == TreeNodeType.Connection) { - if (Tree.ConnectionTreeNode.GetNodeType(selectedTreeNode.Parent) == Tree.TreeNodeType.Container) - { + if (ConnectionTreeNode.GetNodeType(selectedTreeNode.Parent) == TreeNodeType.Container) exportForm.SelectedFolder = selectedTreeNode.Parent; - } exportForm.SelectedConnection = selectedTreeNode; } if (exportForm.ShowDialog(frmMain.Default) != DialogResult.OK) - { return ; - } TreeNode exportTreeNode; switch (exportForm.Scope) @@ -64,16 +59,14 @@ namespace mRemoteNG.App } } - private static void SaveExportFile(string fileName, ConnectionsSaver.Format saveFormat, TreeNode rootNode, Security.Save saveSecurity, ConnectionTreeModel connectionTreeModel) + private static void SaveExportFile(string fileName, ConnectionsSaver.Format saveFormat, TreeNode rootNode, Save saveSecurity, ConnectionTreeModel connectionTreeModel) { try { if (Runtime.SQLConnProvider != null) - { Runtime.SQLConnProvider.Disable(); - } - ConnectionsSaver connectionsSave = new ConnectionsSaver + var connectionsSave = new ConnectionsSaver { Export = true, ConnectionFileName = fileName, @@ -93,9 +86,7 @@ namespace mRemoteNG.App finally { if (Runtime.SQLConnProvider != null) - { Runtime.SQLConnProvider.Enable(); - } } } } From 814f07212d9e25169c18516d94b4e9ce7a29489b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 11:58:48 -0600 Subject: [PATCH 250/338] Made ISerializer generic --- .../Serializers/CsvConnectionsSerializerMremotengFormat.cs | 2 +- .../CsvConnectionsSerializerRemoteDesktop2008Format.cs | 2 +- mRemoteV1/Config/Serializers/DataTableSerializer.cs | 2 +- mRemoteV1/Config/Serializers/ISerializer.cs | 4 ++-- mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs | 2 +- mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs index 1babd4d27..f68a0147f 100644 --- a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs +++ b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs @@ -9,7 +9,7 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Config.Serializers { - public class CsvConnectionsSerializerMremotengFormat : ISerializer + public class CsvConnectionsSerializerMremotengFormat : ISerializer { private string _csv = ""; diff --git a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs index 11e519ae9..3deafaf30 100644 --- a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs +++ b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs @@ -9,7 +9,7 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Config.Serializers { - public class CsvConnectionsSerializerRemoteDesktop2008Format : ISerializer + public class CsvConnectionsSerializerRemoteDesktop2008Format : ISerializer { private string _csv = ""; diff --git a/mRemoteV1/Config/Serializers/DataTableSerializer.cs b/mRemoteV1/Config/Serializers/DataTableSerializer.cs index b0a76c073..8f99873a5 100644 --- a/mRemoteV1/Config/Serializers/DataTableSerializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableSerializer.cs @@ -9,7 +9,7 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Config.Serializers { - public class DataTableSerializer + public class DataTableSerializer : ISerializer { private DataTable _dataTable; private const string TableName = "tblCons"; diff --git a/mRemoteV1/Config/Serializers/ISerializer.cs b/mRemoteV1/Config/Serializers/ISerializer.cs index 56084735a..cd19809a6 100644 --- a/mRemoteV1/Config/Serializers/ISerializer.cs +++ b/mRemoteV1/Config/Serializers/ISerializer.cs @@ -2,8 +2,8 @@ namespace mRemoteNG.Config.Serializers { - public interface ISerializer + public interface ISerializer { - string Serialize(ConnectionTreeModel connectionTreeModel); + TFormat Serialize(ConnectionTreeModel connectionTreeModel); } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs index 194f79cd5..7beb7febb 100644 --- a/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs @@ -16,7 +16,7 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Config.Serializers { - public class SqlConnectionsSerializer : ISerializer + public class SqlConnectionsSerializer : ISerializer { private SqlConnection _sqlConnection; private SqlCommand _sqlQuery; diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs index 7193ad8ed..647617ba2 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs @@ -17,7 +17,7 @@ using mRemoteNG.Tree.Root; namespace mRemoteNG.Config.Serializers { - public class XmlConnectionsSerializer : ISerializer + public class XmlConnectionsSerializer : ISerializer { private SecureString _password = GeneralAppInfo.EncryptionKey; private XmlTextWriter _xmlTextWriter; From c613c3b4e17c71aabb022b311f91baebcb4bf841 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 12:22:55 -0600 Subject: [PATCH 251/338] Updated the ISerialize interface to require a Serialize(ConnectionInfo) method to support serializing a target connection/container --- ...CsvConnectionsSerializerMremotengFormat.cs | 29 +++++++----- ...ctionsSerializerRemoteDesktop2008Format.cs | 29 +++++++----- .../Config/Serializers/DataTableSerializer.cs | 8 ++-- mRemoteV1/Config/Serializers/ISerializer.cs | 5 +- .../Serializers/SqlConnectionsSerializer.cs | 5 ++ .../Serializers/XmlConnectionsSerializer.cs | 47 +++++++------------ 6 files changed, 61 insertions(+), 62 deletions(-) diff --git a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs index f68a0147f..9a4f36055 100644 --- a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs +++ b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerMremotengFormat.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Security; @@ -17,17 +16,15 @@ namespace mRemoteNG.Config.Serializers public string Serialize(ConnectionTreeModel connectionTreeModel) { - var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); - return SerializeToCsv(rootNode); + var rootNode = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); + return Serialize(rootNode); } - private string SerializeToCsv(RootNodeInfo rootNodeInfo) + public string Serialize(ConnectionInfo serializationTarget) { - if (Runtime.IsConnectionsFileLoaded == false) - return ""; _csv = ""; WriteCsvHeader(); - SerializeNodesRecursive(rootNodeInfo); + SerializeNodesRecursive(serializationTarget); return _csv; } @@ -47,15 +44,21 @@ namespace mRemoteNG.Config.Serializers _csv += csvHeader; } - private void SerializeNodesRecursive(ContainerInfo containerInfo) + private void SerializeNodesRecursive(ConnectionInfo node) { - foreach (var child in containerInfo.Children) + var nodeAsContainer = node as ContainerInfo; + if (nodeAsContainer != null) { - if (child is ContainerInfo) - SerializeNodesRecursive((ContainerInfo)child); - else - SerializeConnectionInfo(child); + foreach (var child in nodeAsContainer.Children) + { + if (child is ContainerInfo) + SerializeNodesRecursive((ContainerInfo) child); + else + SerializeConnectionInfo(child); + } } + else + SerializeConnectionInfo(node); } private void SerializeConnectionInfo(ConnectionInfo con) diff --git a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs index 3deafaf30..af50e4176 100644 --- a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs +++ b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs @@ -15,29 +15,32 @@ namespace mRemoteNG.Config.Serializers public string Serialize(ConnectionTreeModel connectionTreeModel) { - var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); - return SerializeToCsv(rootNode); + var rootNode = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); + return Serialize(rootNode); } - private string SerializeToCsv(RootNodeInfo rootNodeInfo) + public string Serialize(ConnectionInfo serializationTarget) { - if (Runtime.IsConnectionsFileLoaded == false) - return ""; - _csv = ""; - SerializeNodesRecursive(rootNodeInfo); + SerializeNodesRecursive(serializationTarget); return _csv; } - private void SerializeNodesRecursive(ContainerInfo containerInfo) + private void SerializeNodesRecursive(ConnectionInfo node) { - foreach (var child in containerInfo.Children) + var nodeAsContainer = node as ContainerInfo; + if (nodeAsContainer != null) { - if (child is ContainerInfo) - SerializeNodesRecursive((ContainerInfo)child); - else if (child.Protocol == ProtocolType.RDP) - SerializeConnectionInfo(child); + foreach (var child in nodeAsContainer.Children) + { + if (child is ContainerInfo) + SerializeNodesRecursive((ContainerInfo)child); + else if (child.Protocol == ProtocolType.RDP) + SerializeConnectionInfo(child); + } } + else if (node.Protocol == ProtocolType.RDP) + SerializeConnectionInfo(node); } private void SerializeConnectionInfo(ConnectionInfo con) diff --git a/mRemoteV1/Config/Serializers/DataTableSerializer.cs b/mRemoteV1/Config/Serializers/DataTableSerializer.cs index 8f99873a5..9252b45f1 100644 --- a/mRemoteV1/Config/Serializers/DataTableSerializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableSerializer.cs @@ -25,17 +25,17 @@ namespace mRemoteNG.Config.Serializers public DataTable Serialize(ConnectionTreeModel connectionTreeModel) { var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); - SerializeToDataTable(rootNode); - return _dataTable; + return Serialize(rootNode); } - private void SerializeToDataTable(RootNodeInfo rootNodeInfo) + public DataTable Serialize(ConnectionInfo serializationTarget) { _dataTable = new DataTable(TableName); CreateSchema(); SetPrimaryKey(); _currentNodeIndex = 0; - SerializeNodesRecursive(rootNodeInfo); + SerializeNodesRecursive(serializationTarget); + return _dataTable; } private void CreateSchema() diff --git a/mRemoteV1/Config/Serializers/ISerializer.cs b/mRemoteV1/Config/Serializers/ISerializer.cs index cd19809a6..116ec562b 100644 --- a/mRemoteV1/Config/Serializers/ISerializer.cs +++ b/mRemoteV1/Config/Serializers/ISerializer.cs @@ -1,9 +1,12 @@ -using mRemoteNG.Tree; +using mRemoteNG.Connection; +using mRemoteNG.Tree; namespace mRemoteNG.Config.Serializers { public interface ISerializer { TFormat Serialize(ConnectionTreeModel connectionTreeModel); + + TFormat Serialize(ConnectionInfo serializationTarget); } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs index 7beb7febb..47c0ea48d 100644 --- a/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs @@ -39,6 +39,11 @@ namespace mRemoteNG.Config.Serializers throw new NotImplementedException(); } + public string Serialize(ConnectionInfo serializationTarget) + { + throw new NotImplementedException(); + } + private bool VerifyDatabaseVersion(SqlConnection sqlConnection) { bool isVerified = false; diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs index 647617ba2..39afb7443 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs @@ -31,34 +31,20 @@ namespace mRemoteNG.Config.Serializers public string Serialize(ConnectionTreeModel connectionTreeModel) { var rootNode = (RootNodeInfo)connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); - return SerializeToXml(rootNode); + return Serialize(rootNode); } - private string SerializeToXml(RootNodeInfo rootNodeInfo) + public string Serialize(ConnectionInfo serializationTarget) { var xml = ""; try { - if (!Runtime.IsConnectionsFileLoaded) - return ""; - - //TreeNode treeNode; - //if (ConnectionTreeNode.GetNodeType(rootTreeNode) == TreeNodeType.Root) - //{ - // treeNode = (TreeNode)rootTreeNode.Clone(); - //} - //else - //{ - // treeNode = new TreeNode("mR|Export (" + MiscTools.DBDate(DateTime.Now) + ")"); - // treeNode.Nodes.Add(Convert.ToString(rootTreeNode.Clone())); - //} - var memoryStream = new MemoryStream(); using (_xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8)) { SetXmlTextWriterSettings(); _xmlTextWriter.WriteStartDocument(); - SaveNodesRecursive(rootNodeInfo); + SaveNodesRecursive(serializationTarget); _xmlTextWriter.Flush(); var streamReader = new StreamReader(memoryStream, Encoding.UTF8, true); @@ -79,28 +65,27 @@ namespace mRemoteNG.Config.Serializers _xmlTextWriter.Indentation = 4; } - private void SaveNodesRecursive(RootNodeInfo rootNodeInfo) - { - SerializeRootNodeInfo(rootNodeInfo); - foreach (var child in rootNodeInfo.Children) - SaveNodesRecursive(child); - _xmlTextWriter.WriteEndElement(); - } - - private void SaveNodesRecursive(ConnectionInfo connectionInfo) + private void SaveNodesRecursive(ConnectionInfo node) { try { - var containerInfo = connectionInfo as ContainerInfo; - if (containerInfo != null) + var nodeAsRoot = node as RootNodeInfo; + var nodeAsContainer = node as ContainerInfo; + if (nodeAsRoot != null) { - SerializeContainerInfo(containerInfo); - foreach (var child in containerInfo.Children) + SerializeRootNodeInfo(nodeAsRoot); + foreach (var child in nodeAsRoot.Children) + SaveNodesRecursive(child); + } + else if (nodeAsContainer != null) + { + SerializeContainerInfo(nodeAsContainer); + foreach (var child in nodeAsContainer.Children) SaveNodesRecursive(child); } else { - SerializeConnectionInfo(connectionInfo); + SerializeConnectionInfo(node); } _xmlTextWriter.WriteEndElement(); } From c4a9841ba6089aa8d2f5e6d67aef6466c7c3f484 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 12:51:28 -0600 Subject: [PATCH 252/338] Refactored Export and ExportForm to require ConnectionInfo rather than TreeNode for export --- mRemoteV1/App/Export.cs | 72 +++++++++++-------- .../Config/DataProviders/SqlDataProvider.cs | 3 +- ...ctionsSerializerRemoteDesktop2008Format.cs | 3 +- mRemoteV1/UI/Forms/ExportForm.cs | 17 +++-- mRemoteV1/UI/Forms/frmMain.cs | 2 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 6 files changed, 57 insertions(+), 42 deletions(-) diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index e5289b449..04ce75878 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -1,8 +1,14 @@ using System; +using System.Linq; using System.Windows.Forms; using mRemoteNG.Config.Connections; +using mRemoteNG.Config.DataProviders; +using mRemoteNG.Config.Serializers; +using mRemoteNG.Connection; +using mRemoteNG.Container; using mRemoteNG.Security; using mRemoteNG.Tree; +using mRemoteNG.Tree.Root; using mRemoteNG.UI.Forms; @@ -10,7 +16,7 @@ namespace mRemoteNG.App { public static class Export { - public static void ExportToFile(TreeNode rootTreeNode, TreeNode selectedTreeNode, ConnectionTreeModel connectionTreeModel) + public static void ExportToFile(ConnectionInfo selectedNode, ConnectionTreeModel connectionTreeModel) { try { @@ -18,29 +24,29 @@ namespace mRemoteNG.App using (var exportForm = new ExportForm()) { - if (ConnectionTreeNode.GetNodeType(selectedTreeNode) == TreeNodeType.Container) - exportForm.SelectedFolder = selectedTreeNode; - else if (ConnectionTreeNode.GetNodeType(selectedTreeNode) == TreeNodeType.Connection) + if (selectedNode.GetTreeNodeType() == TreeNodeType.Container) + exportForm.SelectedFolder = selectedNode as ContainerInfo; + else if (selectedNode.GetTreeNodeType() == TreeNodeType.Connection) { - if (ConnectionTreeNode.GetNodeType(selectedTreeNode.Parent) == TreeNodeType.Container) - exportForm.SelectedFolder = selectedTreeNode.Parent; - exportForm.SelectedConnection = selectedTreeNode; + if (selectedNode.Parent.GetTreeNodeType() == TreeNodeType.Container) + exportForm.SelectedFolder = selectedNode.Parent; + exportForm.SelectedConnection = selectedNode; } if (exportForm.ShowDialog(frmMain.Default) != DialogResult.OK) return ; - TreeNode exportTreeNode; + ConnectionInfo exportTarget; switch (exportForm.Scope) { case ExportForm.ExportScope.SelectedFolder: - exportTreeNode = exportForm.SelectedFolder; + exportTarget = exportForm.SelectedFolder; break; case ExportForm.ExportScope.SelectedConnection: - exportTreeNode = exportForm.SelectedConnection; + exportTarget = exportForm.SelectedConnection; break; default: - exportTreeNode = rootTreeNode; + exportTarget = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo); break; } @@ -49,7 +55,7 @@ namespace mRemoteNG.App saveSecurity.Domain = exportForm.IncludeDomain; saveSecurity.Inheritance = exportForm.IncludeInheritance; - SaveExportFile(exportForm.FileName, exportForm.SaveFormat, exportTreeNode, saveSecurity, connectionTreeModel); + SaveExportFile(exportForm.FileName, exportForm.SaveFormat, saveSecurity, exportTarget); } } @@ -59,34 +65,40 @@ namespace mRemoteNG.App } } - private static void SaveExportFile(string fileName, ConnectionsSaver.Format saveFormat, TreeNode rootNode, Save saveSecurity, ConnectionTreeModel connectionTreeModel) + private static void SaveExportFile(string fileName, ConnectionsSaver.Format saveFormat, Save saveSecurity, ConnectionInfo exportTarget) { try { - if (Runtime.SQLConnProvider != null) - Runtime.SQLConnProvider.Disable(); - - var connectionsSave = new ConnectionsSaver + ISerializer serializer; + switch (saveFormat) { - Export = true, - ConnectionFileName = fileName, - SaveFormat = saveFormat, - ConnectionList = Runtime.ConnectionList, - ContainerList = Runtime.ContainerList, - RootTreeNode = rootNode, - SaveSecurity = saveSecurity, - ConnectionTreeModel = connectionTreeModel - }; - connectionsSave.SaveConnections(); + case ConnectionsSaver.Format.mRXML: + serializer = new XmlConnectionsSerializer(); + ((XmlConnectionsSerializer) serializer).SaveSecurity = saveSecurity; + break; + case ConnectionsSaver.Format.mRCSV: + serializer = new CsvConnectionsSerializerMremotengFormat(); + ((CsvConnectionsSerializerMremotengFormat)serializer).SaveSecurity = saveSecurity; + break; + case ConnectionsSaver.Format.vRDCSV: + serializer = new CsvConnectionsSerializerRemoteDesktop2008Format(); + ((CsvConnectionsSerializerRemoteDesktop2008Format)serializer).SaveSecurity = saveSecurity; + break; + default: + throw new ArgumentOutOfRangeException(nameof(saveFormat), saveFormat, null); + } + var serializedData = serializer.Serialize(exportTarget); + var fileDataProvider = new FileDataProvider(fileName); + fileDataProvider.Save(serializedData); } catch (Exception ex) { - Runtime.MessageCollector.AddExceptionStackTrace($"Export.SaveExportFile(\"{fileName}\") failed.", ex); + Runtime.MessageCollector.AddExceptionStackTrace($"Export.SaveExportFile(\"{fileName}\") failed.", ex); } finally { - if (Runtime.SQLConnProvider != null) - Runtime.SQLConnProvider.Enable(); + if (Runtime.SQLConnProvider != null) + Runtime.SQLConnProvider.Enable(); } } } diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs index 3e40753d7..b1892c2f5 100644 --- a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -1,5 +1,4 @@ -using System; -using System.Data; +using System.Data; using System.Data.SqlClient; diff --git a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs index af50e4176..471c11ca2 100644 --- a/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs +++ b/mRemoteV1/Config/Serializers/CsvConnectionsSerializerRemoteDesktop2008Format.cs @@ -1,9 +1,9 @@ using System; using System.Linq; -using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; +using mRemoteNG.Security; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; @@ -12,6 +12,7 @@ namespace mRemoteNG.Config.Serializers public class CsvConnectionsSerializerRemoteDesktop2008Format : ISerializer { private string _csv = ""; + public Save SaveSecurity { get; set; } public string Serialize(ConnectionTreeModel connectionTreeModel) { diff --git a/mRemoteV1/UI/Forms/ExportForm.cs b/mRemoteV1/UI/Forms/ExportForm.cs index 493b1f780..05f16b3b1 100644 --- a/mRemoteV1/UI/Forms/ExportForm.cs +++ b/mRemoteV1/UI/Forms/ExportForm.cs @@ -3,6 +3,9 @@ using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; using mRemoteNG.App; +using mRemoteNG.Config.Connections; +using mRemoteNG.Connection; +using mRemoteNG.Container; namespace mRemoteNG.UI.Forms { @@ -21,7 +24,7 @@ namespace mRemoteNG.UI.Forms } } - public Config.Connections.ConnectionsSaver.Format SaveFormat + public ConnectionsSaver.Format SaveFormat { get { @@ -83,8 +86,8 @@ namespace mRemoteNG.UI.Forms } } - private TreeNode _selectedFolder; - public TreeNode SelectedFolder + private ContainerInfo _selectedFolder; + public ContainerInfo SelectedFolder { get { @@ -93,13 +96,13 @@ namespace mRemoteNG.UI.Forms set { _selectedFolder = value; - lblSelectedFolder.Text = value == null ? string.Empty : value.Text; + lblSelectedFolder.Text = value?.Name; rdoExportSelectedFolder.Enabled = value != null; } } - private TreeNode _selectedConnection; - public TreeNode SelectedConnection + private ConnectionInfo _selectedConnection; + public ConnectionInfo SelectedConnection { get { @@ -108,7 +111,7 @@ namespace mRemoteNG.UI.Forms set { _selectedConnection = value; - lblSelectedConnection.Text = value == null ? string.Empty : value.Text; + lblSelectedConnection.Text = value?.Name; rdoExportSelectedConnection.Enabled = value != null; } } diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index dec60b992..b053c4a65 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -646,7 +646,7 @@ namespace mRemoteNG.UI.Forms private void mMenFileExport_Click(object sender, EventArgs e) { - Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); + Export.ExportToFile(Windows.treeForm.SelectedNode, Runtime.ConnectionTreeModel); } private void mMenFileExit_Click(object sender, EventArgs e) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index c10676c08..357723ee7 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -157,7 +157,7 @@ namespace mRemoteNG.UI.Window }; _contextMenu.ImportActiveDirectoryClicked += (sender, args) => Windows.Show(WindowType.ActiveDirectoryImport); _contextMenu.ImportPortScanClicked += (sender, args) => Windows.Show(WindowType.PortScan); - _contextMenu.ExportFileClicked += (sender, args) => Export.ExportToFile(Windows.treeForm.tvConnections.Nodes[0], Windows.treeForm.tvConnections.SelectedNode, Runtime.ConnectionTreeModel); + _contextMenu.ExportFileClicked += (sender, args) => Export.ExportToFile(SelectedNode, Runtime.ConnectionTreeModel); _contextMenu.AddConnectionClicked += cMenTreeAddConnection_Click; _contextMenu.AddFolderClicked += cMenTreeAddFolder_Click; _contextMenu.SortAscendingClicked += (sender, args) => SortNodes(ListSortDirection.Ascending); From 3febb2be5e778d19424ffa880151864fe8814841 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 12:53:42 -0600 Subject: [PATCH 253/338] Removed unused code --- mRemoteV1/Tree/TreeNodeMover.cs | 89 --------------------------------- mRemoteV1/mRemoteV1.csproj | 1 - 2 files changed, 90 deletions(-) delete mode 100644 mRemoteV1/Tree/TreeNodeMover.cs diff --git a/mRemoteV1/Tree/TreeNodeMover.cs b/mRemoteV1/Tree/TreeNodeMover.cs deleted file mode 100644 index 9655cc5b2..000000000 --- a/mRemoteV1/Tree/TreeNodeMover.cs +++ /dev/null @@ -1,89 +0,0 @@ -using mRemoteNG.App; -using mRemoteNG.Connection; -using mRemoteNG.Container; -using System.Windows.Forms; - -namespace mRemoteNG.Tree -{ - public class TreeNodeMover - { - TreeNode _nodeBeingMoved; - - public TreeNodeMover (TreeNode NodeBeingMoved) - { - _nodeBeingMoved = NodeBeingMoved; - } - - public void MoveNode(TreeNode TargetNode) - { - if (WeAreAllowedToMoveThisNode(TargetNode)) - { - RemoveNodeFromCurrentLocation(); - AddNodeToNewLocation(TargetNode); - UpdateParentReferences(); - SelectTheNewNode(); - Runtime.SaveConnectionsBG(); - } - } - - private bool WeAreAllowedToMoveThisNode(TreeNode targetNode) - { - bool weShouldMoveThisNode = true; - - if (_nodeBeingMoved == targetNode) - weShouldMoveThisNode = false; - if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved) == TreeNodeType.Root) - weShouldMoveThisNode = false; - if (_nodeBeingMoved == targetNode.Parent) - weShouldMoveThisNode = false; - - return weShouldMoveThisNode; - } - - private void RemoveNodeFromCurrentLocation() - { - _nodeBeingMoved.Remove(); - } - - private void AddNodeToNewLocation(TreeNode targetNode) - { - //If there is no targetNode add dropNode to the bottom of - //the TreeView root nodes, otherwise add it to the end of - //the dropNode child nodes - if (ConnectionTreeNode.GetNodeType(targetNode) == TreeNodeType.Root | ConnectionTreeNode.GetNodeType(targetNode) == TreeNodeType.Container) - targetNode.Nodes.Insert(0, _nodeBeingMoved); - else - targetNode.Parent.Nodes.Insert(targetNode.Index + 1, _nodeBeingMoved); - } - - private void UpdateParentReferences() - { - UpdateParentReferenceWhenParentIsAContainer(); - UpdateParentReferenceWhenParentIsRoot(); - } - - private void UpdateParentReferenceWhenParentIsAContainer() - { - if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved.Parent) == TreeNodeType.Container) - { - ((IHasParent)_nodeBeingMoved.Tag).SetParent((ContainerInfo)_nodeBeingMoved.Parent.Tag); - ((IInheritable)_nodeBeingMoved.Tag).Inheritance.EnableInheritance(); - } - } - - private void UpdateParentReferenceWhenParentIsRoot() - { - if (ConnectionTreeNode.GetNodeType(_nodeBeingMoved.Parent) == TreeNodeType.Root) - { - ((IHasParent) _nodeBeingMoved.Tag).SetParent(null); - ((IInheritable)_nodeBeingMoved.Tag).Inheritance.DisableInheritance(); - } - } - - private void SelectTheNewNode() - { - _nodeBeingMoved.EnsureVisible(); - _nodeBeingMoved.TreeView.SelectedNode = _nodeBeingMoved; - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 2ff3a0fee..3191005b3 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -208,7 +208,6 @@ - Component From 584075a9b19fadb218b69699ecd5377cf4ebd11b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 13:13:11 -0600 Subject: [PATCH 254/338] Fixed the connections dropdown list --- mRemoteV1/UI/Forms/frmMain.cs | 49 +++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index b053c4a65..7ff2a3e0d 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -7,6 +7,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; using System.Collections.Generic; +using System.Linq; using mRemoteNG.App; using mRemoteNG.Config; using mRemoteNG.Config.Putty; @@ -15,6 +16,7 @@ using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; using mRemoteNG.Messages; +using mRemoteNG.Root.PuttySessions; using mRemoteNG.Themes; using mRemoteNG.Tools; using mRemoteNG.Tree; @@ -964,36 +966,43 @@ namespace mRemoteNG.UI.Forms #region Connections DropDown private void btnConnections_DropDownOpening(object sender, EventArgs e) { - btnConnections.DropDownItems.Clear(); - foreach (TreeNode treeNode in Windows.treeForm.tvConnections.Nodes) + btnConnections.DropDownItems.Clear(); + var rootNodes = Runtime.ConnectionTreeModel.RootNodes; + foreach (var containerInfo in rootNodes) { - AddNodeToMenu(treeNode.Nodes, btnConnections); + AddNodeToMenu(containerInfo.Children, btnConnections); } } - private static void AddNodeToMenu(TreeNodeCollection treeNodeCollection, ToolStripDropDownItem toolStripMenuItem) + private static void AddNodeToMenu(IEnumerable nodes, ToolStripDropDownItem toolStripMenuItem) { try { - foreach (TreeNode treeNode in treeNodeCollection) + foreach (var connectionInfo in nodes) { var menuItem = new ToolStripMenuItem(); - menuItem.Text = treeNode.Text; - menuItem.Tag = treeNode; - - if (ConnectionTreeNode.GetNodeType(treeNode) == TreeNodeType.Container) + menuItem.Text = connectionInfo.Name; + menuItem.Tag = connectionInfo; + + var nodeAsContainer = connectionInfo as ContainerInfo; + if (nodeAsContainer != null) { menuItem.Image = Resources.Folder; - menuItem.Tag = treeNode.Tag; + menuItem.Tag = nodeAsContainer; toolStripMenuItem.DropDownItems.Add(menuItem); - AddNodeToMenu(treeNode.Nodes, menuItem); + AddNodeToMenu(nodeAsContainer.Children, menuItem); } - else if (ConnectionTreeNode.GetNodeType(treeNode) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(treeNode) == TreeNodeType.PuttySession) + else if (connectionInfo.GetTreeNodeType() == TreeNodeType.PuttySession) + { + menuItem.Image = Resources.PuttySessions; + menuItem.Tag = connectionInfo; + toolStripMenuItem.DropDownItems.Add(menuItem); + } + else if (connectionInfo.GetTreeNodeType() == TreeNodeType.Connection | connectionInfo.GetTreeNodeType() == TreeNodeType.PuttySession) { - menuItem.Image = Windows.treeForm.imgListTree.Images[treeNode.ImageIndex]; - menuItem.Tag = treeNode.Tag; - + menuItem.Image = Resources.Pause; + menuItem.Tag = connectionInfo; toolStripMenuItem.DropDownItems.Add(menuItem); } @@ -1263,9 +1272,9 @@ namespace mRemoteNG.UI.Forms tabController.SelectedIndex = newIndex; } #endif -#endregion + #endregion -#region Screen Stuff + #region Screen Stuff private void DisplayChanged(object sender, EventArgs e) { ResetSysMenuItems(); @@ -1291,9 +1300,9 @@ namespace mRemoteNG.UI.Forms _systemMenu.InsertMenuItem(_systemMenu.SystemMenuHandle, 0, SystemMenu.Flags.MF_POPUP | SystemMenu.Flags.MF_BYPOSITION, popMen, Language.strSendTo); _systemMenu.InsertMenuItem(_systemMenu.SystemMenuHandle, 1, SystemMenu.Flags.MF_BYPOSITION | SystemMenu.Flags.MF_SEPARATOR, IntPtr.Zero, null); } -#endregion + #endregion -#region Events + #region Events public delegate void clipboardchangeEventHandler(); public static event clipboardchangeEventHandler clipboardchange { @@ -1306,6 +1315,6 @@ namespace mRemoteNG.UI.Forms clipboardchangeEvent = (clipboardchangeEventHandler)Delegate.Remove(clipboardchangeEvent, value); } } -#endregion + #endregion } } From 0b97c47f4e0f69bc11d8b261322d2f3be6caba63 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 13:18:36 -0600 Subject: [PATCH 255/338] Removed unused code --- mRemoteV1/Tools/Tools.Controls.cs | 156 +++++++++--------------------- 1 file changed, 45 insertions(+), 111 deletions(-) diff --git a/mRemoteV1/Tools/Tools.Controls.cs b/mRemoteV1/Tools/Tools.Controls.cs index fcdac3baf..38eaa2fd4 100644 --- a/mRemoteV1/Tools/Tools.Controls.cs +++ b/mRemoteV1/Tools/Tools.Controls.cs @@ -9,52 +9,14 @@ namespace mRemoteNG.Tools { public class Controls { - public class ComboBoxItem - { - private string _Text; - public string Text - { - get { return this._Text; } - set { this._Text = value; } - } - - private object _Tag; - public object Tag - { - get - { - return this._Tag; - } - set - { - this._Tag = value; - } - } - - public ComboBoxItem(string Text, object Tag = null) - { - this._Text = Text; - if (Tag != null) - { - this._Tag = Tag; - } - } - - public override string ToString() - { - return this._Text; - } - } - public class NotificationAreaIcon { private NotifyIcon _nI; - private ContextMenuStrip _cMen; private ToolStripMenuItem _cMenCons; private ToolStripSeparator _cMenSep1; private ToolStripMenuItem _cMenExit; - + private bool _Disposed; public bool Disposed { @@ -67,75 +29,70 @@ namespace mRemoteNG.Tools _Disposed = value; } } - - - //Public Event MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) - //Public Event MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) - - + public NotificationAreaIcon() { try { - this._cMenCons = new ToolStripMenuItem(); - this._cMenCons.Text = Language.strConnections; - this._cMenCons.Image = Resources.Root; + _cMenCons = new ToolStripMenuItem(); + _cMenCons.Text = Language.strConnections; + _cMenCons.Image = Resources.Root; - this._cMenSep1 = new ToolStripSeparator(); + _cMenSep1 = new ToolStripSeparator(); - this._cMenExit = new ToolStripMenuItem(); - this._cMenExit.Text = Language.strMenuExit; - this._cMenExit.Click += cMenExit_Click; + _cMenExit = new ToolStripMenuItem(); + _cMenExit.Text = Language.strMenuExit; + _cMenExit.Click += cMenExit_Click; - this._cMen = new ContextMenuStrip(); - this._cMen.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0)); - this._cMen.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; - this._cMen.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this._cMenCons, this._cMenSep1, this._cMenExit}); + _cMen = new ContextMenuStrip(); + _cMen.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0)); + _cMen.RenderMode = ToolStripRenderMode.Professional; + _cMen.Items.AddRange(new ToolStripItem[] {_cMenCons, _cMenSep1, _cMenExit}); - this._nI = new NotifyIcon(); - this._nI.Text = "mRemote"; - this._nI.BalloonTipText = "mRemote"; - this._nI.Icon = Resources.mRemote_Icon; - this._nI.ContextMenuStrip = this._cMen; - this._nI.Visible = true; + _nI = new NotifyIcon(); + _nI.Text = "mRemote"; + _nI.BalloonTipText = "mRemote"; + _nI.Icon = Resources.mRemote_Icon; + _nI.ContextMenuStrip = _cMen; + _nI.Visible = true; - this._nI.MouseClick += nI_MouseClick; - this._nI.MouseDoubleClick += nI_MouseDoubleClick; + _nI.MouseClick += nI_MouseClick; + _nI.MouseDoubleClick += nI_MouseDoubleClick; } catch (Exception ex) { Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Creating new SysTrayIcon failed" + Environment.NewLine + ex.Message, true); } } - + public void Dispose() { try { - this._nI.Visible = false; - this._nI.Dispose(); - this._cMen.Dispose(); - this._Disposed = true; + _nI.Visible = false; + _nI.Dispose(); + _cMen.Dispose(); + _Disposed = true; } catch (Exception ex) { Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Disposing SysTrayIcon failed" + Environment.NewLine + ex.Message, true); } } - - private void nI_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) + + private void nI_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { - this._cMenCons.DropDownItems.Clear(); + _cMenCons.DropDownItems.Clear(); - foreach (TreeNode tNode in App.Windows.treeForm.tvConnections.Nodes) + foreach (TreeNode tNode in Windows.treeForm.tvConnections.Nodes) { - AddNodeToMenu(tNode.Nodes, this._cMenCons); + AddNodeToMenu(tNode.Nodes, _cMenCons); } } } - + private void AddNodeToMenu(TreeNodeCollection tnc, ToolStripMenuItem menToolStrip) { try @@ -170,8 +127,8 @@ namespace mRemoteNG.Tools Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddNodeToMenu failed" + Environment.NewLine + ex.Message, true); } } - - private void nI_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e) + + private void nI_MouseDoubleClick(object sender, MouseEventArgs e) { if (frmMain.Default.Visible == true) { @@ -182,41 +139,41 @@ namespace mRemoteNG.Tools ShowForm(); } } - + private void ShowForm() { frmMain.Default.Show(); frmMain.Default.WindowState = frmMain.Default.PreviousWindowState; - if (mRemoteNG.Settings.Default.ShowSystemTrayIcon == false) + if (Settings.Default.ShowSystemTrayIcon == false) { - App.Runtime.NotificationAreaIcon.Dispose(); - App.Runtime.NotificationAreaIcon = null; + Runtime.NotificationAreaIcon.Dispose(); + Runtime.NotificationAreaIcon = null; } } - + private void HideForm() { frmMain.Default.Hide(); frmMain.Default.PreviousWindowState = frmMain.Default.WindowState; } - - private void ConMenItem_MouseUp(System.Object sender, System.Windows.Forms.MouseEventArgs e) + + private void ConMenItem_MouseUp(Object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { - if (((System.Windows.Forms.Control)sender).Tag is Connection.ConnectionInfo) + if (((Control)sender).Tag is ConnectionInfo) { if (frmMain.Default.Visible == false) { ShowForm(); } - ConnectionInitiator.OpenConnection((mRemoteNG.Connection.ConnectionInfo)((System.Windows.Forms.Control)sender).Tag); + ConnectionInitiator.OpenConnection((ConnectionInfo)((Control)sender).Tag); } } } - - private void cMenExit_Click(System.Object sender, System.EventArgs e) + + private void cMenExit_Click(Object sender, EventArgs e) { Shutdown.Quit(); } @@ -235,19 +192,6 @@ namespace mRemoteNG.Tools return saveFileDialog; } - public static SaveFileDialog ConnectionsExportDialog() - { - SaveFileDialog saveFileDialog = new SaveFileDialog(); - saveFileDialog.CheckPathExists = true; - saveFileDialog.InitialDirectory = App.Info.ConnectionsFileInfo.DefaultConnectionsPath; - saveFileDialog.FileName = App.Info.ConnectionsFileInfo.DefaultConnectionsFile; - saveFileDialog.OverwritePrompt = true; - - saveFileDialog.Filter = Language.strFiltermRemoteXML + "|*.xml|" + Language.strFiltermRemoteCSV + "|*.csv|" + Language.strFiltervRD2008CSV + "|*.csv|" + Language.strFilterAll + "|*.*"; - - return saveFileDialog; - } - public static OpenFileDialog ConnectionsLoadDialog() { OpenFileDialog lDlg = new OpenFileDialog(); @@ -257,15 +201,5 @@ namespace mRemoteNG.Tools return lDlg; } - - public static OpenFileDialog ImportConnectionsRdpFileDialog() - { - OpenFileDialog openFileDialog = new OpenFileDialog(); - openFileDialog.CheckFileExists = true; - openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal); - openFileDialog.Filter = string.Join("|", new[] {Language.strFilterRDP, "*.rdp", Language.strFilterAll, "*.*"}); - openFileDialog.Multiselect = true; - return openFileDialog; - } } } \ No newline at end of file From eaced33ed5dc9ce3cff03580beb0e1e93ab24bfc Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 14:07:33 -0600 Subject: [PATCH 256/338] Refactored some code for creating a menu tree of the connectiontreemodel --- .../ConnectionsTreeToMenuItemsConverter.cs | 78 +++++++++++++++++++ mRemoteV1/Tools/Tools.Controls.cs | 57 +++----------- mRemoteV1/UI/Forms/frmMain.cs | 57 ++------------ mRemoteV1/mRemoteV1.csproj | 1 + 4 files changed, 99 insertions(+), 94 deletions(-) create mode 100644 mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs diff --git a/mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs b/mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs new file mode 100644 index 000000000..0fb2db78f --- /dev/null +++ b/mRemoteV1/Tools/ConnectionsTreeToMenuItemsConverter.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using mRemoteNG.App; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNG.Messages; +using mRemoteNG.Tree; + + +namespace mRemoteNG.Tools +{ + public class ConnectionsTreeToMenuItemsConverter + { + public MouseEventHandler MouseUpEventHandler { get; set; } + + + public IEnumerable CreateToolStripDropDownItems(ConnectionTreeModel connectionTreeModel) + { + var rootNodes = connectionTreeModel.RootNodes; + return CreateToolStripDropDownItems(rootNodes); + } + + public IEnumerable CreateToolStripDropDownItems(IEnumerable nodes) + { + var dropDownList = new List(); + try + { + dropDownList.AddRange(nodes.Select(CreateMenuItem)); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddExceptionMessage("frmMain.AddNodeToMenu() failed", ex, MessageClass.ErrorMsg, true); + } + return dropDownList; + } + + private void AddSubMenuNodes(IEnumerable nodes, ToolStripDropDownItem toolStripMenuItem) + { + foreach (var connectionInfo in nodes) + { + var newItem = CreateMenuItem(connectionInfo); + toolStripMenuItem.DropDownItems.Add(newItem); + } + } + + private ToolStripDropDownItem CreateMenuItem(ConnectionInfo node) + { + var menuItem = new ToolStripMenuItem + { + Text = node.Name, + Tag = node + }; + + var nodeAsContainer = node as ContainerInfo; + if (nodeAsContainer != null) + { + menuItem.Image = Resources.Folder; + menuItem.Tag = nodeAsContainer; + AddSubMenuNodes(nodeAsContainer.Children, menuItem); + } + else if (node.GetTreeNodeType() == TreeNodeType.PuttySession) + { + menuItem.Image = Resources.PuttySessions; + menuItem.Tag = node; + } + else if (node.GetTreeNodeType() == TreeNodeType.Connection) + { + menuItem.Image = Resources.Pause; + menuItem.Tag = node; + } + + menuItem.MouseUp += MouseUpEventHandler; + return menuItem; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Tools/Tools.Controls.cs b/mRemoteV1/Tools/Tools.Controls.cs index 38eaa2fd4..0eeebc794 100644 --- a/mRemoteV1/Tools/Tools.Controls.cs +++ b/mRemoteV1/Tools/Tools.Controls.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Windows.Forms; using mRemoteNG.App; using mRemoteNG.Connection; @@ -82,51 +84,16 @@ namespace mRemoteNG.Tools private void nI_MouseClick(object sender, MouseEventArgs e) { - if (e.Button == MouseButtons.Right) - { - _cMenCons.DropDownItems.Clear(); - - foreach (TreeNode tNode in Windows.treeForm.tvConnections.Nodes) - { - AddNodeToMenu(tNode.Nodes, _cMenCons); - } - } - } - - private void AddNodeToMenu(TreeNodeCollection tnc, ToolStripMenuItem menToolStrip) - { - try - { - foreach (TreeNode tNode in tnc) - { - ToolStripMenuItem tMenItem = new ToolStripMenuItem(); - tMenItem.Text = tNode.Text; - tMenItem.Tag = tNode; - - if (Tree.ConnectionTreeNode.GetNodeType(tNode) == Tree.TreeNodeType.Container) - { - tMenItem.Image = Resources.Folder; - tMenItem.Tag = tNode.Tag; - - menToolStrip.DropDownItems.Add(tMenItem); - AddNodeToMenu(tNode.Nodes, tMenItem); - } - else if (Tree.ConnectionTreeNode.GetNodeType(tNode) == Tree.TreeNodeType.Connection | Tree.ConnectionTreeNode.GetNodeType(tNode) == Tree.TreeNodeType.PuttySession) - { - tMenItem.Image = Windows.treeForm.imgListTree.Images[tNode.ImageIndex]; - tMenItem.Tag = tNode.Tag; - - menToolStrip.DropDownItems.Add(tMenItem); - } - - tMenItem.MouseUp += ConMenItem_MouseUp; - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddNodeToMenu failed" + Environment.NewLine + ex.Message, true); - } - } + if (e.Button != MouseButtons.Right) return; + _cMenCons.DropDownItems.Clear(); + var menuItemsConverter = new ConnectionsTreeToMenuItemsConverter + { + MouseUpEventHandler = ConMenItem_MouseUp + }; + + ToolStripItem[] rootMenuItems = menuItemsConverter.CreateToolStripDropDownItems(Runtime.ConnectionTreeModel).ToArray(); + _cMenCons.DropDownItems.AddRange(rootMenuItems); + } private void nI_MouseDoubleClick(object sender, MouseEventArgs e) { diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 7ff2a3e0d..dd43468ac 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -16,7 +16,6 @@ using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; using mRemoteNG.Messages; -using mRemoteNG.Root.PuttySessions; using mRemoteNG.Themes; using mRemoteNG.Tools; using mRemoteNG.Tree; @@ -128,7 +127,6 @@ namespace mRemoteNG.UI.Forms #endregion #region Startup & Shutdown - private void frmMain_Load(object sender, EventArgs e) { // Create gui config load and save objects @@ -966,55 +964,16 @@ namespace mRemoteNG.UI.Forms #region Connections DropDown private void btnConnections_DropDownOpening(object sender, EventArgs e) { - btnConnections.DropDownItems.Clear(); - var rootNodes = Runtime.ConnectionTreeModel.RootNodes; - foreach (var containerInfo in rootNodes) - { - AddNodeToMenu(containerInfo.Children, btnConnections); - } - } - - private static void AddNodeToMenu(IEnumerable nodes, ToolStripDropDownItem toolStripMenuItem) - { - try - { - foreach (var connectionInfo in nodes) - { - var menuItem = new ToolStripMenuItem(); - menuItem.Text = connectionInfo.Name; - menuItem.Tag = connectionInfo; + btnConnections.DropDownItems.Clear(); + var menuItemsConverter = new ConnectionsTreeToMenuItemsConverter + { + MouseUpEventHandler = ConnectionsMenuItem_MouseUp + }; - var nodeAsContainer = connectionInfo as ContainerInfo; - if (nodeAsContainer != null) - { - menuItem.Image = Resources.Folder; - menuItem.Tag = nodeAsContainer; - - toolStripMenuItem.DropDownItems.Add(menuItem); - AddNodeToMenu(nodeAsContainer.Children, menuItem); - } - else if (connectionInfo.GetTreeNodeType() == TreeNodeType.PuttySession) - { - menuItem.Image = Resources.PuttySessions; - menuItem.Tag = connectionInfo; - toolStripMenuItem.DropDownItems.Add(menuItem); - } - else if (connectionInfo.GetTreeNodeType() == TreeNodeType.Connection | connectionInfo.GetTreeNodeType() == TreeNodeType.PuttySession) - { - menuItem.Image = Resources.Pause; - menuItem.Tag = connectionInfo; - toolStripMenuItem.DropDownItems.Add(menuItem); - } - - menuItem.MouseUp += ConnectionsMenuItem_MouseUp; - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionMessage("frmMain.AddNodeToMenu() failed", ex, MessageClass.ErrorMsg, true); - } + ToolStripItem[] rootMenuItems = menuItemsConverter.CreateToolStripDropDownItems(Runtime.ConnectionTreeModel).ToArray(); + btnConnections.DropDownItems.AddRange(rootMenuItems); } - + private static void ConnectionsMenuItem_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 3191005b3..82bc8031d 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -199,6 +199,7 @@ + From 2540777e1842270cf1232869229e26099ce6a756 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 14:12:06 -0600 Subject: [PATCH 257/338] Removed unnecessary code --- .../Serializers/SqlConnectionsSerializer.cs | 454 ------------------ mRemoteV1/mRemoteV1.csproj | 1 - 2 files changed, 455 deletions(-) delete mode 100644 mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs diff --git a/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs deleted file mode 100644 index 47c0ea48d..000000000 --- a/mRemoteV1/Config/Serializers/SqlConnectionsSerializer.cs +++ /dev/null @@ -1,454 +0,0 @@ -using System; -using System.Data.SqlClient; -using System.Globalization; -using System.Security; -using System.Windows.Forms; -using mRemoteNG.App; -using mRemoteNG.App.Info; -using mRemoteNG.Connection; -using mRemoteNG.Container; -using mRemoteNG.Messages; -using mRemoteNG.Security; -using mRemoteNG.Security.SymmetricEncryption; -using mRemoteNG.Tools; -using mRemoteNG.Tree; -using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Config.Serializers -{ - public class SqlConnectionsSerializer : ISerializer - { - private SqlConnection _sqlConnection; - private SqlCommand _sqlQuery; - private SecureString _password = GeneralAppInfo.EncryptionKey; - private int _currentNodeIndex; - private string _parentConstantId = Convert.ToString(0); - - public string SqlHost { get; set; } - public string SqlDatabaseName { get; set; } - public string SqlUsername { get; set; } - public string SqlPassword { get; set; } - public TreeNode RootTreeNode { get; set; } - public Save SaveSecurity { get; set; } - public ConnectionList ConnectionList { get; set; } - public ContainerList ContainerList { get; set; } - public ConnectionTreeModel ConnectionTreeModel { get; set; } - - public string Serialize(ConnectionTreeModel connectionTreeModel) - { - throw new NotImplementedException(); - } - - public string Serialize(ConnectionInfo serializationTarget) - { - throw new NotImplementedException(); - } - - private bool VerifyDatabaseVersion(SqlConnection sqlConnection) - { - bool isVerified = false; - SqlDataReader sqlDataReader = null; - try - { - SqlCommand sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlConnection); - sqlDataReader = sqlCommand.ExecuteReader(); - if (!sqlDataReader.HasRows) - { - return true; // assume new empty database - } - sqlDataReader.Read(); - - var databaseVersion = new Version(Convert.ToString(sqlDataReader["confVersion"], CultureInfo.InvariantCulture)); - - sqlDataReader.Close(); - - if (databaseVersion.CompareTo(new Version(2, 2)) == 0) // 2.2 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.3")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 3); - } - - if (databaseVersion.CompareTo(new Version(2, 3)) == 0) // 2.3 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.4")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 4); - } - - if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, string.Format("Upgrading database from version {0} to version {1}.", databaseVersion, "2.5")); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlConnection); - sqlCommand.ExecuteNonQuery(); - databaseVersion = new Version(2, 5); - } - - if (databaseVersion.CompareTo(new Version(2, 5)) == 0) // 2.5 - { - isVerified = true; - } - - if (isVerified == false) - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, string.Format(Language.strErrorBadDatabaseVersion, databaseVersion, GeneralAppInfo.ProdName)); - } - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, string.Format(Language.strErrorVerifyDatabaseVersionFailed, ex.Message)); - } - finally - { - if (sqlDataReader != null) - { - if (!sqlDataReader.IsClosed) - { - sqlDataReader.Close(); - } - } - } - return isVerified; - } - - private void SaveToSQL() - { - if (SqlUsername != "") - { - _sqlConnection = new SqlConnection("Data Source=" + SqlHost + ";Initial Catalog=" + SqlDatabaseName + ";User Id=" + SqlUsername + ";Password=" + SqlPassword); - } - else - { - _sqlConnection = new SqlConnection("Data Source=" + SqlHost + ";Initial Catalog=" + SqlDatabaseName + ";Integrated Security=True"); - } - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - - _sqlConnection.Open(); - - if (!VerifyDatabaseVersion(_sqlConnection)) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strErrorConnectionListSaveFailed); - return; - } - - var tN = (TreeNode)RootTreeNode.Clone(); - - string strProtected; - if (tN.Tag != null) - { - if (((RootNodeInfo)tN.Tag).Password) - { - _password = Convert.ToString(((RootNodeInfo)tN.Tag).PasswordString).ConvertToSecureString(); - strProtected = cryptographyProvider.Encrypt("ThisIsProtected", _password); - } - else - { - strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); - } - } - else - { - strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); - } - - _sqlQuery = new SqlCommand("DELETE FROM tblRoot", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - _sqlQuery = new SqlCommand("INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" + MiscTools.PrepareValueForDB(tN.Text) + "\', 0, \'" + strProtected + "\'," + ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - _sqlQuery = new SqlCommand("DELETE FROM tblCons", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - TreeNodeCollection tNC = tN.Nodes; - - SaveNodesSQL(tNC); - - _sqlQuery = new SqlCommand("DELETE FROM tblUpdate", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - _sqlQuery = new SqlCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + MiscTools.DBDate(DateTime.Now) + "\')", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - - _sqlConnection.Close(); - } - - private void SaveNodesSQL(TreeNodeCollection tnc) - { - foreach (TreeNode node in tnc) - { - _currentNodeIndex++; - - ConnectionInfo curConI; - var sqlInsertStatement = - "INSERT INTO tblCons (Name, Type, Expanded, Description, Icon, Panel, Username, " + - "DomainName, Password, Hostname, Protocol, PuttySession, " + - "Port, ConnectToConsole, RenderingEngine, ICAEncryptionStrength, RDPAuthenticationLevel, LoadBalanceInfo, Colors, Resolution, AutomaticResize, DisplayWallpaper, " + - "DisplayThemes, EnableFontSmoothing, EnableDesktopComposition, CacheBitmaps, RedirectDiskDrives, RedirectPorts, " + - "RedirectPrinters, RedirectSmartCards, RedirectSound, RedirectKeys, " + - "Connected, PreExtApp, PostExtApp, MacAddress, UserField, ExtApp, VNCCompression, VNCEncoding, VNCAuthMode, " + - "VNCProxyType, VNCProxyIP, VNCProxyPort, VNCProxyUsername, VNCProxyPassword, " + - "VNCColors, VNCSmartSizeMode, VNCViewOnly, " + - "RDGatewayUsageMethod, RDGatewayHostname, RDGatewayUseConnectionCredentials, RDGatewayUsername, RDGatewayPassword, RDGatewayDomain, " + - "UseCredSsp, " + "InheritCacheBitmaps, InheritColors, " + - "InheritDescription, InheritDisplayThemes, InheritDisplayWallpaper, InheritEnableFontSmoothing, InheritEnableDesktopComposition, InheritDomain, " + - "InheritIcon, InheritPanel, InheritPassword, InheritPort, " + - "InheritProtocol, InheritPuttySession, InheritRedirectDiskDrives, " + - "InheritRedirectKeys, InheritRedirectPorts, InheritRedirectPrinters, " + - "InheritRedirectSmartCards, InheritRedirectSound, InheritResolution, InheritAutomaticResize, " + - "InheritUseConsoleSession, InheritRenderingEngine, InheritUsername, InheritICAEncryptionStrength, InheritRDPAuthenticationLevel, InheritLoadBalanceInfo, " + - "InheritPreExtApp, InheritPostExtApp, InheritMacAddress, InheritUserField, InheritExtApp, InheritVNCCompression, InheritVNCEncoding, " + - "InheritVNCAuthMode, InheritVNCProxyType, InheritVNCProxyIP, InheritVNCProxyPort, " + - "InheritVNCProxyUsername, InheritVNCProxyPassword, InheritVNCColors, " + - "InheritVNCSmartSizeMode, InheritVNCViewOnly, " + - "InheritRDGatewayUsageMethod, InheritRDGatewayHostname, InheritRDGatewayUseConnectionCredentials, InheritRDGatewayUsername, InheritRDGatewayPassword, InheritRDGatewayDomain, " - + "InheritUseCredSsp, " + "PositionID, ParentID, ConstantID, LastChange)" + "VALUES ("; - _sqlQuery = new SqlCommand(sqlInsertStatement, _sqlConnection); - - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) - { - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(node.Text) + "\',"; //Name - _sqlQuery.CommandText += "\'" + ConnectionTreeNode.GetNodeType(node) + "\',"; //Type - } - - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) //container - { - _sqlQuery.CommandText += "\'" + ContainerList[node.Tag].IsExpanded + "\',"; //Expanded - curConI = ContainerList[node.Tag]; - SerializeConnectionInfo(curConI); - - _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); - _sqlQuery.ExecuteNonQuery(); - //_parentConstantId = _currentNodeIndex - SaveNodesSQL(node.Nodes); - } - - if (ConnectionTreeNode.GetNodeType(node) != TreeNodeType.Connection) continue; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - curConI = ConnectionList[node.Tag]; - SerializeConnectionInfo(curConI); - _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); - _sqlQuery.ExecuteNonQuery(); - //_parentConstantId = 0 - } - } - - private void SerializeConnectionInfo(ConnectionInfo connectionInfo) - { - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Description) + "\',"; - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Icon) + "\',"; - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Panel) + "\',"; - - if (SaveSecurity.Username) - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Username) + "\',"; - else - _sqlQuery.CommandText += "\'" + "" + "\',"; - - if (SaveSecurity.Domain) - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Domain) + "\',"; - else - _sqlQuery.CommandText += "\'" + "" + "\',"; - - if (SaveSecurity.Password) - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(cryptographyProvider.Encrypt(connectionInfo.Password, _password)) + "\',"; - else - _sqlQuery.CommandText += "\'" + "" + "\',"; - - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.Hostname) + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Protocol + "\',"; - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(connectionInfo.PuttySession) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.Port) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.UseConsoleSession) + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.RenderingEngine + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.ICAEncryptionStrength + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.RDPAuthenticationLevel + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.LoadBalanceInfo + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Colors + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Resolution + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.AutomaticResize) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.DisplayWallpaper) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.DisplayThemes) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.EnableFontSmoothing) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.EnableDesktopComposition) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.CacheBitmaps) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectDiskDrives) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectPorts) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectPrinters) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectSmartCards) + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.RedirectSound + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.RedirectKeys) + "\',"; - - if (connectionInfo.OpenConnections.Count > 0) - _sqlQuery.CommandText += 1 + ","; - else - _sqlQuery.CommandText += 0 + ","; - - _sqlQuery.CommandText += "\'" + connectionInfo.PreExtApp + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.PostExtApp + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.MacAddress + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.UserField + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.ExtApp + "\',"; - - _sqlQuery.CommandText += "\'" + connectionInfo.VNCCompression + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.VNCEncoding + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.VNCAuthMode + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.VNCProxyType + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.VNCProxyIP + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.VNCProxyPort) + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.VNCProxyUsername + "\',"; - _sqlQuery.CommandText += "\'" + cryptographyProvider.Encrypt(connectionInfo.VNCProxyPassword, _password) + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.VNCColors + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.VNCSmartSizeMode + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.VNCViewOnly) + "\',"; - - _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayUsageMethod + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayHostname + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayUseConnectionCredentials + "\',"; - - if (SaveSecurity.Username) - _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayUsername + "\',"; - else - _sqlQuery.CommandText += "\'" + "" + "\',"; - - if (SaveSecurity.Password) - _sqlQuery.CommandText += "\'" + cryptographyProvider.Encrypt(connectionInfo.RDGatewayPassword, _password) + "\',"; - else - _sqlQuery.CommandText += "\'" + "" + "\',"; - - if (SaveSecurity.Domain) - _sqlQuery.CommandText += "\'" + connectionInfo.RDGatewayDomain + "\',"; - else - _sqlQuery.CommandText += "\'" + "" + "\',"; - - _sqlQuery.CommandText += "\'" + Convert.ToString(connectionInfo.UseCredSsp) + "\',"; - - if (SaveSecurity.Inheritance) - { - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.CacheBitmaps + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Colors + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Description + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.DisplayThemes + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.DisplayWallpaper + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.EnableFontSmoothing + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.EnableDesktopComposition + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Domain + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Icon + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Panel + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Password + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Port + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Protocol + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.PuttySession + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectDiskDrives + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectKeys + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectPorts + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectPrinters + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectSmartCards + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RedirectSound + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Resolution + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.AutomaticResize + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.UseConsoleSession + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RenderingEngine + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.Username + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.ICAEncryptionStrength + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDPAuthenticationLevel + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.LoadBalanceInfo + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.PreExtApp + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.PostExtApp + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.MacAddress + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.UserField + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.ExtApp + "\',"; - - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCCompression + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCEncoding + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCAuthMode + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyType + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyIP + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyPort + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyUsername + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCProxyPassword + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCColors + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCSmartSizeMode + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.VNCViewOnly + "\',"; - - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayUsageMethod + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayHostname + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayUseConnectionCredentials + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayUsername + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayPassword + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.RDGatewayDomain + "\',"; - _sqlQuery.CommandText += "\'" + connectionInfo.Inheritance.UseCredSsp + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; // .AutomaticResize - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; // .LoadBalanceInfo - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - _sqlQuery.CommandText += "\'" + false + "\',"; - - _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayUsageMethod - _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayHostname - _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayUseConnectionCredentials - _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayUsername - _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayPassword - _sqlQuery.CommandText += "\'" + false + "\',"; // .RDGatewayDomain - _sqlQuery.CommandText += "\'" + false + "\',"; // .UseCredSsp - } - - connectionInfo.PositionID = _currentNodeIndex; - - if (connectionInfo.IsContainer == false) - { - _parentConstantId = connectionInfo.Parent != null ? connectionInfo.Parent.ConstantID : "0"; - } - else - { - _parentConstantId = connectionInfo.Parent.Parent != null ? connectionInfo.Parent.Parent.ConstantID : "0"; - } - - _sqlQuery.CommandText += _currentNodeIndex + ",\'" + _parentConstantId + "\',\'" + connectionInfo.ConstantID + "\',\'" + MiscTools.DBDate(DateTime.Now) + "\')"; - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 82bc8031d..a70ce597d 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -136,7 +136,6 @@ - From 0bdb57c44ed928e796ea1893933c085c91757a91 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 14:47:41 -0600 Subject: [PATCH 258/338] Removed reference to unnecessary method --- mRemoteV1/Config/Serializers/DataTableSerializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Serializers/DataTableSerializer.cs b/mRemoteV1/Config/Serializers/DataTableSerializer.cs index 9252b45f1..189c5f950 100644 --- a/mRemoteV1/Config/Serializers/DataTableSerializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableSerializer.cs @@ -173,7 +173,7 @@ namespace mRemoteNG.Config.Serializers _currentNodeIndex++; var dataRow = _dataTable.NewRow(); dataRow["Name"] = connectionInfo.Name; - dataRow["Type"] = ConnectionTreeNode.GetNodeType(connectionInfo.TreeNode).ToString(); + dataRow["Type"] = connectionInfo.GetTreeNodeType().ToString(); dataRow["ConstantID"] = connectionInfo.ConstantID; dataRow["ParentID"] = connectionInfo.Parent.ConstantID; dataRow["PositionID"] = _currentNodeIndex; From 634c4207995dbf4755588e35598a5c14349181b1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 14:49:16 -0600 Subject: [PATCH 259/338] Refactored the SqlSaver code to use the new functions --- .../Config/Connections/ConnectionsSaver.cs | 393 ++---------------- 1 file changed, 41 insertions(+), 352 deletions(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 407ccfb1a..b2fc305f0 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -3,6 +3,7 @@ using System.Data.SqlClient; using System.Drawing; using System.Globalization; using System.IO; +using System.Linq; using System.Security; using System.Text; using System.Windows.Forms; @@ -42,10 +43,7 @@ namespace mRemoteNG.Config.Connections #region Private Properties private XmlTextWriter _xmlTextWriter; private SecureString _password = GeneralAppInfo.EncryptionKey; - - private SqlConnection _sqlConnection; - private SqlCommand _sqlQuery; - + private int _currentNodeIndex; private string _parentConstantId = Convert.ToString(0); #endregion @@ -98,38 +96,31 @@ namespace mRemoteNG.Config.Connections #region SQL private void SaveToSql() { - OpenDatabaseConnection(); - if (!VerifyDatabaseVersion(_sqlConnection)) + var sqlConnector = new SqlDatabaseConnector(); + sqlConnector.Connect(); + + if (!VerifyDatabaseVersion(sqlConnector)) { Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strErrorConnectionListSaveFailed); return ; } - var rootTreeNode = (TreeNode)RootTreeNode.Clone(); + var rootTreeNode = Runtime.ConnectionTreeModel.RootNodes.OfType().First(); - UpdateRootNodeTable(rootTreeNode); - UpdateConnectionsTable(rootTreeNode); - UpdateUpdatesTable(); + UpdateRootNodeTable(rootTreeNode, sqlConnector); + UpdateConnectionsTable(rootTreeNode, sqlConnector); + UpdateUpdatesTable(sqlConnector); - _sqlConnection.Close(); + sqlConnector.Disconnect(); + sqlConnector.Dispose(); } - private void OpenDatabaseConnection() - { - var sqlConnectionString = "Data Source=" + SQLHost + ";Initial Catalog=" + SQLDatabaseName; - sqlConnectionString += SQLUsername != "" - ? ";User Id=" + SQLUsername + ";Password=" + SQLPassword - : ";Integrated Security=True"; - _sqlConnection = new SqlConnection(sqlConnectionString); - _sqlConnection.Open(); - } - - private bool VerifyDatabaseVersion(SqlConnection sqlConnection) + private bool VerifyDatabaseVersion(SqlDatabaseConnector sqlDatabaseConnector) { var isVerified = false; try { - var databaseVersion = GetDatabaseVersion(sqlConnection); + var databaseVersion = GetDatabaseVersion(sqlDatabaseConnector); SqlCommand sqlCommand; if (databaseVersion.Equals(new Version())) @@ -140,7 +131,7 @@ namespace mRemoteNG.Config.Connections if (databaseVersion.CompareTo(new Version(2, 2)) == 0) // 2.2 { Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.3."); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD EnableFontSmoothing bit NOT NULL DEFAULT 0, EnableDesktopComposition bit NOT NULL DEFAULT 0, InheritEnableFontSmoothing bit NOT NULL DEFAULT 0, InheritEnableDesktopComposition bit NOT NULL DEFAULT 0;", sqlDatabaseConnector.SqlConnection); sqlCommand.ExecuteNonQuery(); databaseVersion = new Version(2, 3); } @@ -148,7 +139,7 @@ namespace mRemoteNG.Config.Connections if (databaseVersion.CompareTo(new Version(2, 3)) == 0) // 2.3 { Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.4."); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD UseCredSsp bit NOT NULL DEFAULT 1, InheritUseCredSsp bit NOT NULL DEFAULT 0;", sqlDatabaseConnector.SqlConnection); sqlCommand.ExecuteNonQuery(); databaseVersion = new Version(2, 4); } @@ -156,7 +147,7 @@ namespace mRemoteNG.Config.Connections if (databaseVersion.CompareTo(new Version(2, 4)) == 0) // 2.4 { Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Upgrading database from version {databaseVersion} to version 2.5."); - sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlConnection); + sqlCommand = new SqlCommand("ALTER TABLE tblCons ADD LoadBalanceInfo varchar (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, AutomaticResize bit NOT NULL DEFAULT 1, InheritLoadBalanceInfo bit NOT NULL DEFAULT 0, InheritAutomaticResize bit NOT NULL DEFAULT 0;", sqlDatabaseConnector.SqlConnection); sqlCommand.ExecuteNonQuery(); databaseVersion = new Version(2, 5); } @@ -174,13 +165,13 @@ namespace mRemoteNG.Config.Connections return isVerified; } - private Version GetDatabaseVersion(SqlConnection sqlConnection) + private Version GetDatabaseVersion(SqlDatabaseConnector sqlDatabaseConnector) { Version databaseVersion; SqlDataReader sqlDataReader = null; try { - var sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlConnection); + var sqlCommand = new SqlCommand("SELECT * FROM tblRoot", sqlDatabaseConnector.SqlConnection); sqlDataReader = sqlCommand.ExecuteReader(); if (!sqlDataReader.HasRows) return new Version(); // assume new empty database @@ -201,15 +192,15 @@ namespace mRemoteNG.Config.Connections return databaseVersion; } - private void UpdateRootNodeTable(TreeNode rootTreeNode) + private void UpdateRootNodeTable(RootNodeInfo rootTreeNode, SqlDatabaseConnector sqlDatabaseConnector) { var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); string strProtected; - if (rootTreeNode.Tag != null) + if (rootTreeNode != null) { - if (((RootNodeInfo)rootTreeNode.Tag).Password) + if (rootTreeNode.Password) { - _password = Convert.ToString(((RootNodeInfo)rootTreeNode.Tag).PasswordString).ConvertToSecureString(); + _password = Convert.ToString(rootTreeNode.PasswordString).ConvertToSecureString(); strProtected = cryptographyProvider.Encrypt("ThisIsProtected", _password); } else @@ -222,332 +213,30 @@ namespace mRemoteNG.Config.Connections strProtected = cryptographyProvider.Encrypt("ThisIsNotProtected", _password); } - _sqlQuery = new SqlCommand("DELETE FROM tblRoot", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); + var sqlQuery = new SqlCommand("DELETE FROM tblRoot", sqlDatabaseConnector.SqlConnection); + sqlQuery.ExecuteNonQuery(); - _sqlQuery = new SqlCommand("INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" + MiscTools.PrepareValueForDB(rootTreeNode.Text) + "\', 0, \'" + strProtected + "\'," + ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); + sqlQuery = new SqlCommand("INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" + MiscTools.PrepareValueForDB(rootTreeNode.Name) + "\', 0, \'" + strProtected + "\'," + ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")", sqlDatabaseConnector.SqlConnection); + sqlQuery.ExecuteNonQuery(); } - private void UpdateConnectionsTable(TreeNode rootTreeNode) + private void UpdateConnectionsTable(ContainerInfo rootTreeNode, SqlDatabaseConnector sqlDatabaseConnector) { - _sqlQuery = new SqlCommand("DELETE FROM tblCons", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - var treeNodeCollection = rootTreeNode.Nodes; - SaveNodesRecursiveSql(treeNodeCollection); + var sqlQuery = new SqlCommand("DELETE FROM tblCons", sqlDatabaseConnector.SqlConnection); + sqlQuery.ExecuteNonQuery(); + var serializer = new DataTableSerializer(SaveSecurity); + var dataTable = serializer.Serialize(rootTreeNode); + var dataProvider = new SqlDataProvider(sqlDatabaseConnector); + dataProvider.Save(dataTable); } - private void UpdateUpdatesTable() + private void UpdateUpdatesTable(SqlDatabaseConnector sqlDatabaseConnector) { - _sqlQuery = new SqlCommand("DELETE FROM tblUpdate", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); - _sqlQuery = new SqlCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + MiscTools.DBDate(DateTime.Now) + "\')", _sqlConnection); - _sqlQuery.ExecuteNonQuery(); + var sqlQuery = new SqlCommand("DELETE FROM tblUpdate", sqlDatabaseConnector.SqlConnection); + sqlQuery.ExecuteNonQuery(); + sqlQuery = new SqlCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + MiscTools.DBDate(DateTime.Now) + "\')", sqlDatabaseConnector.SqlConnection); + sqlQuery.ExecuteNonQuery(); } - - private void SaveNodesRecursiveSql(TreeNodeCollection tnc) - { - foreach (TreeNode node in tnc) - { - _currentNodeIndex++; - - ConnectionInfo curConI; - _sqlQuery = new SqlCommand("INSERT INTO tblCons (Name, Type, Expanded, Description, Icon, Panel, Username, " + "DomainName, Password, Hostname, Protocol, PuttySession, " + "Port, ConnectToConsole, RenderingEngine, ICAEncryptionStrength, RDPAuthenticationLevel, LoadBalanceInfo, Colors, Resolution, AutomaticResize, DisplayWallpaper, " + "DisplayThemes, EnableFontSmoothing, EnableDesktopComposition, CacheBitmaps, RedirectDiskDrives, RedirectPorts, " + "RedirectPrinters, RedirectSmartCards, RedirectSound, RedirectKeys, " + "Connected, PreExtApp, PostExtApp, MacAddress, UserField, ExtApp, VNCCompression, VNCEncoding, VNCAuthMode, " + "VNCProxyType, VNCProxyIP, VNCProxyPort, VNCProxyUsername, VNCProxyPassword, " + "VNCColors, VNCSmartSizeMode, VNCViewOnly, " + "RDGatewayUsageMethod, RDGatewayHostname, RDGatewayUseConnectionCredentials, RDGatewayUsername, RDGatewayPassword, RDGatewayDomain, " + "UseCredSsp, " + "InheritCacheBitmaps, InheritColors, " + "InheritDescription, InheritDisplayThemes, InheritDisplayWallpaper, InheritEnableFontSmoothing, InheritEnableDesktopComposition, InheritDomain, " + "InheritIcon, InheritPanel, InheritPassword, InheritPort, " + "InheritProtocol, InheritPuttySession, InheritRedirectDiskDrives, " + "InheritRedirectKeys, InheritRedirectPorts, InheritRedirectPrinters, " + "InheritRedirectSmartCards, InheritRedirectSound, InheritResolution, InheritAutomaticResize, " + "InheritUseConsoleSession, InheritRenderingEngine, InheritUsername, InheritICAEncryptionStrength, InheritRDPAuthenticationLevel, InheritLoadBalanceInfo, " + "InheritPreExtApp, InheritPostExtApp, InheritMacAddress, InheritUserField, InheritExtApp, InheritVNCCompression, InheritVNCEncoding, " + "InheritVNCAuthMode, InheritVNCProxyType, InheritVNCProxyIP, InheritVNCProxyPort, " + "InheritVNCProxyUsername, InheritVNCProxyPassword, InheritVNCColors, " + "InheritVNCSmartSizeMode, InheritVNCViewOnly, " + "InheritRDGatewayUsageMethod, InheritRDGatewayHostname, InheritRDGatewayUseConnectionCredentials, InheritRDGatewayUsername, InheritRDGatewayPassword, InheritRDGatewayDomain, " - + "InheritUseCredSsp, " + "PositionID, ParentID, ConstantID, LastChange)" + "VALUES (", _sqlConnection - ); - - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection | ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) - { - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(node.Text) + "\',"; //Name - _sqlQuery.CommandText += "\'" + ConnectionTreeNode.GetNodeType(node) + "\',"; //Type - } - - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Container) //container - { - _sqlQuery.CommandText += "\'" + ContainerList[node.Tag].IsExpanded + "\',"; //Expanded - curConI = ContainerList[node.Tag]; - SaveConnectionFieldsSql(curConI); - - _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); - _sqlQuery.ExecuteNonQuery(); - //_parentConstantId = _currentNodeIndex - SaveNodesRecursiveSql(node.Nodes); - } - - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection) - { - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - curConI = ConnectionList[node.Tag]; - SaveConnectionFieldsSql(curConI); - _sqlQuery.CommandText = MiscTools.PrepareForDB(_sqlQuery.CommandText); - _sqlQuery.ExecuteNonQuery(); - } - - //_parentConstantId = 0 - } - } - - private void SaveConnectionFieldsSql(ConnectionInfo curConI) - { - var cryptographyProvider = new LegacyRijndaelCryptographyProvider(); - ConnectionInfo with_1 = curConI; - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(with_1.Description) + "\',"; - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(with_1.Icon) + "\',"; - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(with_1.Panel) + "\',"; - - if (SaveSecurity.Username) - { - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(with_1.Username) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - if (SaveSecurity.Domain) - { - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(with_1.Domain) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - if (SaveSecurity.Password) - { - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(cryptographyProvider.Encrypt(with_1.Password, _password)) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(with_1.Hostname) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.Protocol + "\',"; - _sqlQuery.CommandText += "\'" + MiscTools.PrepareValueForDB(with_1.PuttySession) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Port) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.UseConsoleSession) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RenderingEngine + "\',"; - _sqlQuery.CommandText += "\'" + with_1.ICAEncryptionStrength + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RDPAuthenticationLevel + "\',"; - _sqlQuery.CommandText += "\'" + with_1.LoadBalanceInfo + "\',"; - _sqlQuery.CommandText += "\'" + with_1.Colors + "\',"; - _sqlQuery.CommandText += "\'" + with_1.Resolution + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.AutomaticResize) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.DisplayWallpaper) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.DisplayThemes) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.EnableFontSmoothing) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.EnableDesktopComposition) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.CacheBitmaps) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.RedirectDiskDrives) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.RedirectPorts) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.RedirectPrinters) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.RedirectSmartCards) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RedirectSound + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.RedirectKeys) + "\',"; - - if (curConI.OpenConnections.Count > 0) - { - _sqlQuery.CommandText += 1 + ","; - } - else - { - _sqlQuery.CommandText += 0 + ","; - } - - _sqlQuery.CommandText += "\'" + with_1.PreExtApp + "\',"; - _sqlQuery.CommandText += "\'" + with_1.PostExtApp + "\',"; - _sqlQuery.CommandText += "\'" + with_1.MacAddress + "\',"; - _sqlQuery.CommandText += "\'" + with_1.UserField + "\',"; - _sqlQuery.CommandText += "\'" + with_1.ExtApp + "\',"; - - _sqlQuery.CommandText += "\'" + with_1.VNCCompression + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCEncoding + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCAuthMode + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCProxyType + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCProxyIP + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.VNCProxyPort) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCProxyUsername + "\',"; - _sqlQuery.CommandText += "\'" + cryptographyProvider.Encrypt(with_1.VNCProxyPassword, _password) + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCColors + "\',"; - _sqlQuery.CommandText += "\'" + with_1.VNCSmartSizeMode + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.VNCViewOnly) + "\',"; - - _sqlQuery.CommandText += "\'" + with_1.RDGatewayUsageMethod + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RDGatewayHostname + "\',"; - _sqlQuery.CommandText += "\'" + with_1.RDGatewayUseConnectionCredentials + "\',"; - - if (SaveSecurity.Username) - { - _sqlQuery.CommandText += "\'" + with_1.RDGatewayUsername + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - if (SaveSecurity.Password) - { - _sqlQuery.CommandText += "\'" + cryptographyProvider.Encrypt(with_1.RDGatewayPassword, _password) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - if (SaveSecurity.Domain) - { - _sqlQuery.CommandText += "\'" + with_1.RDGatewayDomain + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + "" + "\',"; - } - - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.UseCredSsp) + "\',"; - - if (SaveSecurity.Inheritance) - { - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.CacheBitmaps) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Colors) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Description) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.DisplayThemes) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.DisplayWallpaper) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.EnableFontSmoothing) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.EnableDesktopComposition) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Domain) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Icon) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Panel) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Password) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Port) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Protocol) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.PuttySession) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RedirectDiskDrives) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RedirectKeys) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RedirectPorts) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RedirectPrinters) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RedirectSmartCards) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RedirectSound) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Resolution) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.AutomaticResize) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.UseConsoleSession) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RenderingEngine) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.Username) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.ICAEncryptionStrength) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RDPAuthenticationLevel) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.LoadBalanceInfo) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.PreExtApp) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.PostExtApp) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.MacAddress) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.UserField) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.ExtApp) + "\',"; - - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCCompression) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCEncoding) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCAuthMode) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCProxyType) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCProxyIP) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCProxyPort) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCProxyUsername) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCProxyPassword) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCColors) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCSmartSizeMode) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.VNCViewOnly) + "\',"; - - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RDGatewayUsageMethod) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RDGatewayHostname) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RDGatewayUseConnectionCredentials) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RDGatewayUsername) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RDGatewayPassword) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.RDGatewayDomain) + "\',"; - - _sqlQuery.CommandText += "\'" + Convert.ToString(with_1.Inheritance.UseCredSsp) + "\',"; - } - else - { - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .AutomaticResize - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .LoadBalanceInfo - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; - - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .RDGatewayUsageMethod - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .RDGatewayHostname - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .RDGatewayUseConnectionCredentials - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .RDGatewayUsername - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .RDGatewayPassword - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .RDGatewayDomain - - _sqlQuery.CommandText += "\'" + Convert.ToString(false) + "\',"; // .UseCredSsp - } - - with_1.PositionID = _currentNodeIndex; - - if (with_1.IsContainer == false) - { - if (with_1.Parent != null) - { - _parentConstantId = Convert.ToString(with_1.Parent.ConstantID); - } - else - { - _parentConstantId = Convert.ToString(0); - } - } - else - { - if (with_1.Parent.Parent != null) - { - _parentConstantId = Convert.ToString(with_1.Parent.Parent.ConstantID); - } - else - { - _parentConstantId = Convert.ToString(0); - } - } - - _sqlQuery.CommandText += _currentNodeIndex + ",\'" + _parentConstantId + "\',\'" + with_1.ConstantID + "\',\'" + MiscTools.DBDate(DateTime.Now) + "\')"; - } #endregion private void EncryptCompleteFile() @@ -603,7 +292,7 @@ namespace mRemoteNG.Config.Connections } #region vRD VRE - // What export format is this? What does vRD VRE mean? + // .VRE files are for ASG-Remote Desktop (prevously visionapp Remote Desktop) private void SaveToVRE() { if (Runtime.IsConnectionsFileLoaded == false) @@ -637,7 +326,7 @@ namespace mRemoteNG.Config.Connections { foreach (TreeNode node in tNC) { - if (ConnectionTreeNode.GetNodeType(node) == TreeNodeType.Connection) + if (((ConnectionInfo)node.Tag).GetTreeNodeType() == TreeNodeType.Connection) { ConnectionInfo curConI = (ConnectionInfo)node.Tag; From 0c460f7aab7d7ffeb8774ca6baae0d3643c47b46 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 14:49:32 -0600 Subject: [PATCH 260/338] Removed unused code --- mRemoteV1/Tree/ConnectionTreeNode.cs | 40 ---------------------------- mRemoteV1/mRemoteV1.csproj | 1 - 2 files changed, 41 deletions(-) delete mode 100644 mRemoteV1/Tree/ConnectionTreeNode.cs diff --git a/mRemoteV1/Tree/ConnectionTreeNode.cs b/mRemoteV1/Tree/ConnectionTreeNode.cs deleted file mode 100644 index 9fd0da454..000000000 --- a/mRemoteV1/Tree/ConnectionTreeNode.cs +++ /dev/null @@ -1,40 +0,0 @@ -using mRemoteNG.App; -using mRemoteNG.Connection; -using mRemoteNG.Container; -using System; -using System.Windows.Forms; -using mRemoteNG.Messages; -using mRemoteNG.Root.PuttySessions; -using mRemoteNG.Tree.Root; - -namespace mRemoteNG.Tree -{ - public static class ConnectionTreeNode - { - public static TreeNodeType GetNodeType(TreeNode treeNode) - { - try - { - if (treeNode?.Tag == null) - return TreeNodeType.None; - - if (treeNode.Tag is RootPuttySessionsNodeInfo) - return TreeNodeType.PuttyRoot; - if (treeNode.Tag is RootNodeInfo) - return TreeNodeType.Root; - if (treeNode.Tag is ContainerInfo) - return TreeNodeType.Container; - if (treeNode.Tag is PuttySessionInfo) - return TreeNodeType.PuttySession; - if (treeNode.Tag is ConnectionInfo) - return TreeNodeType.Connection; - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Couldn\'t get node type" + Environment.NewLine + ex.Message, true); - } - - return TreeNodeType.None; - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index a70ce597d..3e5b37955 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -392,7 +392,6 @@ - Component From bd280ad2b648d303e99b24fe72438d20eecbcd3f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 14:53:32 -0600 Subject: [PATCH 261/338] Removed unused code --- .../UI/ConnectionTreeViewBuilderTests.cs | 195 ------------------ mRemoteNGTests/mRemoteNGTests.csproj | 1 - mRemoteV1/Tree/TreeImageType.cs | 11 - mRemoteV1/UI/ConnectionTreeViewBuilder.cs | 88 -------- mRemoteV1/mRemoteV1.csproj | 2 - 5 files changed, 297 deletions(-) delete mode 100644 mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs delete mode 100644 mRemoteV1/Tree/TreeImageType.cs delete mode 100644 mRemoteV1/UI/ConnectionTreeViewBuilder.cs diff --git a/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs b/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs deleted file mode 100644 index a9e7de669..000000000 --- a/mRemoteNGTests/UI/ConnectionTreeViewBuilderTests.cs +++ /dev/null @@ -1,195 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; -using mRemoteNG.Connection; -using mRemoteNG.Container; -using mRemoteNG.Tree; -using mRemoteNG.Tree.Root; -using mRemoteNG.UI; -using NUnit.Framework; - - -namespace mRemoteNGTests.UI -{ - public class ConnectionTreeViewBuilderTests - { - private ConnectionTreeModel _connectionTreeModel; - private ConnectionTreeViewBuilder _connectionTreeViewBuilder; - - [SetUp] - public void Setup() - { - _connectionTreeModel = new ConnectionTreeModel(); - _connectionTreeViewBuilder = new ConnectionTreeViewBuilder(_connectionTreeModel); - } - - [TearDown] - public void Teardown() - { - _connectionTreeModel = null; - _connectionTreeViewBuilder = null; - } - - [Test] - public void RootNodeGetsAddedToTreeView() - { - CreateRootNode(); - _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.RootNode; - Assert.That(rootTreeNode, Is.Not.Null); - } - - [Test] - public void BuildTreeWithSingleConnection() - { - /** - * Root - * -- con1 - */ - var root = CreateRootNode(); - var con1 = new ConnectionInfo(); - root.AddChild(con1); - _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.RootNode; - Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(con1)); - } - - [Test] - public void BuildTreeWithSingleFolder() - { - /** - * Root - * -- folder1 - */ - var root = CreateRootNode(); - var folder1 = new ContainerInfo(); - root.AddChild(folder1); - _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.RootNode; - Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); - } - - [Test] - public void BuildTreeWithTwoConnectionsUnderRoot() - { - /** - * Root - * -- con1 - * -- con2 - */ - var root = CreateRootNode(); - var con1 = new ConnectionInfo(); - var con2 = new ConnectionInfo(); - root.AddChildRange(new []{con1, con2}); - _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.RootNode; - Assert.That(GetTreeNodeTags(rootTreeNode.Nodes), Is.EquivalentTo(new[] { con1, con2 })); - } - - [Test] - public void BuildTreeWithConnectionInFolder() - { - /* - * Root - * -- folder1 - * ---- con1 - */ - var root = CreateRootNode(); - var folder1 = new ContainerInfo(); - var con1 = new ConnectionInfo(); - root.AddChild(folder1); - folder1.AddChild(con1); - _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.RootNode; - Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); - Assert.That(rootTreeNode.Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); - } - - [Test] - public void BuildTreeWithTwoFoldersAndFolderOneHasAConnection() - { - /** - * Root - * -- folder1 - * ---- con1 - * -- folder2 - */ - var root = CreateRootNode(); - var folder1 = new ContainerInfo(); - var con1 = new ConnectionInfo(); - var folder2 = new ContainerInfo(); - root.AddChild(folder1); - folder1.AddChild(con1); - root.AddChild(folder2); - _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.RootNode; - Assert.That(rootTreeNode.Nodes[0].Tag, Is.EqualTo(folder1)); - Assert.That(rootTreeNode.Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); - Assert.That(rootTreeNode.Nodes[1].Tag, Is.EqualTo(folder2)); - } - - [Test] - public void BuildTreeWithConnectionNestedTwoLevelsDeep() - { - /** - * Root - * -- folder1 - * ---- folder2 - * ------ con1 - */ - var root = CreateRootNode(); - var folder1 = new ContainerInfo(); - var folder2 = new ContainerInfo(); - var con1 = new ConnectionInfo(); - root.AddChild(folder1); - folder1.AddChild(folder2); - folder2.AddChild(con1); - _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.RootNode; - Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); - } - - [Test] - public void BuildTreeWithMultipleDeepRecursion() - { - /** - * Root - * -- folder1 - * ---- folder2 - * ------ con1 - * -- folder3 - * ---- folder4 - * ------ con2 - */ - var root = CreateRootNode(); - var folder1 = new ContainerInfo(); - var folder2 = new ContainerInfo(); - var con1 = new ConnectionInfo(); - var folder3 = new ContainerInfo(); - var folder4 = new ContainerInfo(); - var con2 = new ConnectionInfo(); - root.AddChild(folder1); - folder1.AddChild(folder2); - folder2.AddChild(con1); - root.AddChild(folder3); - folder3.AddChild(folder4); - folder4.AddChild(con2); - _connectionTreeViewBuilder.Build(); - var rootTreeNode = _connectionTreeViewBuilder.RootNode; - Assert.That(rootTreeNode.Nodes[0].Nodes[0].Nodes[0].Tag, Is.EqualTo(con1)); - Assert.That(rootTreeNode.Nodes[1].Nodes[0].Nodes[0].Tag, Is.EqualTo(con2)); - } - - private IEnumerable GetTreeNodeTags(TreeNodeCollection treeNodes) - { - return (from TreeNode node in treeNodes select (ConnectionInfo) node.Tag).ToList(); - } - - private RootNodeInfo CreateRootNode() - { - var root = new RootNodeInfo(RootNodeType.Connection); - _connectionTreeModel.AddRootNode(root); - return root; - } - } -} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index d1910f750..8a07545b9 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -136,7 +136,6 @@ - Form diff --git a/mRemoteV1/Tree/TreeImageType.cs b/mRemoteV1/Tree/TreeImageType.cs deleted file mode 100644 index 19beba369..000000000 --- a/mRemoteV1/Tree/TreeImageType.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace mRemoteNG.Tree -{ - public enum TreeImageType - { - Root = 0, - Container = 1, - ConnectionOpen = 2, - ConnectionClosed = 3, - PuttySessions = 4 - } -} \ No newline at end of file diff --git a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs b/mRemoteV1/UI/ConnectionTreeViewBuilder.cs deleted file mode 100644 index 60f21e7f7..000000000 --- a/mRemoteV1/UI/ConnectionTreeViewBuilder.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.Linq; -using System.Windows.Forms; -using mRemoteNG.Connection; -using mRemoteNG.Container; -using mRemoteNG.Tree; -using mRemoteNG.Tree.Root; - - -namespace mRemoteNG.UI -{ - public class ConnectionTreeViewBuilder - { - private readonly ConnectionTreeModel _connectionTreeModel; - - public TreeNode RootNode { get; private set; } - public ConnectionList ConnectionList { get; set; } - public ContainerList ContainerList { get; set; } - - public ConnectionTreeViewBuilder(ConnectionTreeModel connectionTreeModel) - { - _connectionTreeModel = connectionTreeModel; - ConnectionList = new ConnectionList(); - ContainerList = new ContainerList(); - } - - public void AppendTo(TreeView foreignTreeView) - { - foreignTreeView.BeginUpdate(); - foreignTreeView.Nodes.Add(RootNode); - foreignTreeView.EndUpdate(); - } - - public void Build() - { - var rootNodeInfo = _connectionTreeModel.RootNodes.First(a => a is RootNodeInfo); - InitRootNode((RootNodeInfo)rootNodeInfo); - BuildTreeViewFromConnectionTree(rootNodeInfo, RootNode); - } - - private void InitRootNode(RootNodeInfo rootNodeInfo) - { - RootNode = new TreeNode(rootNodeInfo.Name) - { - Name = rootNodeInfo.Name, - Tag = rootNodeInfo - }; - RootNode.Expand(); - } - - private void BuildTreeViewFromConnectionTree(ContainerInfo parentContainer, TreeNode parentTreeNode) - { - if (!parentContainer.Children.Any()) return; - foreach (var child in parentContainer.Children) - { - var treeNode = new TreeNode(child.Name) {Name = child.Name}; - parentTreeNode.Nodes.Add(treeNode); - - if (child is ContainerInfo) - { - AddContainerToList((ContainerInfo) child, treeNode); - BuildTreeViewFromConnectionTree((ContainerInfo)child, treeNode); - } - else - { - AddConnectionToList(child, treeNode); - } - } - } - - private void AddConnectionToList(ConnectionInfo connectionInfo, TreeNode treeNode) - { - connectionInfo.TreeNode = treeNode; - ConnectionList.Add(connectionInfo); - treeNode.Tag = connectionInfo; - treeNode.ImageIndex = (int)TreeImageType.ConnectionClosed; - treeNode.SelectedImageIndex = (int)TreeImageType.ConnectionClosed; - } - - private void AddContainerToList(ContainerInfo containerInfo, TreeNode treeNode) - { - containerInfo.TreeNode = treeNode; - ContainerList.Add(containerInfo); - treeNode.Tag = containerInfo; - treeNode.ImageIndex = (int)TreeImageType.Container; - treeNode.SelectedImageIndex = (int)TreeImageType.Container; - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 3e5b37955..f92cb1e8d 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -208,7 +208,6 @@ - Component @@ -348,7 +347,6 @@ Form - True True From a1b5d8bdc5f97b0b2bc0ee6c494a7403e5cee7f8 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 14:59:14 -0600 Subject: [PATCH 262/338] Removed unused code --- mRemoteV1/Tools/MiscTools.cs | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/mRemoteV1/Tools/MiscTools.cs b/mRemoteV1/Tools/MiscTools.cs index 9e9d9799e..5961a017d 100644 --- a/mRemoteV1/Tools/MiscTools.cs +++ b/mRemoteV1/Tools/MiscTools.cs @@ -67,24 +67,7 @@ namespace mRemoteNG.Tools return strDate; } - public static string PrepareForDB(string Text) - { - return ReplaceBooleanStringsWithNumbers(Text); - } - private static string ReplaceBooleanStringsWithNumbers(string Text) - { - Text = ReplaceTrueWith1(Text); - Text = ReplaceFalseWith0(Text); - return Text; - } - private static string ReplaceTrueWith1(string Text) - { - return Text.Replace("'True'", "1"); - } - private static string ReplaceFalseWith0(string Text) - { - return Text.Replace("'False'", "0"); - } + public static string PrepareValueForDB(string Text) { return Text.Replace("\'", "\'\'"); From 5462e960905c784670fc1e966bde817b53cbf930 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 15:02:12 -0600 Subject: [PATCH 263/338] Removed unused code --- mRemoteV1/Tools/Sorting/TreeNodeSorter.cs | 32 ----------------------- mRemoteV1/mRemoteV1.csproj | 1 - 2 files changed, 33 deletions(-) delete mode 100644 mRemoteV1/Tools/Sorting/TreeNodeSorter.cs diff --git a/mRemoteV1/Tools/Sorting/TreeNodeSorter.cs b/mRemoteV1/Tools/Sorting/TreeNodeSorter.cs deleted file mode 100644 index 946bdec49..000000000 --- a/mRemoteV1/Tools/Sorting/TreeNodeSorter.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections; -using System.Windows.Forms; - -namespace mRemoteNG.Tools.Sorting -{ - public class TreeNodeSorter : IComparer - { - public SortOrder Sorting { get; set; } - - public TreeNodeSorter(SortOrder sortOrder = SortOrder.None) - { - Sorting = sortOrder; - } - - public int Compare(object x, object y) - { - TreeNode tx = (TreeNode)x; - TreeNode ty = (TreeNode)y; - - switch (Sorting) - { - case SortOrder.Ascending: - return String.CompareOrdinal(tx.Text, ty.Text); - case SortOrder.Descending: - return String.CompareOrdinal(ty.Text, tx.Text); - default: - return 0; - } - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index f92cb1e8d..707d07253 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -202,7 +202,6 @@ - From 288221918e030a0f02abca4544337b003a3d8747 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 15:07:59 -0600 Subject: [PATCH 264/338] ContainerList serves no purpose --- mRemoteV1/App/Runtime.cs | 9 +-- .../Config/Connections/ConnectionsSaver.cs | 2 - .../Serializers/XmlConnectionsDeserializer.cs | 3 - .../Serializers/XmlConnectionsSerializer.cs | 1 - mRemoteV1/Container/ContainerList.cs | 75 ------------------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 1 - mRemoteV1/mRemoteV1.csproj | 1 - 7 files changed, 1 insertion(+), 91 deletions(-) delete mode 100644 mRemoteV1/Container/ContainerList.cs diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index f4cff7931..0dbc29373 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -34,8 +34,6 @@ namespace mRemoteNG.App #region Public Properties public static ConnectionList ConnectionList { get; set; } private static ConnectionList PreviousConnectionList { get; set; } - public static ContainerList ContainerList { get; set; } - private static ContainerList PreviousContainerList { get; set; } public static CredentialList CredentialList { get; set; } public static CredentialList PreviousCredentialList { get; set; } public static WindowList WindowList { get; set; } @@ -204,7 +202,6 @@ namespace mRemoteNG.App try { ConnectionList = new ConnectionList(); - ContainerList = new ContainerList(); ConnectionsLoader connectionsLoader = new ConnectionsLoader(); if (filename == GetDefaultStartupConnectionFileName()) @@ -279,14 +276,12 @@ namespace mRemoteNG.App // disable sql update checking while we are loading updates SQLConnProvider?.Disable(); - if (ConnectionList != null && ContainerList != null) + if (ConnectionList != null) { PreviousConnectionList = ConnectionList.Copy(); - PreviousContainerList = ContainerList.Copy(); } ConnectionList = new ConnectionList(); - ContainerList = new ContainerList(); if (!Settings.Default.UseSQLServer) { @@ -478,7 +473,6 @@ namespace mRemoteNG.App connectionsSaver.ConnectionFileName = GetStartupConnectionFileName(); connectionsSaver.ConnectionList = ConnectionList; - connectionsSaver.ContainerList = ContainerList; connectionsSaver.Export = false; connectionsSaver.SaveSecurity = new Security.Save(false); connectionsSaver.ConnectionTreeModel = ConnectionTreeModel; @@ -537,7 +531,6 @@ namespace mRemoteNG.App connectionsSave.Export = false; connectionsSave.SaveSecurity = new Security.Save(); connectionsSave.ConnectionList = ConnectionList; - connectionsSave.ContainerList = ContainerList; connectionsSave.ConnectionTreeModel = ConnectionTreeModel; connectionsSave.SaveConnections(); diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index b2fc305f0..44c5c8bae 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -60,7 +60,6 @@ namespace mRemoteNG.Config.Connections public Format SaveFormat {get; set;} public Save SaveSecurity {get; set;} public ConnectionList ConnectionList {get; set;} - public ContainerList ContainerList {get; set;} public ConnectionTreeModel ConnectionTreeModel { get; set; } #endregion @@ -260,7 +259,6 @@ namespace mRemoteNG.Config.Connections var xmlConnectionsSerializer = new XmlConnectionsSerializer() { ConnectionList = ConnectionList, - ContainerList = ContainerList, Export = Export, SaveSecurity = SaveSecurity }; diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs index cfc17144b..c21f66a46 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs @@ -32,14 +32,12 @@ namespace mRemoteNG.Config.Serializers private string ConnectionFileName = ""; public ConnectionList ConnectionList { get; set; } - public ContainerList ContainerList { get; set; } public XmlConnectionsDeserializer(string xml) { LoadXmlConnectionData(xml); ValidateConnectionFileVersion(); ConnectionList = new ConnectionList(); - ContainerList = new ContainerList(); } private void LoadXmlConnectionData(string connections) @@ -154,7 +152,6 @@ namespace mRemoteNG.Config.Serializers containerInfo.IsExpanded = xmlNode.Attributes?["Expanded"].Value == "True"; parentContainer.AddChild(containerInfo); - ContainerList.Add(containerInfo); AddNodesFromXmlRecursive(xmlNode, containerInfo); } } diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs index 39afb7443..61303696c 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs @@ -25,7 +25,6 @@ namespace mRemoteNG.Config.Serializers public bool Export { get; set; } public Save SaveSecurity { get; set; } public ConnectionList ConnectionList { get; set; } - public ContainerList ContainerList { get; set; } public string Serialize(ConnectionTreeModel connectionTreeModel) diff --git a/mRemoteV1/Container/ContainerList.cs b/mRemoteV1/Container/ContainerList.cs deleted file mode 100644 index ac021387d..000000000 --- a/mRemoteV1/Container/ContainerList.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections; - - -namespace mRemoteNG.Container -{ - public class ContainerList : CollectionBase - { - public ContainerInfo this[object Index] - { - get - { - if (Index is ContainerInfo) - return (ContainerInfo)Index; - else - return ((ContainerInfo) (List[Convert.ToInt32(Index)])); - } - } - - public new int Count - { - get { return List.Count; } - } - - public ContainerList() : base() - { } - - #region Public Methods - public ContainerInfo Add(ContainerInfo containerInfo) - { - this.List.Add(containerInfo); - return containerInfo; - } - - public void AddRange(ContainerInfo[] cInfo) - { - foreach (ContainerInfo containerInfo in cInfo) - { - List.Add(containerInfo); - } - } - - public ContainerInfo FindByConstantID(string id) - { - foreach (ContainerInfo containerInfo in List) - { - if (containerInfo.ConstantID == id) - { - return containerInfo; - } - } - - return null; - } - - public ContainerList Copy() - { - try - { - return (ContainerList)this.MemberwiseClone(); - } - catch (Exception) - { - } - - return null; - } - - public new void Clear() - { - this.List.Clear(); - } - #endregion - } -} diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 357723ee7..d23265a8c 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -521,7 +521,6 @@ namespace mRemoteNG.UI.Window var newContainerInfo = new ContainerInfo(); var selectedContainer = SelectedNode as ContainerInfo; newContainerInfo.SetParent(selectedContainer ?? SelectedNode.Parent); - Runtime.ContainerList.Add(newContainerInfo); } catch (Exception ex) { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 707d07253..0ab7545e6 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -325,7 +325,6 @@ - From fa7ca994e9ddcaf6aee566ea32312d867404651c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 15:10:32 -0600 Subject: [PATCH 265/338] ConnectionList served no purpose and was removed --- mRemoteV1/App/Runtime.cs | 12 ---- .../Config/Connections/ConnectionsSaver.cs | 2 - .../ActiveDirectoryDeserializer.cs | 1 - .../Serializers/XmlConnectionsDeserializer.cs | 3 - .../Serializers/XmlConnectionsSerializer.cs | 1 - mRemoteV1/Connection/ConnectionList.cs | 68 ------------------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 1 - mRemoteV1/mRemoteV1.csproj | 1 - 8 files changed, 89 deletions(-) delete mode 100644 mRemoteV1/Connection/ConnectionList.cs diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 0dbc29373..77842392d 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -32,8 +32,6 @@ namespace mRemoteNG.App public static class Runtime { #region Public Properties - public static ConnectionList ConnectionList { get; set; } - private static ConnectionList PreviousConnectionList { get; set; } public static CredentialList CredentialList { get; set; } public static CredentialList PreviousCredentialList { get; set; } public static WindowList WindowList { get; set; } @@ -201,7 +199,6 @@ namespace mRemoteNG.App { try { - ConnectionList = new ConnectionList(); ConnectionsLoader connectionsLoader = new ConnectionsLoader(); if (filename == GetDefaultStartupConnectionFileName()) @@ -276,13 +273,6 @@ namespace mRemoteNG.App // disable sql update checking while we are loading updates SQLConnProvider?.Disable(); - if (ConnectionList != null) - { - PreviousConnectionList = ConnectionList.Copy(); - } - - ConnectionList = new ConnectionList(); - if (!Settings.Default.UseSQLServer) { if (withDialog) @@ -472,7 +462,6 @@ namespace mRemoteNG.App if (!Settings.Default.UseSQLServer) connectionsSaver.ConnectionFileName = GetStartupConnectionFileName(); - connectionsSaver.ConnectionList = ConnectionList; connectionsSaver.Export = false; connectionsSaver.SaveSecurity = new Security.Save(false); connectionsSaver.ConnectionTreeModel = ConnectionTreeModel; @@ -530,7 +519,6 @@ namespace mRemoteNG.App connectionsSave.ConnectionFileName = saveFileDialog.FileName; connectionsSave.Export = false; connectionsSave.SaveSecurity = new Security.Save(); - connectionsSave.ConnectionList = ConnectionList; connectionsSave.ConnectionTreeModel = ConnectionTreeModel; connectionsSave.SaveConnections(); diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 44c5c8bae..8cfe3cca7 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -59,7 +59,6 @@ namespace mRemoteNG.Config.Connections public bool Export {get; set;} public Format SaveFormat {get; set;} public Save SaveSecurity {get; set;} - public ConnectionList ConnectionList {get; set;} public ConnectionTreeModel ConnectionTreeModel { get; set; } #endregion @@ -258,7 +257,6 @@ namespace mRemoteNG.Config.Connections { var xmlConnectionsSerializer = new XmlConnectionsSerializer() { - ConnectionList = ConnectionList, Export = Export, SaveSecurity = SaveSecurity }; diff --git a/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs b/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs index f97dd5d0e..417eed3e0 100644 --- a/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs +++ b/mRemoteV1/Config/Serializers/ActiveDirectoryDeserializer.cs @@ -83,7 +83,6 @@ namespace mRemoteNG.Config.Serializers newConnectionInfo.Inheritance.Description = false; parentContainer.AddChild(newConnectionInfo); - Runtime.ConnectionList.Add(newConnectionInfo); } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs index c21f66a46..9a80fd5a6 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs @@ -31,13 +31,11 @@ namespace mRemoteNG.Config.Serializers //TODO find way to inject data source info private string ConnectionFileName = ""; - public ConnectionList ConnectionList { get; set; } public XmlConnectionsDeserializer(string xml) { LoadXmlConnectionData(xml); ValidateConnectionFileVersion(); - ConnectionList = new ConnectionList(); } private void LoadXmlConnectionData(string connections) @@ -140,7 +138,6 @@ namespace mRemoteNG.Config.Serializers { var connectionInfo = GetConnectionInfoFromXml(xmlNode); parentContainer.AddChild(connectionInfo); - ConnectionList.Add(connectionInfo); } else if (nodeType == TreeNodeType.Container) { diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs index 61303696c..e4483bd11 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsSerializer.cs @@ -24,7 +24,6 @@ namespace mRemoteNG.Config.Serializers public bool Export { get; set; } public Save SaveSecurity { get; set; } - public ConnectionList ConnectionList { get; set; } public string Serialize(ConnectionTreeModel connectionTreeModel) diff --git a/mRemoteV1/Connection/ConnectionList.cs b/mRemoteV1/Connection/ConnectionList.cs deleted file mode 100644 index fb8329d4b..000000000 --- a/mRemoteV1/Connection/ConnectionList.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections; - - -namespace mRemoteNG.Connection -{ - public class ConnectionList : CollectionBase - { - public ConnectionInfo this[object Index] - { - get - { - if (Index is ConnectionInfo) - return (ConnectionInfo)Index; - else - return ((ConnectionInfo) (List[Convert.ToInt32(Index)])); - } - } - - public new int Count - { - get { return List.Count; } - } - - public ConnectionInfo Add(ConnectionInfo connectionInfo) - { - List.Add(connectionInfo); - return connectionInfo; - } - - public void AddRange(ConnectionInfo[] connectionInfoArray) - { - foreach (ConnectionInfo connectionInfo in connectionInfoArray) - { - List.Add(connectionInfo); - } - } - - public ConnectionInfo FindByConstantID(string id) - { - foreach (ConnectionInfo connectionInfo in List) - { - if (connectionInfo.ConstantID == id) - return connectionInfo; - } - - return null; - } - - public ConnectionList Copy() - { - try - { - return (ConnectionList)MemberwiseClone(); - } - catch (Exception) - { - } - - return null; - } - - public new void Clear() - { - List.Clear(); - } - } -} \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index d23265a8c..c8544385e 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -506,7 +506,6 @@ namespace mRemoteNG.UI.Window var newConnectionInfo = new ConnectionInfo(); var selectedContainer = SelectedNode as ContainerInfo; newConnectionInfo.SetParent(selectedContainer ?? SelectedNode.Parent); - Runtime.ConnectionList.Add(newConnectionInfo); } catch (Exception ex) { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 0ab7545e6..82afbe5cc 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -304,7 +304,6 @@ Component - From 0832c8610bcca7fb12ad1f52b55f87d90b5f5938 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 15:17:26 -0600 Subject: [PATCH 266/338] Removed unused code --- mRemoteV1/App/Runtime.cs | 66 ---------------------------------------- 1 file changed, 66 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 77842392d..3820503b0 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -32,8 +32,6 @@ namespace mRemoteNG.App public static class Runtime { #region Public Properties - public static CredentialList CredentialList { get; set; } - public static CredentialList PreviousCredentialList { get; set; } public static WindowList WindowList { get; set; } public static MessageCollector MessageCollector { get; set; } public static Tools.Controls.NotificationAreaIcon NotificationAreaIcon { get; set; } @@ -41,8 +39,6 @@ namespace mRemoteNG.App public static SqlConnectionsProvider SQLConnProvider { get; set; } public static DateTime LastSqlUpdate { get; set; } public static string LastSelected { get; set; } - public static ConnectionInfo DefaultConnection { get; set; } = DefaultConnectionInfo.Instance; - public static ConnectionInfoInheritance DefaultInheritance { get; set; } public static ArrayList ExternalTools { get; set; } = new ArrayList(); public static ConnectionTreeModel ConnectionTreeModel { get; set; } #endregion @@ -651,68 +647,6 @@ namespace mRemoteNG.App } } - public static bool SaveReport() - { - StreamReader streamReader = null; - StreamWriter streamWriter = null; - try - { - streamReader = new StreamReader(SettingsFileInfo.exePath + "\\Report.log"); - string text = streamReader.ReadToEnd(); - streamReader.Close(); - streamWriter = new StreamWriter(GeneralAppInfo.ReportingFilePath, true); - streamWriter.Write(text); - return true; - } - catch (Exception ex) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strLogWriteToFileFinalLocationFailed + Environment.NewLine + ex.Message, true); - return false; - } - finally - { - if (streamReader != null) - { - streamReader.Close(); - streamReader.Dispose(); - } - if (streamWriter != null) - { - streamWriter.Close(); - streamWriter.Dispose(); - } - } - } - - private static InterfaceControl FindConnectionContainer(ConnectionInfo connectionInfo) - { - if (connectionInfo.OpenConnections.Count > 0) - { - for (int i = 0; i <= WindowList.Count - 1; i++) - { - if (WindowList[i] is ConnectionWindow) - { - ConnectionWindow connectionWindow = (ConnectionWindow)WindowList[i]; - if (connectionWindow.TabController != null) - { - foreach (TabPage t in connectionWindow.TabController.TabPages) - { - if (t.Controls[0] != null && t.Controls[0] is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)t.Controls[0]; - if (IC.Info == connectionInfo) - { - return IC; - } - } - } - } - } - } - } - return null; - } - // Override the font of all controls in a container with the default font based on the OS version public static void FontOverride(Control ctlParent) { From faec28ac78e07864c3d33d5933c70162c32ddeaa Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 15:25:18 -0600 Subject: [PATCH 267/338] Removed unused code --- mRemoteV1/App/Runtime.cs | 17 ----------------- mRemoteV1/App/Windows.cs | 30 +++++++++++++++--------------- 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 3820503b0..597691eff 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -2,8 +2,6 @@ using mRemoteNG.App.Info; using mRemoteNG.Config.Connections; using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; -using mRemoteNG.Container; -using mRemoteNG.Credential; using mRemoteNG.Messages; using mRemoteNG.Tools; using mRemoteNG.Tree; @@ -24,7 +22,6 @@ using mRemoteNG.UI.Forms.Input; using mRemoteNG.UI.TaskDialog; using WeifenLuo.WinFormsUI.Docking; using static System.IO.Path; -using TabPage = Crownwood.Magic.Controls.TabPage; namespace mRemoteNG.App @@ -633,20 +630,6 @@ namespace mRemoteNG.App GoToURL(GeneralAppInfo.UrlBugs); } - public static void Report(string Text) - { - try - { - StreamWriter sWr = new StreamWriter(SettingsFileInfo.exePath + "\\Report.log", true); - sWr.WriteLine(Text); - sWr.Close(); - } - catch (Exception) - { - MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strLogWriteToFileFailed); - } - } - // Override the font of all controls in a container with the default font based on the OS version public static void FontOverride(Control ctlParent) { diff --git a/mRemoteV1/App/Windows.cs b/mRemoteV1/App/Windows.cs index 6ac63de3f..4294fef28 100644 --- a/mRemoteV1/App/Windows.cs +++ b/mRemoteV1/App/Windows.cs @@ -7,21 +7,8 @@ namespace mRemoteNG.App { public static class Windows { - public static ConnectionTreeWindow treeForm; - public static DockContent treePanel = new DockContent(); - public static ConfigWindow configForm; - public static DockContent configPanel = new DockContent(); - public static ErrorAndInfoWindow errorsForm; - public static DockContent errorsPanel = new DockContent(); - public static ScreenshotManagerWindow screenshotForm; - public static DockContent screenshotPanel = new DockContent(); - public static ExportForm exportForm; - public static DockContent exportPanel = new DockContent(); private static AboutWindow aboutForm; private static DockContent aboutPanel = new DockContent(); - public static UpdateWindow updateForm; - public static DockContent updatePanel = new DockContent(); - public static SSHTransferWindow sshtransferForm; private static DockContent sshtransferPanel = new DockContent(); private static ActiveDirectoryImportWindow adimportForm; private static DockContent adimportPanel = new DockContent(); @@ -35,9 +22,22 @@ namespace mRemoteNG.App private static DockContent ultravncscPanel = new DockContent(); private static ComponentsCheckWindow componentscheckForm; private static DockContent componentscheckPanel = new DockContent(); - public static AnnouncementWindow AnnouncementForm; - public static DockContent AnnouncementPanel = new DockContent(); + public static ConnectionTreeWindow treeForm { get; set; } + public static DockContent treePanel { get; set; } = new DockContent(); + public static ConfigWindow configForm { get; set; } + public static DockContent configPanel { get; set; } = new DockContent(); + public static ErrorAndInfoWindow errorsForm { get; set; } + public static DockContent errorsPanel { get; set; } = new DockContent(); + public static ScreenshotManagerWindow screenshotForm { get; set; } + public static DockContent screenshotPanel { get; set; } = new DockContent(); + public static AnnouncementWindow AnnouncementForm { get; set; } + public static DockContent AnnouncementPanel { get; set; } = new DockContent(); + public static UpdateWindow updateForm { get; set; } + public static DockContent updatePanel { get; set; } = new DockContent(); + public static SSHTransferWindow sshtransferForm { get; set; } + + public static void Show(WindowType windowType) { try From 967d9b1036850fdef3f532deb2c7b0fdb1cd7a13 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 26 Sep 2016 15:27:41 -0600 Subject: [PATCH 268/338] Renamed properties and fields of the Windows class to conform to naming guidelines --- mRemoteV1/App/Startup.cs | 8 +- mRemoteV1/App/Windows.cs | 120 +++++++++--------- .../Config/Settings/LayoutSettingsLoader.cs | 34 ++--- mRemoteV1/UI/Forms/frmMain.cs | 42 +++--- .../UI/Window/ActiveDirectoryImportWindow.cs | 4 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 12 +- mRemoteV1/UI/Window/ConnectionWindow.cs | 10 +- mRemoteV1/UI/Window/ErrorAndInfoWindow.cs | 2 +- mRemoteV1/UI/Window/PortScanWindow.cs | 2 +- 9 files changed, 117 insertions(+), 117 deletions(-) diff --git a/mRemoteV1/App/Startup.cs b/mRemoteV1/App/Startup.cs index d25ca947f..f5ae5a5ae 100644 --- a/mRemoteV1/App/Startup.cs +++ b/mRemoteV1/App/Startup.cs @@ -62,11 +62,11 @@ namespace mRemoteNG.App frmMain.Default.pnlDock.DockTopPortion = frmMain.Default.pnlDock.Height * 0.25; frmMain.Default.pnlDock.DockBottomPortion = frmMain.Default.pnlDock.Height * 0.25; - Windows.treePanel.Show(frmMain.Default.pnlDock, DockState.DockLeft); - Windows.configPanel.Show(frmMain.Default.pnlDock); - Windows.configPanel.DockTo(Windows.treePanel.Pane, DockStyle.Bottom, -1); + Windows.TreePanel.Show(frmMain.Default.pnlDock, DockState.DockLeft); + Windows.ConfigPanel.Show(frmMain.Default.pnlDock); + Windows.ConfigPanel.DockTo(Windows.TreePanel.Pane, DockStyle.Bottom, -1); - Windows.screenshotForm.Hide(); + Windows.ScreenshotForm.Hide(); frmMain.Default.pnlDock.Visible = true; } diff --git a/mRemoteV1/App/Windows.cs b/mRemoteV1/App/Windows.cs index 4294fef28..98934b967 100644 --- a/mRemoteV1/App/Windows.cs +++ b/mRemoteV1/App/Windows.cs @@ -7,35 +7,35 @@ namespace mRemoteNG.App { public static class Windows { - private static AboutWindow aboutForm; - private static DockContent aboutPanel = new DockContent(); - private static DockContent sshtransferPanel = new DockContent(); - private static ActiveDirectoryImportWindow adimportForm; - private static DockContent adimportPanel = new DockContent(); - private static HelpWindow helpForm; - private static DockContent helpPanel = new DockContent(); - private static ExternalToolsWindow externalappsForm; - private static DockContent externalappsPanel = new DockContent(); - private static PortScanWindow portscanForm; - private static DockContent portscanPanel = new DockContent(); - private static UltraVNCWindow ultravncscForm; - private static DockContent ultravncscPanel = new DockContent(); - private static ComponentsCheckWindow componentscheckForm; - private static DockContent componentscheckPanel = new DockContent(); + private static AboutWindow _aboutForm; + private static DockContent _aboutPanel = new DockContent(); + private static DockContent _sshtransferPanel = new DockContent(); + private static ActiveDirectoryImportWindow _adimportForm; + private static DockContent _adimportPanel = new DockContent(); + private static HelpWindow _helpForm; + private static DockContent _helpPanel = new DockContent(); + private static ExternalToolsWindow _externalappsForm; + private static DockContent _externalappsPanel = new DockContent(); + private static PortScanWindow _portscanForm; + private static DockContent _portscanPanel = new DockContent(); + private static UltraVNCWindow _ultravncscForm; + private static DockContent _ultravncscPanel = new DockContent(); + private static ComponentsCheckWindow _componentscheckForm; + private static DockContent _componentscheckPanel = new DockContent(); - public static ConnectionTreeWindow treeForm { get; set; } - public static DockContent treePanel { get; set; } = new DockContent(); - public static ConfigWindow configForm { get; set; } - public static DockContent configPanel { get; set; } = new DockContent(); - public static ErrorAndInfoWindow errorsForm { get; set; } - public static DockContent errorsPanel { get; set; } = new DockContent(); - public static ScreenshotManagerWindow screenshotForm { get; set; } - public static DockContent screenshotPanel { get; set; } = new DockContent(); + public static ConnectionTreeWindow TreeForm { get; set; } + public static DockContent TreePanel { get; set; } = new DockContent(); + public static ConfigWindow ConfigForm { get; set; } + public static DockContent ConfigPanel { get; set; } = new DockContent(); + public static ErrorAndInfoWindow ErrorsForm { get; set; } + public static DockContent ErrorsPanel { get; set; } = new DockContent(); + public static ScreenshotManagerWindow ScreenshotForm { get; set; } + public static DockContent ScreenshotPanel { get; set; } = new DockContent(); public static AnnouncementWindow AnnouncementForm { get; set; } public static DockContent AnnouncementPanel { get; set; } = new DockContent(); - public static UpdateWindow updateForm { get; set; } - public static DockContent updatePanel { get; set; } = new DockContent(); - public static SSHTransferWindow sshtransferForm { get; set; } + public static UpdateWindow UpdateForm { get; set; } + public static DockContent UpdatePanel { get; set; } = new DockContent(); + public static SSHTransferWindow SshtransferForm { get; set; } public static void Show(WindowType windowType) @@ -44,21 +44,21 @@ namespace mRemoteNG.App { if (windowType.Equals(WindowType.About)) { - if (aboutForm == null || aboutForm.IsDisposed) + if (_aboutForm == null || _aboutForm.IsDisposed) { - aboutForm = new AboutWindow(aboutPanel); - aboutPanel = aboutForm; + _aboutForm = new AboutWindow(_aboutPanel); + _aboutPanel = _aboutForm; } - aboutForm.Show(frmMain.Default.pnlDock); + _aboutForm.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.ActiveDirectoryImport)) { - if (adimportForm == null || adimportForm.IsDisposed) + if (_adimportForm == null || _adimportForm.IsDisposed) { - adimportForm = new ActiveDirectoryImportWindow(adimportPanel); - adimportPanel = adimportForm; + _adimportForm = new ActiveDirectoryImportWindow(_adimportPanel); + _adimportPanel = _adimportForm; } - adimportPanel.Show(frmMain.Default.pnlDock); + _adimportPanel.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.Options)) { @@ -69,60 +69,60 @@ namespace mRemoteNG.App } else if (windowType.Equals(WindowType.SSHTransfer)) { - sshtransferForm = new SSHTransferWindow(sshtransferPanel); - sshtransferPanel = sshtransferForm; - sshtransferForm.Show(frmMain.Default.pnlDock); + SshtransferForm = new SSHTransferWindow(_sshtransferPanel); + _sshtransferPanel = SshtransferForm; + SshtransferForm.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.Update)) { - if (updateForm == null || updateForm.IsDisposed) + if (UpdateForm == null || UpdateForm.IsDisposed) { - updateForm = new UpdateWindow(updatePanel); - updatePanel = updateForm; + UpdateForm = new UpdateWindow(UpdatePanel); + UpdatePanel = UpdateForm; } - updateForm.Show(frmMain.Default.pnlDock); + UpdateForm.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.Help)) { - if (helpForm == null || helpForm.IsDisposed) + if (_helpForm == null || _helpForm.IsDisposed) { - helpForm = new HelpWindow(helpPanel); - helpPanel = helpForm; + _helpForm = new HelpWindow(_helpPanel); + _helpPanel = _helpForm; } - helpForm.Show(frmMain.Default.pnlDock); + _helpForm.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.ExternalApps)) { - if (externalappsForm == null || externalappsForm.IsDisposed) + if (_externalappsForm == null || _externalappsForm.IsDisposed) { - externalappsForm = new ExternalToolsWindow(externalappsPanel); - externalappsPanel = externalappsForm; + _externalappsForm = new ExternalToolsWindow(_externalappsPanel); + _externalappsPanel = _externalappsForm; } - externalappsForm.Show(frmMain.Default.pnlDock); + _externalappsForm.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.PortScan)) { - portscanForm = new PortScanWindow(portscanPanel); - portscanPanel = portscanForm; - portscanForm.Show(frmMain.Default.pnlDock); + _portscanForm = new PortScanWindow(_portscanPanel); + _portscanPanel = _portscanForm; + _portscanForm.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.UltraVNCSC)) { - if (ultravncscForm == null || ultravncscForm.IsDisposed) + if (_ultravncscForm == null || _ultravncscForm.IsDisposed) { - ultravncscForm = new UltraVNCWindow(ultravncscPanel); - ultravncscPanel = ultravncscForm; + _ultravncscForm = new UltraVNCWindow(_ultravncscPanel); + _ultravncscPanel = _ultravncscForm; } - ultravncscForm.Show(frmMain.Default.pnlDock); + _ultravncscForm.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.ComponentsCheck)) { - if (componentscheckForm == null || componentscheckForm.IsDisposed) + if (_componentscheckForm == null || _componentscheckForm.IsDisposed) { - componentscheckForm = new ComponentsCheckWindow(componentscheckPanel); - componentscheckPanel = componentscheckForm; + _componentscheckForm = new ComponentsCheckWindow(_componentscheckPanel); + _componentscheckPanel = _componentscheckForm; } - componentscheckForm.Show(frmMain.Default.pnlDock); + _componentscheckForm.Show(frmMain.Default.pnlDock); } else if (windowType.Equals(WindowType.Announcement)) { diff --git a/mRemoteV1/Config/Settings/LayoutSettingsLoader.cs b/mRemoteV1/Config/Settings/LayoutSettingsLoader.cs index b7538b82d..2a55a2661 100644 --- a/mRemoteV1/Config/Settings/LayoutSettingsLoader.cs +++ b/mRemoteV1/Config/Settings/LayoutSettingsLoader.cs @@ -22,9 +22,9 @@ namespace mRemoteNG.Config.Settings { try { - Windows.treePanel = null; - Windows.configPanel = null; - Windows.errorsPanel = null; + Windows.TreePanel = null; + Windows.ConfigPanel = null; + Windows.ErrorsPanel = null; while (_MainForm.pnlDock.Contents.Count > 0) { @@ -67,16 +67,16 @@ namespace mRemoteNG.Config.Settings try { if (persistString == typeof(ConfigWindow).ToString()) - return Windows.configPanel; + return Windows.ConfigPanel; if (persistString == typeof(ConnectionTreeWindow).ToString()) - return Windows.treePanel; + return Windows.TreePanel; if (persistString == typeof(ErrorAndInfoWindow).ToString()) - return Windows.errorsPanel; + return Windows.ErrorsPanel; if (persistString == typeof(ScreenshotManagerWindow).ToString()) - return Windows.screenshotPanel; + return Windows.ScreenshotPanel; } catch (Exception ex) { @@ -88,20 +88,20 @@ namespace mRemoteNG.Config.Settings public void CreatePanels() { - Windows.configForm = new ConfigWindow(Windows.configPanel); - Windows.configPanel = Windows.configForm; + Windows.ConfigForm = new ConfigWindow(Windows.ConfigPanel); + Windows.ConfigPanel = Windows.ConfigForm; - Windows.treeForm = new ConnectionTreeWindow(Windows.treePanel); - Windows.treePanel = Windows.treeForm; + Windows.TreeForm = new ConnectionTreeWindow(Windows.TreePanel); + Windows.TreePanel = Windows.TreeForm; - Windows.errorsForm = new ErrorAndInfoWindow(Windows.errorsPanel); - Windows.errorsPanel = Windows.errorsForm; + Windows.ErrorsForm = new ErrorAndInfoWindow(Windows.ErrorsPanel); + Windows.ErrorsPanel = Windows.ErrorsForm; - Windows.screenshotForm = new ScreenshotManagerWindow(Windows.screenshotPanel); - Windows.screenshotPanel = Windows.screenshotForm; + Windows.ScreenshotForm = new ScreenshotManagerWindow(Windows.ScreenshotPanel); + Windows.ScreenshotPanel = Windows.ScreenshotForm; - Windows.updateForm = new UpdateWindow(Windows.updatePanel); - Windows.updatePanel = Windows.updateForm; + Windows.UpdateForm = new UpdateWindow(Windows.UpdatePanel); + Windows.UpdatePanel = Windows.UpdateForm; Windows.AnnouncementForm = new AnnouncementWindow(Windows.AnnouncementPanel); Windows.AnnouncementPanel = Windows.AnnouncementForm; diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index dd43468ac..9285363d8 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -140,7 +140,7 @@ namespace mRemoteNG.UI.Forms fpChainedWindowHandle = NativeMethods.SetClipboardViewer(Handle); - Runtime.MessageCollector = new MessageCollector(Windows.errorsForm); + Runtime.MessageCollector = new MessageCollector(Windows.ErrorsForm); Runtime.WindowList = new WindowList(); if (Settings.Default.FirstStart && !Settings.Default.LoadConsFromCustomLocation && !File.Exists(Runtime.GetStartupConnectionFileName())) @@ -155,7 +155,7 @@ namespace mRemoteNG.UI.Forms //return ; } - Windows.treePanel.Focus(); + Windows.TreePanel.Focus(); PuttySessionsManager.Instance.StartWatcher(); if (Settings.Default.StartupComponentsCheck) @@ -170,7 +170,7 @@ namespace mRemoteNG.UI.Forms Microsoft.Win32.SystemEvents.DisplaySettingsChanged += DisplayChanged; Opacity = 1; - ConnectionTreeWindow = Windows.treeForm; + ConnectionTreeWindow = Windows.TreeForm; ConnectionTreeWindow.ConnectionTreeModel = Runtime.ConnectionTreeModel; } @@ -425,7 +425,7 @@ namespace mRemoteNG.UI.Forms { var extA = (ExternalTool)((ToolStripButton)sender).Tag; - var selectedTreeNode = Windows.treeForm.SelectedNode; + var selectedTreeNode = Windows.TreeForm.SelectedNode; if (selectedTreeNode.GetTreeNodeType() == TreeNodeType.Connection | selectedTreeNode.GetTreeNodeType() == TreeNodeType.PuttySession) { extA.Start(selectedTreeNode); @@ -646,7 +646,7 @@ namespace mRemoteNG.UI.Forms private void mMenFileExport_Click(object sender, EventArgs e) { - Export.ExportToFile(Windows.treeForm.SelectedNode, Runtime.ConnectionTreeModel); + Export.ExportToFile(Windows.TreeForm.SelectedNode, Runtime.ConnectionTreeModel); } private void mMenFileExit_Click(object sender, EventArgs e) @@ -658,10 +658,10 @@ namespace mRemoteNG.UI.Forms #region View private void mMenView_DropDownOpening(object sender, EventArgs e) { - mMenViewConnections.Checked = !Windows.treeForm.IsHidden; - mMenViewConfig.Checked = !Windows.configForm.IsHidden; - mMenViewErrorsAndInfos.Checked = !Windows.errorsForm.IsHidden; - mMenViewScreenshotManager.Checked = !Windows.screenshotForm.IsHidden; + mMenViewConnections.Checked = !Windows.TreeForm.IsHidden; + mMenViewConfig.Checked = !Windows.ConfigForm.IsHidden; + mMenViewErrorsAndInfos.Checked = !Windows.ErrorsForm.IsHidden; + mMenViewScreenshotManager.Checked = !Windows.ScreenshotForm.IsHidden; mMenViewExtAppsToolbar.Checked = tsExternalTools.Visible; mMenViewQuickConnectToolbar.Checked = tsQuickConnect.Visible; @@ -688,12 +688,12 @@ namespace mRemoteNG.UI.Forms { if (mMenViewConnections.Checked == false) { - Windows.treePanel.Show(pnlDock); + Windows.TreePanel.Show(pnlDock); mMenViewConnections.Checked = true; } else { - Windows.treePanel.Hide(); + Windows.TreePanel.Hide(); mMenViewConnections.Checked = false; } } @@ -702,12 +702,12 @@ namespace mRemoteNG.UI.Forms { if (mMenViewConfig.Checked == false) { - Windows.configPanel.Show(pnlDock); + Windows.ConfigPanel.Show(pnlDock); mMenViewConfig.Checked = true; } else { - Windows.configPanel.Hide(); + Windows.ConfigPanel.Hide(); mMenViewConfig.Checked = false; } } @@ -716,12 +716,12 @@ namespace mRemoteNG.UI.Forms { if (mMenViewErrorsAndInfos.Checked == false) { - Windows.errorsPanel.Show(pnlDock); + Windows.ErrorsPanel.Show(pnlDock); mMenViewErrorsAndInfos.Checked = true; } else { - Windows.errorsPanel.Hide(); + Windows.ErrorsPanel.Hide(); mMenViewErrorsAndInfos.Checked = false; } } @@ -730,31 +730,31 @@ namespace mRemoteNG.UI.Forms { if (mMenViewScreenshotManager.Checked == false) { - Windows.screenshotPanel.Show(pnlDock); + Windows.ScreenshotPanel.Show(pnlDock); mMenViewScreenshotManager.Checked = true; } else { - Windows.screenshotPanel.Hide(); + Windows.ScreenshotPanel.Hide(); mMenViewScreenshotManager.Checked = false; } } private void mMenViewJumpToConnectionsConfig_Click(object sender, EventArgs e) { - if (pnlDock.ActiveContent == Windows.treePanel) + if (pnlDock.ActiveContent == Windows.TreePanel) { - Windows.configForm.Activate(); + Windows.ConfigForm.Activate(); } else { - Windows.treeForm.Activate(); + Windows.TreeForm.Activate(); } } private void mMenViewJumpToErrorsInfos_Click(object sender, EventArgs e) { - Windows.errorsForm.Activate(); + Windows.ErrorsForm.Activate(); } private void mMenViewResetLayout_Click(object sender, EventArgs e) diff --git a/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs b/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs index 397b059e0..567c3e719 100644 --- a/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs +++ b/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs @@ -30,8 +30,8 @@ namespace mRemoteNG.UI.Window public void btnImport_Click(object sender, EventArgs e) { - var selectedNodeAsContainer = Windows.treeForm.SelectedNode as ContainerInfo ?? - Windows.treeForm.SelectedNode.Parent; + var selectedNodeAsContainer = Windows.TreeForm.SelectedNode as ContainerInfo ?? + Windows.TreeForm.SelectedNode.Parent; Import.ImportFromActiveDirectory(ActiveDirectoryTree.ADPath, selectedNodeAsContainer); DialogResult = DialogResult.OK; Close(); diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index c8544385e..6fca60507 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -350,7 +350,7 @@ namespace mRemoteNG.UI.Window { _contextMenu.EnableShortcutKeys(); ConnectionTreeModel.RenameNode(SelectedNode, e.Label); - Windows.configForm.pGrid_SelectedObjectChanged(SelectedNode); + Windows.ConfigForm.pGrid_SelectedObjectChanged(SelectedNode); Runtime.SaveConnectionsBG(); } catch (Exception ex) @@ -363,7 +363,7 @@ namespace mRemoteNG.UI.Window { try { - Windows.configForm.SetPropertyGridObject(SelectedNode); + Windows.ConfigForm.SetPropertyGridObject(SelectedNode); Runtime.LastSelected = (SelectedNode)?.ConstantID; } catch (Exception ex) @@ -562,10 +562,10 @@ namespace mRemoteNG.UI.Window try { Windows.Show(WindowType.SSHTransfer); - Windows.sshtransferForm.Hostname = SelectedNode.Hostname; - Windows.sshtransferForm.Username = SelectedNode.Username; - Windows.sshtransferForm.Password = SelectedNode.Password; - Windows.sshtransferForm.Port = Convert.ToString(SelectedNode.Port); + Windows.SshtransferForm.Hostname = SelectedNode.Hostname; + Windows.SshtransferForm.Username = SelectedNode.Username; + Windows.SshtransferForm.Password = SelectedNode.Password; + Windows.SshtransferForm.Port = Convert.ToString(SelectedNode.Port); } catch (Exception ex) { diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index bd8b3de76..871afa27a 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -646,7 +646,7 @@ namespace mRemoteNG.UI.Window { cmenTab.Close(); Application.DoEvents(); - Windows.screenshotForm.AddScreenshot(Tools.MiscTools.TakeScreenshot(this)); + Windows.ScreenshotForm.AddScreenshot(Tools.MiscTools.TakeScreenshot(this)); } private void cmenTabSmartSize_Click(object sender, EventArgs e) @@ -783,10 +783,10 @@ namespace mRemoteNG.UI.Window ConnectionInfo conI = IC.Info; - Windows.sshtransferForm.Hostname = conI.Hostname; - Windows.sshtransferForm.Username = conI.Username; - Windows.sshtransferForm.Password = conI.Password; - Windows.sshtransferForm.Port = Convert.ToString(conI.Port); + Windows.SshtransferForm.Hostname = conI.Hostname; + Windows.SshtransferForm.Username = conI.Username; + Windows.SshtransferForm.Password = conI.Password; + Windows.SshtransferForm.Port = Convert.ToString(conI.Port); } catch (Exception ex) { diff --git a/mRemoteV1/UI/Window/ErrorAndInfoWindow.cs b/mRemoteV1/UI/Window/ErrorAndInfoWindow.cs index df5119719..55f41c87c 100644 --- a/mRemoteV1/UI/Window/ErrorAndInfoWindow.cs +++ b/mRemoteV1/UI/Window/ErrorAndInfoWindow.cs @@ -321,7 +321,7 @@ namespace mRemoteNG.UI.Window } else { - Windows.treeForm.Show(frmMain.Default.pnlDock); + Windows.TreeForm.Show(frmMain.Default.pnlDock); } } catch (Exception) diff --git a/mRemoteV1/UI/Window/PortScanWindow.cs b/mRemoteV1/UI/Window/PortScanWindow.cs index 3ae2a7dd1..073bebb5c 100644 --- a/mRemoteV1/UI/Window/PortScanWindow.cs +++ b/mRemoteV1/UI/Window/PortScanWindow.cs @@ -261,7 +261,7 @@ namespace mRemoteNG.UI.Window return; } - var selectedTreeNodeAsContainer = Windows.treeForm.SelectedNode as ContainerInfo ?? Windows.treeForm.SelectedNode.Parent; + var selectedTreeNodeAsContainer = Windows.TreeForm.SelectedNode as ContainerInfo ?? Windows.TreeForm.SelectedNode.Parent; Import.ImportFromPortScan(hosts, protocol, selectedTreeNodeAsContainer); } From 7a15a8151c42bf943b40c49850f2b23246fe0628 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 27 Sep 2016 09:21:15 -0600 Subject: [PATCH 269/338] Resolved error when attempting to connect to PuTTY session --- mRemoteV1/Connection/PuttySessionInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/Connection/PuttySessionInfo.cs b/mRemoteV1/Connection/PuttySessionInfo.cs index 45c832305..ee9dcd7a9 100644 --- a/mRemoteV1/Connection/PuttySessionInfo.cs +++ b/mRemoteV1/Connection/PuttySessionInfo.cs @@ -35,7 +35,7 @@ namespace mRemoteNG.Connection [ReadOnly(true), Browsable(false)] public override string Panel { - get { return RootRootPuttySessionsInfo.Panel; } + get { return Parent?.Panel; } set { } } From 20339c14529c1506cc11d6f128289e8e3b8025fb Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 27 Sep 2016 10:33:34 -0600 Subject: [PATCH 270/338] Fixed bug when trying to refresh the display of a folder that had 0 children but now has some --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 6fca60507..126c4b42d 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -423,12 +423,12 @@ namespace mRemoteNG.UI.Window switch (args?.Action) { case NotifyCollectionChangedAction.Add: - var otherChild = senderAsContainerInfo?.Children.First(child => !args.NewItems.Contains(child)); - if (otherChild != null) - RefreshTreeObject(otherChild); - else - RefreshTreeObject(senderAsContainerInfo); - break; + var childList = senderAsContainerInfo?.Children; + ConnectionInfo otherChild = null; + if (childList?.Count > 0) + try { otherChild = childList.First(child => !args.NewItems.Contains(child)); } catch { } + RefreshTreeObject(otherChild ?? senderAsContainerInfo); + break; case NotifyCollectionChangedAction.Remove: RefreshTreeObjects(args.OldItems); break; From 60b387ac56907ee89a1f69b41533e69cc0feeb2c Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 27 Sep 2016 10:36:30 -0600 Subject: [PATCH 271/338] Adding a new node will expand the parent container, select the new node, and ensure the new node is visible. Extracted a method since these actions are identical for both containers and connections --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 126c4b42d..bbc17c87c 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -503,9 +503,7 @@ namespace mRemoteNG.UI.Window { try { - var newConnectionInfo = new ConnectionInfo(); - var selectedContainer = SelectedNode as ContainerInfo; - newConnectionInfo.SetParent(selectedContainer ?? SelectedNode.Parent); + AddNode(new ConnectionInfo()); } catch (Exception ex) { @@ -517,9 +515,7 @@ namespace mRemoteNG.UI.Window { try { - var newContainerInfo = new ContainerInfo(); - var selectedContainer = SelectedNode as ContainerInfo; - newContainerInfo.SetParent(selectedContainer ?? SelectedNode.Parent); + AddNode(new ContainerInfo()); } catch (Exception ex) { @@ -527,6 +523,16 @@ namespace mRemoteNG.UI.Window } } + private void AddNode(IHasParent newNode) + { + var selectedContainer = SelectedNode as ContainerInfo; + var parent = selectedContainer ?? SelectedNode.Parent; + newNode.SetParent(parent); + olvConnections.Expand(parent); + olvConnections.SelectObject(newNode); + olvConnections.EnsureModelVisible(newNode); + } + private void DisconnectConnection(ConnectionInfo connectionInfo) { try From 9c8c22979f551ddb306e746e800575ff7c8fcd83 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 27 Sep 2016 13:56:03 -0600 Subject: [PATCH 272/338] Resolved bug where hitting the delete key would bring up the prompt to delete root nodes and putty nodes --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index bbc17c87c..61a85ffd0 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -299,6 +299,7 @@ namespace mRemoteNG.UI.Window public void DeleteSelectedNode() { + if (SelectedNode is RootNodeInfo || SelectedNode is PuttySessionInfo) return; if (!UserConfirmsDeletion()) return; ConnectionTreeModel.DeleteNode(SelectedNode); Runtime.SaveConnectionsBG(); From b73547ced96715a05bfebcf0174d75e21f268963 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 27 Sep 2016 14:44:35 -0600 Subject: [PATCH 273/338] Connecting to an entire folder working again --- mRemoteV1/Connection/ConnectionInitiator.cs | 38 ++++++++++----- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 54 ++++++++++++++++++--- mRemoteV1/UI/Window/ConnectionWindow.cs | 3 +- 3 files changed, 75 insertions(+), 20 deletions(-) diff --git a/mRemoteV1/Connection/ConnectionInitiator.cs b/mRemoteV1/Connection/ConnectionInitiator.cs index fb8ca9d20..b4d8a06fd 100644 --- a/mRemoteV1/Connection/ConnectionInitiator.cs +++ b/mRemoteV1/Connection/ConnectionInitiator.cs @@ -3,8 +3,8 @@ using System.Windows.Forms; using mRemoteNG.App; using mRemoteNG.Connection.Protocol; using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Container; using mRemoteNG.Messages; -using mRemoteNG.Tree; using mRemoteNG.UI.Forms; using mRemoteNG.UI.Window; using TabPage = Crownwood.Magic.Controls.TabPage; @@ -14,6 +14,30 @@ namespace mRemoteNG.Connection { public static class ConnectionInitiator { + public static void OpenConnection(ContainerInfo containerInfo) + { + OpenConnection(containerInfo, ConnectionInfo.Force.None); + } + + public static void OpenConnection(ContainerInfo containerInfo, ConnectionInfo.Force force) + { + OpenConnection(containerInfo, force, null); + } + + public static void OpenConnection(ContainerInfo containerInfo, ConnectionInfo.Force force, Form conForm) + { + var children = containerInfo.Children; + if (children.Count == 0) return; + foreach (var child in children) + { + var childAsContainer = child as ContainerInfo; + if (childAsContainer != null) + OpenConnection(childAsContainer, force, conForm); + else + OpenConnection(child, force, conForm); + } + } + public static void OpenConnection(ConnectionInfo connectionInfo) { try @@ -26,18 +50,6 @@ namespace mRemoteNG.Connection } } - public static void OpenConnection(ConnectionInfo connectionInfo, Form connectionForm, ConnectionInfo.Force force) - { - try - { - OpenConnection(connectionInfo, force, connectionForm); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, Language.strConnectionOpenFailed + Environment.NewLine + ex.Message); - } - } - public static void OpenConnection(ConnectionInfo connectionInfo, ConnectionInfo.Force force) { try diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 61a85ffd0..afbb3df93 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -139,12 +139,54 @@ namespace mRemoteNG.UI.Window private void SetContextMenuEventHandlers() { _contextMenu.Opening += (sender, args) => _contextMenu.ShowHideTreeContextMenuItems(SelectedNode); - _contextMenu.ConnectClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DoNotJump); - _contextMenu.ConnectToConsoleSessionClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); - _contextMenu.DontConnectToConsoleSessionClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); - _contextMenu.ConnectInFullscreenClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); - _contextMenu.ConnectWithNoCredentialsClick += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.NoCredentials); - _contextMenu.ChoosePanelBeforeConnectingClicked += (sender, args) => ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); + _contextMenu.ConnectClicked += (sender, args) => + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo; + if (selectedNodeAsContainer != null) + ConnectionInitiator.OpenConnection(selectedNodeAsContainer, ConnectionInfo.Force.DoNotJump); + else + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DoNotJump); + }; + _contextMenu.ConnectToConsoleSessionClicked += (sender, args) => + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo; + if (selectedNodeAsContainer != null) + ConnectionInitiator.OpenConnection(selectedNodeAsContainer, ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); + else + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.UseConsoleSession | ConnectionInfo.Force.DoNotJump); + }; + _contextMenu.DontConnectToConsoleSessionClicked += (sender, args) => + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo; + if (selectedNodeAsContainer != null) + ConnectionInitiator.OpenConnection(selectedNodeAsContainer, ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); + else + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.DontUseConsoleSession | ConnectionInfo.Force.DoNotJump); + }; + _contextMenu.ConnectInFullscreenClicked += (sender, args) => + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo; + if (selectedNodeAsContainer != null) + ConnectionInitiator.OpenConnection(selectedNodeAsContainer, ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); + else + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.Fullscreen | ConnectionInfo.Force.DoNotJump); + }; + _contextMenu.ConnectWithNoCredentialsClick += (sender, args) => + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo; + if (selectedNodeAsContainer != null) + ConnectionInitiator.OpenConnection(selectedNodeAsContainer, ConnectionInfo.Force.NoCredentials); + else + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.NoCredentials); + }; + _contextMenu.ChoosePanelBeforeConnectingClicked += (sender, args) => + { + var selectedNodeAsContainer = SelectedNode as ContainerInfo; + if (selectedNodeAsContainer != null) + ConnectionInitiator.OpenConnection(selectedNodeAsContainer, ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); + else + ConnectionInitiator.OpenConnection(SelectedNode, ConnectionInfo.Force.OverridePanel | ConnectionInfo.Force.DoNotJump); + }; _contextMenu.DisconnectClicked += (sender, args) => DisconnectConnection(SelectedNode); _contextMenu.TransferFileClicked += (sender, args) => SshTransferFile(); _contextMenu.DuplicateClicked += (sender, args) => DuplicateSelectedNode(); diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index 871afa27a..74930598b 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -550,7 +550,8 @@ namespace mRemoteNG.UI.Window { if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) { - ConnectionInitiator.OpenConnection((ConnectionInfo)((TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode", true)).Tag, this, ConnectionInfo.Force.DoNotJump); + var connectionInfo = (ConnectionInfo) ((TreeNode) e.Data.GetData("System.Windows.Forms.TreeNode", true)).Tag; + ConnectionInitiator.OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump, this); } } From 7fe8749807df38d99ee0703be684572f66182329 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 27 Sep 2016 14:52:06 -0600 Subject: [PATCH 274/338] Resolved bug with the Reconnect context menu item being permanently disabled for containers --- mRemoteV1/UI/Controls/ConnectionContextMenu.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs index 52b34b152..2cb5e2313 100644 --- a/mRemoteV1/UI/Controls/ConnectionContextMenu.cs +++ b/mRemoteV1/UI/Controls/ConnectionContextMenu.cs @@ -433,8 +433,8 @@ namespace mRemoteNG.UI.Controls _cMenTreeDisconnect.Enabled = false; var openConnections = ((ContainerInfo)connectionInfo).Children.Sum(child => child.OpenConnections.Count); - if (openConnections == 0) - _cMenTreeDisconnect.Enabled = false; + if (openConnections > 0) + _cMenTreeDisconnect.Enabled = true; _cMenTreeToolsTransferFile.Enabled = false; _cMenTreeToolsExternalApps.Enabled = false; From 48b209155b08caec5d8480bab31e9b27b080c8b9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 08:10:13 -0600 Subject: [PATCH 275/338] Renamed class to be more indicative of its use --- .../Tools/{ArgumentParser.cs => ExternalToolArgumentParser.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename mRemoteV1/Tools/{ArgumentParser.cs => ExternalToolArgumentParser.cs} (100%) diff --git a/mRemoteV1/Tools/ArgumentParser.cs b/mRemoteV1/Tools/ExternalToolArgumentParser.cs similarity index 100% rename from mRemoteV1/Tools/ArgumentParser.cs rename to mRemoteV1/Tools/ExternalToolArgumentParser.cs From da2d48b49a53d174bed080593824f5f83692e07e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 08:20:16 -0600 Subject: [PATCH 276/338] Minor code cleanup --- .../Connection/Protocol/IntegratedProgram.cs | 2 +- mRemoteV1/Tools/ExternalTool.cs | 2 +- mRemoteV1/Tools/ExternalToolArgumentParser.cs | 140 ++++++++---------- mRemoteV1/mRemoteV1.csproj | 2 +- 4 files changed, 65 insertions(+), 81 deletions(-) diff --git a/mRemoteV1/Connection/Protocol/IntegratedProgram.cs b/mRemoteV1/Connection/Protocol/IntegratedProgram.cs index 3bd9593a6..81013aeaa 100644 --- a/mRemoteV1/Connection/Protocol/IntegratedProgram.cs +++ b/mRemoteV1/Connection/Protocol/IntegratedProgram.cs @@ -40,7 +40,7 @@ namespace mRemoteNG.Connection.Protocol return false; } - ArgumentParser argParser = new ArgumentParser(_externalTool.ConnectionInfo); + ExternalToolArgumentParser argParser = new ExternalToolArgumentParser(_externalTool.ConnectionInfo); _process = new Process(); _process.StartInfo.UseShellExecute = true; diff --git a/mRemoteV1/Tools/ExternalTool.cs b/mRemoteV1/Tools/ExternalTool.cs index 709c7a02b..9e25ae3c1 100644 --- a/mRemoteV1/Tools/ExternalTool.cs +++ b/mRemoteV1/Tools/ExternalTool.cs @@ -69,7 +69,7 @@ namespace mRemoteNG.Tools private void SetProcessProperties(Process process, ConnectionInfo startConnectionInfo) { - ArgumentParser argParser = new ArgumentParser(startConnectionInfo); + ExternalToolArgumentParser argParser = new ExternalToolArgumentParser(startConnectionInfo); process.StartInfo.UseShellExecute = true; process.StartInfo.FileName = argParser.ParseArguments(FileName); process.StartInfo.Arguments = argParser.ParseArguments(Arguments); diff --git a/mRemoteV1/Tools/ExternalToolArgumentParser.cs b/mRemoteV1/Tools/ExternalToolArgumentParser.cs index d0dff544c..26313d25a 100644 --- a/mRemoteV1/Tools/ExternalToolArgumentParser.cs +++ b/mRemoteV1/Tools/ExternalToolArgumentParser.cs @@ -4,47 +4,47 @@ using mRemoteNG.Connection; namespace mRemoteNG.Tools { - public class ArgumentParser + public class ExternalToolArgumentParser { - ConnectionInfo _connectionInfo; + private readonly ConnectionInfo _connectionInfo; - public ArgumentParser(ConnectionInfo connectionInfo) + public ExternalToolArgumentParser(ConnectionInfo connectionInfo) { _connectionInfo = connectionInfo; } public string ParseArguments(string input) { - int index = 0; - List replacements = new List(); + var index = 0; + var replacements = new List(); do { - int tokenStart = input.IndexOf("%", index, StringComparison.InvariantCulture); + var tokenStart = input.IndexOf("%", index, StringComparison.InvariantCulture); if (tokenStart == -1) { break; } - int tokenEnd = input.IndexOf("%", tokenStart + 1, StringComparison.InvariantCulture); + var tokenEnd = input.IndexOf("%", tokenStart + 1, StringComparison.InvariantCulture); if (tokenEnd == -1) { break; } - int tokenLength = tokenEnd - tokenStart + 1; + var tokenLength = tokenEnd - tokenStart + 1; - int variableNameStart = tokenStart + 1; - int variableNameLength = tokenLength - 2; + var variableNameStart = tokenStart + 1; + var variableNameLength = tokenLength - 2; - bool isEnvironmentVariable = false; + var isEnvironmentVariable = false; - string variableName = ""; + var variableName = ""; if (tokenStart > 0) { - char tokenStartPrefix = input.Substring(tokenStart - 1, 1).ToCharArray()[0]; - char tokenEndPrefix = input.Substring(tokenEnd - 1, 1).ToCharArray()[0]; + var tokenStartPrefix = input.Substring(tokenStart - 1, 1).ToCharArray()[0]; + var tokenEndPrefix = input.Substring(tokenEnd - 1, 1).ToCharArray()[0]; if (tokenStartPrefix == '\\' && tokenEndPrefix == '\\') { @@ -74,10 +74,10 @@ namespace mRemoteNG.Tools } } - string token = input.Substring(tokenStart, tokenLength); + var token = input.Substring(tokenStart, tokenLength); - EscapeType escape = EscapeType.All; - string prefix = input.Substring(variableNameStart, 1); + var escape = EscapeType.All; + var prefix = input.Substring(variableNameStart, 1); switch (prefix) { case "-": @@ -103,13 +103,13 @@ namespace mRemoteNG.Tools variableName = input.Substring(variableNameStart, variableNameLength); - string replacementValue = token; + var replacementValue = token; if (!isEnvironmentVariable) { replacementValue = GetVariableReplacement(variableName, token); } - bool haveReplacement = false; + var haveReplacement = false; if (replacementValue != token) { @@ -145,19 +145,19 @@ namespace mRemoteNG.Tools } } while (true); - string result = input; + var result = input; for (index = result.Length; index >= 0; index--) { - foreach (Replacement replacement in replacements) + foreach (var replacement in replacements) { if (replacement.Start != index) { continue; } - string before = result.Substring(0, replacement.Start); - string after = result.Substring(replacement.Start + replacement.Length); + var before = result.Substring(0, replacement.Start); + var after = result.Substring(replacement.Start + replacement.Length); result = before + replacement.Value + after; } } @@ -166,41 +166,39 @@ namespace mRemoteNG.Tools private string GetVariableReplacement(string variable, string original) { - string replacement = ""; - if (_connectionInfo != null) + var replacement = ""; + if (_connectionInfo == null) return replacement; + switch (variable.ToLowerInvariant()) { - switch (variable.ToLowerInvariant()) - { - case "name": - replacement = _connectionInfo.Name; - break; - case "hostname": - replacement = _connectionInfo.Hostname; - break; - case "port": - replacement = Convert.ToString(_connectionInfo.Port); - break; - case "username": - replacement = _connectionInfo.Username; - break; - case "password": - replacement = _connectionInfo.Password; - break; - case "domain": - replacement = _connectionInfo.Domain; - break; - case "description": - replacement = _connectionInfo.Description; - break; - case "macaddress": - replacement = _connectionInfo.MacAddress; - break; - case "userfield": - replacement = _connectionInfo.UserField; - break; - default: - return original; - } + case "name": + replacement = _connectionInfo.Name; + break; + case "hostname": + replacement = _connectionInfo.Hostname; + break; + case "port": + replacement = Convert.ToString(_connectionInfo.Port); + break; + case "username": + replacement = _connectionInfo.Username; + break; + case "password": + replacement = _connectionInfo.Password; + break; + case "domain": + replacement = _connectionInfo.Domain; + break; + case "description": + replacement = _connectionInfo.Description; + break; + case "macaddress": + replacement = _connectionInfo.MacAddress; + break; + case "userfield": + replacement = _connectionInfo.UserField; + break; + default: + return original; } return replacement; } @@ -214,31 +212,17 @@ namespace mRemoteNG.Tools private struct Replacement { - int _start; - int _length; - string _value; + public int Start { get; } - public int Start - { - get { return _start; } - set { _start = value; } - } - public int Length - { - get { return _length; } - set { _length = value; } - } - public string Value - { - get { return _value; } - set { _value = value; } - } + public int Length { get; } + + public string Value { get; } public Replacement(int start, int length, string value) { - _start = start; - _length = length; - _value = value; + Start = start; + Length = length; + Value = value; } } } diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 82afbe5cc..ac8b9aafc 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -196,7 +196,7 @@ - + From 1bf616579b7b29391eca08b5d19e35e685b638df Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 09:50:38 -0600 Subject: [PATCH 277/338] Added tests for the external tools arg parser --- .../Tools/ExternalToolsArgumentParserTests.cs | 84 +++++++++++++++++++ mRemoteNGTests/mRemoteNGTests.csproj | 1 + 2 files changed, 85 insertions(+) create mode 100644 mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs diff --git a/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs b/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs new file mode 100644 index 000000000..016937d91 --- /dev/null +++ b/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs @@ -0,0 +1,84 @@ +using mRemoteNG.Connection; +using mRemoteNG.Tools; +using NUnit.Framework; + + +namespace mRemoteNGTests.Tools +{ + public class ExternalToolsArgumentParserTests + { + private ExternalToolArgumentParser _argumentParser; + private const string TestString = @"()%!^abc123*<>&|""'\"; + private const string StringAfterMetacharacterEscaping = @"^(^)^%^!^^abc123*^<^>^&^|^""'\"; + private const string StringAfterAllEscaping = @"^(^)^%^!^^abc123*^<^>^&^|\^""'\"; + private const string StringAfterNoEscaping = TestString; + private const int Port = 9933; + private const string PortAsString = "9933"; + + + [OneTimeSetUp] + public void Setup() + { + var connectionInfo = new ConnectionInfo + { + Name = TestString, + Hostname = TestString, + Port = Port, + Username = TestString, + Password = TestString, + Domain = TestString, + Description = TestString, + MacAddress = TestString, + UserField = TestString + }; + _argumentParser = new ExternalToolArgumentParser(connectionInfo); + } + + [OneTimeTearDown] + public void Teardown() + { + _argumentParser = null; + } + + + [TestCase("%NAME%", ExpectedResult = StringAfterAllEscaping)] + [TestCase("%-NAME%", ExpectedResult = StringAfterMetacharacterEscaping)] + [TestCase("%!NAME%", ExpectedResult = StringAfterNoEscaping)] + + [TestCase("%HOSTNAME%", ExpectedResult = StringAfterAllEscaping)] + [TestCase("%-HOSTNAME%", ExpectedResult = StringAfterMetacharacterEscaping)] + [TestCase("%!HOSTNAME%", ExpectedResult = StringAfterNoEscaping)] + + [TestCase("%PORT%", ExpectedResult = PortAsString)] + [TestCase("%-PORT%", ExpectedResult = PortAsString)] + [TestCase("%!PORT%", ExpectedResult = PortAsString)] + + [TestCase("%USERNAME%", ExpectedResult = StringAfterAllEscaping)] + [TestCase("%-USERNAME%", ExpectedResult = StringAfterMetacharacterEscaping)] + [TestCase("%!USERNAME%", ExpectedResult = StringAfterNoEscaping)] + + [TestCase("%PASSWORD%", ExpectedResult = StringAfterAllEscaping)] + [TestCase("%-PASSWORD%", ExpectedResult = StringAfterMetacharacterEscaping)] + [TestCase("%!PASSWORD%", ExpectedResult = StringAfterNoEscaping)] + + [TestCase("%DOMAIN%", ExpectedResult = StringAfterAllEscaping)] + [TestCase("%-DOMAIN%", ExpectedResult = StringAfterMetacharacterEscaping)] + [TestCase("%!DOMAIN%", ExpectedResult = StringAfterNoEscaping)] + + [TestCase("%DESCRIPTION%", ExpectedResult = StringAfterAllEscaping)] + [TestCase("%-DESCRIPTION%", ExpectedResult = StringAfterMetacharacterEscaping)] + [TestCase("%!DESCRIPTION%", ExpectedResult = StringAfterNoEscaping)] + + [TestCase("%MACADDRESS%", ExpectedResult = StringAfterAllEscaping)] + [TestCase("%-MACADDRESS%", ExpectedResult = StringAfterMetacharacterEscaping)] + [TestCase("%!MACADDRESS%", ExpectedResult = StringAfterNoEscaping)] + + [TestCase("%USERFIELD%", ExpectedResult = StringAfterAllEscaping)] + [TestCase("%-USERFIELD%", ExpectedResult = StringAfterMetacharacterEscaping)] + [TestCase("%!USERFIELD%", ExpectedResult = StringAfterNoEscaping)] + public string ParserTest(string argumentString) + { + return _argumentParser.ParseArguments(argumentString); + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 8a07545b9..6252a216d 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -114,6 +114,7 @@ + From 91da8f1b5f65444d2b83868f57fd297779ca46a5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 09:57:35 -0600 Subject: [PATCH 278/338] Reset the position of the main menu. At some point it got pushed to the side again --- mRemoteV1/UI/Forms/frmMain.Designer.cs | 44 +++++++++++++------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/mRemoteV1/UI/Forms/frmMain.Designer.cs b/mRemoteV1/UI/Forms/frmMain.Designer.cs index 95c7733ef..035f3e85e 100644 --- a/mRemoteV1/UI/Forms/frmMain.Designer.cs +++ b/mRemoteV1/UI/Forms/frmMain.Designer.cs @@ -97,7 +97,7 @@ namespace mRemoteNG.UI.Forms this.cmbQuickConnect = new mRemoteNG.UI.Controls.QuickConnectComboBox(); this.tsContainer = new System.Windows.Forms.ToolStripContainer(); this.tsQuickConnect = new System.Windows.Forms.ToolStrip(); - this.btnQuickConnect = new ToolStripSplitButton(); + this.btnQuickConnect = new mRemoteNG.UI.Controls.ToolStripSplitButton(); this.mnuQuickConnectProtocol = new System.Windows.Forms.ContextMenuStrip(this.components); this.btnConnections = new System.Windows.Forms.ToolStripDropDownButton(); this.mnuConnections = new System.Windows.Forms.ContextMenuStrip(this.components); @@ -143,10 +143,10 @@ namespace mRemoteNG.UI.Forms this.mMenView, this.mMenTools, this.mMenInfo}); - this.msMain.Location = new System.Drawing.Point(3, 0); + this.msMain.Location = new System.Drawing.Point(5, 0); this.msMain.Name = "msMain"; this.msMain.Padding = new System.Windows.Forms.Padding(2, 2, 0, 2); - this.msMain.Size = new System.Drawing.Size(176, 24); + this.msMain.Size = new System.Drawing.Size(269, 24); this.msMain.Stretch = false; this.msMain.TabIndex = 16; this.msMain.Text = "Main Toolbar"; @@ -363,7 +363,7 @@ namespace mRemoteNG.UI.Forms // this.mMenViewAddConnectionPanel.Image = global::mRemoteNG.Resources.Panel_Add; this.mMenViewAddConnectionPanel.Name = "mMenViewAddConnectionPanel"; - this.mMenViewAddConnectionPanel.Size = new System.Drawing.Size(227, 22); + this.mMenViewAddConnectionPanel.Size = new System.Drawing.Size(228, 22); this.mMenViewAddConnectionPanel.Text = "Add Connection Panel"; this.mMenViewAddConnectionPanel.Click += new System.EventHandler(this.mMenViewAddConnectionPanel_Click); // @@ -371,13 +371,13 @@ namespace mRemoteNG.UI.Forms // this.mMenViewConnectionPanels.Image = global::mRemoteNG.Resources.Panels; this.mMenViewConnectionPanels.Name = "mMenViewConnectionPanels"; - this.mMenViewConnectionPanels.Size = new System.Drawing.Size(227, 22); + this.mMenViewConnectionPanels.Size = new System.Drawing.Size(228, 22); this.mMenViewConnectionPanels.Text = "Connection Panels"; // // mMenViewSep1 // this.mMenViewSep1.Name = "mMenViewSep1"; - this.mMenViewSep1.Size = new System.Drawing.Size(224, 6); + this.mMenViewSep1.Size = new System.Drawing.Size(225, 6); // // mMenViewConnections // @@ -385,7 +385,7 @@ namespace mRemoteNG.UI.Forms this.mMenViewConnections.CheckState = System.Windows.Forms.CheckState.Checked; this.mMenViewConnections.Image = global::mRemoteNG.Resources.Root; this.mMenViewConnections.Name = "mMenViewConnections"; - this.mMenViewConnections.Size = new System.Drawing.Size(227, 22); + this.mMenViewConnections.Size = new System.Drawing.Size(228, 22); this.mMenViewConnections.Text = "Connections"; this.mMenViewConnections.Click += new System.EventHandler(this.mMenViewConnections_Click); // @@ -395,7 +395,7 @@ namespace mRemoteNG.UI.Forms this.mMenViewConfig.CheckState = System.Windows.Forms.CheckState.Checked; this.mMenViewConfig.Image = global::mRemoteNG.Resources.cog; this.mMenViewConfig.Name = "mMenViewConfig"; - this.mMenViewConfig.Size = new System.Drawing.Size(227, 22); + this.mMenViewConfig.Size = new System.Drawing.Size(228, 22); this.mMenViewConfig.Text = "Config"; this.mMenViewConfig.Click += new System.EventHandler(this.mMenViewConfig_Click); // @@ -405,7 +405,7 @@ namespace mRemoteNG.UI.Forms this.mMenViewErrorsAndInfos.CheckState = System.Windows.Forms.CheckState.Checked; this.mMenViewErrorsAndInfos.Image = global::mRemoteNG.Resources.ErrorsAndInfos; this.mMenViewErrorsAndInfos.Name = "mMenViewErrorsAndInfos"; - this.mMenViewErrorsAndInfos.Size = new System.Drawing.Size(227, 22); + this.mMenViewErrorsAndInfos.Size = new System.Drawing.Size(228, 22); this.mMenViewErrorsAndInfos.Text = "Errors and Infos"; this.mMenViewErrorsAndInfos.Click += new System.EventHandler(this.mMenViewErrorsAndInfos_Click); // @@ -413,14 +413,14 @@ namespace mRemoteNG.UI.Forms // this.mMenViewScreenshotManager.Image = ((System.Drawing.Image)(resources.GetObject("mMenViewScreenshotManager.Image"))); this.mMenViewScreenshotManager.Name = "mMenViewScreenshotManager"; - this.mMenViewScreenshotManager.Size = new System.Drawing.Size(227, 22); + this.mMenViewScreenshotManager.Size = new System.Drawing.Size(228, 22); this.mMenViewScreenshotManager.Text = "Screenshot Manager"; this.mMenViewScreenshotManager.Click += new System.EventHandler(this.mMenViewScreenshotManager_Click); // // ToolStripSeparator1 // this.ToolStripSeparator1.Name = "ToolStripSeparator1"; - this.ToolStripSeparator1.Size = new System.Drawing.Size(224, 6); + this.ToolStripSeparator1.Size = new System.Drawing.Size(225, 6); // // mMenViewJumpTo // @@ -429,7 +429,7 @@ namespace mRemoteNG.UI.Forms this.mMenViewJumpToErrorsInfos}); this.mMenViewJumpTo.Image = global::mRemoteNG.Resources.JumpTo; this.mMenViewJumpTo.Name = "mMenViewJumpTo"; - this.mMenViewJumpTo.Size = new System.Drawing.Size(227, 22); + this.mMenViewJumpTo.Size = new System.Drawing.Size(228, 22); this.mMenViewJumpTo.Text = "Jump To"; // // mMenViewJumpToConnectionsConfig @@ -456,20 +456,20 @@ namespace mRemoteNG.UI.Forms // this.mMenViewResetLayout.Image = global::mRemoteNG.Resources.application_side_tree; this.mMenViewResetLayout.Name = "mMenViewResetLayout"; - this.mMenViewResetLayout.Size = new System.Drawing.Size(227, 22); + this.mMenViewResetLayout.Size = new System.Drawing.Size(228, 22); this.mMenViewResetLayout.Text = "Reset Layout"; this.mMenViewResetLayout.Click += new System.EventHandler(this.mMenViewResetLayout_Click); // // mMenViewSep2 // this.mMenViewSep2.Name = "mMenViewSep2"; - this.mMenViewSep2.Size = new System.Drawing.Size(224, 6); + this.mMenViewSep2.Size = new System.Drawing.Size(225, 6); // // mMenViewQuickConnectToolbar // this.mMenViewQuickConnectToolbar.Image = global::mRemoteNG.Resources.Play_Quick; this.mMenViewQuickConnectToolbar.Name = "mMenViewQuickConnectToolbar"; - this.mMenViewQuickConnectToolbar.Size = new System.Drawing.Size(227, 22); + this.mMenViewQuickConnectToolbar.Size = new System.Drawing.Size(228, 22); this.mMenViewQuickConnectToolbar.Text = "Quick Connect Toolbar"; this.mMenViewQuickConnectToolbar.Click += new System.EventHandler(this.mMenViewQuickConnectToolbar_Click); // @@ -477,21 +477,21 @@ namespace mRemoteNG.UI.Forms // this.mMenViewExtAppsToolbar.Image = global::mRemoteNG.Resources.ExtApp; this.mMenViewExtAppsToolbar.Name = "mMenViewExtAppsToolbar"; - this.mMenViewExtAppsToolbar.Size = new System.Drawing.Size(227, 22); + this.mMenViewExtAppsToolbar.Size = new System.Drawing.Size(228, 22); this.mMenViewExtAppsToolbar.Text = "External Applications Toolbar"; this.mMenViewExtAppsToolbar.Click += new System.EventHandler(this.mMenViewExtAppsToolbar_Click); // // mMenViewSep3 // this.mMenViewSep3.Name = "mMenViewSep3"; - this.mMenViewSep3.Size = new System.Drawing.Size(224, 6); + this.mMenViewSep3.Size = new System.Drawing.Size(225, 6); // // mMenViewFullscreen // this.mMenViewFullscreen.Image = global::mRemoteNG.Resources.arrow_out; this.mMenViewFullscreen.Name = "mMenViewFullscreen"; this.mMenViewFullscreen.ShortcutKeys = System.Windows.Forms.Keys.F11; - this.mMenViewFullscreen.Size = new System.Drawing.Size(227, 22); + this.mMenViewFullscreen.Size = new System.Drawing.Size(228, 22); this.mMenViewFullscreen.Text = "Full Screen"; this.mMenViewFullscreen.Click += new System.EventHandler(this.mMenViewFullscreen_Click); // @@ -506,7 +506,7 @@ namespace mRemoteNG.UI.Forms this.mMenToolsComponentsCheck, this.mMenToolsOptions}); this.mMenTools.Name = "mMenTools"; - this.mMenTools.Size = new System.Drawing.Size(47, 20); + this.mMenTools.Size = new System.Drawing.Size(48, 20); this.mMenTools.Text = "&Tools"; // // mMenToolsSSHTransfer @@ -713,7 +713,7 @@ namespace mRemoteNG.UI.Forms this.cmbQuickConnect, this.btnQuickConnect, this.btnConnections}); - this.tsQuickConnect.Location = new System.Drawing.Point(179, 0); + this.tsQuickConnect.Location = new System.Drawing.Point(274, 0); this.tsQuickConnect.MaximumSize = new System.Drawing.Size(0, 25); this.tsQuickConnect.Name = "tsQuickConnect"; this.tsQuickConnect.Size = new System.Drawing.Size(387, 25); @@ -772,14 +772,14 @@ namespace mRemoteNG.UI.Forms this.cMenExtAppsToolbar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.cMenToolbarShowText}); this.cMenExtAppsToolbar.Name = "cMenToolbar"; - this.cMenExtAppsToolbar.Size = new System.Drawing.Size(128, 26); + this.cMenExtAppsToolbar.Size = new System.Drawing.Size(129, 26); // // cMenToolbarShowText // this.cMenToolbarShowText.Checked = true; this.cMenToolbarShowText.CheckState = System.Windows.Forms.CheckState.Checked; this.cMenToolbarShowText.Name = "cMenToolbarShowText"; - this.cMenToolbarShowText.Size = new System.Drawing.Size(127, 22); + this.cMenToolbarShowText.Size = new System.Drawing.Size(128, 22); this.cMenToolbarShowText.Text = "Show Text"; this.cMenToolbarShowText.Click += new System.EventHandler(this.cMenToolbarShowText_Click); // From f53e77ecc91c5d0cc2177bff28c8a7bfd43efa13 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 10:53:06 -0600 Subject: [PATCH 279/338] Added a few more parser tests --- mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs b/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs index 016937d91..f2fb959e0 100644 --- a/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs +++ b/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs @@ -14,6 +14,7 @@ namespace mRemoteNGTests.Tools private const string StringAfterNoEscaping = TestString; private const int Port = 9933; private const string PortAsString = "9933"; + private const string SampleCommandString = @"/k echo ()%!^abc123*<>&|""'\"; [OneTimeSetUp] @@ -76,6 +77,11 @@ namespace mRemoteNGTests.Tools [TestCase("%USERFIELD%", ExpectedResult = StringAfterAllEscaping)] [TestCase("%-USERFIELD%", ExpectedResult = StringAfterMetacharacterEscaping)] [TestCase("%!USERFIELD%", ExpectedResult = StringAfterNoEscaping)] + + [TestCase("%%", ExpectedResult = "%%")] + [TestCase("/k echo %!USERNAME%", ExpectedResult = SampleCommandString)] + [TestCase("%COMSPEC%", ExpectedResult = @"C:\Windows\system32\cmd.exe")] + [TestCase("%UNSUPPORTEDPARAMETER%", ExpectedResult = "%UNSUPPORTEDPARAMETER%")] public string ParserTest(string argumentString) { return _argumentParser.ParseArguments(argumentString); From ab30dd2294243807f46856d028b723179be7c324 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 11:49:02 -0600 Subject: [PATCH 280/338] Extracted a method in ExternalToolArgumentParser --- mRemoteV1/Tools/ExternalToolArgumentParser.cs | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/mRemoteV1/Tools/ExternalToolArgumentParser.cs b/mRemoteV1/Tools/ExternalToolArgumentParser.cs index 26313d25a..bce2a0936 100644 --- a/mRemoteV1/Tools/ExternalToolArgumentParser.cs +++ b/mRemoteV1/Tools/ExternalToolArgumentParser.cs @@ -76,17 +76,7 @@ namespace mRemoteNG.Tools var token = input.Substring(tokenStart, tokenLength); - var escape = EscapeType.All; - var prefix = input.Substring(variableNameStart, 1); - switch (prefix) - { - case "-": - escape = EscapeType.ShellMetacharacters; - break; - case "!": - escape = EscapeType.None; - break; - } + var escape = DetermineEscapeType(token); if (escape != EscapeType.All) { @@ -164,6 +154,22 @@ namespace mRemoteNG.Tools return result; } + private EscapeType DetermineEscapeType(string token) + { + var escape = EscapeType.All; + var prefix = token[1]; + switch (prefix) + { + case '-': + escape = EscapeType.ShellMetacharacters; + break; + case '!': + escape = EscapeType.None; + break; + } + return escape; + } + private string GetVariableReplacement(string variable, string original) { var replacement = ""; From 0a4010d9a9d8689de5202c3a6a368d760172177e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 11:49:28 -0600 Subject: [PATCH 281/338] Created more test cases for the ExternalToolArgumentParser --- .../Tools/ExternalToolsArgumentParserTests.cs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs b/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs index f2fb959e0..b00735447 100644 --- a/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs +++ b/mRemoteNGTests/Tools/ExternalToolsArgumentParserTests.cs @@ -78,13 +78,23 @@ namespace mRemoteNGTests.Tools [TestCase("%-USERFIELD%", ExpectedResult = StringAfterMetacharacterEscaping)] [TestCase("%!USERFIELD%", ExpectedResult = StringAfterNoEscaping)] - [TestCase("%%", ExpectedResult = "%%")] - [TestCase("/k echo %!USERNAME%", ExpectedResult = SampleCommandString)] - [TestCase("%COMSPEC%", ExpectedResult = @"C:\Windows\system32\cmd.exe")] - [TestCase("%UNSUPPORTEDPARAMETER%", ExpectedResult = "%UNSUPPORTEDPARAMETER%")] - public string ParserTest(string argumentString) + [TestCase("%%", ExpectedResult = "%%", TestName = "EmptyVariableTagsNotParsed")] + [TestCase("/k echo %!USERNAME%", ExpectedResult = SampleCommandString, TestName = "ParsingWorksWhenVariableIsNotInFirstPosition")] + [TestCase("%COMSPEC%", ExpectedResult = @"C:\Windows\system32\cmd.exe", TestName = "EnvironmentVariablesParsed")] + [TestCase("%UNSUPPORTEDPARAMETER%", ExpectedResult = "%UNSUPPORTEDPARAMETER%", TestName = "UnsupportedParametersNotParsed")] + [TestCase(@"\%COMSPEC\%", ExpectedResult = @"C:\Windows\system32\cmd.exe", TestName = "BackslashEscapedEnvironmentVariablesParsed")] + [TestCase(@"^%COMSPEC^%", ExpectedResult = "%COMSPEC%", TestName = "ChevronEscapedEnvironmentVariablesNotParsed")] + public string ParserTests(string argumentString) { return _argumentParser.ParseArguments(argumentString); } + + [Test] + public void NullConnectionInfoResultsInEmptyVariables() + { + var parser = new ExternalToolArgumentParser(null); + var parsedText = parser.ParseArguments("test %USERNAME% test"); + Assert.That(parsedText, Is.EqualTo("test test")); + } } } \ No newline at end of file From 5746d0264adc1232dcce186cac92b00bc1480a51 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 11:50:09 -0600 Subject: [PATCH 282/338] Extracted some methods in the ExternalToolArgumentParser to make it more readable --- mRemoteV1/Tools/ExternalToolArgumentParser.cs | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/mRemoteV1/Tools/ExternalToolArgumentParser.cs b/mRemoteV1/Tools/ExternalToolArgumentParser.cs index bce2a0936..b450b0a78 100644 --- a/mRemoteV1/Tools/ExternalToolArgumentParser.cs +++ b/mRemoteV1/Tools/ExternalToolArgumentParser.cs @@ -14,31 +14,30 @@ namespace mRemoteNG.Tools } public string ParseArguments(string input) + { + var replacements = BuildReplacementList(input); + var result = PerformReplacements(input, replacements); + return result; + } + + private List BuildReplacementList(string input) { var index = 0; var replacements = new List(); - do { var tokenStart = input.IndexOf("%", index, StringComparison.InvariantCulture); if (tokenStart == -1) - { break; - } var tokenEnd = input.IndexOf("%", tokenStart + 1, StringComparison.InvariantCulture); if (tokenEnd == -1) - { break; - } var tokenLength = tokenEnd - tokenStart + 1; - var variableNameStart = tokenStart + 1; var variableNameLength = tokenLength - 2; - var isEnvironmentVariable = false; - var variableName = ""; if (tokenStart > 0) @@ -134,24 +133,7 @@ namespace mRemoteNG.Tools index = tokenEnd; } } while (true); - - var result = input; - - for (index = result.Length; index >= 0; index--) - { - foreach (var replacement in replacements) - { - if (replacement.Start != index) - { - continue; - } - - var before = result.Substring(0, replacement.Start); - var after = result.Substring(replacement.Start + replacement.Length); - result = before + replacement.Value + after; - } - } - return result; + return replacements; } private EscapeType DetermineEscapeType(string token) @@ -209,6 +191,28 @@ namespace mRemoteNG.Tools return replacement; } + private string PerformReplacements(string input, List replacements) + { + int index; + var result = input; + + for (index = result.Length; index >= 0; index--) + { + foreach (var replacement in replacements) + { + if (replacement.Start != index) + { + continue; + } + + var before = result.Substring(0, replacement.Start); + var after = result.Substring(replacement.Start + replacement.Length); + result = before + replacement.Value + after; + } + } + return result; + } + private enum EscapeType { All, From 050d12a8ec8c733ef7fe9501527e1599bb2c0976 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 13:52:21 -0600 Subject: [PATCH 283/338] Created tests for the ConnectionInfoComparer --- .../Connection/ConnectionInfoComparerTests.cs | 42 +++++++++++++++++++ mRemoteNGTests/mRemoteNGTests.csproj | 1 + 2 files changed, 43 insertions(+) create mode 100644 mRemoteNGTests/Connection/ConnectionInfoComparerTests.cs diff --git a/mRemoteNGTests/Connection/ConnectionInfoComparerTests.cs b/mRemoteNGTests/Connection/ConnectionInfoComparerTests.cs new file mode 100644 index 000000000..73df486d9 --- /dev/null +++ b/mRemoteNGTests/Connection/ConnectionInfoComparerTests.cs @@ -0,0 +1,42 @@ +using System.ComponentModel; +using mRemoteNG.Connection; +using NUnit.Framework; + + +namespace mRemoteNGTests.Connection +{ + public class ConnectionInfoComparerTests + { + private ConnectionInfo _con1; + private ConnectionInfo _con2; + + [OneTimeSetUp] + public void OnetimeSetup() + { + _con1 = new ConnectionInfo { Name = "a" }; + _con2 = new ConnectionInfo { Name = "b" }; + } + + [Test] + public void SortAscendingOnName() + { + var comparer = new ConnectionInfoComparer(node => node.Name) + { + SortDirection = ListSortDirection.Ascending + }; + var compareReturn = comparer.Compare(_con1, _con2); + Assert.That(compareReturn, Is.Negative); + } + + [Test] + public void SortDescendingOnName() + { + var comparer = new ConnectionInfoComparer(node => node.Name) + { + SortDirection = ListSortDirection.Descending + }; + var compareReturn = comparer.Compare(_con1, _con2); + Assert.That(compareReturn, Is.Positive); + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 6252a216d..726649529 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -114,6 +114,7 @@ + From be22ebd789bac2649e0a0e3df604c6bf483830f2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 13:57:35 -0600 Subject: [PATCH 284/338] Code cleanup --- mRemoteV1/Connection/InterfaceControl.cs | 37 +++++++----------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/mRemoteV1/Connection/InterfaceControl.cs b/mRemoteV1/Connection/InterfaceControl.cs index da50be2f2..9d4da95fa 100644 --- a/mRemoteV1/Connection/InterfaceControl.cs +++ b/mRemoteV1/Connection/InterfaceControl.cs @@ -9,36 +9,20 @@ namespace mRemoteNG.Connection { public partial class InterfaceControl { - #region Private Variables - private ProtocolBase _Protocol; - private ConnectionInfo _Info; - #endregion + public ProtocolBase Protocol { get; set; } + public ConnectionInfo Info { get; set; } - #region Public Properties - public ProtocolBase Protocol - { - get { return this._Protocol; } - set { this._Protocol = value; } - } - - public ConnectionInfo Info - { - get { return this._Info; } - set { this._Info = value; } - } - #endregion - - #region Constructors - public InterfaceControl(Control Parent, ProtocolBase Protocol, ConnectionInfo Info) + + public InterfaceControl(Control parent, ProtocolBase protocol, ConnectionInfo info) { try { - this._Protocol = Protocol; - this._Info = Info; - this.Parent = Parent; - this.Location = new Point(0, 0); - this.Size = this.Parent.Size; - this.Anchor = (System.Windows.Forms.AnchorStyles)(AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top); + Protocol = protocol; + Info = info; + Parent = parent; + Location = new Point(0, 0); + Size = Parent.Size; + Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top; InitializeComponent(); } catch (Exception ex) @@ -46,6 +30,5 @@ namespace mRemoteNG.Connection Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t create new InterfaceControl" + Environment.NewLine + ex.Message); } } - #endregion } } \ No newline at end of file From e5c9ccbdcc288ca9129d2ab58ce4b9ae1c0d5974 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 14:15:39 -0600 Subject: [PATCH 285/338] Moved all database connectors to the Config.DatabaseConnectors namespace --- mRemoteV1/Config/Connections/ConnectionsLoader.cs | 1 + mRemoteV1/Config/Connections/ConnectionsSaver.cs | 1 + .../Config/Connections/SqlConnectionsUpdateChecker.cs | 1 + mRemoteV1/Config/DataProviders/SqlDataProvider.cs | 1 + .../Config/{ => DatabaseConnectors}/IDatabaseConnector.cs | 3 +-- .../{ => DatabaseConnectors}/SqlDatabaseConnector.cs | 7 +++---- mRemoteV1/mRemoteV1.csproj | 4 ++-- 7 files changed, 10 insertions(+), 8 deletions(-) rename mRemoteV1/Config/{ => DatabaseConnectors}/IDatabaseConnector.cs (85%) rename mRemoteV1/Config/{ => DatabaseConnectors}/SqlDatabaseConnector.cs (96%) diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index fd6189ed5..a7540255f 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -1,4 +1,5 @@ using mRemoteNG.App; +using mRemoteNG.Config.DatabaseConnectors; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Putty; using mRemoteNG.Config.Serializers; diff --git a/mRemoteV1/Config/Connections/ConnectionsSaver.cs b/mRemoteV1/Config/Connections/ConnectionsSaver.cs index 8cfe3cca7..1fb14e0f9 100644 --- a/mRemoteV1/Config/Connections/ConnectionsSaver.cs +++ b/mRemoteV1/Config/Connections/ConnectionsSaver.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using System.Xml; using mRemoteNG.App; using mRemoteNG.App.Info; +using mRemoteNG.Config.DatabaseConnectors; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Serializers; using mRemoteNG.Connection; diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs index 4e43490d7..846411aff 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs @@ -4,6 +4,7 @@ using System; using System.Data; using System.Data.SqlClient; using System.Threading; +using mRemoteNG.Config.DatabaseConnectors; namespace mRemoteNG.Config.Connections { diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs index b1892c2f5..2b91c955d 100644 --- a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -1,5 +1,6 @@ using System.Data; using System.Data.SqlClient; +using mRemoteNG.Config.DatabaseConnectors; namespace mRemoteNG.Config.DataProviders diff --git a/mRemoteV1/Config/IDatabaseConnector.cs b/mRemoteV1/Config/DatabaseConnectors/IDatabaseConnector.cs similarity index 85% rename from mRemoteV1/Config/IDatabaseConnector.cs rename to mRemoteV1/Config/DatabaseConnectors/IDatabaseConnector.cs index 1f3e0d50c..c1f52a537 100644 --- a/mRemoteV1/Config/IDatabaseConnector.cs +++ b/mRemoteV1/Config/DatabaseConnectors/IDatabaseConnector.cs @@ -1,8 +1,7 @@ using System; using System.Data.SqlClient; - -namespace mRemoteNG.Config +namespace mRemoteNG.Config.DatabaseConnectors { public interface IDatabaseConnector : IDisposable { diff --git a/mRemoteV1/Config/SqlDatabaseConnector.cs b/mRemoteV1/Config/DatabaseConnectors/SqlDatabaseConnector.cs similarity index 96% rename from mRemoteV1/Config/SqlDatabaseConnector.cs rename to mRemoteV1/Config/DatabaseConnectors/SqlDatabaseConnector.cs index 8ee03dcf4..ba13a1967 100644 --- a/mRemoteV1/Config/SqlDatabaseConnector.cs +++ b/mRemoteV1/Config/DatabaseConnectors/SqlDatabaseConnector.cs @@ -1,10 +1,9 @@ using System.Data; -using mRemoteNG.App.Info; using System.Data.SqlClient; -using mRemoteNG.Security.SymmetricEncryption; +using mRemoteNG.App.Info; +using mRemoteNG.Security.SymmetricEncryption; - -namespace mRemoteNG.Config +namespace mRemoteNG.Config.DatabaseConnectors { public class SqlDatabaseConnector : IDatabaseConnector { diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index ac8b9aafc..e0cdc51fc 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -173,8 +173,8 @@ - - + + From 40455e199bf49fc12455f4263eef342f1ef13bde Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 15:05:04 -0600 Subject: [PATCH 286/338] Fixed bug that would occasionally cause crashes when clicking --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index afbb3df93..98761fb9c 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -420,8 +420,9 @@ namespace mRemoteNG.UI.Window try { if (e.ClickCount > 1) return; - var clickedNode = (ConnectionInfo)e.Model; - + var clickedNode = e.Model as ConnectionInfo; + + if (clickedNode == null) return; if (clickedNode.GetTreeNodeType() != TreeNodeType.Connection && clickedNode.GetTreeNodeType() != TreeNodeType.PuttySession) return; if (Settings.Default.SingleClickOnConnectionOpensIt) ConnectionInitiator.OpenConnection(SelectedNode); From 05028c958ef869501d41b3dbb5ae095eef2cccde Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 15:08:40 -0600 Subject: [PATCH 287/338] Fixed crash that would occur when double clicking inside a connection window after disconnecting --- mRemoteV1/UI/Window/ConnectionWindow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index 74930598b..7efa4990b 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -505,6 +505,7 @@ namespace mRemoteNG.UI.Window try { Crownwood.Magic.Controls.TabPage selectedTab = TabController.SelectedTab; + if (selectedTab == null) return; if (Settings.Default.ConfirmCloseConnection == (int)ConfirmCloseEnum.All) { DialogResult result = CTaskDialog.MessageBox(this, GeneralAppInfo.ProdName, string.Format(Language.strConfirmCloseConnectionMainInstruction, selectedTab.Title), "", "", "", Language.strCheckboxDoNotShowThisMessageAgain, ETaskDialogButtons.YesNo, ESysIcons.Question, ESysIcons.Question); From fcd846bd6dbf24c5f9ad64b168ef740ce63558a5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 15:09:50 -0600 Subject: [PATCH 288/338] Dragging connections/folder onto a connection panel now opens the connection(s). This restores functionality for dragging single connections, but is new functionality for folders --- mRemoteV1/UI/Window/ConnectionWindow.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index 7efa4990b..21627b1fd 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.Windows.Forms; +using BrightIdeasSoftware; using mRemoteNG.Connection; using mRemoteNG.App; using WeifenLuo.WinFormsUI.Docking; @@ -11,6 +12,7 @@ using mRemoteNG.Connection.Protocol; using mRemoteNG.UI.Forms; using mRemoteNG.UI.TaskDialog; using mRemoteNG.App.Info; +using mRemoteNG.Container; using mRemoteNG.UI.Forms.Input; namespace mRemoteNG.UI.Window @@ -549,10 +551,17 @@ namespace mRemoteNG.UI.Window #region Drag and Drop private void TabController_DragDrop(object sender, DragEventArgs e) { - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) + var dropDataAsOlvDataObject = e.Data as OLVDataObject; + if (dropDataAsOlvDataObject == null) return; + var modelObjects = dropDataAsOlvDataObject.ModelObjects; + foreach (var model in modelObjects) { - var connectionInfo = (ConnectionInfo) ((TreeNode) e.Data.GetData("System.Windows.Forms.TreeNode", true)).Tag; - ConnectionInitiator.OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump, this); + var modelAsContainer = model as ContainerInfo; + var modelAsConnection = model as ConnectionInfo; + if (modelAsContainer != null) + ConnectionInitiator.OpenConnection(modelAsContainer); + else if (modelAsConnection != null) + ConnectionInitiator.OpenConnection(modelAsConnection); } } From 3e4cfc16df32fd3641c67740e309b9ea9b98626d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 28 Sep 2016 15:26:18 -0600 Subject: [PATCH 289/338] Simplified teh ConnectionWindow drag_over handler and made it safer (actually does type checking) --- mRemoteV1/UI/Window/ConnectionWindow.cs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index 21627b1fd..b0b893eb7 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -1,5 +1,6 @@ using System; using System.Drawing; +using System.Linq; using System.Windows.Forms; using BrightIdeasSoftware; using mRemoteNG.Connection; @@ -53,7 +54,6 @@ namespace mRemoteNG.UI.Window TabController.ClosePressed += TabController_ClosePressed; TabController.DoubleClickTab += TabController_DoubleClickTab; TabController.DragDrop += TabController_DragDrop; - TabController.DragEnter += TabController_DragEnter; TabController.DragOver += TabController_DragOver; TabController.SelectionChanged += TabController_SelectionChanged; TabController.MouseUp += TabController_MouseUp; @@ -565,16 +565,13 @@ namespace mRemoteNG.UI.Window } } - private void TabController_DragEnter(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", true)) - { - e.Effect = DragDropEffects.Move; - } - } - private void TabController_DragOver(object sender, DragEventArgs e) { + e.Effect = DragDropEffects.None; + var dropDataAsOlvDataObject = e.Data as OLVDataObject; + var modelObjects = dropDataAsOlvDataObject?.ModelObjects; + if (modelObjects == null) return; + if (!modelObjects.OfType().Any()) return; e.Effect = DragDropEffects.Move; } #endregion From 2ff9a7ff22623ba374283dcd6e929fd702ce382b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 29 Sep 2016 09:16:57 -0600 Subject: [PATCH 290/338] Large code cleanup of the ConnectionWindow class --- mRemoteV1/UI/Forms/frmMain.cs | 2 +- .../UI/Window/ConnectionWindow.Designer.cs | 236 +++++ mRemoteV1/UI/Window/ConnectionWindow.cs | 855 +++++------------- mRemoteV1/mRemoteV1.csproj | 3 + 4 files changed, 474 insertions(+), 622 deletions(-) create mode 100644 mRemoteV1/UI/Window/ConnectionWindow.Designer.cs diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 9285363d8..50662b641 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -1117,7 +1117,7 @@ namespace mRemoteNG.UI.Forms var tab = w.TabController.SelectedTab; var ifc = (InterfaceControl)tab.Tag; ifc.Protocol.Focus(); - ((ConnectionWindow) ifc.FindForm())?.RefreshIC(); + ((ConnectionWindow) ifc.FindForm())?.RefreshInterfaceController(); } private void pnlDock_ActiveDocumentChanged(object sender, EventArgs e) diff --git a/mRemoteV1/UI/Window/ConnectionWindow.Designer.cs b/mRemoteV1/UI/Window/ConnectionWindow.Designer.cs new file mode 100644 index 000000000..08a0ef4ab --- /dev/null +++ b/mRemoteV1/UI/Window/ConnectionWindow.Designer.cs @@ -0,0 +1,236 @@ +using System; +using System.Drawing; +using System.Windows.Forms; +using TabControl = Crownwood.Magic.Controls.TabControl; + + +namespace mRemoteNG.UI.Window +{ + public partial class ConnectionWindow + { + internal ContextMenuStrip cmenTab; + private System.ComponentModel.Container components; + private ToolStripMenuItem cmenTabFullscreen; + private ToolStripMenuItem cmenTabScreenshot; + private ToolStripMenuItem cmenTabTransferFile; + private ToolStripMenuItem cmenTabSendSpecialKeys; + private ToolStripSeparator cmenTabSep1; + private ToolStripMenuItem cmenTabRenameTab; + private ToolStripMenuItem cmenTabDuplicateTab; + private ToolStripMenuItem cmenTabDisconnect; + private ToolStripMenuItem cmenTabSmartSize; + private ToolStripMenuItem cmenTabSendSpecialKeysCtrlAltDel; + private ToolStripMenuItem cmenTabSendSpecialKeysCtrlEsc; + private ToolStripMenuItem cmenTabViewOnly; + internal ToolStripMenuItem cmenTabReconnect; + internal ToolStripMenuItem cmenTabExternalApps; + private ToolStripMenuItem cmenTabStartChat; + private ToolStripMenuItem cmenTabRefreshScreen; + private ToolStripSeparator ToolStripSeparator1; + private ToolStripMenuItem cmenTabPuttySettings; + + + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConnectionWindow)); + TabController = new TabControl(); + cmenTab = new ContextMenuStrip(components); + cmenTabFullscreen = new ToolStripMenuItem(); + cmenTabSmartSize = new ToolStripMenuItem(); + cmenTabViewOnly = new ToolStripMenuItem(); + ToolStripSeparator1 = new ToolStripSeparator(); + cmenTabScreenshot = new ToolStripMenuItem(); + cmenTabStartChat = new ToolStripMenuItem(); + cmenTabTransferFile = new ToolStripMenuItem(); + cmenTabRefreshScreen = new ToolStripMenuItem(); + cmenTabSendSpecialKeys = new ToolStripMenuItem(); + cmenTabSendSpecialKeysCtrlAltDel = new ToolStripMenuItem(); + cmenTabSendSpecialKeysCtrlEsc = new ToolStripMenuItem(); + cmenTabExternalApps = new ToolStripMenuItem(); + cmenTabSep1 = new ToolStripSeparator(); + cmenTabRenameTab = new ToolStripMenuItem(); + cmenTabDuplicateTab = new ToolStripMenuItem(); + cmenTabReconnect = new ToolStripMenuItem(); + cmenTabDisconnect = new ToolStripMenuItem(); + cmenTabPuttySettings = new ToolStripMenuItem(); + cmenTab.SuspendLayout(); + SuspendLayout(); + // + //TabController + // + TabController.Anchor = ((AnchorStyles.Top | AnchorStyles.Bottom) + | AnchorStyles.Left) + | AnchorStyles.Right; + TabController.Appearance = TabControl.VisualAppearance.MultiDocument; + TabController.Cursor = Cursors.Hand; + TabController.DragFromControl = false; + TabController.IDEPixelArea = true; + TabController.IDEPixelBorder = false; + TabController.Location = new Point(0, -1); + TabController.Name = "TabController"; + TabController.Size = new Size(632, 454); + TabController.TabIndex = 0; + // + //cmenTab + // + cmenTab.Items.AddRange(new ToolStripItem[] + { + cmenTabFullscreen, + cmenTabSmartSize, + cmenTabViewOnly, + ToolStripSeparator1, + cmenTabScreenshot, + cmenTabStartChat, + cmenTabTransferFile, + cmenTabRefreshScreen, + cmenTabSendSpecialKeys, + cmenTabPuttySettings, + cmenTabExternalApps, + cmenTabSep1, + cmenTabRenameTab, + cmenTabDuplicateTab, + cmenTabReconnect, + cmenTabDisconnect + }); + cmenTab.Name = "cmenTab"; + cmenTab.RenderMode = ToolStripRenderMode.Professional; + cmenTab.Size = new Size(202, 346); + // + //cmenTabFullscreen + // + cmenTabFullscreen.Image = Resources.arrow_out; + cmenTabFullscreen.Name = "cmenTabFullscreen"; + cmenTabFullscreen.Size = new Size(201, 22); + cmenTabFullscreen.Text = @"Fullscreen (RDP)"; + // + //cmenTabSmartSize + // + cmenTabSmartSize.Image = Resources.SmartSize; + cmenTabSmartSize.Name = "cmenTabSmartSize"; + cmenTabSmartSize.Size = new Size(201, 22); + cmenTabSmartSize.Text = @"SmartSize (RDP/VNC)"; + // + //cmenTabViewOnly + // + cmenTabViewOnly.Name = "cmenTabViewOnly"; + cmenTabViewOnly.Size = new Size(201, 22); + cmenTabViewOnly.Text = @"View Only (VNC)"; + // + //ToolStripSeparator1 + // + ToolStripSeparator1.Name = "ToolStripSeparator1"; + ToolStripSeparator1.Size = new Size(198, 6); + // + //cmenTabScreenshot + // + cmenTabScreenshot.Image = Resources.Screenshot_Add; + cmenTabScreenshot.Name = "cmenTabScreenshot"; + cmenTabScreenshot.Size = new Size(201, 22); + cmenTabScreenshot.Text = @"Screenshot"; + // + //cmenTabStartChat + // + cmenTabStartChat.Image = Resources.Chat; + cmenTabStartChat.Name = "cmenTabStartChat"; + cmenTabStartChat.Size = new Size(201, 22); + cmenTabStartChat.Text = @"Start Chat (VNC)"; + cmenTabStartChat.Visible = false; + // + //cmenTabTransferFile + // + cmenTabTransferFile.Image = Resources.SSHTransfer; + cmenTabTransferFile.Name = "cmenTabTransferFile"; + cmenTabTransferFile.Size = new Size(201, 22); + cmenTabTransferFile.Text = @"Transfer File (SSH)"; + // + //cmenTabRefreshScreen + // + cmenTabRefreshScreen.Image = Resources.Refresh; + cmenTabRefreshScreen.Name = "cmenTabRefreshScreen"; + cmenTabRefreshScreen.Size = new Size(201, 22); + cmenTabRefreshScreen.Text = @"Refresh Screen (VNC)"; + // + //cmenTabSendSpecialKeys + // + cmenTabSendSpecialKeys.DropDownItems.AddRange(new ToolStripItem[] + { + cmenTabSendSpecialKeysCtrlAltDel, + cmenTabSendSpecialKeysCtrlEsc + }); + cmenTabSendSpecialKeys.Image = Resources.Keyboard; + cmenTabSendSpecialKeys.Name = "cmenTabSendSpecialKeys"; + cmenTabSendSpecialKeys.Size = new Size(201, 22); + cmenTabSendSpecialKeys.Text = @"Send special Keys (VNC)"; + // + //cmenTabSendSpecialKeysCtrlAltDel + // + cmenTabSendSpecialKeysCtrlAltDel.Name = "cmenTabSendSpecialKeysCtrlAltDel"; + cmenTabSendSpecialKeysCtrlAltDel.Size = new Size(141, 22); + cmenTabSendSpecialKeysCtrlAltDel.Text = @"Ctrl+Alt+Del"; + // + //cmenTabSendSpecialKeysCtrlEsc + // + cmenTabSendSpecialKeysCtrlEsc.Name = "cmenTabSendSpecialKeysCtrlEsc"; + cmenTabSendSpecialKeysCtrlEsc.Size = new Size(141, 22); + cmenTabSendSpecialKeysCtrlEsc.Text = @"Ctrl+Esc"; + // + //cmenTabExternalApps + // + cmenTabExternalApps.Image = (Image)(resources.GetObject("cmenTabExternalApps.Image")); + cmenTabExternalApps.Name = "cmenTabExternalApps"; + cmenTabExternalApps.Size = new Size(201, 22); + cmenTabExternalApps.Text = @"External Applications"; + // + //cmenTabSep1 + // + cmenTabSep1.Name = "cmenTabSep1"; + cmenTabSep1.Size = new Size(198, 6); + // + //cmenTabRenameTab + // + cmenTabRenameTab.Image = Resources.Rename; + cmenTabRenameTab.Name = "cmenTabRenameTab"; + cmenTabRenameTab.Size = new Size(201, 22); + cmenTabRenameTab.Text = @"Rename Tab"; + // + //cmenTabDuplicateTab + // + cmenTabDuplicateTab.Name = "cmenTabDuplicateTab"; + cmenTabDuplicateTab.Size = new Size(201, 22); + cmenTabDuplicateTab.Text = @"Duplicate Tab"; + // + //cmenTabReconnect + // + cmenTabReconnect.Image = (Image)(resources.GetObject("cmenTabReconnect.Image")); + cmenTabReconnect.Name = "cmenTabReconnect"; + cmenTabReconnect.Size = new Size(201, 22); + cmenTabReconnect.Text = @"Reconnect"; + // + //cmenTabDisconnect + // + cmenTabDisconnect.Image = Resources.Pause; + cmenTabDisconnect.Name = "cmenTabDisconnect"; + cmenTabDisconnect.Size = new Size(201, 22); + cmenTabDisconnect.Text = @"Disconnect"; + // + //cmenTabPuttySettings + // + cmenTabPuttySettings.Name = "cmenTabPuttySettings"; + cmenTabPuttySettings.Size = new Size(201, 22); + cmenTabPuttySettings.Text = @"PuTTY Settings"; + // + //Connection + // + ClientSize = new Size(632, 453); + Controls.Add(TabController); + Font = new Font("Segoe UI", 8.25F, FontStyle.Regular, GraphicsUnit.Point, Convert.ToByte(0)); + Icon = Resources.mRemote_Icon; + Name = "Connection"; + TabText = @"UI.Window.Connection"; + Text = @"UI.Window.Connection"; + cmenTab.ResumeLayout(false); + ResumeLayout(false); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index b0b893eb7..1f1f496d0 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; using System.Linq; +using System.Runtime.InteropServices; using System.Windows.Forms; using BrightIdeasSoftware; using mRemoteNG.Connection; @@ -14,43 +15,54 @@ using mRemoteNG.UI.Forms; using mRemoteNG.UI.TaskDialog; using mRemoteNG.App.Info; using mRemoteNG.Container; +using mRemoteNG.Messages; +using mRemoteNG.Tools; using mRemoteNG.UI.Forms.Input; +using Message = System.Windows.Forms.Message; +using TabControl = Crownwood.Magic.Controls.TabControl; +using TabPage = Crownwood.Magic.Controls.TabPage; + namespace mRemoteNG.UI.Window { - public class ConnectionWindow : BaseWindow + public partial class ConnectionWindow : BaseWindow { - #region Form Init - internal ContextMenuStrip cmenTab; - private System.ComponentModel.Container components; - private ToolStripMenuItem cmenTabFullscreen; - private ToolStripMenuItem cmenTabScreenshot; - private ToolStripMenuItem cmenTabTransferFile; - private ToolStripMenuItem cmenTabSendSpecialKeys; - private ToolStripSeparator cmenTabSep1; - private ToolStripMenuItem cmenTabRenameTab; - private ToolStripMenuItem cmenTabDuplicateTab; - private ToolStripMenuItem cmenTabDisconnect; - private ToolStripMenuItem cmenTabSmartSize; - private ToolStripMenuItem cmenTabSendSpecialKeysCtrlAltDel; - private ToolStripMenuItem cmenTabSendSpecialKeysCtrlEsc; - private ToolStripMenuItem cmenTabViewOnly; - internal ToolStripMenuItem cmenTabReconnect; - internal ToolStripMenuItem cmenTabExternalApps; - private ToolStripMenuItem cmenTabStartChat; - private ToolStripMenuItem cmenTabRefreshScreen; - private ToolStripSeparator ToolStripSeparator1; - private ToolStripMenuItem cmenTabPuttySettings; + public TabControl TabController; + - public Crownwood.Magic.Controls.TabControl TabController; - private void InitializeComponent() + #region Public Methods + public ConnectionWindow(DockContent panel, string formText = "") + { + if (formText == "") + { + formText = Language.strNewPanel; + } + + WindowType = WindowType.Connection; + DockPnl = panel; + InitializeComponent(); + SetEventHandlers(); + // ReSharper disable once VirtualMemberCallInConstructor + Text = formText; + TabText = formText; + } + + private void SetEventHandlers() + { + SetFormEventHandlers(); + SetTabControllerEventHandlers(); + SetContextMenuEventHandlers(); + } + + private void SetFormEventHandlers() { - components = new System.ComponentModel.Container(); Load += Connection_Load; DockStateChanged += Connection_DockStateChanged; FormClosing += Connection_FormClosing; - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConnectionWindow)); - TabController = new Crownwood.Magic.Controls.TabControl(); + } + + private void SetTabControllerEventHandlers() + { TabController.ClosePressed += TabController_ClosePressed; TabController.DoubleClickTab += TabController_DoubleClickTab; TabController.DragDrop += TabController_DragDrop; @@ -62,249 +74,53 @@ namespace mRemoteNG.UI.Window TabController.PageDragMove += TabController_PageDragMove; TabController.PageDragEnd += TabController_PageDragEnd; TabController.PageDragQuit += TabController_PageDragEnd; - cmenTab = new ContextMenuStrip(components); - cmenTabFullscreen = new ToolStripMenuItem(); - cmenTabFullscreen.Click += cmenTabFullscreen_Click; - cmenTabSmartSize = new ToolStripMenuItem(); - cmenTabSmartSize.Click += cmenTabSmartSize_Click; - cmenTabViewOnly = new ToolStripMenuItem(); - cmenTabViewOnly.Click += cmenTabViewOnly_Click; - ToolStripSeparator1 = new ToolStripSeparator(); - cmenTabScreenshot = new ToolStripMenuItem(); - cmenTabScreenshot.Click += cmenTabScreenshot_Click; - cmenTabStartChat = new ToolStripMenuItem(); - cmenTabStartChat.Click += cmenTabStartChat_Click; - cmenTabTransferFile = new ToolStripMenuItem(); - cmenTabTransferFile.Click += cmenTabTransferFile_Click; - cmenTabRefreshScreen = new ToolStripMenuItem(); - cmenTabRefreshScreen.Click += cmenTabRefreshScreen_Click; - cmenTabSendSpecialKeys = new ToolStripMenuItem(); - cmenTabSendSpecialKeysCtrlAltDel = new ToolStripMenuItem(); - cmenTabSendSpecialKeysCtrlAltDel.Click += cmenTabSendSpecialKeysCtrlAltDel_Click; - cmenTabSendSpecialKeysCtrlEsc = new ToolStripMenuItem(); - cmenTabSendSpecialKeysCtrlEsc.Click += cmenTabSendSpecialKeysCtrlEsc_Click; - cmenTabExternalApps = new ToolStripMenuItem(); - cmenTabSep1 = new ToolStripSeparator(); - cmenTabRenameTab = new ToolStripMenuItem(); - cmenTabRenameTab.Click += cmenTabRenameTab_Click; - cmenTabDuplicateTab = new ToolStripMenuItem(); - cmenTabDuplicateTab.Click += cmenTabDuplicateTab_Click; - cmenTabReconnect = new ToolStripMenuItem(); - cmenTabReconnect.Click += cmenTabReconnect_Click; - cmenTabDisconnect = new ToolStripMenuItem(); - cmenTabDisconnect.Click += cmenTabDisconnect_Click; - cmenTabPuttySettings = new ToolStripMenuItem(); - cmenTabPuttySettings.Click += cmenTabPuttySettings_Click; - cmenTab.SuspendLayout(); - SuspendLayout(); - // - //TabController - // - TabController.Anchor = ((AnchorStyles.Top | AnchorStyles.Bottom) - | AnchorStyles.Left) - | AnchorStyles.Right; - TabController.Appearance = Crownwood.Magic.Controls.TabControl.VisualAppearance.MultiDocument; - TabController.Cursor = Cursors.Hand; - TabController.DragFromControl = false; - TabController.IDEPixelArea = true; - TabController.IDEPixelBorder = false; - TabController.Location = new Point(0, -1); - TabController.Name = "TabController"; - TabController.Size = new Size(632, 454); - TabController.TabIndex = 0; - // - //cmenTab - // - cmenTab.Items.AddRange(new ToolStripItem[] { cmenTabFullscreen, cmenTabSmartSize, cmenTabViewOnly, ToolStripSeparator1, cmenTabScreenshot, cmenTabStartChat, cmenTabTransferFile, cmenTabRefreshScreen, cmenTabSendSpecialKeys, cmenTabPuttySettings, cmenTabExternalApps, cmenTabSep1, cmenTabRenameTab, cmenTabDuplicateTab, cmenTabReconnect, cmenTabDisconnect }); - cmenTab.Name = "cmenTab"; - cmenTab.RenderMode = ToolStripRenderMode.Professional; - cmenTab.Size = new Size(202, 346); - // - //cmenTabFullscreen - // - cmenTabFullscreen.Image = Resources.arrow_out; - cmenTabFullscreen.Name = "cmenTabFullscreen"; - cmenTabFullscreen.Size = new Size(201, 22); - cmenTabFullscreen.Text = @"Fullscreen (RDP)"; - // - //cmenTabSmartSize - // - cmenTabSmartSize.Image = Resources.SmartSize; - cmenTabSmartSize.Name = "cmenTabSmartSize"; - cmenTabSmartSize.Size = new Size(201, 22); - cmenTabSmartSize.Text = @"SmartSize (RDP/VNC)"; - // - //cmenTabViewOnly - // - cmenTabViewOnly.Name = "cmenTabViewOnly"; - cmenTabViewOnly.Size = new Size(201, 22); - cmenTabViewOnly.Text = @"View Only (VNC)"; - // - //ToolStripSeparator1 - // - ToolStripSeparator1.Name = "ToolStripSeparator1"; - ToolStripSeparator1.Size = new Size(198, 6); - // - //cmenTabScreenshot - // - cmenTabScreenshot.Image = Resources.Screenshot_Add; - cmenTabScreenshot.Name = "cmenTabScreenshot"; - cmenTabScreenshot.Size = new Size(201, 22); - cmenTabScreenshot.Text = @"Screenshot"; - // - //cmenTabStartChat - // - cmenTabStartChat.Image = Resources.Chat; - cmenTabStartChat.Name = "cmenTabStartChat"; - cmenTabStartChat.Size = new Size(201, 22); - cmenTabStartChat.Text = @"Start Chat (VNC)"; - cmenTabStartChat.Visible = false; - // - //cmenTabTransferFile - // - cmenTabTransferFile.Image = Resources.SSHTransfer; - cmenTabTransferFile.Name = "cmenTabTransferFile"; - cmenTabTransferFile.Size = new Size(201, 22); - cmenTabTransferFile.Text = @"Transfer File (SSH)"; - // - //cmenTabRefreshScreen - // - cmenTabRefreshScreen.Image = Resources.Refresh; - cmenTabRefreshScreen.Name = "cmenTabRefreshScreen"; - cmenTabRefreshScreen.Size = new Size(201, 22); - cmenTabRefreshScreen.Text = @"Refresh Screen (VNC)"; - // - //cmenTabSendSpecialKeys - // - cmenTabSendSpecialKeys.DropDownItems.AddRange(new ToolStripItem[] { cmenTabSendSpecialKeysCtrlAltDel, cmenTabSendSpecialKeysCtrlEsc }); - cmenTabSendSpecialKeys.Image = Resources.Keyboard; - cmenTabSendSpecialKeys.Name = "cmenTabSendSpecialKeys"; - cmenTabSendSpecialKeys.Size = new Size(201, 22); - cmenTabSendSpecialKeys.Text = @"Send special Keys (VNC)"; - // - //cmenTabSendSpecialKeysCtrlAltDel - // - cmenTabSendSpecialKeysCtrlAltDel.Name = "cmenTabSendSpecialKeysCtrlAltDel"; - cmenTabSendSpecialKeysCtrlAltDel.Size = new Size(141, 22); - cmenTabSendSpecialKeysCtrlAltDel.Text = @"Ctrl+Alt+Del"; - // - //cmenTabSendSpecialKeysCtrlEsc - // - cmenTabSendSpecialKeysCtrlEsc.Name = "cmenTabSendSpecialKeysCtrlEsc"; - cmenTabSendSpecialKeysCtrlEsc.Size = new Size(141, 22); - cmenTabSendSpecialKeysCtrlEsc.Text = @"Ctrl+Esc"; - // - //cmenTabExternalApps - // - cmenTabExternalApps.Image = (Image)(resources.GetObject("cmenTabExternalApps.Image")); - cmenTabExternalApps.Name = "cmenTabExternalApps"; - cmenTabExternalApps.Size = new Size(201, 22); - cmenTabExternalApps.Text = @"External Applications"; - // - //cmenTabSep1 - // - cmenTabSep1.Name = "cmenTabSep1"; - cmenTabSep1.Size = new Size(198, 6); - // - //cmenTabRenameTab - // - cmenTabRenameTab.Image = Resources.Rename; - cmenTabRenameTab.Name = "cmenTabRenameTab"; - cmenTabRenameTab.Size = new Size(201, 22); - cmenTabRenameTab.Text = @"Rename Tab"; - // - //cmenTabDuplicateTab - // - cmenTabDuplicateTab.Name = "cmenTabDuplicateTab"; - cmenTabDuplicateTab.Size = new Size(201, 22); - cmenTabDuplicateTab.Text = @"Duplicate Tab"; - // - //cmenTabReconnect - // - cmenTabReconnect.Image = (Image)(resources.GetObject("cmenTabReconnect.Image")); - cmenTabReconnect.Name = "cmenTabReconnect"; - cmenTabReconnect.Size = new Size(201, 22); - cmenTabReconnect.Text = @"Reconnect"; - // - //cmenTabDisconnect - // - cmenTabDisconnect.Image = Resources.Pause; - cmenTabDisconnect.Name = "cmenTabDisconnect"; - cmenTabDisconnect.Size = new Size(201, 22); - cmenTabDisconnect.Text = @"Disconnect"; - // - //cmenTabPuttySettings - // - cmenTabPuttySettings.Name = "cmenTabPuttySettings"; - cmenTabPuttySettings.Size = new Size(201, 22); - cmenTabPuttySettings.Text = @"PuTTY Settings"; - // - //Connection - // - ClientSize = new Size(632, 453); - Controls.Add(TabController); - Font = new Font("Segoe UI", 8.25F, FontStyle.Regular, GraphicsUnit.Point, Convert.ToByte(0)); - Icon = Resources.mRemote_Icon; - Name = "Connection"; - TabText = @"UI.Window.Connection"; - Text = @"UI.Window.Connection"; - cmenTab.ResumeLayout(false); - ResumeLayout(false); - } - #endregion - #region Public Methods - public ConnectionWindow(DockContent Panel, string FormText = "") + private void SetContextMenuEventHandlers() { - if (FormText == "") - { - FormText = Language.strNewPanel; - } - - WindowType = WindowType.Connection; - DockPnl = Panel; - InitializeComponent(); - // ReSharper disable once VirtualMemberCallInConstructor - Text = FormText; - TabText = FormText; + cmenTabFullscreen.Click += (sender, args) => ToggleFullscreen(); + cmenTabSmartSize.Click += (sender, args) => ToggleSmartSize(); + cmenTabViewOnly.Click += (sender, args) => ToggleViewOnly(); + cmenTabScreenshot.Click += (sender, args) => CreateScreenshot(); + cmenTabStartChat.Click += (sender, args) => StartChat(); + cmenTabTransferFile.Click += (sender, args) => TransferFile(); + cmenTabRefreshScreen.Click += (sender, args) => RefreshScreen(); + cmenTabSendSpecialKeysCtrlAltDel.Click += (sender, args) => SendSpecialKeys(ProtocolVNC.SpecialKeys.CtrlAltDel); + cmenTabSendSpecialKeysCtrlEsc.Click += (sender, args) => SendSpecialKeys(ProtocolVNC.SpecialKeys.CtrlEsc); + cmenTabRenameTab.Click += (sender, args) => RenameTab(); + cmenTabDuplicateTab.Click += (sender, args) => DuplicateTab(); + cmenTabReconnect.Click += (sender, args) => Reconnect(); + cmenTabDisconnect.Click += (sender, args) => CloseTabMenu(); + cmenTabPuttySettings.Click += (sender, args) => ShowPuttySettingsDialog(); } - public Crownwood.Magic.Controls.TabPage AddConnectionTab(ConnectionInfo conI) + public TabPage AddConnectionTab(ConnectionInfo connectionInfo) { try { - Crownwood.Magic.Controls.TabPage nTab = new Crownwood.Magic.Controls.TabPage(); - nTab.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top; + var nTab = new TabPage + { + Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top + }; if (Settings.Default.ShowProtocolOnTabs) - { - nTab.Title = conI.Protocol.ToString() + @": "; - } + nTab.Title = connectionInfo.Protocol + @": "; else - { nTab.Title = ""; - } - nTab.Title += conI.Name; + nTab.Title += connectionInfo.Name; if (Settings.Default.ShowLogonInfoOnTabs) { nTab.Title += @" ("; + if (connectionInfo.Domain != "") + nTab.Title += connectionInfo.Domain; - if (conI.Domain != "") + if (connectionInfo.Username != "") { - nTab.Title += conI.Domain; - } - - if (conI.Username != "") - { - if (conI.Domain != "") - { + if (connectionInfo.Domain != "") nTab.Title += @"\"; - } - - nTab.Title += conI.Username; + nTab.Title += connectionInfo.Username; } nTab.Title += @")"; @@ -312,20 +128,14 @@ namespace mRemoteNG.UI.Window nTab.Title = nTab.Title.Replace("&", "&&"); - Icon conIcon = ConnectionIcon.FromString(conI.Icon); + var conIcon = ConnectionIcon.FromString(connectionInfo.Icon); if (conIcon != null) - { nTab.Icon = conIcon; - } if (Settings.Default.OpenTabsRightOfSelected) - { TabController.TabPages.Insert(TabController.SelectedIndex + 1, nTab); - } else - { TabController.TabPages.Add(nTab); - } nTab.Selected = true; _ignoreChangeSelectedTabClick = false; @@ -334,14 +144,12 @@ namespace mRemoteNG.UI.Window } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "AddConnectionTab (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "AddConnectionTab (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } return null; } - #endregion - #region Private Methods public void UpdateSelectedConnection() { if (TabController.SelectedTab == null) @@ -350,15 +158,8 @@ namespace mRemoteNG.UI.Window } else { - InterfaceControl interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; - if (interfaceControl == null) - { - frmMain.Default.SelectedConnection = null; - } - else - { - frmMain.Default.SelectedConnection = interfaceControl.Info; - } + var interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; + frmMain.Default.SelectedConnection = interfaceControl?.Info; } } #endregion @@ -425,7 +226,7 @@ namespace mRemoteNG.UI.Window ((Settings.Default.ConfirmCloseConnection == (int)ConfirmCloseEnum.All & TabController.TabPages.Count > 0) || (Settings.Default.ConfirmCloseConnection == (int)ConfirmCloseEnum.Multiple & TabController.TabPages.Count > 1))) { - DialogResult result = CTaskDialog.MessageBox(this, GeneralAppInfo.ProdName, string.Format(Language.strConfirmCloseConnectionPanelMainInstruction, Text), "", "", "", Language.strCheckboxDoNotShowThisMessageAgain, ETaskDialogButtons.YesNo, ESysIcons.Question, ESysIcons.Question); + var result = CTaskDialog.MessageBox(this, GeneralAppInfo.ProdName, string.Format(Language.strConfirmCloseConnectionPanelMainInstruction, Text), "", "", "", Language.strCheckboxDoNotShowThisMessageAgain, ETaskDialogButtons.YesNo, ESysIcons.Question, ESysIcons.Question); if (CTaskDialog.VerificationChecked) { Settings.Default.ConfirmCloseConnection--; @@ -439,55 +240,29 @@ namespace mRemoteNG.UI.Window try { - foreach (Crownwood.Magic.Controls.TabPage tabP in TabController.TabPages) + foreach (TabPage tabP in TabController.TabPages) { - if (tabP.Tag != null) - { - InterfaceControl interfaceControl = (InterfaceControl)tabP.Tag; - interfaceControl.Protocol.Close(); - } + if (tabP.Tag == null) continue; + var interfaceControl = (InterfaceControl)tabP.Tag; + interfaceControl.Protocol.Close(); } } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Connection.Connection_FormClosing() failed" + Environment.NewLine + ex.Message, true); - } - } - - private EventHandler ResizeBeginEvent; - public new event EventHandler ResizeBegin - { - add - { - ResizeBeginEvent = (EventHandler)Delegate.Combine(ResizeBeginEvent, value); - } - remove - { - ResizeBeginEvent = (EventHandler)Delegate.Remove(ResizeBeginEvent, value); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "UI.Window.Connection.Connection_FormClosing() failed" + Environment.NewLine + ex.Message, true); } } + public new event EventHandler ResizeBegin; private void Connection_ResizeBegin(object sender, EventArgs e) { - ResizeBeginEvent?.Invoke(this, e); - } - - private EventHandler ResizeEndEvent; - public new event EventHandler ResizeEnd - { - add - { - ResizeEndEvent = (EventHandler)Delegate.Combine(ResizeEndEvent, value); - } - remove - { - ResizeEndEvent = (EventHandler)Delegate.Remove(ResizeEndEvent, value); - } + ResizeBegin?.Invoke(this, e); } + public new event EventHandler ResizeEnd; private void Connection_ResizeEnd(object sender, EventArgs e) { - ResizeEndEvent?.Invoke(sender, e); + ResizeEnd?.Invoke(sender, e); } #endregion @@ -506,11 +281,11 @@ namespace mRemoteNG.UI.Window { try { - Crownwood.Magic.Controls.TabPage selectedTab = TabController.SelectedTab; + var selectedTab = TabController.SelectedTab; if (selectedTab == null) return; if (Settings.Default.ConfirmCloseConnection == (int)ConfirmCloseEnum.All) { - DialogResult result = CTaskDialog.MessageBox(this, GeneralAppInfo.ProdName, string.Format(Language.strConfirmCloseConnectionMainInstruction, selectedTab.Title), "", "", "", Language.strCheckboxDoNotShowThisMessageAgain, ETaskDialogButtons.YesNo, ESysIcons.Question, ESysIcons.Question); + var result = CTaskDialog.MessageBox(this, GeneralAppInfo.ProdName, string.Format(Language.strConfirmCloseConnectionMainInstruction, selectedTab.Title), "", "", "", Language.strCheckboxDoNotShowThisMessageAgain, ETaskDialogButtons.YesNo, ESysIcons.Question, ESysIcons.Question); if (CTaskDialog.VerificationChecked) { Settings.Default.ConfirmCloseConnection--; @@ -523,7 +298,7 @@ namespace mRemoteNG.UI.Window if (selectedTab.Tag != null) { - InterfaceControl interfaceControl = (InterfaceControl)selectedTab.Tag; + var interfaceControl = (InterfaceControl)selectedTab.Tag; interfaceControl.Protocol.Close(); } else @@ -533,13 +308,13 @@ namespace mRemoteNG.UI.Window } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "UI.Window.Connection.CloseConnectionTab() failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "UI.Window.Connection.CloseConnectionTab() failed" + Environment.NewLine + ex.Message, true); } UpdateSelectedConnection(); } - private void TabController_DoubleClickTab(Crownwood.Magic.Controls.TabControl sender, Crownwood.Magic.Controls.TabPage page) + private void TabController_DoubleClickTab(TabControl sender, TabPage page) { _firstClickTicks = 0; if (Settings.Default.DoubleClickOnTabClosesIt) @@ -582,20 +357,14 @@ namespace mRemoteNG.UI.Window { try { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab?.Tag; + var interfaceControl = (InterfaceControl)TabController.SelectedTab?.Tag; + if (interfaceControl == null) return; - if (IC == null) + if (interfaceControl.Info.Protocol == ProtocolType.RDP) { - return; - } - - if (IC.Info.Protocol == ProtocolType.RDP) - { - ProtocolRDP rdp = (ProtocolRDP)IC.Protocol; - + var rdp = (ProtocolRDP)interfaceControl.Protocol; cmenTabFullscreen.Visible = true; cmenTabFullscreen.Checked = rdp.Fullscreen; - cmenTabSmartSize.Visible = true; cmenTabSmartSize.Checked = rdp.SmartSize; } @@ -605,17 +374,15 @@ namespace mRemoteNG.UI.Window cmenTabSmartSize.Visible = false; } - if (IC.Info.Protocol == ProtocolType.VNC) + if (interfaceControl.Info.Protocol == ProtocolType.VNC) { + var vnc = (ProtocolVNC)interfaceControl.Protocol; cmenTabSendSpecialKeys.Visible = true; cmenTabViewOnly.Visible = true; - cmenTabSmartSize.Visible = true; cmenTabStartChat.Visible = true; cmenTabRefreshScreen.Visible = true; cmenTabTransferFile.Visible = false; - - ProtocolVNC vnc = (ProtocolVNC)IC.Protocol; cmenTabSmartSize.Checked = vnc.SmartSize; cmenTabViewOnly.Checked = vnc.ViewOnly; } @@ -628,12 +395,12 @@ namespace mRemoteNG.UI.Window cmenTabTransferFile.Visible = false; } - if (IC.Info.Protocol == ProtocolType.SSH1 | IC.Info.Protocol == ProtocolType.SSH2) + if (interfaceControl.Info.Protocol == ProtocolType.SSH1 | interfaceControl.Info.Protocol == ProtocolType.SSH2) { cmenTabTransferFile.Visible = true; } - if (IC.Protocol is PuttyBase) + if (interfaceControl.Protocol is PuttyBase) { cmenTabPuttySettings.Visible = true; } @@ -646,86 +413,9 @@ namespace mRemoteNG.UI.Window } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowHideMenuButtons (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "ShowHideMenuButtons (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } - - private void cmenTabScreenshot_Click(object sender, EventArgs e) - { - cmenTab.Close(); - Application.DoEvents(); - Windows.ScreenshotForm.AddScreenshot(Tools.MiscTools.TakeScreenshot(this)); - } - - private void cmenTabSmartSize_Click(object sender, EventArgs e) - { - ToggleSmartSize(); - } - - private void cmenTabReconnect_Click(object sender, EventArgs e) - { - Reconnect(); - } - - private void cmenTabTransferFile_Click(object sender, EventArgs e) - { - TransferFile(); - } - - private void cmenTabViewOnly_Click(object sender, EventArgs e) - { - ToggleViewOnly(); - } - - private void cmenTabStartChat_Click(object sender, EventArgs e) - { - StartChat(); - } - - private void cmenTabRefreshScreen_Click(object sender, EventArgs e) - { - RefreshScreen(); - } - - private void cmenTabSendSpecialKeysCtrlAltDel_Click(object sender, EventArgs e) - { - SendSpecialKeys(ProtocolVNC.SpecialKeys.CtrlAltDel); - } - - private void cmenTabSendSpecialKeysCtrlEsc_Click(object sender, EventArgs e) - { - SendSpecialKeys(ProtocolVNC.SpecialKeys.CtrlEsc); - } - - private void cmenTabFullscreen_Click(object sender, EventArgs e) - { - ToggleFullscreen(); - } - - private void cmenTabPuttySettings_Click(object sender, EventArgs e) - { - ShowPuttySettingsDialog(); - } - - private void cmenTabExternalAppsEntry_Click(object sender, EventArgs e) - { - StartExternalApp((Tools.ExternalTool)((ToolStripMenuItem)sender).Tag); - } - - private void cmenTabDisconnect_Click(object sender, EventArgs e) - { - CloseTabMenu(); - } - - private void cmenTabDuplicateTab_Click(object sender, EventArgs e) - { - DuplicateTab(); - } - - private void cmenTabRenameTab_Click(object sender, EventArgs e) - { - RenameTab(); - } #endregion #region Tab Actions @@ -733,26 +423,24 @@ namespace mRemoteNG.UI.Window { try { - if (TabController.SelectedTab?.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; + if (!(TabController.SelectedTab?.Tag is InterfaceControl)) return; + var interfaceControl = (InterfaceControl)TabController.SelectedTab.Tag; - var protocol = IC.Protocol as ProtocolRDP; - if (protocol != null) - { - ProtocolRDP rdp = protocol; - rdp.ToggleSmartSize(); - } - else if (IC.Protocol is ProtocolVNC) - { - ProtocolVNC vnc = (ProtocolVNC)IC.Protocol; - vnc.ToggleSmartSize(); - } + var protocol = interfaceControl.Protocol as ProtocolRDP; + if (protocol != null) + { + var rdp = protocol; + rdp.ToggleSmartSize(); + } + else if (interfaceControl.Protocol is ProtocolVNC) + { + var vnc = (ProtocolVNC)interfaceControl.Protocol; + vnc.ToggleSmartSize(); } } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleSmartSize (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "ToggleSmartSize (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -760,59 +448,51 @@ namespace mRemoteNG.UI.Window { try { - if (TabController.SelectedTab?.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; + if (!(TabController.SelectedTab?.Tag is InterfaceControl)) return; + var interfaceControl = (InterfaceControl)TabController.SelectedTab.Tag; - if (IC.Info.Protocol == ProtocolType.SSH1 | IC.Info.Protocol == ProtocolType.SSH2) - { - SSHTransferFile(); - } - else if (IC.Info.Protocol == ProtocolType.VNC) - { - VNCTransferFile(); - } - } + if (interfaceControl.Info.Protocol == ProtocolType.SSH1 | interfaceControl.Info.Protocol == ProtocolType.SSH2) + SshTransferFile(); + else if (interfaceControl.Info.Protocol == ProtocolType.VNC) + VncTransferFile(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "TransferFile (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "TransferFile (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } - private void SSHTransferFile() + private void SshTransferFile() { try { - - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; + var interfaceControl = (InterfaceControl)TabController.SelectedTab.Tag; Windows.Show(WindowType.SSHTransfer); + var connectionInfo = interfaceControl.Info; - ConnectionInfo conI = IC.Info; - - Windows.SshtransferForm.Hostname = conI.Hostname; - Windows.SshtransferForm.Username = conI.Username; - Windows.SshtransferForm.Password = conI.Password; - Windows.SshtransferForm.Port = Convert.ToString(conI.Port); + Windows.SshtransferForm.Hostname = connectionInfo.Hostname; + Windows.SshtransferForm.Username = connectionInfo.Username; + Windows.SshtransferForm.Password = connectionInfo.Password; + Windows.SshtransferForm.Port = Convert.ToString(connectionInfo.Port); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SSHTransferFile (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "SSHTransferFile (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } - private void VNCTransferFile() + private void VncTransferFile() { try { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - ProtocolVNC vnc = (ProtocolVNC)IC.Protocol; + var interfaceControl = (InterfaceControl)TabController.SelectedTab.Tag; + var vnc = (ProtocolVNC)interfaceControl.Protocol; vnc.StartFileTransfer(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "VNCTransferFile (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "VNCTransferFile (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -820,22 +500,15 @@ namespace mRemoteNG.UI.Window { try { - if (TabController.SelectedTab?.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - - if (IC.Protocol is ProtocolVNC) - { - cmenTabViewOnly.Checked = !cmenTabViewOnly.Checked; - - ProtocolVNC vnc = (ProtocolVNC)IC.Protocol; - vnc.ToggleViewOnly(); - } - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + var vnc = interfaceControl?.Protocol as ProtocolVNC; + if (vnc == null) return; + cmenTabViewOnly.Checked = !cmenTabViewOnly.Checked; + vnc.ToggleViewOnly(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleViewOnly (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "ToggleViewOnly (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -843,17 +516,13 @@ namespace mRemoteNG.UI.Window { try { - InterfaceControl IC = TabController.SelectedTab?.Tag as InterfaceControl; - - if (IC?.Protocol is ProtocolVNC) - { - ProtocolVNC vnc = (ProtocolVNC)IC.Protocol; - vnc.StartChat(); - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + var vnc = interfaceControl?.Protocol as ProtocolVNC; + vnc?.StartChat(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "StartChat (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "StartChat (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -861,35 +530,27 @@ namespace mRemoteNG.UI.Window { try { - InterfaceControl IC = TabController.SelectedTab?.Tag as InterfaceControl; - - if (IC?.Protocol is ProtocolVNC) - { - ProtocolVNC vnc = (ProtocolVNC)IC.Protocol; - vnc.RefreshScreen(); - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + var vnc = interfaceControl?.Protocol as ProtocolVNC; + vnc?.RefreshScreen(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RefreshScreen (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "RefreshScreen (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } - private void SendSpecialKeys(ProtocolVNC.SpecialKeys Keys) + private void SendSpecialKeys(ProtocolVNC.SpecialKeys keys) { try { - InterfaceControl IC = TabController.SelectedTab?.Tag as InterfaceControl; - - if (IC?.Protocol is ProtocolVNC) - { - ProtocolVNC vnc = (ProtocolVNC)IC.Protocol; - vnc.SendSpecialKeys(Keys); - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + var vnc = interfaceControl?.Protocol as ProtocolVNC; + vnc?.SendSpecialKeys(keys); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "SendSpecialKeys (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "SendSpecialKeys (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -897,17 +558,13 @@ namespace mRemoteNG.UI.Window { try { - InterfaceControl IC = TabController.SelectedTab?.Tag as InterfaceControl; - - if (IC?.Protocol is ProtocolRDP) - { - ProtocolRDP rdp = (ProtocolRDP)IC.Protocol; - rdp.ToggleFullscreen(); - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + var rdp = interfaceControl?.Protocol as ProtocolRDP; + rdp?.ToggleFullscreen(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ToggleFullscreen (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "ToggleFullscreen (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -915,18 +572,13 @@ namespace mRemoteNG.UI.Window { try { - InterfaceControl objInterfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; - - if (objInterfaceControl?.Protocol is PuttyBase) - { - PuttyBase objPuttyBase = (PuttyBase)objInterfaceControl.Protocol; - - objPuttyBase.ShowSettingsDialog(); - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + var puttyBase = interfaceControl?.Protocol as PuttyBase; + puttyBase?.ShowSettingsDialog(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "ShowPuttySettingsDialog (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "ShowPuttySettingsDialog (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -934,33 +586,28 @@ namespace mRemoteNG.UI.Window { try { - //clean up - //since new items are added below, we have to dispose of any previous items first + //clean up. since new items are added below, we have to dispose of any previous items first if (cmenTabExternalApps.DropDownItems.Count > 0) { - for (int i = cmenTabExternalApps.DropDownItems.Count - 1; i >= 0; i--) + for (var i = cmenTabExternalApps.DropDownItems.Count - 1; i >= 0; i--) cmenTabExternalApps.DropDownItems[i].Dispose(); - cmenTabExternalApps.DropDownItems.Clear(); } - //add ext apps - foreach (Tools.ExternalTool extA in Runtime.ExternalTools) + foreach (ExternalTool externalTool in Runtime.ExternalTools) { - ToolStripMenuItem nItem = new ToolStripMenuItem + var nItem = new ToolStripMenuItem { - Text = extA.DisplayName, - Tag = extA, + Text = externalTool.DisplayName, + Tag = externalTool, /* rare failure here. While ExternalTool.Image already tries to default this * try again so it's not null/doesn't crash. */ - Image = extA.Image ?? Resources.mRemote_Icon.ToBitmap() + Image = externalTool.Image ?? Resources.mRemote_Icon.ToBitmap() }; - - nItem.Click += cmenTabExternalAppsEntry_Click; - + nItem.Click += (sender, args) => StartExternalApp(((ToolStripMenuItem)sender).Tag as ExternalTool); cmenTabExternalApps.DropDownItems.Add(nItem); } } @@ -970,19 +617,16 @@ namespace mRemoteNG.UI.Window } } - private void StartExternalApp(Tools.ExternalTool ExtA) + private void StartExternalApp(ExternalTool externalTool) { try { - if (TabController.SelectedTab?.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - ExtA.Start(IC.Info); - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + externalTool.Start(interfaceControl?.Info); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "cmenTabExternalAppsEntry_Click failed (UI.Window.ConnectionWindow)" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "cmenTabExternalAppsEntry_Click failed (UI.Window.ConnectionWindow)" + Environment.NewLine + ex.Message, true); } } @@ -990,15 +634,12 @@ namespace mRemoteNG.UI.Window { try { - if (TabController.SelectedTab?.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - IC.Protocol.Close(); - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + interfaceControl?.Protocol.Close(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "CloseTabMenu (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "CloseTabMenu (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -1006,16 +647,14 @@ namespace mRemoteNG.UI.Window { try { - if (TabController.SelectedTab?.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - ConnectionInitiator.OpenConnection(IC.Info, ConnectionInfo.Force.DoNotJump); - _ignoreChangeSelectedTabClick = false; - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + if (interfaceControl == null) return; + ConnectionInitiator.OpenConnection(interfaceControl.Info, ConnectionInfo.Force.DoNotJump); + _ignoreChangeSelectedTabClick = false; } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "DuplicateTab (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "DuplicateTab (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -1023,16 +662,14 @@ namespace mRemoteNG.UI.Window { try { - if (TabController.SelectedTab?.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - IC.Protocol.Close(); - ConnectionInitiator.OpenConnection(IC.Info, ConnectionInfo.Force.DoNotJump); - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + if (interfaceControl == null) return; + interfaceControl.Protocol.Close(); + ConnectionInitiator.OpenConnection(interfaceControl.Info, ConnectionInfo.Force.DoNotJump); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Reconnect (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Reconnect (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } @@ -1040,63 +677,69 @@ namespace mRemoteNG.UI.Window { try { - string nTitle = ""; - - if (input.InputBox(Language.strNewTitle, Language.strNewTitle + ":", ref nTitle) == DialogResult.OK && !string.IsNullOrEmpty(nTitle)) - { - TabController.SelectedTab.Title = nTitle.Replace("&", "&&"); - } + var newTitle = ""; + if (input.InputBox(Language.strNewTitle, Language.strNewTitle + ":", ref newTitle) == DialogResult.OK && !string.IsNullOrEmpty(newTitle)) + TabController.SelectedTab.Title = newTitle.Replace("&", "&&"); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RenameTab (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "RenameTab (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } + + private void CreateScreenshot() + { + cmenTab.Close(); + Application.DoEvents(); + Windows.ScreenshotForm.AddScreenshot(MiscTools.TakeScreenshot(this)); + } #endregion #region Protocols public void Prot_Event_Closed(object sender) { - ProtocolBase Prot = (ProtocolBase)sender; - CloseTab((Crownwood.Magic.Controls.TabPage)Prot.InterfaceControl.Parent); + var protocolBase = sender as ProtocolBase; + var tabPage = protocolBase?.InterfaceControl.Parent as TabPage; + if (tabPage != null) + CloseTab(tabPage); } #endregion #region Tabs - private delegate void CloseTabCB(Crownwood.Magic.Controls.TabPage TabToBeClosed); - private void CloseTab(Crownwood.Magic.Controls.TabPage TabToBeClosed) + private delegate void CloseTabDelegate(TabPage tabToBeClosed); + private void CloseTab(TabPage tabToBeClosed) { if (TabController.InvokeRequired) { - CloseTabCB s = CloseTab; + CloseTabDelegate s = CloseTab; try { - TabController.Invoke(s, TabToBeClosed); + TabController.Invoke(s, tabToBeClosed); } - catch (System.Runtime.InteropServices.COMException) + catch (COMException) { - TabController.Invoke(s, TabToBeClosed); + TabController.Invoke(s, tabToBeClosed); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t close tab" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Couldn\'t close tab" + Environment.NewLine + ex.Message, true); } } else { try { - TabController.TabPages.Remove(TabToBeClosed); + TabController.TabPages.Remove(tabToBeClosed); _ignoreChangeSelectedTabClick = false; } - catch (System.Runtime.InteropServices.COMException) + catch (COMException) { - CloseTab(TabToBeClosed); + CloseTab(tabToBeClosed); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "Couldn\'t close tab" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Couldn\'t close tab" + Environment.NewLine + ex.Message, true); } if (TabController.TabPages.Count == 0) @@ -1111,8 +754,8 @@ namespace mRemoteNG.UI.Window { _ignoreChangeSelectedTabClick = true; UpdateSelectedConnection(); - FocusIC(); - RefreshIC(); + FocusInterfaceController(); + RefreshInterfaceController(); } private int _firstClickTicks; @@ -1123,7 +766,7 @@ namespace mRemoteNG.UI.Window { if (!(NativeMethods.GetForegroundWindow() == frmMain.Default.Handle) && !_ignoreChangeSelectedTabClick) { - Crownwood.Magic.Controls.TabPage clickedTab = TabController.TabPageFromPoint(e.Location); + var clickedTab = TabController.TabPageFromPoint(e.Location); if (clickedTab != null && TabController.SelectedTab != clickedTab) { NativeMethods.SetForegroundWindow(Handle); @@ -1135,13 +778,13 @@ namespace mRemoteNG.UI.Window switch (e.Button) { case MouseButtons.Left: - int currentTicks = Environment.TickCount; - int elapsedTicks = currentTicks - _firstClickTicks; + var currentTicks = Environment.TickCount; + var elapsedTicks = currentTicks - _firstClickTicks; if (elapsedTicks > SystemInformation.DoubleClickTime || !_doubleClickRectangle.Contains(MousePosition)) { _firstClickTicks = currentTicks; _doubleClickRectangle = new Rectangle(MousePosition.X - (SystemInformation.DoubleClickSize.Width / 2), MousePosition.Y - (SystemInformation.DoubleClickSize.Height / 2), SystemInformation.DoubleClickSize.Width, SystemInformation.DoubleClickSize.Height); - FocusIC(); + FocusInterfaceController(); } else { @@ -1160,49 +803,34 @@ namespace mRemoteNG.UI.Window } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "TabController_MouseUp (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "TabController_MouseUp (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } - private void FocusIC() + private void FocusInterfaceController() { try { - if (TabController.SelectedTab != null) - { - if (TabController.SelectedTab.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - IC.Protocol.Focus(); - } - } + var interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; + interfaceControl?.Protocol?.Focus(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "FocusIC (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "FocusIC (UI.Window.ConnectionWindow) failed" + Environment.NewLine + ex.Message, true); } } - public void RefreshIC() + public void RefreshInterfaceController() { try { - if (TabController.SelectedTab != null) - { - if (TabController.SelectedTab.Tag is InterfaceControl) - { - InterfaceControl IC = (InterfaceControl)TabController.SelectedTab.Tag; - - if (IC.Info.Protocol == ProtocolType.VNC) - { - ((ProtocolVNC)IC.Protocol).RefreshScreen(); - } - } - } + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + if (interfaceControl?.Info.Protocol == ProtocolType.VNC) + ((ProtocolVNC)interfaceControl.Protocol).RefreshScreen(); } catch (Exception ex) { - Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg, "RefreshIC (UI.Window.Connection) failed" + Environment.NewLine + ex.Message, true); + Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "RefreshIC (UI.Window.Connection) failed" + Environment.NewLine + ex.Message, true); } } #endregion @@ -1214,20 +842,17 @@ namespace mRemoteNG.UI.Window { if (m.Msg == NativeMethods.WM_MOUSEACTIVATE) { - Crownwood.Magic.Controls.TabPage selectedTab = TabController.SelectedTab; - if (selectedTab != null) + var selectedTab = TabController.SelectedTab; + if (selectedTab == null) return; { - Rectangle tabClientRectangle = selectedTab.RectangleToScreen(selectedTab.ClientRectangle); + var tabClientRectangle = selectedTab.RectangleToScreen(selectedTab.ClientRectangle); if (tabClientRectangle.Contains(MousePosition)) { - InterfaceControl interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; - if (interfaceControl != null && interfaceControl.Info != null) + var interfaceControl = TabController?.SelectedTab.Tag as InterfaceControl; + if (interfaceControl?.Info?.Protocol == ProtocolType.RDP) { - if (interfaceControl.Info.Protocol == ProtocolType.RDP) - { - interfaceControl.Protocol.Focus(); - return; // Do not pass to base class - } + interfaceControl.Protocol.Focus(); + return; // Do not pass to base class } } } @@ -1243,18 +868,8 @@ namespace mRemoteNG.UI.Window #endregion #region Tab drag and drop - private bool _InTabDrag; - public bool InTabDrag - { - get - { - return _InTabDrag; - } - set - { - _InTabDrag = value; - } - } + public bool InTabDrag { get; set; } + private void TabController_PageDragStart(object sender, MouseEventArgs e) { Cursor = Cursors.SizeWE; @@ -1264,15 +879,13 @@ namespace mRemoteNG.UI.Window { InTabDrag = true; // For some reason PageDragStart gets raised again after PageDragEnd so set this here instead - Crownwood.Magic.Controls.TabPage sourceTab = TabController.SelectedTab; - Crownwood.Magic.Controls.TabPage destinationTab = TabController.TabPageFromPoint(e.Location); + var sourceTab = TabController.SelectedTab; + var destinationTab = TabController.TabPageFromPoint(e.Location); if (!TabController.TabPages.Contains(destinationTab) || sourceTab == destinationTab) - { return; - } - int targetIndex = TabController.TabPages.IndexOf(destinationTab); + var targetIndex = TabController.TabPages.IndexOf(destinationTab); TabController.TabPages.SuspendEvents(); TabController.TabPages.Remove(sourceTab); @@ -1285,9 +898,9 @@ namespace mRemoteNG.UI.Window { Cursor = Cursors.Default; InTabDrag = false; - InterfaceControl interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; + var interfaceControl = TabController?.SelectedTab?.Tag as InterfaceControl; interfaceControl?.Protocol.Focus(); } #endregion } -} +} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index e0cdc51fc..de2fecce4 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -430,6 +430,9 @@ Form + + ConnectionWindow.cs + Form From 14d56c3e285c70ae164d82c046acf8a13a96d404 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 29 Sep 2016 10:33:59 -0600 Subject: [PATCH 291/338] Fixed crash when adding node with no treenode selected --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 98761fb9c..19391f8e6 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -569,8 +569,9 @@ namespace mRemoteNG.UI.Window private void AddNode(IHasParent newNode) { + if (SelectedNode == null) return; var selectedContainer = SelectedNode as ContainerInfo; - var parent = selectedContainer ?? SelectedNode.Parent; + var parent = selectedContainer ?? SelectedNode?.Parent; newNode.SetParent(parent); olvConnections.Expand(parent); olvConnections.SelectObject(newNode); From a71cf6080f87bc4f96da4b7f485f7f145ec9a52a Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 29 Sep 2016 11:01:06 -0600 Subject: [PATCH 292/338] Fixed bug where loading a new connection file or creating a new one would not update the connection tree --- mRemoteV1/App/Runtime.cs | 11 +++++------ mRemoteV1/Config/Connections/ConnectionsLoader.cs | 10 ++++++---- mRemoteV1/UI/Forms/frmMain.cs | 1 - 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 597691eff..5feafca4f 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -228,12 +228,10 @@ namespace mRemoteNG.App } - var rootConnectionNode = ConnectionTreeModel.RootNodes.First(node => !(node is RootPuttySessionsNodeInfo)); - ConnectionTreeModel.RemoveRootNode(rootConnectionNode); - // Load config connectionsLoader.ConnectionFileName = filename; - connectionsLoader.LoadConnections(false); + ConnectionTreeModel = connectionsLoader.LoadConnections(false); + Windows.TreeForm.ConnectionTreeModel = ConnectionTreeModel; } catch (Exception ex) { @@ -270,7 +268,7 @@ namespace mRemoteNG.App { if (withDialog) { - var loadDialog = Tools.Controls.ConnectionsLoadDialog(); + var loadDialog = Controls.ConnectionsLoadDialog(); if (loadDialog.ShowDialog() != DialogResult.OK) return; connectionsLoader.ConnectionFileName = loadDialog.FileName; } @@ -283,7 +281,8 @@ namespace mRemoteNG.App } connectionsLoader.UseDatabase = Settings.Default.UseSQLServer; - connectionsLoader.LoadConnections(false); + ConnectionTreeModel = connectionsLoader.LoadConnections(false); + Windows.TreeForm.ConnectionTreeModel = ConnectionTreeModel; if (Settings.Default.UseSQLServer) { diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index a7540255f..af7c54dc0 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -3,6 +3,7 @@ using mRemoteNG.Config.DatabaseConnectors; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Putty; using mRemoteNG.Config.Serializers; +using mRemoteNG.Tree; using mRemoteNG.UI.Forms; @@ -14,7 +15,7 @@ namespace mRemoteNG.Config.Connections public string ConnectionFileName { get; set; } - public void LoadConnections(bool import) + public ConnectionTreeModel LoadConnections(bool import) { IDeserializer deserializer; if (UseDatabase) @@ -32,14 +33,15 @@ namespace mRemoteNG.Config.Connections } var connectionTreeModel = deserializer.Deserialize(); - Runtime.ConnectionTreeModel = connectionTreeModel; frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; frmMain.Default.ConnectionsFileName = ConnectionFileName; - if (import) return; + if (import) return connectionTreeModel; PuttySessionsManager.Instance.AddSessions(); - Runtime.ConnectionTreeModel.RootNodes.AddRange(PuttySessionsManager.Instance.RootPuttySessionsNodes); + connectionTreeModel.RootNodes.AddRange(PuttySessionsManager.Instance.RootPuttySessionsNodes); + + return connectionTreeModel; } } } \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index 50662b641..e6d8fab66 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -171,7 +171,6 @@ namespace mRemoteNG.UI.Forms Opacity = 1; ConnectionTreeWindow = Windows.TreeForm; - ConnectionTreeWindow.ConnectionTreeModel = Runtime.ConnectionTreeModel; } private void ApplySpecialSettingsForPortableVersion() From 1928b904e58065ceaba5b838b97777c38d10842e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 29 Sep 2016 11:29:16 -0600 Subject: [PATCH 293/338] Minor cleanup --- mRemoteV1/App/Export.cs | 4 ++-- mRemoteV1/App/Runtime.cs | 18 ++++++++---------- .../Config/Connections/ConnectionsLoader.cs | 1 - .../UI/Forms/OptionsPages/SqlServerPage.cs | 8 ++++---- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index 04ce75878..c1fe54e54 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -97,8 +97,8 @@ namespace mRemoteNG.App } finally { - if (Runtime.SQLConnProvider != null) - Runtime.SQLConnProvider.Enable(); + if (Runtime.SqlConnProvider != null) + Runtime.SqlConnProvider.Enable(); } } } diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 5feafca4f..3cc9a769d 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -11,11 +11,9 @@ using System.Collections; using System.Collections.Generic; using System.Drawing; using System.IO; -using System.Linq; using System.Threading; using System.Windows.Forms; using System.Xml; -using mRemoteNG.Root.PuttySessions; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.UI.Forms; using mRemoteNG.UI.Forms.Input; @@ -31,9 +29,9 @@ namespace mRemoteNG.App #region Public Properties public static WindowList WindowList { get; set; } public static MessageCollector MessageCollector { get; set; } - public static Tools.Controls.NotificationAreaIcon NotificationAreaIcon { get; set; } + public static Controls.NotificationAreaIcon NotificationAreaIcon { get; set; } public static bool IsConnectionsFileLoaded { get; set; } - public static SqlConnectionsProvider SQLConnProvider { get; set; } + public static SqlConnectionsProvider SqlConnProvider { get; set; } public static DateTime LastSqlUpdate { get; set; } public static string LastSelected { get; set; } public static ArrayList ExternalTools { get; set; } = new ArrayList(); @@ -262,7 +260,7 @@ namespace mRemoteNG.App try { // disable sql update checking while we are loading updates - SQLConnProvider?.Disable(); + SqlConnProvider?.Disable(); if (!Settings.Default.UseSQLServer) { @@ -302,7 +300,7 @@ namespace mRemoteNG.App } // re-enable sql update checking after updates are loaded - SQLConnProvider?.Enable(); + SqlConnProvider?.Enable(); } catch (Exception ex) { @@ -447,7 +445,7 @@ namespace mRemoteNG.App if (Update && Settings.Default.UseSQLServer == false) return; - SQLConnProvider?.Disable(); + SqlConnProvider?.Disable(); var connectionsSaver = new ConnectionsSaver(); @@ -479,7 +477,7 @@ namespace mRemoteNG.App } finally { - SQLConnProvider?.Enable(); + SqlConnProvider?.Enable(); } } @@ -489,7 +487,7 @@ namespace mRemoteNG.App try { - SQLConnProvider?.Disable(); + SqlConnProvider?.Disable(); using (SaveFileDialog saveFileDialog = new SaveFileDialog()) { @@ -533,7 +531,7 @@ namespace mRemoteNG.App } finally { - SQLConnProvider?.Enable(); + SqlConnProvider?.Enable(); } } #endregion diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index af7c54dc0..bfef1dc86 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -1,4 +1,3 @@ -using mRemoteNG.App; using mRemoteNG.Config.DatabaseConnectors; using mRemoteNG.Config.DataProviders; using mRemoteNG.Config.Putty; diff --git a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs index 82cce92aa..5621adac7 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs @@ -62,14 +62,14 @@ namespace mRemoteNG.UI.Forms.OptionsPages private static void ReinitializeSqlUpdater() { - if (Runtime.SQLConnProvider != null) + if (Runtime.SqlConnProvider != null) { - Runtime.SQLConnProvider.Dispose(); + Runtime.SqlConnProvider.Dispose(); frmMain.Default.AreWeUsingSqlServerForSavingConnections = Settings.Default.UseSQLServer; if (Settings.Default.UseSQLServer) { - Runtime.SQLConnProvider = new SqlConnectionsProvider(); - Runtime.SQLConnProvider.Enable(); + Runtime.SqlConnProvider = new SqlConnectionsProvider(); + Runtime.SqlConnProvider.Enable(); } } } From 293b3d90b93b02493769644a062b73bc66610440 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 29 Sep 2016 11:31:35 -0600 Subject: [PATCH 294/338] Cleanup --- mRemoteV1/App/Runtime.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 3cc9a769d..2f6df643c 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -355,7 +355,7 @@ namespace mRemoteNG.App try { - string backupFileName = string.Format(Settings.Default.BackupFileNameFormat, fileName, DateTime.UtcNow); + var backupFileName = string.Format(Settings.Default.BackupFileNameFormat, fileName, DateTime.UtcNow); File.Copy(fileName, backupFileName); PruneBackupFiles(fileName); } @@ -489,7 +489,7 @@ namespace mRemoteNG.App { SqlConnProvider?.Disable(); - using (SaveFileDialog saveFileDialog = new SaveFileDialog()) + using (var saveFileDialog = new SaveFileDialog()) { saveFileDialog.CheckPathExists = true; saveFileDialog.InitialDirectory = ConnectionsFileInfo.DefaultConnectionsPath; From 62190bde17eb0836b17ceb6e732e0efcfb3f4fc2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 29 Sep 2016 11:38:40 -0600 Subject: [PATCH 295/338] Resolved crash that would sometimes occur when working with interfacecontrols --- mRemoteV1/UI/Window/ConnectionWindow.cs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index 1f1f496d0..5008c81f4 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -158,7 +158,7 @@ namespace mRemoteNG.UI.Window } else { - var interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; frmMain.Default.SelectedConnection = interfaceControl?.Info; } } @@ -424,7 +424,7 @@ namespace mRemoteNG.UI.Window try { if (!(TabController.SelectedTab?.Tag is InterfaceControl)) return; - var interfaceControl = (InterfaceControl)TabController.SelectedTab.Tag; + var interfaceControl = (InterfaceControl)TabController.SelectedTab?.Tag; var protocol = interfaceControl.Protocol as ProtocolRDP; if (protocol != null) @@ -448,8 +448,8 @@ namespace mRemoteNG.UI.Window { try { - if (!(TabController.SelectedTab?.Tag is InterfaceControl)) return; - var interfaceControl = (InterfaceControl)TabController.SelectedTab.Tag; + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + if (interfaceControl == null) return; if (interfaceControl.Info.Protocol == ProtocolType.SSH1 | interfaceControl.Info.Protocol == ProtocolType.SSH2) SshTransferFile(); @@ -466,7 +466,8 @@ namespace mRemoteNG.UI.Window { try { - var interfaceControl = (InterfaceControl)TabController.SelectedTab.Tag; + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + if (interfaceControl == null) return; Windows.Show(WindowType.SSHTransfer); var connectionInfo = interfaceControl.Info; @@ -486,9 +487,9 @@ namespace mRemoteNG.UI.Window { try { - var interfaceControl = (InterfaceControl)TabController.SelectedTab.Tag; - var vnc = (ProtocolVNC)interfaceControl.Protocol; - vnc.StartFileTransfer(); + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; + var vnc = interfaceControl?.Protocol as ProtocolVNC; + vnc?.StartFileTransfer(); } catch (Exception ex) { @@ -811,7 +812,7 @@ namespace mRemoteNG.UI.Window { try { - var interfaceControl = TabController.SelectedTab.Tag as InterfaceControl; + var interfaceControl = TabController.SelectedTab?.Tag as InterfaceControl; interfaceControl?.Protocol?.Focus(); } catch (Exception ex) @@ -848,7 +849,7 @@ namespace mRemoteNG.UI.Window var tabClientRectangle = selectedTab.RectangleToScreen(selectedTab.ClientRectangle); if (tabClientRectangle.Contains(MousePosition)) { - var interfaceControl = TabController?.SelectedTab.Tag as InterfaceControl; + var interfaceControl = selectedTab.Tag as InterfaceControl; if (interfaceControl?.Info?.Protocol == ProtocolType.RDP) { interfaceControl.Protocol.Focus(); From a7d34b2c1bf965403fdfa0b662c2f2fa013fbe99 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 29 Sep 2016 15:01:19 -0600 Subject: [PATCH 296/338] Code cleanup --- .../Connections/SQLConnectionsProvider.cs | 4 +- .../SqlConnectionsUpdateChecker.cs | 73 +++++++++---------- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs b/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs index 182b137a2..251484379 100644 --- a/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs +++ b/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs @@ -15,7 +15,7 @@ namespace mRemoteNG.Config.Connections _updateTimer = new SqlUpdateTimer(); _sqlUpdateChecker = new SqlConnectionsUpdateChecker(); SqlUpdateTimer.SqlUpdateTimerElapsed += SqlUpdateTimer_SqlUpdateTimerElapsed; - SqlConnectionsUpdateChecker.SQLUpdateCheckFinished += SQLUpdateCheckFinished; + SqlConnectionsUpdateChecker.SqlUpdateCheckFinished += SQLUpdateCheckFinished; } ~SqlConnectionsProvider() @@ -52,7 +52,7 @@ namespace mRemoteNG.Config.Connections private void DestroySQLUpdateHandlers() { SqlUpdateTimer.SqlUpdateTimerElapsed -= SqlUpdateTimer_SqlUpdateTimerElapsed; - SqlConnectionsUpdateChecker.SQLUpdateCheckFinished -= SQLUpdateCheckFinished; + SqlConnectionsUpdateChecker.SqlUpdateCheckFinished -= SQLUpdateCheckFinished; } private void SqlUpdateTimer_SqlUpdateTimerElapsed() diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs index 846411aff..9650e5ae7 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs @@ -10,16 +10,16 @@ namespace mRemoteNG.Config.Connections { public class SqlConnectionsUpdateChecker : IDisposable { - private IDatabaseConnector sqlConnector; - private SqlCommand sqlQuery; - private SqlDataReader sqlReader; + private IDatabaseConnector _sqlConnector; + private SqlCommand _sqlQuery; + private SqlDataReader _sqlReader; public SqlConnectionsUpdateChecker() { - sqlConnector = default(SqlDatabaseConnector); - sqlQuery = default(SqlCommand); - sqlReader = default(SqlDataReader); + _sqlConnector = default(SqlDatabaseConnector); + _sqlQuery = default(SqlCommand); + _sqlReader = default(SqlDataReader); } ~SqlConnectionsUpdateChecker() @@ -30,7 +30,7 @@ namespace mRemoteNG.Config.Connections public void IsDatabaseUpdateAvailableAsync() { - Thread t = new Thread(IsDatabaseUpdateAvailableDelegate); + var t = new Thread(IsDatabaseUpdateAvailableDelegate); t.SetApartmentState(ApartmentState.STA); t.Start(); } @@ -42,19 +42,19 @@ namespace mRemoteNG.Config.Connections public bool IsDatabaseUpdateAvailable() { - ConnectToSqlDB(); + ConnectToSqlDb(); BuildSqlQueryToGetUpdateStatus(); ExecuteQuery(); - bool updateIsAvailable = DatabaseIsMoreUpToDateThanUs(); - SendUpdateCheckFinishedEvent(updateIsAvailable); + var updateIsAvailable = DatabaseIsMoreUpToDateThanUs(); + RaiseUpdateCheckFinishedEvent(updateIsAvailable); return updateIsAvailable; } - private void ConnectToSqlDB() + private void ConnectToSqlDb() { try { - sqlConnector = new SqlDatabaseConnector(); - sqlConnector.Connect(); + _sqlConnector = new SqlDatabaseConnector(); + _sqlConnector.Connect(); } catch(Exception e) { @@ -66,8 +66,8 @@ namespace mRemoteNG.Config.Connections try { SqlCommandBuilder sqlCmdBuilder = new SqlUpdateQueryBuilder(); - sqlQuery = sqlCmdBuilder.BuildCommand(); - sqlConnector.AssociateItemToThisConnector(sqlQuery); + _sqlQuery = sqlCmdBuilder.BuildCommand(); + _sqlConnector.AssociateItemToThisConnector(_sqlQuery); } catch (Exception ex) { @@ -78,8 +78,8 @@ namespace mRemoteNG.Config.Connections { try { - sqlReader = sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); - sqlReader.Read(); + _sqlReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); + _sqlReader.Read(); } catch (Exception ex) { @@ -88,22 +88,17 @@ namespace mRemoteNG.Config.Connections } private bool DatabaseIsMoreUpToDateThanUs() { - if (GetLastUpdateTimeFromDBResponse() > Runtime.LastSqlUpdate) - return true; - return false; + return GetLastUpdateTimeFromDbResponse() > Runtime.LastSqlUpdate; } - private DateTime GetLastUpdateTimeFromDBResponse() + + private DateTime GetLastUpdateTimeFromDbResponse() { - DateTime LastUpdateInDB = default(DateTime); - if (sqlReader.HasRows) - LastUpdateInDB = Convert.ToDateTime(sqlReader["LastUpdate"]); - return LastUpdateInDB; - } - private void SendUpdateCheckFinishedEvent(bool UpdateAvailable) - { - if (SQLUpdateCheckFinishedEvent != null) - SQLUpdateCheckFinishedEvent(UpdateAvailable); + var lastUpdateInDb = default(DateTime); + if (_sqlReader.HasRows) + lastUpdateInDb = Convert.ToDateTime(_sqlReader["LastUpdate"]); + return lastUpdateInDb; } + public void Dispose() @@ -113,20 +108,18 @@ namespace mRemoteNG.Config.Connections private void Dispose(bool itIsSafeToDisposeManagedObjects) { - if (itIsSafeToDisposeManagedObjects) - { - sqlConnector.Disconnect(); - sqlConnector.Dispose(); - } + if (!itIsSafeToDisposeManagedObjects) return; + _sqlConnector.Disconnect(); + _sqlConnector.Dispose(); } - public delegate void SQLUpdateCheckFinishedEventHandler(bool UpdateAvailable); - private static SQLUpdateCheckFinishedEventHandler SQLUpdateCheckFinishedEvent; - public static event SQLUpdateCheckFinishedEventHandler SQLUpdateCheckFinished + public delegate void SqlUpdateCheckFinishedEventHandler(bool updateAvailable); + + public static event SqlUpdateCheckFinishedEventHandler SqlUpdateCheckFinished; + private void RaiseUpdateCheckFinishedEvent(bool updateAvailable) { - add { SQLUpdateCheckFinishedEvent = (SQLUpdateCheckFinishedEventHandler)System.Delegate.Combine(SQLUpdateCheckFinishedEvent, value); } - remove { SQLUpdateCheckFinishedEvent = (SQLUpdateCheckFinishedEventHandler)System.Delegate.Remove(SQLUpdateCheckFinishedEvent, value); } + SqlUpdateCheckFinished?.Invoke(updateAvailable); } } } \ No newline at end of file From 94648f072ef5d9bb2541c0bbdff66af9a36ab879 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 29 Sep 2016 15:02:12 -0600 Subject: [PATCH 297/338] Code cleanup --- .../Connections/SQLConnectionsProvider.cs | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs b/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs index 251484379..d1ae11b12 100644 --- a/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs +++ b/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs @@ -6,8 +6,8 @@ namespace mRemoteNG.Config.Connections { public class SqlConnectionsProvider : IDisposable { - SqlUpdateTimer _updateTimer; - SqlConnectionsUpdateChecker _sqlUpdateChecker; + readonly SqlUpdateTimer _updateTimer; + readonly SqlConnectionsUpdateChecker _sqlUpdateChecker; public SqlConnectionsProvider() @@ -41,12 +41,10 @@ namespace mRemoteNG.Config.Connections private void Dispose(bool itIsSafeToAlsoFreeManagedObjects) { - if (itIsSafeToAlsoFreeManagedObjects) - { - DestroySQLUpdateHandlers(); - _updateTimer.Dispose(); - _sqlUpdateChecker.Dispose(); - } + if (!itIsSafeToAlsoFreeManagedObjects) return; + DestroySQLUpdateHandlers(); + _updateTimer.Dispose(); + _sqlUpdateChecker.Dispose(); } private void DestroySQLUpdateHandlers() @@ -60,13 +58,11 @@ namespace mRemoteNG.Config.Connections _sqlUpdateChecker.IsDatabaseUpdateAvailableAsync(); } - private void SQLUpdateCheckFinished(bool UpdateIsAvailable) + private void SQLUpdateCheckFinished(bool updateIsAvailable) { - if (UpdateIsAvailable) - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strSqlUpdateCheckUpdateAvailable, true); - Runtime.LoadConnectionsBG(); - } + if (!updateIsAvailable) return; + Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strSqlUpdateCheckUpdateAvailable, true); + Runtime.LoadConnectionsBG(); } } } \ No newline at end of file From d7501751e30048ad7062f136bef86d9a5837d9e3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 07:49:10 -0600 Subject: [PATCH 298/338] Removed the SqlUpdateQueryBuilder since it serves very little purpose --- .../Connections/SqlUpdateQueryBuilderTest.cs | 32 ----------- mRemoteNGTests/mRemoteNGTests.csproj | 1 - .../SqlConnectionsUpdateChecker.cs | 55 ++++++++----------- .../SqlUpdateAvailableEventArgs.cs | 16 ++++++ .../Connections/SqlUpdateQueryBuilder.cs | 24 -------- mRemoteV1/mRemoteV1.csproj | 2 +- 6 files changed, 39 insertions(+), 91 deletions(-) delete mode 100644 mRemoteNGTests/Config/Connections/SqlUpdateQueryBuilderTest.cs create mode 100644 mRemoteV1/Config/Connections/SqlUpdateAvailableEventArgs.cs delete mode 100644 mRemoteV1/Config/Connections/SqlUpdateQueryBuilder.cs diff --git a/mRemoteNGTests/Config/Connections/SqlUpdateQueryBuilderTest.cs b/mRemoteNGTests/Config/Connections/SqlUpdateQueryBuilderTest.cs deleted file mode 100644 index 2fa590455..000000000 --- a/mRemoteNGTests/Config/Connections/SqlUpdateQueryBuilderTest.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using NUnit.Framework; -using mRemoteNG.Config.Connections; -using System.Data.SqlClient; - -namespace mRemoteNGTests.Config.Connections -{ - [TestFixture] - public class SqlUpdateQueryBuilderTest - { - private SqlUpdateQueryBuilder _sqlUpdateQueryBuilder; - - [SetUp] - public void Setup() - { - _sqlUpdateQueryBuilder = new SqlUpdateQueryBuilder(); - } - - [TearDown] - public void Teardown() - { - _sqlUpdateQueryBuilder = null; - } - - [Test] - public void SqlUpdateQueryBuilderReturnsSomeCommand() - { - SqlCommand command = _sqlUpdateQueryBuilder.BuildCommand(); - Assert.AreNotEqual(command.CommandText, ""); - } - } -} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 726649529..27172c010 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -126,7 +126,6 @@ - diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs index 9650e5ae7..26d3b3f0c 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs @@ -10,22 +10,21 @@ namespace mRemoteNG.Config.Connections { public class SqlConnectionsUpdateChecker : IDisposable { - private IDatabaseConnector _sqlConnector; - private SqlCommand _sqlQuery; + private readonly SqlDatabaseConnector _sqlConnector; + private readonly SqlCommand _sqlQuery; private SqlDataReader _sqlReader; + private DateTime _lastUpdateTime; public SqlConnectionsUpdateChecker() { - _sqlConnector = default(SqlDatabaseConnector); - _sqlQuery = default(SqlCommand); + _sqlConnector = new SqlDatabaseConnector(); + _sqlQuery = new SqlCommand("SELECT * FROM tblUpdate", _sqlConnector.SqlConnection); _sqlReader = default(SqlDataReader); + _lastUpdateTime = default(DateTime); } - ~SqlConnectionsUpdateChecker() - { - Dispose(false); - } + public void IsDatabaseUpdateAvailableAsync() @@ -43,7 +42,6 @@ namespace mRemoteNG.Config.Connections public bool IsDatabaseUpdateAvailable() { ConnectToSqlDb(); - BuildSqlQueryToGetUpdateStatus(); ExecuteQuery(); var updateIsAvailable = DatabaseIsMoreUpToDateThanUs(); RaiseUpdateCheckFinishedEvent(updateIsAvailable); @@ -53,7 +51,6 @@ namespace mRemoteNG.Config.Connections { try { - _sqlConnector = new SqlDatabaseConnector(); _sqlConnector.Connect(); } catch(Exception e) @@ -61,19 +58,7 @@ namespace mRemoteNG.Config.Connections Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "Unable to connect to Sql DB to check for updates." + Environment.NewLine + e.Message, true); } } - private void BuildSqlQueryToGetUpdateStatus() - { - try - { - SqlCommandBuilder sqlCmdBuilder = new SqlUpdateQueryBuilder(); - _sqlQuery = sqlCmdBuilder.BuildCommand(); - _sqlConnector.AssociateItemToThisConnector(_sqlQuery); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "Could not build query to check for updates from the Sql server." + Environment.NewLine + ex.Message, true); - } - } + private void ExecuteQuery() { try @@ -86,9 +71,10 @@ namespace mRemoteNG.Config.Connections Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "Error executing Sql query to get updates from the DB." + Environment.NewLine + ex.Message, true); } } + private bool DatabaseIsMoreUpToDateThanUs() { - return GetLastUpdateTimeFromDbResponse() > Runtime.LastSqlUpdate; + return GetLastUpdateTimeFromDbResponse() > _lastUpdateTime; } private DateTime GetLastUpdateTimeFromDbResponse() @@ -99,7 +85,19 @@ namespace mRemoteNG.Config.Connections return lastUpdateInDb; } + public delegate void SqlUpdateCheckFinishedEventHandler(bool updateAvailable); + public static event SqlUpdateCheckFinishedEventHandler SqlUpdateCheckFinished; + private void RaiseUpdateCheckFinishedEvent(bool updateAvailable) + { + SqlUpdateCheckFinished?.Invoke(updateAvailable); + } + + + ~SqlConnectionsUpdateChecker() + { + Dispose(false); + } public void Dispose() { @@ -112,14 +110,5 @@ namespace mRemoteNG.Config.Connections _sqlConnector.Disconnect(); _sqlConnector.Dispose(); } - - - public delegate void SqlUpdateCheckFinishedEventHandler(bool updateAvailable); - - public static event SqlUpdateCheckFinishedEventHandler SqlUpdateCheckFinished; - private void RaiseUpdateCheckFinishedEvent(bool updateAvailable) - { - SqlUpdateCheckFinished?.Invoke(updateAvailable); - } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/SqlUpdateAvailableEventArgs.cs b/mRemoteV1/Config/Connections/SqlUpdateAvailableEventArgs.cs new file mode 100644 index 000000000..035470783 --- /dev/null +++ b/mRemoteV1/Config/Connections/SqlUpdateAvailableEventArgs.cs @@ -0,0 +1,16 @@ +using mRemoteNG.Config.DatabaseConnectors; + + +namespace mRemoteNG.Config.Connections +{ + public delegate void SqlUpdateAvailableEventHandler(object sender, SqlUpdateAvailableEventArgs args); + public class SqlUpdateAvailableEventArgs + { + public SqlDatabaseConnector DatabaseConnector { get; private set; } + + public SqlUpdateAvailableEventArgs(SqlDatabaseConnector databaseConnector) + { + DatabaseConnector = databaseConnector; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/SqlUpdateQueryBuilder.cs b/mRemoteV1/Config/Connections/SqlUpdateQueryBuilder.cs deleted file mode 100644 index 0c5b2c286..000000000 --- a/mRemoteV1/Config/Connections/SqlUpdateQueryBuilder.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Data.SqlClient; - -namespace mRemoteNG.Config.Connections -{ - public class SqlUpdateQueryBuilder : SqlCommandBuilder - { - private string _updateQuery; - - public SqlUpdateQueryBuilder() - { - Initialize(); - } - - private void Initialize() - { - _updateQuery = "SELECT * FROM tblUpdate"; - } - - public SqlCommand BuildCommand() - { - return new SqlCommand(_updateQuery); - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index de2fecce4..250325c20 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,6 +127,7 @@ + @@ -151,7 +152,6 @@ - From f0da08883647d62efb2ef8a636241488ff47ca8d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 07:50:49 -0600 Subject: [PATCH 299/338] Renamed SqlConnectionsProvider to PeriodicConnectionsUpdateChecker to better indicate its purpose --- ...tionsProvider.cs => PeriodicConnectionsUpdateChecker.cs} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename mRemoteV1/Config/Connections/{SQLConnectionsProvider.cs => PeriodicConnectionsUpdateChecker.cs} (92%) diff --git a/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs similarity index 92% rename from mRemoteV1/Config/Connections/SQLConnectionsProvider.cs rename to mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs index d1ae11b12..19c16df0a 100644 --- a/mRemoteV1/Config/Connections/SQLConnectionsProvider.cs +++ b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs @@ -4,13 +4,13 @@ using System; namespace mRemoteNG.Config.Connections { - public class SqlConnectionsProvider : IDisposable + public class PeriodicConnectionsUpdateChecker : IDisposable { readonly SqlUpdateTimer _updateTimer; readonly SqlConnectionsUpdateChecker _sqlUpdateChecker; - public SqlConnectionsProvider() + public PeriodicConnectionsUpdateChecker() { _updateTimer = new SqlUpdateTimer(); _sqlUpdateChecker = new SqlConnectionsUpdateChecker(); @@ -18,7 +18,7 @@ namespace mRemoteNG.Config.Connections SqlConnectionsUpdateChecker.SqlUpdateCheckFinished += SQLUpdateCheckFinished; } - ~SqlConnectionsProvider() + ~PeriodicConnectionsUpdateChecker() { Dispose(false); } From 812cf21f98dfb6714b36dfdce5e68ddeb68aea39 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 08:00:34 -0600 Subject: [PATCH 300/338] Some updates that should have been committed with the last rename --- mRemoteV1/App/Runtime.cs | 2 +- mRemoteV1/App/Startup.cs | 2 +- mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs | 2 +- mRemoteV1/mRemoteV1.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 2f6df643c..1d74f63c0 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -31,7 +31,7 @@ namespace mRemoteNG.App public static MessageCollector MessageCollector { get; set; } public static Controls.NotificationAreaIcon NotificationAreaIcon { get; set; } public static bool IsConnectionsFileLoaded { get; set; } - public static SqlConnectionsProvider SqlConnProvider { get; set; } + public static PeriodicConnectionsUpdateChecker SqlConnProvider { get; set; } public static DateTime LastSqlUpdate { get; set; } public static string LastSelected { get; set; } public static ArrayList ExternalTools { get; set; } = new ArrayList(); diff --git a/mRemoteV1/App/Startup.cs b/mRemoteV1/App/Startup.cs index f5ae5a5ae..30e62fa2f 100644 --- a/mRemoteV1/App/Startup.cs +++ b/mRemoteV1/App/Startup.cs @@ -189,7 +189,7 @@ namespace mRemoteNG.App { if (Settings.Default.UseSQLServer) { - SqlConnectionsProvider _sqlConnectionsProvider = new SqlConnectionsProvider(); + PeriodicConnectionsUpdateChecker _sqlConnectionsProvider = new PeriodicConnectionsUpdateChecker(); } } diff --git a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs index 5621adac7..f6977c50a 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs @@ -68,7 +68,7 @@ namespace mRemoteNG.UI.Forms.OptionsPages frmMain.Default.AreWeUsingSqlServerForSavingConnections = Settings.Default.UseSQLServer; if (Settings.Default.UseSQLServer) { - Runtime.SqlConnProvider = new SqlConnectionsProvider(); + Runtime.SqlConnProvider = new PeriodicConnectionsUpdateChecker(); Runtime.SqlConnProvider.Enable(); } } diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 250325c20..fd5b9734d 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -151,7 +151,7 @@ - + From 0d70033e4c71f34543a6a3e5415f82a3576f9220 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 08:01:15 -0600 Subject: [PATCH 301/338] Some code rearranging --- .../PeriodicConnectionsUpdateChecker.cs | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs index 19c16df0a..6317ef24b 100644 --- a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs @@ -18,11 +18,6 @@ namespace mRemoteNG.Config.Connections SqlConnectionsUpdateChecker.SqlUpdateCheckFinished += SQLUpdateCheckFinished; } - ~PeriodicConnectionsUpdateChecker() - { - Dispose(false); - } - public void Enable() { _updateTimer.Enable(); @@ -33,20 +28,6 @@ namespace mRemoteNG.Config.Connections _updateTimer.Disable(); } - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool itIsSafeToAlsoFreeManagedObjects) - { - if (!itIsSafeToAlsoFreeManagedObjects) return; - DestroySQLUpdateHandlers(); - _updateTimer.Dispose(); - _sqlUpdateChecker.Dispose(); - } - private void DestroySQLUpdateHandlers() { SqlUpdateTimer.SqlUpdateTimerElapsed -= SqlUpdateTimer_SqlUpdateTimerElapsed; @@ -64,5 +45,25 @@ namespace mRemoteNG.Config.Connections Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strSqlUpdateCheckUpdateAvailable, true); Runtime.LoadConnectionsBG(); } + + + ~PeriodicConnectionsUpdateChecker() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool itIsSafeToAlsoFreeManagedObjects) + { + if (!itIsSafeToAlsoFreeManagedObjects) return; + DestroySQLUpdateHandlers(); + _updateTimer.Dispose(); + _sqlUpdateChecker.Dispose(); + } } } \ No newline at end of file From 021a3fe3bc938c2e039dec41ba49e79ec6e57b49 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 08:02:02 -0600 Subject: [PATCH 302/338] Created interface IConnectionsUpdateChecker and modified SqlConnectionsUpdateChecker to implement it --- .../Connections/IConnectionsUpdateChecker.cs | 11 ++++++++ .../PeriodicConnectionsUpdateChecker.cs | 2 +- .../SqlConnectionsUpdateChecker.cs | 27 ++++++++----------- mRemoteV1/mRemoteV1.csproj | 1 + 4 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs diff --git a/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs new file mode 100644 index 000000000..e08f4a0c2 --- /dev/null +++ b/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs @@ -0,0 +1,11 @@ + + +namespace mRemoteNG.Config.Connections +{ + public interface IConnectionsUpdateChecker + { + bool IsUpdateAvailable(); + + void IsUpdateAvailableAsync(); + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs index 6317ef24b..35063f217 100644 --- a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs @@ -36,7 +36,7 @@ namespace mRemoteNG.Config.Connections private void SqlUpdateTimer_SqlUpdateTimerElapsed() { - _sqlUpdateChecker.IsDatabaseUpdateAvailableAsync(); + _sqlUpdateChecker.IsUpdateAvailableAsync(); } private void SQLUpdateCheckFinished(bool updateIsAvailable) diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs index 26d3b3f0c..8cf507749 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs @@ -8,7 +8,7 @@ using mRemoteNG.Config.DatabaseConnectors; namespace mRemoteNG.Config.Connections { - public class SqlConnectionsUpdateChecker : IDisposable + public class SqlConnectionsUpdateChecker : IDisposable, IConnectionsUpdateChecker { private readonly SqlDatabaseConnector _sqlConnector; private readonly SqlCommand _sqlQuery; @@ -25,21 +25,7 @@ namespace mRemoteNG.Config.Connections } - - - public void IsDatabaseUpdateAvailableAsync() - { - var t = new Thread(IsDatabaseUpdateAvailableDelegate); - t.SetApartmentState(ApartmentState.STA); - t.Start(); - } - - private void IsDatabaseUpdateAvailableDelegate() - { - IsDatabaseUpdateAvailable(); - } - - public bool IsDatabaseUpdateAvailable() + public bool IsUpdateAvailable() { ConnectToSqlDb(); ExecuteQuery(); @@ -47,6 +33,15 @@ namespace mRemoteNG.Config.Connections RaiseUpdateCheckFinishedEvent(updateIsAvailable); return updateIsAvailable; } + + public void IsUpdateAvailableAsync() + { + var threadStart = new ThreadStart(() => IsUpdateAvailable()); + var thread = new Thread(threadStart); + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + } + private void ConnectToSqlDb() { try diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index fd5b9734d..6af7709b0 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,6 +127,7 @@ + From 6819c1d9ff5b5b8e6e2107633c10555ba80a7c5b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 08:04:44 -0600 Subject: [PATCH 303/338] Made IConnectionsUpdateChecker implement IDisposable --- mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs | 5 +++-- mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs index e08f4a0c2..1f86bfb1d 100644 --- a/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs @@ -1,8 +1,9 @@ - +using System; + namespace mRemoteNG.Config.Connections { - public interface IConnectionsUpdateChecker + public interface IConnectionsUpdateChecker : IDisposable { bool IsUpdateAvailable(); diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs index 8cf507749..75a37ea4f 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs @@ -8,7 +8,7 @@ using mRemoteNG.Config.DatabaseConnectors; namespace mRemoteNG.Config.Connections { - public class SqlConnectionsUpdateChecker : IDisposable, IConnectionsUpdateChecker + public class SqlConnectionsUpdateChecker : IConnectionsUpdateChecker { private readonly SqlDatabaseConnector _sqlConnector; private readonly SqlCommand _sqlQuery; From de7493bc00210da2204558bb16b6726627faf208 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 08:35:41 -0600 Subject: [PATCH 304/338] Implemented the ConnectionsUpdateAvailable event. --- .../ConnectionsUpdateAvailableEventArgs.cs | 18 +++++++++++++ ...ConnectionsUpdateCheckFinishedEventArgs.cs | 12 +++++++++ .../Connections/IConnectionsUpdateChecker.cs | 3 +++ .../PeriodicConnectionsUpdateChecker.cs | 27 +++++++++---------- .../SqlConnectionsUpdateChecker.cs | 18 +++++++++---- .../SqlUpdateAvailableEventArgs.cs | 16 ----------- mRemoteV1/mRemoteV1.csproj | 3 ++- 7 files changed, 61 insertions(+), 36 deletions(-) create mode 100644 mRemoteV1/Config/Connections/ConnectionsUpdateAvailableEventArgs.cs create mode 100644 mRemoteV1/Config/Connections/ConnectionsUpdateCheckFinishedEventArgs.cs delete mode 100644 mRemoteV1/Config/Connections/SqlUpdateAvailableEventArgs.cs diff --git a/mRemoteV1/Config/Connections/ConnectionsUpdateAvailableEventArgs.cs b/mRemoteV1/Config/Connections/ConnectionsUpdateAvailableEventArgs.cs new file mode 100644 index 000000000..befad66f7 --- /dev/null +++ b/mRemoteV1/Config/Connections/ConnectionsUpdateAvailableEventArgs.cs @@ -0,0 +1,18 @@ +using System; +using mRemoteNG.Config.DatabaseConnectors; + + +namespace mRemoteNG.Config.Connections +{ + public delegate void ConnectionsUpdateAvailableEventHandler(object sender, ConnectionsUpdateAvailableEventArgs args); + + public class ConnectionsUpdateAvailableEventArgs : EventArgs + { + public IDatabaseConnector DatabaseConnector { get; private set; } + + public ConnectionsUpdateAvailableEventArgs(IDatabaseConnector databaseConnector) + { + DatabaseConnector = databaseConnector; + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/ConnectionsUpdateCheckFinishedEventArgs.cs b/mRemoteV1/Config/Connections/ConnectionsUpdateCheckFinishedEventArgs.cs new file mode 100644 index 000000000..0b6072408 --- /dev/null +++ b/mRemoteV1/Config/Connections/ConnectionsUpdateCheckFinishedEventArgs.cs @@ -0,0 +1,12 @@ +using System; + + +namespace mRemoteNG.Config.Connections +{ + public delegate void UpdateCheckFinishedEventHandler(object sender, ConnectionsUpdateCheckFinishedEventArgs args); + + public class ConnectionsUpdateCheckFinishedEventArgs : EventArgs + { + public bool UpdateAvailable { get; set; } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs index 1f86bfb1d..721887494 100644 --- a/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs @@ -8,5 +8,8 @@ namespace mRemoteNG.Config.Connections bool IsUpdateAvailable(); void IsUpdateAvailableAsync(); + + event UpdateCheckFinishedEventHandler UpdateCheckFinished; + event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; } } \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs index 35063f217..8b031eb38 100644 --- a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs @@ -6,16 +6,16 @@ namespace mRemoteNG.Config.Connections { public class PeriodicConnectionsUpdateChecker : IDisposable { - readonly SqlUpdateTimer _updateTimer; - readonly SqlConnectionsUpdateChecker _sqlUpdateChecker; + private readonly SqlUpdateTimer _updateTimer; + private readonly IConnectionsUpdateChecker _updateChecker; public PeriodicConnectionsUpdateChecker() { _updateTimer = new SqlUpdateTimer(); - _sqlUpdateChecker = new SqlConnectionsUpdateChecker(); + _updateChecker = new SqlConnectionsUpdateChecker(); SqlUpdateTimer.SqlUpdateTimerElapsed += SqlUpdateTimer_SqlUpdateTimerElapsed; - SqlConnectionsUpdateChecker.SqlUpdateCheckFinished += SQLUpdateCheckFinished; + _updateChecker.ConnectionsUpdateAvailable += OnConnectionsUpdateAvailable; } public void Enable() @@ -28,20 +28,13 @@ namespace mRemoteNG.Config.Connections _updateTimer.Disable(); } - private void DestroySQLUpdateHandlers() - { - SqlUpdateTimer.SqlUpdateTimerElapsed -= SqlUpdateTimer_SqlUpdateTimerElapsed; - SqlConnectionsUpdateChecker.SqlUpdateCheckFinished -= SQLUpdateCheckFinished; - } - private void SqlUpdateTimer_SqlUpdateTimerElapsed() { - _sqlUpdateChecker.IsUpdateAvailableAsync(); + _updateChecker.IsUpdateAvailableAsync(); } - private void SQLUpdateCheckFinished(bool updateIsAvailable) + private void OnConnectionsUpdateAvailable(object sender, ConnectionsUpdateAvailableEventArgs args) { - if (!updateIsAvailable) return; Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strSqlUpdateCheckUpdateAvailable, true); Runtime.LoadConnectionsBG(); } @@ -63,7 +56,13 @@ namespace mRemoteNG.Config.Connections if (!itIsSafeToAlsoFreeManagedObjects) return; DestroySQLUpdateHandlers(); _updateTimer.Dispose(); - _sqlUpdateChecker.Dispose(); + _updateChecker.Dispose(); + } + + private void DestroySQLUpdateHandlers() + { + SqlUpdateTimer.SqlUpdateTimerElapsed -= SqlUpdateTimer_SqlUpdateTimerElapsed; + _updateChecker.ConnectionsUpdateAvailable -= OnConnectionsUpdateAvailable; } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs index 75a37ea4f..265cf4653 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs @@ -31,13 +31,14 @@ namespace mRemoteNG.Config.Connections ExecuteQuery(); var updateIsAvailable = DatabaseIsMoreUpToDateThanUs(); RaiseUpdateCheckFinishedEvent(updateIsAvailable); + if (updateIsAvailable) + RaiseConnectionsUpdateAvailableEvent(); return updateIsAvailable; } public void IsUpdateAvailableAsync() { - var threadStart = new ThreadStart(() => IsUpdateAvailable()); - var thread = new Thread(threadStart); + var thread = new Thread(() => IsUpdateAvailable()); thread.SetApartmentState(ApartmentState.STA); thread.Start(); } @@ -80,12 +81,19 @@ namespace mRemoteNG.Config.Connections return lastUpdateInDb; } - public delegate void SqlUpdateCheckFinishedEventHandler(bool updateAvailable); - public static event SqlUpdateCheckFinishedEventHandler SqlUpdateCheckFinished; + public event UpdateCheckFinishedEventHandler UpdateCheckFinished; private void RaiseUpdateCheckFinishedEvent(bool updateAvailable) { - SqlUpdateCheckFinished?.Invoke(updateAvailable); + var args = new ConnectionsUpdateCheckFinishedEventArgs {UpdateAvailable = updateAvailable}; + UpdateCheckFinished?.Invoke(this, args); + } + + public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; + private void RaiseConnectionsUpdateAvailableEvent() + { + var args = new ConnectionsUpdateAvailableEventArgs(_sqlConnector); + ConnectionsUpdateAvailable?.Invoke(this, args); } diff --git a/mRemoteV1/Config/Connections/SqlUpdateAvailableEventArgs.cs b/mRemoteV1/Config/Connections/SqlUpdateAvailableEventArgs.cs deleted file mode 100644 index 035470783..000000000 --- a/mRemoteV1/Config/Connections/SqlUpdateAvailableEventArgs.cs +++ /dev/null @@ -1,16 +0,0 @@ -using mRemoteNG.Config.DatabaseConnectors; - - -namespace mRemoteNG.Config.Connections -{ - public delegate void SqlUpdateAvailableEventHandler(object sender, SqlUpdateAvailableEventArgs args); - public class SqlUpdateAvailableEventArgs - { - public SqlDatabaseConnector DatabaseConnector { get; private set; } - - public SqlUpdateAvailableEventArgs(SqlDatabaseConnector databaseConnector) - { - DatabaseConnector = databaseConnector; - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 6af7709b0..55b65c4c8 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,8 +127,9 @@ + - + From 36d5c888a54e82012c536fc7308877be07a9dedd Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 09:02:12 -0600 Subject: [PATCH 305/338] Cleanup. Made PeriodicConnectionsUpdateChecker a bit more generically useful --- .../PeriodicConnectionsUpdateChecker.cs | 49 ++++++++----------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs index 8b031eb38..a660f5434 100644 --- a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs @@ -1,44 +1,44 @@ -using mRemoteNG.App; -using mRemoteNG.Messages; -using System; +using System; +using System.Timers; + namespace mRemoteNG.Config.Connections { - public class PeriodicConnectionsUpdateChecker : IDisposable + public class PeriodicConnectionsUpdateChecker : IConnectionsUpdateChecker { - private readonly SqlUpdateTimer _updateTimer; + private readonly Timer _updateTimer; private readonly IConnectionsUpdateChecker _updateChecker; + public double TimerIntervalInMilliseconds => _updateTimer.Interval; + public PeriodicConnectionsUpdateChecker() { - _updateTimer = new SqlUpdateTimer(); + _updateTimer = new Timer(3000); _updateChecker = new SqlConnectionsUpdateChecker(); SqlUpdateTimer.SqlUpdateTimerElapsed += SqlUpdateTimer_SqlUpdateTimerElapsed; - _updateChecker.ConnectionsUpdateAvailable += OnConnectionsUpdateAvailable; + _updateChecker.ConnectionsUpdateAvailable += (sender, args) => ConnectionsUpdateAvailable?.Invoke(sender, args); + _updateChecker.UpdateCheckFinished += (sender, args) => UpdateCheckFinished?.Invoke(sender, args); } - public void Enable() + public void Enable() => _updateTimer.Start(); + + public void Disable() => _updateTimer.Stop(); + + private void SqlUpdateTimer_SqlUpdateTimerElapsed() => _updateChecker.IsUpdateAvailableAsync(); + + public bool IsUpdateAvailable() { - _updateTimer.Enable(); + return _updateChecker.IsUpdateAvailable(); } - public void Disable() - { - _updateTimer.Disable(); - } - - private void SqlUpdateTimer_SqlUpdateTimerElapsed() + public void IsUpdateAvailableAsync() { _updateChecker.IsUpdateAvailableAsync(); } - private void OnConnectionsUpdateAvailable(object sender, ConnectionsUpdateAvailableEventArgs args) - { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, Language.strSqlUpdateCheckUpdateAvailable, true); - Runtime.LoadConnectionsBG(); - } - + public event UpdateCheckFinishedEventHandler UpdateCheckFinished; + public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; ~PeriodicConnectionsUpdateChecker() { @@ -54,15 +54,8 @@ namespace mRemoteNG.Config.Connections private void Dispose(bool itIsSafeToAlsoFreeManagedObjects) { if (!itIsSafeToAlsoFreeManagedObjects) return; - DestroySQLUpdateHandlers(); _updateTimer.Dispose(); _updateChecker.Dispose(); } - - private void DestroySQLUpdateHandlers() - { - SqlUpdateTimer.SqlUpdateTimerElapsed -= SqlUpdateTimer_SqlUpdateTimerElapsed; - _updateChecker.ConnectionsUpdateAvailable -= OnConnectionsUpdateAvailable; - } } } \ No newline at end of file From cb2ff4002fdb12b8923c4fa12f0154dede616759 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 09:27:53 -0600 Subject: [PATCH 306/338] Moved some files to Config.Connections.Multiuser to keep things organized --- .../ConnectionsUpdateAvailableEventArgs.cs | 0 .../ConnectionsUpdateCheckFinishedEventArgs.cs | 0 .../IConnectionsUpdateChecker.cs | 0 .../PeriodicConnectionsUpdateChecker.cs | 18 +++++------------- .../SqlConnectionsUpdateChecker.cs | 1 - mRemoteV1/mRemoteV1.csproj | 10 +++++----- 6 files changed, 10 insertions(+), 19 deletions(-) rename mRemoteV1/Config/Connections/{ => Multiuser}/ConnectionsUpdateAvailableEventArgs.cs (100%) rename mRemoteV1/Config/Connections/{ => Multiuser}/ConnectionsUpdateCheckFinishedEventArgs.cs (100%) rename mRemoteV1/Config/Connections/{ => Multiuser}/IConnectionsUpdateChecker.cs (100%) rename mRemoteV1/Config/Connections/{ => Multiuser}/PeriodicConnectionsUpdateChecker.cs (71%) rename mRemoteV1/Config/Connections/{ => Multiuser}/SqlConnectionsUpdateChecker.cs (99%) diff --git a/mRemoteV1/Config/Connections/ConnectionsUpdateAvailableEventArgs.cs b/mRemoteV1/Config/Connections/Multiuser/ConnectionsUpdateAvailableEventArgs.cs similarity index 100% rename from mRemoteV1/Config/Connections/ConnectionsUpdateAvailableEventArgs.cs rename to mRemoteV1/Config/Connections/Multiuser/ConnectionsUpdateAvailableEventArgs.cs diff --git a/mRemoteV1/Config/Connections/ConnectionsUpdateCheckFinishedEventArgs.cs b/mRemoteV1/Config/Connections/Multiuser/ConnectionsUpdateCheckFinishedEventArgs.cs similarity index 100% rename from mRemoteV1/Config/Connections/ConnectionsUpdateCheckFinishedEventArgs.cs rename to mRemoteV1/Config/Connections/Multiuser/ConnectionsUpdateCheckFinishedEventArgs.cs diff --git a/mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/IConnectionsUpdateChecker.cs similarity index 100% rename from mRemoteV1/Config/Connections/IConnectionsUpdateChecker.cs rename to mRemoteV1/Config/Connections/Multiuser/IConnectionsUpdateChecker.cs diff --git a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs similarity index 71% rename from mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs rename to mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs index a660f5434..672f7eb02 100644 --- a/mRemoteV1/Config/Connections/PeriodicConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs @@ -12,11 +12,11 @@ namespace mRemoteNG.Config.Connections public double TimerIntervalInMilliseconds => _updateTimer.Interval; - public PeriodicConnectionsUpdateChecker() + public PeriodicConnectionsUpdateChecker(IConnectionsUpdateChecker updateChecker) { _updateTimer = new Timer(3000); - _updateChecker = new SqlConnectionsUpdateChecker(); - SqlUpdateTimer.SqlUpdateTimerElapsed += SqlUpdateTimer_SqlUpdateTimerElapsed; + _updateChecker = updateChecker; + _updateTimer.Elapsed += (sender, args) => _updateChecker.IsUpdateAvailableAsync(); _updateChecker.ConnectionsUpdateAvailable += (sender, args) => ConnectionsUpdateAvailable?.Invoke(sender, args); _updateChecker.UpdateCheckFinished += (sender, args) => UpdateCheckFinished?.Invoke(sender, args); } @@ -25,17 +25,9 @@ namespace mRemoteNG.Config.Connections public void Disable() => _updateTimer.Stop(); - private void SqlUpdateTimer_SqlUpdateTimerElapsed() => _updateChecker.IsUpdateAvailableAsync(); + public bool IsUpdateAvailable() => _updateChecker.IsUpdateAvailable(); - public bool IsUpdateAvailable() - { - return _updateChecker.IsUpdateAvailable(); - } - - public void IsUpdateAvailableAsync() - { - _updateChecker.IsUpdateAvailableAsync(); - } + public void IsUpdateAvailableAsync() => _updateChecker.IsUpdateAvailableAsync(); public event UpdateCheckFinishedEventHandler UpdateCheckFinished; public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; diff --git a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs similarity index 99% rename from mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs rename to mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs index 265cf4653..aae9ddc0d 100644 --- a/mRemoteV1/Config/Connections/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs @@ -24,7 +24,6 @@ namespace mRemoteNG.Config.Connections _lastUpdateTime = default(DateTime); } - public bool IsUpdateAvailable() { ConnectToSqlDb(); diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 55b65c4c8..f2651d85b 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -127,9 +127,9 @@ - - - + + + @@ -152,8 +152,8 @@ - - + + From e4ec71928d38cabae9acd6af8465ac2d357c7384 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 09:28:20 -0600 Subject: [PATCH 307/338] Cleanup --- mRemoteV1/App/Startup.cs | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/mRemoteV1/App/Startup.cs b/mRemoteV1/App/Startup.cs index 30e62fa2f..a5f525468 100644 --- a/mRemoteV1/App/Startup.cs +++ b/mRemoteV1/App/Startup.cs @@ -52,7 +52,6 @@ namespace mRemoteNG.App DefaultConnectionInheritance.Instance.LoadFrom(Settings.Default, (a)=>"InhDefault"+a); } - public void SetDefaultLayout() { frmMain.Default.pnlDock.Visible = false; @@ -87,17 +86,14 @@ namespace mRemoteNG.App } } - private void LogStartupData() { - if (Settings.Default.WriteLogFile) - { - LogApplicationData(); - LogCmdLineArgs(); - LogSystemData(); - LogCLRData(); - LogCultureData(); - } + if (!Settings.Default.WriteLogFile) return; + LogApplicationData(); + LogCmdLineArgs(); + LogSystemData(); + LogCLRData(); + LogCultureData(); } private void LogSystemData() @@ -184,13 +180,10 @@ namespace mRemoteNG.App $"System Culture: {Thread.CurrentThread.CurrentUICulture.Name}/{Thread.CurrentThread.CurrentUICulture.NativeName}"); } - public void CreateConnectionsProvider() { - if (Settings.Default.UseSQLServer) - { - PeriodicConnectionsUpdateChecker _sqlConnectionsProvider = new PeriodicConnectionsUpdateChecker(); - } + if (!Settings.Default.UseSQLServer) return; + Runtime.SqlConnProvider = new PeriodicConnectionsUpdateChecker(new SqlConnectionsUpdateChecker()); } private void CheckForUpdate() @@ -246,7 +239,6 @@ namespace mRemoteNG.App } } - private void CheckForAnnouncement() { if (_appUpdate == null) @@ -290,7 +282,6 @@ namespace mRemoteNG.App } } - private void ParseCommandLineArgs() { try From 5826f055e3e6bd4dae141e0344291e31892520ba Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 13:47:08 -0600 Subject: [PATCH 308/338] DB updates now trigger reloading of connections data and rebuilding of the connection tree (somewhat thread safe) --- mRemoteV1/App/Export.cs | 3 +- mRemoteV1/App/Runtime.cs | 20 ++++++++----- mRemoteV1/App/Startup.cs | 2 +- .../Multiuser/IConnectionsUpdateChecker.cs | 1 + .../PeriodicConnectionsUpdateChecker.cs | 23 +++++++++++++- .../Multiuser/SqlConnectionsUpdateChecker.cs | 30 ++++++++++++++----- mRemoteV1/Tree/ObjectListViewExtensions.cs | 24 +++++++++++++++ .../UI/Forms/OptionsPages/SqlServerPage.cs | 20 ++++++------- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 6 ++-- mRemoteV1/mRemoteV1.csproj | 1 + 10 files changed, 97 insertions(+), 33 deletions(-) create mode 100644 mRemoteV1/Tree/ObjectListViewExtensions.cs diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index c1fe54e54..cb8742b37 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -97,8 +97,7 @@ namespace mRemoteNG.App } finally { - if (Runtime.SqlConnProvider != null) - Runtime.SqlConnProvider.Enable(); + Runtime.ConnectionsUpdateChecker?.Enable(); } } } diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 1d74f63c0..00ceb1257 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -31,11 +31,15 @@ namespace mRemoteNG.App public static MessageCollector MessageCollector { get; set; } public static Controls.NotificationAreaIcon NotificationAreaIcon { get; set; } public static bool IsConnectionsFileLoaded { get; set; } - public static PeriodicConnectionsUpdateChecker SqlConnProvider { get; set; } + public static PeriodicConnectionsUpdateChecker ConnectionsUpdateChecker { get; set; } public static DateTime LastSqlUpdate { get; set; } public static string LastSelected { get; set; } public static ArrayList ExternalTools { get; set; } = new ArrayList(); - public static ConnectionTreeModel ConnectionTreeModel { get; set; } + public static ConnectionTreeModel ConnectionTreeModel + { + get { return Windows.TreeForm.ConnectionTreeModel; } + set { Windows.TreeForm.ConnectionTreeModel = value; } + } #endregion #region Panels @@ -260,7 +264,7 @@ namespace mRemoteNG.App try { // disable sql update checking while we are loading updates - SqlConnProvider?.Disable(); + ConnectionsUpdateChecker?.Disable(); if (!Settings.Default.UseSQLServer) { @@ -300,7 +304,7 @@ namespace mRemoteNG.App } // re-enable sql update checking after updates are loaded - SqlConnProvider?.Enable(); + ConnectionsUpdateChecker?.Enable(); } catch (Exception ex) { @@ -445,7 +449,7 @@ namespace mRemoteNG.App if (Update && Settings.Default.UseSQLServer == false) return; - SqlConnProvider?.Disable(); + ConnectionsUpdateChecker?.Disable(); var connectionsSaver = new ConnectionsSaver(); @@ -477,7 +481,7 @@ namespace mRemoteNG.App } finally { - SqlConnProvider?.Enable(); + ConnectionsUpdateChecker?.Enable(); } } @@ -487,7 +491,7 @@ namespace mRemoteNG.App try { - SqlConnProvider?.Disable(); + ConnectionsUpdateChecker?.Disable(); using (var saveFileDialog = new SaveFileDialog()) { @@ -531,7 +535,7 @@ namespace mRemoteNG.App } finally { - SqlConnProvider?.Enable(); + ConnectionsUpdateChecker?.Enable(); } } #endregion diff --git a/mRemoteV1/App/Startup.cs b/mRemoteV1/App/Startup.cs index a5f525468..b713951e9 100644 --- a/mRemoteV1/App/Startup.cs +++ b/mRemoteV1/App/Startup.cs @@ -183,7 +183,7 @@ namespace mRemoteNG.App public void CreateConnectionsProvider() { if (!Settings.Default.UseSQLServer) return; - Runtime.SqlConnProvider = new PeriodicConnectionsUpdateChecker(new SqlConnectionsUpdateChecker()); + Runtime.ConnectionsUpdateChecker = new PeriodicConnectionsUpdateChecker(new SqlConnectionsUpdateChecker()); } private void CheckForUpdate() diff --git a/mRemoteV1/Config/Connections/Multiuser/IConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/IConnectionsUpdateChecker.cs index 721887494..e80b657f9 100644 --- a/mRemoteV1/Config/Connections/Multiuser/IConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/Multiuser/IConnectionsUpdateChecker.cs @@ -9,6 +9,7 @@ namespace mRemoteNG.Config.Connections void IsUpdateAvailableAsync(); + event EventHandler UpdateCheckStarted; event UpdateCheckFinishedEventHandler UpdateCheckFinished; event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; } diff --git a/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs index 672f7eb02..633bc7959 100644 --- a/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Timers; @@ -17,8 +18,15 @@ namespace mRemoteNG.Config.Connections _updateTimer = new Timer(3000); _updateChecker = updateChecker; _updateTimer.Elapsed += (sender, args) => _updateChecker.IsUpdateAvailableAsync(); + _updateTimer.Elapsed += (sender, args) => tickdebug(); + _updateChecker.UpdateCheckStarted += UpdateCheckerOnUpdateCheckStarted; + _updateChecker.UpdateCheckFinished += UpdateCheckerOnUpdateCheckFinished; _updateChecker.ConnectionsUpdateAvailable += (sender, args) => ConnectionsUpdateAvailable?.Invoke(sender, args); - _updateChecker.UpdateCheckFinished += (sender, args) => UpdateCheckFinished?.Invoke(sender, args); + } + + private void tickdebug() + { + Debug.WriteLine("update_tick"); } public void Enable() => _updateTimer.Start(); @@ -29,6 +37,19 @@ namespace mRemoteNG.Config.Connections public void IsUpdateAvailableAsync() => _updateChecker.IsUpdateAvailableAsync(); + private void UpdateCheckerOnUpdateCheckStarted(object sender, EventArgs eventArgs) + { + _updateTimer.Stop(); + UpdateCheckStarted?.Invoke(sender, eventArgs); + } + + private void UpdateCheckerOnUpdateCheckFinished(object sender, ConnectionsUpdateCheckFinishedEventArgs eventArgs) + { + _updateTimer.Start(); + UpdateCheckFinished?.Invoke(sender, eventArgs); + } + + public event EventHandler UpdateCheckStarted; public event UpdateCheckFinishedEventHandler UpdateCheckFinished; public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; diff --git a/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs index aae9ddc0d..adf4dabd6 100644 --- a/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs @@ -12,7 +12,6 @@ namespace mRemoteNG.Config.Connections { private readonly SqlDatabaseConnector _sqlConnector; private readonly SqlCommand _sqlQuery; - private SqlDataReader _sqlReader; private DateTime _lastUpdateTime; @@ -20,18 +19,18 @@ namespace mRemoteNG.Config.Connections { _sqlConnector = new SqlDatabaseConnector(); _sqlQuery = new SqlCommand("SELECT * FROM tblUpdate", _sqlConnector.SqlConnection); - _sqlReader = default(SqlDataReader); _lastUpdateTime = default(DateTime); } public bool IsUpdateAvailable() { + RaiseUpdateCheckStartedEvent(); ConnectToSqlDb(); ExecuteQuery(); var updateIsAvailable = DatabaseIsMoreUpToDateThanUs(); - RaiseUpdateCheckFinishedEvent(updateIsAvailable); if (updateIsAvailable) RaiseConnectionsUpdateAvailableEvent(); + RaiseUpdateCheckFinishedEvent(updateIsAvailable); return updateIsAvailable; } @@ -58,8 +57,7 @@ namespace mRemoteNG.Config.Connections { try { - _sqlReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); - _sqlReader.Read(); + } catch (Exception ex) { @@ -75,11 +73,27 @@ namespace mRemoteNG.Config.Connections private DateTime GetLastUpdateTimeFromDbResponse() { var lastUpdateInDb = default(DateTime); - if (_sqlReader.HasRows) - lastUpdateInDb = Convert.ToDateTime(_sqlReader["LastUpdate"]); + try + { + var sqlReader = _sqlQuery.ExecuteReader(CommandBehavior.CloseConnection); + sqlReader.Read(); + if (sqlReader.HasRows) + lastUpdateInDb = Convert.ToDateTime(sqlReader["LastUpdate"]); + sqlReader.Close(); + } + catch (Exception ex) + { + Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "Error executing Sql query to get updates from the DB." + Environment.NewLine + ex.Message, true); + } return lastUpdateInDb; } - + + + public event EventHandler UpdateCheckStarted; + private void RaiseUpdateCheckStartedEvent() + { + UpdateCheckStarted?.Invoke(this, EventArgs.Empty); + } public event UpdateCheckFinishedEventHandler UpdateCheckFinished; private void RaiseUpdateCheckFinishedEvent(bool updateAvailable) diff --git a/mRemoteV1/Tree/ObjectListViewExtensions.cs b/mRemoteV1/Tree/ObjectListViewExtensions.cs new file mode 100644 index 000000000..2e7c1b554 --- /dev/null +++ b/mRemoteV1/Tree/ObjectListViewExtensions.cs @@ -0,0 +1,24 @@ +using System.Windows.Forms; +using BrightIdeasSoftware; + + +namespace mRemoteNG.Tree +{ + public static class ObjectListViewExtensions + { + public static void Invoke(this Control control, MethodInvoker action) + { + control.Invoke(action); + } + + public static void InvokeExpand(this TreeListView control, object model) + { + control.Invoke(() => control.Expand(model)); + } + + public static void InvokeRebuildAll(this TreeListView control, bool preserveState) + { + control.Invoke(() => control.RebuildAll(preserveState)); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs index f6977c50a..fe5472139 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs @@ -62,16 +62,16 @@ namespace mRemoteNG.UI.Forms.OptionsPages private static void ReinitializeSqlUpdater() { - if (Runtime.SqlConnProvider != null) - { - Runtime.SqlConnProvider.Dispose(); - frmMain.Default.AreWeUsingSqlServerForSavingConnections = Settings.Default.UseSQLServer; - if (Settings.Default.UseSQLServer) - { - Runtime.SqlConnProvider = new PeriodicConnectionsUpdateChecker(); - Runtime.SqlConnProvider.Enable(); - } - } + Runtime.ConnectionsUpdateChecker?.Dispose(); + frmMain.Default.AreWeUsingSqlServerForSavingConnections = Settings.Default.UseSQLServer; + + if (!Settings.Default.UseSQLServer) return; + var loader = new ConnectionsLoader {UseDatabase = Settings.Default.UseSQLServer}; + Runtime.ConnectionTreeModel = loader.LoadConnections(false); + var periodicUpdateChecker = new PeriodicConnectionsUpdateChecker(new SqlConnectionsUpdateChecker()); + periodicUpdateChecker.ConnectionsUpdateAvailable += (sender, args) => Runtime.ConnectionTreeModel = loader.LoadConnections(false); + Runtime.ConnectionsUpdateChecker = periodicUpdateChecker; + periodicUpdateChecker.Enable(); } private void chkUseSQLServer_CheckedChanged(object sender, EventArgs e) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 19391f8e6..b980d6369 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -248,8 +248,8 @@ namespace mRemoteNG.UI.Window private void ExpandRootConnectionNode() { var rootConnectionNode = GetRootConnectionNode(); - olvConnections.Expand(rootConnectionNode); - } + olvConnections.InvokeExpand(rootConnectionNode); + } private RootNodeInfo GetRootConnectionNode() { @@ -307,7 +307,7 @@ namespace mRemoteNG.UI.Window var containerList = ConnectionTreeModel.GetRecursiveChildList(GetRootConnectionNode()).OfType(); var previouslyExpandedNodes = containerList.Where(container => container.IsExpanded); olvConnections.ExpandedObjects = previouslyExpandedNodes; - olvConnections.RebuildAll(true); + olvConnections.InvokeRebuildAll(true); } public void OpenConnectionsFromLastSession() diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index f2651d85b..337248a9f 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -208,6 +208,7 @@ + Component From 64b6c5967d59035a3651be4f0647aff62df75dfe Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 13:50:41 -0600 Subject: [PATCH 309/338] Removed unused code --- .../Config/Connections/SqlUpdateTimerTests.cs | 40 --------- mRemoteNGTests/mRemoteNGTests.csproj | 1 - .../Config/Connections/SqlCommandBuilder.cs | 9 -- .../Config/Connections/SqlUpdateTimer.cs | 82 ------------------- mRemoteV1/mRemoteV1.csproj | 2 - 5 files changed, 134 deletions(-) delete mode 100644 mRemoteNGTests/Config/Connections/SqlUpdateTimerTests.cs delete mode 100644 mRemoteV1/Config/Connections/SqlCommandBuilder.cs delete mode 100644 mRemoteV1/Config/Connections/SqlUpdateTimer.cs diff --git a/mRemoteNGTests/Config/Connections/SqlUpdateTimerTests.cs b/mRemoteNGTests/Config/Connections/SqlUpdateTimerTests.cs deleted file mode 100644 index ffc189489..000000000 --- a/mRemoteNGTests/Config/Connections/SqlUpdateTimerTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -using mRemoteNG.Config.Connections; -using NUnit.Framework; - -namespace mRemoteNGTests.Config.Connections -{ - [TestFixture] - public class SqlUpdateTimerTests - { - private SqlUpdateTimer sqlUpdateChecker; - - [SetUp] - public void SetupSqlUpdateChecker() - { - sqlUpdateChecker = new SqlUpdateTimer(); - } - - [TearDown] - public void TearDownSqlUpdateChecker() - { - sqlUpdateChecker.Dispose(); - sqlUpdateChecker = null; - } - - [Test] - public void EnableSQLUpdating() - { - sqlUpdateChecker.Enable(); - Assert.AreEqual(true, sqlUpdateChecker.IsUpdateCheckingEnabled()); - } - - [Test] - public void DisableSQLUpdating() - { - sqlUpdateChecker.Enable(); - Assert.AreEqual(true, sqlUpdateChecker.IsUpdateCheckingEnabled()); - sqlUpdateChecker.Disable(); - Assert.AreEqual(false, sqlUpdateChecker.IsUpdateCheckingEnabled()); - } - } -} \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 27172c010..9dc0a20e8 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -126,7 +126,6 @@ - True diff --git a/mRemoteV1/Config/Connections/SqlCommandBuilder.cs b/mRemoteV1/Config/Connections/SqlCommandBuilder.cs deleted file mode 100644 index 8f5f9a837..000000000 --- a/mRemoteV1/Config/Connections/SqlCommandBuilder.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Data.SqlClient; - -namespace mRemoteNG.Config.Connections -{ - public interface SqlCommandBuilder - { - SqlCommand BuildCommand(); - } -} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/SqlUpdateTimer.cs b/mRemoteV1/Config/Connections/SqlUpdateTimer.cs deleted file mode 100644 index 2e7f079f9..000000000 --- a/mRemoteV1/Config/Connections/SqlUpdateTimer.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Timers; -using mRemoteNG.App; - -namespace mRemoteNG.Config.Connections -{ - public class SqlUpdateTimer : IDisposable - { - private Timer _sqlUpdateTimer; - - public SqlUpdateTimer() - { - Initialize(); - } - - ~SqlUpdateTimer() - { - Dispose(false); - } - - private void Initialize() - { - _sqlUpdateTimer = new Timer(); - _sqlUpdateTimer.Interval = 3000; - _sqlUpdateTimer.Elapsed += sqlUpdateTimer_Elapsed; - } - - public void Enable() - { - _sqlUpdateTimer.Start(); - } - - public void Disable() - { - _sqlUpdateTimer.Stop(); - } - - public bool IsUpdateCheckingEnabled() - { - return _sqlUpdateTimer.Enabled; - } - - private static void sqlUpdateTimer_Elapsed(object sender, ElapsedEventArgs e) - { - SqlUpdateTimerElapsedEvent(); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - protected void Dispose(bool itIsSafeToAlsoFreeManagedObjects) - { - if (itIsSafeToAlsoFreeManagedObjects) - { - StopTimer(); - } - } - private void StopTimer() - { - try - { - _sqlUpdateTimer.Stop(); - _sqlUpdateTimer.Close(); - } - catch (Exception ex) - { - Runtime.MessageCollector.AddExceptionStackTrace("SqlUpdateTimer StopTimer Exception", ex); - } - } - - - public delegate void SqlUpdateTimerElapsedEventHandler(); - private static SqlUpdateTimerElapsedEventHandler SqlUpdateTimerElapsedEvent; - public static event SqlUpdateTimerElapsedEventHandler SqlUpdateTimerElapsed - { - add { SqlUpdateTimerElapsedEvent = (SqlUpdateTimerElapsedEventHandler)Delegate.Combine(SqlUpdateTimerElapsedEvent, value); } - remove { SqlUpdateTimerElapsedEvent = (SqlUpdateTimerElapsedEventHandler)Delegate.Remove(SqlUpdateTimerElapsedEvent, value); } - } - } -} \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 337248a9f..fa6624cd9 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -151,10 +151,8 @@ - - From 279682df111499ec6dafc452f1437da2ec567b10 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 13:55:25 -0600 Subject: [PATCH 310/338] the db update checker now runs on app startup --- mRemoteV1/App/Startup.cs | 9 ++++++++- mRemoteV1/Config/Connections/ConnectionsLoader.cs | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/App/Startup.cs b/mRemoteV1/App/Startup.cs index b713951e9..38c12faf5 100644 --- a/mRemoteV1/App/Startup.cs +++ b/mRemoteV1/App/Startup.cs @@ -182,8 +182,15 @@ namespace mRemoteNG.App public void CreateConnectionsProvider() { + frmMain.Default.AreWeUsingSqlServerForSavingConnections = Settings.Default.UseSQLServer; + if (!Settings.Default.UseSQLServer) return; - Runtime.ConnectionsUpdateChecker = new PeriodicConnectionsUpdateChecker(new SqlConnectionsUpdateChecker()); + var loader = new ConnectionsLoader { UseDatabase = Settings.Default.UseSQLServer }; + Runtime.ConnectionTreeModel = loader.LoadConnections(false); + var periodicUpdateChecker = new PeriodicConnectionsUpdateChecker(new SqlConnectionsUpdateChecker()); + periodicUpdateChecker.ConnectionsUpdateAvailable += (sender, args) => Runtime.ConnectionTreeModel = loader.LoadConnections(false); + Runtime.ConnectionsUpdateChecker = periodicUpdateChecker; + periodicUpdateChecker.Enable(); } private void CheckForUpdate() diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index bfef1dc86..b474fa7e8 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -33,7 +33,6 @@ namespace mRemoteNG.Config.Connections var connectionTreeModel = deserializer.Deserialize(); - frmMain.Default.AreWeUsingSqlServerForSavingConnections = UseDatabase; frmMain.Default.ConnectionsFileName = ConnectionFileName; if (import) return connectionTreeModel; From 4b90b259a8df428e970e72f6d453523e4f556233 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 14:49:14 -0600 Subject: [PATCH 311/338] Created a class that brings all the various database classes together to keep the local connections tree updated with the remote connections tree. DB reads will now only occur if the local last update time is behind the remote last update time. --- mRemoteV1/App/Export.cs | 2 +- mRemoteV1/App/Runtime.cs | 14 ++--- mRemoteV1/App/Startup.cs | 8 +-- .../ConnectionsUpdateAvailableEventArgs.cs | 5 +- .../Multiuser/RemoteConnectionsSyncronizer.cs | 51 +++++++++++++++++++ .../Multiuser/SqlConnectionsUpdateChecker.cs | 7 ++- .../UI/Forms/OptionsPages/SqlServerPage.cs | 10 ++-- mRemoteV1/mRemoteV1.csproj | 1 + 8 files changed, 75 insertions(+), 23 deletions(-) create mode 100644 mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index cb8742b37..198051b96 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -97,7 +97,7 @@ namespace mRemoteNG.App } finally { - Runtime.ConnectionsUpdateChecker?.Enable(); + Runtime.RemoteConnectionsSyncronizer?.Enable(); } } } diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 00ceb1257..fed17e6db 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -31,7 +31,7 @@ namespace mRemoteNG.App public static MessageCollector MessageCollector { get; set; } public static Controls.NotificationAreaIcon NotificationAreaIcon { get; set; } public static bool IsConnectionsFileLoaded { get; set; } - public static PeriodicConnectionsUpdateChecker ConnectionsUpdateChecker { get; set; } + public static RemoteConnectionsSyncronizer RemoteConnectionsSyncronizer { get; set; } public static DateTime LastSqlUpdate { get; set; } public static string LastSelected { get; set; } public static ArrayList ExternalTools { get; set; } = new ArrayList(); @@ -264,7 +264,7 @@ namespace mRemoteNG.App try { // disable sql update checking while we are loading updates - ConnectionsUpdateChecker?.Disable(); + RemoteConnectionsSyncronizer?.Disable(); if (!Settings.Default.UseSQLServer) { @@ -304,7 +304,7 @@ namespace mRemoteNG.App } // re-enable sql update checking after updates are loaded - ConnectionsUpdateChecker?.Enable(); + RemoteConnectionsSyncronizer?.Enable(); } catch (Exception ex) { @@ -449,7 +449,7 @@ namespace mRemoteNG.App if (Update && Settings.Default.UseSQLServer == false) return; - ConnectionsUpdateChecker?.Disable(); + RemoteConnectionsSyncronizer?.Disable(); var connectionsSaver = new ConnectionsSaver(); @@ -481,7 +481,7 @@ namespace mRemoteNG.App } finally { - ConnectionsUpdateChecker?.Enable(); + RemoteConnectionsSyncronizer?.Enable(); } } @@ -491,7 +491,7 @@ namespace mRemoteNG.App try { - ConnectionsUpdateChecker?.Disable(); + RemoteConnectionsSyncronizer?.Disable(); using (var saveFileDialog = new SaveFileDialog()) { @@ -535,7 +535,7 @@ namespace mRemoteNG.App } finally { - ConnectionsUpdateChecker?.Enable(); + RemoteConnectionsSyncronizer?.Enable(); } } #endregion diff --git a/mRemoteV1/App/Startup.cs b/mRemoteV1/App/Startup.cs index 38c12faf5..0f2ec796a 100644 --- a/mRemoteV1/App/Startup.cs +++ b/mRemoteV1/App/Startup.cs @@ -185,12 +185,8 @@ namespace mRemoteNG.App frmMain.Default.AreWeUsingSqlServerForSavingConnections = Settings.Default.UseSQLServer; if (!Settings.Default.UseSQLServer) return; - var loader = new ConnectionsLoader { UseDatabase = Settings.Default.UseSQLServer }; - Runtime.ConnectionTreeModel = loader.LoadConnections(false); - var periodicUpdateChecker = new PeriodicConnectionsUpdateChecker(new SqlConnectionsUpdateChecker()); - periodicUpdateChecker.ConnectionsUpdateAvailable += (sender, args) => Runtime.ConnectionTreeModel = loader.LoadConnections(false); - Runtime.ConnectionsUpdateChecker = periodicUpdateChecker; - periodicUpdateChecker.Enable(); + Runtime.RemoteConnectionsSyncronizer = new RemoteConnectionsSyncronizer(new SqlConnectionsUpdateChecker()); + Runtime.RemoteConnectionsSyncronizer.Enable(); } private void CheckForUpdate() diff --git a/mRemoteV1/Config/Connections/Multiuser/ConnectionsUpdateAvailableEventArgs.cs b/mRemoteV1/Config/Connections/Multiuser/ConnectionsUpdateAvailableEventArgs.cs index befad66f7..09e8ed841 100644 --- a/mRemoteV1/Config/Connections/Multiuser/ConnectionsUpdateAvailableEventArgs.cs +++ b/mRemoteV1/Config/Connections/Multiuser/ConnectionsUpdateAvailableEventArgs.cs @@ -9,10 +9,13 @@ namespace mRemoteNG.Config.Connections public class ConnectionsUpdateAvailableEventArgs : EventArgs { public IDatabaseConnector DatabaseConnector { get; private set; } + public DateTime UpdateTime { get; private set; } + public bool Handled { get; set; } - public ConnectionsUpdateAvailableEventArgs(IDatabaseConnector databaseConnector) + public ConnectionsUpdateAvailableEventArgs(IDatabaseConnector databaseConnector, DateTime updateTime) { DatabaseConnector = databaseConnector; + UpdateTime = updateTime; } } } \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs b/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs new file mode 100644 index 000000000..9691a6a47 --- /dev/null +++ b/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs @@ -0,0 +1,51 @@ +using System; +using mRemoteNG.App; + + +namespace mRemoteNG.Config.Connections +{ + public class RemoteConnectionsSyncronizer : IDisposable + { + private readonly PeriodicConnectionsUpdateChecker _periodicConnectionsUpdateChecker; + private readonly ConnectionsLoader _connectionsLoader; + private readonly ConnectionsSaver _connectionsSaver; + + public RemoteConnectionsSyncronizer(IConnectionsUpdateChecker updateChecker) + { + _periodicConnectionsUpdateChecker = new PeriodicConnectionsUpdateChecker(updateChecker); + _connectionsLoader = new ConnectionsLoader { UseDatabase = mRemoteNG.Settings.Default.UseSQLServer }; + _connectionsSaver = new ConnectionsSaver(); + _periodicConnectionsUpdateChecker.ConnectionsUpdateAvailable += Load; + } + + public void Load() + { + Runtime.ConnectionTreeModel = _connectionsLoader.LoadConnections(false); + } + + private void Load(object sender, ConnectionsUpdateAvailableEventArgs args) + { + Load(); + args.Handled = true; + } + + public void Enable() => _periodicConnectionsUpdateChecker.Enable(); + public void Disable() => _periodicConnectionsUpdateChecker.Disable(); + + + ~RemoteConnectionsSyncronizer() + { + Dispose(false); + } + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + private void Dispose(bool itIsSafeToAlsoFreeManagedObjects) + { + if (!itIsSafeToAlsoFreeManagedObjects) return; + _periodicConnectionsUpdateChecker.Dispose(); + } + } +} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs index adf4dabd6..bd2a50aa5 100644 --- a/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs @@ -13,6 +13,7 @@ namespace mRemoteNG.Config.Connections private readonly SqlDatabaseConnector _sqlConnector; private readonly SqlCommand _sqlQuery; private DateTime _lastUpdateTime; + private DateTime _lastDatabaseUpdateTime; public SqlConnectionsUpdateChecker() @@ -20,6 +21,7 @@ namespace mRemoteNG.Config.Connections _sqlConnector = new SqlDatabaseConnector(); _sqlQuery = new SqlCommand("SELECT * FROM tblUpdate", _sqlConnector.SqlConnection); _lastUpdateTime = default(DateTime); + _lastDatabaseUpdateTime = default(DateTime); } public bool IsUpdateAvailable() @@ -85,6 +87,7 @@ namespace mRemoteNG.Config.Connections { Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "Error executing Sql query to get updates from the DB." + Environment.NewLine + ex.Message, true); } + _lastDatabaseUpdateTime = lastUpdateInDb; return lastUpdateInDb; } @@ -105,8 +108,10 @@ namespace mRemoteNG.Config.Connections public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; private void RaiseConnectionsUpdateAvailableEvent() { - var args = new ConnectionsUpdateAvailableEventArgs(_sqlConnector); + var args = new ConnectionsUpdateAvailableEventArgs(_sqlConnector, _lastDatabaseUpdateTime); ConnectionsUpdateAvailable?.Invoke(this, args); + if(args.Handled) + _lastUpdateTime = _lastDatabaseUpdateTime; } diff --git a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs index fe5472139..749cacbea 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs @@ -62,16 +62,12 @@ namespace mRemoteNG.UI.Forms.OptionsPages private static void ReinitializeSqlUpdater() { - Runtime.ConnectionsUpdateChecker?.Dispose(); + Runtime.RemoteConnectionsSyncronizer?.Dispose(); frmMain.Default.AreWeUsingSqlServerForSavingConnections = Settings.Default.UseSQLServer; if (!Settings.Default.UseSQLServer) return; - var loader = new ConnectionsLoader {UseDatabase = Settings.Default.UseSQLServer}; - Runtime.ConnectionTreeModel = loader.LoadConnections(false); - var periodicUpdateChecker = new PeriodicConnectionsUpdateChecker(new SqlConnectionsUpdateChecker()); - periodicUpdateChecker.ConnectionsUpdateAvailable += (sender, args) => Runtime.ConnectionTreeModel = loader.LoadConnections(false); - Runtime.ConnectionsUpdateChecker = periodicUpdateChecker; - periodicUpdateChecker.Enable(); + Runtime.RemoteConnectionsSyncronizer = new RemoteConnectionsSyncronizer(new SqlConnectionsUpdateChecker()); + Runtime.RemoteConnectionsSyncronizer.Enable(); } private void chkUseSQLServer_CheckedChanged(object sender, EventArgs e) diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index fa6624cd9..76c3b84dc 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -130,6 +130,7 @@ + From 5f40bab9c58d1aab450f16714fb82aa4076c1902 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 15:31:46 -0600 Subject: [PATCH 312/338] Enforce column data types --- .../Config/Serializers/DataTableSerializer.cs | 326 +++++++++--------- 1 file changed, 163 insertions(+), 163 deletions(-) diff --git a/mRemoteV1/Config/Serializers/DataTableSerializer.cs b/mRemoteV1/Config/Serializers/DataTableSerializer.cs index 189c5f950..407556783 100644 --- a/mRemoteV1/Config/Serializers/DataTableSerializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableSerializer.cs @@ -40,117 +40,117 @@ namespace mRemoteNG.Config.Serializers private void CreateSchema() { - _dataTable.Columns.Add("Name"); - _dataTable.Columns.Add("Type"); - _dataTable.Columns.Add("ConstantID"); - _dataTable.Columns.Add("ParentID"); - _dataTable.Columns.Add("PositionID"); - _dataTable.Columns.Add("LastChange"); - _dataTable.Columns.Add("Expanded"); - _dataTable.Columns.Add("Description"); - _dataTable.Columns.Add("Icon"); - _dataTable.Columns.Add("Panel"); - _dataTable.Columns.Add("Username"); - _dataTable.Columns.Add("Domain"); - _dataTable.Columns.Add("Password"); - _dataTable.Columns.Add("Hostname"); - _dataTable.Columns.Add("Protocol"); - _dataTable.Columns.Add("PuttySession"); - _dataTable.Columns.Add("Port"); - _dataTable.Columns.Add("ConnectToConsole"); - _dataTable.Columns.Add("UseCredSsp"); - _dataTable.Columns.Add("RenderingEngine"); - _dataTable.Columns.Add("ICAEncryptionStrength"); - _dataTable.Columns.Add("RDPAuthenticationLevel"); - _dataTable.Columns.Add("LoadBalanceInfo"); - _dataTable.Columns.Add("Colors"); - _dataTable.Columns.Add("Resolution"); - _dataTable.Columns.Add("AutomaticResize"); - _dataTable.Columns.Add("DisplayWallpaper"); - _dataTable.Columns.Add("DisplayThemes"); - _dataTable.Columns.Add("EnableFontSmoothing"); - _dataTable.Columns.Add("EnableDesktopComposition"); - _dataTable.Columns.Add("CacheBitmaps"); - _dataTable.Columns.Add("RedirectDiskDrives"); - _dataTable.Columns.Add("RedirectPorts"); - _dataTable.Columns.Add("RedirectPrinters"); - _dataTable.Columns.Add("RedirectSmartCards"); - _dataTable.Columns.Add("RedirectSound"); - _dataTable.Columns.Add("RedirectKeys"); - _dataTable.Columns.Add("Connected"); - _dataTable.Columns.Add("PreExtApp"); - _dataTable.Columns.Add("PostExtApp"); - _dataTable.Columns.Add("MacAddress"); - _dataTable.Columns.Add("UserField"); - _dataTable.Columns.Add("ExtApp"); - _dataTable.Columns.Add("VNCCompression"); - _dataTable.Columns.Add("VNCEncoding"); - _dataTable.Columns.Add("VNCAuthMode"); - _dataTable.Columns.Add("VNCProxyType"); - _dataTable.Columns.Add("VNCProxyIP"); - _dataTable.Columns.Add("VNCProxyPort"); - _dataTable.Columns.Add("VNCProxyUsername"); - _dataTable.Columns.Add("VNCProxyPassword"); - _dataTable.Columns.Add("VNCColors"); - _dataTable.Columns.Add("VNCSmartSizeMode"); - _dataTable.Columns.Add("VNCViewOnly"); - _dataTable.Columns.Add("RDGatewayUsageMethod"); - _dataTable.Columns.Add("RDGatewayHostname"); + _dataTable.Columns.Add("Name", typeof(string)); + _dataTable.Columns.Add("Type", typeof(string)); + _dataTable.Columns.Add("ConstantID", typeof(string)); + _dataTable.Columns.Add("ParentID", typeof(string)); + _dataTable.Columns.Add("PositionID", typeof(int)); + _dataTable.Columns.Add("LastChange", typeof(DateTime)); + _dataTable.Columns.Add("Expanded", typeof(int)); + _dataTable.Columns.Add("Description", typeof(string)); + _dataTable.Columns.Add("Icon", typeof(string)); + _dataTable.Columns.Add("Panel", typeof(string)); + _dataTable.Columns.Add("Username", typeof(string)); + _dataTable.Columns.Add("Domain", typeof(string)); + _dataTable.Columns.Add("Password", typeof(string)); + _dataTable.Columns.Add("Hostname", typeof(string)); + _dataTable.Columns.Add("Protocol", typeof(string)); + _dataTable.Columns.Add("PuttySession", typeof(string)); + _dataTable.Columns.Add("Port", typeof(int)); + _dataTable.Columns.Add("ConnectToConsole", typeof(int)); + _dataTable.Columns.Add("UseCredSsp", typeof(int)); + _dataTable.Columns.Add("RenderingEngine", typeof(string)); + _dataTable.Columns.Add("ICAEncryptionStrength", typeof(string)); + _dataTable.Columns.Add("RDPAuthenticationLevel", typeof(string)); + _dataTable.Columns.Add("LoadBalanceInfo", typeof(string)); + _dataTable.Columns.Add("Colors", typeof(string)); + _dataTable.Columns.Add("Resolution", typeof(string)); + _dataTable.Columns.Add("AutomaticResize", typeof(int)); + _dataTable.Columns.Add("DisplayWallpaper", typeof(int)); + _dataTable.Columns.Add("DisplayThemes", typeof(int)); + _dataTable.Columns.Add("EnableFontSmoothing", typeof(int)); + _dataTable.Columns.Add("EnableDesktopComposition", typeof(int)); + _dataTable.Columns.Add("CacheBitmaps", typeof(int)); + _dataTable.Columns.Add("RedirectDiskDrives", typeof(int)); + _dataTable.Columns.Add("RedirectPorts", typeof(int)); + _dataTable.Columns.Add("RedirectPrinters", typeof(int)); + _dataTable.Columns.Add("RedirectSmartCards", typeof(int)); + _dataTable.Columns.Add("RedirectSound", typeof(int)); + _dataTable.Columns.Add("RedirectKeys", typeof(int)); + _dataTable.Columns.Add("Connected", typeof(int)); + _dataTable.Columns.Add("PreExtApp", typeof(string)); + _dataTable.Columns.Add("PostExtApp", typeof(string)); + _dataTable.Columns.Add("MacAddress", typeof(string)); + _dataTable.Columns.Add("UserField", typeof(string)); + _dataTable.Columns.Add("ExtApp", typeof(string)); + _dataTable.Columns.Add("VNCCompression", typeof(string)); + _dataTable.Columns.Add("VNCEncoding", typeof(string)); + _dataTable.Columns.Add("VNCAuthMode", typeof(string)); + _dataTable.Columns.Add("VNCProxyType", typeof(string)); + _dataTable.Columns.Add("VNCProxyIP", typeof(string)); + _dataTable.Columns.Add("VNCProxyPort", typeof(int)); + _dataTable.Columns.Add("VNCProxyUsername", typeof(string)); + _dataTable.Columns.Add("VNCProxyPassword", typeof(string)); + _dataTable.Columns.Add("VNCColors", typeof(string)); + _dataTable.Columns.Add("VNCSmartSizeMode", typeof(string)); + _dataTable.Columns.Add("VNCViewOnly", typeof(int)); + _dataTable.Columns.Add("RDGatewayUsageMethod", typeof(string)); + _dataTable.Columns.Add("RDGatewayHostname", typeof(string)); _dataTable.Columns.Add("RDGatewayUseConnectionCredentials"); - _dataTable.Columns.Add("RDGatewayUsername"); - _dataTable.Columns.Add("RDGatewayPassword"); - _dataTable.Columns.Add("RDGatewayDomain"); - _dataTable.Columns.Add("InheritCacheBitmaps"); - _dataTable.Columns.Add("InheritColors"); - _dataTable.Columns.Add("InheritDescription"); - _dataTable.Columns.Add("InheritDisplayThemes"); - _dataTable.Columns.Add("InheritDisplayWallpaper"); - _dataTable.Columns.Add("InheritEnableFontSmoothing"); - _dataTable.Columns.Add("InheritEnableDesktopComposition"); - _dataTable.Columns.Add("InheritDomain"); - _dataTable.Columns.Add("InheritIcon"); - _dataTable.Columns.Add("InheritPanel"); - _dataTable.Columns.Add("InheritPassword"); - _dataTable.Columns.Add("InheritPort"); - _dataTable.Columns.Add("InheritProtocol"); - _dataTable.Columns.Add("InheritPuttySession"); - _dataTable.Columns.Add("InheritRedirectDiskDrives"); - _dataTable.Columns.Add("InheritRedirectKeys"); - _dataTable.Columns.Add("InheritRedirectPorts"); - _dataTable.Columns.Add("InheritRedirectPrinters"); - _dataTable.Columns.Add("InheritRedirectSmartCards"); - _dataTable.Columns.Add("InheritRedirectSound"); - _dataTable.Columns.Add("InheritResolution"); - _dataTable.Columns.Add("InheritAutomaticResize"); - _dataTable.Columns.Add("InheritUseConsoleSession"); - _dataTable.Columns.Add("InheritUseCredSsp"); - _dataTable.Columns.Add("InheritRenderingEngine"); - _dataTable.Columns.Add("InheritUsername"); - _dataTable.Columns.Add("InheritICAEncryptionStrength"); - _dataTable.Columns.Add("InheritRDPAuthenticationLevel"); - _dataTable.Columns.Add("InheritLoadBalanceInfo"); - _dataTable.Columns.Add("InheritPreExtApp"); - _dataTable.Columns.Add("InheritPostExtApp"); - _dataTable.Columns.Add("InheritMacAddress"); - _dataTable.Columns.Add("InheritUserField"); - _dataTable.Columns.Add("InheritExtApp"); - _dataTable.Columns.Add("InheritVNCCompression"); - _dataTable.Columns.Add("InheritVNCEncoding"); - _dataTable.Columns.Add("InheritVNCAuthMode"); - _dataTable.Columns.Add("InheritVNCProxyType"); - _dataTable.Columns.Add("InheritVNCProxyIP"); - _dataTable.Columns.Add("InheritVNCProxyPort"); - _dataTable.Columns.Add("InheritVNCProxyUsername"); - _dataTable.Columns.Add("InheritVNCProxyPassword"); - _dataTable.Columns.Add("InheritVNCColors"); - _dataTable.Columns.Add("InheritVNCSmartSizeMode"); - _dataTable.Columns.Add("InheritVNCViewOnly"); - _dataTable.Columns.Add("InheritRDGatewayUsageMethod"); - _dataTable.Columns.Add("InheritRDGatewayHostname"); - _dataTable.Columns.Add("InheritRDGatewayUseConnectionCredentials"); - _dataTable.Columns.Add("InheritRDGatewayUsername"); - _dataTable.Columns.Add("InheritRDGatewayPassword"); - _dataTable.Columns.Add("InheritRDGatewayDomain"); + _dataTable.Columns.Add("RDGatewayUsername", typeof(string)); + _dataTable.Columns.Add("RDGatewayPassword", typeof(string)); + _dataTable.Columns.Add("RDGatewayDomain", typeof(string)); + _dataTable.Columns.Add("InheritCacheBitmaps", typeof(int)); + _dataTable.Columns.Add("InheritColors", typeof(int)); + _dataTable.Columns.Add("InheritDescription", typeof(int)); + _dataTable.Columns.Add("InheritDisplayThemes", typeof(int)); + _dataTable.Columns.Add("InheritDisplayWallpaper", typeof(int)); + _dataTable.Columns.Add("InheritEnableFontSmoothing", typeof(int)); + _dataTable.Columns.Add("InheritEnableDesktopComposition", typeof(int)); + _dataTable.Columns.Add("InheritDomain", typeof(int)); + _dataTable.Columns.Add("InheritIcon", typeof(int)); + _dataTable.Columns.Add("InheritPanel", typeof(int)); + _dataTable.Columns.Add("InheritPassword", typeof(int)); + _dataTable.Columns.Add("InheritPort", typeof(int)); + _dataTable.Columns.Add("InheritProtocol", typeof(int)); + _dataTable.Columns.Add("InheritPuttySession", typeof(int)); + _dataTable.Columns.Add("InheritRedirectDiskDrives", typeof(int)); + _dataTable.Columns.Add("InheritRedirectKeys", typeof(int)); + _dataTable.Columns.Add("InheritRedirectPorts", typeof(int)); + _dataTable.Columns.Add("InheritRedirectPrinters", typeof(int)); + _dataTable.Columns.Add("InheritRedirectSmartCards", typeof(int)); + _dataTable.Columns.Add("InheritRedirectSound", typeof(int)); + _dataTable.Columns.Add("InheritResolution", typeof(int)); + _dataTable.Columns.Add("InheritAutomaticResize", typeof(int)); + _dataTable.Columns.Add("InheritUseConsoleSession", typeof(int)); + _dataTable.Columns.Add("InheritUseCredSsp", typeof(int)); + _dataTable.Columns.Add("InheritRenderingEngine", typeof(int)); + _dataTable.Columns.Add("InheritUsername", typeof(int)); + _dataTable.Columns.Add("InheritICAEncryptionStrength", typeof(int)); + _dataTable.Columns.Add("InheritRDPAuthenticationLevel", typeof(int)); + _dataTable.Columns.Add("InheritLoadBalanceInfo", typeof(int)); + _dataTable.Columns.Add("InheritPreExtApp", typeof(int)); + _dataTable.Columns.Add("InheritPostExtApp", typeof(int)); + _dataTable.Columns.Add("InheritMacAddress", typeof(int)); + _dataTable.Columns.Add("InheritUserField", typeof(int)); + _dataTable.Columns.Add("InheritExtApp", typeof(int)); + _dataTable.Columns.Add("InheritVNCCompression", typeof(int)); + _dataTable.Columns.Add("InheritVNCEncoding", typeof(int)); + _dataTable.Columns.Add("InheritVNCAuthMode", typeof(int)); + _dataTable.Columns.Add("InheritVNCProxyType", typeof(int)); + _dataTable.Columns.Add("InheritVNCProxyIP", typeof(int)); + _dataTable.Columns.Add("InheritVNCProxyPort", typeof(int)); + _dataTable.Columns.Add("InheritVNCProxyUsername", typeof(int)); + _dataTable.Columns.Add("InheritVNCProxyPassword", typeof(int)); + _dataTable.Columns.Add("InheritVNCColors", typeof(int)); + _dataTable.Columns.Add("InheritVNCSmartSizeMode", typeof(int)); + _dataTable.Columns.Add("InheritVNCViewOnly", typeof(int)); + _dataTable.Columns.Add("InheritRDGatewayUsageMethod", typeof(int)); + _dataTable.Columns.Add("InheritRDGatewayHostname", typeof(int)); + _dataTable.Columns.Add("InheritRDGatewayUseConnectionCredentials", typeof(int)); + _dataTable.Columns.Add("InheritRDGatewayUsername", typeof(int)); + _dataTable.Columns.Add("InheritRDGatewayPassword", typeof(int)); + _dataTable.Columns.Add("InheritRDGatewayDomain", typeof(int)); } private void SetPrimaryKey() @@ -178,7 +178,7 @@ namespace mRemoteNG.Config.Serializers dataRow["ParentID"] = connectionInfo.Parent.ConstantID; dataRow["PositionID"] = _currentNodeIndex; dataRow["LastChange"] = FormateDateForDatabase(DateTime.Now); - dataRow["Expanded"] = connectionInfo is ContainerInfo ? ((ContainerInfo)connectionInfo).IsExpanded.ToString() : ""; + dataRow["Expanded"] = connectionInfo is ContainerInfo ? ((ContainerInfo)connectionInfo).IsExpanded : false; dataRow["Description"] = connectionInfo.Description; dataRow["Icon"] = connectionInfo.Icon; dataRow["Panel"] = connectionInfo.Panel; @@ -209,7 +209,7 @@ namespace mRemoteNG.Config.Serializers dataRow["RedirectSmartCards"] = connectionInfo.RedirectSmartCards; dataRow["RedirectSound"] = connectionInfo.RedirectSound; dataRow["RedirectKeys"] = connectionInfo.RedirectKeys; - dataRow["Connected"] = connectionInfo.OpenConnections.Count > 0 ? "true" : "false"; + dataRow["Connected"] = connectionInfo.OpenConnections.Count > 0; dataRow["PreExtApp"] = connectionInfo.PreExtApp; dataRow["PostExtApp"] = connectionInfo.PostExtApp; dataRow["MacAddress"] = connectionInfo.MacAddress; @@ -288,57 +288,57 @@ namespace mRemoteNG.Config.Serializers } else { - dataRow["InheritCacheBitmaps"] = ""; - dataRow["InheritColors"] = ""; - dataRow["InheritDescription"] = ""; - dataRow["InheritDisplayThemes"] = ""; - dataRow["InheritDisplayWallpaper"] = ""; - dataRow["InheritEnableFontSmoothing"] = ""; - dataRow["InheritEnableDesktopComposition"] = ""; - dataRow["InheritDomain"] = ""; - dataRow["InheritIcon"] = ""; - dataRow["InheritPanel"] = ""; - dataRow["InheritPassword"] = ""; - dataRow["InheritPort"] = ""; - dataRow["InheritProtocol"] = ""; - dataRow["InheritPuttySession"] = ""; - dataRow["InheritRedirectDiskDrives"] = ""; - dataRow["InheritRedirectKeys"] = ""; - dataRow["InheritRedirectPorts"] = ""; - dataRow["InheritRedirectPrinters"] = ""; - dataRow["InheritRedirectSmartCards"] = ""; - dataRow["InheritRedirectSound"] = ""; - dataRow["InheritResolution"] = ""; - dataRow["InheritAutomaticResize"] = ""; - dataRow["InheritUseConsoleSession"] = ""; - dataRow["InheritUseCredSsp"] = ""; - dataRow["InheritRenderingEngine"] = ""; - dataRow["InheritUsername"] = ""; - dataRow["InheritICAEncryptionStrength"] = ""; - dataRow["InheritRDPAuthenticationLevel"] = ""; - dataRow["InheritLoadBalanceInfo"] = ""; - dataRow["InheritPreExtApp"] = ""; - dataRow["InheritPostExtApp"] = ""; - dataRow["InheritMacAddress"] = ""; - dataRow["InheritUserField"] = ""; - dataRow["InheritExtApp"] = ""; - dataRow["InheritVNCCompression"] = ""; - dataRow["InheritVNCEncoding"] = ""; - dataRow["InheritVNCAuthMode"] = ""; - dataRow["InheritVNCProxyType"] = ""; - dataRow["InheritVNCProxyIP"] = ""; - dataRow["InheritVNCProxyPort"] = ""; - dataRow["InheritVNCProxyUsername"] = ""; - dataRow["InheritVNCProxyPassword"] = ""; - dataRow["InheritVNCColors"] = ""; - dataRow["InheritVNCSmartSizeMode"] = ""; - dataRow["InheritVNCViewOnly"] = ""; - dataRow["InheritRDGatewayUsageMethod"] = ""; - dataRow["InheritRDGatewayHostname"] = ""; - dataRow["InheritRDGatewayUseConnectionCredentials"] = ""; - dataRow["InheritRDGatewayUsername"] = ""; - dataRow["InheritRDGatewayPassword"] = ""; - dataRow["InheritRDGatewayDomain"] = ""; + dataRow["InheritCacheBitmaps"] = false; + dataRow["InheritColors"] = false; + dataRow["InheritDescription"] = false; + dataRow["InheritDisplayThemes"] = false; + dataRow["InheritDisplayWallpaper"] = false; + dataRow["InheritEnableFontSmoothing"] = false; + dataRow["InheritEnableDesktopComposition"] = false; + dataRow["InheritDomain"] = false; + dataRow["InheritIcon"] = false; + dataRow["InheritPanel"] = false; + dataRow["InheritPassword"] = false; + dataRow["InheritPort"] = false; + dataRow["InheritProtocol"] = false; + dataRow["InheritPuttySession"] = false; + dataRow["InheritRedirectDiskDrives"] = false; + dataRow["InheritRedirectKeys"] = false; + dataRow["InheritRedirectPorts"] = false; + dataRow["InheritRedirectPrinters"] = false; + dataRow["InheritRedirectSmartCards"] = false; + dataRow["InheritRedirectSound"] = false; + dataRow["InheritResolution"] = false; + dataRow["InheritAutomaticResize"] = false; + dataRow["InheritUseConsoleSession"] = false; + dataRow["InheritUseCredSsp"] = false; + dataRow["InheritRenderingEngine"] = false; + dataRow["InheritUsername"] = false; + dataRow["InheritICAEncryptionStrength"] = false; + dataRow["InheritRDPAuthenticationLevel"] = false; + dataRow["InheritLoadBalanceInfo"] = false; + dataRow["InheritPreExtApp"] = false; + dataRow["InheritPostExtApp"] = false; + dataRow["InheritMacAddress"] = false; + dataRow["InheritUserField"] = false; + dataRow["InheritExtApp"] = false; + dataRow["InheritVNCCompression"] = false; + dataRow["InheritVNCEncoding"] = false; + dataRow["InheritVNCAuthMode"] = false; + dataRow["InheritVNCProxyType"] = false; + dataRow["InheritVNCProxyIP"] = false; + dataRow["InheritVNCProxyPort"] = false; + dataRow["InheritVNCProxyUsername"] = false; + dataRow["InheritVNCProxyPassword"] = false; + dataRow["InheritVNCColors"] = false; + dataRow["InheritVNCSmartSizeMode"] = false; + dataRow["InheritVNCViewOnly"] = false; + dataRow["InheritRDGatewayUsageMethod"] = false; + dataRow["InheritRDGatewayHostname"] = false; + dataRow["InheritRDGatewayUseConnectionCredentials"] = false; + dataRow["InheritRDGatewayUsername"] = false; + dataRow["InheritRDGatewayPassword"] = false; + dataRow["InheritRDGatewayDomain"] = false; } _dataTable.Rows.Add(dataRow); } From 41cd6f429015936b23f59c050b7410a0c7a9c803 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Fri, 30 Sep 2016 15:32:36 -0600 Subject: [PATCH 313/338] Save supported by the RemoteConnectionsSyncronizer --- .../Connections/Multiuser/RemoteConnectionsSyncronizer.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs b/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs index 9691a6a47..d957061e8 100644 --- a/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs +++ b/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs @@ -14,7 +14,7 @@ namespace mRemoteNG.Config.Connections { _periodicConnectionsUpdateChecker = new PeriodicConnectionsUpdateChecker(updateChecker); _connectionsLoader = new ConnectionsLoader { UseDatabase = mRemoteNG.Settings.Default.UseSQLServer }; - _connectionsSaver = new ConnectionsSaver(); + _connectionsSaver = new ConnectionsSaver { SaveFormat = ConnectionsSaver.Format.SQL }; _periodicConnectionsUpdateChecker.ConnectionsUpdateAvailable += Load; } @@ -29,6 +29,11 @@ namespace mRemoteNG.Config.Connections args.Handled = true; } + public void Save() + { + _connectionsSaver.SaveConnections(); + } + public void Enable() => _periodicConnectionsUpdateChecker.Enable(); public void Disable() => _periodicConnectionsUpdateChecker.Disable(); From 6582ebcf57401f0c6a566b98657c24d47fe0dfeb Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 09:19:57 -0600 Subject: [PATCH 314/338] Resolved minor bug that would occassionaly create unnecessary exceptions --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index b980d6369..f5babf292 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -469,7 +469,7 @@ namespace mRemoteNG.UI.Window case NotifyCollectionChangedAction.Add: var childList = senderAsContainerInfo?.Children; ConnectionInfo otherChild = null; - if (childList?.Count > 0) + if (childList?.Count > 1) try { otherChild = childList.First(child => !args.NewItems.Contains(child)); } catch { } RefreshTreeObject(otherChild ?? senderAsContainerInfo); break; From 48bd1854e45c25d2696b0cfc693eb655ce9e1227 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 09:55:31 -0600 Subject: [PATCH 315/338] Resolved saving to an Sql DB. Had to correclty arrange the column schema, add the ID column and make it autoincrement, and change a few data types. --- .../Config/Serializers/DataTableSerializer.cs | 163 +++++++++--------- 1 file changed, 81 insertions(+), 82 deletions(-) diff --git a/mRemoteV1/Config/Serializers/DataTableSerializer.cs b/mRemoteV1/Config/Serializers/DataTableSerializer.cs index 407556783..f69f5cb82 100644 --- a/mRemoteV1/Config/Serializers/DataTableSerializer.cs +++ b/mRemoteV1/Config/Serializers/DataTableSerializer.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Data.SqlTypes; using System.Linq; using mRemoteNG.Connection; using mRemoteNG.Container; @@ -40,44 +41,44 @@ namespace mRemoteNG.Config.Serializers private void CreateSchema() { + _dataTable.Columns.Add("ID", typeof(int)); + _dataTable.Columns[0].AutoIncrement = true; + _dataTable.Columns.Add("ConstantID", typeof(string)); + _dataTable.Columns.Add("PositionID", typeof(int)); + _dataTable.Columns.Add("ParentID", typeof(string)); + _dataTable.Columns.Add("LastChange", typeof(SqlDateTime)); _dataTable.Columns.Add("Name", typeof(string)); _dataTable.Columns.Add("Type", typeof(string)); - _dataTable.Columns.Add("ConstantID", typeof(string)); - _dataTable.Columns.Add("ParentID", typeof(string)); - _dataTable.Columns.Add("PositionID", typeof(int)); - _dataTable.Columns.Add("LastChange", typeof(DateTime)); - _dataTable.Columns.Add("Expanded", typeof(int)); + _dataTable.Columns.Add("Expanded", typeof(bool)); _dataTable.Columns.Add("Description", typeof(string)); _dataTable.Columns.Add("Icon", typeof(string)); _dataTable.Columns.Add("Panel", typeof(string)); _dataTable.Columns.Add("Username", typeof(string)); - _dataTable.Columns.Add("Domain", typeof(string)); + _dataTable.Columns.Add("DomainName", typeof(string)); _dataTable.Columns.Add("Password", typeof(string)); _dataTable.Columns.Add("Hostname", typeof(string)); _dataTable.Columns.Add("Protocol", typeof(string)); _dataTable.Columns.Add("PuttySession", typeof(string)); _dataTable.Columns.Add("Port", typeof(int)); - _dataTable.Columns.Add("ConnectToConsole", typeof(int)); - _dataTable.Columns.Add("UseCredSsp", typeof(int)); + _dataTable.Columns.Add("ConnectToConsole", typeof(bool)); + _dataTable.Columns.Add("UseCredSsp", typeof(bool)); _dataTable.Columns.Add("RenderingEngine", typeof(string)); _dataTable.Columns.Add("ICAEncryptionStrength", typeof(string)); _dataTable.Columns.Add("RDPAuthenticationLevel", typeof(string)); - _dataTable.Columns.Add("LoadBalanceInfo", typeof(string)); _dataTable.Columns.Add("Colors", typeof(string)); _dataTable.Columns.Add("Resolution", typeof(string)); - _dataTable.Columns.Add("AutomaticResize", typeof(int)); - _dataTable.Columns.Add("DisplayWallpaper", typeof(int)); - _dataTable.Columns.Add("DisplayThemes", typeof(int)); - _dataTable.Columns.Add("EnableFontSmoothing", typeof(int)); - _dataTable.Columns.Add("EnableDesktopComposition", typeof(int)); - _dataTable.Columns.Add("CacheBitmaps", typeof(int)); - _dataTable.Columns.Add("RedirectDiskDrives", typeof(int)); - _dataTable.Columns.Add("RedirectPorts", typeof(int)); - _dataTable.Columns.Add("RedirectPrinters", typeof(int)); - _dataTable.Columns.Add("RedirectSmartCards", typeof(int)); - _dataTable.Columns.Add("RedirectSound", typeof(int)); - _dataTable.Columns.Add("RedirectKeys", typeof(int)); - _dataTable.Columns.Add("Connected", typeof(int)); + _dataTable.Columns.Add("DisplayWallpaper", typeof(bool)); + _dataTable.Columns.Add("DisplayThemes", typeof(bool)); + _dataTable.Columns.Add("EnableFontSmoothing", typeof(bool)); + _dataTable.Columns.Add("EnableDesktopComposition", typeof(bool)); + _dataTable.Columns.Add("CacheBitmaps", typeof(bool)); + _dataTable.Columns.Add("RedirectDiskDrives", typeof(bool)); + _dataTable.Columns.Add("RedirectPorts", typeof(bool)); + _dataTable.Columns.Add("RedirectPrinters", typeof(bool)); + _dataTable.Columns.Add("RedirectSmartCards", typeof(bool)); + _dataTable.Columns.Add("RedirectSound", typeof(string)); + _dataTable.Columns.Add("RedirectKeys", typeof(bool)); + _dataTable.Columns.Add("Connected", typeof(bool)); _dataTable.Columns.Add("PreExtApp", typeof(string)); _dataTable.Columns.Add("PostExtApp", typeof(string)); _dataTable.Columns.Add("MacAddress", typeof(string)); @@ -93,64 +94,66 @@ namespace mRemoteNG.Config.Serializers _dataTable.Columns.Add("VNCProxyPassword", typeof(string)); _dataTable.Columns.Add("VNCColors", typeof(string)); _dataTable.Columns.Add("VNCSmartSizeMode", typeof(string)); - _dataTable.Columns.Add("VNCViewOnly", typeof(int)); + _dataTable.Columns.Add("VNCViewOnly", typeof(bool)); _dataTable.Columns.Add("RDGatewayUsageMethod", typeof(string)); _dataTable.Columns.Add("RDGatewayHostname", typeof(string)); - _dataTable.Columns.Add("RDGatewayUseConnectionCredentials"); + _dataTable.Columns.Add("RDGatewayUseConnectionCredentials", typeof(string)); _dataTable.Columns.Add("RDGatewayUsername", typeof(string)); _dataTable.Columns.Add("RDGatewayPassword", typeof(string)); _dataTable.Columns.Add("RDGatewayDomain", typeof(string)); - _dataTable.Columns.Add("InheritCacheBitmaps", typeof(int)); - _dataTable.Columns.Add("InheritColors", typeof(int)); - _dataTable.Columns.Add("InheritDescription", typeof(int)); - _dataTable.Columns.Add("InheritDisplayThemes", typeof(int)); - _dataTable.Columns.Add("InheritDisplayWallpaper", typeof(int)); - _dataTable.Columns.Add("InheritEnableFontSmoothing", typeof(int)); - _dataTable.Columns.Add("InheritEnableDesktopComposition", typeof(int)); - _dataTable.Columns.Add("InheritDomain", typeof(int)); - _dataTable.Columns.Add("InheritIcon", typeof(int)); - _dataTable.Columns.Add("InheritPanel", typeof(int)); - _dataTable.Columns.Add("InheritPassword", typeof(int)); - _dataTable.Columns.Add("InheritPort", typeof(int)); - _dataTable.Columns.Add("InheritProtocol", typeof(int)); - _dataTable.Columns.Add("InheritPuttySession", typeof(int)); - _dataTable.Columns.Add("InheritRedirectDiskDrives", typeof(int)); - _dataTable.Columns.Add("InheritRedirectKeys", typeof(int)); - _dataTable.Columns.Add("InheritRedirectPorts", typeof(int)); - _dataTable.Columns.Add("InheritRedirectPrinters", typeof(int)); - _dataTable.Columns.Add("InheritRedirectSmartCards", typeof(int)); - _dataTable.Columns.Add("InheritRedirectSound", typeof(int)); - _dataTable.Columns.Add("InheritResolution", typeof(int)); - _dataTable.Columns.Add("InheritAutomaticResize", typeof(int)); - _dataTable.Columns.Add("InheritUseConsoleSession", typeof(int)); - _dataTable.Columns.Add("InheritUseCredSsp", typeof(int)); - _dataTable.Columns.Add("InheritRenderingEngine", typeof(int)); - _dataTable.Columns.Add("InheritUsername", typeof(int)); - _dataTable.Columns.Add("InheritICAEncryptionStrength", typeof(int)); - _dataTable.Columns.Add("InheritRDPAuthenticationLevel", typeof(int)); - _dataTable.Columns.Add("InheritLoadBalanceInfo", typeof(int)); - _dataTable.Columns.Add("InheritPreExtApp", typeof(int)); - _dataTable.Columns.Add("InheritPostExtApp", typeof(int)); - _dataTable.Columns.Add("InheritMacAddress", typeof(int)); - _dataTable.Columns.Add("InheritUserField", typeof(int)); - _dataTable.Columns.Add("InheritExtApp", typeof(int)); - _dataTable.Columns.Add("InheritVNCCompression", typeof(int)); - _dataTable.Columns.Add("InheritVNCEncoding", typeof(int)); - _dataTable.Columns.Add("InheritVNCAuthMode", typeof(int)); - _dataTable.Columns.Add("InheritVNCProxyType", typeof(int)); - _dataTable.Columns.Add("InheritVNCProxyIP", typeof(int)); - _dataTable.Columns.Add("InheritVNCProxyPort", typeof(int)); - _dataTable.Columns.Add("InheritVNCProxyUsername", typeof(int)); - _dataTable.Columns.Add("InheritVNCProxyPassword", typeof(int)); - _dataTable.Columns.Add("InheritVNCColors", typeof(int)); - _dataTable.Columns.Add("InheritVNCSmartSizeMode", typeof(int)); - _dataTable.Columns.Add("InheritVNCViewOnly", typeof(int)); - _dataTable.Columns.Add("InheritRDGatewayUsageMethod", typeof(int)); - _dataTable.Columns.Add("InheritRDGatewayHostname", typeof(int)); - _dataTable.Columns.Add("InheritRDGatewayUseConnectionCredentials", typeof(int)); - _dataTable.Columns.Add("InheritRDGatewayUsername", typeof(int)); - _dataTable.Columns.Add("InheritRDGatewayPassword", typeof(int)); - _dataTable.Columns.Add("InheritRDGatewayDomain", typeof(int)); + _dataTable.Columns.Add("InheritCacheBitmaps", typeof(bool)); + _dataTable.Columns.Add("InheritColors", typeof(bool)); + _dataTable.Columns.Add("InheritDescription", typeof(bool)); + _dataTable.Columns.Add("InheritDisplayThemes", typeof(bool)); + _dataTable.Columns.Add("InheritDisplayWallpaper", typeof(bool)); + _dataTable.Columns.Add("InheritEnableFontSmoothing", typeof(bool)); + _dataTable.Columns.Add("InheritEnableDesktopComposition", typeof(bool)); + _dataTable.Columns.Add("InheritDomain", typeof(bool)); + _dataTable.Columns.Add("InheritIcon", typeof(bool)); + _dataTable.Columns.Add("InheritPanel", typeof(bool)); + _dataTable.Columns.Add("InheritPassword", typeof(bool)); + _dataTable.Columns.Add("InheritPort", typeof(bool)); + _dataTable.Columns.Add("InheritProtocol", typeof(bool)); + _dataTable.Columns.Add("InheritPuttySession", typeof(bool)); + _dataTable.Columns.Add("InheritRedirectDiskDrives", typeof(bool)); + _dataTable.Columns.Add("InheritRedirectKeys", typeof(bool)); + _dataTable.Columns.Add("InheritRedirectPorts", typeof(bool)); + _dataTable.Columns.Add("InheritRedirectPrinters", typeof(bool)); + _dataTable.Columns.Add("InheritRedirectSmartCards", typeof(bool)); + _dataTable.Columns.Add("InheritRedirectSound", typeof(bool)); + _dataTable.Columns.Add("InheritResolution", typeof(bool)); + _dataTable.Columns.Add("InheritUseConsoleSession", typeof(bool)); + _dataTable.Columns.Add("InheritUseCredSsp", typeof(bool)); + _dataTable.Columns.Add("InheritRenderingEngine", typeof(bool)); + _dataTable.Columns.Add("InheritICAEncryptionStrength", typeof(bool)); + _dataTable.Columns.Add("InheritRDPAuthenticationLevel", typeof(bool)); + _dataTable.Columns.Add("InheritUsername", typeof(bool)); + _dataTable.Columns.Add("InheritPreExtApp", typeof(bool)); + _dataTable.Columns.Add("InheritPostExtApp", typeof(bool)); + _dataTable.Columns.Add("InheritMacAddress", typeof(bool)); + _dataTable.Columns.Add("InheritUserField", typeof(bool)); + _dataTable.Columns.Add("InheritExtApp", typeof(bool)); + _dataTable.Columns.Add("InheritVNCCompression", typeof(bool)); + _dataTable.Columns.Add("InheritVNCEncoding", typeof(bool)); + _dataTable.Columns.Add("InheritVNCAuthMode", typeof(bool)); + _dataTable.Columns.Add("InheritVNCProxyType", typeof(bool)); + _dataTable.Columns.Add("InheritVNCProxyIP", typeof(bool)); + _dataTable.Columns.Add("InheritVNCProxyPort", typeof(bool)); + _dataTable.Columns.Add("InheritVNCProxyUsername", typeof(bool)); + _dataTable.Columns.Add("InheritVNCProxyPassword", typeof(bool)); + _dataTable.Columns.Add("InheritVNCColors", typeof(bool)); + _dataTable.Columns.Add("InheritVNCSmartSizeMode", typeof(bool)); + _dataTable.Columns.Add("InheritVNCViewOnly", typeof(bool)); + _dataTable.Columns.Add("InheritRDGatewayUsageMethod", typeof(bool)); + _dataTable.Columns.Add("InheritRDGatewayHostname", typeof(bool)); + _dataTable.Columns.Add("InheritRDGatewayUseConnectionCredentials", typeof(bool)); + _dataTable.Columns.Add("InheritRDGatewayUsername", typeof(bool)); + _dataTable.Columns.Add("InheritRDGatewayPassword", typeof(bool)); + _dataTable.Columns.Add("InheritRDGatewayDomain", typeof(bool)); + _dataTable.Columns.Add("LoadBalanceInfo", typeof(string)); + _dataTable.Columns.Add("AutomaticResize", typeof(bool)); + _dataTable.Columns.Add("InheritLoadBalanceInfo", typeof(bool)); + _dataTable.Columns.Add("InheritAutomaticResize", typeof(bool)); } private void SetPrimaryKey() @@ -172,18 +175,19 @@ namespace mRemoteNG.Config.Serializers { _currentNodeIndex++; var dataRow = _dataTable.NewRow(); + dataRow["ID"] = DBNull.Value; dataRow["Name"] = connectionInfo.Name; dataRow["Type"] = connectionInfo.GetTreeNodeType().ToString(); dataRow["ConstantID"] = connectionInfo.ConstantID; dataRow["ParentID"] = connectionInfo.Parent.ConstantID; dataRow["PositionID"] = _currentNodeIndex; - dataRow["LastChange"] = FormateDateForDatabase(DateTime.Now); + dataRow["LastChange"] = (SqlDateTime)DateTime.Now; dataRow["Expanded"] = connectionInfo is ContainerInfo ? ((ContainerInfo)connectionInfo).IsExpanded : false; dataRow["Description"] = connectionInfo.Description; dataRow["Icon"] = connectionInfo.Icon; dataRow["Panel"] = connectionInfo.Panel; dataRow["Username"] = _saveSecurity.Username ? connectionInfo.Username : ""; - dataRow["Domain"] = _saveSecurity.Domain ? connectionInfo.Domain : ""; + dataRow["DomainName"] = _saveSecurity.Domain ? connectionInfo.Domain : ""; dataRow["Password"] = _saveSecurity.Password ? connectionInfo.Password : ""; dataRow["Hostname"] = connectionInfo.Hostname; dataRow["Protocol"] = connectionInfo.Protocol; @@ -342,10 +346,5 @@ namespace mRemoteNG.Config.Serializers } _dataTable.Rows.Add(dataRow); } - - private string FormateDateForDatabase(DateTime dateTime) - { - return $"{dateTime:yyyy-MM-dd HH:mm:ss}"; - } } } \ No newline at end of file From ddd94da47bb90590b8900ee7ae7683a7d408df4e Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 10:04:58 -0600 Subject: [PATCH 316/338] Code cleanup --- .../Multiuser/SqlConnectionsUpdateChecker.cs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs index bd2a50aa5..eb9f26456 100644 --- a/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs @@ -28,7 +28,6 @@ namespace mRemoteNG.Config.Connections { RaiseUpdateCheckStartedEvent(); ConnectToSqlDb(); - ExecuteQuery(); var updateIsAvailable = DatabaseIsMoreUpToDateThanUs(); if (updateIsAvailable) RaiseConnectionsUpdateAvailableEvent(); @@ -55,18 +54,6 @@ namespace mRemoteNG.Config.Connections } } - private void ExecuteQuery() - { - try - { - - } - catch (Exception ex) - { - Runtime.MessageCollector.AddMessage(MessageClass.WarningMsg, "Error executing Sql query to get updates from the DB." + Environment.NewLine + ex.Message, true); - } - } - private bool DatabaseIsMoreUpToDateThanUs() { return GetLastUpdateTimeFromDbResponse() > _lastUpdateTime; From b474a67ef4dd2860859d54dc4a392248cd7629c2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 10:08:48 -0600 Subject: [PATCH 317/338] Fixed a few unit tests --- .../Config/Serializers/DataTableSerializerTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs b/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs index a790deaaa..6fff1b423 100644 --- a/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs +++ b/mRemoteNGTests/Config/Serializers/DataTableSerializerTests.cs @@ -50,7 +50,7 @@ namespace mRemoteNGTests.Config.Serializers var model = CreateConnectionTreeModel(); _saveFilter.Domain = true; var dataTable = _dataTableSerializer.Serialize(model); - Assert.That(dataTable.Rows[0]["Domain"], Is.Not.EqualTo("")); + Assert.That(dataTable.Rows[0]["DomainName"], Is.Not.EqualTo("")); } [Test] @@ -88,7 +88,7 @@ namespace mRemoteNGTests.Config.Serializers var model = CreateConnectionTreeModel(); _saveFilter.Domain = false; var dataTable = _dataTableSerializer.Serialize(model); - Assert.That(dataTable.Rows[0]["Domain"], Is.EqualTo("")); + Assert.That(dataTable.Rows[0]["DomainName"], Is.EqualTo("")); } [Test] @@ -106,7 +106,7 @@ namespace mRemoteNGTests.Config.Serializers var model = CreateConnectionTreeModel(); _saveFilter.Inheritance = false; var dataTable = _dataTableSerializer.Serialize(model); - Assert.That(dataTable.Rows[0]["InheritUsername"], Is.EqualTo("")); + Assert.That(dataTable.Rows[0]["InheritUsername"], Is.False); } From 2df93bea24b7613f49ad9bd5a2b269a7bee29971 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 10:28:08 -0600 Subject: [PATCH 318/338] Reduced some complexity by merging the PeriodicConnectionsUpdateChecker with the RemoteConnectionsSyncronizer since they did nearly the same thing. --- .../PeriodicConnectionsUpdateChecker.cs | 74 ------------------- .../Multiuser/RemoteConnectionsSyncronizer.cs | 47 ++++++++++-- mRemoteV1/mRemoteV1.csproj | 1 - 3 files changed, 40 insertions(+), 82 deletions(-) delete mode 100644 mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs diff --git a/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs deleted file mode 100644 index 633bc7959..000000000 --- a/mRemoteV1/Config/Connections/Multiuser/PeriodicConnectionsUpdateChecker.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Diagnostics; -using System.Timers; - - -namespace mRemoteNG.Config.Connections -{ - public class PeriodicConnectionsUpdateChecker : IConnectionsUpdateChecker - { - private readonly Timer _updateTimer; - private readonly IConnectionsUpdateChecker _updateChecker; - - public double TimerIntervalInMilliseconds => _updateTimer.Interval; - - - public PeriodicConnectionsUpdateChecker(IConnectionsUpdateChecker updateChecker) - { - _updateTimer = new Timer(3000); - _updateChecker = updateChecker; - _updateTimer.Elapsed += (sender, args) => _updateChecker.IsUpdateAvailableAsync(); - _updateTimer.Elapsed += (sender, args) => tickdebug(); - _updateChecker.UpdateCheckStarted += UpdateCheckerOnUpdateCheckStarted; - _updateChecker.UpdateCheckFinished += UpdateCheckerOnUpdateCheckFinished; - _updateChecker.ConnectionsUpdateAvailable += (sender, args) => ConnectionsUpdateAvailable?.Invoke(sender, args); - } - - private void tickdebug() - { - Debug.WriteLine("update_tick"); - } - - public void Enable() => _updateTimer.Start(); - - public void Disable() => _updateTimer.Stop(); - - public bool IsUpdateAvailable() => _updateChecker.IsUpdateAvailable(); - - public void IsUpdateAvailableAsync() => _updateChecker.IsUpdateAvailableAsync(); - - private void UpdateCheckerOnUpdateCheckStarted(object sender, EventArgs eventArgs) - { - _updateTimer.Stop(); - UpdateCheckStarted?.Invoke(sender, eventArgs); - } - - private void UpdateCheckerOnUpdateCheckFinished(object sender, ConnectionsUpdateCheckFinishedEventArgs eventArgs) - { - _updateTimer.Start(); - UpdateCheckFinished?.Invoke(sender, eventArgs); - } - - public event EventHandler UpdateCheckStarted; - public event UpdateCheckFinishedEventHandler UpdateCheckFinished; - public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; - - ~PeriodicConnectionsUpdateChecker() - { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool itIsSafeToAlsoFreeManagedObjects) - { - if (!itIsSafeToAlsoFreeManagedObjects) return; - _updateTimer.Dispose(); - _updateChecker.Dispose(); - } - } -} \ No newline at end of file diff --git a/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs b/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs index d957061e8..44e720cce 100644 --- a/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs +++ b/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs @@ -1,21 +1,35 @@ using System; +using System.Timers; using mRemoteNG.App; namespace mRemoteNG.Config.Connections { - public class RemoteConnectionsSyncronizer : IDisposable + public class RemoteConnectionsSyncronizer : IConnectionsUpdateChecker { - private readonly PeriodicConnectionsUpdateChecker _periodicConnectionsUpdateChecker; + private readonly Timer _updateTimer; + private readonly IConnectionsUpdateChecker _updateChecker; private readonly ConnectionsLoader _connectionsLoader; private readonly ConnectionsSaver _connectionsSaver; + public double TimerIntervalInMilliseconds => _updateTimer.Interval; + public RemoteConnectionsSyncronizer(IConnectionsUpdateChecker updateChecker) { - _periodicConnectionsUpdateChecker = new PeriodicConnectionsUpdateChecker(updateChecker); + _updateChecker = updateChecker; + _updateTimer = new Timer(3000); _connectionsLoader = new ConnectionsLoader { UseDatabase = mRemoteNG.Settings.Default.UseSQLServer }; _connectionsSaver = new ConnectionsSaver { SaveFormat = ConnectionsSaver.Format.SQL }; - _periodicConnectionsUpdateChecker.ConnectionsUpdateAvailable += Load; + SetEventListeners(); + } + + private void SetEventListeners() + { + _updateChecker.UpdateCheckStarted += OnUpdateCheckStarted; + _updateChecker.UpdateCheckFinished += OnUpdateCheckFinished; + _updateChecker.ConnectionsUpdateAvailable += (sender, args) => ConnectionsUpdateAvailable?.Invoke(sender, args); + _updateTimer.Elapsed += (sender, args) => _updateChecker.IsUpdateAvailableAsync(); + ConnectionsUpdateAvailable += Load; } public void Load() @@ -34,10 +48,28 @@ namespace mRemoteNG.Config.Connections _connectionsSaver.SaveConnections(); } - public void Enable() => _periodicConnectionsUpdateChecker.Enable(); - public void Disable() => _periodicConnectionsUpdateChecker.Disable(); + public void Enable() => _updateTimer.Start(); + public void Disable() => _updateTimer.Stop(); + public bool IsUpdateAvailable() => _updateChecker.IsUpdateAvailable(); + public void IsUpdateAvailableAsync() => _updateChecker.IsUpdateAvailableAsync(); + private void OnUpdateCheckStarted(object sender, EventArgs eventArgs) + { + _updateTimer.Stop(); + UpdateCheckStarted?.Invoke(sender, eventArgs); + } + + private void OnUpdateCheckFinished(object sender, ConnectionsUpdateCheckFinishedEventArgs eventArgs) + { + _updateTimer.Start(); + UpdateCheckFinished?.Invoke(sender, eventArgs); + } + + public event EventHandler UpdateCheckStarted; + public event UpdateCheckFinishedEventHandler UpdateCheckFinished; + public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; + ~RemoteConnectionsSyncronizer() { Dispose(false); @@ -50,7 +82,8 @@ namespace mRemoteNG.Config.Connections private void Dispose(bool itIsSafeToAlsoFreeManagedObjects) { if (!itIsSafeToAlsoFreeManagedObjects) return; - _periodicConnectionsUpdateChecker.Dispose(); + _updateTimer.Dispose(); + _updateChecker.Dispose(); } } } \ No newline at end of file diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 76c3b84dc..95aa4f419 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -153,7 +153,6 @@ - From d6bd7e0886507b102f91f0927b9cf77e86e036d2 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 10:36:58 -0600 Subject: [PATCH 319/338] Resolved bug where rearranging nodes by drag-n-drop would not save changes --- mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index 4bee15e02..a9c513295 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Windows.Forms; using BrightIdeasSoftware; +using mRemoteNG.App; using mRemoteNG.Connection; using mRemoteNG.Container; using mRemoteNG.Root.PuttySessions; @@ -26,6 +27,7 @@ namespace mRemoteNG.Tree var dropSource = (ConnectionInfo)e.SourceModels[0]; DropModel(dropSource, dropTarget, e.DropTargetLocation); e.Handled = true; + Runtime.SaveConnectionsBG(); } public void DropModel(ConnectionInfo dropSource, ConnectionInfo dropTarget, DropTargetLocation dropTargetLocation) From 418f023780de4251ed5fb80af84ae6b193f6bed7 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 12:02:48 -0600 Subject: [PATCH 320/338] Removed unused code --- mRemoteV1/App/Runtime.cs | 1 - mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index fed17e6db..7e02bb7ad 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -33,7 +33,6 @@ namespace mRemoteNG.App public static bool IsConnectionsFileLoaded { get; set; } public static RemoteConnectionsSyncronizer RemoteConnectionsSyncronizer { get; set; } public static DateTime LastSqlUpdate { get; set; } - public static string LastSelected { get; set; } public static ArrayList ExternalTools { get; set; } = new ArrayList(); public static ConnectionTreeModel ConnectionTreeModel { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index f5babf292..42bf4968e 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -407,7 +407,6 @@ namespace mRemoteNG.UI.Window try { Windows.ConfigForm.SetPropertyGridObject(SelectedNode); - Runtime.LastSelected = (SelectedNode)?.ConstantID; } catch (Exception ex) { From 140723108e981d8a43be5f2fbad27cfbbc7db9af Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 12:05:07 -0600 Subject: [PATCH 321/338] Resolved bug where the RemoteConnectionsSyncronizer wouldn't get disposed/deferenced when switching from using Sql to not using it --- mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs index 749cacbea..f1edc0ba0 100644 --- a/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs +++ b/mRemoteV1/UI/Forms/OptionsPages/SqlServerPage.cs @@ -65,9 +65,16 @@ namespace mRemoteNG.UI.Forms.OptionsPages Runtime.RemoteConnectionsSyncronizer?.Dispose(); frmMain.Default.AreWeUsingSqlServerForSavingConnections = Settings.Default.UseSQLServer; - if (!Settings.Default.UseSQLServer) return; - Runtime.RemoteConnectionsSyncronizer = new RemoteConnectionsSyncronizer(new SqlConnectionsUpdateChecker()); - Runtime.RemoteConnectionsSyncronizer.Enable(); + if (Settings.Default.UseSQLServer) + { + Runtime.RemoteConnectionsSyncronizer = new RemoteConnectionsSyncronizer(new SqlConnectionsUpdateChecker()); + Runtime.RemoteConnectionsSyncronizer.Enable(); + } + else + { + Runtime.RemoteConnectionsSyncronizer?.Dispose(); + Runtime.RemoteConnectionsSyncronizer = null; + } } private void chkUseSQLServer_CheckedChanged(object sender, EventArgs e) From 426c07ce751437f6009a65319a83a52b925f6149 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 12:10:56 -0600 Subject: [PATCH 322/338] Code cleanup of Runtime.cs --- mRemoteV1/App/Import.cs | 6 +-- mRemoteV1/App/Runtime.cs | 51 ++++++++----------- .../Tree/ConnectionTreeDragAndDropHandler.cs | 2 +- mRemoteV1/UI/Forms/frmMain.cs | 10 ++-- mRemoteV1/UI/Window/ConfigWindow.cs | 4 +- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 20 ++++---- 6 files changed, 43 insertions(+), 50 deletions(-) diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index fbd563bec..2638508a2 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -78,7 +78,7 @@ namespace mRemoteNG.App } } - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } } catch (Exception ex) @@ -93,7 +93,7 @@ namespace mRemoteNG.App { var importer = new ActiveDirectoryImporter(); importer.Import(ldapPath, importDestinationContainer); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } catch (Exception ex) { @@ -107,7 +107,7 @@ namespace mRemoteNG.App { var importer = new PortScanImporter(protocol); importer.Import(hosts, importDestinationContainer); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } catch (Exception ex) { diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 7e02bb7ad..1134cfd9e 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -240,7 +240,7 @@ namespace mRemoteNG.App } } - public static void LoadConnectionsBG() + public static void LoadConnectionsAsync() { _withDialog = false; _loadUpdate = true; @@ -342,7 +342,7 @@ namespace mRemoteNG.App { MessageBox.Show(frmMain.Default, string.Format(Language.strErrorStartupConnectionFileLoad, Environment.NewLine, Application.ProductName, GetStartupConnectionFileName(), MiscTools.GetExceptionMessageRecursive(ex)), - "Could not load startup file.", MessageBoxButtons.OK, MessageBoxIcon.Error); + @"Could not load startup file.", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } } @@ -421,31 +421,31 @@ namespace mRemoteNG.App } } - public static void SaveConnectionsBG() + public static void SaveConnectionsAsync() { _saveUpdate = true; - Thread t = new Thread(SaveConnectionsBGd); + var t = new Thread(SaveConnectionsBGd); t.SetApartmentState(ApartmentState.STA); t.Start(); } private static bool _saveUpdate; - private static object _saveLock = new object(); + private static readonly object SaveLock = new object(); private static void SaveConnectionsBGd() { - Monitor.Enter(_saveLock); + Monitor.Enter(SaveLock); SaveConnections(_saveUpdate); - Monitor.Exit(_saveLock); + Monitor.Exit(SaveLock); } - public static void SaveConnections(bool Update = false) + public static void SaveConnections(bool update = false) { //if (!IsConnectionsFileLoaded) // return; try { - if (Update && Settings.Default.UseSQLServer == false) + if (update && Settings.Default.UseSQLServer == false) return; RemoteConnectionsSyncronizer?.Disable(); @@ -456,7 +456,7 @@ namespace mRemoteNG.App connectionsSaver.ConnectionFileName = GetStartupConnectionFileName(); connectionsSaver.Export = false; - connectionsSaver.SaveSecurity = new Security.Save(false); + connectionsSaver.SaveSecurity = new Security.Save(); connectionsSaver.ConnectionTreeModel = ConnectionTreeModel; if (Settings.Default.UseSQLServer) @@ -578,11 +578,11 @@ namespace mRemoteNG.App #endregion #region External Apps - public static ExternalTool GetExtAppByName(string Name) + public static ExternalTool GetExtAppByName(string name) { foreach (ExternalTool extA in ExternalTools) { - if (extA.DisplayName == Name) + if (extA.DisplayName == name) return extA; } return null; @@ -590,21 +590,14 @@ namespace mRemoteNG.App #endregion #region Misc - private static void GoToURL(string URL) + private static void GoToUrl(string url) { - ConnectionInfo connectionInfo = new ConnectionInfo(); + var connectionInfo = new ConnectionInfo(); connectionInfo.CopyFrom(DefaultConnectionInfo.Instance); connectionInfo.Name = ""; - connectionInfo.Hostname = URL; - if (URL.StartsWith("https:")) - { - connectionInfo.Protocol = ProtocolType.HTTPS; - } - else - { - connectionInfo.Protocol = ProtocolType.HTTP; - } + connectionInfo.Hostname = url; + connectionInfo.Protocol = url.StartsWith("https:") ? ProtocolType.HTTPS : ProtocolType.HTTP; connectionInfo.SetDefaultPort(); connectionInfo.IsQuickConnect = true; ConnectionInitiator.OpenConnection(connectionInfo, ConnectionInfo.Force.DoNotJump); @@ -612,30 +605,30 @@ namespace mRemoteNG.App public static void GoToWebsite() { - GoToURL(GeneralAppInfo.UrlHome); + GoToUrl(GeneralAppInfo.UrlHome); } public static void GoToDonate() { - GoToURL(GeneralAppInfo.UrlDonate); + GoToUrl(GeneralAppInfo.UrlDonate); } public static void GoToForum() { - GoToURL(GeneralAppInfo.UrlForum); + GoToUrl(GeneralAppInfo.UrlForum); } public static void GoToBugs() { - GoToURL(GeneralAppInfo.UrlBugs); + GoToUrl(GeneralAppInfo.UrlBugs); } // Override the font of all controls in a container with the default font based on the OS version public static void FontOverride(Control ctlParent) { - foreach (Control tempLoopVar_ctlChild in ctlParent.Controls) + foreach (Control tempLoopVarCtlChild in ctlParent.Controls) { - var ctlChild = tempLoopVar_ctlChild; + var ctlChild = tempLoopVarCtlChild; ctlChild.Font = new Font(SystemFonts.MessageBoxFont.Name, ctlChild.Font.Size, ctlChild.Font.Style, ctlChild.Font.Unit, ctlChild.Font.GdiCharSet); if (ctlChild.Controls.Count > 0) { diff --git a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs index a9c513295..2a8e865e9 100644 --- a/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs +++ b/mRemoteV1/Tree/ConnectionTreeDragAndDropHandler.cs @@ -27,7 +27,7 @@ namespace mRemoteNG.Tree var dropSource = (ConnectionInfo)e.SourceModels[0]; DropModel(dropSource, dropTarget, e.DropTargetLocation); e.Handled = true; - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } public void DropModel(ConnectionInfo dropSource, ConnectionInfo dropTarget, DropTargetLocation dropTargetLocation) diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index e6d8fab66..dca54386f 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -529,13 +529,13 @@ namespace mRemoteNG.UI.Forms private void mMenFileNewConnection_Click(object sender, EventArgs e) { ConnectionTreeWindow.AddConnection(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void mMenFileNewFolder_Click(object sender, EventArgs e) { ConnectionTreeWindow.AddFolder(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void mMenFileNew_Click(object sender, EventArgs e) @@ -580,19 +580,19 @@ namespace mRemoteNG.UI.Forms private void mMenFileDelete_Click(object sender, EventArgs e) { ConnectionTreeWindow.DeleteSelectedNode(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void mMenFileRename_Click(object sender, EventArgs e) { ConnectionTreeWindow.RenameSelectedNode(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void mMenFileDuplicate_Click(object sender, EventArgs e) { ConnectionTreeWindow.DuplicateSelectedNode(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void mMenReconnectAll_Click(object sender, EventArgs e) diff --git a/mRemoteV1/UI/Window/ConfigWindow.cs b/mRemoteV1/UI/Window/ConfigWindow.cs index 6f6a3c1e9..d0707e241 100644 --- a/mRemoteV1/UI/Window/ConfigWindow.cs +++ b/mRemoteV1/UI/Window/ConfigWindow.cs @@ -716,7 +716,7 @@ namespace mRemoteNG.UI.Window UpdateRootInfoNode(e); UpdateInheritanceNode(); ShowHideGridItems(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } catch (Exception ex) { @@ -1574,7 +1574,7 @@ namespace mRemoteNG.UI.Window connectionInfo.Icon = iconName; pGrid.Refresh(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } catch (Exception ex) { diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 42bf4968e..a080bf7e4 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -330,13 +330,13 @@ namespace mRemoteNG.UI.Window { var newNode = SelectedNode.Clone(); newNode.Parent.SetChildBelow(newNode, SelectedNode); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } public void RenameSelectedNode() { olvConnections.SelectedItem.BeginEdit(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } public void DeleteSelectedNode() @@ -344,7 +344,7 @@ namespace mRemoteNG.UI.Window if (SelectedNode is RootNodeInfo || SelectedNode is PuttySessionInfo) return; if (!UserConfirmsDeletion()) return; ConnectionTreeModel.DeleteNode(SelectedNode); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private bool UserConfirmsDeletion() @@ -394,7 +394,7 @@ namespace mRemoteNG.UI.Window _contextMenu.EnableShortcutKeys(); ConnectionTreeModel.RenameNode(SelectedNode, e.Label); Windows.ConfigForm.pGrid_SelectedObjectChanged(SelectedNode); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } catch (Exception ex) { @@ -503,13 +503,13 @@ namespace mRemoteNG.UI.Window private void cMenTreeAddConnection_Click(object sender, EventArgs e) { AddConnection(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void cMenTreeAddFolder_Click(object sender, EventArgs e) { AddFolder(); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void SortNodes(ListSortDirection sortDirection) @@ -519,25 +519,25 @@ namespace mRemoteNG.UI.Window selectedNodeAsContainer.Sort(sortDirection); else SelectedNode.Parent.Sort(sortDirection); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void SortNodesRecursive(ContainerInfo rootSortTarget, ListSortDirection sortDirection) { rootSortTarget.SortRecursive(sortDirection); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void cMenTreeMoveUp_Click(object sender, EventArgs e) { SelectedNode.Parent.PromoteChild(SelectedNode); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } private void cMenTreeMoveDown_Click(object sender, EventArgs e) { SelectedNode.Parent.DemoteChild(SelectedNode); - Runtime.SaveConnectionsBG(); + Runtime.SaveConnectionsAsync(); } #endregion From a932129d52783f841bc1c6a457761acec0ff855d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 12:12:15 -0600 Subject: [PATCH 323/338] Very minor code cleanup --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index a080bf7e4..c5aa147e7 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -203,7 +203,7 @@ namespace mRemoteNG.UI.Window _contextMenu.AddConnectionClicked += cMenTreeAddConnection_Click; _contextMenu.AddFolderClicked += cMenTreeAddFolder_Click; _contextMenu.SortAscendingClicked += (sender, args) => SortNodes(ListSortDirection.Ascending); - _contextMenu.SortDescendingClicked += (sender, args) => SortNodes(ListSortDirection.Descending); ; + _contextMenu.SortDescendingClicked += (sender, args) => SortNodes(ListSortDirection.Descending); _contextMenu.MoveUpClicked += cMenTreeMoveUp_Click; _contextMenu.MoveDownClicked += cMenTreeMoveDown_Click; _contextMenu.ExternalToolClicked += (sender, args) => StartExternalApp((ExternalTool)((ToolStripMenuItem)sender).Tag); From 05c46653a1ebbdad0356e6f145b83ab899ad2e8b Mon Sep 17 00:00:00 2001 From: David Sparer Date: Mon, 3 Oct 2016 15:02:16 -0600 Subject: [PATCH 324/338] Resolved crash bug when deserialization fails (for example when we cant decrypt the file). --- mRemoteV1/Config/Connections/ConnectionsLoader.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/Config/Connections/ConnectionsLoader.cs b/mRemoteV1/Config/Connections/ConnectionsLoader.cs index b474fa7e8..f0009f5d8 100644 --- a/mRemoteV1/Config/Connections/ConnectionsLoader.cs +++ b/mRemoteV1/Config/Connections/ConnectionsLoader.cs @@ -33,7 +33,10 @@ namespace mRemoteNG.Config.Connections var connectionTreeModel = deserializer.Deserialize(); - frmMain.Default.ConnectionsFileName = ConnectionFileName; + if (connectionTreeModel != null) + frmMain.Default.ConnectionsFileName = ConnectionFileName; + else + connectionTreeModel = new ConnectionTreeModel(); if (import) return connectionTreeModel; PuttySessionsManager.Instance.AddSessions(); From 40016f0d5228c26b402915907ee9ff3582ae30f1 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 08:28:39 -0600 Subject: [PATCH 325/338] Code cleanup --- mRemoteV1/UI/Window/ConfigWindow.cs | 44 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/mRemoteV1/UI/Window/ConfigWindow.cs b/mRemoteV1/UI/Window/ConfigWindow.cs index d0707e241..e5af9612f 100644 --- a/mRemoteV1/UI/Window/ConfigWindow.cs +++ b/mRemoteV1/UI/Window/ConfigWindow.cs @@ -726,6 +726,7 @@ namespace mRemoteNG.UI.Window private void UpdateConnectionInfoNode(PropertyValueChangedEventArgs e) { + Debug.WriteLine("update config"); var selectedGridObject = pGrid.SelectedObject as ConnectionInfo; if (selectedGridObject == null) return; if (e.ChangedItem.Label == Language.strPropertyNameProtocol) @@ -758,39 +759,36 @@ namespace mRemoteNG.UI.Window private void UpdateRootInfoNode(PropertyValueChangedEventArgs e) { - var o = pGrid.SelectedObject as RootNodeInfo; - if (o != null) + var rootInfo = pGrid.SelectedObject as RootNodeInfo; + if (rootInfo == null) return; + if (e.ChangedItem.PropertyDescriptor == null) return; + switch (e.ChangedItem.PropertyDescriptor.Name) { - var rootInfo = o; - if (e.ChangedItem.PropertyDescriptor != null) - switch (e.ChangedItem.PropertyDescriptor.Name) + case "Password": + if (rootInfo.Password) { - case "Password": - if (rootInfo.Password) - { - string passwordName; - if (Settings.Default.UseSQLServer) - passwordName = Language.strSQLServer.TrimEnd(':'); - else - passwordName = Path.GetFileName(Runtime.GetStartupConnectionFileName()); + string passwordName; + if (Settings.Default.UseSQLServer) + passwordName = Language.strSQLServer.TrimEnd(':'); + else + passwordName = Path.GetFileName(Runtime.GetStartupConnectionFileName()); - var password = MiscTools.PasswordDialog(passwordName); - if (password.Length == 0) - rootInfo.Password = false; - else - rootInfo.PasswordString = password.ConvertToUnsecureString(); - } - break; - case "Name": - break; + var password = MiscTools.PasswordDialog(passwordName); + if (password.Length == 0) + rootInfo.Password = false; + else + rootInfo.PasswordString = password.ConvertToUnsecureString(); } + break; + case "Name": + break; } } private void UpdateInheritanceNode() { if (!(pGrid.SelectedObject is DefaultConnectionInheritance)) return; - DefaultConnectionInheritance.Instance.SaveTo(Settings.Default, (a)=>"InhDefault"+a); + DefaultConnectionInheritance.Instance.SaveTo(Settings.Default, (a)=>"InhDefault"+a); } private void pGrid_PropertySortChanged(object sender, EventArgs e) From 960de69c2060c6fa46623e17d08283fb20bbc24f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 10:18:49 -0600 Subject: [PATCH 326/338] Added note regarding a minor efficiency bug to investigate --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index c5aa147e7..d3490f3b4 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -239,6 +239,7 @@ namespace mRemoteNG.UI.Window private void HandleCollectionPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { + //TODO for some reason property changed events are getting triggered twice for each changed property. should be just once. cant find source of duplication if (propertyChangedEventArgs.PropertyName != "Name") return; var senderAsConnectionInfo = sender as ConnectionInfo; if (senderAsConnectionInfo != null) From 7cee3c9050aecf7c2197a94e54bf789b78e5dda3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 11:31:15 -0600 Subject: [PATCH 327/338] Created another unit test for the legacy crypto provider --- .../Resources/legacyrijndael_ciphertext.txt | 1 + .../LegacyRijndaelCryptographyProviderTests.cs | 11 ++++++++++- mRemoteNGTests/mRemoteNGTests.csproj | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 mRemoteNGTests/Resources/legacyrijndael_ciphertext.txt diff --git a/mRemoteNGTests/Resources/legacyrijndael_ciphertext.txt b/mRemoteNGTests/Resources/legacyrijndael_ciphertext.txt new file mode 100644 index 000000000..3b9f5bece --- /dev/null +++ b/mRemoteNGTests/Resources/legacyrijndael_ciphertext.txt @@ -0,0 +1 @@ +RmV7zw/a7ZRRzZdcTkrLDgBfyEmeh8OFMgg2OKFJnwg= \ No newline at end of file diff --git a/mRemoteNGTests/Security/LegacyRijndaelCryptographyProviderTests.cs b/mRemoteNGTests/Security/LegacyRijndaelCryptographyProviderTests.cs index 6ae291199..f5ffbb604 100644 --- a/mRemoteNGTests/Security/LegacyRijndaelCryptographyProviderTests.cs +++ b/mRemoteNGTests/Security/LegacyRijndaelCryptographyProviderTests.cs @@ -1,17 +1,19 @@ using System.Security; using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; +using mRemoteNGTests.Properties; using NUnit.Framework; namespace mRemoteNGTests.Security { - [TestFixture()] public class LegacyRijndaelCryptographyProviderTests { private ICryptographyProvider _rijndaelCryptographyProvider; private SecureString _encryptionKey; private string _plainText; + private string _importedCipherText = Resources.legacyrijndael_ciphertext; + [SetUp] public void SetUp() @@ -55,5 +57,12 @@ namespace mRemoteNGTests.Security var cipherText2 = _rijndaelCryptographyProvider.Encrypt(_plainText, _encryptionKey); Assert.That(cipherText1, Is.Not.EqualTo(cipherText2)); } + + [Test] + public void DecryptingFromPreviousApplicationExecutionWorks() + { + var decryptedCipherText = _rijndaelCryptographyProvider.Decrypt(_importedCipherText, _encryptionKey); + Assert.That(decryptedCipherText, Is.EqualTo(_plainText)); + } } } \ No newline at end of file diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 9dc0a20e8..4ae677eb8 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -166,6 +166,7 @@ + From 5c92128b1767241d752d664071b24b38a98bc208 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 11:31:41 -0600 Subject: [PATCH 328/338] Resolves #140. The decryption key was not being saved and used for further decryption attempts. This fix is quick/temporary and should be redone to remove Runtime references. --- .../Properties/Resources.Designer.cs | 9 ++++++++ mRemoteNGTests/Properties/Resources.resx | 3 +++ mRemoteV1/App/Runtime.cs | 3 +++ .../Connections/ConnectionsDecryptor.cs | 22 +++++++++---------- .../Serializers/XmlConnectionsDeserializer.cs | 10 ++++----- 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/mRemoteNGTests/Properties/Resources.Designer.cs b/mRemoteNGTests/Properties/Resources.Designer.cs index 2048ae029..8413fd1a7 100644 --- a/mRemoteNGTests/Properties/Resources.Designer.cs +++ b/mRemoteNGTests/Properties/Resources.Designer.cs @@ -60,6 +60,15 @@ namespace mRemoteNGTests.Properties { } } + /// + /// Looks up a localized string similar to RmV7zw/a7ZRRzZdcTkrLDgBfyEmeh8OFMgg2OKFJnwg=. + /// + internal static string legacyrijndael_ciphertext { + get { + return ResourceManager.GetString("legacyrijndael_ciphertext", resourceCulture); + } + } + /// /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-16"?> ///<!-- ****************************************************************--> diff --git a/mRemoteNGTests/Properties/Resources.resx b/mRemoteNGTests/Properties/Resources.resx index 91106699f..28e47a0cf 100644 --- a/mRemoteNGTests/Properties/Resources.resx +++ b/mRemoteNGTests/Properties/Resources.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\legacyrijndael_ciphertext.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + ..\Resources\TestConfCons.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 diff --git a/mRemoteV1/App/Runtime.cs b/mRemoteV1/App/Runtime.cs index 1134cfd9e..c379c526c 100644 --- a/mRemoteV1/App/Runtime.cs +++ b/mRemoteV1/App/Runtime.cs @@ -11,9 +11,11 @@ using System.Collections; using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Security; using System.Threading; using System.Windows.Forms; using System.Xml; +using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.UI.Forms; using mRemoteNG.UI.Forms.Input; @@ -34,6 +36,7 @@ namespace mRemoteNG.App public static RemoteConnectionsSyncronizer RemoteConnectionsSyncronizer { get; set; } public static DateTime LastSqlUpdate { get; set; } public static ArrayList ExternalTools { get; set; } = new ArrayList(); + public static SecureString EncryptionKey { get; set; } = "mR3m".ConvertToSecureString(); public static ConnectionTreeModel ConnectionTreeModel { get { return Windows.TreeForm.ConnectionTreeModel; } diff --git a/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs b/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs index 22d1e397c..5419b0317 100644 --- a/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs +++ b/mRemoteV1/Config/Connections/ConnectionsDecryptor.cs @@ -1,5 +1,6 @@ using System; using System.Security; +using mRemoteNG.App; using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree.Root; @@ -10,7 +11,6 @@ namespace mRemoteNG.Config.Connections public class ConnectionsDecryptor { private readonly ICryptographyProvider _cryptographyProvider; - private SecureString _pW = "mR3m".ConvertToSecureString(); public ConnectionsDecryptor() { @@ -29,7 +29,7 @@ namespace mRemoteNG.Config.Connections try { - strDecr = cryptographyProvider.Decrypt(xml, _pW); + strDecr = cryptographyProvider.Decrypt(xml, Runtime.EncryptionKey); notDecr = strDecr == xml; } catch (Exception) @@ -41,7 +41,7 @@ namespace mRemoteNG.Config.Connections { if (Authenticate(xml, true)) { - strDecr = cryptographyProvider.Decrypt(xml, _pW); + strDecr = cryptographyProvider.Decrypt(xml, Runtime.EncryptionKey); notDecr = false; } @@ -58,7 +58,7 @@ namespace mRemoteNG.Config.Connections public bool ConnectionsFileIsAuthentic(string protectedString, RootNodeInfo rootInfo) { - var connectionsFileIsNotEncrypted = _cryptographyProvider.Decrypt(protectedString, _pW) == "ThisIsNotProtected"; + var connectionsFileIsNotEncrypted = _cryptographyProvider.Decrypt(protectedString, Runtime.EncryptionKey) == "ThisIsNotProtected"; return connectionsFileIsNotEncrypted || Authenticate(protectedString, false, rootInfo); } @@ -69,25 +69,25 @@ namespace mRemoteNG.Config.Connections if (compareToOriginalValue) { - while (_cryptographyProvider.Decrypt(value, _pW) == value) + while (_cryptographyProvider.Decrypt(value, Runtime.EncryptionKey) == value) { - _pW = Tools.MiscTools.PasswordDialog(passwordName, false); - if (_pW.Length == 0) + Runtime.EncryptionKey = Tools.MiscTools.PasswordDialog(passwordName, false); + if (Runtime.EncryptionKey.Length == 0) return false; } } else { - while (_cryptographyProvider.Decrypt(value, _pW) != "ThisIsProtected") + while (_cryptographyProvider.Decrypt(value, Runtime.EncryptionKey) != "ThisIsProtected") { - _pW = Tools.MiscTools.PasswordDialog(passwordName, false); - if (_pW.Length == 0) + Runtime.EncryptionKey = Tools.MiscTools.PasswordDialog(passwordName, false); + if (Runtime.EncryptionKey.Length == 0) return false; } if (rootInfo == null) return true; rootInfo.Password = true; - rootInfo.PasswordString = _pW.ConvertToUnsecureString(); + rootInfo.PasswordString = Runtime.EncryptionKey.ConvertToUnsecureString(); } return true; diff --git a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs index 9a80fd5a6..1e386bbde 100644 --- a/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs +++ b/mRemoteV1/Config/Serializers/XmlConnectionsDeserializer.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using System.Security; using System.Windows.Forms; using System.Xml; using mRemoteNG.App; @@ -13,20 +12,19 @@ using mRemoteNG.Connection.Protocol.RDP; using mRemoteNG.Connection.Protocol.VNC; using mRemoteNG.Container; using mRemoteNG.Messages; -using mRemoteNG.Security; using mRemoteNG.Security.SymmetricEncryption; using mRemoteNG.Tree; using mRemoteNG.Tree.Root; using mRemoteNG.UI.Forms; using mRemoteNG.UI.TaskDialog; + namespace mRemoteNG.Config.Serializers { public class XmlConnectionsDeserializer : IDeserializer { private XmlDocument _xmlDocument; private double _confVersion; - private readonly SecureString _pW = "mR3m".ConvertToSecureString(); private readonly ConnectionsDecryptor _decryptor = new ConnectionsDecryptor(); //TODO find way to inject data source info private string ConnectionFileName = ""; @@ -173,7 +171,7 @@ namespace mRemoteNG.Config.Serializers connectionInfo.Description = xmlnode.Attributes["Descr"].Value; connectionInfo.Hostname = xmlnode.Attributes["Hostname"].Value; connectionInfo.Username = xmlnode.Attributes["Username"].Value; - connectionInfo.Password = cryptographyProvider.Decrypt(xmlnode.Attributes["Password"].Value, _pW); + connectionInfo.Password = cryptographyProvider.Decrypt(xmlnode.Attributes["Password"].Value, Runtime.EncryptionKey); connectionInfo.Domain = xmlnode.Attributes["Domain"].Value; connectionInfo.DisplayWallpaper = bool.Parse(xmlnode.Attributes["DisplayWallpaper"].Value); connectionInfo.DisplayThemes = bool.Parse(xmlnode.Attributes["DisplayThemes"].Value); @@ -353,7 +351,7 @@ namespace mRemoteNG.Config.Serializers connectionInfo.VNCProxyIP = xmlnode.Attributes["VNCProxyIP"].Value; connectionInfo.VNCProxyPort = Convert.ToInt32(xmlnode.Attributes["VNCProxyPort"].Value); connectionInfo.VNCProxyUsername = xmlnode.Attributes["VNCProxyUsername"].Value; - connectionInfo.VNCProxyPassword = cryptographyProvider.Decrypt(xmlnode.Attributes["VNCProxyPassword"].Value, _pW); + connectionInfo.VNCProxyPassword = cryptographyProvider.Decrypt(xmlnode.Attributes["VNCProxyPassword"].Value, Runtime.EncryptionKey); connectionInfo.VNCColors = (ProtocolVNC.Colors)Tools.MiscTools.StringToEnum(typeof(ProtocolVNC.Colors), xmlnode.Attributes["VNCColors"].Value); connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Tools.MiscTools.StringToEnum(typeof(ProtocolVNC.SmartSizeMode), xmlnode.Attributes["VNCSmartSizeMode"].Value); connectionInfo.VNCViewOnly = bool.Parse(xmlnode.Attributes["VNCViewOnly"].Value); @@ -403,7 +401,7 @@ namespace mRemoteNG.Config.Serializers connectionInfo.RDGatewayHostname = xmlnode.Attributes["RDGatewayHostname"].Value; connectionInfo.RDGatewayUseConnectionCredentials = (ProtocolRDP.RDGatewayUseConnectionCredentials)Tools.MiscTools.StringToEnum(typeof(ProtocolRDP.RDGatewayUseConnectionCredentials), Convert.ToString(xmlnode.Attributes["RDGatewayUseConnectionCredentials"].Value)); connectionInfo.RDGatewayUsername = xmlnode.Attributes["RDGatewayUsername"].Value; - connectionInfo.RDGatewayPassword = cryptographyProvider.Decrypt(Convert.ToString(xmlnode.Attributes["RDGatewayPassword"].Value), _pW); + connectionInfo.RDGatewayPassword = cryptographyProvider.Decrypt(Convert.ToString(xmlnode.Attributes["RDGatewayPassword"].Value), Runtime.EncryptionKey); connectionInfo.RDGatewayDomain = xmlnode.Attributes["RDGatewayDomain"].Value; // Get inheritance settings From 020823510df5d5a56ae98e08eed04e64f4079005 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 12:50:02 -0600 Subject: [PATCH 329/338] Fixed bug where app would crash when no tree node selected and trying to import from file --- mRemoteV1/UI/Forms/frmMain.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/UI/Forms/frmMain.cs b/mRemoteV1/UI/Forms/frmMain.cs index dca54386f..5f0684d3f 100644 --- a/mRemoteV1/UI/Forms/frmMain.cs +++ b/mRemoteV1/UI/Forms/frmMain.cs @@ -629,8 +629,12 @@ namespace mRemoteNG.UI.Forms private void mMenFileImportFromFile_Click(object sender, EventArgs e) { var selectedNode = ConnectionTreeWindow.SelectedNode; - var selectedNodeAsContainer = selectedNode as ContainerInfo ?? selectedNode.Parent; - Import.ImportFromFile(selectedNodeAsContainer); + ContainerInfo importDestination; + if (selectedNode == null) + importDestination = Runtime.ConnectionTreeModel.RootNodes.First(); + else + importDestination = selectedNode as ContainerInfo ?? selectedNode.Parent; + Import.ImportFromFile(importDestination); } private void mMenFileImportFromActiveDirectory_Click(object sender, EventArgs e) From 852b43b121b97104f4e81b954d11ec92a4f05b98 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 13:21:54 -0600 Subject: [PATCH 330/338] Resolved crash bug when attempting to import from AD when no connection tree node is selected (will import under the root node) --- mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs b/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs index 567c3e719..2ced90b14 100644 --- a/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs +++ b/mRemoteV1/UI/Window/ActiveDirectoryImportWindow.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Windows.Forms; using WeifenLuo.WinFormsUI.Docking; using mRemoteNG.App; @@ -30,9 +31,13 @@ namespace mRemoteNG.UI.Window public void btnImport_Click(object sender, EventArgs e) { - var selectedNodeAsContainer = Windows.TreeForm.SelectedNode as ContainerInfo ?? - Windows.TreeForm.SelectedNode.Parent; - Import.ImportFromActiveDirectory(ActiveDirectoryTree.ADPath, selectedNodeAsContainer); + var selectedNode = Windows.TreeForm.SelectedNode; + ContainerInfo importDestination; + if (selectedNode != null) + importDestination = selectedNode as ContainerInfo ?? selectedNode.Parent; + else + importDestination = Runtime.ConnectionTreeModel.RootNodes.First(); + Import.ImportFromActiveDirectory(ActiveDirectoryTree.ADPath, importDestination); DialogResult = DialogResult.OK; Close(); } From a02e72d8957953bfeabeaa251ca40386142b94f9 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 13:24:24 -0600 Subject: [PATCH 331/338] Resolved bug where app would crash when opening the Export form with no connection tree node selected --- mRemoteV1/App/Export.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/App/Export.cs b/mRemoteV1/App/Export.cs index 198051b96..3a85ea824 100644 --- a/mRemoteV1/App/Export.cs +++ b/mRemoteV1/App/Export.cs @@ -24,9 +24,9 @@ namespace mRemoteNG.App using (var exportForm = new ExportForm()) { - if (selectedNode.GetTreeNodeType() == TreeNodeType.Container) + if (selectedNode?.GetTreeNodeType() == TreeNodeType.Container) exportForm.SelectedFolder = selectedNode as ContainerInfo; - else if (selectedNode.GetTreeNodeType() == TreeNodeType.Connection) + else if (selectedNode?.GetTreeNodeType() == TreeNodeType.Connection) { if (selectedNode.Parent.GetTreeNodeType() == TreeNodeType.Container) exportForm.SelectedFolder = selectedNode.Parent; From faa240ab972fbb50b918b6598b18f1c4e9640512 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 14:01:36 -0600 Subject: [PATCH 332/338] Sorting tree nodes is now recursive in all cases to be more in line with user expectations --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 24 ++++++++++----------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index d3490f3b4..d44229bb1 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -202,8 +202,8 @@ namespace mRemoteNG.UI.Window _contextMenu.ExportFileClicked += (sender, args) => Export.ExportToFile(SelectedNode, Runtime.ConnectionTreeModel); _contextMenu.AddConnectionClicked += cMenTreeAddConnection_Click; _contextMenu.AddFolderClicked += cMenTreeAddFolder_Click; - _contextMenu.SortAscendingClicked += (sender, args) => SortNodes(ListSortDirection.Ascending); - _contextMenu.SortDescendingClicked += (sender, args) => SortNodes(ListSortDirection.Descending); + _contextMenu.SortAscendingClicked += (sender, args) => SortNodesRecursive(SelectedNode, ListSortDirection.Ascending); + _contextMenu.SortDescendingClicked += (sender, args) => SortNodesRecursive(SelectedNode, ListSortDirection.Descending); _contextMenu.MoveUpClicked += cMenTreeMoveUp_Click; _contextMenu.MoveDownClicked += cMenTreeMoveDown_Click; _contextMenu.ExternalToolClicked += (sender, args) => StartExternalApp((ExternalTool)((ToolStripMenuItem)sender).Tag); @@ -513,19 +513,17 @@ namespace mRemoteNG.UI.Window Runtime.SaveConnectionsAsync(); } - private void SortNodes(ListSortDirection sortDirection) + private void SortNodesRecursive(ConnectionInfo sortTarget, ListSortDirection sortDirection) { - var selectedNodeAsContainer = SelectedNode as ContainerInfo; - if (selectedNodeAsContainer != null) - selectedNodeAsContainer.Sort(sortDirection); - else - SelectedNode.Parent.Sort(sortDirection); - Runtime.SaveConnectionsAsync(); - } + if (sortTarget == null) + sortTarget = GetRootConnectionNode(); + + var sortTargetAsContainer = sortTarget as ContainerInfo; + if (sortTargetAsContainer != null) + sortTargetAsContainer.SortRecursive(sortDirection); + else + SelectedNode.Parent.SortRecursive(sortDirection); - private void SortNodesRecursive(ContainerInfo rootSortTarget, ListSortDirection sortDirection) - { - rootSortTarget.SortRecursive(sortDirection); Runtime.SaveConnectionsAsync(); } From 42f4cb618b5baaf7e2f6c2c58cddf9fa13fe28ad Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 14:26:49 -0600 Subject: [PATCH 333/338] Resolved bug where some new connections/containers would not respect the default connection info and default inheritance settings --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index d44229bb1..d05fd4700 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -565,9 +565,11 @@ namespace mRemoteNG.UI.Window } } - private void AddNode(IHasParent newNode) + private void AddNode(ConnectionInfo newNode) { if (SelectedNode == null) return; + newNode.CopyFrom(DefaultConnectionInfo.Instance); + DefaultConnectionInheritance.Instance.SaveTo(newNode.Inheritance); var selectedContainer = SelectedNode as ContainerInfo; var parent = selectedContainer ?? SelectedNode?.Parent; newNode.SetParent(parent); From e8d17fd733d183b910c248d69acf68f826a58d42 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 14:28:43 -0600 Subject: [PATCH 334/338] Suppress tree refresh errors which occassionally occur --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index d05fd4700..386c90c04 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -496,7 +496,13 @@ namespace mRemoteNG.UI.Window private void RefreshTreeObjects(IList modelObjects) { - olvConnections.RefreshObjects(modelObjects); + try + { + olvConnections.RefreshObjects(modelObjects); + } + catch (Exception) + { + } } #endregion From 59d22b536accbdd7811670c66ad9d183d03dadd5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 14:50:58 -0600 Subject: [PATCH 335/338] Fixed bug that occurs on startup when non-english language is selected. --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 386c90c04..2fe54f0b8 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -694,8 +694,8 @@ namespace mRemoteNG.UI.Window private void txtSearch_TextChanged(object sender, EventArgs e) { if (txtSearch.Text == "") return; - _nodeSearcher.SearchByName(txtSearch.Text); - JumpToNode(_nodeSearcher.CurrentMatch); + _nodeSearcher?.SearchByName(txtSearch.Text); + JumpToNode(_nodeSearcher?.CurrentMatch); } private void JumpToNode(ConnectionInfo connectionInfo) From 9e9786ecc7834f2a8a32ced1a81394591f4445b6 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 15:14:37 -0600 Subject: [PATCH 336/338] Resolved minor bug with copying default connection info data to folders --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 2fe54f0b8..c8696311c 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -574,7 +574,7 @@ namespace mRemoteNG.UI.Window private void AddNode(ConnectionInfo newNode) { if (SelectedNode == null) return; - newNode.CopyFrom(DefaultConnectionInfo.Instance); + DefaultConnectionInfo.Instance.SaveTo(newNode); DefaultConnectionInheritance.Instance.SaveTo(newNode.Inheritance); var selectedContainer = SelectedNode as ContainerInfo; var parent = selectedContainer ?? SelectedNode?.Parent; From f962b8a57361ff88c19b12b32c6611cf3bc2f9bc Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 15:15:38 -0600 Subject: [PATCH 337/338] Right clicking on an empty connection panel no longer displays the context menu --- mRemoteV1/UI/Window/ConnectionWindow.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mRemoteV1/UI/Window/ConnectionWindow.cs b/mRemoteV1/UI/Window/ConnectionWindow.cs index 5008c81f4..908fab04e 100644 --- a/mRemoteV1/UI/Window/ConnectionWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionWindow.cs @@ -796,6 +796,7 @@ namespace mRemoteNG.UI.Window CloseConnectionTab(); break; case MouseButtons.Right: + if (TabController.SelectedTab?.Tag == null) return; ShowHideMenuButtons(); NativeMethods.SetForegroundWindow(Handle); cmenTab.Show(TabController, e.Location); From cf73e827e097961118d6bff535a7f882bc11d3d3 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Tue, 4 Oct 2016 15:25:14 -0600 Subject: [PATCH 338/338] Quick changelog entry --- CHANGELOG.TXT | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 1ee3e8c6b..ea9ed289a 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -7,6 +7,7 @@ MR-366 - Show PuTTY type and version on components check screen MR-938 - Adjust RDP Resolution list (ensure most common resolutions were available) MR-586 - Reduce HTTP/HTTPS document title length that is appended to the connection tab title + MR-975 - Replaced TreeView with TreeListView for displaying connection tree. This was a large change which separated the GUI from the domain model. Features/Enhancements: ----------------------