using Alchemy;
using Alchemy.Classes;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Logging;
using System;
using System.Net;
namespace MediaBrowser.Server.Implementations.WebSocket
{
///
/// Class AlchemyServer
///
public class AlchemyServer : IWebSocketServer
{
///
/// Occurs when [web socket connected].
///
public event EventHandler WebSocketConnected;
///
/// Gets or sets the web socket server.
///
/// The web socket server.
private WebSocketServer WebSocketServer { get; set; }
///
/// The _logger
///
private readonly ILogger _logger;
///
/// Initializes a new instance of the class.
///
/// The logger.
/// logger
public AlchemyServer(ILogger logger)
{
if (logger == null)
{
throw new ArgumentNullException("logger");
}
_logger = logger;
}
///
/// Gets the port.
///
/// The port.
public int Port { get; private set; }
///
/// Starts the specified port number.
///
/// The port number.
public void Start(int portNumber)
{
WebSocketServer = new WebSocketServer(portNumber, IPAddress.Any)
{
OnConnected = OnAlchemyWebSocketClientConnected,
TimeOut = TimeSpan.FromHours(12)
};
WebSocketServer.Start();
Port = portNumber;
_logger.Info("Alchemy Web Socket Server started");
}
///
/// Called when [alchemy web socket client connected].
///
/// The context.
private void OnAlchemyWebSocketClientConnected(UserContext context)
{
if (WebSocketConnected != null)
{
var socket = new AlchemyWebSocket(context, _logger);
WebSocketConnected(this, new WebSocketConnectEventArgs
{
WebSocket = socket,
Endpoint = context.ClientAddress.ToString()
});
}
}
///
/// Stops this instance.
///
public void Stop()
{
if (WebSocketServer != null)
{
WebSocketServer.Stop();
}
}
///
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
///
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
///
/// Releases unmanaged and - optionally - managed resources.
///
/// true to release both managed and unmanaged resources; false to release only unmanaged resources.
protected virtual void Dispose(bool dispose)
{
if (WebSocketServer != null)
{
WebSocketServer.Dispose();
}
}
}
}