// Returns true if the piece was moved successfully. bool RequestQueue::Transfer(RequestQueue &dstq, bt_index_t idx) { bool result = true; PIECE *piece, *prev; if( !(piece = FindPiece(idx, &prev)) ) return true; 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( (&PENDING == &dstq && piece->count >= NSlices(piece->slices->index)) || !dstq.Append(piece) ){ _empty_slice_list(&piece); result = false; } return result; }
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; }