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