async Task Register(TorrentManager manager, bool isPublic) { CheckDisposed(); Check.Manager(manager); await MainLoop; if (Contains(manager.InfoHash)) { throw new TorrentException("A manager for this torrent has already been registered"); } allTorrents.Add(manager); if (isPublic) { publicTorrents.Add(manager); } ConnectionManager.Add(manager); listenManager.Add(manager.InfoHash); manager.DownloadLimiters.Add(downloadLimiters); manager.UploadLimiters.Add(uploadLimiters); if (DhtEngine != null && manager.Torrent?.Nodes != null && DhtEngine.State != DhtState.Ready) { try { DhtEngine.Add(manager.Torrent.Nodes.OfType <BEncodedString> ().Select(t => t.AsMemory().ToArray())); } catch { // FIXME: Should log this somewhere, though it's not critical } } }
public async Task Register(TorrentManager manager) { CheckDisposed(); Check.Manager(manager); await MainLoop; if (manager.Engine != null) { throw new TorrentException("This manager has already been registered"); } if (Contains(manager.Torrent)) { throw new TorrentException("A manager for this torrent has already been registered"); } torrents.Add(manager); ConnectionManager.Add(manager); manager.Engine = this; manager.DownloadLimiters.Add(downloadLimiters); manager.UploadLimiters.Add(uploadLimiters); if (DhtEngine != null && manager.Torrent?.Nodes != null && DhtEngine.State != DhtState.Ready) { try { DhtEngine.Add(manager.Torrent.Nodes); } catch { // FIXME: Should log this somewhere, though it's not critical } } }
public async Task SortByLeastConnections() { var engine = new ClientEngine(EngineSettingsBuilder.CreateForTests()); var manager = new ConnectionManager("test", engine.Settings, engine.Factories, engine.DiskManager); var torrents = new[] { await engine.AddAsync(new MagnetLink (new InfoHash(Enumerable.Repeat((byte)0, 20).ToArray())), "tmp"), await engine.AddAsync(new MagnetLink (new InfoHash(Enumerable.Repeat((byte)1, 20).ToArray())), "tmp"), await engine.AddAsync(new MagnetLink (new InfoHash(Enumerable.Repeat((byte)2, 20).ToArray())), "tmp") }; torrents[0].Peers.ConnectedPeers.Add(PeerId.CreateNull(1)); torrents[0].Peers.ConnectedPeers.Add(PeerId.CreateNull(1)); torrents[2].Peers.ConnectedPeers.Add(PeerId.CreateNull(1)); foreach (var torrent in torrents) { manager.Add(torrent); } manager.TryConnect(); Assert.AreEqual(torrents[1], manager.Torrents[0]); Assert.AreEqual(torrents[2], manager.Torrents[1]); Assert.AreEqual(torrents[0], manager.Torrents[2]); }