/* */ #ifndef D_DEFAULT_PEER_STORAGE_H #define D_DEFAULT_PEER_STORAGE_H #include "PeerStorage.h" #include #include #include #include "TimerA2.h" #include "a2functional.h" namespace aria2 { class BtRuntime; class BtSeederStateChoke; class BtLeecherStateChoke; class PieceStorage; typedef std::set, RefLess > PeerSet; class DefaultPeerStorage : public PeerStorage { private: SharedHandle btRuntime_; SharedHandle 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 SharedHandle& peer); void addUniqPeer(const SharedHandle& peer); void addDroppedPeer(const SharedHandle& peer); public: DefaultPeerStorage(); virtual ~DefaultPeerStorage(); // TODO We need addAndCheckoutPeer for incoming peers virtual bool addPeer(const SharedHandle& peer); virtual size_t countAllPeer() const; SharedHandle getPeer(const std::string& ipaddr, uint16_t port) const; virtual void addPeer(const std::vector >& peers); const std::deque >& getUnusedPeers(); const PeerSet& getUsedPeers(); virtual const std::deque >& getDroppedPeers(); virtual bool isPeerAvailable(); virtual void getActivePeers(std::vector >& peers); virtual bool isBadPeer(const std::string& ipaddr); virtual void addBadPeer(const std::string& ipaddr); virtual SharedHandle checkoutPeer(cuid_t cuid); virtual void returnPeer(const SharedHandle& peer); virtual bool chokeRoundIntervalElapsed(); virtual void executeChoke(); void deleteUnusedPeer(size_t delSize); void onErasingPeer(const SharedHandle& peer); void onReturningPeer(const SharedHandle& peer); void setPieceStorage(const SharedHandle& pieceStorage); void setBtRuntime(const SharedHandle& btRuntime); void setMaxPeerListSize(size_t maxPeerListSize) { maxPeerListSize_ = maxPeerListSize; } }; } // namespace aria2 #endif // D_DEFAULT_PEER_STORAGE_H