/* */ #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" namespace aria2 { UTMetadataRequestFactory::UTMetadataRequestFactory() : dispatcher_(0), messageFactory_(0), tracker_(0), cuid_(0) {} void UTMetadataRequestFactory::create (std::vector >& msgs, size_t num, const std::shared_ptr& pieceStorage) { while(num) { std::vector metadataRequests = tracker_->getAllTrackedIndex(); std::shared_ptr 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()))); std::shared_ptr m (new UTMetadataRequestExtensionMessage (peer_->getExtensionMessageID(ExtensionMessageRegistry::UT_METADATA))); m->setIndex(p->getIndex()); m->setDownloadContext(dctx_); m->setBtMessageDispatcher(dispatcher_); m->setBtMessageFactory(messageFactory_); m->setPeer(peer_); std::shared_ptr msg = messageFactory_->createBtExtendedMessage(m); msgs.push_back(msg); tracker_->add(p->getIndex()); } } } // namespace aria2