From 9281f1126471fa90e2d6fe094c4c6eba00073ea6 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 20 Feb 2010 14:23:25 +0000 Subject: 2010-02-20 Tatsuhiro Tsujikawa Added Local Peer Discovery. It is disabled by default. Use --bt-enable-lpd to enable the function. * src/BtConstants.h * src/BtSetup.cc * src/LpdDispatchMessageCommand.cc * src/LpdDispatchMessageCommand.h * src/LpdMessage.h * src/LpdMessageDispatcher.cc * src/LpdMessageDispatcher.h * src/LpdMessageReceiver.cc * src/LpdMessageReceiver.h * src/LpdReceiveMessageCommand.cc * src/LpdReceiveMessageCommand.h * src/Makefile.am * src/OptionHandlerFactory.cc * src/Peer.cc * src/Peer.h * src/PeerInteractionCommand.cc * src/SocketCore.cc * src/SocketCore.h * src/prefs.cc * src/prefs.h * src/usage_text.h * src/util.cc * src/util.h * test/LpdMessageDispatcherTest.cc * test/LpdMessageReceiverTest.cc * test/Makefile.am --- src/LpdReceiveMessageCommand.cc | 154 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 src/LpdReceiveMessageCommand.cc (limited to 'src/LpdReceiveMessageCommand.cc') diff --git a/src/LpdReceiveMessageCommand.cc b/src/LpdReceiveMessageCommand.cc new file mode 100644 index 00000000..ba169b8f --- /dev/null +++ b/src/LpdReceiveMessageCommand.cc @@ -0,0 +1,154 @@ +/* */ +#include "LpdReceiveMessageCommand.h" +#include "DownloadEngine.h" +#include "SocketCore.h" +#include "LpdMessageReceiver.h" +#include "RequestGroupMan.h" +#include "DownloadContext.h" +#include "PeerStorage.h" +#include "Peer.h" +#include "RequestGroup.h" +#include "BtRegistry.h" +#include "Logger.h" +#include "PieceStorage.h" +#include "BtRuntime.h" +#include "BtProgressInfoFile.h" +#include "BtAnnounce.h" +#include "LpdMessage.h" +#include "bittorrent_helper.h" + +namespace aria2 { + +unsigned int LpdReceiveMessageCommand::__numInstance = 0; + +LpdReceiveMessageCommand* LpdReceiveMessageCommand::__instance = 0; + +LpdReceiveMessageCommand::LpdReceiveMessageCommand +(int32_t cuid, const SharedHandle& receiver, + DownloadEngine* e):Command(cuid), _receiver(receiver), _e(e) +{ + _e->addSocketForReadCheck(_receiver->getSocket(), this); + ++__numInstance; +} + +LpdReceiveMessageCommand::~LpdReceiveMessageCommand() +{ + _e->deleteSocketForReadCheck(_receiver->getSocket(), this); + --__numInstance; + if(__numInstance == 0) { + __instance = 0; + } +} + +bool LpdReceiveMessageCommand::execute() +{ + if(_e->_requestGroupMan->downloadFinished() || _e->isHaltRequested()) { + return true; + } + for(size_t i = 0; i < 20; ++i) { + SharedHandle m = _receiver->receiveMessage(); + if(m.isNull()) { + break; + } + SharedHandle reg = _e->getBtRegistry(); + SharedHandle dctx = + reg->getDownloadContext(m->getInfoHash()); + if(dctx.isNull()) { + if(logger->debug()) { + logger->debug("Download Context is null for infohash=%s.", + util::toHex(m->getInfoHash()).c_str()); + } + continue; + } + const BDE& torrentAttrs = dctx->getAttribute(bittorrent::BITTORRENT); + if(torrentAttrs.containsKey(bittorrent::PRIVATE)) { + if(torrentAttrs[bittorrent::PRIVATE].i() == 1) { + if(logger->debug()) { + logger->debug("Ignore LPD message because the torrent is private."); + } + continue; + } + } + RequestGroup* group = dctx->getOwnerRequestGroup(); + assert(group); + BtObject btobj = reg->get(group->getGID()); + assert(!btobj.isNull()); + SharedHandle peerStorage = btobj._peerStorage; + assert(!peerStorage.isNull()); + SharedHandle peer = m->getPeer(); + if(peerStorage->addPeer(peer)) { + if(logger->debug()) { + logger->debug("LPD peer %s:%u local=%d added.", + peer->ipaddr.c_str(), peer->port, + peer->isLocalPeer()?1:0); + } + } else { + if(logger->debug()) { + logger->debug("LPD peer %s:%u local=%d not added.", + peer->ipaddr.c_str(), peer->port, + peer->isLocalPeer()?1:0); + } + } + } + _e->commands.push_back(this); + return false; +} + +SharedHandle LpdReceiveMessageCommand::getReceiverSocket() const +{ + return _receiver->getSocket(); +} + +LpdReceiveMessageCommand* +LpdReceiveMessageCommand::getInstance +(DownloadEngine* e, const SharedHandle& receiver) +{ + if(__numInstance == 0) { + __instance = new LpdReceiveMessageCommand(e->newCUID(), receiver, e); + } + return __instance; +} + +LpdReceiveMessageCommand* LpdReceiveMessageCommand::getInstance() +{ + if(__numInstance == 0) { + return 0; + } else { + return __instance; + } +} + +} // namespace aria2 -- cgit