/* */ #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" #include "NetStat.h" namespace aria2 { class DownloadEngine; class Command; struct DownloadResult; class ServerStatMan; class ServerStat; class Option; class OutputFile; class UriListParser; class RequestGroupMan { private: std::deque > requestGroups_; std::deque > reservedGroups_; // GID => RequestGroup index for faster retrieval. std::map > groupIndex_; std::deque > downloadResults_; int maxSimultaneousDownloads_; const Option* option_; SharedHandle serverStatMan_; int maxOverallDownloadSpeedLimit_; int maxOverallUploadSpeedLimit_; NetStat netStat_; // true if JSON-RPC/XML-RPC is enabled. bool rpc_; bool queueCheck_; // The number of error DownloadResult removed because of upper limit // of the queue int removedErrorResult_; // The last error of removed DownloadResult error_code::Value removedLastErrorResult_; int maxDownloadResult_; // UriListParser for deferred input. SharedHandle uriListParser_; void formatDownloadResultFull (OutputFile& out, const char* status, const SharedHandle& downloadResult) const; std::string formatDownloadResult (const char* status, const SharedHandle& downloadResult) const; void configureRequestGroup (const SharedHandle& requestGroup) const; void addRequestGroupIndex(const SharedHandle& group); void addRequestGroupIndex (const std::vector >& groups); public: RequestGroupMan(const std::vector >& requestGroups, int maxSimultaneousDownloads, const Option* option); ~RequestGroupMan(); bool downloadFinished(); void save(); void closeFile(); void halt(); void forceHalt(); void removeStoppedGroup(DownloadEngine* e); void fillRequestGroupFromReserver(DownloadEngine* e); // Note that this method does not call addRequestGroupIndex(). This // method should be considered as private, but exposed for unit // testing purpose. 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_; } // Note: Use only for unit testing. Use findGroup() and test // RequestGroup::getState() instead. SharedHandle findRequestGroup(a2_gid_t gid) const; const std::deque >& getReservedGroups() const { return reservedGroups_; } // Note: Use only for unit testing. Use findGroup() and test // RequestGroup::getState() instead. SharedHandle findReservedGroup(a2_gid_t gid) const; // Returns RequestGroup object whose gid is gid. This method returns // RequestGroup either in requestGroups_ or reservedGroups_. SharedHandle findGroup(a2_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(a2_gid_t gid, int pos, HOW how); bool removeReservedGroup(a2_gid_t gid); void showDownloadResults(OutputFile& o, bool full) const; bool isSameFileBeingDownloaded(RequestGroup* requestGroup) const; TransferStat calculateStat(); class DownloadStat { private: int completed_; int error_; int inProgress_; int removed_; int waiting_; error_code::Value lastErrorResult_; public: DownloadStat(int completed, int error, int inProgress, int removed, int waiting, error_code::Value lastErrorResult = error_code::FINISHED): completed_(completed), error_(error), inProgress_(inProgress), removed_(removed), waiting_(waiting), lastErrorResult_(lastErrorResult) {} error_code::Value getLastErrorResult() const { return lastErrorResult_; } bool allCompleted() const { return error_ == 0 && inProgress_ == 0 && waiting_ == 0; } int getInProgress() const { return inProgress_; } }; DownloadStat getDownloadStat() const; const std::deque >& getDownloadResults() const { return downloadResults_; } SharedHandle findDownloadResult(a2_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(a2_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(int speed) { maxOverallDownloadSpeedLimit_ = speed; } 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(int speed) { maxOverallUploadSpeedLimit_ = speed; } int getMaxOverallUploadSpeedLimit() const { return maxOverallUploadSpeedLimit_; } void setMaxSimultaneousDownloads(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); const SharedHandle& getServerStatMan() const { return serverStatMan_; } void setMaxDownloadResult(int v) { maxDownloadResult_ = v; } void setUriListParser(const SharedHandle& uriListParser); NetStat& getNetStat() { return netStat_; } }; } // namespace aria2 #endif // D_REQUEST_GROUP_MAN_H