From 601951582d73ef9dea97546cf3ce43e4a69325c5 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 25 Jan 2017 09:54:54 -0700 Subject: [PATCH] resolved issue where saving default con properties would fail enum, int, bool -> string was throwing an exception. now using a simpler strategy for type conversion resolves #295 --- .../Connection/DefaultConnectionInfoTests.cs | 39 +++++++++++++++++++ mRemoteV1/Connection/DefaultConnectionInfo.cs | 21 +++++----- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/mRemoteNGTests/Connection/DefaultConnectionInfoTests.cs b/mRemoteNGTests/Connection/DefaultConnectionInfoTests.cs index 8b6f5a759..0d9cf4a37 100644 --- a/mRemoteNGTests/Connection/DefaultConnectionInfoTests.cs +++ b/mRemoteNGTests/Connection/DefaultConnectionInfoTests.cs @@ -1,4 +1,5 @@ using mRemoteNG.Connection; +using mRemoteNG.Connection.Protocol; using NUnit.Framework; @@ -30,5 +31,43 @@ namespace mRemoteNGTests.Connection DefaultConnectionInfo.Instance.SaveTo(saveTarget); Assert.That(saveTarget.Domain, Is.EqualTo(_testDomain)); } + + [Test] + public void CanSaveEnumValuesToString() + { + const ProtocolType targetProtocol = ProtocolType.RAW; + var saveTarget = new AllStringPropertySaveTarget(); + DefaultConnectionInfo.Instance.Protocol = targetProtocol; + DefaultConnectionInfo.Instance.SaveTo(saveTarget); + Assert.That(saveTarget.Protocol, Is.EqualTo(targetProtocol.ToString())); + } + + [Test] + public void CanSaveIntegerValuesToString() + { + const int targetValue = 123; + var saveTarget = new AllStringPropertySaveTarget(); + DefaultConnectionInfo.Instance.RDPMinutesToIdleTimeout = targetValue; + DefaultConnectionInfo.Instance.SaveTo(saveTarget); + Assert.That(saveTarget.RDPMinutesToIdleTimeout, Is.EqualTo(targetValue.ToString())); + } + + [Test] + public void CanSaveStringValuesToString() + { + const string targetName = "hello"; + var saveTarget = new AllStringPropertySaveTarget(); + DefaultConnectionInfo.Instance.Username = targetName; + DefaultConnectionInfo.Instance.SaveTo(saveTarget); + Assert.That(saveTarget.Username, Is.EqualTo(targetName)); + } + + + private class AllStringPropertySaveTarget + { + public string Username { get; set; } + public string Protocol { get; set; } + public string RDPMinutesToIdleTimeout { get; set; } + } } } \ No newline at end of file diff --git a/mRemoteV1/Connection/DefaultConnectionInfo.cs b/mRemoteV1/Connection/DefaultConnectionInfo.cs index 8f7e3b742..156df57ad 100644 --- a/mRemoteV1/Connection/DefaultConnectionInfo.cs +++ b/mRemoteV1/Connection/DefaultConnectionInfo.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using mRemoteNG.App; namespace mRemoteNG.Connection @@ -39,15 +40,17 @@ namespace mRemoteNG.Connection var inheritanceProperties = GetProperties(_excludedProperties); foreach (var property in inheritanceProperties) { - var propertyFromDestination = typeof(TDestination).GetProperty(propertyNameMutator(property.Name)); - var localValue = property.GetValue(Instance, null); - - var descriptor = TypeDescriptor.GetProperties(Instance)[property.Name]; - var converter = descriptor.Converter; - if (converter != null && converter.CanConvertFrom(localValue.GetType())) - propertyFromDestination.SetValue(destinationInstance, converter.ConvertFrom(localValue), null); - else - propertyFromDestination.SetValue(destinationInstance, localValue, null); + try + { + var propertyFromDestination = typeof(TDestination).GetProperty(propertyNameMutator(property.Name)); + var localValue = property.GetValue(Instance, null); + var convertedValue = Convert.ChangeType(localValue, propertyFromDestination.PropertyType); + propertyFromDestination.SetValue(destinationInstance, convertedValue, null); + } + catch (Exception ex) + { + Runtime.MessageCollector?.AddExceptionStackTrace($"Error saving default connectioninfo property {property.Name}", ex); + } } } }