public void FillFromSession() { data.files = new Partfile[file.paths == null ? 1 : file.paths.Count]; data.filesIncludes = new List <string>(); Partfiles.Options opt = new Partfiles.Options(); opt.AutoCreate = true; long startPos = 0; if (data.folder != null) { data.folder = Path.Combine(bitSwarm.OptionsClone.FolderComplete, Utils.GetValidPathName(file.name)); data.folderTemp = Path.Combine(bitSwarm.OptionsClone.FolderIncomplete, Utils.GetValidPathName(file.name)); opt.Folder = data.folder; for (int i = 0; i < file.paths.Count; i++) { if (!File.Exists(Path.Combine(data.folder, file.paths[i])) && File.Exists(Path.Combine(data.folderTemp, file.paths[i] + opt.PartExtension))) { data.files[i] = new Partfile(Path.Combine(data.folderTemp, file.paths[i] + opt.PartExtension), true, opt); } data.filesIncludes.Add(file.paths[i]); startPos += file.lengths[i]; } } else { opt.Folder = bitSwarm.OptionsClone.FolderComplete; string validFilename = Utils.GetValidFileName(file.name); if (!File.Exists(Path.Combine(bitSwarm.OptionsClone.FolderComplete, validFilename)) && File.Exists(Path.Combine(bitSwarm.OptionsClone.FolderIncomplete, validFilename + opt.PartExtension))) { data.files[0] = new Partfile(Path.Combine(bitSwarm.OptionsClone.FolderIncomplete, validFilename + opt.PartExtension), true, opt); } data.filesIncludes.Add(file.name); } bool allNull = true; for (int i = 0; i < data.files.Length; i++) { if (data.files[i] != null) { allNull = false; break; } } if (allNull) { throw new Exception($"The loaded session either is already completed or is invalid (Session File: {bitSwarm.LoadedSessionFile})"); } data.progress = new Bitfield(data.pieces); data.progressPrev = new Bitfield(data.pieces); data.pieceProgress = new Dictionary <int, TorrentData.PieceProgress>(); long curSize = 0; int curFile = 0; int prevFile = -1; long firstByte; for (int piece = 0; piece < data.pieces; piece++) { firstByte = (long)piece * file.pieceLength; for (int i = curFile; i < file.lengths.Count; i++) { curFile = i; if (prevFile != curFile) { curSize += file.lengths[i]; } if (firstByte < curSize) { int chunkId = (int)(((firstByte + file.pieceLength - 1) - (curSize - file.lengths[i])) / file.pieceLength); if (data.files[i] == null || data.files[i].MapChunkIdToChunkPos.ContainsKey(chunkId)) { if (piece == data.pieces - 1) { bitSwarm.Stats.BytesDownloadedPrevSession += data.pieceLastSize; } else { bitSwarm.Stats.BytesDownloadedPrevSession += data.pieceSize; } data.progress.SetBit(piece); } prevFile = curFile; break; } prevFile = curFile; } } data.requests = data.progress.Clone(); }
public void FillFromInfo(BDictionary bInfo) { if (bitSwarm.OptionsClone.FolderComplete == null) { bitSwarm.StopWithError("[CRITICAL] Folder Complete cannot be empty"); } bool isMultiFile = (BList)bInfo["files"] == null ? false : true; file.pieces = GetHashesFromInfo(bInfo); file.pieceLength = (BNumber)bInfo["piece length"]; data.filesIncludes = new List <string>(); Partfiles.Options opt = new Partfiles.Options(); opt.AutoCreate = true; long startPos = 0; if (isMultiFile) { file.paths = GetPathsFromInfo(bInfo); data.files = new Partfile[file.paths.Count]; file.lengths = GetFileLengthsFromInfo(bInfo, out long tmpTotalSize); data.totalSize = tmpTotalSize; data.folder = Path.Combine(bitSwarm.OptionsClone.FolderComplete, Utils.GetValidPathName(file.name)); data.folderTemp = Path.Combine(bitSwarm.OptionsClone.FolderIncomplete, Utils.GetValidPathName(file.name)); if (Directory.Exists(data.folder)) { bitSwarm.StopWithError($"Torrent folder already exists! {data.folder}"); } if (Directory.Exists(data.folderTemp)) { Directory.Delete(data.folderTemp, true); } opt.Folder = data.folder; opt.PartFolder = data.folderTemp; for (int i = 0; i < file.paths.Count; i++) { data.files[i] = new Partfile(file.paths[i], file.pieceLength, file.lengths[i], opt); data.filesIncludes.Add(file.paths[i]); startPos += file.lengths[i]; } } else { file.length = (BNumber)bInfo["length"]; data.totalSize = file.length; data.files = new Partfile[1]; string filePath = Path.Combine(bitSwarm.OptionsClone.FolderComplete, Utils.GetValidFileName(file.name)); if (File.Exists(filePath)) { bitSwarm.StopWithError($"Torrent file already exists! {filePath}"); } opt.Folder = bitSwarm.OptionsClone.FolderComplete; opt.PartFolder = bitSwarm.OptionsClone.FolderIncomplete; opt.PartOverwrite = true; data.files[0] = new Partfile(Utils.GetValidFileName(file.name), file.pieceLength, file.length, opt); file.paths = new List <string>() { file.name }; file.lengths = new List <long>() { file.length }; data.filesIncludes.Add(file.name); } data.pieces = file.pieces.Count; data.pieceSize = file.pieceLength; data.pieceLastSize = (int)(data.totalSize % data.pieceSize); // NOTE: it can be 0, it should be equals with pieceSize in case of totalSize % pieceSize = 0 data.blockSize = Math.Min(Peer.MAX_DATA_SIZE, data.pieceSize); data.blocks = ((data.pieceSize - 1) / data.blockSize) + 1; data.blockLastSize = data.pieceLastSize % data.blockSize == 0 ? data.blockSize : data.pieceLastSize % data.blockSize; data.blockLastSize2 = data.pieceSize % data.blockSize == 0 ? data.blockSize : data.pieceSize % data.blockSize; data.blocksLastPiece = ((data.pieceLastSize - 1) / data.blockSize) + 1; data.progress = new Bitfield(data.pieces); data.requests = new Bitfield(data.pieces); data.progressPrev = new Bitfield(data.pieces); data.pieceProgress = new Dictionary <int, TorrentData.PieceProgress>(); SaveSession(); }