/* */ #ifndef D_REQUEST_GROUP_MAN_H #define D_REQUEST_GROUP_MAN_H #include "common.h" #include #include #include #include #include "SharedHandle.h" #include "DownloadResult.h" #include "TransferStat.h" #include "RequestGroup.h" namespace aria2 { class DownloadEngine; class Command; struct DownloadResult; class ServerStatMan; class ServerStat; class Option; class RequestGroupMan { private: std::deque > requestGroups_; std::deque > reservedGroups_; std::deque > downloadResults_; unsigned int maxSimultaneousDownloads_; const Option* option_; SharedHandle serverStatMan_; unsigned int maxOverallDownloadSpeedLimit_; unsigned int maxOverallUploadSpeedLimit_; // truf if XML-RPC is enabled. bool xmlRpc_; bool queueCheck_; // The number of error DownloadResult removed because of upper limit // of the queue size_t removedErrorResult_; // The last error of removed DownloadResult error_code::Value removedLastErrorResult_; size_t maxDownloadResult_; std::string formatDownloadResult(const std::string& status, const SharedHandle& downloadResult) const; void configureRequestGroup (const SharedHandle& requestGroup) const; public: RequestGroupMan(const std::vector >& requestGroups, unsigned int maxSimultaneousDownloads, const Option* option); ~RequestGroupMan(); bool downloadFinished(); void save(); void closeFile(); void halt(); void forceHalt(); void removeStoppedGroup(DownloadEngine* e); void fillRequestGroupFromReserver(DownloadEngine* e); void addRequestGroup(const SharedHandle& group); void addReservedGroup(const std::vector >& groups); void addReservedGroup(const SharedHandle& group); void insertReservedGroup (size_t pos, const std::vector >& groups); void insertReservedGroup(size_t pos, const SharedHandle& group); size_t countRequestGroup() const; SharedHandle getRequestGroup(size_t index) const; const std::deque >& getRequestGroups() const { return requestGroups_; } SharedHandle findRequestGroup(gid_t gid) const; const std::deque >& getReservedGroups() const { return reservedGroups_; } SharedHandle findReservedGroup(gid_t gid) const; enum HOW { POS_SET, POS_CUR, POS_END }; // Changes the position of download denoted by gid. If how is // POS_SET, it moves the download to a position relative to the // beginning of the queue. If how is POS_CUR, it moves the download // to a position relative to the current position. If how is // POS_END, it moves the download to a position relative to the end // of the queue. If the destination position is less than 0 or // beyond the end of the queue, it moves the download to the // beginning or the end of the queue respectively. Returns the // destination position. size_t changeReservedGroupPosition(gid_t gid, int pos, HOW how); bool removeReservedGroup(gid_t gid); void showDownloadResults(std::ostream& o) const; bool isSameFileBeingDownloaded(RequestGroup* requestGroup) const; TransferStat calculateStat(); class DownloadStat { private: size_t completed_; size_t error_; size_t inProgress_; size_t waiting_; error_code::Value lastErrorResult_; public: DownloadStat(size_t completed, size_t error, size_t inProgress, size_t waiting, error_code::Value lastErrorResult = error_code::FINISHED): completed_(completed), error_(error), inProgress_(inProgress), waiting_(waiting), lastErrorResult_(lastErrorResult) {} error_code::Value getLastErrorResult() const { return lastErrorResult_; } bool allCompleted() const { return error_ == 0 && inProgress_ == 0 && waiting_ == 0; } size_t getInProgress() const { return inProgress_; } }; DownloadStat getDownloadStat() const; const std::deque >& getDownloadResults() const { return downloadResults_; } SharedHandle findDownloadResult(gid_t gid) const; // Removes all download results. void purgeDownloadResult(); // Removes download result of given gid. Returns true if download // result was removed. Otherwise returns false. bool removeDownloadResult(gid_t gid); void addDownloadResult(const SharedHandle& downloadResult); SharedHandle findServerStat(const std::string& hostname, const std::string& protocol) const; SharedHandle getOrCreateServerStat(const std::string& hostname, const std::string& protocol); bool addServerStat(const SharedHandle& serverStat); void updateServerStat(); bool loadServerStat(const std::string& filename); bool saveServerStat(const std::string& filename) const; void removeStaleServerStat(time_t timeout); // Returns true if current download speed exceeds // maxOverallDownloadSpeedLimit_. Always returns false if // maxOverallDownloadSpeedLimit_ == 0. Otherwise returns false. bool doesOverallDownloadSpeedExceed(); void setMaxOverallDownloadSpeedLimit(unsigned int speed) { maxOverallDownloadSpeedLimit_ = speed; } unsigned int getMaxOverallDownloadSpeedLimit() const { return maxOverallDownloadSpeedLimit_; } // Returns true if current upload speed exceeds // maxOverallUploadSpeedLimit_. Always returns false if // maxOverallUploadSpeedLimit_ == 0. Otherwise returns false. bool doesOverallUploadSpeedExceed(); void setMaxOverallUploadSpeedLimit(unsigned int speed) { maxOverallUploadSpeedLimit_ = speed; } unsigned int getMaxOverallUploadSpeedLimit() const { return maxOverallUploadSpeedLimit_; } void setMaxSimultaneousDownloads(unsigned int max) { maxSimultaneousDownloads_ = max; } // Call this function if requestGroups_ queue should be maintained. // This function is added to reduce the call of maintenance, but at // the same time, it provides fast maintenance reaction. void requestQueueCheck() { queueCheck_ = true; } void clearQueueCheck() { queueCheck_ = false; } bool queueCheckRequested() const { return queueCheck_; } // Returns currently used hosts and its use count. void getUsedHosts(std::vector >& usedHosts); }; typedef SharedHandle RequestGroupManHandle; } // namespace aria2 #endif // D_REQUEST_GROUP_MAN_H