/* */ #include "DefaultBtRequestFactory.h" void DefaultBtRequestFactory::removeCompletedPiece() { for(Pieces::iterator itr = pieces.begin(); itr != pieces.end();) { PieceHandle& piece = *itr; if(piece->pieceComplete()) { dispatcher->doAbortOutstandingRequestAction(piece); itr = pieces.erase(itr); } else { itr++; } } } void DefaultBtRequestFactory::removeTargetPiece(const PieceHandle& piece) { Pieces temp; remove_copy(pieces.begin(), pieces.end(), back_inserter(temp), piece); pieces = temp; dispatcher->doAbortOutstandingRequestAction(piece); pieceStorage->cancelPiece(piece); } void DefaultBtRequestFactory::removeAllTargetPiece() { for(Pieces::iterator itr = pieces.begin(); itr != pieces.end(); itr++) { dispatcher->doAbortOutstandingRequestAction(*itr); pieceStorage->cancelPiece(*itr); } pieces.clear(); } BtMessages DefaultBtRequestFactory::createRequestMessages(int max) { BtMessages requests; for(Pieces::iterator itr = pieces.begin(); itr != pieces.end() && requests.size() < (size_t)max; itr++) { PieceHandle& piece = *itr; int blockIndex; while(requests.size() < (size_t)max && (blockIndex = piece->getMissingUnusedBlockIndex()) != -1) { requests.push_back(BT_MESSAGE_FACTORY(btContext, peer)-> createRequestMessage(piece, blockIndex)); } } return requests; } BtMessages DefaultBtRequestFactory::createRequestMessagesOnEndGame(int max) { BtMessages requests; for(Pieces::iterator itr = pieces.begin(); itr != pieces.end() && requests.size() < (size_t)max; itr++) { PieceHandle& piece = *itr; BlockIndexes missingBlockIndexes = piece->getAllMissingBlockIndexes(); random_shuffle(missingBlockIndexes.begin(), missingBlockIndexes.end()); for(BlockIndexes::const_iterator bitr = missingBlockIndexes.begin(); bitr != missingBlockIndexes.end() && requests.size() < (size_t)max; bitr++) { int blockIndex = *bitr; if(!dispatcher->isOutstandingRequest(piece->getIndex(), blockIndex)) { requests.push_back(BT_MESSAGE_FACTORY(btContext, peer)-> createRequestMessage(piece, blockIndex)); } } } return requests; }