diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-12-24 06:25:21 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-12-24 06:25:21 +0000 |
| commit | 9c3e8fbd9c92cc858c2b0f805714e19ce97b7983 (patch) | |
| tree | 2f53afd601fbe1fff339f17cef5ef37186a1960a /src/BtRequestMessage.cc | |
| parent | 458cc274628f226b3130240d15a1ae8e562d31b2 (diff) | |
2006-12-24 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Rewritten a portion of bittorrent implementation:
* src/BtMessageValidator.h: New class.
* src/BtBitfieldMessageValidator.h: New class.
* src/BtHandshakeMessageValidator.h: New class.
* src/BtRequestMessageValidator.h: New class.
* src/BtSuggestPieceMessageValidator.h: New class.
* src/BtAllowedFastMessageValidator.h: New class.
* src/BtRejectMessageValidator.h: New class.
* src/BtCancelMessageValidator.h: New class.
* src/BtPieceMessageValidator.h: New class.
* src/BtHaveMessageValidator.h: New class.
* src/BtEventListener.h: New class.
* src/AbstractBtEventListener.h: New class.
* src/BtEvent.h: New class.
* src/BtChokingEvent.h: New class.
* src/BtChokedEvent.h: New class.
* src/BtCancelSendingPieceEvent.h: New class.
* src/BtAbortOutstandingRequestEvent.h: New class.
* src/Randomizer.h: New class.
* src/SimpleRandomizer.h: New class.
* src/BtMessage.h: New class.
* src/AbstractBtMessage.h: New class.
* src/SimpleBtMessage.h: New class.
* src/BtHaveMessage.h: New class.
* src/BtInterestedMessage.h: New class.
* src/BtAllowedFastMessage.h: New class.
* src/BtUnchokeMessage.h: New class.
* src/BtCancelMessage.h: New class.
* src/BtNotInterestedMessage.h: New class.
* src/BtChokeMessage.h: New class.
* src/BtHaveNoneMessage.h: New class.
* src/BtHandshakeMessage.h: New class.
* src/BtSuggestPieceMessage.h: New class.
* src/BtHaveMessage.h: New class.
* src/BtPieceMessage.h: New class.
* src/BtHaveAllMessage.h: New class.
* src/BtKeepAliveMessage.h: New class.
* src/BtPortMessage.h: New class.
* src/BtRejectMessage.h: New class.
* src/BtBitfieldMessage.h: New class.
* src/BtRequestMessage.h: New class.
* src/DefaultBtRequestFactory.h: New class.
* src/DefaultBtMessageReceiver.h: New class.
* src/BtInteractive.h: New class.
* src/BtMessageDispatcher.h: New class.
* src/DefaultBtMessageDispatcher.h: New class.
* src/DefaultBtInteractive.h: New class.
* src/BitfieldManFactory.h: New class.
* src/HandleRegistry.h: New class.
* src/BtMessageFactory.h: New class.
* src/BtMessageReceiver.h: New class.
* src/DefaultBtMessageFactory.h: New class.
* src/PeerObject.h: New class.
* src/BtRequestFactory.h: New class.
Diffstat (limited to 'src/BtRequestMessage.cc')
| -rw-r--r-- | src/BtRequestMessage.cc | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/BtRequestMessage.cc b/src/BtRequestMessage.cc new file mode 100644 index 00000000..6dffaa74 --- /dev/null +++ b/src/BtRequestMessage.cc @@ -0,0 +1,129 @@ +/* <!-- copyright */ +/* + * aria2 - The high speed download utility + * + * Copyright (C) 2006 Tatsuhiro Tsujikawa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations + * including the two. + * You must obey the GNU General Public License in all respects + * for all of the code used other than OpenSSL. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you + * do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source + * files in the program, then also delete it here. + */ +/* copyright --> */ +#include "BtRequestMessage.h" +#include "PeerInteraction.h" +#include "PeerMessageUtil.h" +#include "Util.h" +#include "DlAbortEx.h" +#include "BtAbortOutstandingRequestEvent.h" + +BtRequestMessageHandle BtRequestMessage::create(const unsigned char* data, uint32_t dataLength) { + if(dataLength != 13) { + throw new DlAbortEx("invalid payload size for %s, size = %d. It should be %d", "request", dataLength, 13); + } + int32_t id = PeerMessageUtil::getId(data); + if(id != ID) { + throw new DlAbortEx("invalid ID=%d for %s. It should be %d.", + id, "request", ID); + } + BtRequestMessageHandle message = new BtRequestMessage(); + message->setIndex(PeerMessageUtil::getIntParam(data, 1)); + message->setBegin(PeerMessageUtil::getIntParam(data, 5)); + message->setLength(PeerMessageUtil::getIntParam(data, 9)); + return message; +} + +void BtRequestMessage::doReceivedAction() { + if(pieceStorage->hasPiece(index) && + (!peer->amChoking || + peer->amChoking && peer->isInAmAllowedIndexSet(index))) { + BtMessageHandle msg = + BT_MESSAGE_FACTORY(btContext, peer)->createPieceMessage(index, + begin, + length); + BT_MESSAGE_DISPATCHER(btContext, peer)->addMessageToQueue(msg); + } else { + if(peer->isFastExtensionEnabled()) { + BtMessageHandle msg = + BT_MESSAGE_FACTORY(btContext, peer)->createRejectMessage(index, + begin, + length); + BT_MESSAGE_DISPATCHER(btContext, peer)->addMessageToQueue(msg); + } + } +} + +uint32_t BtRequestMessage::MESSAGE_LENGTH = 17; + +const char* BtRequestMessage::getMessage() { + if(!msg) { + /** + * len --- 13, 4bytes + * id --- 6, 1byte + * index --- index, 4bytes + * begin --- begin, 4bytes + * length --- length, 4bytes + * total: 17bytes + */ + msg = new char[MESSAGE_LENGTH]; + PeerMessageUtil::createPeerMessageString(msg, MESSAGE_LENGTH, 13, ID); + PeerMessageUtil::setIntParam(&msg[5], index); + PeerMessageUtil::setIntParam(&msg[9], begin); + PeerMessageUtil::setIntParam(&msg[13], length); + } + return msg; +} + +uint32_t BtRequestMessage::getMessageLength() { + return MESSAGE_LENGTH; +} + +string BtRequestMessage::toString() const { + return "request index="+Util::uitos(index)+", begin="+Util::uitos(begin)+ + ", length="+Util::uitos(length); +} + +void BtRequestMessage::onQueued() { + RequestSlot requestSlot(index, begin, length, blockIndex); + BT_MESSAGE_DISPATCHER(btContext, peer)->addOutstandingRequest(requestSlot); +} + +bool BtRequestMessage::BtAbortOutstandingRequestEventListener::canHandle(const BtEventHandle& event) { + BtAbortOutstandingRequestEvent* intEvent = dynamic_cast<BtAbortOutstandingRequestEvent*>(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(index == intEvent->getPiece()->getIndex() && + !invalidate && + !sendingInProgress) { + invalidate = true; + } +} |
