namespace WatsonTcp
{
using System;
///
/// Watson TCP server events.
///
public class WatsonTcpServerEvents
{
#region Public-Members
///
/// Event to fire when authentication is requested from a client.
///
public event EventHandler AuthenticationRequested;
///
/// Event to fire when a client successfully authenticates.
///
public event EventHandler AuthenticationSucceeded;
///
/// Event to fire when a client fails authentication.
///
public event EventHandler AuthenticationFailed;
///
/// Event to fire when a client connects to the server.
/// The IP:port of the client is passed in the arguments.
///
public event EventHandler ClientConnected;
///
/// Event to fire when a client disconnects from the server.
/// The IP:port is passed in the arguments along with the reason for the disconnection.
///
public event EventHandler ClientDisconnected;
///
/// This event is fired when a message is received from a client and it is desired that WatsonTcp pass the byte array containing the message payload.
/// If MessageReceived is set, StreamReceived will not be used.
///
public event EventHandler MessageReceived;
///
/// This event is fired when a stream is received from a client and it is desired that WatsonTcp pass the stream containing the message payload to your application.
/// If MessageReceived is set, StreamReceived will not be used.
///
public event EventHandler StreamReceived;
///
/// This event is fired when the server is started.
///
public event EventHandler ServerStarted;
///
/// This event is fired when the server is stopped.
///
public event EventHandler ServerStopped;
///
/// This event is fired when an exception is encountered.
///
public event EventHandler ExceptionEncountered;
#endregion
#region Internal-Members
internal bool IsUsingMessages
{
get
{
if (MessageReceived != null && MessageReceived.GetInvocationList().Length > 0) return true;
return false;
}
}
internal bool IsUsingStreams
{
get
{
if (StreamReceived != null && StreamReceived.GetInvocationList().Length > 0) return true;
return false;
}
}
#endregion
#region Private-Members
#endregion
#region Constructors-and-Factories
///
/// Instantiate.
///
public WatsonTcpServerEvents()
{
}
#endregion
#region Public-Methods
#endregion
#region Internal-Methods
internal void HandleAuthenticationRequested(object sender, AuthenticationRequestedEventArgs args)
{
WrappedEventHandler(() => AuthenticationRequested?.Invoke(sender, args), "AuthenticationRequested", sender);
}
internal void HandleAuthenticationSucceeded(object sender, AuthenticationSucceededEventArgs args)
{
WrappedEventHandler(() => AuthenticationSucceeded?.Invoke(sender, args), "AuthenticationSucceeded", sender);
}
internal void HandleAuthenticationFailed(object sender, AuthenticationFailedEventArgs args)
{
WrappedEventHandler(() => AuthenticationFailed?.Invoke(sender, args), "AuthenticationFailed", sender);
}
internal void HandleClientConnected(object sender, ConnectionEventArgs args)
{
WrappedEventHandler(() => ClientConnected?.Invoke(sender, args), "ClientConnected", sender);
}
internal void HandleClientDisconnected(object sender, DisconnectionEventArgs args)
{
WrappedEventHandler(() => ClientDisconnected?.Invoke(sender, args), "ClientDisconnected", sender);
}
internal void HandleMessageReceived(object sender, MessageReceivedEventArgs args)
{
WrappedEventHandler(() => MessageReceived?.Invoke(sender, args), "MessageReceived", sender);
}
internal void HandleStreamReceived(object sender, StreamReceivedEventArgs args)
{
WrappedEventHandler(() => StreamReceived?.Invoke(sender, args), "StreamReceived", sender);
}
internal void HandleServerStarted(object sender, EventArgs args)
{
WrappedEventHandler(() => ServerStarted?.Invoke(sender, args), "ServerStarted", sender);
}
internal void HandleServerStopped(object sender, EventArgs args)
{
WrappedEventHandler(() => ServerStopped?.Invoke(sender, args), "ServerStopped", sender);
}
internal void HandleExceptionEncountered(object sender, ExceptionEventArgs args)
{
WrappedEventHandler(() => ExceptionEncountered?.Invoke(sender, args), "ExceptionEncountered", sender);
}
#endregion
#region Private-Methods
internal void WrappedEventHandler(Action action, string handler, object sender)
{
if (action == null) return;
Action logger = ((WatsonTcpServer)sender).Settings.Logger;
try
{
action.Invoke();
}
catch (Exception e)
{
logger?.Invoke(Severity.Error, "Event handler exception in " + handler + ": " + Environment.NewLine + e.ToString());
}
}
#endregion
}
}