/* */ #ifndef D_DHT_MESSAGE_FACTORY_IMPL_H #define D_DHT_MESSAGE_FACTORY_IMPL_H #include "DHTMessageFactory.h" #include "A2STR.h" namespace aria2 { class DHTConnection; class DHTMessageDispatcher; class DHTRoutingTable; class DHTPeerAnnounceStorage; class DHTTokenTracker; class DHTMessage; class DHTAbstractMessage; class BtRegistry; class DHTMessageFactoryImpl : public DHTMessageFactory { private: int family_; std::shared_ptr localNode_; DHTConnection* connection_; DHTMessageDispatcher* dispatcher_; DHTRoutingTable* routingTable_; DHTPeerAnnounceStorage* peerAnnounceStorage_; DHTTokenTracker* tokenTracker_; BtRegistry* btRegistry_; // search node in routingTable. If it is not found, create new one. std::shared_ptr getRemoteNode(const unsigned char* id, const std::string& ipaddr, uint16_t port) const; void validateID(const String* id) const; void validatePort(const Integer* i) const; void extractNodes(std::vector>& nodes, const unsigned char* src, size_t length); void setCommonProperty(DHTAbstractMessage* m); public: DHTMessageFactoryImpl(int family); virtual std::unique_ptr createQueryMessage(const Dict* dict, const std::string& ipaddr, uint16_t port) CXX11_OVERRIDE; virtual std::unique_ptr createResponseMessage(const std::string& messageType, const Dict* dict, const std::string& ipaddr, uint16_t port) CXX11_OVERRIDE; virtual std::unique_ptr createPingMessage( const std::shared_ptr& remoteNode, const std::string& transactionID = A2STR::NIL) CXX11_OVERRIDE; virtual std::unique_ptr createPingReplyMessage(const std::shared_ptr& remoteNode, const unsigned char* id, const std::string& transactionID) CXX11_OVERRIDE; virtual std::unique_ptr createFindNodeMessage( const std::shared_ptr& remoteNode, const unsigned char* targetNodeID, const std::string& transactionID = A2STR::NIL) CXX11_OVERRIDE; std::unique_ptr createFindNodeReplyMessage(const std::shared_ptr& remoteNode, const Dict* dict, const std::string& transactionID); virtual std::unique_ptr createFindNodeReplyMessage( const std::shared_ptr& remoteNode, std::vector> closestKNodes, const std::string& transactionID) CXX11_OVERRIDE; virtual std::unique_ptr createGetPeersMessage( const std::shared_ptr& remoteNode, const unsigned char* infoHash, const std::string& transactionID = A2STR::NIL) CXX11_OVERRIDE; virtual std::unique_ptr createGetPeersReplyMessage( const std::shared_ptr& remoteNode, std::vector> closestKNodes, std::vector> peers, const std::string& token, const std::string& transactionID) CXX11_OVERRIDE; std::unique_ptr createGetPeersReplyMessage(const std::shared_ptr& remoteNode, const Dict* dict, const std::string& transactionID); virtual std::unique_ptr createAnnouncePeerMessage( const std::shared_ptr& remoteNode, const unsigned char* infoHash, uint16_t tcpPort, const std::string& token, const std::string& transactionID = A2STR::NIL) CXX11_OVERRIDE; virtual std::unique_ptr createAnnouncePeerReplyMessage(const std::shared_ptr& remoteNode, const std::string& transactionID) CXX11_OVERRIDE; virtual std::unique_ptr createUnknownMessage(const unsigned char* data, size_t length, const std::string& ipaddr, uint16_t port) CXX11_OVERRIDE; void setRoutingTable(DHTRoutingTable* routingTable); void setConnection(DHTConnection* connection); void setMessageDispatcher(DHTMessageDispatcher* dispatcher); void setPeerAnnounceStorage(DHTPeerAnnounceStorage* storage); void setTokenTracker(DHTTokenTracker* tokenTracker); void setLocalNode(const std::shared_ptr& localNode); void setBtRegistry(BtRegistry* btRegistry); }; } // namespace aria2 #endif // D_DHT_MESSAGE_FACTORY_IMPL_H