finished splitting up rdp functionality between classes

This commit is contained in:
David Sparer
2019-06-11 10:44:26 -05:00
parent aef9be8d9b
commit 65edebca2e
10 changed files with 133 additions and 63 deletions

View File

@@ -110,7 +110,9 @@ namespace mRemoteNG.Connection.Protocol
_interfaceControl.Parent.Tag = _interfaceControl; _interfaceControl.Parent.Tag = _interfaceControl;
_interfaceControl.Show(); _interfaceControl.Show();
if (Control == null) return true; if (Control == null)
return false;
Control.Name = Name; Control.Name = Name;
Control.Parent = _interfaceControl; Control.Parent = _interfaceControl;
Control.Location = _interfaceControl.Location; Control.Location = _interfaceControl.Location;

View File

@@ -12,58 +12,46 @@ namespace mRemoteNG.Connection.Protocol
{ {
public class ProtocolFactory public class ProtocolFactory
{ {
private readonly RdpProtocolFactory _rdpProtocolFactory = new RdpProtocolFactory();
public ProtocolBase CreateProtocol(ConnectionInfo connectionInfo) public ProtocolBase CreateProtocol(ConnectionInfo connectionInfo)
{ {
var newProtocol = default(ProtocolBase);
// ReSharper disable once SwitchStatementMissingSomeCases // ReSharper disable once SwitchStatementMissingSomeCases
switch (connectionInfo.Protocol) switch (connectionInfo.Protocol)
{ {
case ProtocolType.RDP: case ProtocolType.RDP:
newProtocol = new RdpProtocol6 var rdp = _rdpProtocolFactory.Build(connectionInfo.RdpProtocolVersion);
{ rdp.LoadBalanceInfoUseUtf8 = Settings.Default.RdpLoadBalanceInfoUseUtf8;
LoadBalanceInfoUseUtf8 = Settings.Default.RdpLoadBalanceInfoUseUtf8 return rdp;
};
((RdpProtocol6)newProtocol).tmrReconnect.Elapsed += ((RdpProtocol6)newProtocol).tmrReconnect_Elapsed;
break;
case ProtocolType.VNC: case ProtocolType.VNC:
newProtocol = new ProtocolVNC(); return new ProtocolVNC();
break;
case ProtocolType.SSH1: case ProtocolType.SSH1:
newProtocol = new ProtocolSSH1(); return new ProtocolSSH1();
break;
case ProtocolType.SSH2: case ProtocolType.SSH2:
newProtocol = new ProtocolSSH2(); return new ProtocolSSH2();
break;
case ProtocolType.Telnet: case ProtocolType.Telnet:
newProtocol = new ProtocolTelnet(); return new ProtocolTelnet();
break;
case ProtocolType.Rlogin: case ProtocolType.Rlogin:
newProtocol = new ProtocolRlogin(); return new ProtocolRlogin();
break;
case ProtocolType.RAW: case ProtocolType.RAW:
newProtocol = new RawProtocol(); return new RawProtocol();
break;
case ProtocolType.HTTP: case ProtocolType.HTTP:
newProtocol = new ProtocolHTTP(connectionInfo.RenderingEngine); return new ProtocolHTTP(connectionInfo.RenderingEngine);
break;
case ProtocolType.HTTPS: case ProtocolType.HTTPS:
newProtocol = new ProtocolHTTPS(connectionInfo.RenderingEngine); return new ProtocolHTTPS(connectionInfo.RenderingEngine);
break;
case ProtocolType.ICA: case ProtocolType.ICA:
newProtocol = new IcaProtocol(); var icaProtocol = new IcaProtocol();
((IcaProtocol)newProtocol).tmrReconnect.Elapsed += ((IcaProtocol)newProtocol).tmrReconnect_Elapsed; icaProtocol.tmrReconnect.Elapsed += icaProtocol.tmrReconnect_Elapsed;
break; return icaProtocol;
case ProtocolType.IntApp: case ProtocolType.IntApp:
newProtocol = new IntegratedProgram();
if (connectionInfo.ExtApp == "") if (connectionInfo.ExtApp == "")
{ {
throw (new Exception(Language.strNoExtAppDefined)); throw (new Exception(Language.strNoExtAppDefined));
} }
return new IntegratedProgram();
break;
} }
return newProtocol; return default(ProtocolBase);
} }
} }
} }

View File

@@ -0,0 +1,15 @@
using System.Windows.Forms;
using AxMSTSCLib;
namespace mRemoteNG.Connection.Protocol.RDP
{
public class RdpProtocol10 : RdpProtocol9
{
protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc10;
protected override AxHost CreateRdpClientControl()
{
return new AxMsRdpClient10NotSafeForScripting();
}
}
}

View File

@@ -1,7 +1,8 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Timers;
using System.Windows.Forms; using System.Windows.Forms;
using AxMSTSCLib; using AxMSTSCLib;
using mRemoteNG.App; using mRemoteNG.App;
@@ -24,14 +25,15 @@ namespace mRemoteNG.Connection.Protocol.RDP
* *
* Windows 8+ support RDP v8 out of the box. * Windows 8+ support RDP v8 out of the box.
*/ */
protected MsRdpClient6NotSafeForScripting _rdpClient; private MsRdpClient6NotSafeForScripting _rdpClient;
private Version _rdpVersion;
protected ConnectionInfo connectionInfo; protected ConnectionInfo connectionInfo;
protected bool loginComplete; protected bool loginComplete;
private Version _rdpVersion;
private bool _redirectKeys; private bool _redirectKeys;
private bool _alertOnIdleDisconnect; private bool _alertOnIdleDisconnect;
private readonly DisplayProperties _displayProperties; private readonly DisplayProperties _displayProperties;
private readonly FrmMain _frmMain = FrmMain.Default; private readonly FrmMain _frmMain = FrmMain.Default;
protected virtual RdpVersion RdpProtocolVersion => RdpVersion.Rdc6;
private AxHost AxHost => (AxHost)Control; private AxHost AxHost => (AxHost)Control;
#region Properties #region Properties
@@ -98,8 +100,8 @@ namespace mRemoteNG.Connection.Protocol.RDP
public RdpProtocol6() public RdpProtocol6()
{ {
_displayProperties = new DisplayProperties(); _displayProperties = new DisplayProperties();
Control = new AxMsRdpClient6NotSafeForScripting();
Connecting += OnConnectingDebugMessage; Connecting += OnConnectingDebugMessage;
tmrReconnect.Elapsed += tmrReconnect_Elapsed;
} }
#endregion #endregion
@@ -108,10 +110,11 @@ namespace mRemoteNG.Connection.Protocol.RDP
private void OnConnectingDebugMessage(object sender) private void OnConnectingDebugMessage(object sender)
{ {
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Using RDP version: {connectionInfo.RdpProtocolVersion}"); Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg,
$"Requesting RDP version: {connectionInfo.RdpProtocolVersion}. Using: {RdpProtocolVersion}");
} }
protected virtual object CreateRdpClientControl() protected virtual AxHost CreateRdpClientControl()
{ {
return new AxMsRdpClient6NotSafeForScripting(); return new AxMsRdpClient6NotSafeForScripting();
} }
@@ -119,6 +122,7 @@ namespace mRemoteNG.Connection.Protocol.RDP
public override bool Initialize() public override bool Initialize()
{ {
Control = CreateRdpClientControl();
base.Initialize(); base.Initialize();
try try
{ {
@@ -134,9 +138,9 @@ namespace mRemoteNG.Connection.Protocol.RDP
Application.DoEvents(); Application.DoEvents();
} }
_rdpClient = (MsRdpClient6NotSafeForScripting)CreateRdpClientControl(); _rdpClient = (MsRdpClient6NotSafeForScripting)((AxHost)Control).GetOcx();
} }
catch (System.Runtime.InteropServices.COMException ex) catch (COMException ex)
{ {
Runtime.MessageCollector.AddExceptionMessage(Language.strRdpControlCreationFailed, ex); Runtime.MessageCollector.AddExceptionMessage(Language.strRdpControlCreationFailed, ex);
Control.Dispose(); Control.Dispose();
@@ -283,6 +287,27 @@ namespace mRemoteNG.Connection.Protocol.RDP
Runtime.MessageCollector.AddExceptionStackTrace(Language.strRdpFocusFailed, ex); Runtime.MessageCollector.AddExceptionStackTrace(Language.strRdpFocusFailed, ex);
} }
} }
/// <summary>
/// Determines if this version of the RDP client
/// is supported on this machine.
/// </summary>
/// <returns></returns>
public bool IsRdpVersionSupported()
{
try
{
using (var control = CreateRdpClientControl())
{
control.CreateControl();
return true;
}
}
catch (COMException ex)
{
return false;
}
}
#endregion #endregion
#region Private Methods #region Private Methods
@@ -749,11 +774,12 @@ namespace mRemoteNG.Connection.Protocol.RDP
public static readonly Version RDC70 = new Version(6, 1, 7600); public static readonly Version RDC70 = new Version(6, 1, 7600);
public static readonly Version RDC80 = new Version(6, 2, 9200); public static readonly Version RDC80 = new Version(6, 2, 9200);
public static readonly Version RDC81 = new Version(6, 3, 9600); public static readonly Version RDC81 = new Version(6, 3, 9600);
public static readonly Version RDC100 = new Version(10, 0, 0);
} }
#region Reconnect Stuff #region Reconnect Stuff
public void tmrReconnect_Elapsed(object sender, System.Timers.ElapsedEventArgs e) public void tmrReconnect_Elapsed(object sender, ElapsedEventArgs e)
{ {
try try
{ {
@@ -770,9 +796,8 @@ namespace mRemoteNG.Connection.Protocol.RDP
catch (Exception ex) catch (Exception ex)
{ {
Runtime.MessageCollector.AddExceptionMessage( Runtime.MessageCollector.AddExceptionMessage(
string.Format(Language.AutomaticReconnectError, string.Format(Language.AutomaticReconnectError, connectionInfo.Hostname),
connectionInfo.Hostname), ex, MessageClass.WarningMsg, false);
ex, MessageClass.WarningMsg, false);
} }
} }

View File

@@ -2,20 +2,24 @@
using mRemoteNG.App; using mRemoteNG.App;
using MSTSCLib; using MSTSCLib;
using System; using System;
using System.Windows.Forms;
namespace mRemoteNG.Connection.Protocol.RDP namespace mRemoteNG.Connection.Protocol.RDP
{ {
public class RdpProtocol7 : RdpProtocol6 public class RdpProtocol7 : RdpProtocol6
{ {
private new MsRdpClient7NotSafeForScripting _rdpClient; protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc7;
public override bool Initialize() public override bool Initialize()
{ {
base.Initialize(); if (!base.Initialize())
return false;
try try
{ {
_rdpClient.AdvancedSettings8.AudioQualityMode = (uint)connectionInfo.SoundQuality; var rdpClient7 = (MsRdpClient7NotSafeForScripting)((AxHost) Control).GetOcx();
_rdpClient.AdvancedSettings8.AudioCaptureRedirectionMode = connectionInfo.RedirectAudioCapture; rdpClient7.AdvancedSettings8.AudioQualityMode = (uint)connectionInfo.SoundQuality;
rdpClient7.AdvancedSettings8.AudioCaptureRedirectionMode = connectionInfo.RedirectAudioCapture;
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -26,10 +30,9 @@ namespace mRemoteNG.Connection.Protocol.RDP
return true; return true;
} }
protected override object CreateRdpClientControl() protected override AxHost CreateRdpClientControl()
{ {
_rdpClient = (MsRdpClient7NotSafeForScripting)((AxMsRdpClient7NotSafeForScripting)Control).GetOcx(); return new AxMsRdpClient7NotSafeForScripting();
return _rdpClient;
} }
} }
} }

View File

@@ -17,12 +17,14 @@ namespace mRemoteNG.Connection.Protocol.RDP
*/ */
public class RdpProtocol8 : RdpProtocol7 public class RdpProtocol8 : RdpProtocol7
{ {
private new MsRdpClient8NotSafeForScripting _rdpClient; private MsRdpClient8NotSafeForScripting RdpClient8 => (MsRdpClient8NotSafeForScripting)((AxHost)Control).GetOcx();
private Size _controlBeginningSize; private Size _controlBeginningSize;
protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc8;
public override bool SmartSize public override bool SmartSize
{ {
get { return base.SmartSize; } get => base.SmartSize;
protected set protected set
{ {
base.SmartSize = value; base.SmartSize = value;
@@ -40,11 +42,6 @@ namespace mRemoteNG.Connection.Protocol.RDP
} }
} }
public RdpProtocol8()
{
Control = new AxMsRdpClient8NotSafeForScripting();
}
public override void ResizeBegin(object sender, EventArgs e) public override void ResizeBegin(object sender, EventArgs e)
{ {
_controlBeginningSize = Control.Size; _controlBeginningSize = Control.Size;
@@ -69,10 +66,9 @@ namespace mRemoteNG.Connection.Protocol.RDP
_controlBeginningSize = Size.Empty; _controlBeginningSize = Size.Empty;
} }
protected override object CreateRdpClientControl() protected override AxHost CreateRdpClientControl()
{ {
_rdpClient = (MsRdpClient8NotSafeForScripting)((AxMsRdpClient8NotSafeForScripting)Control).GetOcx(); return new AxMsRdpClient8NotSafeForScripting();
return _rdpClient;
} }
private void ReconnectForResize() private void ReconnectForResize()
@@ -98,7 +94,7 @@ namespace mRemoteNG.Connection.Protocol.RDP
var size = Fullscreen var size = Fullscreen
? Screen.FromControl(Control).Bounds.Size ? Screen.FromControl(Control).Bounds.Size
: Control.Size; : Control.Size;
_rdpClient.Reconnect((uint)size.Width, (uint)size.Height); RdpClient8.Reconnect((uint)size.Width, (uint)size.Height);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -0,0 +1,15 @@
using System.Windows.Forms;
using AxMSTSCLib;
namespace mRemoteNG.Connection.Protocol.RDP
{
public class RdpProtocol9 : RdpProtocol8
{
protected override RdpVersion RdpProtocolVersion => RdpVersion.Rdc9;
protected override AxHost CreateRdpClientControl()
{
return new AxMsRdpClient9NotSafeForScripting();
}
}
}

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Linq;
namespace mRemoteNG.Connection.Protocol.RDP namespace mRemoteNG.Connection.Protocol.RDP
{ {
@@ -8,16 +9,38 @@ namespace mRemoteNG.Connection.Protocol.RDP
{ {
switch (rdpVersion) switch (rdpVersion)
{ {
case RdpVersion.Highest:
return BuildHighestSupportedVersion();
case RdpVersion.Rdc6: case RdpVersion.Rdc6:
return new RdpProtocol6(); return new RdpProtocol6();
case RdpVersion.Rdc7: case RdpVersion.Rdc7:
return new RdpProtocol7();
case RdpVersion.Rdc8: case RdpVersion.Rdc8:
case RdpVersion.Rdc9:
case RdpVersion.Rdc10:
return new RdpProtocol8(); return new RdpProtocol8();
case RdpVersion.Rdc9:
return new RdpProtocol9();
case RdpVersion.Rdc10:
return new RdpProtocol10();
default: default:
throw new ArgumentOutOfRangeException(nameof(rdpVersion), rdpVersion, null); throw new ArgumentOutOfRangeException(nameof(rdpVersion), rdpVersion, null);
} }
} }
private RdpProtocol6 BuildHighestSupportedVersion()
{
var versions = Enum.GetValues(typeof(RdpVersion))
.OfType<RdpVersion>()
.Except(new[] { RdpVersion.Highest })
.Reverse();
foreach (var version in versions)
{
var rdp = Build(version);
if (rdp.RdpVersionSupported())
return rdp;
}
throw new ArgumentOutOfRangeException();
}
} }
} }

View File

@@ -7,5 +7,6 @@
Rdc8, Rdc8,
Rdc9, Rdc9,
Rdc10, Rdc10,
Highest = 1000
} }
} }

View File

@@ -261,8 +261,10 @@
<Compile Include="Connection\Protocol\RDP\RdpErrorCodes.cs" /> <Compile Include="Connection\Protocol\RDP\RdpErrorCodes.cs" />
<Compile Include="Connection\Protocol\RDP\RdpExtensions.cs" /> <Compile Include="Connection\Protocol\RDP\RdpExtensions.cs" />
<Compile Include="Connection\Protocol\RDP\RDPPerformanceFlags.cs" /> <Compile Include="Connection\Protocol\RDP\RDPPerformanceFlags.cs" />
<Compile Include="Connection\Protocol\RDP\RdpProtocol10.cs" />
<Compile Include="Connection\Protocol\RDP\RdpProtocol7.cs" /> <Compile Include="Connection\Protocol\RDP\RdpProtocol7.cs" />
<Compile Include="Connection\Protocol\RDP\RdpProtocol8.cs" /> <Compile Include="Connection\Protocol\RDP\RdpProtocol8.cs" />
<Compile Include="Connection\Protocol\RDP\RdpProtocol9.cs" />
<Compile Include="Connection\Protocol\RDP\RdpProtocolFactory.cs" /> <Compile Include="Connection\Protocol\RDP\RdpProtocolFactory.cs" />
<Compile Include="Connection\Protocol\RDP\RDPResolutions.cs" /> <Compile Include="Connection\Protocol\RDP\RDPResolutions.cs" />
<Compile Include="Connection\Protocol\RDP\RDPSoundQuality.cs" /> <Compile Include="Connection\Protocol\RDP\RDPSoundQuality.cs" />