public ClientEngine (EngineSettings settings, Factories factories) { settings = settings ?? throw new ArgumentNullException (nameof (settings)); Factories = factories ?? throw new ArgumentNullException (nameof (factories)); // This is just a sanity check to make sure the ReusableTasks.dll assembly is // loadable. GC.KeepAlive (ReusableTasks.ReusableTask.CompletedTask); PeerId = GeneratePeerId (); Settings = settings ?? throw new ArgumentNullException (nameof (settings)); CheckSettingsAreValid (Settings); allTorrents = new List<TorrentManager> (); dhtNodeLocker = new SemaphoreSlim (1, 1); publicTorrents = new List<TorrentManager> (); Torrents = new ReadOnlyCollection<TorrentManager> (publicTorrents); DiskManager = new DiskManager (Settings, Factories); ConnectionManager = new ConnectionManager (PeerId, Settings, Factories, DiskManager); listenManager = new ListenManager (this); PortForwarder = Factories.CreatePortForwarder (); MainLoop.QueueTimeout (TimeSpan.FromMilliseconds (TickLength), delegate { if (IsRunning && !Disposed) LogicTick (); return !Disposed; }); downloadLimiter = new RateLimiter (); downloadLimiters = new RateLimiterGroup { new DiskWriterLimiter(DiskManager), downloadLimiter, }; uploadLimiter = new RateLimiter (); uploadLimiters = new RateLimiterGroup { uploadLimiter }; PeerListener = (settings.ListenEndPoint == null ? null : Factories.CreatePeerConnectionListener (settings.ListenEndPoint)) ?? new NullPeerListener (); listenManager.SetListener (PeerListener); DhtListener = (settings.DhtEndPoint == null ? null : Factories.CreateDhtListener (settings.DhtEndPoint)) ?? new NullDhtListener (); DhtEngine = (settings.DhtEndPoint == null ? null : Factories.CreateDht ()) ?? new NullDhtEngine (); Dht = new DhtEngineWrapper (DhtEngine); DhtEngine.SetListenerAsync (DhtListener).GetAwaiter ().GetResult (); DhtEngine.StateChanged += DhtEngineStateChanged; DhtEngine.PeersFound += DhtEnginePeersFound; LocalPeerDiscovery = new NullLocalPeerDiscovery (); RegisterLocalPeerDiscovery (settings.AllowLocalPeerDiscovery ? Factories.CreateLocalPeerDiscovery () : null); }
void RegisterLocalPeerDiscovery(ILocalPeerDiscovery localPeerDiscovery) { if (LocalPeerDiscovery != null) { LocalPeerDiscovery.PeerFound -= HandleLocalPeerFound; LocalPeerDiscovery.Stop(); } if (!SupportsLocalPeerDiscovery || localPeerDiscovery == null) { localPeerDiscovery = new NullLocalPeerDiscovery(); } LocalPeerDiscovery = localPeerDiscovery; if (LocalPeerDiscovery != null) { LocalPeerDiscovery.PeerFound += HandleLocalPeerFound; if (IsRunning) { LocalPeerDiscovery.Start(); } } }