summaryrefslogtreecommitdiff
path: root/src/DefaultExtensionMessageFactory.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-11-22 15:31:47 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-11-22 15:31:47 +0000
commitc1730aeea945f80b5bf152dc6e7b7d9a42a40b5c (patch)
tree801f8ea1893fdf0e6d3b22ba29cef3d0a2262ad9 /src/DefaultExtensionMessageFactory.cc
parentb563621dd13a5598cfa805290a95caec51bb7e8b (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/DefaultExtensionMessageFactory.cc')
-rw-r--r--src/DefaultExtensionMessageFactory.cc32
1 files changed, 13 insertions, 19 deletions
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<UTMetadataRejectExtensionMessage> 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: