public static async Task<ClientEngine> RestoreStateAsync (ReadOnlyMemory<byte> buffer, Factories factories)
        {
            var state = BEncodedValue.Decode<BEncodedDictionary> (buffer.Span);
            var engineSettings = Serializer.DeserializeEngineSettings ((BEncodedDictionary) state["Settings"]);

            var clientEngine = new ClientEngine (engineSettings, factories);
            TorrentManager manager;
            foreach (BEncodedDictionary torrent in (BEncodedList) state[nameof (clientEngine.Torrents)]) {
                var saveDirectory = ((BEncodedString) torrent[nameof (manager.SavePath)]).Text;
                var streaming = bool.Parse (((BEncodedString) torrent["Streaming"]).Text);
                var torrentSettings = Serializer.DeserializeTorrentSettings ((BEncodedDictionary) torrent[nameof (manager.Settings)]);

                if (torrent.ContainsKey (nameof (manager.MetadataPath))) {
                    var metadataPath = (BEncodedString) torrent[nameof (manager.MetadataPath)];
                    if (streaming)
                        manager = await clientEngine.AddStreamingAsync (metadataPath.Text, saveDirectory, torrentSettings);
                    else
                        manager = await clientEngine.AddAsync (metadataPath.Text, saveDirectory, torrentSettings);

                    foreach (BEncodedDictionary file in (BEncodedList) torrent[nameof (manager.Files)]) {
                        TorrentFileInfo torrentFile;
                        torrentFile = (TorrentFileInfo) manager.Files.Single (t => t.Path == ((BEncodedString) file[nameof (torrentFile.Path)]).Text);
                        torrentFile.Priority = (Priority) Enum.Parse (typeof (Priority), file[nameof (torrentFile.Priority)].ToString ()!);
                        torrentFile.FullPath = ((BEncodedString) file[nameof (torrentFile.FullPath)]).Text;
                    }
                } else {
                    var magnetLink = MagnetLink.Parse (torrent[nameof (manager.MagnetLink)].ToString ()!);
                    if (streaming)
                        await clientEngine.AddStreamingAsync (magnetLink, saveDirectory, torrentSettings);
                    else
                        await clientEngine.AddAsync (magnetLink, saveDirectory, torrentSettings);
                }
            }
            return clientEngine;
        }
示例#2
0
        public async Task SaveRestoreState_OneTorrentFile_NoContainingDirectory()
        {
            var pieceLength = Constants.BlockSize * 4;

            using var tmpDir = TempDir.Create();

            TestRig.CreateMultiFileTorrent(TorrentFile.Create(pieceLength, Constants.BlockSize, Constants.BlockSize * 2, Constants.BlockSize * 3), pieceLength, out BEncoding.BEncodedDictionary metadata);
            var metadataFile = Path.Combine(tmpDir.Path, "test.torrent");

            File.WriteAllBytes(metadataFile, metadata.Encode());

            var engine = new ClientEngine(EngineSettingsBuilder.CreateForTests(cacheDirectory: tmpDir.Path));
            await engine.AddStreamingAsync(metadataFile, "mySaveDirectory", new TorrentSettingsBuilder { CreateContainingDirectory = false }.ToSettings());

            var restoredEngine = await ClientEngine.RestoreStateAsync(await engine.SaveStateAsync());

            Assert.AreEqual(engine.Settings, restoredEngine.Settings);
            Assert.AreEqual(engine.Torrents[0].Torrent.Name, restoredEngine.Torrents[0].Torrent.Name);
            Assert.AreEqual(engine.Torrents[0].SavePath, restoredEngine.Torrents[0].SavePath);
            Assert.AreEqual(engine.Torrents[0].Settings, restoredEngine.Torrents[0].Settings);
            Assert.AreEqual(engine.Torrents[0].InfoHash, restoredEngine.Torrents[0].InfoHash);
            Assert.AreEqual(engine.Torrents[0].MagnetLink.ToV1String(), restoredEngine.Torrents[0].MagnetLink.ToV1String());

            Assert.AreEqual(engine.Torrents[0].Files.Count, restoredEngine.Torrents[0].Files.Count);
            for (int i = 0; i < engine.Torrents.Count; i++)
            {
                Assert.AreEqual(engine.Torrents[0].Files[i].FullPath, restoredEngine.Torrents[0].Files[i].FullPath);
                Assert.AreEqual(engine.Torrents[0].Files[i].Priority, restoredEngine.Torrents[0].Files[i].Priority);
            }
        }
示例#3
0
        public async Task SaveRestoreState_OneInMemoryTorrent(bool addStreaming)
        {
            var pieceLength = Constants.BlockSize * 4;

            using var tmpDir = TempDir.Create();

            var torrent = TestRig.CreateMultiFileTorrent(TorrentFile.Create(pieceLength, Constants.BlockSize, Constants.BlockSize * 2, Constants.BlockSize * 3), pieceLength, out BEncoding.BEncodedDictionary metadata);

            var            engine = new ClientEngine(EngineSettingsBuilder.CreateForTests(cacheDirectory: tmpDir.Path));
            TorrentManager torrentManager;

            if (addStreaming)
            {
                torrentManager = await engine.AddStreamingAsync(torrent, "mySaveDirectory", new TorrentSettingsBuilder { CreateContainingDirectory = true }.ToSettings());
            }
            else
            {
                torrentManager = await engine.AddAsync(torrent, "mySaveDirectory", new TorrentSettingsBuilder { CreateContainingDirectory = true }.ToSettings());
            }

            await torrentManager.SetFilePriorityAsync(torrentManager.Files[0], Priority.High);

            await torrentManager.MoveFileAsync(torrentManager.Files[1], Path.GetFullPath("some_fake_path.txt"));

            var restoredEngine = await ClientEngine.RestoreStateAsync(await engine.SaveStateAsync());

            Assert.AreEqual(engine.Settings, restoredEngine.Settings);
            Assert.AreEqual(engine.Torrents[0].Torrent.Name, restoredEngine.Torrents[0].Torrent.Name);
            Assert.AreEqual(engine.Torrents[0].SavePath, restoredEngine.Torrents[0].SavePath);
            Assert.AreEqual(engine.Torrents[0].Settings, restoredEngine.Torrents[0].Settings);
            Assert.AreEqual(engine.Torrents[0].InfoHash, restoredEngine.Torrents[0].InfoHash);
            Assert.AreEqual(engine.Torrents[0].MagnetLink.ToV1String(), restoredEngine.Torrents[0].MagnetLink.ToV1String());

            Assert.AreEqual(engine.Torrents[0].Files.Count, restoredEngine.Torrents[0].Files.Count);
            for (int i = 0; i < engine.Torrents.Count; i++)
            {
                Assert.AreEqual(engine.Torrents[0].Files[i].FullPath, restoredEngine.Torrents[0].Files[i].FullPath);
                Assert.AreEqual(engine.Torrents[0].Files[i].Priority, restoredEngine.Torrents[0].Files[i].Priority);
            }
        }
示例#4
0
        public async Task SaveRestoreState_OneMagnetLink(bool addStreaming)
        {
            var engine = new ClientEngine(EngineSettingsBuilder.CreateForTests());

            if (addStreaming)
            {
                await engine.AddStreamingAsync(new MagnetLink (new InfoHash(new byte[20]), "test"), "mySaveDirectory", new TorrentSettingsBuilder { CreateContainingDirectory = false }.ToSettings());
            }
            else
            {
                await engine.AddAsync(new MagnetLink (new InfoHash(new byte[20]), "test"), "mySaveDirectory", new TorrentSettingsBuilder { CreateContainingDirectory = false }.ToSettings());
            }

            var restoredEngine = await ClientEngine.RestoreStateAsync(await engine.SaveStateAsync());

            Assert.AreEqual(engine.Settings, restoredEngine.Settings);
            Assert.AreEqual(engine.Torrents[0].SavePath, restoredEngine.Torrents[0].SavePath);
            Assert.AreEqual(engine.Torrents[0].Settings, restoredEngine.Torrents[0].Settings);
            Assert.AreEqual(engine.Torrents[0].InfoHash, restoredEngine.Torrents[0].InfoHash);
            Assert.AreEqual(engine.Torrents[0].MagnetLink.ToV1Uri(), restoredEngine.Torrents[0].MagnetLink.ToV1Uri());
            Assert.AreEqual(engine.Torrents[0].Files, restoredEngine.Torrents[0].Files);
        }