All pastes #2115682 Raw Edit

Unnamed

public text v1 · immutable
#2115682 ·published 2012-02-09 23:35 UTC
rendered paste body
        public void WritePiece(Piece piece) {
            if (SingleFile)
                WriteToSingleFile(piece);
            else
                WriteToMultipleFile(piece);
        }

        private void WriteToSingleFile(Piece piece) {
            long pieceStart = (piece.Index * Torrent.MetaInfo.PieceLength) + piece.Offset;
            long pieceEnd = pieceStart + (Torrent.MetaInfo.PieceLength - piece.Offset);

            Stream toWrite = GetWriteStream(Torrent.MetaInfo);

            toWrite.Seek(pieceStart + piece.Offset, SeekOrigin.Begin);
            toWrite.Write(piece.Block, 0, piece.Block.Length);
        }

        private void WriteToMultipleFile(Piece piece) {
            long size = 0;

            long pieceStart = (piece.Index * Torrent.MetaInfo.PieceLength) + piece.Offset;
            long pieceEnd = pieceStart + (Torrent.MetaInfo.PieceLength - piece.Offset);

            for (int i = 0; i < Torrent.MetaInfo.Files.Count; i++) {
                MetaInfoFile file = Torrent.MetaInfo.Files[i];

                if (pieceStart >= size && pieceStart < (size + file.Length)) {

                    int fileOffset = (int)(pieceStart - size);
                    int writeSize = (int)Math.Min(pieceEnd - pieceStart, file.Length - fileOffset);

                    Stream toWrite = GetWriteStream(file);

                    toWrite.Seek(fileOffset, SeekOrigin.Begin);
                    toWrite.Write(piece.Block, 0, writeSize);

                    pieceStart += writeSize;
                }

                if (pieceStart >= pieceEnd)
                    break;

                size += file.Length;
            }
        }