1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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);
- }
- }
- }
- }
|