/* */ #ifndef _D_ANNOUNCE_LIST_H_ #define _D_ANNOUNCE_LIST_H_ #include "common.h" #include "SharedHandle.h" #include "AnnounceTier.h" namespace aria2 { class MetaEntry; class AnnounceList { public: private: std::deque > tiers; std::deque >::iterator currentTier; std::deque::iterator currentTracker; bool currentTrackerInitialized; void resetIterator(); void setCurrentTier(const std::deque >::iterator& itr); public: AnnounceList():currentTrackerInitialized(false) {} AnnounceList(const MetaEntry* announceListEntry); AnnounceList(const std::deque >& tiers); void reconfigure(const MetaEntry* announceListEntry); void reconfigure(const std::string& url); size_t countTier() const { return tiers.size(); } /** * 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. */ std::string 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; static const std::string STARTED; static const std::string STOPPED; static const std::string COMPLETED; }; } // namespace aria2 #endif // _D_ANNOUNCE_LIST_H_