/* */ #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" #include "IndexedList.h" namespace aria2 { class DownloadEngine; class Command; struct DownloadResult; class ServerStatMan; class ServerStat; class Option; class OutputFile; class UriListParser; class WrDiskCache; typedef IndexedList > RequestGroupList; typedef IndexedList > DownloadResultList; class RequestGroupMan { private: RequestGroupList requestGroups_; RequestGroupList reservedGroups_; DownloadResultList downloadResults_; int maxSimultaneousDownloads_; const Option* option_; SharedHandle serverStatMan_; int maxOverallDownloadSpeedLimit_; int maxOverallUploadSpeedLimit_; NetStat netStat_; // true if download engine should keep running even if there is no // download to perform. bool keepRunning_; 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_; size_t maxDownloadResult_; // UriListParser for deferred input. SharedHandle uriListParser_; WrDiskCache* wrDiskCache_; 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; const RequestGroupList& getRequestGroups() const { return requestGroups_; } const RequestGroupList& getReservedGroups() const { return reservedGroups_; } // Returns RequestGroup object whose gid is gid. This method returns // RequestGroup either in requestGroups_ or reservedGroups_. SharedHandle findGroup(a2_gid_t gid) const; // 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, A2_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 error_; int inProgress_; int waiting_; error_code::Value lastErrorResult_; public: DownloadStat(int error, int inProgress, int waiting, error_code::Value lastErrorResult = error_code::FINISHED): 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; } int getInProgress() const { return inProgress_; } }; DownloadStat getDownloadStat() const; const DownloadResultList& 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); 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(size_t v) { maxDownloadResult_ = v; } void setUriListParser(const SharedHandle& uriListParser); NetStat& getNetStat() { return netStat_; } WrDiskCache* getWrDiskCache() const { return wrDiskCache_; } // Initializes WrDiskCache according to PREF_DISK_CACHE option. If // its value is 0, cache storage will not be initialized. void initWrDiskCache(); void setKeepRunning(bool flag) { keepRunning_ = flag; } }; } // namespace aria2 #endif // D_REQUEST_GROUP_MAN_H