/* */ #ifndef D_UT_PEX_EXTENSION_MESSAGE_H #define D_UT_PEX_EXTENSION_MESSAGE_H #include "ExtensionMessage.h" #include #include #include #include "a2time.h" #include "a2functional.h" namespace aria2 { class PeerStorage; class Peer; class UTPexExtensionMessage : public ExtensionMessage { private: uint8_t extensionMessageID_; std::vector> freshPeers_; std::vector> droppedPeers_; PeerStorage* peerStorage_; std::chrono::seconds interval_; size_t maxFreshPeer_; size_t maxDroppedPeer_; std::pair, std::pair> createCompactPeerListAndFlag(const std::vector>& peers); public: UTPexExtensionMessage(uint8_t extensionMessageID); virtual std::string getPayload() CXX11_OVERRIDE; virtual uint8_t getExtensionMessageID() const CXX11_OVERRIDE { return extensionMessageID_; } virtual const char* getExtensionName() const CXX11_OVERRIDE { return EXTENSION_NAME; } static const char EXTENSION_NAME[]; virtual std::string toString() const CXX11_OVERRIDE; virtual void doReceivedAction() CXX11_OVERRIDE; bool addFreshPeer(const std::shared_ptr& peer); const std::vector>& getFreshPeers() const; bool freshPeersAreFull() const; bool addDroppedPeer(const std::shared_ptr& peer); const std::vector>& getDroppedPeers() const; bool droppedPeersAreFull() const; void setPeerStorage(PeerStorage* peerStorage); static std::unique_ptr create(const unsigned char* data, size_t len); void setMaxFreshPeer(size_t maxFreshPeer); size_t getMaxFreshPeer() const { return maxFreshPeer_; } void setMaxDroppedPeer(size_t maxDroppedPeer); size_t getMaxDroppedPeer() const { return maxDroppedPeer_; } constexpr static auto DEFAULT_INTERVAL = 1_min; }; } // namespace aria2 #endif // D_UT_PEX_EXTENSION_MESSAGE_H