/* */ #ifndef _D_REQUEST_GROUP_MAN_H_ #define _D_REQUEST_GROUP_MAN_H_ #include "common.h" #include #include #include #include "SharedHandle.h" #include "DownloadResult.h" #include "TransferStat.h" namespace aria2 { class DownloadEngine; class RequestGroup; class Command; class Logger; class DownloadResult; class ServerStatMan; class ServerStat; class Option; class RequestGroupMan { private: std::deque > _requestGroups; std::deque > _reservedGroups; std::deque > _downloadResults; Logger* _logger; unsigned int _maxSimultaneousDownloads; int32_t _gidCounter; const Option* _option; SharedHandle _serverStatMan; unsigned int _maxOverallDownloadSpeedLimit; unsigned int _maxOverallUploadSpeedLimit; std::string formatDownloadResult(const std::string& status, const SharedHandle& downloadResult) const; void configureRequestGroup (const SharedHandle& requestGroup) const; public: RequestGroupMan(const std::deque >& requestGroups, unsigned int maxSimultaneousDownloads, const Option* option); bool downloadFinished(); void save(); void closeFile(); void halt(); void forceHalt(); void getInitialCommands(std::deque& commands, DownloadEngine* e); void removeStoppedGroup(DownloadEngine* e); void fillRequestGroupFromReserver(DownloadEngine* e); void addRequestGroup(const SharedHandle& group); void addReservedGroup(const std::deque >& groups); void addReservedGroup(const SharedHandle& group); void insertReservedGroup (size_t pos, const std::deque >& 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(int32_t gid) const; const std::deque >& getReservedGroups() const { return _reservedGroups; } SharedHandle findReservedGroup(int32_t gid) const; bool removeReservedGroup(int32_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; DownloadResult::RESULT _lastErrorResult; public: DownloadStat(size_t completed, size_t error, size_t inProgress, size_t waiting, DownloadResult::RESULT lastErrorResult = DownloadResult::FINISHED): _completed(completed), _error(error), _inProgress(inProgress), _waiting(waiting), _lastErrorResult(lastErrorResult) {} DownloadResult::RESULT 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(int32_t gid) const; // Removes all download results. void purgeDownloadResult(); 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; } }; typedef SharedHandle RequestGroupManHandle; } // namespace aria2 #endif // _D_REQUEST_GROUP_MAN_H_