/* */ #include "BtRequestMessage.h" #include "Peer.h" #include "Piece.h" #include "PieceStorage.h" #include "BtMessageDispatcher.h" #include "BtMessageFactory.h" namespace aria2 { const char BtRequestMessage::NAME[] = "request"; BtRequestMessage::BtRequestMessage (size_t index, int32_t begin, int32_t length, size_t blockIndex): RangeBtMessage(ID, NAME, index, begin, length), blockIndex_(blockIndex) {} BtRequestMessage* BtRequestMessage::create (const unsigned char* data, size_t dataLength) { return RangeBtMessage::create(data, dataLength); } void BtRequestMessage::doReceivedAction() { if(isMetadataGetMode()) { return; } if(getPieceStorage()->hasPiece(getIndex()) && (!getPeer()->amChoking() || (getPeer()->amChoking() && getPeer()->isInAmAllowedIndexSet(getIndex())))) { SharedHandle msg = getBtMessageFactory()->createPieceMessage (getIndex(), getBegin(), getLength()); getBtMessageDispatcher()->addMessageToQueue(msg); } else { if(getPeer()->isFastExtensionEnabled()) { SharedHandle msg = getBtMessageFactory()->createRejectMessage (getIndex(), getBegin(), getLength()); getBtMessageDispatcher()->addMessageToQueue(msg); } } } void BtRequestMessage::onQueued() { RequestSlot requestSlot(getIndex(), getBegin(), getLength(), blockIndex_, getPieceStorage()->getPiece(getIndex())); getBtMessageDispatcher()->addOutstandingRequest(requestSlot); } void BtRequestMessage::onAbortOutstandingRequestEvent (const BtAbortOutstandingRequestEvent& event) { if(getIndex() == event.getPiece()->getIndex() && !isInvalidate()) { setInvalidate(true); } } } // namespace aria2