/* */ #include "MultiUrlRequestInfo.h" #include #include #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 "Util.h" #include "Option.h" #include "StatCalc.h" #include "CookieStorage.h" #include "File.h" #include "Netrc.h" #include "AuthConfigFactory.h" #ifdef ENABLE_SSL # include "SocketCore.h" # include "TLSContext.h" #endif // ENABLE_SSL 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() { int returnValue = 1; try { DownloadEngineHandle e = DownloadEngineFactory().newDownloadEngine(_option, _requestGroups); try { if(_option->defined(PREF_LOAD_COOKIES)) { File cookieFile(_option->get(PREF_LOAD_COOKIES)); if(cookieFile.isFile()) { e->getCookieStorage()->load(_option->get(PREF_LOAD_COOKIES)); } else { _logger->error(MSG_LOADING_COOKIE_FAILED, _option->get(PREF_LOAD_COOKIES).c_str()); } } } catch(RecoverableException& e) { _logger->error(EX_EXCEPTION_CAUGHT, e); } SharedHandle authConfigFactory (new AuthConfigFactory(_option)); File netrccf(_option->get(PREF_NETRC_PATH)); if(!_option->getAsBool(PREF_NO_NETRC) && netrccf.isFile()) { mode_t mode = netrccf.mode(); if(mode&(S_IRWXG|S_IRWXO)) { _logger->notice(MSG_INCORRECT_NETRC_PERMISSION, _option->get(PREF_NETRC_PATH).c_str()); } else { SharedHandle netrc(new Netrc()); netrc->parse(_option->get(PREF_NETRC_PATH)); authConfigFactory->setNetrc(netrc); } } e->setAuthConfigFactory(authConfigFactory); #ifdef ENABLE_SSL SharedHandle tlsContext(new TLSContext()); if(_option->defined(PREF_CERTIFICATE) && _option->defined(PREF_PRIVATE_KEY)) { tlsContext->addClientKeyFile(_option->get(PREF_CERTIFICATE), _option->get(PREF_PRIVATE_KEY)); } if(_option->defined(PREF_CA_CERTIFICATE)) { try { tlsContext->addTrustedCACertFile(_option->get(PREF_CA_CERTIFICATE)); } catch(RecoverableException& e) { _logger->error(EX_EXCEPTION_CAUGHT, e); _logger->warn(MSG_WARN_NO_CA_CERT); } } else if(_option->getAsBool(PREF_CHECK_CERTIFICATE)) { _logger->warn(MSG_WARN_NO_CA_CERT); } if(_option->getAsBool(PREF_CHECK_CERTIFICATE)) { tlsContext->enablePeerVerification(); } SocketCore::setTLSContext(tlsContext); #endif std::string serverStatIf = _option->get(PREF_SERVER_STAT_IF); if(!serverStatIf.empty()) { e->_requestGroupMan->loadServerStat(serverStatIf); e->_requestGroupMan->removeStaleServerStat (_option->getAsInt(PREF_SERVER_STAT_TIMEOUT)); } 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(); std::string serverStatOf = _option->get(PREF_SERVER_STAT_OF); if(!serverStatOf.empty()) { e->_requestGroupMan->saveServerStat(serverStatOf); } e->_requestGroupMan->showDownloadResults(_summaryOut); _summaryOut << std::flush; RequestGroupMan::DownloadStat s = e->_requestGroupMan->getDownloadStat(); if(s.allCompleted()) { returnValue = 0; } else { printMessageForContinue(); } } catch(RecoverableException& e) { _logger->error(EX_EXCEPTION_CAUGHT, e); } Util::setGlobalSignalHandler(SIGINT, SIG_DFL, 0); Util::setGlobalSignalHandler(SIGTERM, SIG_DFL, 0); return returnValue; } } // namespace aria2