protected PieceRequest GetFromList(IPieceRequester peer, BitField bitfield, IList <int> pieces) { if (!peer.SupportsFastPeer || !ClientEngine.SupportsFastPeer) { return(null); } for (int i = 0; i < pieces.Count; i++) { int index = pieces[i]; // A peer should only suggest a piece he has, but just in case. if (index >= bitfield.Length || !bitfield[index] || AlreadyRequested(index)) { continue; } pieces.RemoveAt(i); var p = new Piece(index, TorrentData.PieceLength, TorrentData.Size); requests.Add(p); return(p.Blocks[0].CreateRequest(peer)); } return(null); }
public virtual IList <PieceRequest> GetStandardRequest(PeerId id, BitField current, List <PeerId> otherPeers, int startIndex, int endIndex, int count) { int piecesNeeded = (count * Piece.BlockSize) / id.TorrentManager.Torrent.PieceLength; if ((count * Piece.BlockSize) % id.TorrentManager.Torrent.PieceLength != 0) { piecesNeeded++; } int checkIndex = CanRequest(current, startIndex, endIndex, ref piecesNeeded); // Nothing to request. if (checkIndex == -1) { return(null); } var bundle = new List <PieceRequest>(); for (int i = 0; bundle.Count < count && i < piecesNeeded; i++) { // Request the piece Piece p = new Piece(checkIndex + i, id.TorrentManager.Torrent.PieceLength, id.TorrentManager.Torrent.Size); requests.Add(p); for (int j = 0; j < p.Blocks.Length && bundle.Count < count; j++) { bundle.Add(p.Blocks[j].CreateRequest(id)); } } return(bundle); }
public IList <PieceRequest> GetStandardRequest(IPieceRequester peer, BitField current, int startIndex, int endIndex, int count) { int piecesNeeded = (count * Piece.BlockSize) / TorrentData.PieceLength; if ((count * Piece.BlockSize) % TorrentData.PieceLength != 0) { piecesNeeded++; } int checkIndex = CanRequest(current, startIndex, endIndex, ref piecesNeeded); // Nothing to request. if (checkIndex == -1) { return(null); } var bundle = new List <PieceRequest>(); for (int i = 0; bundle.Count < count && i < piecesNeeded; i++) { // Request the piece Piece p = new Piece(checkIndex + i, TorrentData.PieceLength, TorrentData.Size); requests.Add(p); for (int j = 0; j < p.Blocks.Length && bundle.Count < count; j++) { bundle.Add(p.Blocks[j].CreateRequest(peer)); } } return(bundle); }