Пример #1
0
        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
                }
            }
        }
Пример #2
0
        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]);
        }