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; }
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); } }
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); } }
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); }