blob: 3ed01a6b3cdcfe653e12c998c6289161da154a9a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
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);
}
}
}
}
|