Cleans up the disconnect logic and adds KillClient() to better control process of disposing of resources before reconnect attempts. Adds XML help for propeties and methods

This commit is contained in:
Neil Dorin
2020-01-24 15:29:54 -07:00
parent 19263590a7
commit 5576fa349d

View File

@@ -175,7 +175,6 @@ namespace PepperDash.Core
{
Debug.Console(1, this, "Program stopping. Closing connection");
Disconnect();
//Client.Dispose();
}
}
}
@@ -207,28 +206,27 @@ namespace PepperDash.Core
return;
}
// Cleanup the old client if it already exists
if (Client != null)
{
Debug.Console(1, this, "Cleaning up disconnected client");
Client.ErrorOccurred -= Client_ErrorOccurred;
KillStream();
Client.Disconnect();
KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY);
}
else
{
// This handles both password and keyboard-interactive (like on OS-X, 'nixes)
KeyboardInteractiveAuthenticationMethod kauth = new KeyboardInteractiveAuthenticationMethod(Username);
kauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(kauth_AuthenticationPrompt);
PasswordAuthenticationMethod pauth = new PasswordAuthenticationMethod(Username, Password);
Debug.Console(1, this, "Creating new SshClient");
ConnectionInfo connectionInfo = new ConnectionInfo(Hostname, Port, Username, pauth, kauth);
Client = new SshClient(connectionInfo);
}
Client.ErrorOccurred -= Client_ErrorOccurred;
Client.ErrorOccurred += Client_ErrorOccurred;
//You can do it!
//Attempt to connect
ClientStatus = SocketStatus.SOCKET_STATUS_WAITING;
try
{
@@ -281,13 +279,21 @@ namespace PepperDash.Core
ReconnectTimer = null;
}
KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY);
}
/// <summary>
/// Kills the stream, cleans up the client and sets it to null
/// </summary>
private void KillClient(SocketStatus status)
{
KillStream();
if (Client != null)
{
Client.Disconnect();
Client = null;
ClientStatus = SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY;
ClientStatus = status;
Debug.Console(1, this, "Disconnected");
}
}
@@ -297,12 +303,8 @@ namespace PepperDash.Core
/// </summary>
void HandleConnectionFailure()
{
if (Client != null)
{
Client.Disconnect();
Client = null;
}
KillStream();
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
Debug.Console(2, this, "Client nulled due to connection failure. AutoReconnect: {0}, ConnectEnabled: {1}", AutoReconnect, ConnectEnabled);
if (AutoReconnect && ConnectEnabled)
@@ -327,24 +329,20 @@ namespace PepperDash.Core
}
}
/// <summary>
/// Kills the stream
/// </summary>
void KillStream()
{
if (TheStream != null)
{
TheStream.DataReceived -= Stream_DataReceived;
//TheStream.ErrorOccurred -= TheStream_ErrorOccurred;
TheStream.Close();
TheStream.Dispose();
TheStream = null;
}
}
//bool PropertiesHaveChanged()
//{
// return Hostname != PreviousHostname || Port != PreviousPort
// || Username != PreviousUsername || Password != PreviousPassword;
//}
/// <summary>
/// Handles the keyboard interactive authentication, should it be required.
/// </summary>
@@ -375,17 +373,6 @@ namespace PepperDash.Core
}
}
///// <summary>
///// Handler for errors on the stream...
///// </summary>
///// <param name="sender"></param>
///// <param name="e"></param>
//void TheStream_ErrorOccurred(object sender, ExceptionEventArgs e)
//{
// Debug.Console(1, this, "Unhandled SSH STREAM error: {0}", e.Exception);
// ClientStatus = SocketStatus.SOCKET_STATUS_BROKEN_REMOTELY;
// HandleConnectionFailure();
//}
/// <summary>
/// Error event handler for client events - disconnect, etc. Will forward those events via ConnectionChange
@@ -414,7 +401,7 @@ namespace PepperDash.Core
#region IBasicCommunication Members
/// <summary>
///
/// Sends text to the server
/// </summary>
/// <param name="text"></param>
public void SendText(string text)
@@ -435,6 +422,10 @@ namespace PepperDash.Core
}
}
/// <summary>
/// Sends Bytes to the server
/// </summary>
/// <param name="bytes"></param>
public void SendBytes(byte[] bytes)
{
try
@@ -463,16 +454,36 @@ namespace PepperDash.Core
/// </summary>
public class SshConnectionChangeEventArgs : EventArgs
{
/// <summary>
/// Connection State
/// </summary>
public bool IsConnected { get; private set; }
/// <summary>
/// Connection Status represented as a ushort
/// </summary>
public ushort UIsConnected { get { return (ushort)(Client.IsConnected ? 1 : 0); } }
/// <summary>
/// The client
/// </summary>
public GenericSshClient Client { get; private set; }
/// <summary>
/// Socket Status as represented by
/// </summary>
public ushort Status { get { return Client.UStatus; } }
// S+ Constructor
/// <summary>
/// S+ Constructor
/// </summary>
public SshConnectionChangeEventArgs() { }
/// <summary>
/// EventArgs class
/// </summary>
/// <param name="isConnected">Connection State</param>
/// <param name="client">The Client</param>
public SshConnectionChangeEventArgs(bool isConnected, GenericSshClient client)
{
IsConnected = isConnected;