/* */ #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 "LogFactory.h" #include "LpdMessage.h" #include "bittorrent_helper.h" #include "util.h" #include "fmt.h" namespace aria2 { LpdReceiveMessageCommand::LpdReceiveMessageCommand (cuid_t cuid, const std::shared_ptr& receiver, DownloadEngine* e) : Command(cuid), receiver_(receiver), e_(e) { e_->addSocketForReadCheck(receiver_->getSocket(), this); } LpdReceiveMessageCommand::~LpdReceiveMessageCommand() { e_->deleteSocketForReadCheck(receiver_->getSocket(), this); } bool LpdReceiveMessageCommand::execute() { if(e_->getRequestGroupMan()->downloadFinished() || e_->isHaltRequested()) { return true; } for(size_t i = 0; i < 20; ++i) { auto m = receiver_->receiveMessage(); if(!m) { break; } auto& reg = e_->getBtRegistry(); auto& dctx = reg->getDownloadContext(m->infoHash); if(!dctx) { A2_LOG_DEBUG(fmt("Download Context is null for infohash=%s.", util::toHex(m->infoHash).c_str())); continue; } if(bittorrent::getTorrentAttrs(dctx)->privateTorrent) { A2_LOG_DEBUG("Ignore LPD message because the torrent is private."); continue; } RequestGroup* group = dctx->getOwnerRequestGroup(); assert(group); auto btobj = reg->get(group->getGID()); assert(btobj); auto& peerStorage = btobj->peerStorage; assert(peerStorage); auto& peer = m->peer; if(peerStorage->addPeer(peer)) { A2_LOG_DEBUG(fmt("LPD peer %s:%u local=%d added.", peer->getIPAddress().c_str(), peer->getPort(), peer->isLocalPeer()?1:0)); } else { A2_LOG_DEBUG(fmt("LPD peer %s:%u local=%d not added.", peer->getIPAddress().c_str(), peer->getPort(), peer->isLocalPeer()?1:0)); } } e_->addCommand(std::unique_ptr(this)); return false; } } // namespace aria2