diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-11-22 15:31:47 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-11-22 15:31:47 +0000 |
| commit | c1730aeea945f80b5bf152dc6e7b7d9a42a40b5c (patch) | |
| tree | 801f8ea1893fdf0e6d3b22ba29cef3d0a2262ad9 /src/UTMetadataDataExtensionMessage.cc | |
| parent | b563621dd13a5598cfa805290a95caec51bb7e8b (diff) | |
2009-11-23 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed ut_metadata data handling. Implemented
UTMetadataDataExtensionMessage::doReceivedAction(). Initialize
PeerStorage in HandshakeExtensionMessage::doReceivedAction() when
metadata_size is received.
* src/DefaultExtensionMessageFactory.cc
* src/DefaultExtensionMessageFactory.h
* src/HandshakeExtensionMessage.cc
* src/HandshakeExtensionMessage.h
* src/UTMetadataDataExtensionMessage.cc
* src/UTMetadataDataExtensionMessage.h
* src/UTMetadataRequestExtensionMessage.cc
* src/UTMetadataRequestFactory.cc
* src/UTMetadataRequestFactory.h
* src/UTMetadataRequestTracker.cc
* src/UTMetadataRequestTracker.h
* test/DefaultExtensionMessageFactoryTest.cc
* test/HandshakeExtensionMessageTest.cc
* test/MockBtMessage.h
* test/UTMetadataDataExtensionMessageTest.cc
* test/UTMetadataRequestExtensionMessageTest.cc
* test/UTMetadataRequestFactoryTest.cc
* test/UTMetadataRequestTrackerTest.cc
* test/extension_message_test_helper.h
Diffstat (limited to 'src/UTMetadataDataExtensionMessage.cc')
| -rw-r--r-- | src/UTMetadataDataExtensionMessage.cc | 58 |
1 files changed, 43 insertions, 15 deletions
diff --git a/src/UTMetadataDataExtensionMessage.cc b/src/UTMetadataDataExtensionMessage.cc index 7f80a608..bb39d4e4 100644 --- a/src/UTMetadataDataExtensionMessage.cc +++ b/src/UTMetadataDataExtensionMessage.cc @@ -37,29 +37,30 @@ #include "bencode.h" #include "util.h" #include "a2functional.h" +#include "DownloadContext.h" +#include "UTMetadataRequestTracker.h" +#include "PieceStorage.h" +#include "BtConstants.h" +#include "MessageDigestHelper.h" +#include "bittorrent_helper.h" +#include "DiskAdaptor.h" +#include "Piece.h" +#include "BtRuntime.h" +#include "LogFactory.h" namespace aria2 { UTMetadataDataExtensionMessage::UTMetadataDataExtensionMessage -(uint8_t extensionMessageID):UTMetadataExtensionMessage(extensionMessageID) {} +(uint8_t extensionMessageID):UTMetadataExtensionMessage(extensionMessageID), + _logger(LogFactory::getInstance()) {} std::string UTMetadataDataExtensionMessage::getBencodedData() { - BDE list = BDE::list(); - BDE dict = BDE::dict(); dict["msg_type"] = 1; dict["piece"] = _index; dict["total_size"] = _totalSize; - - BDE data = _data; - - list << dict; - list << data; - - std::string encodedList = bencode::encode(list); - // Remove first 'l' and last 'e' and return. - return std::string(encodedList.begin()+1, encodedList.end()-1); + return bencode::encode(dict)+_data; } std::string UTMetadataDataExtensionMessage::toString() const @@ -69,9 +70,36 @@ std::string UTMetadataDataExtensionMessage::toString() const void UTMetadataDataExtensionMessage::doReceivedAction() { - // Update tracker - - // Write to pieceStorage + if(_tracker->tracks(_index)) { + _logger->debug("ut_metadata index=%lu found in tracking list", + static_cast<unsigned long>(_index)); + _tracker->remove(_index); + _pieceStorage->getDiskAdaptor()->writeData + (reinterpret_cast<const unsigned char*>(_data.c_str()), _data.size(), + _index*METADATA_PIECE_SIZE); + _pieceStorage->completePiece(_pieceStorage->getPiece(_index)); + if(_pieceStorage->downloadFinished()) { + std::string metadata = util::toString(_pieceStorage->getDiskAdaptor()); + unsigned char infoHash[INFO_HASH_LENGTH]; + MessageDigestHelper::digest(infoHash, INFO_HASH_LENGTH, + MessageDigestContext::SHA1, + metadata.data(), metadata.size()); + const BDE& attrs = _dctx->getAttribute(bittorrent::BITTORRENT); + if(std::string(&infoHash[0], &infoHash[INFO_HASH_LENGTH]) == + attrs[bittorrent::INFO_HASH].s()){ + _logger->info("Got ut_metadata"); + _btRuntime->setHalt(true); + } else { + _logger->info("Got wrong ut_metadata"); + for(size_t i = 0; i < _dctx->getNumPieces(); ++i) { + _pieceStorage->markPieceMissing(i); + } + } + } + } else { + _logger->debug("ut_metadata index=%lu is not tracked", + static_cast<unsigned long>(_index)); + } } } // namespace aria2 |
