diff options
| author | stefan <stefan@hegedues.at> | 2018-09-12 19:26:21 +0200 |
|---|---|---|
| committer | stefan <stefan@hegedues.at> | 2018-09-12 19:26:21 +0200 |
| commit | 48facb797ed912e4ea6b04b17d1ff190ac2daac4 (patch) | |
| tree | 8dae77a31670a888d733484cb17dd4077d5444e8 /Mono.Nat/NatManager.cs | |
| parent | c32d8656382a0eacb301692e0084377fc433ae9b (diff) | |
Update to 3.5.2 and .net core 2.1
Diffstat (limited to 'Mono.Nat/NatManager.cs')
| -rw-r--r-- | Mono.Nat/NatManager.cs | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/Mono.Nat/NatManager.cs b/Mono.Nat/NatManager.cs new file mode 100644 index 000000000..752fd0416 --- /dev/null +++ b/Mono.Nat/NatManager.cs @@ -0,0 +1,86 @@ +using System; +using System.Net; +using System.Collections.Generic; +using System.Threading.Tasks; +using MediaBrowser.Common.Net; +using MediaBrowser.Model.Dlna; +using MediaBrowser.Model.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); + } + } + } +} |
