/* */ #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 "ServerStatMan.h" #include namespace aria2 { DownloadEngineFactory::DownloadEngineFactory(): _logger(LogFactory::getInstance()) {} DownloadEngineHandle DownloadEngineFactory::newDownloadEngine(Option* op, const RequestGroups& requestGroups) { RequestGroups workingSet; RequestGroups reservedSet; const size_t MAX_CONCURRENT_DOWNLOADS = op->getAsInt(PREF_MAX_CONCURRENT_DOWNLOADS); if(MAX_CONCURRENT_DOWNLOADS < requestGroups.size()) { workingSet.insert(workingSet.end(), requestGroups.begin(), requestGroups.begin()+MAX_CONCURRENT_DOWNLOADS); reservedSet.insert(reservedSet.end(), requestGroups.begin()+MAX_CONCURRENT_DOWNLOADS, requestGroups.end()); } else { workingSet = requestGroups; } DownloadEngineHandle e(new DownloadEngine()); e->option = op; RequestGroupManHandle requestGroupMan(new RequestGroupMan(workingSet, MAX_CONCURRENT_DOWNLOADS, op)); requestGroupMan->addReservedGroup(reservedSet); e->_requestGroupMan = requestGroupMan; e->_fileAllocationMan.reset(new FileAllocationMan()); #ifdef ENABLE_MESSAGE_DIGEST e->_checkIntegrityMan.reset(new CheckIntegrityMan()); #endif // ENABLE_MESSAGE_DIGEST e->addRoutineCommand(new FillRequestGroupCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 1)); e->addRoutineCommand(new FileAllocationDispatcherCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get())); e->addRoutineCommand(new AutoSaveCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), op->getAsInt(PREF_AUTO_SAVE_INTERVAL))); e->addRoutineCommand(new HaveEraseCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), 10)); { time_t stopSec = op->getAsInt(PREF_STOP); if(stopSec > 0) { e->addRoutineCommand(new TimedHaltCommand(CUIDCounterSingletonHolder::instance()->newID(), e.get(), stopSec)); } } return e; } } // namespace aria2