/* */ #ifndef _D_DHT_MESSAGE_FACTORY_IMPL_H_ #define _D_DHT_MESSAGE_FACTORY_IMPL_H_ #include "DHTMessageFactory.h" #include "DHTRoutingTableDecl.h" #include "DHTConnectionDecl.h" #include "DHTMessageDispatcherDecl.h" #include "DHTPeerAnnounceStorageDecl.h" #include "DHTTokenTrackerDecl.h" class Logger; class Data; class DHTAbstractMessage; class DHTMessageFactoryImpl:public DHTMessageFactory { private: DHTNodeHandle _localNode; WeakHandle _connection; WeakHandle _dispatcher; WeakHandle _routingTable; WeakHandle _peerAnnounceStorage; WeakHandle _tokenTracker; const Logger* _logger; // search node in routingTable. If it is not found, create new one. DHTNodeHandle getRemoteNode(const unsigned char* id, const string& ipaddr, uint16_t port) const; void validateID(const Data* id) const; void validateIDMatch(const unsigned char* expected, const unsigned char* actual) const; void validatePort(const Data* i) const; DHTNodes extractNodes(const char* src, size_t length); void setCommonProperty(const SharedHandle& m); public: DHTMessageFactoryImpl(); virtual ~DHTMessageFactoryImpl(); virtual DHTMessageHandle createQueryMessage(const Dictionary* d, const string& ipaddr, uint16_t port); virtual DHTMessageHandle createResponseMessage(const string& messageType, const Dictionary* d, const DHTNodeHandle& remoteNode); virtual DHTMessageHandle createPingMessage(const DHTNodeHandle& remoteNode, const string& transactionID = ""); virtual DHTMessageHandle createPingReplyMessage(const DHTNodeHandle& remoteNode, const unsigned char* id, const string& transactionID); virtual DHTMessageHandle createFindNodeMessage(const DHTNodeHandle& remoteNode, const unsigned char* targetNodeID, const string& transactionID = ""); DHTMessageHandle createFindNodeReplyMessage(const DHTNodeHandle& remoteNode, const Dictionary* d, const string& transactionID); virtual DHTMessageHandle createFindNodeReplyMessage(const DHTNodeHandle& remoteNode, const DHTNodes& closestKNodes, const string& transactionID); virtual DHTMessageHandle createGetPeersMessage(const DHTNodeHandle& remoteNode, const unsigned char* infoHash, const string& transactionID = ""); virtual DHTMessageHandle createGetPeersReplyMessage(const DHTNodeHandle& remoteNode, const DHTNodes& closestKNodes, const string& token, const string& transactionID); DHTMessageHandle createGetPeersReplyMessageWithNodes(const DHTNodeHandle& remoteNode, const Dictionary* d, const string& transactionID); virtual DHTMessageHandle createGetPeersReplyMessage(const DHTNodeHandle& remoteNode, const Peers& peers, const string& token, const string& transactionID); DHTMessageHandle createGetPeersReplyMessageWithValues(const DHTNodeHandle& remoteNode, const Dictionary* d, const string& transactionID); virtual DHTMessageHandle createAnnouncePeerMessage(const DHTNodeHandle& remoteNode, const unsigned char* infoHash, uint16_t tcpPort, const string& token, const string& transactionID = ""); virtual DHTMessageHandle createAnnouncePeerReplyMessage(const DHTNodeHandle& remoteNode, const string& transactionID); virtual DHTMessageHandle createUnknownMessage(const char* data, size_t length, const string& ipaddr, uint16_t port); void setRoutingTable(const DHTRoutingTableHandle& routingTable); void setConnection(const DHTConnectionHandle& connection); void setMessageDispatcher(const DHTMessageDispatcherHandle& dispatcher); void setPeerAnnounceStorage(const DHTPeerAnnounceStorageHandle& storage); void setTokenTracker(const DHTTokenTrackerHandle& tokenTracker); void setLocalNode(const DHTNodeHandle& localNode); }; #endif // _D_DHT_MESSAGE_FACTORY_IMPL_H_