|
|
|
using System;
|
|
|
|
using System.Net;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using MediaBrowser.Common.Net;
|
|
|
|
using MediaBrowser.Model.Dlna;
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
namespace Mono.Nat
|
|
|
|
{
|
|
|
|
public class NatManager : IDisposable
|
|
|
|
{
|
|
|
|
public event EventHandler<DeviceEventArgs> DeviceFound;
|
|
|
|
|
|
|
|
private List<ISearcher> controllers = new List<ISearcher>();
|
|
|
|
|
|
|
|
private ILogger Logger;
|
|
|
|
private IHttpClient HttpClient;
|
|
|
|
|
|
|
|
public NatManager(ILogger logger, IHttpClient httpClient)
|
|
|
|
{
|
|
|
|
Logger = logger;
|
|
|
|
HttpClient = httpClient;
|
|
|
|
}
|
|
|
|
|
|
|
|
private object _runSyncLock = new object();
|
|
|
|
public void StartDiscovery()
|
|
|
|
{
|
|
|
|
lock (_runSyncLock)
|
|
|
|
{
|
|
|
|
if (controllers.Count > 0)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
controllers.Add(new PmpSearcher(Logger));
|
|
|
|
|
|
|
|
foreach (var searcher in controllers)
|
|
|
|
{
|
|
|
|
searcher.DeviceFound += Searcher_DeviceFound;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void StopDiscovery()
|
|
|
|
{
|
|
|
|
lock (_runSyncLock)
|
|
|
|
{
|
|
|
|
var disposables = controllers.OfType<IDisposable>().ToList();
|
|
|
|
controllers.Clear();
|
|
|
|
|
|
|
|
foreach (var disposable in disposables)
|
|
|
|
{
|
|
|
|
disposable.Dispose();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
{
|
|
|
|
StopDiscovery();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Task Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint, NatProtocol protocol)
|
|
|
|
{
|
|
|
|
switch (protocol)
|
|
|
|
{
|
|
|
|
case NatProtocol.Upnp:
|
|
|
|
var searcher = new UpnpSearcher(Logger, HttpClient);
|
|
|
|
searcher.DeviceFound += Searcher_DeviceFound;
|
|
|
|
return searcher.Handle(localAddress, deviceInfo, endpoint);
|
|
|
|
default:
|
|
|
|
throw new ArgumentException("Unexpected protocol: " + protocol);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void Searcher_DeviceFound(object sender, DeviceEventArgs e)
|
|
|
|
{
|
|
|
|
if (DeviceFound != null)
|
|
|
|
{
|
|
|
|
DeviceFound(sender, e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|