summaryrefslogtreecommitdiff
path: root/src/BtHandshakeMessage.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/BtHandshakeMessage.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/BtHandshakeMessage.cc')
-rw-r--r--src/BtHandshakeMessage.cc100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/BtHandshakeMessage.cc b/src/BtHandshakeMessage.cc
new file mode 100644
index 00000000..3cedc217
--- /dev/null
+++ b/src/BtHandshakeMessage.cc
@@ -0,0 +1,100 @@
+/* <!-- 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 "BtHandshakeMessage.h"
+#include "PeerMessageUtil.h"
+#include "Util.h"
+
+const unsigned char* BtHandshakeMessage::BT_PSTR = (const unsigned char*)"BitTorrent protocol";
+
+BtHandshakeMessage::BtHandshakeMessage() {
+ init();
+}
+
+BtHandshakeMessage::BtHandshakeMessage(const unsigned char* infoHash,
+ const unsigned char* peerId)
+{
+ init();
+ memcpy(this->infoHash, infoHash, INFO_HASH_LENGTH);
+ memcpy(this->peerId, peerId, PEER_ID_LENGTH);
+}
+
+void BtHandshakeMessage::init() {
+ msg = 0;
+ this->pstrlen = 19;
+ pstr = new unsigned char[PSTR_LENGTH];
+ reserved = new unsigned char[RESERVED_LENGTH];
+ infoHash = new unsigned char[INFO_HASH_LENGTH];
+ peerId = new unsigned char[PEER_ID_LENGTH];
+ memcpy(this->pstr, PSTR, PSTR_LENGTH);
+ memset(this->reserved, 0, RESERVED_LENGTH);
+ // fast extension
+ this->reserved[7] |= 0x04;
+}
+
+BtHandshakeMessageHandle BtHandshakeMessage::create(const unsigned char* data, uint32_t dataLength) {
+ BtHandshakeMessageHandle message = new BtHandshakeMessage();
+ message->pstrlen = data[0];
+ memcpy(message->pstr, &data[1], PSTR_LENGTH);
+ memcpy(message->reserved, &data[20], RESERVED_LENGTH);
+ memcpy(message->infoHash, &data[28], INFO_HASH_LENGTH);
+ memcpy(message->peerId, &data[48], PEER_ID_LENGTH);
+ return message;
+}
+
+const char* BtHandshakeMessage::getMessage() {
+ if(!msg) {
+ msg = new char[MESSAGE_LENGTH];
+ msg[0] = pstrlen;
+ memcpy(msg+1, pstr, PSTR_LENGTH);
+ memcpy(msg+20, reserved, RESERVED_LENGTH);
+ memcpy(msg+28, infoHash, INFO_HASH_LENGTH);
+ memcpy(msg+48, peerId, PEER_ID_LENGTH);
+ }
+ return msg;
+}
+
+uint32_t BtHandshakeMessage::getMessageLength() {
+ return MESSAGE_LENGTH;
+}
+
+string BtHandshakeMessage::toString() const {
+ return "handshake peerId="+
+ Util::urlencode(peerId, PEER_ID_LENGTH)+
+ ", reserved="+Util::toHex(reserved, RESERVED_LENGTH);
+}
+
+bool BtHandshakeMessage::isFastExtensionSupported() const {
+ return reserved[7]&0x04;
+}