From e5e75ee4ed1c734c7f1615e4699c4e94a714e9b1 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 5 Jan 2008 15:51:21 +0000 Subject: [PATCH] 2008-01-06 Tatsuhiro Tsujikawa Move extension from BtRuntime to ExtensionMessageFactory, because extension can be specified per peer, not per torrent. * src/DefaultBtInteractive.cc * src/BtRuntime.h * src/ExtendedMessagingAware.h * src/ExtensionMessageFactory.h * src/DefaultExtensionMessageFactory.cc * test/DefaultExtensionMessageFactoryTest.cc --- ChangeLog | 11 +++ src/BtRuntime.h | 34 +-------- src/DefaultBtInteractive.cc | 12 +-- src/DefaultExtensionMessageFactory.cc | 2 +- src/ExtendedMessagingAware.h | 85 ++++++++++++++++++++++ src/ExtensionMessageFactory.h | 4 +- test/DefaultExtensionMessageFactoryTest.cc | 5 +- 7 files changed, 111 insertions(+), 42 deletions(-) create mode 100644 src/ExtendedMessagingAware.h diff --git a/ChangeLog b/ChangeLog index 7108db2f..1872565d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-01-06 Tatsuhiro Tsujikawa + + Move extension from BtRuntime to ExtensionMessageFactory, because + extension can be specified per peer, not per torrent. + * src/DefaultBtInteractive.cc + * src/BtRuntime.h + * src/ExtendedMessagingAware.h + * src/ExtensionMessageFactory.h + * src/DefaultExtensionMessageFactory.cc + * test/DefaultExtensionMessageFactoryTest.cc + 2008-01-05 Tatsuhiro Tsujikawa Added categorized option help. Specify category using --help option. diff --git a/src/BtRuntime.h b/src/BtRuntime.h index dceebf4f..9bf7624d 100644 --- a/src/BtRuntime.h +++ b/src/BtRuntime.h @@ -47,8 +47,6 @@ private: bool halt; int32_t connections; bool _ready; - - Extensions _extensions; public: BtRuntime(): uploadLengthAtStartup(0), @@ -56,9 +54,8 @@ public: halt(false), connections(0), _ready(false) - { - _extensions["ut_pex"] = 8; - } + {} + ~BtRuntime() {} int64_t getUploadLengthAtStartup() const { @@ -94,33 +91,6 @@ public: bool ready() { return _ready; } void setReady(bool go) { _ready = go; } - - const Extensions& getExtensions() const - { - return _extensions; - } - - uint8_t getExtensionMessageID(const string& name) - { - Extensions::const_iterator itr = _extensions.find(name); - if(itr == _extensions.end()) { - return 0; - } else { - return (*itr).second; - } - } - - string getExtensionName(uint8_t id) - { - for(Extensions::const_iterator itr = _extensions.begin(); - itr != _extensions.end(); ++itr) { - const Extensions::value_type& p = *itr; - if(p.second == id) { - return p.first; - } - } - return ""; - } }; typedef SharedHandle BtRuntimeHandle; diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc index ee038fba..cdd35ae9 100644 --- a/src/DefaultBtInteractive.cc +++ b/src/DefaultBtInteractive.cc @@ -71,8 +71,12 @@ BtMessageHandle DefaultBtInteractive::receiveHandshake(bool quickReply) { } if(message->isExtendedMessagingEnabled()) { peer->setExtendedMessagingEnabled(true); - PEER_OBJECT(btContext, peer)->extensionMessageFactory = + DefaultExtensionMessageFactoryHandle factory = new DefaultExtensionMessageFactory(btContext, peer); + if(!_utPexEnabled) { + factory->removeExtension("ut_pex"); + } + PEER_OBJECT(btContext, peer)->extensionMessageFactory = factory; logger->info(MSG_EXTENDED_MESSAGING_ENABLED, cuid); } @@ -105,11 +109,9 @@ void DefaultBtInteractive::addHandshakeExtendedMessageToQueue() HandshakeExtensionMessageHandle m = new HandshakeExtensionMessage(); m->setClientVersion("aria2"); m->setTCPPort(btRuntime->getListenPort()); - m->setExtensions(btRuntime->getExtensions()); - - BtExtendedMessageHandle msg = - messageFactory->createBtExtendedMessage(m); + m->setExtensions(EXTENSION_MESSAGE_FACTORY(btContext, peer)->getExtensions()); + BtExtendedMessageHandle msg = messageFactory->createBtExtendedMessage(m); dispatcher->addMessageToQueue(msg); } diff --git a/src/DefaultExtensionMessageFactory.cc b/src/DefaultExtensionMessageFactory.cc index 980cce89..91ae48b9 100644 --- a/src/DefaultExtensionMessageFactory.cc +++ b/src/DefaultExtensionMessageFactory.cc @@ -65,7 +65,7 @@ DefaultExtensionMessageFactory::createMessage(const char* data, size_t length) m->setPeer(_peer); return m; } else { - string extensionName = BT_RUNTIME(_btContext)->getExtensionName(extensionMessageID); + string extensionName = getExtensionName(extensionMessageID); if(extensionName.empty()) { throw new DlAbortEx("No extension registered for extended message ID %u", extensionMessageID); diff --git a/src/ExtendedMessagingAware.h b/src/ExtendedMessagingAware.h new file mode 100644 index 00000000..62273571 --- /dev/null +++ b/src/ExtendedMessagingAware.h @@ -0,0 +1,85 @@ +/* */ +#ifndef _D_EXTENDED_MESSAGING_AWARE_H_ +#define _D_EXTENDED_MESSAGING_AWARE_H_ + +#include "common.h" +#include "BtConstants.h" + +class ExtendedMessagingAware { +private: + Extensions _extensions; +public: + ExtendedMessagingAware() + { + _extensions["ut_pex"] = 8; + } + + virtual ~ExtendedMessagingAware() {} + + const Extensions& getExtensions() const + { + return _extensions; + } + + uint8_t getExtensionMessageID(const string& name) const + { + Extensions::const_iterator itr = _extensions.find(name); + if(itr == _extensions.end()) { + return 0; + } else { + return (*itr).second; + } + } + + string getExtensionName(uint8_t id) const + { + for(Extensions::const_iterator itr = _extensions.begin(); + itr != _extensions.end(); ++itr) { + const Extensions::value_type& p = *itr; + if(p.second == id) { + return p.first; + } + } + return ""; + } + + void removeExtension(const string& name) + { + _extensions.erase(name); + } +}; + +#endif // _D_EXTENDED_MESSAGING_AWARE_H_ diff --git a/src/ExtensionMessageFactory.h b/src/ExtensionMessageFactory.h index 513a0651..8bbe1dce 100644 --- a/src/ExtensionMessageFactory.h +++ b/src/ExtensionMessageFactory.h @@ -35,12 +35,12 @@ #ifndef _D_EXTENSION_MESSAGE_FACTORY_H_ #define _D_EXTENSION_MESSAGE_FACTORY_H_ -#include "common.h" +#include "ExtendedMessagingAware.h" class ExtensionMessage; typedef SharedHandle ExtensionMessageHandle; -class ExtensionMessageFactory { +class ExtensionMessageFactory:public ExtendedMessagingAware { public: virtual ~ExtensionMessageFactory() {} diff --git a/test/DefaultExtensionMessageFactoryTest.cc b/test/DefaultExtensionMessageFactoryTest.cc index 3dfca2d2..da9d89ab 100644 --- a/test/DefaultExtensionMessageFactoryTest.cc +++ b/test/DefaultExtensionMessageFactoryTest.cc @@ -63,6 +63,7 @@ void DefaultExtensionMessageFactoryTest::testCreateMessage_unknown() string data = string(&id[0], &id[1]); try { + // this test fails because localhost doesn't have extension id = 255. factory.createMessage(data.c_str(), data.size()); CPPUNIT_FAIL("exception must be thrown."); } catch(Exception* e) { @@ -99,7 +100,7 @@ void DefaultExtensionMessageFactoryTest::testCreateMessage_UTPex() PeerMessageUtil::createcompact(c3, "192.168.0.2", 6882); PeerMessageUtil::createcompact(c4, "10.1.1.3",10000); - char id[1] = { BT_RUNTIME(_btContext)->getExtensionMessageID("ut_pex") }; + char id[1] = { factory.getExtensionMessageID("ut_pex") }; string data = string(&id[0], &id[1])+"d5:added12:"+ string(&c1[0], &c1[6])+string(&c2[0], &c2[6])+ @@ -108,6 +109,6 @@ void DefaultExtensionMessageFactoryTest::testCreateMessage_UTPex() "e"; UTPexExtensionMessageHandle m = factory.createMessage(data.c_str(), data.size()); - CPPUNIT_ASSERT_EQUAL(BT_RUNTIME(_btContext)->getExtensionMessageID("ut_pex"), + CPPUNIT_ASSERT_EQUAL(factory.getExtensionMessageID("ut_pex"), m->getExtensionMessageID()); }