/* */ #ifndef D_DEFAULT_PEER_STORAGE_H #define D_DEFAULT_PEER_STORAGE_H #include "PeerStorage.h" #include #include #include "TimerA2.h" namespace aria2 { class BtRuntime; class BtSeederStateChoke; class BtLeecherStateChoke; class PieceStorage; class DefaultPeerStorage : public PeerStorage { private: std::shared_ptr btRuntime_; std::shared_ptr pieceStorage_; size_t maxPeerListSize_; // This contains ip address and port pair and is used to ensure that // no duplicate peers are stored. std::set > uniqPeers_; // Unused (not connected) peers, sorted by last added. std::deque > unusedPeers_; // The set of used peers. Some of them are not connected yet. To // know it is connected or not, call Peer::isActive(). PeerSet usedPeers_; std::deque > droppedPeers_; BtSeederStateChoke* seederStateChoke_; BtLeecherStateChoke* leecherStateChoke_; Timer lastTransferStatMapUpdated_; std::map badPeers_; Timer lastBadPeerCleaned_; bool isPeerAlreadyAdded(const std::shared_ptr& peer); void addUniqPeer(const std::shared_ptr& peer); void addDroppedPeer(const std::shared_ptr& peer); public: DefaultPeerStorage(); virtual ~DefaultPeerStorage(); // TODO We need addAndCheckoutPeer for incoming peers virtual bool addPeer(const std::shared_ptr& peer); virtual size_t countAllPeer() const; std::shared_ptr getPeer(const std::string& ipaddr, uint16_t port) const; virtual void addPeer(const std::vector >& peers); const std::deque >& getUnusedPeers(); virtual const PeerSet& getUsedPeers(); virtual const std::deque >& getDroppedPeers(); virtual bool isPeerAvailable(); virtual bool isBadPeer(const std::string& ipaddr); virtual void addBadPeer(const std::string& ipaddr); virtual std::shared_ptr checkoutPeer(cuid_t cuid); virtual void returnPeer(const std::shared_ptr& peer); virtual bool chokeRoundIntervalElapsed(); virtual void executeChoke(); void deleteUnusedPeer(size_t delSize); void onErasingPeer(const std::shared_ptr& peer); void onReturningPeer(const std::shared_ptr& peer); void setPieceStorage(const std::shared_ptr& pieceStorage); void setBtRuntime(const std::shared_ptr& btRuntime); void setMaxPeerListSize(size_t maxPeerListSize) { maxPeerListSize_ = maxPeerListSize; } }; } // namespace aria2 #endif // D_DEFAULT_PEER_STORAGE_H