bt_index_t RequestQueue::FindCommonRequest(const Bitfield &proposerbf, const RequestQueue &proposerq) const { const PIECE *piece; bt_index_t idx = BTCONTENT.GetNPieces(); for( piece = rq_head; piece; piece = piece->next ){ if( proposerbf.IsSet(piece->slices->index) && !proposerq.HasPiece(piece->slices->index) ){ idx = piece->slices->index; break; } } return idx; }
bt_index_t RequestQueue::Reassign(RequestQueue &dstq, const Bitfield &bf) { PIECE *piece, *prev = (PIECE *)0; bt_index_t idx = BTCONTENT.GetNPieces(); for( piece = rq_head; piece; piece = prev ? prev->next : rq_head ){ if( bf.IsSet(piece->slices->index) && !dstq.HasPiece(piece->slices->index) ){ idx = piece->slices->index; if( rq_send && rq_send->index == idx ) rq_send = piece->next ? piece->next->slices : (SLICE *)0; if( prev ) prev->next = piece->next; else rq_head = piece->next; piece->next = (PIECE *)0; if( !dstq.Append(piece) ) _empty_slice_list(&piece); else break; }else prev = piece; } return idx; }