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 } }