NatManager.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Net;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5. using MediaBrowser.Common.Net;
  6. using MediaBrowser.Model.Dlna;
  7. using Microsoft.Extensions.Logging;
  8. using System.Linq;
  9. namespace Mono.Nat
  10. {
  11. public class NatManager : IDisposable
  12. {
  13. public event EventHandler<DeviceEventArgs> DeviceFound;
  14. private List<ISearcher> controllers = new List<ISearcher>();
  15. private ILogger Logger;
  16. private IHttpClient HttpClient;
  17. public NatManager(ILogger logger, IHttpClient httpClient)
  18. {
  19. Logger = logger;
  20. HttpClient = httpClient;
  21. }
  22. private object _runSyncLock = new object();
  23. public void StartDiscovery()
  24. {
  25. lock (_runSyncLock)
  26. {
  27. if (controllers.Count > 0)
  28. {
  29. return;
  30. }
  31. controllers.Add(new PmpSearcher(Logger));
  32. foreach (var searcher in controllers)
  33. {
  34. searcher.DeviceFound += Searcher_DeviceFound;
  35. }
  36. }
  37. }
  38. public void StopDiscovery()
  39. {
  40. lock (_runSyncLock)
  41. {
  42. var disposables = controllers.OfType<IDisposable>().ToList();
  43. controllers.Clear();
  44. foreach (var disposable in disposables)
  45. {
  46. disposable.Dispose();
  47. }
  48. }
  49. }
  50. public void Dispose()
  51. {
  52. StopDiscovery();
  53. }
  54. public Task Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint, NatProtocol protocol)
  55. {
  56. switch (protocol)
  57. {
  58. case NatProtocol.Upnp:
  59. var searcher = new UpnpSearcher(Logger, HttpClient);
  60. searcher.DeviceFound += Searcher_DeviceFound;
  61. return searcher.Handle(localAddress, deviceInfo, endpoint);
  62. default:
  63. throw new ArgumentException("Unexpected protocol: " + protocol);
  64. }
  65. }
  66. private void Searcher_DeviceFound(object sender, DeviceEventArgs e)
  67. {
  68. if (DeviceFound != null)
  69. {
  70. DeviceFound(sender, e);
  71. }
  72. }
  73. }
  74. }