public bool Received(BlockInfo block) { //изчисляване на адреса на блока var address = (int)(Block.GetAbsoluteAddress(block.Index, block.Offset, _pieceSize) / _blockSize); lock (_unavailable) { //ако колекцията с липсващи блокове включва адреса на блока, и блока е с дължина //по-голяма от 0, тогава го обработваме if (_unavailable.Contains(address) && block.Length > 0) { //премахване на новия блок от колекцията със липсващи Debug.WriteLine("Needed block incoming:" + address); _unavailable.Remove(address); Available++; //увеличаване на броя на наличните блокове _pieces[block.Index] -= block.Length; //изваждане на размера на блока от размера на парчето, което го съдържа if (_pieces[block.Index] <= 0) { //ако парчето, съдържащо блока, има размер 0, тогава обявяваме парчето за свалено SetDownloaded(block.Index); } return(true); } Debug.WriteLine("Unneeded block incoming:" + address); return(false); } }
private IEnumerable <BlockPartInfo> GetParts(int pieceIndex, int offset, int length, bool write) { var pieces = new List <BlockPartInfo>(); var requestedOffset = Block.GetAbsoluteAddress(pieceIndex, offset, _pieceSize); long currentOffset = 0; long remaining = length; foreach (var file in _torrentData.Files) { if (remaining <= 0) { break; } if (currentOffset + file.Length >= requestedOffset) { var relativePosition = requestedOffset - currentOffset; var partLength = Math.Min(file.Length - relativePosition, remaining); var stream = GetStream(file, write); if (stream == null) { throw new IOException("Stream is null."); } pieces.Add(new BlockPartInfo { FileStream = stream, FileOffset = relativePosition, Length = partLength, DataOffset = length - (int)remaining }); remaining -= partLength; requestedOffset += partLength; } currentOffset += file.Length; } return(pieces.ToArray()); }