/* */ #include "BtRequestMessage.h" #include "BtAbortOutstandingRequestEvent.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(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); } bool BtRequestMessage:: BtAbortOutstandingRequestEventListener::canHandle(const BtEventHandle& event) { BtAbortOutstandingRequestEvent* intEvent = dynamic_cast(event.get()); return intEvent != 0; } void BtRequestMessage:: BtAbortOutstandingRequestEventListener::handleEventInternal (const BtEventHandle& event) { message->handleAbortOutstandingRequestEvent(event); } void BtRequestMessage:: handleAbortOutstandingRequestEvent(const BtEventHandle& event) { BtAbortOutstandingRequestEvent* intEvent = (BtAbortOutstandingRequestEvent*)event.get(); if(getIndex() == intEvent->getPiece()->getIndex() && !invalidate && !sendingInProgress) { invalidate = true; } } } // namespace aria2