/* */ #ifndef _D_DHT_ABSTRACT_NODE_LOOKUP_TASK_H_ #define _D_DHT_ABSTRACT_NODE_LOOKUP_TASK_H_ #include "DHTAbstractTask.h" #include #include #include "DHTMessageCallbackListener.h" #include "DHTConstants.h" #include "DHTNodeLookupEntry.h" namespace aria2 { class DHTNode; class DHTMessage; class DHTAbstractNodeLookupTask:public DHTAbstractTask, public DHTMessageCallbackListener { protected: unsigned char _targetID[DHT_ID_LENGTH]; std::deque > _entries; size_t _inFlightMessage; template void toEntries (Container& entries, const std::vector >& nodes) const { for(std::vector >::const_iterator i = nodes.begin(); i != nodes.end(); ++i) { SharedHandle e(new DHTNodeLookupEntry(*i)); entries.push_back(e); } } void sendMessage(); void updateBucket(); void sendMessageAndCheckFinish(); public: DHTAbstractNodeLookupTask(const unsigned char* targetID); static const size_t ALPHA = 3; virtual void startup(); virtual void onReceived(const SharedHandle& message); virtual void onTimeout(const SharedHandle& node); virtual void getNodesFromMessage(std::vector >& nodes, const SharedHandle& message) = 0; virtual void onReceivedInternal(const SharedHandle& message) {} virtual bool needsAdditionalOutgoingMessage() { return true; } virtual void onFinish() {} virtual SharedHandle createMessage(const SharedHandle& remoteNode) = 0; }; } // namespace aria2 #endif // _D_DHT_ABSTRACT_NODE_LOOKUP_TASK_H_