/* */ #include "UTMetadataRequestExtensionMessage.h" #include "BDE.h" #include "bencode.h" #include "util.h" #include "a2functional.h" #include "bittorrent_helper.h" #include "DlAbortEx.h" #include "StringFormat.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) {} std::string UTMetadataRequestExtensionMessage::getPayload() { BDE dict = BDE::dict(); dict["msg_type"] = 0; dict["piece"] = getIndex(); return bencode::encode(dict); } std::string UTMetadataRequestExtensionMessage::toString() const { return strconcat("ut_metadata request piece=", util::uitos(getIndex())); } void UTMetadataRequestExtensionMessage::doReceivedAction() { const BDE& attrs = _dctx->getAttribute(bittorrent::BITTORRENT); uint8_t id = _peer->getExtensionMessageID("ut_metadata"); if(!attrs.containsKey(bittorrent::METADATA)) { SharedHandle m (new UTMetadataRejectExtensionMessage(id)); m->setIndex(getIndex()); SharedHandle msg = _messageFactory->createBtExtendedMessage(m); _dispatcher->addMessageToQueue(msg); }else if(getIndex()*METADATA_PIECE_SIZE < (size_t)attrs[bittorrent::METADATA_SIZE].i()){ SharedHandle m (new UTMetadataDataExtensionMessage(id)); m->setIndex(getIndex()); m->setTotalSize(attrs[bittorrent::METADATA_SIZE].i()); const BDE& metadata = attrs[bittorrent::METADATA]; std::string::const_iterator begin = metadata.s().begin()+getIndex()*METADATA_PIECE_SIZE; std::string::const_iterator end = (getIndex()+1)*METADATA_PIECE_SIZE <= metadata.s().size()? metadata.s().begin()+(getIndex()+1)*METADATA_PIECE_SIZE: metadata.s().end(); m->setData(std::string(begin, end)); SharedHandle msg = _messageFactory->createBtExtendedMessage(m); _dispatcher->addMessageToQueue(msg); } else { throw DL_ABORT_EX (StringFormat ("Metadata piece index is too big. piece=%d", getIndex()).str()); } } } // namespace aria2