/* */ #include "UTMetadataRequestFactory.h" #include "PieceStorage.h" #include "DownloadContext.h" #include "Peer.h" #include "BtMessageDispatcher.h" #include "BtMessageFactory.h" #include "UTMetadataRequestExtensionMessage.h" #include "UTMetadataRequestTracker.h" #include "BtMessage.h" #include "Logger.h" #include "LogFactory.h" #include "fmt.h" #include "ExtensionMessageRegistry.h" #include "BtExtendedMessage.h" namespace aria2 { UTMetadataRequestFactory::UTMetadataRequestFactory() : dctx_{nullptr}, dispatcher_{nullptr}, messageFactory_{nullptr}, tracker_{nullptr}, cuid_{0} { } std::vector> UTMetadataRequestFactory::create(size_t num, PieceStorage* pieceStorage) { auto msgs = std::vector>{}; while (num) { auto metadataRequests = tracker_->getAllTrackedIndex(); auto p = pieceStorage->getMissingPiece(peer_, metadataRequests, cuid_); if (!p) { A2_LOG_DEBUG("No ut_metadata piece is available to download."); break; } --num; A2_LOG_DEBUG(fmt("Creating ut_metadata request index=%lu", static_cast(p->getIndex()))); auto m = make_unique( peer_->getExtensionMessageID(ExtensionMessageRegistry::UT_METADATA)); m->setIndex(p->getIndex()); m->setDownloadContext(dctx_); m->setBtMessageDispatcher(dispatcher_); m->setBtMessageFactory(messageFactory_); m->setPeer(peer_); msgs.push_back(messageFactory_->createBtExtendedMessage(std::move(m))); tracker_->add(p->getIndex()); } return msgs; } } // namespace aria2