/* */ #include "BtRequestMessage.h" #include "Peer.h" #include "Piece.h" #include "PieceStorage.h" #include "BtMessageDispatcher.h" #include "BtMessageFactory.h" namespace aria2 { const std::string BtRequestMessage::NAME("request"); SharedHandle BtRequestMessage::create (const unsigned char* data, size_t dataLength) { return RangeBtMessage::create(data, dataLength); } void BtRequestMessage::doReceivedAction() { if(_metadataGetMode) { return; } if(pieceStorage->hasPiece(getIndex()) && (!peer->amChoking() || (peer->amChoking() && peer->isInAmAllowedIndexSet(getIndex())))) { BtMessageHandle msg = messageFactory->createPieceMessage(getIndex(), getBegin(), getLength()); dispatcher->addMessageToQueue(msg); } else { if(peer->isFastExtensionEnabled()) { BtMessageHandle msg = messageFactory->createRejectMessage(getIndex(), getBegin(), getLength()); dispatcher->addMessageToQueue(msg); } } } void BtRequestMessage::onQueued() { RequestSlot requestSlot(getIndex(), getBegin(), getLength(), _blockIndex, pieceStorage->getPiece(getIndex())); dispatcher->addOutstandingRequest(requestSlot); } void BtRequestMessage::onAbortOutstandingRequestEvent (const BtAbortOutstandingRequestEvent& event) { if(getIndex() == event.getPiece()->getIndex() && !invalidate && !sendingInProgress) { invalidate = true; } } } // namespace aria2