/* */ #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" #include "ServerStatMan.h" #include "FileAllocationEntry.h" #include "CheckIntegrityEntry.h" namespace aria2 { unsigned int LpdReceiveMessageCommand::__numInstance = 0; LpdReceiveMessageCommand* LpdReceiveMessageCommand::__instance = 0; LpdReceiveMessageCommand::LpdReceiveMessageCommand (cuid_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->getRequestGroupMan()->downloadFinished() || _e->isHaltRequested()) { return true; } for(size_t i = 0; i < 20; ++i) { SharedHandle m = _receiver->receiveMessage(); if(m.isNull()) { break; } if(m->getPeer().isNull()) { // bad message continue; } SharedHandle reg = _e->getBtRegistry(); SharedHandle dctx = reg->getDownloadContext(m->getInfoHash()); if(dctx.isNull()) { if(getLogger()->debug()) { getLogger()->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(getLogger()->debug()) { getLogger()->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(getLogger()->debug()) { getLogger()->debug("LPD peer %s:%u local=%d added.", peer->ipaddr.c_str(), peer->port, peer->isLocalPeer()?1:0); } } else { if(getLogger()->debug()) { getLogger()->debug("LPD peer %s:%u local=%d not added.", peer->ipaddr.c_str(), peer->port, peer->isLocalPeer()?1:0); } } } _e->addCommand(this); return false; } 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