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/BtHandshakeMessage.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/BtHandshakeMessage.cc')
| -rw-r--r-- | src/BtHandshakeMessage.cc | 100 |
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; +} |
