/* */ #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 "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" #include "BtProgressInfoFile.h" #include "BtAnnounce.h" #include "BtRuntime.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; } SharedHandle btRegistry = e->getBtRegistry(); SharedHandle pieceStorage = btRegistry->getPieceStorage(btContext->getInfoHashAsString()); SharedHandle peerStorage = btRegistry->getPeerStorage(btContext->getInfoHashAsString()); SharedHandle btRuntime = btRegistry->getBtRuntime(btContext->getInfoHashAsString()); SharedHandle btAnnounce = btRegistry->getBtAnnounce(btContext->getInfoHashAsString()); // commands { TrackerWatcherCommand* c = new TrackerWatcherCommand(e->newCUID(), requestGroup, e, btContext); c->setPeerStorage(peerStorage); c->setPieceStorage(pieceStorage); c->setBtRuntime(btRuntime); c->setBtAnnounce(btAnnounce); commands.push_back(c); } { PeerChokeCommand* c = new PeerChokeCommand(e->newCUID(), e, btContext); c->setPeerStorage(peerStorage); c->setBtRuntime(btRuntime); commands.push_back(c); } { ActivePeerConnectionCommand* c = new ActivePeerConnectionCommand(e->newCUID(), requestGroup, e, btContext, 10); c->setBtRuntime(btRuntime); c->setPieceStorage(pieceStorage); c->setPeerStorage(peerStorage); c->setBtAnnounce(btAnnounce); commands.push_back(c); } if(!btContext->isPrivate() && DHTSetup::initialized()) { DHTRegistry::_peerAnnounceStorage->addPeerAnnounce(btContext->getInfoHash(), peerStorage); DHTGetPeersCommand* command = new DHTGetPeersCommand(e->newCUID(), requestGroup, e, btContext); command->setTaskQueue(DHTRegistry::_taskQueue); command->setTaskFactory(DHTRegistry::_taskFactory); command->setBtRuntime(btRuntime); command->setPeerStorage(peerStorage); 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)); cri->setPieceStorage(pieceStorage); cri->setPeerStorage(peerStorage); unionCri->addSeedCriteria(cri); } } if(unionCri->getSeedCriterion().size() > 0) { SeedCheckCommand* c = new SeedCheckCommand(e->newCUID(), requestGroup, e, btContext, unionCri); c->setPieceStorage(pieceStorage); c->setBtRuntime(btRuntime); commands.push_back(c); } 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)) { btRuntime->setListenPort(port); commands.push_back(listenCommand); } else { _logger->error(_("Errors occurred while binding port.\n")); delete listenCommand; } } btRuntime->setReady(true); } } // namespace aria2