diff --git a/ChangeLog b/ChangeLog index e4388aa8d..ba3789264 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-06-20 Tatsuhiro Tsujikawa + + Removed BDE and bencode + 2010-06-18 Tatsuhiro Tsujikawa Introduced ValueBase class, which is a replacement of BDE. In diff --git a/src/AnnounceList.cc b/src/AnnounceList.cc index c3ea52be8..fa0ccf65e 100644 --- a/src/AnnounceList.cc +++ b/src/AnnounceList.cc @@ -38,7 +38,6 @@ #include "A2STR.h" #include "SimpleRandomizer.h" -#include "bencode.h" #include "util.h" namespace aria2 { diff --git a/src/BDE.cc b/src/BDE.cc deleted file mode 100644 index 92f57b2e3..000000000 --- a/src/BDE.cc +++ /dev/null @@ -1,223 +0,0 @@ -/* */ - -#include "BDE.h" - -namespace aria2 { - -const BDE BDE::none; - -BDE::BDE():_type(TYPE_NONE), _bobject(new BObject()) {} - -BDE::BDE(Integer integer):_type(TYPE_INTEGER), - _bobject(new BInteger(integer)) {} - - -BDE::BDE(const std::string& string):_type(TYPE_STRING), - _bobject(new BString(std::string(string))) {} - -BDE::BDE(const char* cstring):_type(TYPE_STRING), - _bobject(new BString(std::string(cstring))) {} - -BDE::BDE(const char* data, size_t length): - _type(TYPE_STRING), - _bobject(new BString(std::string(&data[0], &data[length]))) {} - -BDE::BDE(const unsigned char* data, size_t length): - _type(TYPE_STRING), - _bobject(new BString(std::string(&data[0], &data[length]))) {} - -BDE BDE::dict() -{ - BDE bde; - bde._type = TYPE_DICT; - bde._bobject.reset(new BDict()); - return bde; -} - -BDE BDE::list() -{ - BDE bde; - bde._type = TYPE_LIST; - bde._bobject.reset(new BList()); - return bde; -} - -// Test for Null data -bool BDE::isNone() const -{ - return _type == TYPE_NONE; -} - -// Integer Interface - -bool BDE::isInteger() const -{ - return _type == TYPE_INTEGER; -} - -BDE::Integer BDE::i() const -{ - return _bobject->i(); -} - -// String Interface - -bool BDE::isString() const -{ - return _type == TYPE_STRING; -} - -const std::string& BDE::s() const -{ - return _bobject->s(); -} - -const unsigned char* BDE::uc() const -{ - return _bobject->uc(); -} - -// Dictionary Interface - -bool BDE::isDict() const -{ - return _type == TYPE_DICT; -} - -BDE& BDE::operator[](const std::string& key) -{ - return _bobject->operator[](key); -} - -const BDE& BDE::operator[](const std::string& key) const -{ - if(_bobject->containsKey(key)) { - return _bobject->operator[](key); - } else { - return none; - } -} - -bool BDE::containsKey(const std::string& key) const -{ - return _bobject->containsKey(key); -} - -void BDE::removeKey(const std::string& key) -{ - _bobject->removeKey(key); -} - -BDE::Dict::iterator BDE::dictBegin() -{ - return _bobject->dictBegin(); -} - -BDE::Dict::const_iterator BDE::dictBegin() const -{ - return _bobject->dictBegin(); -} - -BDE::Dict::iterator BDE::dictEnd() -{ - return _bobject->dictEnd(); -} - -BDE::Dict::const_iterator BDE::dictEnd() const -{ - return _bobject->dictEnd(); -} - -// List Interface - -bool BDE::isList() const -{ - return _type == TYPE_LIST; -} - -void BDE::append(const BDE& bde) -{ - _bobject->append(bde); -} - -void BDE::operator<<(const BDE& bde) -{ - _bobject->operator<<(bde); -} - -BDE& BDE::operator[](size_t index) -{ - return _bobject->operator[](index); -} - -const BDE& BDE::operator[](size_t index) const -{ - return _bobject->operator[](index); -} - -BDE::List::iterator BDE::listBegin() -{ - return _bobject->listBegin(); -} - -BDE::List::const_iterator BDE::listBegin() const -{ - return _bobject->listBegin(); -} - -BDE::List::iterator BDE::listEnd() -{ - return _bobject->listEnd(); -} - -BDE::List::const_iterator BDE::listEnd() const -{ - return _bobject->listEnd(); -} - -// Callable from List and Dict -size_t BDE::size() const -{ - return _bobject->size(); -} - -// Callable from List and Dict -bool BDE::empty() const -{ - return _bobject->empty(); -} - -} // namespace aria2 diff --git a/src/BDE.h b/src/BDE.h deleted file mode 100644 index 939a72375..000000000 --- a/src/BDE.h +++ /dev/null @@ -1,431 +0,0 @@ -/* */ -#ifndef _D_BDE_H_ -#define _D_BDE_H_ - -#include "common.h" - -#include -#include -#include - -#include "SharedHandle.h" -#include "DlAbortEx.h" - -namespace aria2 { - -class BDE; - -class BDE { -public: - typedef std::map Dict; - typedef std::vector List; - typedef int64_t Integer; -private: - enum TYPE{ - TYPE_NONE, - TYPE_INTEGER, - TYPE_STRING, - TYPE_DICT, - TYPE_LIST, - }; - - class BObject { - public: - virtual ~BObject() {} - - //////////////////////////////////////////////////////////////////////////// - // Integer Interface - - // Returns Integer. - virtual Integer i() const - { - throw DL_ABORT_EX("Not Integer"); - } - - //////////////////////////////////////////////////////////////////////////// - // String Interface - - // Returns std::string. - virtual const std::string& s() const - { - throw DL_ABORT_EX("Not String"); - } - - // Returns std::string.data() casted to unsigned char*. - // Use s().size() to get length. - virtual const unsigned char* uc() const - { - throw DL_ABORT_EX("Not String"); - } - - //////////////////////////////////////////////////////////////////////////// - // Dictionary Interface - - // Returns the reference to BDE object associated with given key. - // If the key is not found, new pair with that key is created - // using default values, which is then returned. In other words, - // this is the same behavior of std::map's operator[]. - virtual BDE& operator[](const std::string& key) - { - throw DL_ABORT_EX("Not Dict"); - } - - // Returns true if the given key is found in dict. - virtual bool containsKey(const std::string& key) const - { - throw DL_ABORT_EX("Not Dict"); - } - - // Removes specified key from dict. - virtual void removeKey(const std::string& key) - { - throw DL_ABORT_EX("Not Dict"); - } - - // Returns a read/write iterator that points to the first pair in - // the dict. - virtual Dict::iterator dictBegin() - { - throw DL_ABORT_EX("Not Dict"); - } - - // Returns a read/write read-only iterator that points to one past - // the last pair in the dict. - virtual Dict::iterator dictEnd() - { - throw DL_ABORT_EX("Not Dict"); - } - - //////////////////////////////////////////////////////////////////////////// - // List Interface - - // Appends given bde to list. - virtual void append(const BDE& bde) - { - throw DL_ABORT_EX("Not List"); - } - - // Alias for append() - virtual void operator<<(const BDE& bde) - { - throw DL_ABORT_EX("Not List"); - } - - // Returns the reference of the object at the given index. - virtual BDE& operator[](size_t index) - { - throw DL_ABORT_EX("Not List"); - } - - // Returns a read/write iterator that points to the first object - // in list. - virtual List::iterator listBegin() - { - throw DL_ABORT_EX("Not List"); - } - - // Returns a read/write iterator that points to the one past the - // last object in list. - virtual List::iterator listEnd() - { - throw DL_ABORT_EX("Not List"); - } - - // Returns size of list or dict. - virtual size_t size() const - { - throw DL_ABORT_EX("Neither Dict nor List"); - } - - // Returns true if size of list or dict is 0. - virtual bool empty() const - { - throw DL_ABORT_EX("Neither Dict nor List"); - } - }; - - class BInteger : public BObject { - private: - Integer _integer; - public: - BInteger(Integer i):_integer(i) {} - - virtual BDE::Integer i() const - { - return _integer; - } - }; - - class BString : public BObject { - private: - std::string _string; - public: - BString(const std::string& string):_string(string) {} - - virtual const std::string& s() const - { - return _string; - } - - virtual const unsigned char* uc() const - { - return reinterpret_cast(_string.data()); - } - }; - - class BDict : public BObject { - private: - Dict _dict; - public: - - virtual BDE& operator[](const std::string& key) - { - return _dict[key]; - } - - virtual bool containsKey(const std::string& key) const - { - return _dict.find(key) != _dict.end(); - } - - virtual void removeKey(const std::string& key) - { - _dict.erase(key); - } - - virtual BDE::Dict::iterator dictBegin() - { - return _dict.begin(); - } - - virtual BDE::Dict::iterator dictEnd() - { - return _dict.end(); - } - - virtual size_t size() const - { - return _dict.size(); - } - - virtual bool empty() const - { - return _dict.empty(); - } - }; - - class BList : public BObject { - private: - List _list; - public: - virtual void append(const BDE& bde) - { - _list.push_back(bde); - } - - virtual void operator<<(const BDE& bde) - { - _list.push_back(bde); - } - - virtual BDE& operator[](size_t index) - { - return _list[index]; - } - - virtual BDE::List::iterator listBegin() - { - return _list.begin(); - } - - virtual BDE::List::iterator listEnd() - { - return _list.end(); - } - - virtual size_t size() const - { - return _list.size(); - } - - virtual bool empty() const - { - return _list.empty(); - } - }; - - TYPE _type; - - SharedHandle _bobject; -public: - BDE(); - - static BDE dict(); - - static BDE list(); - - static const BDE none; - - // Test for Null data - // Return true if the type of this object is None. - bool isNone() const; - - ////////////////////////////////////////////////////////////////////////////// - // Integer Interface - - BDE(Integer integer); - - // Returns true if the type of this object is Integer. - bool isInteger() const; - - // Returns Integer. Requires this object to be Integer. - Integer i() const; - - ////////////////////////////////////////////////////////////////////////////// - // String Interface - - BDE(const std::string& string); - - // Made explicit to avoid ambiguity with BDE(Integer). - explicit BDE(const char* cstring); - - BDE(const char* data, size_t length); - - BDE(const unsigned char* data, size_t length); - - // Returns true if the type of this object is String. - bool isString() const; - - // Returns std::string. Requires this object to be String - const std::string& s() const; - - // Returns std::string.data() casted to unsigned char*. - // Use s().size() to get length. - const unsigned char* uc() const; - - ////////////////////////////////////////////////////////////////////////////// - // Dictionary Interface - - // Returns true if the type of this object is Dict. - bool isDict() const; - - // Returns the reference to BDE object associated with given key. - // If the key is not found, new pair with that key is created using default - // values, which is then returned. In other words, this is the same behavior - // of std::map's operator[]. - // Requires this object to be Dict. - BDE& operator[](const std::string& key); - - // Returns the const reference to BDE ojbect associated with given key. - // If the key is not found, BDE::none is returned. - // Requires this object to be Dict. - const BDE& operator[](const std::string& key) const; - - // Returns true if the given key is found in dict. - // Requires this object to be Dict. - bool containsKey(const std::string& key) const; - - // Removes specified key from dict. - // Requires this object to be Dict. - void removeKey(const std::string& key); - - // Returns a read/write iterator that points to the first pair in the dict. - // Requires this object to be Dict. - Dict::iterator dictBegin(); - - // Returns a read/write read-only iterator that points to the first pair in - // the dict. - // Requires this object to be Dict. - Dict::const_iterator dictBegin() const; - - // Returns a read/write read-only iterator that points to one past the last - // pair in the dict. - // Requires this object to be Dict. - Dict::iterator dictEnd(); - - // Returns a read/write read-only iterator that points to one past the last - // pair in the dict. - // Requires this object to be Dict. - Dict::const_iterator dictEnd() const; - - ////////////////////////////////////////////////////////////////////////////// - // List Interface - - // Returns true if the type of this object is List. - bool isList() const; - - // Appends given bde to list. Required the type of this object to be List. - void append(const BDE& bde); - - // Alias for append() - void operator<<(const BDE& bde); - - // Returns the reference of the object at the given index. Required this - // object to be List. - BDE& operator[](size_t index); - - // Returns the const reference of the object at the given index. - // Required this object to be List. - const BDE& operator[](size_t index) const; - - // Returns a read/write iterator that points to the first object in list. - // Required this object to be List. - List::iterator listBegin(); - - // Returns a read/write read-only iterator that points to the first object - // in list. Required this object to be List. - List::const_iterator listBegin() const; - - // Returns a read/write iterator that points to the one past the last object - // in list. Required this object to be List. - List::iterator listEnd(); - - // Returns a read/write read-only iterator that points to the one past the - // last object in list. Required this object to be List. - List::const_iterator listEnd() const; - - // For List type: Returns size of list. - // For Dict type: Returns size of dict. - size_t size() const; - - // For List type: Returns true if size of list is 0. - // For Dict type: Returns true if size of dict is 0. - bool empty() const; -}; - -} // namespace aria2 - -#endif // _D_BDE_H_ diff --git a/src/DHTAbstractMessage.cc b/src/DHTAbstractMessage.cc index 3f4080902..ee0c41f13 100644 --- a/src/DHTAbstractMessage.cc +++ b/src/DHTAbstractMessage.cc @@ -42,7 +42,7 @@ #include "DHTMessageFactory.h" #include "DHTRoutingTable.h" #include "DHTMessageCallback.h" -#include "bencode.h" +#include "bencode2.h" namespace aria2 { @@ -55,12 +55,12 @@ DHTAbstractMessage::~DHTAbstractMessage() {} std::string DHTAbstractMessage::getBencodedMessage() { - BDE msgDict = BDE::dict(); - msgDict[T] = getTransactionID(); - msgDict[Y] = getType(); - msgDict[V] = getVersion(); - fillMessage(msgDict); - return bencode::encode(msgDict); + Dict msgDict; + msgDict.put(T, getTransactionID()); + msgDict.put(Y, getType()); + msgDict.put(V, getVersion()); + fillMessage(&msgDict); + return bencode2::encode(&msgDict); } bool DHTAbstractMessage::send() @@ -75,22 +75,26 @@ bool DHTAbstractMessage::send() return r == static_cast(message.size()); } -void DHTAbstractMessage::setConnection(const WeakHandle& connection) +void DHTAbstractMessage::setConnection +(const WeakHandle& connection) { _connection = connection; } -void DHTAbstractMessage::setMessageDispatcher(const WeakHandle& dispatcher) +void DHTAbstractMessage::setMessageDispatcher +(const WeakHandle& dispatcher) { _dispatcher = dispatcher; } -void DHTAbstractMessage::setMessageFactory(const WeakHandle& factory) +void DHTAbstractMessage::setMessageFactory +(const WeakHandle& factory) { _factory = factory; } -void DHTAbstractMessage::setRoutingTable(const WeakHandle& routingTable) +void DHTAbstractMessage::setRoutingTable +(const WeakHandle& routingTable) { _routingTable = routingTable; } diff --git a/src/DHTAbstractMessage.h b/src/DHTAbstractMessage.h index bfd33f223..18c6809a4 100644 --- a/src/DHTAbstractMessage.h +++ b/src/DHTAbstractMessage.h @@ -37,10 +37,10 @@ #include "DHTMessage.h" #include "A2STR.h" +#include "ValueBase.h" namespace aria2 { -class BDE; class DHTConnection; class DHTMessageDispatcher; class DHTMessageFactory; @@ -66,7 +66,7 @@ public: virtual const std::string& getType() const = 0; - virtual void fillMessage(BDE& msgDict) = 0; + virtual void fillMessage(Dict* msgDict) = 0; std::string getBencodedMessage(); diff --git a/src/DHTAnnouncePeerMessage.cc b/src/DHTAnnouncePeerMessage.cc index 434bb13d2..f89afacfd 100644 --- a/src/DHTAnnouncePeerMessage.cc +++ b/src/DHTAnnouncePeerMessage.cc @@ -47,7 +47,6 @@ #include "DlAbortEx.h" #include "BtConstants.h" #include "StringFormat.h" -#include "bencode.h" #include "a2functional.h" namespace aria2 { @@ -87,13 +86,13 @@ void DHTAnnouncePeerMessage::doReceivedAction() getMessageDispatcher()->addMessageToQueue(reply); } -BDE DHTAnnouncePeerMessage::getArgument() +SharedHandle DHTAnnouncePeerMessage::getArgument() { - BDE aDict = BDE::dict(); - aDict[DHTMessage::ID] = BDE(getLocalNode()->getID(), DHT_ID_LENGTH); - aDict[INFO_HASH] = BDE(_infoHash, DHT_ID_LENGTH); - aDict[PORT] = _tcpPort; - aDict[TOKEN] = _token; + SharedHandle aDict = Dict::g(); + aDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); + aDict->put(INFO_HASH, String::g(_infoHash, DHT_ID_LENGTH)); + aDict->put(PORT, Integer::g(_tcpPort)); + aDict->put(TOKEN, _token); return aDict; } diff --git a/src/DHTAnnouncePeerMessage.h b/src/DHTAnnouncePeerMessage.h index 0b47b3fe0..9011ab75c 100644 --- a/src/DHTAnnouncePeerMessage.h +++ b/src/DHTAnnouncePeerMessage.h @@ -69,7 +69,7 @@ public: virtual void doReceivedAction(); - virtual BDE getArgument(); + virtual SharedHandle getArgument(); virtual const std::string& getMessageType() const; diff --git a/src/DHTAnnouncePeerReplyMessage.cc b/src/DHTAnnouncePeerReplyMessage.cc index d10881031..1562d78fe 100644 --- a/src/DHTAnnouncePeerReplyMessage.cc +++ b/src/DHTAnnouncePeerReplyMessage.cc @@ -34,7 +34,6 @@ /* copyright --> */ #include "DHTAnnouncePeerReplyMessage.h" #include "DHTNode.h" -#include "bencode.h" #include "DHTMessageCallback.h" namespace aria2 { @@ -51,10 +50,10 @@ DHTAnnouncePeerReplyMessage::~DHTAnnouncePeerReplyMessage() {} void DHTAnnouncePeerReplyMessage::doReceivedAction() {} -BDE DHTAnnouncePeerReplyMessage::getResponse() +SharedHandle DHTAnnouncePeerReplyMessage::getResponse() { - BDE rDict = BDE::dict(); - rDict[DHTMessage::ID] = BDE(getLocalNode()->getID(), DHT_ID_LENGTH); + SharedHandle rDict = Dict::g(); + rDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); return rDict; } diff --git a/src/DHTAnnouncePeerReplyMessage.h b/src/DHTAnnouncePeerReplyMessage.h index 03d6284ff..b6e4be7c5 100644 --- a/src/DHTAnnouncePeerReplyMessage.h +++ b/src/DHTAnnouncePeerReplyMessage.h @@ -49,7 +49,7 @@ public: virtual void doReceivedAction(); - virtual BDE getResponse(); + virtual SharedHandle getResponse(); virtual const std::string& getMessageType() const; diff --git a/src/DHTFindNodeMessage.cc b/src/DHTFindNodeMessage.cc index a209dda60..7fbe56392 100644 --- a/src/DHTFindNodeMessage.cc +++ b/src/DHTFindNodeMessage.cc @@ -42,7 +42,6 @@ #include "DHTMessageDispatcher.h" #include "DHTMessageCallback.h" #include "util.h" -#include "bencode.h" namespace aria2 { @@ -71,11 +70,11 @@ void DHTFindNodeMessage::doReceivedAction() getMessageDispatcher()->addMessageToQueue(reply); } -BDE DHTFindNodeMessage::getArgument() +SharedHandle DHTFindNodeMessage::getArgument() { - BDE aDict = BDE::dict(); - aDict[DHTMessage::ID] = BDE(getLocalNode()->getID(), DHT_ID_LENGTH); - aDict[TARGET_NODE] = BDE(_targetNodeID, DHT_ID_LENGTH); + SharedHandle aDict = Dict::g(); + aDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); + aDict->put(TARGET_NODE, String::g(_targetNodeID, DHT_ID_LENGTH)); return aDict; } diff --git a/src/DHTFindNodeMessage.h b/src/DHTFindNodeMessage.h index a16263c09..2df5d86eb 100644 --- a/src/DHTFindNodeMessage.h +++ b/src/DHTFindNodeMessage.h @@ -55,7 +55,7 @@ public: virtual void doReceivedAction(); - virtual BDE getArgument(); + virtual SharedHandle getArgument(); virtual const std::string& getMessageType() const; diff --git a/src/DHTFindNodeReplyMessage.cc b/src/DHTFindNodeReplyMessage.cc index 995426232..bdd186efa 100644 --- a/src/DHTFindNodeReplyMessage.cc +++ b/src/DHTFindNodeReplyMessage.cc @@ -44,7 +44,6 @@ #include "DHTMessageCallback.h" #include "bittorrent_helper.h" #include "util.h" -#include "bencode.h" namespace aria2 { @@ -70,10 +69,10 @@ void DHTFindNodeReplyMessage::doReceivedAction() } } -BDE DHTFindNodeReplyMessage::getResponse() +SharedHandle DHTFindNodeReplyMessage::getResponse() { - BDE aDict = BDE::dict(); - aDict[DHTMessage::ID] = BDE(getLocalNode()->getID(), DHT_ID_LENGTH); + SharedHandle aDict = Dict::g(); + aDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); size_t offset = 0; unsigned char buffer[DHTBucket::K*26]; // TODO if _closestKNodes.size() > DHTBucket::K ?? @@ -87,7 +86,7 @@ BDE DHTFindNodeReplyMessage::getResponse() offset += 26; } } - aDict[NODES] = BDE(buffer, offset); + aDict->put(NODES, String::g(buffer, offset)); return aDict; } diff --git a/src/DHTFindNodeReplyMessage.h b/src/DHTFindNodeReplyMessage.h index 7ff88e207..0bc408e10 100644 --- a/src/DHTFindNodeReplyMessage.h +++ b/src/DHTFindNodeReplyMessage.h @@ -54,7 +54,7 @@ public: virtual void doReceivedAction(); - virtual BDE getResponse(); + virtual SharedHandle getResponse(); virtual const std::string& getMessageType() const; diff --git a/src/DHTGetPeersMessage.cc b/src/DHTGetPeersMessage.cc index 660c3f7ba..608646b2d 100644 --- a/src/DHTGetPeersMessage.cc +++ b/src/DHTGetPeersMessage.cc @@ -45,7 +45,6 @@ #include "Peer.h" #include "DHTTokenTracker.h" #include "util.h" -#include "bencode.h" namespace aria2 { @@ -86,11 +85,11 @@ void DHTGetPeersMessage::doReceivedAction() getMessageDispatcher()->addMessageToQueue(reply); } -BDE DHTGetPeersMessage::getArgument() +SharedHandle DHTGetPeersMessage::getArgument() { - BDE aDict = BDE::dict(); - aDict[DHTMessage::ID] = BDE(getLocalNode()->getID(), DHT_ID_LENGTH); - aDict[INFO_HASH] = BDE(_infoHash, DHT_ID_LENGTH); + SharedHandle aDict = Dict::g(); + aDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); + aDict->put(INFO_HASH, String::g(_infoHash, DHT_ID_LENGTH)); return aDict; } diff --git a/src/DHTGetPeersMessage.h b/src/DHTGetPeersMessage.h index e7c5bd6f3..a0a8a94b1 100644 --- a/src/DHTGetPeersMessage.h +++ b/src/DHTGetPeersMessage.h @@ -63,7 +63,7 @@ public: virtual void doReceivedAction(); - virtual BDE getArgument(); + virtual SharedHandle getArgument(); virtual const std::string& getMessageType() const; diff --git a/src/DHTGetPeersReplyMessage.cc b/src/DHTGetPeersReplyMessage.cc index 84720a024..ff621a69a 100644 --- a/src/DHTGetPeersReplyMessage.cc +++ b/src/DHTGetPeersReplyMessage.cc @@ -45,7 +45,6 @@ #include "bittorrent_helper.h" #include "Peer.h" #include "util.h" -#include "bencode.h" #include "a2functional.h" namespace aria2 { @@ -73,11 +72,11 @@ void DHTGetPeersReplyMessage::doReceivedAction() // Returned peers and nodes are handled in DHTPeerLookupTask. } -BDE DHTGetPeersReplyMessage::getResponse() +SharedHandle DHTGetPeersReplyMessage::getResponse() { - BDE rDict = BDE::dict(); - rDict[DHTMessage::ID] = BDE(getLocalNode()->getID(), DHT_ID_LENGTH); - rDict[TOKEN] = _token; + SharedHandle rDict = Dict::g(); + rDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); + rDict->put(TOKEN, _token); if(_values.empty()) { size_t offset = 0; unsigned char buffer[DHTBucket::K*26]; @@ -91,7 +90,7 @@ BDE DHTGetPeersReplyMessage::getResponse() offset += 26; } } - rDict[NODES] = BDE(buffer, offset); + rDict->put(NODES, String::g(buffer, offset)); } else { // Limit the size of values list. The maxmum size of UDP datagram // is limited to 65535 bytes. aria2 uses 20bytes token and 2byte @@ -113,18 +112,18 @@ BDE DHTGetPeersReplyMessage::getResponse() // template may get bigger than 87 bytes. So we use 100 as maximum // number of peer info that a message can carry. static const size_t MAX_VALUES_SIZE = 100; - BDE valuesList = BDE::list(); + SharedHandle valuesList = List::g(); for(std::vector >::const_iterator i = _values.begin(), - eoi = _values.end(); i != eoi && valuesList.size() < MAX_VALUES_SIZE; + eoi = _values.end(); i != eoi && valuesList->size() < MAX_VALUES_SIZE; ++i) { const SharedHandle& peer = *i; unsigned char buffer[6]; if(bittorrent::createcompact (buffer, peer->getIPAddress(), peer->getPort())) { - valuesList << BDE(buffer, sizeof(buffer)); + valuesList->append(String::g(buffer, sizeof(buffer))); } } - rDict[VALUES] = valuesList; + rDict->put(VALUES, valuesList); } return rDict; } diff --git a/src/DHTGetPeersReplyMessage.h b/src/DHTGetPeersReplyMessage.h index 61e3fca96..63045803c 100644 --- a/src/DHTGetPeersReplyMessage.h +++ b/src/DHTGetPeersReplyMessage.h @@ -64,7 +64,7 @@ public: virtual void doReceivedAction(); - virtual BDE getResponse(); + virtual SharedHandle getResponse(); virtual const std::string& getMessageType() const; diff --git a/src/DHTMessageFactory.h b/src/DHTMessageFactory.h index fb25dc447..f0140f128 100644 --- a/src/DHTMessageFactory.h +++ b/src/DHTMessageFactory.h @@ -42,6 +42,7 @@ #include "SharedHandle.h" #include "A2STR.h" +#include "ValueBase.h" namespace aria2 { @@ -50,19 +51,18 @@ class DHTQueryMessage; class DHTResponseMessage; class DHTNode; class Peer; -class BDE; class DHTMessageFactory { public: virtual ~DHTMessageFactory() {} virtual SharedHandle - createQueryMessage(const BDE& dict, + createQueryMessage(const Dict* dict, const std::string& ipaddr, uint16_t port) = 0; virtual SharedHandle createResponseMessage(const std::string& messageType, - const BDE& dict, + const Dict* dict, const std::string& ipaddr, uint16_t port) = 0; virtual SharedHandle diff --git a/src/DHTMessageFactoryImpl.cc b/src/DHTMessageFactoryImpl.cc index 3db7e41df..5c1c51cb9 100644 --- a/src/DHTMessageFactoryImpl.cc +++ b/src/DHTMessageFactoryImpl.cc @@ -61,7 +61,6 @@ #include "Peer.h" #include "Logger.h" #include "StringFormat.h" -#include "bencode.h" namespace aria2 { @@ -83,11 +82,10 @@ DHTMessageFactoryImpl::getRemoteNode return node; } -static const BDE& getDictionary(const BDE& dict, - const std::string& key) +static const Dict* getDictionary(const Dict* dict, const std::string& key) { - const BDE& d = dict[key]; - if(d.isDict()) { + const Dict* d = asDict(dict->get(key)); + if(d) { return d; } else { throw DL_ABORT_EX @@ -95,11 +93,10 @@ static const BDE& getDictionary(const BDE& dict, } } -static const BDE& getString(const BDE& dict, - const std::string& key) +static const String* getString(const Dict* dict, const std::string& key) { - const BDE& c = dict[key]; - if(c.isString()) { + const String* c = asString(dict->get(key)); + if(c) { return c; } else { throw DL_ABORT_EX @@ -107,11 +104,10 @@ static const BDE& getString(const BDE& dict, } } -static const BDE& getInteger(const BDE& dict, - const std::string& key) +static const Integer* getInteger(const Dict* dict, const std::string& key) { - const BDE& c = dict[key]; - if(c.isInteger()) { + const Integer* c = asInteger(dict->get(key)); + if(c) { return c; } else { throw DL_ABORT_EX @@ -119,10 +115,10 @@ static const BDE& getInteger(const BDE& dict, } } -static const BDE& getString(const BDE& list, size_t index) +static const String* getString(const List* list, size_t index) { - const BDE& c = list[index]; - if(c.isString()) { + const String* c = asString(list->get(index)); + if(c) { return c; } else { throw DL_ABORT_EX @@ -131,10 +127,10 @@ static const BDE& getString(const BDE& list, size_t index) } } -static const BDE& getInteger(const BDE& list, size_t index) +static const Integer* getInteger(const List* list, size_t index) { - const BDE& c = list[index]; - if(c.isInteger()) { + const Integer* c = asInteger(list->get(index)); + if(c) { return c; } else { throw DL_ABORT_EX @@ -143,11 +139,10 @@ static const BDE& getInteger(const BDE& list, size_t index) } } -static const BDE& getList(const BDE& dict, - const std::string& key) +static const List* getList(const Dict* dict, const std::string& key) { - const BDE& l = dict[key]; - if(l.isList()) { + const List* l = asList(dict->get(key)); + if(l) { return l; } else { throw DL_ABORT_EX @@ -155,78 +150,73 @@ static const BDE& getList(const BDE& dict, } } -void DHTMessageFactoryImpl::validateID(const BDE& id) const +void DHTMessageFactoryImpl::validateID(const String* id) const { - if(id.s().size() != DHT_ID_LENGTH) { + if(id->s().size() != DHT_ID_LENGTH) { throw DL_ABORT_EX (StringFormat("Malformed DHT message. Invalid ID length." " Expected:%d, Actual:%d", - DHT_ID_LENGTH, id.s().size()).str()); + DHT_ID_LENGTH, id->s().size()).str()); } } -void DHTMessageFactoryImpl::validatePort(const BDE& i) const +void DHTMessageFactoryImpl::validatePort(const Integer* port) const { - BDE::Integer port = i.i(); - if(!(0 < port && port < UINT16_MAX)) { + if(!(0 < port->i() && port->i() < UINT16_MAX)) { throw DL_ABORT_EX (StringFormat("Malformed DHT message. Invalid port=%s", - util::itos(port).c_str()).str()); + util::itos(port->i()).c_str()).str()); } } -static void setVersion(const SharedHandle& msg, const BDE& dict) +static void setVersion(const SharedHandle& msg, const Dict* dict) { - const BDE& v = dict[DHTMessage::V]; - if(v.isString()) { - msg->setVersion(v.s()); + const String* v = asString(dict->get(DHTMessage::V)); + if(v) { + msg->setVersion(v->s()); } else { msg->setVersion(A2STR::NIL); } } SharedHandle DHTMessageFactoryImpl::createQueryMessage -(const BDE& dict, const std::string& ipaddr, uint16_t port) +(const Dict* dict, const std::string& ipaddr, uint16_t port) { - const BDE& messageType = getString(dict, DHTQueryMessage::Q); - const BDE& transactionID = getString(dict, DHTMessage::T); - const BDE& y = getString(dict, DHTMessage::Y); - const BDE& aDict = getDictionary(dict, DHTQueryMessage::A); - if(y.s() != DHTQueryMessage::Q) { + const String* messageType = getString(dict, DHTQueryMessage::Q); + const String* transactionID = getString(dict, DHTMessage::T); + const String* y = getString(dict, DHTMessage::Y); + const Dict* aDict = getDictionary(dict, DHTQueryMessage::A); + if(y->s() != DHTQueryMessage::Q) { throw DL_ABORT_EX("Malformed DHT message. y != q"); } - const BDE& id = getString(aDict, DHTMessage::ID); + const String* id = getString(aDict, DHTMessage::ID); validateID(id); - SharedHandle remoteNode = getRemoteNode(id.uc(), ipaddr, port); + SharedHandle remoteNode = getRemoteNode(id->uc(), ipaddr, port); SharedHandle msg; - if(messageType.s() == DHTPingMessage::PING) { - msg = createPingMessage(remoteNode, transactionID.s()); - } else if(messageType.s() == DHTFindNodeMessage::FIND_NODE) { - const BDE& targetNodeID = + if(messageType->s() == DHTPingMessage::PING) { + msg = createPingMessage(remoteNode, transactionID->s()); + } else if(messageType->s() == DHTFindNodeMessage::FIND_NODE) { + const String* targetNodeID = getString(aDict, DHTFindNodeMessage::TARGET_NODE); validateID(targetNodeID); - msg = createFindNodeMessage(remoteNode, targetNodeID.uc(), - transactionID.s()); - } else if(messageType.s() == DHTGetPeersMessage::GET_PEERS) { - const BDE& infoHash = - getString(aDict, DHTGetPeersMessage::INFO_HASH); + msg = createFindNodeMessage(remoteNode, targetNodeID->uc(), + transactionID->s()); + } else if(messageType->s() == DHTGetPeersMessage::GET_PEERS) { + const String* infoHash = getString(aDict, DHTGetPeersMessage::INFO_HASH); validateID(infoHash); - msg = createGetPeersMessage(remoteNode, - infoHash.uc(), transactionID.s()); - } else if(messageType.s() == DHTAnnouncePeerMessage::ANNOUNCE_PEER) { - const BDE& infoHash = - getString(aDict, DHTAnnouncePeerMessage::INFO_HASH); + msg = createGetPeersMessage(remoteNode, infoHash->uc(), transactionID->s()); + } else if(messageType->s() == DHTAnnouncePeerMessage::ANNOUNCE_PEER) { + const String* infoHash = getString(aDict,DHTAnnouncePeerMessage::INFO_HASH); validateID(infoHash); - const BDE& port = getInteger(aDict, DHTAnnouncePeerMessage::PORT); + const Integer* port = getInteger(aDict, DHTAnnouncePeerMessage::PORT); validatePort(port); - const BDE& token = getString(aDict, DHTAnnouncePeerMessage::TOKEN); - msg = createAnnouncePeerMessage(remoteNode, infoHash.uc(), - static_cast(port.i()), - token.s(), transactionID.s()); + const String* token = getString(aDict, DHTAnnouncePeerMessage::TOKEN); + msg = createAnnouncePeerMessage(remoteNode, infoHash->uc(), + static_cast(port->i()), + token->s(), transactionID->s()); } else { - throw DL_ABORT_EX - (StringFormat("Unsupported message type: %s", - messageType.s().c_str()).str()); + throw DL_ABORT_EX(StringFormat("Unsupported message type: %s", + messageType->s().c_str()).str()); } setVersion(msg, dict); return msg; @@ -235,20 +225,20 @@ SharedHandle DHTMessageFactoryImpl::createQueryMessage SharedHandle DHTMessageFactoryImpl::createResponseMessage (const std::string& messageType, - const BDE& dict, + const Dict* dict, const std::string& ipaddr, uint16_t port) { - const BDE& transactionID = getString(dict, DHTMessage::T); - const BDE& y = getString(dict, DHTMessage::Y); - if(y.s() == DHTUnknownMessage::E) { + const String* transactionID = getString(dict, DHTMessage::T); + const String* y = getString(dict, DHTMessage::Y); + if(y->s() == DHTUnknownMessage::E) { // for now, just report error message arrived and throw exception. - const BDE& e = getList(dict, DHTUnknownMessage::E); - if(e.size() == 2) { + const List* e = getList(dict, DHTUnknownMessage::E); + if(e->size() == 2) { if(_logger->info()) { _logger->info("Received Error DHT message. code=%s, msg=%s", - util::itos(getInteger(e, 0).i()).c_str(), - util::percentEncode(getString(e, 1).s()).c_str()); + util::itos(getInteger(e, 0)->i()).c_str(), + util::percentEncode(getString(e, 1)->s()).c_str()); } } else { if(_logger->debug()) { @@ -256,36 +246,38 @@ DHTMessageFactoryImpl::createResponseMessage } } throw DL_ABORT_EX("Received Error DHT message."); - } else if(y.s() != DHTResponseMessage::R) { + } else if(y->s() != DHTResponseMessage::R) { throw DL_ABORT_EX (StringFormat("Malformed DHT message. y != r: y=%s", - util::percentEncode(y.s()).c_str()).str()); + util::percentEncode(y->s()).c_str()).str()); } - const BDE& rDict = getDictionary(dict, DHTResponseMessage::R); - const BDE& id = getString(rDict, DHTMessage::ID); + const Dict* rDict = getDictionary(dict, DHTResponseMessage::R); + const String* id = getString(rDict, DHTMessage::ID); validateID(id); - SharedHandle remoteNode = getRemoteNode(id.uc(), ipaddr, port); + SharedHandle remoteNode = getRemoteNode(id->uc(), ipaddr, port); SharedHandle msg; if(messageType == DHTPingReplyMessage::PING) { - msg = createPingReplyMessage(remoteNode, id.uc(), transactionID.s()); + msg = createPingReplyMessage(remoteNode, id->uc(), transactionID->s()); } else if(messageType == DHTFindNodeReplyMessage::FIND_NODE) { - msg = createFindNodeReplyMessage(remoteNode, dict, transactionID.s()); + msg = createFindNodeReplyMessage(remoteNode, dict, transactionID->s()); } else if(messageType == DHTGetPeersReplyMessage::GET_PEERS) { - const BDE& valuesList = rDict[DHTGetPeersReplyMessage::VALUES]; - if(valuesList.isList()) { - msg = createGetPeersReplyMessageWithValues(remoteNode, dict, - transactionID.s()); + const List* valuesList = + asList(rDict->get(DHTGetPeersReplyMessage::VALUES)); + if(valuesList) { + msg = createGetPeersReplyMessageWithValues + (remoteNode, dict, transactionID->s()); } else { - const BDE& nodes = rDict[DHTGetPeersReplyMessage::NODES]; - if(nodes.isString()) { - msg = createGetPeersReplyMessageWithNodes(remoteNode, dict, - transactionID.s()); + const String* nodes = asString + (rDict->get(DHTGetPeersReplyMessage::NODES)); + if(nodes) { + msg = createGetPeersReplyMessageWithNodes + (remoteNode, dict, transactionID->s()); } else { throw DL_ABORT_EX("Malformed DHT message: missing nodes/values"); } } } else if(messageType == DHTAnnouncePeerReplyMessage::ANNOUNCE_PEER) { - msg = createAnnouncePeerReplyMessage(remoteNode, transactionID.s()); + msg = createAnnouncePeerReplyMessage(remoteNode, transactionID->s()); } else { throw DL_ABORT_EX (StringFormat("Unsupported message type: %s", messageType.c_str()).str()); @@ -307,7 +299,8 @@ static const std::string& getDefaultVersion() return version; } -void DHTMessageFactoryImpl::setCommonProperty(const SharedHandle& m) +void DHTMessageFactoryImpl::setCommonProperty +(const SharedHandle& m) { m->setConnection(_connection); m->setMessageDispatcher(_dispatcher); @@ -320,7 +313,8 @@ void DHTMessageFactoryImpl::setCommonProperty(const SharedHandle DHTMessageFactoryImpl::createPingMessage (const SharedHandle& remoteNode, const std::string& transactionID) { - SharedHandle m(new DHTPingMessage(_localNode, remoteNode, transactionID)); + SharedHandle m + (new DHTPingMessage(_localNode, remoteNode, transactionID)); setCommonProperty(m); return m; } @@ -385,14 +379,14 @@ DHTMessageFactoryImpl::extractNodes(const unsigned char* src, size_t length) SharedHandle DHTMessageFactoryImpl::createFindNodeReplyMessage (const SharedHandle& remoteNode, - const BDE& dict, + const Dict* dict, const std::string& transactionID) { - const BDE& nodesData = + const String* nodesData = getString(getDictionary(dict, DHTResponseMessage::R), DHTFindNodeReplyMessage::NODES); std::vector > nodes = - extractNodes(nodesData.uc(), nodesData.s().size()); + extractNodes(nodesData->uc(), nodesData->s().size()); return createFindNodeReplyMessage(remoteNode, nodes, transactionID); } @@ -413,17 +407,16 @@ DHTMessageFactoryImpl::createGetPeersMessage SharedHandle DHTMessageFactoryImpl::createGetPeersReplyMessageWithNodes (const SharedHandle& remoteNode, - const BDE& dict, + const Dict* dict, const std::string& transactionID) { - const BDE& rDict = getDictionary(dict, DHTResponseMessage::R); - const BDE& nodesData = getString(rDict, - DHTGetPeersReplyMessage::NODES); - std::vector > nodes = - extractNodes(nodesData.uc(), nodesData.s().size()); - const BDE& token = getString(rDict, DHTGetPeersReplyMessage::TOKEN); - return createGetPeersReplyMessage(remoteNode, nodes, token.s(), - transactionID); + const Dict* rDict = getDictionary(dict, DHTResponseMessage::R); + const String* nodesData = getString(rDict, DHTGetPeersReplyMessage::NODES); + std::vector > nodes = extractNodes + (nodesData->uc(), nodesData->s().size()); + const String* token = getString(rDict, DHTGetPeersReplyMessage::TOKEN); + return createGetPeersReplyMessage + (remoteNode, nodes, token->s(), transactionID); } SharedHandle @@ -443,26 +436,26 @@ DHTMessageFactoryImpl::createGetPeersReplyMessage SharedHandle DHTMessageFactoryImpl::createGetPeersReplyMessageWithValues (const SharedHandle& remoteNode, - const BDE& dict, + const Dict* dict, const std::string& transactionID) { - const BDE& rDict = getDictionary(dict, DHTResponseMessage::R); - const BDE& valuesList = getList(rDict, + const Dict* rDict = getDictionary(dict, DHTResponseMessage::R); + const List* valuesList = getList(rDict, DHTGetPeersReplyMessage::VALUES); std::vector > peers; - for(BDE::List::const_iterator i = valuesList.listBegin(), - eoi = valuesList.listEnd(); i != eoi; ++i) { - const BDE& data = *i; - if(data.isString() && data.s().size() == 6) { + for(List::ValueType::const_iterator i = valuesList->begin(), + eoi = valuesList->end(); i != eoi; ++i) { + const String* data = asString(*i); + if(data && data->s().size() == 6) { std::pair addr = - bittorrent::unpackcompact(data.uc()); + bittorrent::unpackcompact(data->uc()); SharedHandle peer(new Peer(addr.first, addr.second)); peers.push_back(peer); } } - const BDE& token = getString(rDict, DHTGetPeersReplyMessage::TOKEN); - return createGetPeersReplyMessage(remoteNode, peers, token.s(), - transactionID); + const String* token = getString(rDict, DHTGetPeersReplyMessage::TOKEN); + return createGetPeersReplyMessage + (remoteNode, peers, token->s(), transactionID); } SharedHandle diff --git a/src/DHTMessageFactoryImpl.h b/src/DHTMessageFactoryImpl.h index 2aed434da..2d01297ef 100644 --- a/src/DHTMessageFactoryImpl.h +++ b/src/DHTMessageFactoryImpl.h @@ -69,9 +69,9 @@ private: SharedHandle getRemoteNode (const unsigned char* id, const std::string& ipaddr, uint16_t port) const; - void validateID(const BDE& id) const; + void validateID(const String* id) const; - void validatePort(const BDE& i) const; + void validatePort(const Integer* i) const; std::vector > extractNodes(const unsigned char* src, size_t length); @@ -84,12 +84,12 @@ public: virtual ~DHTMessageFactoryImpl(); virtual SharedHandle - createQueryMessage(const BDE& dict, + createQueryMessage(const Dict* dict, const std::string& ipaddr, uint16_t port); virtual SharedHandle createResponseMessage(const std::string& messageType, - const BDE& dict, + const Dict* dict, const std::string& ipaddr, uint16_t port); virtual SharedHandle @@ -108,7 +108,7 @@ public: SharedHandle createFindNodeReplyMessage(const SharedHandle& remoteNode, - const BDE& dict, + const Dict* dict, const std::string& transactionID); @@ -132,7 +132,7 @@ public: SharedHandle createGetPeersReplyMessageWithNodes(const SharedHandle& remoteNode, - const BDE& dict, + const Dict* dict, const std::string& transactionID); virtual SharedHandle @@ -144,7 +144,7 @@ public: SharedHandle createGetPeersReplyMessageWithValues(const SharedHandle& remoteNode, - const BDE& dict, + const Dict* dict, const std::string& transactionID); virtual SharedHandle diff --git a/src/DHTMessageReceiver.cc b/src/DHTMessageReceiver.cc index 3269d0a82..273d35ade 100644 --- a/src/DHTMessageReceiver.cc +++ b/src/DHTMessageReceiver.cc @@ -51,7 +51,7 @@ #include "LogFactory.h" #include "Logger.h" #include "util.h" -#include "bencode.h" +#include "bencode2.h" namespace aria2 { @@ -75,11 +75,12 @@ SharedHandle DHTMessageReceiver::receiveMessage() return SharedHandle(); } bool isReply = false; - const BDE dict = bencode::decode(data, length); - if(dict.isDict()) { - const BDE& y = dict[DHTMessage::Y]; - if(y.isString()) { - if(y.s() == DHTResponseMessage::R || y.s() == DHTUnknownMessage::E) { + SharedHandle decoded = bencode2::decode(data, length); + const Dict* dict = asDict(decoded); + if(dict) { + const String* y = asString(dict->get(DHTMessage::Y)); + if(y) { + if(y->s() == DHTResponseMessage::R || y->s() == DHTUnknownMessage::E) { isReply = true; } } else { diff --git a/src/DHTMessageTracker.cc b/src/DHTMessageTracker.cc index 02c582bcb..edd3163ae 100644 --- a/src/DHTMessageTracker.cc +++ b/src/DHTMessageTracker.cc @@ -48,7 +48,6 @@ #include "DlAbortEx.h" #include "DHTConstants.h" #include "StringFormat.h" -#include "bencode.h" namespace aria2 { @@ -65,20 +64,20 @@ void DHTMessageTracker::addMessage(const SharedHandle& message, time std::pair, SharedHandle > DHTMessageTracker::messageArrived -(const BDE& dict, const std::string& ipaddr, uint16_t port) +(const Dict* dict, const std::string& ipaddr, uint16_t port) { - const BDE& tid = dict[DHTMessage::T]; - if(!tid.isString()) { + const String* tid = asString(dict->get(DHTMessage::T)); + if(!tid) { throw DL_ABORT_EX(StringFormat("Malformed DHT message. From:%s:%u", ipaddr.c_str(), port).str()); } if(_logger->debug()) { _logger->debug("Searching tracker entry for TransactionID=%s, Remote=%s:%u", - util::toHex(tid.s()).c_str(), ipaddr.c_str(), port); + util::toHex(tid->s()).c_str(), ipaddr.c_str(), port); } for(std::deque >::iterator i = _entries.begin(), eoi = _entries.end(); i != eoi; ++i) { - if((*i)->match(tid.s(), ipaddr, port)) { + if((*i)->match(tid->s(), ipaddr, port)) { SharedHandle entry = *i; _entries.erase(i); if(_logger->debug()) { @@ -162,12 +161,14 @@ size_t DHTMessageTracker::countEntry() const return _entries.size(); } -void DHTMessageTracker::setRoutingTable(const SharedHandle& routingTable) +void DHTMessageTracker::setRoutingTable +(const SharedHandle& routingTable) { _routingTable = routingTable; } -void DHTMessageTracker::setMessageFactory(const SharedHandle& factory) +void DHTMessageTracker::setMessageFactory +(const SharedHandle& factory) { _factory = factory; } diff --git a/src/DHTMessageTracker.h b/src/DHTMessageTracker.h index c3d360624..c8c73b729 100644 --- a/src/DHTMessageTracker.h +++ b/src/DHTMessageTracker.h @@ -42,6 +42,7 @@ #include "SharedHandle.h" #include "a2time.h" +#include "ValueBase.h" namespace aria2 { @@ -52,7 +53,6 @@ class DHTRoutingTable; class DHTMessageFactory; class DHTMessageTrackerEntry; class Logger; -class BDE; class DHTMessageTracker { private: @@ -74,7 +74,7 @@ public: SharedHandle()); std::pair, SharedHandle > - messageArrived(const BDE& dict, + messageArrived(const Dict* dict, const std::string& ipaddr, uint16_t port); void handleTimeout(); diff --git a/src/DHTPingMessage.cc b/src/DHTPingMessage.cc index 5104940e3..6038aab35 100644 --- a/src/DHTPingMessage.cc +++ b/src/DHTPingMessage.cc @@ -38,7 +38,6 @@ #include "DHTMessageDispatcher.h" #include "DHTMessageFactory.h" #include "DHTMessageCallback.h" -#include "bencode.h" namespace aria2 { @@ -60,10 +59,10 @@ void DHTPingMessage::doReceivedAction() getMessageDispatcher()->addMessageToQueue(reply); } -BDE DHTPingMessage::getArgument() +SharedHandle DHTPingMessage::getArgument() { - BDE aDict = BDE::dict(); - aDict[DHTMessage::ID] = BDE(getLocalNode()->getID(), DHT_ID_LENGTH); + SharedHandle aDict = Dict::g(); + aDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); return aDict; } diff --git a/src/DHTPingMessage.h b/src/DHTPingMessage.h index 983e3211b..93e00a090 100644 --- a/src/DHTPingMessage.h +++ b/src/DHTPingMessage.h @@ -50,7 +50,7 @@ public: virtual void doReceivedAction(); - virtual BDE getArgument(); + virtual SharedHandle getArgument(); virtual const std::string& getMessageType() const; diff --git a/src/DHTPingReplyMessage.cc b/src/DHTPingReplyMessage.cc index f004a0376..7420fd2a4 100644 --- a/src/DHTPingReplyMessage.cc +++ b/src/DHTPingReplyMessage.cc @@ -37,17 +37,17 @@ #include #include "DHTNode.h" -#include "bencode.h" #include "DHTMessageCallback.h" namespace aria2 { const std::string DHTPingReplyMessage::PING("ping"); -DHTPingReplyMessage::DHTPingReplyMessage(const SharedHandle& localNode, - const SharedHandle& remoteNode, - const unsigned char* id, - const std::string& transactionID): +DHTPingReplyMessage::DHTPingReplyMessage +(const SharedHandle& localNode, + const SharedHandle& remoteNode, + const unsigned char* id, + const std::string& transactionID): DHTResponseMessage(localNode, remoteNode, transactionID) { memcpy(_id, id, DHT_ID_LENGTH); @@ -57,10 +57,10 @@ DHTPingReplyMessage::~DHTPingReplyMessage() {} void DHTPingReplyMessage::doReceivedAction() {} -BDE DHTPingReplyMessage::getResponse() +SharedHandle DHTPingReplyMessage::getResponse() { - BDE rDict = BDE::dict(); - rDict[DHTMessage::ID] = BDE(_id, DHT_ID_LENGTH); + SharedHandle rDict = Dict::g(); + rDict->put(DHTMessage::ID, String::g(_id, DHT_ID_LENGTH)); return rDict; } diff --git a/src/DHTPingReplyMessage.h b/src/DHTPingReplyMessage.h index 00a8e6996..d9660bd5f 100644 --- a/src/DHTPingReplyMessage.h +++ b/src/DHTPingReplyMessage.h @@ -53,7 +53,7 @@ public: virtual void doReceivedAction(); - virtual BDE getResponse(); + virtual SharedHandle getResponse(); virtual const std::string& getMessageType() const; diff --git a/src/DHTQueryMessage.cc b/src/DHTQueryMessage.cc index 7c91748a9..61e3fba6d 100644 --- a/src/DHTQueryMessage.cc +++ b/src/DHTQueryMessage.cc @@ -35,7 +35,6 @@ #include "DHTQueryMessage.h" #include "DHTNode.h" #include "util.h" -#include "bencode.h" #include "a2functional.h" namespace aria2 { @@ -56,10 +55,10 @@ const std::string& DHTQueryMessage::getType() const return Q; } -void DHTQueryMessage::fillMessage(BDE& msgDict) +void DHTQueryMessage::fillMessage(Dict* msgDict) { - msgDict[Q] = getMessageType(); - msgDict[A] = getArgument(); + msgDict->put(Q, getMessageType()); + msgDict->put(A, getArgument()); } bool DHTQueryMessage::isReply() const diff --git a/src/DHTQueryMessage.h b/src/DHTQueryMessage.h index 2cc0cab83..8a65e834f 100644 --- a/src/DHTQueryMessage.h +++ b/src/DHTQueryMessage.h @@ -37,6 +37,7 @@ #include "DHTAbstractMessage.h" #include "A2STR.h" +#include "ValueBase.h" namespace aria2 { @@ -52,9 +53,9 @@ public: virtual const std::string& getType() const; - virtual void fillMessage(BDE& msgDict); + virtual void fillMessage(Dict* msgDict); - virtual BDE getArgument() = 0; + virtual SharedHandle getArgument() = 0; virtual bool isReply() const; diff --git a/src/DHTResponseMessage.cc b/src/DHTResponseMessage.cc index e20e651b4..03fcbde7b 100644 --- a/src/DHTResponseMessage.cc +++ b/src/DHTResponseMessage.cc @@ -35,7 +35,6 @@ #include "DHTResponseMessage.h" #include "DHTNode.h" #include "util.h" -#include "bencode.h" #include "a2functional.h" namespace aria2 { @@ -54,9 +53,9 @@ const std::string& DHTResponseMessage::getType() const return R; } -void DHTResponseMessage::fillMessage(BDE& msgDict) +void DHTResponseMessage::fillMessage(Dict* msgDict) { - msgDict[R] = getResponse(); + msgDict->put(R, getResponse()); } bool DHTResponseMessage::isReply() const diff --git a/src/DHTResponseMessage.h b/src/DHTResponseMessage.h index 6f466368a..1300236c1 100644 --- a/src/DHTResponseMessage.h +++ b/src/DHTResponseMessage.h @@ -37,6 +37,7 @@ #include "DHTAbstractMessage.h" #include "A2STR.h" +#include "ValueBase.h" namespace aria2 { @@ -54,9 +55,9 @@ public: virtual const std::string& getType() const; - virtual void fillMessage(BDE& msgDict); + virtual void fillMessage(Dict* msgDict); - virtual BDE getResponse() = 0; + virtual SharedHandle getResponse() = 0; virtual bool isReply() const; diff --git a/src/DefaultExtensionMessageFactory.cc b/src/DefaultExtensionMessageFactory.cc index 6ce8de840..805a56b61 100644 --- a/src/DefaultExtensionMessageFactory.cc +++ b/src/DefaultExtensionMessageFactory.cc @@ -49,10 +49,10 @@ #include "UTMetadataDataExtensionMessage.h" #include "UTMetadataRejectExtensionMessage.h" #include "message.h" -#include "bencode.h" #include "PieceStorage.h" #include "UTMetadataRequestTracker.h" #include "RequestGroup.h" +#include "bencode2.h" namespace aria2 { @@ -74,7 +74,8 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t uint8_t extensionMessageID = *data; if(extensionMessageID == 0) { // handshake - HandshakeExtensionMessageHandle m = HandshakeExtensionMessage::create(data, length); + HandshakeExtensionMessageHandle m = + HandshakeExtensionMessage::create(data, length); m->setPeer(_peer); m->setDownloadContext(_dctx); return m; @@ -97,23 +98,24 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t "ut_metadata", length).str()); } size_t end; - BDE dict = bencode::decode(data+1, length-1, end); - if(!dict.isDict()) { + SharedHandle decoded = bencode2::decode(data+1, length-1, end); + const Dict* dict = asDict(decoded); + if(!dict) { throw DL_ABORT_EX("Bad ut_metadata: dictionary not found"); } - const BDE& msgType = dict["msg_type"]; - if(!msgType.isInteger()) { + const Integer* msgType = asInteger(dict->get("msg_type")); + if(!msgType) { throw DL_ABORT_EX("Bad ut_metadata: msg_type not found"); } - const BDE& index = dict["piece"]; - if(!index.isInteger()) { + const Integer* index = asInteger(dict->get("piece")); + if(!index) { throw DL_ABORT_EX("Bad ut_metadata: piece not found"); } - switch(msgType.i()) { + switch(msgType->i()) { case 0: { SharedHandle m (new UTMetadataRequestExtensionMessage(extensionMessageID)); - m->setIndex(index.i()); + m->setIndex(index->i()); m->setDownloadContext(_dctx); m->setPeer(_peer); m->setBtMessageFactory(_messageFactory); @@ -124,14 +126,14 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t if(end == length) { throw DL_ABORT_EX("Bad ut_metadata data: data not found"); } - const BDE& totalSize = dict["total_size"]; - if(!totalSize.isInteger()) { + const Integer* totalSize = asInteger(dict->get("total_size")); + if(!totalSize) { throw DL_ABORT_EX("Bad ut_metadata data: total_size not found"); } SharedHandle m (new UTMetadataDataExtensionMessage(extensionMessageID)); - m->setIndex(index.i()); - m->setTotalSize(totalSize.i()); + m->setIndex(index->i()); + m->setTotalSize(totalSize->i()); m->setData(std::string(&data[1+end], &data[length])); m->setUTMetadataRequestTracker(_tracker); m->setPieceStorage(_dctx->getOwnerRequestGroup()->getPieceStorage()); @@ -141,17 +143,18 @@ DefaultExtensionMessageFactory::createMessage(const unsigned char* data, size_t case 2: { SharedHandle m (new UTMetadataRejectExtensionMessage(extensionMessageID)); - m->setIndex(index.i()); + m->setIndex(index->i()); // No need to inject tracker because peer will be disconnected. return m; } default: throw DL_ABORT_EX(StringFormat("Bad ut_metadata: unknown msg_type=%u", - msgType.i()).str()); + msgType->i()).str()); } } else { throw DL_ABORT_EX - (StringFormat("Unsupported extension message received. extensionMessageID=%u, extensionName=%s", + (StringFormat("Unsupported extension message received." + " extensionMessageID=%u, extensionName=%s", extensionMessageID, extensionName.c_str()).str()); } } diff --git a/src/ExpatXmlRpcRequestProcessor.cc b/src/ExpatXmlRpcRequestProcessor.cc index 924f032a8..df89eb102 100644 --- a/src/ExpatXmlRpcRequestProcessor.cc +++ b/src/ExpatXmlRpcRequestProcessor.cc @@ -114,7 +114,11 @@ XmlRpcRequestProcessor::parseMemory(const std::string& xml) if(r == XML_STATUS_ERROR) { throw DL_ABORT_EX(MSG_CANNOT_PARSE_XML_RPC_REQUEST); } - return XmlRpcRequest(_stm->getMethodName(), _stm->getCurrentFrameValue()); + if(!asList(_stm->getCurrentFrameValue())) { + throw DL_ABORT_EX("Bad XML-RPC parameter list"); + } + return XmlRpcRequest(_stm->getMethodName(), + static_pointer_cast(_stm->getCurrentFrameValue())); } } // namespace xmlrpc diff --git a/src/HandshakeExtensionMessage.cc b/src/HandshakeExtensionMessage.cc index 20a3e2fb9..903838923 100644 --- a/src/HandshakeExtensionMessage.cc +++ b/src/HandshakeExtensionMessage.cc @@ -40,7 +40,7 @@ #include "Logger.h" #include "message.h" #include "StringFormat.h" -#include "bencode.h" +#include "bencode2.h" #include "DownloadContext.h" #include "bittorrent_helper.h" #include "RequestGroup.h" @@ -59,24 +59,24 @@ HandshakeExtensionMessage::~HandshakeExtensionMessage() {} std::string HandshakeExtensionMessage::getPayload() { - BDE dict = BDE::dict(); + Dict dict; if(!_clientVersion.empty()) { - dict["v"] = _clientVersion; + dict.put("v", _clientVersion); } if(_tcpPort > 0) { - dict["p"] = _tcpPort; + dict.put("p", Integer::g(_tcpPort)); } - BDE extDict = BDE::dict(); + SharedHandle extDict = Dict::g(); for(std::map::const_iterator itr = _extensions.begin(), eoi = _extensions.end(); itr != eoi; ++itr) { const std::map::value_type& vt = *itr; - extDict[vt.first] = vt.second; + extDict->put(vt.first, Integer::g(vt.second)); } - dict["m"] = extDict; + dict.put("m", extDict); if(_metadataSize) { - dict["metadata_size"] = _metadataSize; + dict.put("metadata_size", Integer::g(_metadataSize)); } - return bencode::encode(dict); + return bencode2::encode(&dict); } std::string HandshakeExtensionMessage::toString() const @@ -168,31 +168,34 @@ HandshakeExtensionMessage::create(const unsigned char* data, size_t length) ("Creating HandshakeExtensionMessage from %s", util::percentEncode(data, length).c_str()); } - const BDE dict = bencode::decode(data+1, length-1); - if(!dict.isDict()) { - throw DL_ABORT_EX("Unexpected payload format for extended message handshake"); + SharedHandle decoded = bencode2::decode(data+1, length-1); + const Dict* dict = asDict(decoded); + if(!dict) { + throw DL_ABORT_EX + ("Unexpected payload format for extended message handshake"); } - const BDE& port = dict["p"]; - if(port.isInteger() && 0 < port.i() && port.i() < 65536) { - msg->_tcpPort = port.i(); + const Integer* port = asInteger(dict->get("p")); + if(port && 0 < port->i() && port->i() < 65536) { + msg->_tcpPort = port->i(); } - const BDE& version = dict["v"]; - if(version.isString()) { - msg->_clientVersion = version.s(); + const String* version = asString(dict->get("v")); + if(version) { + msg->_clientVersion = version->s(); } - const BDE& extDict = dict["m"]; - if(extDict.isDict()) { - for(BDE::Dict::const_iterator i = extDict.dictBegin(), - eoi = extDict.dictEnd(); i != eoi; ++i) { - if((*i).second.isInteger()) { - msg->_extensions[(*i).first] = (*i).second.i(); + const Dict* extDict = asDict(dict->get("m")); + if(extDict) { + for(Dict::ValueType::const_iterator i = extDict->begin(), + eoi = extDict->end(); i != eoi; ++i) { + const Integer* extId = asInteger((*i).second); + if(extId) { + msg->_extensions[(*i).first] = extId->i(); } } } - const BDE& metadataSize = dict["metadata_size"]; + const Integer* metadataSize = asInteger(dict->get("metadata_size")); // Only accept metadata smaller than 1MiB - if(metadataSize.isInteger() && metadataSize.i() <= 1024*1024) { - msg->_metadataSize = metadataSize.i(); + if(metadataSize && metadataSize->i() <= 1024*1024) { + msg->_metadataSize = metadataSize->i(); } return msg; } diff --git a/src/Makefile.am b/src/Makefile.am index 485b604b2..ad4835f62 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -194,7 +194,6 @@ SRCS = Socket.h\ PieceSelector.h\ LongestSequencePieceSelector.cc LongestSequencePieceSelector.h\ bitfield.cc bitfield.h\ - BDE.cc BDE.h\ CreateRequestCommand.cc CreateRequestCommand.h\ DownloadResultCode.h\ wallclock.h\ @@ -204,7 +203,6 @@ SRCS = Socket.h\ Event.h\ timespec.h\ ValueBase.cc ValueBase.h\ - bencode2.cc bencode2.h\ ContextAttribute.h\ TorrentAttribute.h @@ -447,7 +445,6 @@ SRCS += PeerAbstractCommand.cc PeerAbstractCommand.h\ RangeBtMessageValidator.h\ IndexBtMessageValidator.h\ ExtensionMessageRegistry.h\ - bencode.cc bencode.h\ bittorrent_helper.cc bittorrent_helper.h\ BtStopDownloadCommand.cc BtStopDownloadCommand.h\ PriorityPieceSelector.cc PriorityPieceSelector.h\ @@ -455,7 +452,8 @@ SRCS += PeerAbstractCommand.cc PeerAbstractCommand.h\ LpdMessageReceiver.cc LpdMessageReceiver.h\ LpdMessage.h\ LpdReceiveMessageCommand.cc LpdReceiveMessageCommand.h\ - LpdDispatchMessageCommand.cc LpdDispatchMessageCommand.h + LpdDispatchMessageCommand.cc LpdDispatchMessageCommand.h\ + bencode2.cc bencode2.h endif # ENABLE_BITTORRENT if ENABLE_METALINK diff --git a/src/Makefile.in b/src/Makefile.in index 8f5b23a3d..a18465f9a 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -241,7 +241,6 @@ bin_PROGRAMS = aria2c$(EXEEXT) @ENABLE_BITTORRENT_TRUE@ RangeBtMessageValidator.h\ @ENABLE_BITTORRENT_TRUE@ IndexBtMessageValidator.h\ @ENABLE_BITTORRENT_TRUE@ ExtensionMessageRegistry.h\ -@ENABLE_BITTORRENT_TRUE@ bencode.cc bencode.h\ @ENABLE_BITTORRENT_TRUE@ bittorrent_helper.cc bittorrent_helper.h\ @ENABLE_BITTORRENT_TRUE@ BtStopDownloadCommand.cc BtStopDownloadCommand.h\ @ENABLE_BITTORRENT_TRUE@ PriorityPieceSelector.cc PriorityPieceSelector.h\ @@ -249,7 +248,8 @@ bin_PROGRAMS = aria2c$(EXEEXT) @ENABLE_BITTORRENT_TRUE@ LpdMessageReceiver.cc LpdMessageReceiver.h\ @ENABLE_BITTORRENT_TRUE@ LpdMessage.h\ @ENABLE_BITTORRENT_TRUE@ LpdReceiveMessageCommand.cc LpdReceiveMessageCommand.h\ -@ENABLE_BITTORRENT_TRUE@ LpdDispatchMessageCommand.cc LpdDispatchMessageCommand.h +@ENABLE_BITTORRENT_TRUE@ LpdDispatchMessageCommand.cc LpdDispatchMessageCommand.h\ +@ENABLE_BITTORRENT_TRUE@ bencode2.cc bencode2.h @ENABLE_METALINK_TRUE@am__append_14 = Metalinker.cc Metalinker.h\ @ENABLE_METALINK_TRUE@ MetalinkEntry.cc MetalinkEntry.h\ @@ -433,13 +433,12 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \ SelectEventPoll.cc SelectEventPoll.h SequentialPicker.h \ SequentialDispatcherCommand.h PieceSelector.h \ LongestSequencePieceSelector.cc LongestSequencePieceSelector.h \ - bitfield.cc bitfield.h BDE.cc BDE.h CreateRequestCommand.cc \ + bitfield.cc bitfield.h CreateRequestCommand.cc \ CreateRequestCommand.h DownloadResultCode.h wallclock.h \ download_helper.cc download_helper.h MetadataInfo.cc \ MetadataInfo.h SessionSerializer.cc SessionSerializer.h \ - Event.h timespec.h ValueBase.cc ValueBase.h bencode2.cc \ - bencode2.h ContextAttribute.h TorrentAttribute.h \ - XmlRpcRequestParserController.cc \ + Event.h timespec.h ValueBase.cc ValueBase.h ContextAttribute.h \ + TorrentAttribute.h XmlRpcRequestParserController.cc \ XmlRpcRequestParserController.h \ XmlRpcRequestParserStateMachine.cc \ XmlRpcRequestParserStateMachine.h XmlRpcRequestParserState.h \ @@ -586,25 +585,25 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \ IndexBtMessage.cc IndexBtMessage.h ZeroBtMessage.cc \ ZeroBtMessage.h RangeBtMessageValidator.h \ IndexBtMessageValidator.h ExtensionMessageRegistry.h \ - bencode.cc bencode.h bittorrent_helper.cc bittorrent_helper.h \ + bittorrent_helper.cc bittorrent_helper.h \ BtStopDownloadCommand.cc BtStopDownloadCommand.h \ PriorityPieceSelector.cc PriorityPieceSelector.h \ LpdMessageDispatcher.cc LpdMessageDispatcher.h \ LpdMessageReceiver.cc LpdMessageReceiver.h LpdMessage.h \ LpdReceiveMessageCommand.cc LpdReceiveMessageCommand.h \ LpdDispatchMessageCommand.cc LpdDispatchMessageCommand.h \ - Metalinker.cc Metalinker.h MetalinkEntry.cc MetalinkEntry.h \ - MetalinkResource.cc MetalinkResource.h MetalinkMetaurl.cc \ - MetalinkMetaurl.h MetalinkProcessor.h \ - MetalinkParserController.cc MetalinkParserController.h \ - MetalinkParserStateMachine.cc MetalinkParserStateMachine.h \ - MetalinkParserState.h MetalinkParserStateImpl.cc \ - MetalinkParserStateImpl.h MetalinkParserStateV3Impl.cc \ - MetalinkParserStateV3Impl.h MetalinkParserStateV4Impl.cc \ - MetalinkParserStateV4Impl.h Metalink2RequestGroup.cc \ - Metalink2RequestGroup.h MetalinkPostDownloadHandler.cc \ - MetalinkPostDownloadHandler.h MetalinkHelper.cc \ - MetalinkHelper.h XML2SAXMetalinkProcessor.cc \ + bencode2.cc bencode2.h Metalinker.cc Metalinker.h \ + MetalinkEntry.cc MetalinkEntry.h MetalinkResource.cc \ + MetalinkResource.h MetalinkMetaurl.cc MetalinkMetaurl.h \ + MetalinkProcessor.h MetalinkParserController.cc \ + MetalinkParserController.h MetalinkParserStateMachine.cc \ + MetalinkParserStateMachine.h MetalinkParserState.h \ + MetalinkParserStateImpl.cc MetalinkParserStateImpl.h \ + MetalinkParserStateV3Impl.cc MetalinkParserStateV3Impl.h \ + MetalinkParserStateV4Impl.cc MetalinkParserStateV4Impl.h \ + Metalink2RequestGroup.cc Metalink2RequestGroup.h \ + MetalinkPostDownloadHandler.cc MetalinkPostDownloadHandler.h \ + MetalinkHelper.cc MetalinkHelper.h XML2SAXMetalinkProcessor.cc \ XML2SAXMetalinkProcessor.h ExpatMetalinkProcessor.cc \ ExpatMetalinkProcessor.h asctime_r.c asctime_r.h libgen.c \ libgen.h getaddrinfo.c getaddrinfo.h gai_strerror.c \ @@ -759,14 +758,14 @@ am__objects_6 = @ENABLE_BITTORRENT_TRUE@ RangeBtMessage.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ IndexBtMessage.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ ZeroBtMessage.$(OBJEXT) \ -@ENABLE_BITTORRENT_TRUE@ bencode.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ bittorrent_helper.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ BtStopDownloadCommand.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ PriorityPieceSelector.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ LpdMessageDispatcher.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ LpdMessageReceiver.$(OBJEXT) \ @ENABLE_BITTORRENT_TRUE@ LpdReceiveMessageCommand.$(OBJEXT) \ -@ENABLE_BITTORRENT_TRUE@ LpdDispatchMessageCommand.$(OBJEXT) +@ENABLE_BITTORRENT_TRUE@ LpdDispatchMessageCommand.$(OBJEXT) \ +@ENABLE_BITTORRENT_TRUE@ bencode2.$(OBJEXT) @ENABLE_METALINK_TRUE@am__objects_14 = Metalinker.$(OBJEXT) \ @ENABLE_METALINK_TRUE@ MetalinkEntry.$(OBJEXT) \ @ENABLE_METALINK_TRUE@ MetalinkResource.$(OBJEXT) \ @@ -873,10 +872,9 @@ am__objects_32 = SocketCore.$(OBJEXT) Command.$(OBJEXT) \ SocketBuffer.$(OBJEXT) OptionHandlerException.$(OBJEXT) \ URIResult.$(OBJEXT) SelectEventPoll.$(OBJEXT) \ LongestSequencePieceSelector.$(OBJEXT) bitfield.$(OBJEXT) \ - BDE.$(OBJEXT) CreateRequestCommand.$(OBJEXT) \ - download_helper.$(OBJEXT) MetadataInfo.$(OBJEXT) \ - SessionSerializer.$(OBJEXT) ValueBase.$(OBJEXT) \ - bencode2.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ + CreateRequestCommand.$(OBJEXT) download_helper.$(OBJEXT) \ + MetadataInfo.$(OBJEXT) SessionSerializer.$(OBJEXT) \ + ValueBase.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) $(am__objects_8) \ $(am__objects_9) $(am__objects_10) $(am__objects_11) \ @@ -1212,23 +1210,22 @@ SRCS = Socket.h SocketCore.cc SocketCore.h BinaryStream.h Command.cc \ SelectEventPoll.cc SelectEventPoll.h SequentialPicker.h \ SequentialDispatcherCommand.h PieceSelector.h \ LongestSequencePieceSelector.cc LongestSequencePieceSelector.h \ - bitfield.cc bitfield.h BDE.cc BDE.h CreateRequestCommand.cc \ + bitfield.cc bitfield.h CreateRequestCommand.cc \ CreateRequestCommand.h DownloadResultCode.h wallclock.h \ download_helper.cc download_helper.h MetadataInfo.cc \ MetadataInfo.h SessionSerializer.cc SessionSerializer.h \ - Event.h timespec.h ValueBase.cc ValueBase.h bencode2.cc \ - bencode2.h ContextAttribute.h TorrentAttribute.h \ - $(am__append_1) $(am__append_2) $(am__append_3) \ - $(am__append_4) $(am__append_5) $(am__append_6) \ - $(am__append_7) $(am__append_8) $(am__append_9) \ - $(am__append_10) $(am__append_11) $(am__append_12) \ - $(am__append_13) $(am__append_14) $(am__append_15) \ - $(am__append_16) $(am__append_17) $(am__append_18) \ - $(am__append_19) $(am__append_20) $(am__append_21) \ - $(am__append_22) $(am__append_23) $(am__append_24) \ - $(am__append_25) $(am__append_26) $(am__append_27) \ - $(am__append_28) $(am__append_29) $(am__append_30) \ - $(am__append_31) + Event.h timespec.h ValueBase.cc ValueBase.h ContextAttribute.h \ + TorrentAttribute.h $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) \ + $(am__append_6) $(am__append_7) $(am__append_8) \ + $(am__append_9) $(am__append_10) $(am__append_11) \ + $(am__append_12) $(am__append_13) $(am__append_14) \ + $(am__append_15) $(am__append_16) $(am__append_17) \ + $(am__append_18) $(am__append_19) $(am__append_20) \ + $(am__append_21) $(am__append_22) $(am__append_23) \ + $(am__append_24) $(am__append_25) $(am__append_26) \ + $(am__append_27) $(am__append_28) $(am__append_29) \ + $(am__append_30) $(am__append_31) noinst_LIBRARIES = libaria2c.a libaria2c_a_SOURCES = $(SRCS) aria2c_LDADD = libaria2c.a @LIBINTL@ @ALLOCA@ @LIBGNUTLS_LIBS@\ @@ -1348,7 +1345,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AuthConfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AuthConfigFactory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AutoSaveCommand.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BDE.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BNode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitfieldMan.Po@am__quote@ @@ -1631,7 +1627,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ZeroBtMessage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asctime_r.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base32.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bencode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bencode2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitfield.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bittorrent_helper.Po@am__quote@ diff --git a/src/PeerListProcessor.h b/src/PeerListProcessor.h index 6210fcf77..530778afe 100644 --- a/src/PeerListProcessor.h +++ b/src/PeerListProcessor.h @@ -40,120 +40,76 @@ #include #include "a2netcompat.h" -#include "bencode.h" #include "Peer.h" #include "ValueBase.h" namespace aria2 { class PeerListProcessor { -private: +public: template - class PeerListValueBaseVisitor:public ValueBaseVisitor { - OutputIterator dest_; - public: - PeerListValueBaseVisitor(OutputIterator dest):dest_(dest) {} + void extractPeer(const ValueBase* peerData, OutputIterator dest) + { + class PeerListValueBaseVisitor:public ValueBaseVisitor { + private: + OutputIterator dest_; + public: + PeerListValueBaseVisitor(OutputIterator dest):dest_(dest) {} - virtual void visit(const String& peerData) - { - size_t length = peerData.s().size(); - if(length%6 == 0) { - const char* base = peerData.s().data(); - for(size_t i = 0; i < length; i += 6) { - struct in_addr in; - memcpy(&in.s_addr, base+i, sizeof(uint32_t)); - std::string ipaddr = inet_ntoa(in); - uint16_t port_nworder; - memcpy(&port_nworder, base+i+4, sizeof(uint16_t)); - uint16_t port = ntohs(port_nworder); - *dest_ = SharedHandle(new Peer(ipaddr, port)); + virtual ~PeerListValueBaseVisitor() {} + + virtual void visit(const String& peerData) + { + size_t length = peerData.s().size(); + if(length%6 == 0) { + const char* base = peerData.s().data(); + for(size_t i = 0; i < length; i += 6) { + struct in_addr in; + memcpy(&in.s_addr, base+i, sizeof(uint32_t)); + std::string ipaddr = inet_ntoa(in); + uint16_t port_nworder; + memcpy(&port_nworder, base+i+4, sizeof(uint16_t)); + uint16_t port = ntohs(port_nworder); + *dest_ = SharedHandle(new Peer(ipaddr, port)); + ++dest_; + } + } + } + + virtual void visit(const Integer& v) {} + + virtual void visit(const List& peerData) + { + for(List::ValueType::const_iterator itr = peerData.begin(), + eoi = peerData.end(); itr != eoi; ++itr) { + const Dict* peerDict = asDict(*itr); + if(!peerDict) { + continue; + } + static const std::string IP = "ip"; + static const std::string PORT = "port"; + const String* ip = asString(peerDict->get(IP)); + const Integer* port = asInteger(peerDict->get(PORT)); + if(!ip || !port || !(0 < port->i() && port->i() < 65536)) { + continue; + } + *dest_ = SharedHandle(new Peer(ip->s(), port->i())); ++dest_; } } - } - virtual void visit(const Integer& v) {} - - virtual void visit(const List& peerData) - { - for(List::ValueType::const_iterator itr = peerData.begin(), - eoi = peerData.end(); itr != eoi; ++itr) { - const Dict* peerDict = asDict(*itr); - if(!peerDict) { - continue; - } - static const std::string IP = "ip"; - static const std::string PORT = "port"; - const String* ip = asString(peerDict->get(IP)); - const Integer* port = asInteger(peerDict->get(PORT)); - if(!ip || !port || !(0 < port->i() && port->i() < 65536)) { - continue; - } - *dest_ = SharedHandle(new Peer(ip->s(), port->i())); - ++dest_; - } - } - - virtual void visit(const Dict& v) {} - }; -public: - template - void extractPeer(const SharedHandle& peerData, OutputIterator dest) - { - if(!peerData.isNull()) { - PeerListValueBaseVisitor visitor(dest); + virtual void visit(const Dict& v) {} + }; + if(peerData) { + PeerListValueBaseVisitor visitor(dest); peerData->accept(visitor); } } template - void extractPeer(const BDE& peerData, OutputIterator dest) + void extractPeer(const SharedHandle& peerData, OutputIterator dest) { - if(peerData.isList()) { - extractPeerFromList(peerData, dest); - } else if(peerData.isString()) { - extractPeerFromCompact(peerData, dest); - } - } - - template - void extractPeerFromList(const BDE& peerData, OutputIterator dest) - { - for(BDE::List::const_iterator itr = peerData.listBegin(), - eoi = peerData.listEnd(); itr != eoi; ++itr) { - const BDE& peerDict = *itr; - if(!peerDict.isDict()) { - continue; - } - static const std::string IP = "ip"; - static const std::string PORT = "port"; - const BDE& ip = peerDict[IP]; - const BDE& port = peerDict[PORT]; - if(!ip.isString() || !port.isInteger() || - !(0 < port.i() && port.i() < 65536)) { - continue; - } - *dest = SharedHandle(new Peer(ip.s(), port.i())); - ++dest; - } - } - - template - void extractPeerFromCompact(const BDE& peerData, OutputIterator dest) - { - size_t length = peerData.s().size(); - if(length%6 == 0) { - for(size_t i = 0; i < length; i += 6) { - struct in_addr in; - memcpy(&in.s_addr, peerData.s().c_str()+i, sizeof(uint32_t)); - std::string ipaddr = inet_ntoa(in); - uint16_t port_nworder; - memcpy(&port_nworder, peerData.s().c_str()+i+4, sizeof(uint16_t)); - uint16_t port = ntohs(port_nworder); - *dest = SharedHandle(new Peer(ipaddr, port)); - ++dest; - } - } + return extractPeer(peerData.get(), dest); } }; diff --git a/src/UTMetadataDataExtensionMessage.cc b/src/UTMetadataDataExtensionMessage.cc index 2b97a1e29..a63855dbf 100644 --- a/src/UTMetadataDataExtensionMessage.cc +++ b/src/UTMetadataDataExtensionMessage.cc @@ -33,8 +33,7 @@ */ /* copyright --> */ #include "UTMetadataDataExtensionMessage.h" -#include "BDE.h" -#include "bencode.h" +#include "bencode2.h" #include "util.h" #include "a2functional.h" #include "DownloadContext.h" @@ -55,11 +54,11 @@ UTMetadataDataExtensionMessage::UTMetadataDataExtensionMessage std::string UTMetadataDataExtensionMessage::getPayload() { - BDE dict = BDE::dict(); - dict["msg_type"] = 1; - dict["piece"] = getIndex(); - dict["total_size"] = _totalSize; - return bencode::encode(dict)+_data; + Dict dict; + dict.put("msg_type", Integer::g(1)); + dict.put("piece", Integer::g(getIndex())); + dict.put("total_size", Integer::g(_totalSize)); + return bencode2::encode(&dict)+_data; } std::string UTMetadataDataExtensionMessage::toString() const diff --git a/src/UTMetadataPostDownloadHandler.cc b/src/UTMetadataPostDownloadHandler.cc index 5127fd574..44e7073fd 100644 --- a/src/UTMetadataPostDownloadHandler.cc +++ b/src/UTMetadataPostDownloadHandler.cc @@ -33,7 +33,6 @@ */ /* copyright --> */ #include "UTMetadataPostDownloadHandler.h" -#include "BDE.h" #include "bittorrent_helper.h" #include "RequestGroup.h" #include "download_helper.h" @@ -46,7 +45,7 @@ #include "a2functional.h" #include "DiskAdaptor.h" #include "PieceStorage.h" -#include "bencode.h" +#include "bencode2.h" #include "message.h" #include "prefs.h" #include "Option.h" diff --git a/src/UTMetadataRejectExtensionMessage.cc b/src/UTMetadataRejectExtensionMessage.cc index 53cadb9bd..4221b794e 100644 --- a/src/UTMetadataRejectExtensionMessage.cc +++ b/src/UTMetadataRejectExtensionMessage.cc @@ -33,10 +33,9 @@ */ /* copyright --> */ #include "UTMetadataRejectExtensionMessage.h" -#include "BDE.h" #include "a2functional.h" #include "util.h" -#include "bencode.h" +#include "bencode2.h" #include "DlAbortEx.h" namespace aria2 { @@ -47,10 +46,10 @@ UTMetadataRejectExtensionMessage::UTMetadataRejectExtensionMessage std::string UTMetadataRejectExtensionMessage::getPayload() { - BDE dict = BDE::dict(); - dict["msg_type"] = 2; - dict["piece"] = getIndex(); - return bencode::encode(dict); + Dict dict; + dict.put("msg_type", Integer::g(2)); + dict.put("piece", Integer::g(getIndex())); + return bencode2::encode(&dict); } std::string UTMetadataRejectExtensionMessage::toString() const diff --git a/src/UTMetadataRequestExtensionMessage.cc b/src/UTMetadataRequestExtensionMessage.cc index 3bbaf4acb..8372fb109 100644 --- a/src/UTMetadataRequestExtensionMessage.cc +++ b/src/UTMetadataRequestExtensionMessage.cc @@ -33,8 +33,7 @@ */ /* copyright --> */ #include "UTMetadataRequestExtensionMessage.h" -#include "BDE.h" -#include "bencode.h" +#include "bencode2.h" #include "util.h" #include "a2functional.h" #include "bittorrent_helper.h" @@ -57,10 +56,10 @@ UTMetadataRequestExtensionMessage::UTMetadataRequestExtensionMessage std::string UTMetadataRequestExtensionMessage::getPayload() { - BDE dict = BDE::dict(); - dict["msg_type"] = 0; - dict["piece"] = getIndex(); - return bencode::encode(dict); + Dict dict; + dict.put("msg_type", Integer::g(0)); + dict.put("piece", Integer::g(getIndex())); + return bencode2::encode(&dict); } std::string UTMetadataRequestExtensionMessage::toString() const diff --git a/src/UTPexExtensionMessage.cc b/src/UTPexExtensionMessage.cc index f3d0fdb90..d31621a94 100644 --- a/src/UTPexExtensionMessage.cc +++ b/src/UTPexExtensionMessage.cc @@ -41,7 +41,7 @@ #include "DlAbortEx.h" #include "message.h" #include "StringFormat.h" -#include "bencode.h" +#include "bencode2.h" #include "a2functional.h" #include "wallclock.h" @@ -64,11 +64,11 @@ std::string UTPexExtensionMessage::getPayload() std::pair droppedPeerPair = createCompactPeerListAndFlag(_droppedPeers); - BDE dict = BDE::dict(); - dict["added"] = freshPeerPair.first; - dict["added.f"] = freshPeerPair.second; - dict["dropped"] = droppedPeerPair.first; - return bencode::encode(dict); + Dict dict; + dict.put("added", freshPeerPair.first); + dict.put("added.f", freshPeerPair.second); + dict.put("dropped", droppedPeerPair.first); + return bencode2::encode(&dict); } std::pair @@ -158,17 +158,17 @@ UTPexExtensionMessage::create(const unsigned char* data, size_t len) } UTPexExtensionMessageHandle msg(new UTPexExtensionMessage(*data)); - const BDE dict = bencode::decode(data+1, len-1); - if(dict.isDict()) { + SharedHandle decoded = bencode2::decode(data+1, len-1); + const Dict* dict = asDict(decoded); + if(dict) { PeerListProcessor proc; - const BDE& added = dict["added"]; - if(added.isString()) { - proc.extractPeerFromCompact(added, std::back_inserter(msg->_freshPeers)); + const String* added = asString(dict->get("added")); + if(added) { + proc.extractPeer(added, std::back_inserter(msg->_freshPeers)); } - const BDE& dropped = dict["dropped"]; - if(dropped.isString()) { - proc.extractPeerFromCompact(dropped, - std::back_inserter(msg->_droppedPeers)); + const String* dropped = asString(dict->get("dropped")); + if(dropped) { + proc.extractPeer(dropped, std::back_inserter(msg->_droppedPeers)); } } return msg; diff --git a/src/ValueBase.cc b/src/ValueBase.cc index 1e318f016..ddc11f513 100644 --- a/src/ValueBase.cc +++ b/src/ValueBase.cc @@ -64,6 +64,11 @@ SharedHandle String::g(const ValueType& string) return SharedHandle(new String(string)); } +SharedHandle String::g(const unsigned char* data, size_t length) +{ + return SharedHandle(new String(data, length)); +} + void String::accept(ValueBaseVisitor& v) const { v.visit(*this); @@ -95,11 +100,21 @@ const SharedHandle& List::get(size_t index) const return list_[index]; } +void List::set(size_t index, const SharedHandle& v) +{ + list_[index] = v; +} + void List::append(const SharedHandle& v) { list_.push_back(v); } +void List::append(const String::ValueType& string) +{ + list_.push_back(String::g(string)); +} + List& List::operator<<(const SharedHandle& v) { list_.push_back(v); diff --git a/src/ValueBase.h b/src/ValueBase.h index 9dbbcf512..3f9079233 100644 --- a/src/ValueBase.h +++ b/src/ValueBase.h @@ -96,6 +96,8 @@ public: static SharedHandle g(const ValueType& string); + static SharedHandle g(const unsigned char* data, size_t length); + virtual void accept(ValueBaseVisitor& visitor) const; private: ValueType str_; @@ -128,12 +130,18 @@ public: // Appends given v to list. void append(const SharedHandle& v); + // Appeding string is so common that we provide shortcut function. + void append(const String::ValueType& string); + // Alias for append() List& operator<<(const SharedHandle& v); // Returns the object at given index. const SharedHandle& get(size_t index) const; + // Set the object at given index. + void set(size_t index, const SharedHandle& v); + // Returns the const reference of the object at the given index. const SharedHandle& operator[](size_t index) const; diff --git a/src/Xml2XmlRpcRequestProcessor.cc b/src/Xml2XmlRpcRequestProcessor.cc index c30998bbd..0de3a1af9 100644 --- a/src/Xml2XmlRpcRequestProcessor.cc +++ b/src/Xml2XmlRpcRequestProcessor.cc @@ -145,7 +145,11 @@ XmlRpcRequestProcessor::parseMemory(const std::string& xml) if(r != 0) { throw DL_ABORT_EX(MSG_CANNOT_PARSE_XML_RPC_REQUEST); } - return XmlRpcRequest(_stm->getMethodName(), _stm->getCurrentFrameValue()); + if(!asList(_stm->getCurrentFrameValue())) { + throw DL_ABORT_EX("Bad XML-RPC parameter list"); + } + return XmlRpcRequest(_stm->getMethodName(), + static_pointer_cast(_stm->getCurrentFrameValue())); } } // namespace xmlrpc diff --git a/src/XmlRpcMethod.cc b/src/XmlRpcMethod.cc index 726d51812..351dc836a 100644 --- a/src/XmlRpcMethod.cc +++ b/src/XmlRpcMethod.cc @@ -34,7 +34,6 @@ /* copyright --> */ #include "XmlRpcMethod.h" #include "DownloadEngine.h" -#include "BDE.h" #include "LogFactory.h" #include "RecoverableException.h" #include "message.h" @@ -52,6 +51,7 @@ #include "CheckIntegrityEntry.h" #include "ServerStatMan.h" #include "FileEntry.h" +#include "DlAbortEx.h" namespace aria2 { @@ -61,11 +61,12 @@ XmlRpcMethod::XmlRpcMethod(): _optionParser(OptionParser::getInstance()), _logger(LogFactory::getInstance()) {} -BDE XmlRpcMethod::createErrorResponse(const Exception& e) +SharedHandle XmlRpcMethod::createErrorResponse +(const Exception& e) { - BDE params = BDE::dict(); - params["faultCode"] = BDE(1); - params["faultString"] = BDE(e.what()); + SharedHandle params = Dict::g(); + params->put("faultCode", Integer::g(1)); + params->put("faultString", std::string(e.what())); return params; } @@ -105,29 +106,35 @@ static void gatherOption ("We don't know how to deal with %s option", optionName.c_str()).str()); } - // header and index-out option can take array as value - const BDE& value = (*first).second; - if((optionName == PREF_HEADER || optionName == PREF_INDEX_OUT) && - value.isList()){ - for(BDE::List::const_iterator argiter = value.listBegin(), - eoi = value.listEnd(); argiter != eoi; ++argiter) { - if((*argiter).isString()) { - optionHandler->parse(*option.get(), (*argiter).s()); + const String* opval = asString((*first).second); + if(opval) { + optionHandler->parse(*option.get(), opval->s()); + } else { + // header and index-out option can take array as value + const List* oplist = asList((*first).second); + if(oplist && + (optionName == PREF_HEADER || optionName == PREF_INDEX_OUT)) { + for(List::ValueType::const_iterator argiter = oplist->begin(), + eoi = oplist->end(); argiter != eoi; ++argiter) { + const String* opval = asString(*argiter); + if(opval) { + optionHandler->parse(*option.get(), opval->s()); + } } } - } else if(value.isString()) { - optionHandler->parse(*option.get(), value.s()); } } } } void XmlRpcMethod::gatherRequestOption -(const SharedHandle