summaryrefslogtreecommitdiff
path: root/src/BtRequestMessage.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2006-12-24 06:25:21 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2006-12-24 06:25:21 +0000
commit9c3e8fbd9c92cc858c2b0f805714e19ce97b7983 (patch)
tree2f53afd601fbe1fff339f17cef5ef37186a1960a /src/BtRequestMessage.cc
parent458cc274628f226b3130240d15a1ae8e562d31b2 (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.cc129
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;
+ }
+}