moved some network code to the networking assembly

This commit is contained in:
LukePulverenti
2013-02-23 12:54:51 -05:00
parent 17c1fd5760
commit 465f0cc1e2
43 changed files with 505 additions and 179 deletions

View File

@@ -1,5 +1,4 @@
using MediaBrowser.Common.Events;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Common.ScheduledTasks;
@@ -396,7 +395,7 @@ namespace MediaBrowser.Common.Kernel
await ReloadComposableParts().ConfigureAwait(false);
DisposeTcpManager();
TcpManager = new TcpManager(ApplicationHost, this, Logger);
TcpManager = new TcpManager(ApplicationHost, this, ApplicationHost.Resolve<INetworkManager>(), Logger);
}
/// <summary>

View File

@@ -1,49 +0,0 @@
using System;
namespace MediaBrowser.Common.Kernel
{
/// <summary>
/// Class BaseManager
/// </summary>
/// <typeparam name="TKernelType">The type of the T kernel type.</typeparam>
public abstract class BaseManager<TKernelType> : IDisposable
where TKernelType : class, IKernel
{
/// <summary>
/// The _kernel
/// </summary>
protected readonly TKernelType Kernel;
/// <summary>
/// Initializes a new instance of the <see cref="BaseManager" /> class.
/// </summary>
/// <param name="kernel">The kernel.</param>
/// <exception cref="System.ArgumentNullException">kernel</exception>
protected BaseManager(TKernelType kernel)
{
if (kernel == null)
{
throw new ArgumentNullException("kernel");
}
Kernel = kernel;
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Releases unmanaged and - optionally - managed resources.
/// </summary>
/// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool dispose)
{
}
}
}

View File

@@ -58,6 +58,13 @@ namespace MediaBrowser.Common.Kernel
/// <param name="obj">The obj.</param>
void Register<T>(T obj) where T : class;
/// <summary>
/// Registers the specified service type.
/// </summary>
/// <param name="serviceType">Type of the service.</param>
/// <param name="implementation">Type of the implementation.</param>
void Register(Type serviceType, Type implementation);
/// <summary>
/// Resolves this instance.
/// </summary>

View File

@@ -22,7 +22,7 @@ namespace MediaBrowser.Common.Kernel
/// <summary>
/// Manages the Http Server, Udp Server and WebSocket connections
/// </summary>
public class TcpManager : BaseManager<IKernel>
public class TcpManager : IDisposable
{
/// <summary>
/// This is the udp server used for server discovery by clients
@@ -65,6 +65,11 @@ namespace MediaBrowser.Common.Kernel
/// </summary>
private readonly ILogger _logger;
/// <summary>
/// The _network manager
/// </summary>
private readonly INetworkManager _networkManager;
/// <summary>
/// The _application host
/// </summary>
@@ -75,6 +80,11 @@ namespace MediaBrowser.Common.Kernel
/// </summary>
private bool? _supportsNativeWebSocket;
/// <summary>
/// The _kernel
/// </summary>
private readonly IKernel _kernel;
/// <summary>
/// Gets a value indicating whether [supports web socket].
/// </summary>
@@ -107,7 +117,7 @@ namespace MediaBrowser.Common.Kernel
/// <value>The web socket port number.</value>
public int WebSocketPortNumber
{
get { return SupportsNativeWebSocket ? Kernel.Configuration.HttpServerPortNumber : Kernel.Configuration.LegacyWebSocketPortNumber; }
get { return SupportsNativeWebSocket ? _kernel.Configuration.HttpServerPortNumber : _kernel.Configuration.LegacyWebSocketPortNumber; }
}
/// <summary>
@@ -115,12 +125,31 @@ namespace MediaBrowser.Common.Kernel
/// </summary>
/// <param name="applicationHost">The application host.</param>
/// <param name="kernel">The kernel.</param>
/// <param name="networkManager">The network manager.</param>
/// <param name="logger">The logger.</param>
public TcpManager(IApplicationHost applicationHost, IKernel kernel, ILogger logger)
: base(kernel)
public TcpManager(IApplicationHost applicationHost, IKernel kernel, INetworkManager networkManager, ILogger logger)
{
if (applicationHost == null)
{
throw new ArgumentNullException("applicationHost");
}
if (kernel == null)
{
throw new ArgumentNullException("kernel");
}
if (networkManager == null)
{
throw new ArgumentNullException("networkManager");
}
if (logger == null)
{
throw new ArgumentNullException("logger");
}
_logger = logger;
_kernel = kernel;
_applicationHost = applicationHost;
_networkManager = networkManager;
if (kernel.IsFirstRun)
{
@@ -142,14 +171,14 @@ namespace MediaBrowser.Common.Kernel
private void ReloadExternalWebSocketServer()
{
// Avoid windows firewall prompts in the ui
if (Kernel.KernelContext != KernelContext.Server)
if (_kernel.KernelContext != KernelContext.Server)
{
return;
}
DisposeExternalWebSocketServer();
ExternalWebSocketServer = new WebSocketServer(Kernel.Configuration.LegacyWebSocketPortNumber, IPAddress.Any)
ExternalWebSocketServer = new WebSocketServer(_kernel.Configuration.LegacyWebSocketPortNumber, IPAddress.Any)
{
OnConnected = OnAlchemyWebSocketClientConnected,
TimeOut = TimeSpan.FromMinutes(60)
@@ -178,7 +207,7 @@ namespace MediaBrowser.Common.Kernel
public void ReloadHttpServer(bool registerServerOnFailure = true)
{
// Only reload if the port has changed, so that we don't disconnect any active users
if (HttpServer != null && HttpServer.UrlPrefix.Equals(Kernel.HttpServerUrlPrefix, StringComparison.OrdinalIgnoreCase))
if (HttpServer != null && HttpServer.UrlPrefix.Equals(_kernel.HttpServerUrlPrefix, StringComparison.OrdinalIgnoreCase))
{
return;
}
@@ -189,7 +218,7 @@ namespace MediaBrowser.Common.Kernel
try
{
HttpServer = new HttpServer(Kernel.HttpServerUrlPrefix, "Media Browser", _applicationHost, Kernel, _logger);
HttpServer = new HttpServer(_kernel.HttpServerUrlPrefix, "Media Browser", _applicationHost, _kernel, _logger);
}
catch (HttpListenerException ex)
{
@@ -229,7 +258,7 @@ namespace MediaBrowser.Common.Kernel
/// <param name="result">The result.</param>
private async void ProcessWebSocketMessageReceived(WebSocketMessageInfo result)
{
var tasks = Kernel.WebSocketListeners.Select(i => Task.Run(async () =>
var tasks = _kernel.WebSocketListeners.Select(i => Task.Run(async () =>
{
try
{
@@ -256,7 +285,7 @@ namespace MediaBrowser.Common.Kernel
}
// Avoid windows firewall prompts in the ui
if (Kernel.KernelContext != KernelContext.Server)
if (_kernel.KernelContext != KernelContext.Server)
{
return;
}
@@ -266,7 +295,7 @@ namespace MediaBrowser.Common.Kernel
try
{
// The port number can't be in configuration because we don't want it to ever change
UdpServer = new UdpServer(new IPEndPoint(IPAddress.Any, Kernel.UdpServerPortNumber));
UdpServer = new UdpServer(new IPEndPoint(IPAddress.Any, _kernel.UdpServerPortNumber));
}
catch (SocketException ex)
{
@@ -276,7 +305,7 @@ namespace MediaBrowser.Common.Kernel
UdpListener = UdpServer.Subscribe(async res =>
{
var expectedMessage = String.Format("who is MediaBrowser{0}?", Kernel.KernelContext);
var expectedMessage = String.Format("who is MediaBrowser{0}?", _kernel.KernelContext);
var expectedMessageBytes = Encoding.UTF8.GetBytes(expectedMessage);
if (expectedMessageBytes.SequenceEqual(res.Buffer))
@@ -284,7 +313,7 @@ namespace MediaBrowser.Common.Kernel
_logger.Info("Received UDP server request from " + res.RemoteEndPoint.ToString());
// Send a response back with our ip address and port
var response = String.Format("MediaBrowser{0}|{1}:{2}", Kernel.KernelContext, NetUtils.GetLocalIpAddress(), Kernel.UdpServerPortNumber);
var response = String.Format("MediaBrowser{0}|{1}:{2}", _kernel.KernelContext, _networkManager.GetLocalIpAddress(), _kernel.UdpServerPortNumber);
await UdpServer.SendAsync(response, res.RemoteEndPoint);
}
@@ -422,7 +451,7 @@ namespace MediaBrowser.Common.Kernel
private void RegisterServerWithAdministratorAccess()
{
// Create a temp file path to extract the bat file to
var tmpFile = Path.Combine(Kernel.ApplicationPaths.TempDirectory, Guid.NewGuid() + ".bat");
var tmpFile = Path.Combine(_kernel.ApplicationPaths.TempDirectory, Guid.NewGuid() + ".bat");
// Extract the bat file
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MediaBrowser.Common.Kernel.RegisterServer.bat"))
@@ -437,10 +466,10 @@ namespace MediaBrowser.Common.Kernel
{
FileName = tmpFile,
Arguments = string.Format("{0} {1} {2} {3}", Kernel.Configuration.HttpServerPortNumber,
Kernel.HttpServerUrlPrefix,
Kernel.UdpServerPortNumber,
Kernel.Configuration.LegacyWebSocketPortNumber),
Arguments = string.Format("{0} {1} {2} {3}", _kernel.Configuration.HttpServerPortNumber,
_kernel.HttpServerUrlPrefix,
_kernel.UdpServerPortNumber,
_kernel.Configuration.LegacyWebSocketPortNumber),
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
@@ -454,19 +483,26 @@ namespace MediaBrowser.Common.Kernel
}
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Releases unmanaged and - optionally - managed resources.
/// </summary>
/// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected override void Dispose(bool dispose)
protected virtual void Dispose(bool dispose)
{
if (dispose)
{
DisposeUdpServer();
DisposeHttpServer();
}
base.Dispose(dispose);
}
/// <summary>