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/DefaultExtensionMessageFactory.cc | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) (limited to 'src/DefaultExtensionMessageFactory.cc') diff --git a/src/DefaultExtensionMessageFactory.cc b/src/DefaultExtensionMessageFactory.cc index 4dad47e4..87261d5d 100644 --- a/src/DefaultExtensionMessageFactory.cc +++ b/src/DefaultExtensionMessageFactory.cc @@ -50,6 +50,10 @@ #include "UTMetadataRejectExtensionMessage.h" #include "message.h" #include "bencode.h" +#include "PieceStorage.h" +#include "UTMetadataRequestTracker.h" +#include "BtRuntime.h" +#include "RequestGroup.h" namespace aria2 { @@ -93,16 +97,8 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t throw DL_ABORT_EX(StringFormat(MSG_TOO_SMALL_PAYLOAD_SIZE, "ut_metadata", length).str()); } - std::string listdata; - listdata += 'l'; - listdata += std::string(&data[1], &data[length]); - listdata += 'e'; - - const BDE& list = bencode::decode(listdata); - if(!list.isList() || list.empty()) { - throw DL_ABORT_EX("Bad ut_metadata"); - } - const BDE& dict = list[0]; + size_t end; + BDE dict = bencode::decode(data+1, length-1, end); if(!dict.isDict()) { throw DL_ABORT_EX("Bad ut_metadata: dictionary not found"); } @@ -126,13 +122,9 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t return m; } case 1: { - if(list.size() != 2) { + if(end == length) { throw DL_ABORT_EX("Bad ut_metadata data: data not found"); } - const BDE& pieceData = list[1]; - if(!pieceData.isString()) { - throw DL_ABORT_EX("Bad ut_metadata data: data is not string"); - } const BDE& totalSize = dict["total_size"]; if(!totalSize.isInteger()) { throw DL_ABORT_EX("Bad ut_metadata data: total_size not found"); @@ -141,16 +133,18 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t (new UTMetadataDataExtensionMessage(extensionMessageID)); m->setIndex(index.i()); m->setTotalSize(totalSize.i()); - m->setData(pieceData.s()); - // set tracker - // set piecestorage + m->setData(std::string(&data[1+end], &data[length])); + m->setUTMetadataRequestTracker(_tracker); + m->setPieceStorage(_dctx->getOwnerRequestGroup()->getPieceStorage()); + m->setDownloadContext(_dctx); + m->setBtRuntime(_btRuntime); return m; } case 2: { SharedHandle m (new UTMetadataRejectExtensionMessage(extensionMessageID)); m->setIndex(index.i()); - // set tracker if disconnecing peer on receive. + // No need to inject tracker because peer will be disconnected. return m; } default: -- cgit