mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
348 lines
10 KiB
C#
348 lines
10 KiB
C#
using mRemoteNG.App;
|
|
using mRemoteNG.Tools;
|
|
using System;
|
|
using System.Threading;
|
|
using System.Windows.Forms;
|
|
using mRemoteNG.UI.Tabs;
|
|
|
|
// ReSharper disable UnusedMember.Local
|
|
|
|
namespace mRemoteNG.Connection.Protocol
|
|
{
|
|
public abstract class ProtocolBase : IDisposable
|
|
{
|
|
#region Private Variables
|
|
|
|
private ConnectionTab _connectionTab;
|
|
private InterfaceControl _interfaceControl;
|
|
private ConnectingEventHandler ConnectingEvent;
|
|
private ConnectedEventHandler ConnectedEvent;
|
|
private DisconnectedEventHandler DisconnectedEvent;
|
|
private ErrorOccuredEventHandler ErrorOccuredEvent;
|
|
private ClosingEventHandler ClosingEvent;
|
|
private ClosedEventHandler ClosedEvent;
|
|
|
|
#endregion
|
|
|
|
#region Public Properties
|
|
|
|
#region Control
|
|
|
|
private string Name { get; }
|
|
|
|
private ConnectionTab ConnectionTab
|
|
{
|
|
get => _connectionTab;
|
|
set
|
|
{
|
|
_connectionTab = value;
|
|
_connectionTab.ResizeBegin += ResizeBegin;
|
|
_connectionTab.Resize += Resize;
|
|
_connectionTab.ResizeEnd += ResizeEnd;
|
|
}
|
|
}
|
|
|
|
public InterfaceControl InterfaceControl
|
|
{
|
|
get => _interfaceControl;
|
|
set
|
|
{
|
|
_interfaceControl = value;
|
|
|
|
if (_interfaceControl.Parent is ConnectionTab ct)
|
|
ConnectionTab = ct;
|
|
}
|
|
}
|
|
|
|
protected Control Control { get; set; }
|
|
|
|
#endregion
|
|
|
|
public ConnectionInfo.Force Force { get; set; }
|
|
|
|
public readonly System.Timers.Timer tmrReconnect = new System.Timers.Timer(2000);
|
|
protected ReconnectGroup ReconnectGroup;
|
|
|
|
protected ProtocolBase(string name)
|
|
{
|
|
Name = name;
|
|
}
|
|
|
|
protected ProtocolBase()
|
|
{
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
//public abstract int GetDefaultPort();
|
|
|
|
public virtual void Focus()
|
|
{
|
|
try
|
|
{
|
|
Control.Focus();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Runtime.MessageCollector.AddExceptionStackTrace("Couldn't focus Control (Connection.Protocol.Base)",
|
|
ex);
|
|
}
|
|
}
|
|
|
|
public virtual void ResizeBegin(object sender, EventArgs e)
|
|
{
|
|
}
|
|
|
|
public virtual void Resize(object sender, EventArgs e)
|
|
{
|
|
}
|
|
|
|
public virtual void ResizeEnd(object sender, EventArgs e)
|
|
{
|
|
}
|
|
|
|
public virtual bool Initialize()
|
|
{
|
|
try
|
|
{
|
|
_interfaceControl.Parent.Tag = _interfaceControl;
|
|
_interfaceControl.Show();
|
|
|
|
if (Control == null) return true;
|
|
Control.Name = Name;
|
|
Control.Parent = _interfaceControl;
|
|
Control.Location = _interfaceControl.Location;
|
|
Control.Size = InterfaceControl.Size;
|
|
Control.Anchor = _interfaceControl.Anchor;
|
|
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Runtime.MessageCollector.AddExceptionStackTrace("Couldn't SetProps (Connection.Protocol.Base)", ex);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public virtual bool Connect()
|
|
{
|
|
if (InterfaceControl.Info.Protocol == ProtocolType.RDP) return false;
|
|
if (ConnectedEvent == null) return false;
|
|
ConnectedEvent(this);
|
|
return true;
|
|
}
|
|
|
|
public virtual void Disconnect()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
public virtual void Close()
|
|
{
|
|
var t = new Thread(CloseBG);
|
|
t.SetApartmentState(ApartmentState.STA);
|
|
t.IsBackground = true;
|
|
t.Start();
|
|
}
|
|
|
|
private void CloseBG()
|
|
{
|
|
ClosedEvent?.Invoke(this);
|
|
try
|
|
{
|
|
tmrReconnect.Enabled = false;
|
|
|
|
if (Control != null)
|
|
{
|
|
try
|
|
{
|
|
DisposeControl();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Runtime.MessageCollector?.AddExceptionStackTrace(
|
|
"Couldn't dispose control, probably form is already closed (Connection.Protocol.Base)",
|
|
ex);
|
|
}
|
|
}
|
|
|
|
if (_interfaceControl == null) return;
|
|
|
|
try
|
|
{
|
|
if (_interfaceControl.Parent == null) return;
|
|
|
|
if (_interfaceControl.Parent.Tag != null)
|
|
{
|
|
SetTagToNothing();
|
|
}
|
|
|
|
DisposeInterface();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Runtime.MessageCollector?.AddExceptionStackTrace(
|
|
"Couldn't set InterfaceControl.Parent.Tag or Dispose Interface, probably form is already closed (Connection.Protocol.Base)",
|
|
ex);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Runtime.MessageCollector?.AddExceptionStackTrace(
|
|
"Couldn't Close InterfaceControl BG (Connection.Protocol.Base)",
|
|
ex);
|
|
}
|
|
}
|
|
|
|
private delegate void DisposeInterfaceCB();
|
|
|
|
private void DisposeInterface()
|
|
{
|
|
if (_interfaceControl.InvokeRequired)
|
|
{
|
|
var s = new DisposeInterfaceCB(DisposeInterface);
|
|
_interfaceControl.Invoke(s);
|
|
}
|
|
else
|
|
{
|
|
_interfaceControl.Dispose();
|
|
}
|
|
}
|
|
|
|
private delegate void SetTagToNothingCB();
|
|
|
|
private void SetTagToNothing()
|
|
{
|
|
if (_interfaceControl.Parent.InvokeRequired)
|
|
{
|
|
var s = new SetTagToNothingCB(SetTagToNothing);
|
|
_interfaceControl.Parent.Invoke(s);
|
|
}
|
|
else
|
|
{
|
|
_interfaceControl.Parent.Tag = null;
|
|
}
|
|
}
|
|
|
|
private delegate void DisposeControlCB();
|
|
|
|
private void DisposeControl()
|
|
{
|
|
if (Control.InvokeRequired)
|
|
{
|
|
var s = new DisposeControlCB(DisposeControl);
|
|
Control.Invoke(s);
|
|
}
|
|
else
|
|
{
|
|
Control.Dispose();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Events
|
|
|
|
public delegate void ConnectingEventHandler(object sender);
|
|
|
|
public event ConnectingEventHandler Connecting
|
|
{
|
|
add => ConnectingEvent = (ConnectingEventHandler)Delegate.Combine(ConnectingEvent, value);
|
|
remove => ConnectingEvent = (ConnectingEventHandler)Delegate.Remove(ConnectingEvent, value);
|
|
}
|
|
|
|
public delegate void ConnectedEventHandler(object sender);
|
|
|
|
public event ConnectedEventHandler Connected
|
|
{
|
|
add => ConnectedEvent = (ConnectedEventHandler)Delegate.Combine(ConnectedEvent, value);
|
|
remove => ConnectedEvent = (ConnectedEventHandler)Delegate.Remove(ConnectedEvent, value);
|
|
}
|
|
|
|
public delegate void DisconnectedEventHandler(object sender, string disconnectedMessage, int? reasonCode);
|
|
|
|
public event DisconnectedEventHandler Disconnected
|
|
{
|
|
add => DisconnectedEvent = (DisconnectedEventHandler)Delegate.Combine(DisconnectedEvent, value);
|
|
remove => DisconnectedEvent = (DisconnectedEventHandler)Delegate.Remove(DisconnectedEvent, value);
|
|
}
|
|
|
|
public delegate void ErrorOccuredEventHandler(object sender, string errorMessage, int? errorCode);
|
|
|
|
public event ErrorOccuredEventHandler ErrorOccured
|
|
{
|
|
add => ErrorOccuredEvent = (ErrorOccuredEventHandler)Delegate.Combine(ErrorOccuredEvent, value);
|
|
remove => ErrorOccuredEvent = (ErrorOccuredEventHandler)Delegate.Remove(ErrorOccuredEvent, value);
|
|
}
|
|
|
|
public delegate void ClosingEventHandler(object sender);
|
|
|
|
public event ClosingEventHandler Closing
|
|
{
|
|
add => ClosingEvent = (ClosingEventHandler)Delegate.Combine(ClosingEvent, value);
|
|
remove => ClosingEvent = (ClosingEventHandler)Delegate.Remove(ClosingEvent, value);
|
|
}
|
|
|
|
public delegate void ClosedEventHandler(object sender);
|
|
|
|
public event ClosedEventHandler Closed
|
|
{
|
|
add => ClosedEvent = (ClosedEventHandler)Delegate.Combine(ClosedEvent, value);
|
|
remove => ClosedEvent = (ClosedEventHandler)Delegate.Remove(ClosedEvent, value);
|
|
}
|
|
|
|
|
|
public void Event_Closing(object sender)
|
|
{
|
|
ClosingEvent?.Invoke(sender);
|
|
}
|
|
|
|
protected void Event_Closed(object sender)
|
|
{
|
|
ClosedEvent?.Invoke(sender);
|
|
}
|
|
|
|
protected void Event_Connecting(object sender)
|
|
{
|
|
ConnectingEvent?.Invoke(sender);
|
|
}
|
|
|
|
protected void Event_Connected(object sender)
|
|
{
|
|
ConnectedEvent?.Invoke(sender);
|
|
}
|
|
|
|
protected void Event_Disconnected(object sender, string disconnectedMessage, int? reasonCode)
|
|
{
|
|
DisconnectedEvent?.Invoke(sender, disconnectedMessage, reasonCode);
|
|
}
|
|
|
|
protected void Event_ErrorOccured(object sender, string errorMsg, int? errorCode)
|
|
{
|
|
ErrorOccuredEvent?.Invoke(sender, errorMsg, errorCode);
|
|
}
|
|
|
|
protected void Event_ReconnectGroupCloseClicked()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
#endregion
|
|
|
|
private void Dispose(bool disposing)
|
|
{
|
|
if (!disposing) return;
|
|
|
|
if(tmrReconnect != null)
|
|
tmrReconnect.Dispose();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Dispose(true);
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
}
|
|
} |