diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 1a7bdbf8..6e32ebb5 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -19,7 +19,8 @@ namespace mRemoteNG.App mRemoteXml, RemoteDesktopConnection, RemoteDesktopConnectionManager, - PuttyConnectionManager + PuttyConnectionManager, + mRemoteNGCsv } #region Public Methods @@ -34,8 +35,9 @@ namespace mRemoteNG.App openFileDialog.Multiselect = true; var fileTypes = new List(); - fileTypes.AddRange(new[] {Language.strFilterAllImportable, "*.xml;*.rdp;*.rdg;*.dat"}); + fileTypes.AddRange(new[] {Language.strFilterAllImportable, "*.xml;*.rdp;*.rdg;*.dat;*.csv"}); fileTypes.AddRange(new[] {Language.strFiltermRemoteXML, "*.xml"}); + fileTypes.AddRange(new[] {Language.strFiltermRemoteCSV, "*.csv"}); fileTypes.AddRange(new[] {Language.strFilterRDP, "*.rdp"}); fileTypes.AddRange(new[] {Language.strFilterRdgFiles, "*.rdg"}); fileTypes.AddRange(new[] {Language.strFilterPuttyConnectionManager, "*.dat"}); @@ -55,7 +57,10 @@ namespace mRemoteNG.App switch (DetermineFileType(fileName)) { case FileType.mRemoteXml: - importer = new mRemoteNGImporter(); + importer = new MRemoteNGXmlImporter(); + break; + case FileType.mRemoteNGCsv: + importer = new MRemoteNGCsvImporter(); break; case FileType.RemoteDesktopConnection: importer = new RemoteDesktopConnectionImporter(); @@ -125,6 +130,8 @@ namespace mRemoteNG.App { case ".xml": return FileType.mRemoteXml; + case ".csv": + return FileType.mRemoteNGCsv; case ".rdp": return FileType.RemoteDesktopConnection; case ".rdg": diff --git a/mRemoteV1/Config/Import/MRemoteNGCsvImporter.cs b/mRemoteV1/Config/Import/MRemoteNGCsvImporter.cs new file mode 100644 index 00000000..d1c46edf --- /dev/null +++ b/mRemoteV1/Config/Import/MRemoteNGCsvImporter.cs @@ -0,0 +1,42 @@ +using System; +using System.IO; +using System.Linq; +using mRemoteNG.App; +using mRemoteNG.Config.DataProviders; +using mRemoteNG.Config.Serializers; +using mRemoteNG.Config.Serializers.MiscSerializers; +using mRemoteNG.Container; +using mRemoteNG.Messages; + +namespace mRemoteNG.Config.Import +{ + public class MRemoteNGCsvImporter : IConnectionImporter + { + 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 void Import(string fileName, ContainerInfo destinationContainer) + { + var dataProvider = new FileDataProvider(fileName); + var xmlString = dataProvider.Load(); + var xmlConnectionsDeserializer = new CsvConnectionsDeserializerMremotengFormat(); + var connectionTreeModel = xmlConnectionsDeserializer.Deserialize(xmlString); + + var rootImportContainer = new ContainerInfo { Name = Path.GetFileNameWithoutExtension(fileName) }; + rootImportContainer.AddChildRange(connectionTreeModel.RootNodes.First().Children.ToArray()); + destinationContainer.AddChild(rootImportContainer); + } + } +} diff --git a/mRemoteV1/Config/Import/mRemoteNGImporter.cs b/mRemoteV1/Config/Import/MRemoteNGXmlImporter.cs similarity index 96% rename from mRemoteV1/Config/Import/mRemoteNGImporter.cs rename to mRemoteV1/Config/Import/MRemoteNGXmlImporter.cs index 56e19d65..8bb49602 100644 --- a/mRemoteV1/Config/Import/mRemoteNGImporter.cs +++ b/mRemoteV1/Config/Import/MRemoteNGXmlImporter.cs @@ -10,7 +10,7 @@ using mRemoteNG.Messages; namespace mRemoteNG.Config.Import { // ReSharper disable once InconsistentNaming - public class mRemoteNGImporter : IConnectionImporter + public class MRemoteNGXmlImporter : IConnectionImporter { public void Import(object filePath, ContainerInfo destinationContainer) { diff --git a/mRemoteV1/Config/Serializers/MiscSerializers/CsvConnectionsSerializerMremotengFormat.cs b/mRemoteV1/Config/Serializers/MiscSerializers/CsvConnectionsSerializerMremotengFormat.cs index f1a0b87b..c7432e6f 100644 --- a/mRemoteV1/Config/Serializers/MiscSerializers/CsvConnectionsSerializerMremotengFormat.cs +++ b/mRemoteV1/Config/Serializers/MiscSerializers/CsvConnectionsSerializerMremotengFormat.cs @@ -210,12 +210,13 @@ namespace mRemoteNG.Config.Serializers private string GetNodePath(ConnectionInfo connectionInfo) { var nodePath = ""; - var container = connectionInfo.Parent; - if (container == null) return nodePath; - while (container != _serializationTarget) + var currentItem = connectionInfo; + while (currentItem != _serializationTarget) { - container = container.Parent; - nodePath += $@"{container.Name}\"; + currentItem = currentItem.Parent; + if (currentItem == null) + break; + nodePath += $@"{currentItem.Name}\"; } nodePath = nodePath.TrimEnd('\\'); return nodePath; diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 0acfa43b..f43cbdc8 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -157,6 +157,7 @@ + @@ -210,7 +211,7 @@ - +