/* */ #ifndef D_ANNOUNCE_LIST_H #define D_ANNOUNCE_LIST_H #include "common.h" #include #include #include #include #include "AnnounceTier.h" #include "ValueBase.h" namespace aria2 { class AnnounceList { public: private: std::deque> tiers_; std::deque>::iterator currentTier_; std::deque::iterator currentTracker_; bool currentTrackerInitialized_; void resetIterator(); void setCurrentTier(std::deque>::iterator itr); public: AnnounceList(); AnnounceList(const std::vector>& announceList); AnnounceList(const std::deque>& tiers); ~AnnounceList(); // Don't allow copying AnnounceList(const AnnounceList&) = delete; AnnounceList& operator=(const AnnounceList&) = delete; void reconfigure(const std::vector>& announceList); void reconfigure(const std::string& url); size_t countTier() const; /** * Shuffles all the URLs in each group. */ void shuffle(); /** * Returns announce URL. */ std::string getAnnounce() const; /** * Returns announce event, such as started, stopped, completed, etc. */ const char* getEventString() const; AnnounceTier::AnnounceEvent getEvent() const; void setEvent(AnnounceTier::AnnounceEvent event); /** * Removes current announce URL from its group and inserts it before the * first element of the group. * The internal announce group pointer points to the first element of the * first group after this call. */ void announceSuccess(); /** * The internal announce URL pointer points to next URL. * If the current URL is the last element of its group, then the first * element of the next group is pointed. */ void announceFailure(); /** * Counts the number of tiers to which the "stopped" event can be sent. */ size_t countStoppedAllowedTier() const; /** * Counts the number of tiers to which the "completed" event can be sent. */ size_t countCompletedAllowedTier() const; /** * Moves current tier pointer to the tier to which the "stopped" event can * be sent. * 2-stage search operation is made. * The first search operation is performed from current pointer position * to the end. If no such tier is found, the second search is performed from * the first to the current pointer position. */ void moveToStoppedAllowedTier(); void moveToCompletedAllowedTier(); bool allTiersFailed() const; void resetTier(); bool currentTierAcceptsStoppedEvent() const; bool currentTierAcceptsCompletedEvent() const; }; } // namespace aria2 #endif // D_ANNOUNCE_LIST_H