/* */ #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"] = _index; return bencode::encode(dict); } std::string UTMetadataRequestExtensionMessage::toString() const { return strconcat("ut_metadata request piece=", util::uitos(_index)); } 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(_index); SharedHandle msg = _messageFactory->createBtExtendedMessage(m); _dispatcher->addMessageToQueue(msg); }else if(_index*METADATA_PIECE_SIZE < (size_t)attrs[bittorrent::METADATA_SIZE].i()){ SharedHandle m (new UTMetadataDataExtensionMessage(id)); m->setIndex(_index); m->setTotalSize(attrs[bittorrent::METADATA_SIZE].i()); const BDE& metadata = attrs[bittorrent::METADATA]; std::string::const_iterator begin = metadata.s().begin()+_index*METADATA_PIECE_SIZE; std::string::const_iterator end = (_index+1)*METADATA_PIECE_SIZE <= metadata.s().size()? metadata.s().begin()+(_index+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", _index).str()); } } } // namespace aria2