/* */ #include "BtSetup.h" #include "RequestGroup.h" #include "DownloadEngine.h" #include "Option.h" #include "BtRegistry.h" #include "PeerListenCommand.h" #include "TrackerWatcherCommand.h" #include "SeedCheckCommand.h" #include "PeerChokeCommand.h" #include "ActivePeerConnectionCommand.h" #include "PeerListenCommand.h" #include "UnionSeedCriteria.h" #include "TimeSeedCriteria.h" #include "ShareRatioSeedCriteria.h" #include "CUIDCounter.h" #include "prefs.h" #include "LogFactory.h" #include "Logger.h" #include "Util.h" #include "IntSequence.h" #include "DHTGetPeersCommand.h" #include "DHTPeerAnnounceStorage.h" #include "DHTSetup.h" #include "DHTRegistry.h" namespace aria2 { BtSetup::BtSetup():_logger(LogFactory::getInstance()) {} void BtSetup::setup(std::deque& commands, RequestGroup* requestGroup, DownloadEngine* e, const Option* option) { BtContextHandle btContext(dynamic_pointer_cast(requestGroup->getDownloadContext())); if(btContext.isNull()) { return; } // commands commands.push_back(new TrackerWatcherCommand(CUIDCounterSingletonHolder::instance()->newID(), requestGroup, e, btContext)); commands.push_back(new PeerChokeCommand(CUIDCounterSingletonHolder::instance()->newID(), e, btContext)); commands.push_back(new ActivePeerConnectionCommand(CUIDCounterSingletonHolder::instance()->newID(), requestGroup, e, btContext, 10)); if(!btContext->isPrivate() && DHTSetup::initialized()) { DHTRegistry::_peerAnnounceStorage->addPeerAnnounce(btContext); DHTGetPeersCommand* command = new DHTGetPeersCommand(CUIDCounterSingletonHolder::instance()->newID(), requestGroup, e, btContext); command->setTaskQueue(DHTRegistry::_taskQueue); command->setTaskFactory(DHTRegistry::_taskFactory); commands.push_back(command); } SharedHandle unionCri(new UnionSeedCriteria()); if(option->defined(PREF_SEED_TIME)) { SharedHandle cri(new TimeSeedCriteria(option->getAsInt(PREF_SEED_TIME)*60)); unionCri->addSeedCriteria(cri); } { double ratio = option->getAsDouble(PREF_SEED_RATIO); if(ratio > 0.0) { SharedHandle cri(new ShareRatioSeedCriteria(option->getAsDouble(PREF_SEED_RATIO), btContext)); unionCri->addSeedCriteria(cri); } } if(unionCri->getSeedCriterion().size() > 0) { commands.push_back(new SeedCheckCommand(CUIDCounterSingletonHolder::instance()->newID(), requestGroup, e, btContext, unionCri)); } if(PeerListenCommand::getNumInstance() == 0) { PeerListenCommand* listenCommand = PeerListenCommand::getInstance(e); IntSequence seq = Util::parseIntRange(option->get(PREF_LISTEN_PORT)); uint16_t port; if(listenCommand->bindPort(port, seq)) { BT_RUNTIME(btContext)->setListenPort(port); commands.push_back(listenCommand); } else { _logger->error(_("Errors occurred while binding port.\n")); delete listenCommand; } } BT_RUNTIME(btContext)->setReady(true); } } // namespace aria2