From c1730aeea945f80b5bf152dc6e7b7d9a42a40b5c Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 22 Nov 2009 15:31:47 +0000 Subject: 2009-11-23 Tatsuhiro Tsujikawa 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 --- src/UTMetadataDataExtensionMessage.cc | 58 ++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 15 deletions(-) (limited to 'src/UTMetadataDataExtensionMessage.cc') 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(_index)); + _tracker->remove(_index); + _pieceStorage->getDiskAdaptor()->writeData + (reinterpret_cast(_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(_index)); + } } } // namespace aria2 -- cgit