/* */ #include "LpdDispatchMessageCommand.h" #include "LpdMessageDispatcher.h" #include "DownloadEngine.h" #include "BtRuntime.h" #include "Logger.h" #include "LogFactory.h" #include "RecoverableException.h" #include "SocketCore.h" #include "util.h" #include "fmt.h" namespace aria2 { LpdDispatchMessageCommand::LpdDispatchMessageCommand( cuid_t cuid, const std::shared_ptr& dispatcher, DownloadEngine* e) : Command(cuid), dispatcher_(dispatcher), e_(e), tryCount_(0) { } LpdDispatchMessageCommand::~LpdDispatchMessageCommand() {} bool LpdDispatchMessageCommand::execute() { if (btRuntime_->isHalt()) { return true; } if (dispatcher_->isAnnounceReady()) { try { A2_LOG_INFO(fmt("Dispatching LPD message for infohash=%s", util::toHex(dispatcher_->getInfoHash()).c_str())); if (dispatcher_->sendMessage()) { A2_LOG_INFO("Sending LPD message is complete."); dispatcher_->resetAnnounceTimer(); tryCount_ = 0; } else { ++tryCount_; if (tryCount_ >= 5) { A2_LOG_INFO( fmt("Sending LPD message %u times but all failed.", tryCount_)); dispatcher_->resetAnnounceTimer(); tryCount_ = 0; } else { A2_LOG_INFO("Could not send LPD message, retry shortly."); } } } catch (RecoverableException& e) { A2_LOG_INFO_EX("Failed to send LPD message.", e); dispatcher_->resetAnnounceTimer(); tryCount_ = 0; } } e_->addCommand(std::unique_ptr(this)); return false; } } // namespace aria2