| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | 
							- //
 
- // Authors:
 
- //   Ben Motmans <ben.motmans@gmail.com>
 
- //   Nicholas Terry <nick.i.terry@gmail.com>
 
- //
 
- // Copyright (C) 2007 Ben Motmans
 
- // Copyright (C) 2014 Nicholas Terry
 
- //
 
- // Permission is hereby granted, free of charge, to any person obtaining
 
- // a copy of this software and associated documentation files (the
 
- // "Software"), to deal in the Software without restriction, including
 
- // without limitation the rights to use, copy, modify, merge, publish,
 
- // distribute, sublicense, and/or sell copies of the Software, and to
 
- // permit persons to whom the Software is furnished to do so, subject to
 
- // the following conditions:
 
- // 
 
- // The above copyright notice and this permission notice shall be
 
- // included in all copies or substantial portions of the Software.
 
- // 
 
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
- //
 
- using System;
 
- using System.Net;
 
- using System.Net.Sockets;
 
- using System.Threading;
 
- using System.Linq;
 
- using System.Collections.Generic;
 
- using System.IO;
 
- using System.Net.NetworkInformation;
 
- using System.Threading.Tasks;
 
- using MediaBrowser.Common.Net;
 
- using MediaBrowser.Model.Dlna;
 
- using MediaBrowser.Model.Logging;
 
- namespace Mono.Nat
 
- {
 
-     public static class NatUtility
 
-     {
 
-         public static event EventHandler<DeviceEventArgs> DeviceFound;
 
-         public static event EventHandler<DeviceEventArgs> DeviceLost;
 
-         private static List<ISearcher> controllers;
 
-         private static bool verbose;
 
-         public static List<NatProtocol> EnabledProtocols { get; set; }
 
-         public static ILogger Logger { get; set; }
 
-         public static IHttpClient HttpClient { get; set; }
 
-         public static bool Verbose
 
-         {
 
-             get { return verbose; }
 
-             set { verbose = value; }
 
-         }
 
-         static NatUtility()
 
-         {
 
-             EnabledProtocols = new List<NatProtocol>
 
-             {
 
-                 NatProtocol.Pmp
 
-             };
 
-             controllers = new List<ISearcher>();
 
-             controllers.Add(PmpSearcher.Instance);
 
-             controllers.ForEach(searcher =>
 
-                 {
 
-                     searcher.DeviceFound += (sender, args) =>
 
-                     {
 
-                         if (DeviceFound != null)
 
-                             DeviceFound(sender, args);
 
-                     };
 
-                     searcher.DeviceLost += (sender, args) =>
 
-                     {
 
-                         if (DeviceLost != null)
 
-                             DeviceLost(sender, args);
 
-                     };
 
-                 });
 
-         }
 
-         internal static void Log(string format, params object[] args)
 
-         {
 
-             var logger = Logger;
 
-             if (logger != null)
 
-                 logger.Debug(format, args);
 
-         }
 
-         private static async Task SearchAndListen(CancellationToken cancellationToken)
 
-         {
 
-             while (!cancellationToken.IsCancellationRequested)
 
-             {
 
-                 try
 
-                 {
 
-                     if (EnabledProtocols.Contains(PmpSearcher.Instance.Protocol))
 
-                     {
 
-                         await Receive(PmpSearcher.Instance, PmpSearcher.sockets).ConfigureAwait(false);
 
-                     }
 
-                     foreach (ISearcher s in controllers)
 
-                     {
 
-                         if (s.NextSearch < DateTime.Now && EnabledProtocols.Contains(s.Protocol))
 
-                         {
 
-                             Log("Searching for: {0}", s.GetType().Name);
 
-                             s.Search();
 
-                         }
 
-                     }
 
-                 }
 
-                 catch (Exception e)
 
-                 {
 
-                 }
 
-                 await Task.Delay(100).ConfigureAwait(false);
 
-             }
 
-         }
 
-         static async Task Receive(ISearcher searcher, List<UdpClient> clients)
 
-         {
 
-             foreach (UdpClient client in clients)
 
-             {
 
-                 if (client.Available > 0)
 
-                 {
 
-                     IPAddress localAddress = ((IPEndPoint)client.Client.LocalEndPoint).Address;
 
-                     var result = await client.ReceiveAsync().ConfigureAwait(false);
 
-                     var data = result.Buffer;
 
-                     var received = result.RemoteEndPoint;
 
-                     searcher.Handle(localAddress, data, received);
 
-                 }
 
-             }
 
-         }
 
-         private static CancellationTokenSource _currentCancellationTokenSource;
 
-         private static object _runSyncLock = new object();
 
-         public static void StartDiscovery()
 
-         {
 
-             lock (_runSyncLock)
 
-             {
 
-                 if (_currentCancellationTokenSource == null)
 
-                 {
 
-                     return;
 
-                 }
 
-                 var tokenSource = new CancellationTokenSource();
 
-                 _currentCancellationTokenSource = tokenSource;
 
-                 //Task.Factory.StartNew(() => SearchAndListen(tokenSource.Token), tokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
 
-             }
 
-         }
 
-         public static void StopDiscovery()
 
-         {
 
-             lock (_runSyncLock)
 
-             {
 
-                 var tokenSource = _currentCancellationTokenSource;
 
-                 if (tokenSource != null)
 
-                 {
 
-                     try
 
-                     {
 
-                         tokenSource.Cancel();
 
-                         tokenSource.Dispose();
 
-                     }
 
-                     catch
 
-                     {
 
-                     }
 
-                     _currentCancellationTokenSource = null;
 
-                 }
 
-             }
 
-         }
 
-         //checks if an IP address is a private address space as defined by RFC 1918
 
-         public static bool IsPrivateAddressSpace(IPAddress address)
 
-         {
 
-             byte[] ba = address.GetAddressBytes();
 
-             switch ((int)ba[0])
 
-             {
 
-                 case 10:
 
-                     return true; //10.x.x.x
 
-                 case 172:
 
-                     return ((int)ba[1] & 16) != 0; //172.16-31.x.x
 
-                 case 192:
 
-                     return (int)ba[1] == 168; //192.168.x.x
 
-                 default:
 
-                     return false;
 
-             }
 
-         }
 
-         public static void Handle(IPAddress localAddress, byte[] response, IPEndPoint endpoint, NatProtocol protocol)
 
-         {
 
-             switch (protocol)
 
-             {
 
-                 case NatProtocol.Upnp:
 
-                     //UpnpSearcher.Instance.Handle(localAddress, response, endpoint);
 
-                     break;
 
-                 case NatProtocol.Pmp:
 
-                     PmpSearcher.Instance.Handle(localAddress, response, endpoint);
 
-                     break;
 
-                 default:
 
-                     throw new ArgumentException("Unexpected protocol: " + protocol);
 
-             }
 
-         }
 
-         public static void Handle(IPAddress localAddress, UpnpDeviceInfo deviceInfo, IPEndPoint endpoint, NatProtocol protocol)
 
-         {
 
-             switch (protocol)
 
-             {
 
-                 case NatProtocol.Upnp:
 
-                     var searcher = new UpnpSearcher(Logger, HttpClient);
 
-                     searcher.DeviceFound += Searcher_DeviceFound;
 
-                     searcher.Handle(localAddress, deviceInfo, endpoint);
 
-                     break;
 
-                 default:
 
-                     throw new ArgumentException("Unexpected protocol: " + protocol);
 
-             }
 
-         }
 
-         private static void Searcher_DeviceFound(object sender, DeviceEventArgs e)
 
-         {
 
-             if (DeviceFound != null)
 
-             {
 
-                 DeviceFound(sender, e);
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |