/* */ #include "MultiUrlRequestInfo.h" #include "RequestGroupMan.h" #include "DownloadEngine.h" #include "LogFactory.h" #include "Logger.h" #include "RequestGroup.h" #include "prefs.h" #include "DownloadEngineFactory.h" #include "RecoverableException.h" #include "message.h" #include "DNSCache.h" #include "Util.h" #include "Option.h" #include "StatCalc.h" #include #include namespace aria2 { #ifndef SA_RESETHAND # define SA_RESETHAND 0x80000000 #endif // SA_RESETHAND extern volatile sig_atomic_t globalHaltRequested; static void handler(int signal) { if(globalHaltRequested == 0) { globalHaltRequested = 1; } else if(globalHaltRequested == 2) { globalHaltRequested = 3; } } MultiUrlRequestInfo::MultiUrlRequestInfo (const RequestGroups& requestGroups, Option* op, const SharedHandle& statCalc, std::ostream& summaryOut) : _requestGroups(requestGroups), _option(op), _statCalc(statCalc), _summaryOut(summaryOut), _logger(LogFactory::getInstance()) {} MultiUrlRequestInfo::~MultiUrlRequestInfo() {} void MultiUrlRequestInfo::printMessageForContinue() { _summaryOut << "\n" << _("aria2 will resume download if the transfer is restarted.") << "\n" << _("If there are any errors, then see the log file. See '-l' option in help/man page for details.") << "\n"; } int MultiUrlRequestInfo::execute() { { DNSCacheHandle dnsCache(new SimpleDNSCache()); DNSCacheSingletonHolder::instance(dnsCache); } int returnValue = 0; try { DownloadEngineHandle e = DownloadEngineFactory().newDownloadEngine(_option, _requestGroups); e->setStatCalc(_statCalc); e->fillCommand(); // The number of simultaneous download is specified by PREF_MAX_CONCURRENT_DOWNLOADS. // The remaining urls are queued into FillRequestGroupCommand. // It observes the number of simultaneous downloads and if it is under // the limit, it adds RequestGroup object from its queue to DownloadEngine. // This is done every 1 second. At the same time, it removes finished/error // RequestGroup from DownloadEngine. Util::setGlobalSignalHandler(SIGINT, handler, 0); Util::setGlobalSignalHandler(SIGTERM, handler, 0); e->run(); e->_requestGroupMan->showDownloadResults(_summaryOut); _summaryOut << std::flush; RequestGroupMan::DownloadStat s = e->_requestGroupMan->getDownloadStat(); if(!s.allCompleted()) { printMessageForContinue(); returnValue = 1; } } catch(RecoverableException *ex) { _logger->error(EX_EXCEPTION_CAUGHT, ex); delete ex; } Util::setGlobalSignalHandler(SIGINT, SIG_DFL, 0); Util::setGlobalSignalHandler(SIGTERM, SIG_DFL, 0); return returnValue; } } // namespace aria2