/* */ #include "MultiUrlRequestInfo.h" #include "RequestGroupMan.h" #include "DownloadEngine.h" #include "LogFactory.h" #include "RequestGroup.h" #include "prefs.h" #include "DownloadEngineFactory.h" #include "RecoverableException.h" #include "message.h" #include "DNSCache.h" #include "Util.h" #include "ConsoleStatCalc.h" #include #ifndef SA_RESETHAND # define SA_RESETHAND 0x80000000 #endif // SA_RESETHAND extern volatile sig_atomic_t globalHaltRequested; static void handler(int signal) { globalHaltRequested = true; } MultiUrlRequestInfo::MultiUrlRequestInfo(const RequestGroups& requestGroups, Option* op): _requestGroups(requestGroups), _option(op), _logger(LogFactory::getInstance()) {} MultiUrlRequestInfo::~MultiUrlRequestInfo() {} void MultiUrlRequestInfo::printDownloadAbortMessage() { printf(_("\nSome downloads were not complete because of errors." " Check the log.\n" "aria2 will resume download if the transfer is restarted.")); printf("\n"); } void MultiUrlRequestInfo::execute() { { DNSCacheHandle dnsCache = new SimpleDNSCache(); DNSCacheSingletonHolder::instance(dnsCache); } try { DownloadEngineHandle e = DownloadEngineFactory().newDownloadEngine(_option, _requestGroups); e->setStatCalc(new ConsoleStatCalc()); 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, SA_RESETHAND); Util::setGlobalSignalHandler(SIGTERM, handler, SA_RESETHAND); e->run(); e->_requestGroupMan->showDownloadResults(cout); cout << flush; if(!e->_requestGroupMan->downloadFinished()) { printDownloadAbortMessage(); } } catch(RecoverableException *ex) { _logger->error(EX_EXCEPTION_CAUGHT, ex); delete ex; } Util::setGlobalSignalHandler(SIGINT, SIG_DFL, 0); Util::setGlobalSignalHandler(SIGTERM, SIG_DFL, 0); }