/* */ #include "MultiUrlRequestInfo.h" #include "prefs.h" #include "DownloadEngineFactory.h" #include "RecoverableException.h" #include "message.h" #include "DNSCache.h" #include "TorrentRequestInfo.h" #include "MetalinkRequestInfo.h" extern volatile sig_atomic_t haltRequested; RequestInfoHandle MultiUrlRequestInfo::createNextRequestInfo(const string& filename) const { #ifdef ENABLE_BITTORRENT if(op->getAsBool(PREF_FOLLOW_TORRENT) && Util::endsWith(fileInfo.filename, ".torrent")) { return new TorrentRequestInfo(filename, op); } else #endif // ENABLE_BITTORRENT #ifdef ENABLE_METALINK if(op->getAsBool(PREF_FOLLOW_METALINK) && Util::endsWith(fileInfo.filename, ".metalink")) { return new MetalinkRequestInfo(filename, op); } else #endif // ENABLE_METALINK { return 0; } } static void handler(int signal) { haltRequested = true; } RequestInfos MultiUrlRequestInfo::execute() { { DNSCacheHandle dnsCache = new SimpleDNSCache(); DNSCacheSingletonHolder::instance(dnsCache); } RequestInfos nextReqInfos; try { SharedHandle e(DownloadEngineFactory::newConsoleEngine(op, _requestGroups)); e->fillCommand(); // The number of simultaneous download is specified by PREF_MAX_SIMULTANEOUS_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(); for(RequestGroups::iterator itr = _requestGroups.begin(); itr != _requestGroups.end(); ++itr) { if((*itr)->downloadFinished()) { RequestInfoHandle reqInfo = createNextRequestInfo((*itr)->getFilePath()); if(!reqInfo.isNull()) { nextReqInfos.push_back(reqInfo); } } } RequestGroupMan rgman(_requestGroups); // TODO print summary of the download result rgman.showDownloadResults(cout); cout << flush; // TODO Do we have to print a message when some of the downloads are failed? if(!rgman.downloadFinished()) { printDownloadAbortMessage(); } } catch(RecoverableException *ex) { logger->error("Exception caught", ex); delete ex; fail = true; } Util::setGlobalSignalHandler(SIGINT, SIG_DFL, 0); Util::setGlobalSignalHandler(SIGTERM, SIG_DFL, 0); return nextReqInfos; }