示例#1
0
        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();
        }
示例#2
0
        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();
        }