mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-04 03:27:21 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
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);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |