size_t Schedule::wireEncode(EncodingImpl<TAG>& encoder) const { size_t totalLength = 0; size_t blackLength = 0; size_t whiteLength = 0; // encode the blackIntervalList as an embed TLV structure for (const RepetitiveInterval& element : m_blackIntervalList) { blackLength += encoder.prependBlock(element.wireEncode()); } blackLength += encoder.prependVarNumber(blackLength); blackLength += encoder.prependVarNumber(tlv::BlackIntervalList); // encode the whiteIntervalList as an embed TLV structure for (const RepetitiveInterval& element : m_whiteIntervalList) { whiteLength += encoder.prependBlock(element.wireEncode()); } whiteLength += encoder.prependVarNumber(whiteLength); whiteLength += encoder.prependVarNumber(tlv::WhiteIntervalList); totalLength = whiteLength + blackLength; totalLength += encoder.prependVarNumber(totalLength); totalLength += encoder.prependVarNumber(tlv::Schedule); return totalLength; }
size_t KeyLocator::wireEncode(EncodingImpl<TAG>& encoder) const { // KeyLocator ::= KEY-LOCATOR-TYPE TLV-LENGTH (Name | KeyDigest) // KeyDigest ::= KEY-DIGEST-TYPE TLV-LENGTH BYTE+ size_t totalLength = 0; switch (m_type) { case KeyLocator_None: break; case KeyLocator_Name: totalLength += m_name.wireEncode(encoder); break; case KeyLocator_KeyDigest: totalLength += encoder.prependBlock(m_keyDigest); break; default: NDN_THROW(Error("Unsupported KeyLocator type " + to_string(m_type))); } totalLength += encoder.prependVarNumber(totalLength); totalLength += encoder.prependVarNumber(tlv::KeyLocator); return totalLength; }
size_t Data::wireEncode(EncodingImpl<TAG>& encoder, bool unsignedPortion/* = false*/) const { size_t totalLength = 0; // Data ::= DATA-TLV TLV-LENGTH // Name // MetaInfo // Content // Signature // (reverse encoding) if (!unsignedPortion && !m_signature) { BOOST_THROW_EXCEPTION(Error("Requested wire format, but data packet has not been signed yet")); } if (!unsignedPortion) { // SignatureValue totalLength += encoder.prependBlock(m_signature.getValue()); } // SignatureInfo totalLength += encoder.prependBlock(m_signature.getInfo()); // Deletion token size_t newLength = encoder.prependBlock(m_token); totalLength += newLength; // Content totalLength += encoder.prependBlock(getContent()); // MetaInfo totalLength += getMetaInfo().wireEncode(encoder); // Name totalLength += getName().wireEncode(encoder); if (!unsignedPortion) { totalLength += encoder.prependVarNumber(totalLength); totalLength += encoder.prependVarNumber(tlv::Data); } return totalLength; }
size_t Interest::wireEncode(EncodingImpl<TAG>& block) const { size_t totalLength = 0; // Interest ::= INTEREST-TYPE TLV-LENGTH // Name // Selectors? // Nonce // Scope? // InterestLifetime? // Link? // SelectedDelegation? // (reverse encoding) if (hasLink()) { if (hasSelectedDelegation()) { totalLength += prependNonNegativeIntegerBlock(block, tlv::SelectedDelegation, m_selectedDelegationIndex); } totalLength += prependBlock(block, m_link); } else { BOOST_ASSERT(!hasSelectedDelegation()); } // InterestLifetime if (getInterestLifetime() >= time::milliseconds::zero() && getInterestLifetime() != DEFAULT_INTEREST_LIFETIME) { totalLength += prependNonNegativeIntegerBlock(block, tlv::InterestLifetime, getInterestLifetime().count()); } // Scope if (getScope() >= 0) { totalLength += prependNonNegativeIntegerBlock(block, tlv::Scope, getScope()); } // Nonce getNonce(); // to ensure that Nonce is properly set totalLength += block.prependBlock(m_nonce); // Selectors if (hasSelectors()) { totalLength += getSelectors().wireEncode(block); } // Name totalLength += getName().wireEncode(block); totalLength += block.prependVarNumber(totalLength); totalLength += block.prependVarNumber(tlv::Interest); return totalLength; }
size_t Interest::encode03(EncodingImpl<TAG>& encoder) const { size_t totalLength = 0; // Encode as NDN Packet Format v0.3 // Interest ::= INTEREST-TYPE TLV-LENGTH // Name // CanBePrefix? // MustBeFresh? // ForwardingHint? // Nonce? // InterestLifetime? // HopLimit? // ApplicationParameters? // (reverse encoding) // ApplicationParameters if (hasApplicationParameters()) { totalLength += encoder.prependBlock(getApplicationParameters()); } // HopLimit: not yet supported // InterestLifetime if (getInterestLifetime() != DEFAULT_INTEREST_LIFETIME) { totalLength += prependNonNegativeIntegerBlock(encoder, tlv::InterestLifetime, static_cast<uint64_t>(getInterestLifetime().count())); } // Nonce uint32_t nonce = getNonce(); // if nonce was unset, getNonce generates a random nonce totalLength += encoder.prependByteArrayBlock(tlv::Nonce, reinterpret_cast<uint8_t*>(&nonce), sizeof(nonce)); // ForwardingHint if (!getForwardingHint().empty()) { totalLength += getForwardingHint().wireEncode(encoder); } // MustBeFresh if (getMustBeFresh()) { totalLength += prependEmptyBlock(encoder, tlv::MustBeFresh); } // CanBePrefix if (getCanBePrefix()) { totalLength += prependEmptyBlock(encoder, tlv::CanBePrefix); } // Name totalLength += getName().wireEncode(encoder); totalLength += encoder.prependVarNumber(totalLength); totalLength += encoder.prependVarNumber(tlv::Interest); return totalLength; }
inline size_t Response::wireEncode(EncodingImpl<T>& block) const { if (m_contentType == NDNS_BLOB || m_contentType == NDNS_KEY) { // Raw application content return block.prependBlock(m_appContent); } // Content :: = CONTENT-TYPE TLV-LENGTH // Block* size_t totalLength = 0; for (std::vector<Block>::const_reverse_iterator iter = m_rrs.rbegin(); iter != m_rrs.rend(); ++iter) { totalLength += block.prependBlock(*iter); } totalLength += block.prependVarNumber(totalLength); totalLength += block.prependVarNumber(::ndn::tlv::Content); return totalLength; }
size_t Packet::wireEncode(EncodingImpl<TAG>& encoder) const { if (m_wire.hasWire()) { return m_wire.size(); } size_t length = 0; for (const Block& element : boost::adaptors::reverse(m_wire.elements())) { length += encoder.prependBlock(element); } length += encoder.prependVarNumber(length); length += encoder.prependVarNumber(tlv::LpPacket); return length; }
size_t MetaInfo::wireEncode(EncodingImpl<TAG>& encoder) const { // MetaInfo ::= META-INFO-TYPE TLV-LENGTH // ContentType? // FreshnessPeriod? // FinalBlockId? // AppMetaInfo* size_t totalLength = 0; for (std::list<Block>::const_reverse_iterator appMetaInfoItem = m_appMetaInfo.rbegin(); appMetaInfoItem != m_appMetaInfo.rend(); ++appMetaInfoItem) { totalLength += encoder.prependBlock(*appMetaInfoItem); } // FinalBlockId if (!m_finalBlockId.empty()) { totalLength += prependNestedBlock(encoder, tlv::FinalBlockId, m_finalBlockId); } // FreshnessPeriod if (m_freshnessPeriod >= time::milliseconds::zero()) { totalLength += prependNonNegativeIntegerBlock(encoder, tlv::FreshnessPeriod, m_freshnessPeriod.count()); } // ContentType if (m_type != tlv::ContentType_Blob) { totalLength += prependNonNegativeIntegerBlock(encoder, tlv::ContentType, m_type); } totalLength += encoder.prependVarNumber(totalLength); totalLength += encoder.prependVarNumber(tlv::MetaInfo); return totalLength; }
inline size_t prependBlock(EncodingImpl<TAG>& encoder, const Block& block) { return encoder.prependBlock(block); }