/* */ #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" #include "util.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; } if(bittorrent::getTorrentAttrs(dctx)->privateTorrent) { 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->getIPAddress().c_str(), peer->getPort(), peer->isLocalPeer()?1:0); } } else { if(getLogger()->debug()) { getLogger()->debug("LPD peer %s:%u local=%d not added.", peer->getIPAddress().c_str(), peer->getPort(), 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