/* */ #include "UTMetadataRequestExtensionMessage.h" #include "bencode2.h" #include "util.h" #include "a2functional.h" #include "bittorrent_helper.h" #include "DlAbortEx.h" #include "fmt.h" #include "BtMessageFactory.h" #include "BtMessageDispatcher.h" #include "Peer.h" #include "UTMetadataRejectExtensionMessage.h" #include "UTMetadataDataExtensionMessage.h" #include "BtConstants.h" #include "DownloadContext.h" #include "BtMessage.h" #include "PieceStorage.h" namespace aria2 { UTMetadataRequestExtensionMessage::UTMetadataRequestExtensionMessage (uint8_t extensionMessageID):UTMetadataExtensionMessage(extensionMessageID), dispatcher_(0), messageFactory_(0) {} UTMetadataRequestExtensionMessage::~UTMetadataRequestExtensionMessage() {} std::string UTMetadataRequestExtensionMessage::getPayload() { Dict dict; dict.put("msg_type", Integer::g(0)); dict.put("piece", Integer::g(getIndex())); return bencode2::encode(&dict); } std::string UTMetadataRequestExtensionMessage::toString() const { return strconcat("ut_metadata request piece=", util::uitos(getIndex())); } void UTMetadataRequestExtensionMessage::doReceivedAction() { SharedHandle attrs = bittorrent::getTorrentAttrs(dctx_); uint8_t id = peer_->getExtensionMessageID("ut_metadata"); if(attrs->metadata.empty()) { SharedHandle m (new UTMetadataRejectExtensionMessage(id)); m->setIndex(getIndex()); SharedHandle msg = messageFactory_->createBtExtendedMessage(m); dispatcher_->addMessageToQueue(msg); }else if(getIndex()*METADATA_PIECE_SIZE < attrs->metadataSize) { SharedHandle m (new UTMetadataDataExtensionMessage(id)); m->setIndex(getIndex()); m->setTotalSize(attrs->metadataSize); std::string::const_iterator begin = attrs->metadata.begin()+getIndex()*METADATA_PIECE_SIZE; std::string::const_iterator end = (getIndex()+1)*METADATA_PIECE_SIZE <= attrs->metadata.size()? attrs->metadata.begin()+(getIndex()+1)*METADATA_PIECE_SIZE: attrs->metadata.end(); m->setData(std::string(begin, end)); SharedHandle msg = messageFactory_->createBtExtendedMessage(m); dispatcher_->addMessageToQueue(msg); } else { throw DL_ABORT_EX (fmt("Metadata piece index is too big. piece=%lu", static_cast(getIndex()))); } } void UTMetadataRequestExtensionMessage::setDownloadContext (const SharedHandle& dctx) { dctx_ = dctx; } void UTMetadataRequestExtensionMessage::setPeer(const SharedHandle& peer) { peer_ = peer; } } // namespace aria2