/* */ #include "DownloadEngineFactory.h" #include "LogFactory.h" #include "Logger.h" #include "Option.h" #include "RequestGroup.h" #include "DownloadEngine.h" #include "RequestGroupMan.h" #include "FileAllocationMan.h" #ifdef ENABLE_MESSAGE_DIGEST # include "CheckIntegrityMan.h" #endif // ENABLE_MESSAGE_DIGEST #include "prefs.h" #include "CUIDCounter.h" #include "FillRequestGroupCommand.h" #include "FileAllocationDispatcherCommand.h" #include "AutoSaveCommand.h" #include "HaveEraseCommand.h" #include "TimedHaltCommand.h" #include "DownloadResult.h" #include namespace aria2 { DownloadEngineFactory::DownloadEngineFactory(): _logger(LogFactory::getInstance()) {} DownloadEngineHandle DownloadEngineFactory::newDownloadEngine(Option* op, const RequestGroups& requestGroups) { RequestGroups workingSet; RequestGroups reservedSet; if(op->getAsInt(PREF_MAX_CONCURRENT_DOWNLOADS) < (int32_t)requestGroups.size()) { std::copy(requestGroups.begin(), requestGroups.begin()+op->getAsInt(PREF_MAX_CONCURRENT_DOWNLOADS), std::back_inserter(workingSet)); std::copy(requestGroups.begin()+op->getAsInt(PREF_MAX_CONCURRENT_DOWNLOADS), requestGroups.end(), std::back_inserter(reservedSet)); } else { workingSet = requestGroups; } DownloadEngineHandle e = new DownloadEngine(); e->option = op; RequestGroupManHandle requestGroupMan = new RequestGroupMan(workingSet, op->getAsInt(PREF_MAX_CONCURRENT_DOWNLOADS)); requestGroupMan->addReservedGroup(reservedSet); e->_requestGroupMan = requestGroupMan; e->_fileAllocationMan = new FileAllocationMan(); #ifdef ENABLE_MESSAGE_DIGEST e->_checkIntegrityMan = new CheckIntegrityMan(); #endif // ENABLE_MESSAGE_DIGEST e->commands.push_back(new FillRequestGroupCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 1)); e->commands.push_back(new FileAllocationDispatcherCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get())); e->commands.push_back(new AutoSaveCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), op->getAsInt(PREF_AUTO_SAVE_INTERVAL))); e->commands.push_back(new HaveEraseCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 10)); { int32_t stopMin = op->getAsInt(PREF_STOP); if(stopMin > 0) { e->commands.push_back(new TimedHaltCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), stopMin*60)); } } return e; } } // namespace aria2