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