From 5013e96b3b65fce644e4326d8113c2022202a2e3 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 22 Nov 2009 14:37:05 +0000 Subject: [PATCH] 2009-11-22 Tatsuhiro Tsujikawa Don't add PeerChokeCommand and SeedCheckCommand if metadata is missing. If metadata is missing, always use DHT when it is ready. * src/BtSetup.cc --- ChangeLog | 6 ++++++ src/BtSetup.cc | 56 +++++++++++++++++++++++++++----------------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 977f8a7c..b561c0b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-11-22 Tatsuhiro Tsujikawa + + Don't add PeerChokeCommand and SeedCheckCommand if metadata is + missing. If metadata is missing, always use DHT when it is ready. + * src/BtSetup.cc + 2009-11-22 Tatsuhiro Tsujikawa Added parseMagnetLink(). Hex encoded info hash is supported. diff --git a/src/BtSetup.cc b/src/BtSetup.cc index af3ef582..2bd12719 100644 --- a/src/BtSetup.cc +++ b/src/BtSetup.cc @@ -70,11 +70,12 @@ void BtSetup::setup(std::deque& commands, DownloadEngine* e, const Option* option) { - if(!requestGroup->getDownloadContext()->hasAttribute(bittorrent::BITTORRENT)) { + if(!requestGroup->getDownloadContext()->hasAttribute(bittorrent::BITTORRENT)){ return; } const BDE& torrentAttrs = requestGroup->getDownloadContext()->getAttribute(bittorrent::BITTORRENT); + bool metadataGetMode = !torrentAttrs.containsKey(bittorrent::METADATA); BtObject btObject = e->getBtRegistry()->get(torrentAttrs[bittorrent::INFO_HASH].s()); SharedHandle pieceStorage = btObject._pieceStorage; @@ -92,12 +93,12 @@ void BtSetup::setup(std::deque& commands, commands.push_back(c); } - { + if(!metadataGetMode) { PeerChokeCommand* c = new PeerChokeCommand(e->newCUID(), e); c->setPeerStorage(peerStorage); c->setBtRuntime(btRuntime); - + commands.push_back(c); } { @@ -111,7 +112,8 @@ void BtSetup::setup(std::deque& commands, commands.push_back(c); } - if(torrentAttrs[bittorrent::PRIVATE].i() == 0 && DHTSetup::initialized()) { + if((metadataGetMode || torrentAttrs[bittorrent::PRIVATE].i() == 0) && + DHTSetup::initialized()) { DHTGetPeersCommand* command = new DHTGetPeersCommand(e->newCUID(), requestGroup, e); command->setTaskQueue(DHTRegistry::_taskQueue); @@ -120,31 +122,33 @@ void BtSetup::setup(std::deque& commands, 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), - requestGroup->getDownloadContext())); - cri->setPieceStorage(pieceStorage); - cri->setPeerStorage(peerStorage); - + if(!metadataGetMode) { + SharedHandle unionCri(new UnionSeedCriteria()); + if(option->defined(PREF_SEED_TIME)) { + SharedHandle cri + (new TimeSeedCriteria(option->getAsInt(PREF_SEED_TIME)*60)); unionCri->addSeedCriteria(cri); } - } - if(unionCri->getSeedCriterion().size() > 0) { - SeedCheckCommand* c = - new SeedCheckCommand(e->newCUID(), requestGroup, e, unionCri); - c->setPieceStorage(pieceStorage); - c->setBtRuntime(btRuntime); - commands.push_back(c); - } + { + double ratio = option->getAsDouble(PREF_SEED_RATIO); + if(ratio > 0.0) { + SharedHandle cri + (new ShareRatioSeedCriteria(option->getAsDouble(PREF_SEED_RATIO), + requestGroup->getDownloadContext())); + cri->setPieceStorage(pieceStorage); + cri->setPeerStorage(peerStorage); + unionCri->addSeedCriteria(cri); + } + } + if(unionCri->getSeedCriterion().size() > 0) { + SeedCheckCommand* c = + new SeedCheckCommand(e->newCUID(), requestGroup, e, 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));