/* */ #ifndef D_DHT_BUCKET_H #define D_DHT_BUCKET_H #include "common.h" #include #include #include #include "SharedHandle.h" #include "DHTConstants.h" #include "TimerA2.h" namespace aria2 { class DHTNode; class DHTBucket { private: size_t prefixLength_; // this bucket contains nodes of distance between [min_, max_](inclusive). unsigned char min_[DHT_ID_LENGTH]; unsigned char max_[DHT_ID_LENGTH]; SharedHandle localNode_; // sorted in ascending order std::deque > nodes_; // a replacement cache. The maximum size is specified by CACHE_SIZE. // This is sorted by last time seen. std::deque > cachedNodes_; Timer lastUpdated_; bool isInRange(const unsigned char* nodeID, const unsigned char* max, const unsigned char* min) const; public: DHTBucket(const SharedHandle& localNode); DHTBucket(size_t prefixLength, const unsigned char* max, const unsigned char* min, const SharedHandle& localNode); ~DHTBucket(); static const size_t K = 8; static const size_t CACHE_SIZE = 2; void getRandomNodeID(unsigned char* nodeID) const; SharedHandle split(); bool isInRange(const SharedHandle& node) const; bool isInRange(const unsigned char* nodeID) const; bool addNode(const SharedHandle& node); void cacheNode(const SharedHandle& node); bool splitAllowed() const; size_t getPrefixLength() const { return prefixLength_; } const unsigned char* getMaxID() const { return max_; } const unsigned char* getMinID() const { return min_; } size_t countNode() const { return nodes_.size(); } const std::deque >& getNodes() const { return nodes_; } void getGoodNodes(std::vector >& nodes) const; void dropNode(const SharedHandle& node); void moveToHead(const SharedHandle& node); void moveToTail(const SharedHandle& node); bool contains(const SharedHandle& node) const; SharedHandle getNode(const unsigned char* nodeID, const std::string& ipaddr, uint16_t port) const; bool operator==(const DHTBucket& bucket) const; bool needsRefresh() const; void notifyUpdate(); bool containsQuestionableNode() const; SharedHandle getLRUQuestionableNode() const; const std::deque >& getCachedNodes() const { return cachedNodes_; } }; } // namespace aria2 #endif // D_DHT_BUCKET_H