/* */ #include "DownloadEngineFactory.h" #include #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" # include "CheckIntegrityEntry.h" # include "CheckIntegrityDispatcherCommand.h" #endif // ENABLE_MESSAGE_DIGEST #include "prefs.h" #include "FillRequestGroupCommand.h" #include "FileAllocationDispatcherCommand.h" #include "AutoSaveCommand.h" #include "HaveEraseCommand.h" #include "TimedHaltCommand.h" #include "DownloadResult.h" #include "ServerStatMan.h" #include "a2io.h" #ifdef HAVE_EPOLL # include "EpollEventPoll.h" #endif // HAVE_EPOLL #include "SelectEventPoll.h" #include "DlAbortEx.h" #include "FileAllocationEntry.h" #ifdef ENABLE_XML_RPC # include "HttpListenCommand.h" #endif // ENABLE_XML_RPC 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; } SharedHandle eventPoll; #ifdef HAVE_EPOLL if(op->get(PREF_EVENT_POLL) == V_EPOLL) { SharedHandle ep(new EpollEventPoll()); if(ep->good()) { eventPoll = ep; } else { throw DlAbortEx("Initializing EpollEventPoll failed." " Try --event-poll=select"); } } else #endif // HAVE_EPLL if(op->get(PREF_EVENT_POLL) == V_SELECT) { eventPoll.reset(new SelectEventPoll()); } else { abort(); } DownloadEngineHandle e(new DownloadEngine(eventPoll)); 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(e->newCUID(), e.get(), 1)); e->addRoutineCommand(new FileAllocationDispatcherCommand (e->newCUID(), e->_fileAllocationMan, e.get())); #ifdef ENABLE_MESSAGE_DIGEST e->addRoutineCommand(new CheckIntegrityDispatcherCommand (e->newCUID(), e->_checkIntegrityMan, e.get())); #endif // ENABLE_MESSAGE_DIGEST if(op->getAsInt(PREF_AUTO_SAVE_INTERVAL) > 0) { e->addRoutineCommand (new AutoSaveCommand(e->newCUID(), e.get(), op->getAsInt(PREF_AUTO_SAVE_INTERVAL))); } e->addRoutineCommand(new HaveEraseCommand(e->newCUID(), e.get(), 10)); { time_t stopSec = op->getAsInt(PREF_STOP); if(stopSec > 0) { e->addRoutineCommand(new TimedHaltCommand(e->newCUID(), e.get(), stopSec)); } } #ifdef ENABLE_XML_RPC if(op->getAsBool(PREF_ENABLE_XML_RPC)) { HttpListenCommand* httpListenCommand = new HttpListenCommand(e->newCUID(), e.get()); if(httpListenCommand->bindPort(op->getAsInt(PREF_XML_RPC_LISTEN_PORT))){ e->addRoutineCommand(httpListenCommand); } else { delete httpListenCommand; } } #endif // ENABLE_XML_RPC return e; } } // namespace aria2