26 #include <boost/scope_exit.hpp> 34 BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Interest>));
38 static_assert(std::is_base_of<tlv::Error, Interest::Error>::value,
39 "Interest::Error must inherit from tlv::Error");
41 #ifdef NDN_CXX_HAVE_TESTS 42 bool Interest::s_errorIfCanBePrefixUnset =
true;
43 #endif // NDN_CXX_HAVE_TESTS 44 boost::logic::tribool Interest::s_defaultCanBePrefix = boost::logic::indeterminate;
48 , m_isCanBePrefixSet(false)
49 , m_interestLifetime(lifetime)
51 if (lifetime < time::milliseconds::zero()) {
52 BOOST_THROW_EXCEPTION(std::invalid_argument(
"InterestLifetime must be >= 0"));
55 if (!boost::logic::indeterminate(s_defaultCanBePrefix)) {
61 : m_isCanBePrefixSet(true)
68 template<encoding::Tag TAG>
72 static bool hasDefaultCanBePrefixWarning =
false;
73 if (!m_isCanBePrefixSet) {
74 if (!hasDefaultCanBePrefixWarning) {
75 std::cerr <<
"WARNING: Interest.CanBePrefix will be set to 0 in the near future. " 76 <<
"Please declare a preferred setting via Interest::setDefaultCanBePrefix.";
77 hasDefaultCanBePrefixWarning =
true;
79 #ifdef NDN_CXX_HAVE_TESTS 80 if (s_errorIfCanBePrefixUnset) {
81 BOOST_THROW_EXCEPTION(std::logic_error(
"Interest.CanBePrefix is unset"));
83 #endif // NDN_CXX_HAVE_TESTS 87 return encode03(encoder);
90 return encode02(encoder);
94 template<encoding::Tag TAG>
98 size_t totalLength = 0;
124 totalLength += encoder.prependByteArrayBlock(
tlv::Nonce, reinterpret_cast<uint8_t*>(&nonce),
sizeof(nonce));
134 totalLength += encoder.prependVarNumber(totalLength);
139 template<encoding::Tag TAG>
141 Interest::encode03(EncodingImpl<TAG>& encoder)
const 143 size_t totalLength = 0;
174 totalLength += encoder.prependByteArrayBlock(
tlv::Nonce, reinterpret_cast<uint8_t*>(&nonce),
sizeof(nonce));
194 totalLength += encoder.prependVarNumber(totalLength);
213 const_cast<Interest*>(
this)->wireDecode(buffer.block());
224 BOOST_THROW_EXCEPTION(
Error(
"expecting Interest element, got " +
to_string(m_wire.
type())));
234 m_isCanBePrefixSet =
true;
263 if (element->value_size() !=
sizeof(nonce)) {
264 BOOST_THROW_EXCEPTION(Error(
"Nonce element is malformed"));
266 std::memcpy(&nonce, element->value(),
sizeof(nonce));
289 m_forwardingHint = DelegationList();
310 BOOST_THROW_EXCEPTION(Error(
"Name element is missing or out of order"));
313 if (m_name.
empty()) {
314 BOOST_THROW_EXCEPTION(Error(
"Name has zero name components"));
318 m_selectors =
Selectors().setMaxSuffixComponents(1);
321 m_forwardingHint = DelegationList();
322 m_parameters = Block();
324 for (++element; element != m_wire.
elements_end(); ++element) {
325 switch (element->type()) {
327 if (lastElement >= 2) {
328 BOOST_THROW_EXCEPTION(Error(
"CanBePrefix element is out of order"));
330 if (element->value_size() != 0) {
331 BOOST_THROW_EXCEPTION(Error(
"CanBePrefix element has non-zero TLV-LENGTH"));
338 if (lastElement >= 3) {
339 BOOST_THROW_EXCEPTION(Error(
"MustBeFresh element is out of order"));
341 if (element->value_size() != 0) {
342 BOOST_THROW_EXCEPTION(Error(
"MustBeFresh element has non-zero TLV-LENGTH"));
349 if (lastElement >= 4) {
350 BOOST_THROW_EXCEPTION(Error(
"ForwardingHint element is out of order"));
357 if (lastElement >= 5) {
358 BOOST_THROW_EXCEPTION(Error(
"Nonce element is out of order"));
361 if (element->value_size() !=
sizeof(nonce)) {
362 BOOST_THROW_EXCEPTION(Error(
"Nonce element is malformed"));
364 std::memcpy(&nonce, element->value(),
sizeof(nonce));
370 if (lastElement >= 6) {
371 BOOST_THROW_EXCEPTION(Error(
"InterestLifetime element is out of order"));
378 if (lastElement >= 7) {
381 if (element->value_size() != 1) {
382 BOOST_THROW_EXCEPTION(Error(
"HopLimit element is malformed"));
389 if (lastElement >= 8) {
390 BOOST_THROW_EXCEPTION(Error(
"Parameters element is out of order"));
392 m_parameters = *element;
398 BOOST_THROW_EXCEPTION(Error(
"unrecognized element of critical type " +
410 std::ostringstream os;
447 size_t interestNameLength = m_name.
size();
449 size_t fullNameLength = dataName.
size() + 1;
453 size_t minSuffixComponents = hasMinSuffixComponents ?
455 if (!(interestNameLength + minSuffixComponents <= fullNameLength))
460 if (hasMaxSuffixComponents &&
465 if (interestNameLength == fullNameLength) {
485 if (interestNameLength == fullNameLength - 1) {
513 if (!publisherPublicKeyLocator.
empty()) {
520 if (publisherPublicKeyLocator.
wireEncode() != *it) {
562 uint32_t newNonce = oldNonce;
563 while (newNonce == oldNonce)
572 if (lifetime < time::milliseconds::zero()) {
573 BOOST_THROW_EXCEPTION(std::invalid_argument(
"InterestLifetime must be >= 0"));
575 m_interestLifetime = lifetime;
583 m_forwardingHint = value;
592 m_parameters = parameters;
620 m_parameters =
Block();
630 bool wasCanBePrefixSetOnLhs = lhs.m_isCanBePrefixSet;
631 bool wasCanBePrefixSetOnRhs = rhs.m_isCanBePrefixSet;
632 lhs.m_isCanBePrefixSet =
true;
633 rhs.m_isCanBePrefixSet =
true;
634 BOOST_SCOPE_EXIT_ALL(&) {
635 lhs.m_isCanBePrefixSet = wasCanBePrefixSetOnLhs;
636 rhs.m_isCanBePrefixSet = wasCanBePrefixSetOnRhs;
671 os << delim <<
"ndn.Nonce=" << interest.
getNonce();
675 os << delim <<
"ndn.Exclude=" << interest.
getExclude();
void wireDecode(const Block &wire)
Decode the input from wire format.
const Block & wireEncode() const
Encode to a Block.
bool hasWire() const
Check if the Block has fully encoded wire.
Copyright (c) 2011-2015 Regents of the University of California.
const Name & getName() const
Get name.
int getChildSelector() const
size_t prependNonNegativeIntegerBlock(EncodingImpl< TAG > &encoder, uint32_t type, uint64_t value)
Prepend a TLV element containing a non-negative integer.
const Selectors & getSelectors() const
Selectors & setMustBeFresh(bool mustBeFresh)
std::string toUri() const
Return a URI-like string that represents the Interest.
const Component & get(ssize_t i) const
Get the component at the given index.
constexpr bool isCriticalType(uint32_t type)
Determine whether a TLV-TYPE is "critical" for evolvability purpose.
void refreshNonce()
Change nonce value.
std::ostream & operator<<(std::ostream &os, const Data &data)
bool isPrefixOf(const Name &other) const
Check if this name is a prefix of another name.
Interest(const Name &name=Name(), time::milliseconds lifetime=DEFAULT_INTEREST_LIFETIME)
Construct an Interest with given name and lifetime.
bool matchesInterest(const Interest &other) const
Check if Interest matches other interest.
element_container::const_iterator element_const_iterator
bool matchesName(const Name &name) const
Check if Interest, including selectors, matches the given name.
const int DEFAULT_CHILD_SELECTOR
void parse() const
Parse TLV-VALUE into sub elements.
Represents a TLV element of NDN packet format.
Represents an Interest packet.
element_const_iterator elements_begin() const
Equivalent to elements().begin()
uint64_t readNonNegativeInteger(const Block &block)
Read a non-negative integer from a TLV element.
Selectors & setMaxSuffixComponents(int maxSuffixComponents)
bool hasNonce() const
Check if the Nonce element is present.
int getMaxSuffixComponents() const
uint32_t generateWord32()
Generate a non-cryptographically-secure random integer in the range [0, 2^32)
a concept check for TLV abstraction with .wireEncode method
void wireDecode(const Block &block, bool wantSort=true)
decode a DelegationList
element_const_iterator elements_end() const
Equivalent to elements().end()
const Signature & getSignature() const
Get Signature.
const KeyLocator & getPublisherPublicKeyLocator() const
element_const_iterator find(uint32_t type) const
Find the first sub element of specified TLV-TYPE.
size_t prependEmptyBlock(EncodingImpl< TAG > &encoder, uint32_t type)
Prepend an empty TLV element.
Block makeBinaryBlock(uint32_t type, const uint8_t *value, size_t length)
Create a TLV block copying TLV-VALUE from raw buffer.
uint32_t getNonce() const
Get nonce value.
const Block & getInfo() const
Get SignatureInfo as wire format.
const Block & getParameters() const
Interest & setNonce(uint32_t nonce)
Set nonce value.
NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Exclude)
bool matchesData(const Data &data) const
Check if Interest can be satisfied by data.
size_t wireEncode(EncodingImpl< TAG > &encoder, uint32_t type=tlv::ForwardingHint) const
encode into wire format
bool isImplicitSha256Digest() const
Check if the component is ImplicitSha256DigestComponent.
void reset()
Reset wire buffer of the element.
Represents an absolute name.
bool getCanBePrefix() const
Check whether the CanBePrefix element is present.
bool hasParameters() const
const Exclude & getExclude() const
const Name & getFullName() const
Get full name including implicit digest.
size_t size() const
Get number of components.
void wireDecode(const Block &wire)
Decode from wire in NDN Packet Format v0.2 or v0.3.
size_t wireEncode(EncodingImpl< TAG > &encoder) const
prepend wire encoding
size_t wireEncode(EncodingImpl< TAG > &encoder) const
Prepend wire encoding to encoder.
int getMinSuffixComponents() const
size_t wireEncode(EncodingImpl< TAG > &encoder) const
Fast encoding or block size estimation.
time::milliseconds getInterestLifetime() const
const DelegationList & getForwardingHint() const
represents a list of Delegations
bool empty() const
Check if name is empty.
bool operator==(const Data &lhs, const Data &rhs)
size_t wireEncode(EncodingImpl< TAG > &encoder) const
Fast encoding or block size estimation.
Interest & setForwardingHint(const DelegationList &value)
bool getMustBeFresh() const
Check whether the MustBeFresh element is present.
Interest & setInterestLifetime(time::milliseconds lifetime)
Set Interest's lifetime.
const time::milliseconds DEFAULT_INTEREST_LIFETIME
default value for InterestLifetime
std::string to_string(const V &v)
bool isExcluded(const name::Component &comp) const
Check if name component is excluded.
void wireDecode(const Block &wire)
Decode name from wire encoding.
Interest & unsetParameters()
Remove the Parameters element from this Interest.
a concept check for TLV abstraction with .wireEncode method
Represents a Data packet.
a concept check for TLV abstraction with .wireDecode method and constructible from Block
EncodingImpl< EncoderTag > EncodingBuffer
uint32_t type() const
Get TLV-TYPE.
EncodingImpl< EstimatorTag > EncodingEstimator
bool hasSelectors() const
Check if Interest has any selector present.
const Name & getName() const
Holds SignatureInfo and SignatureValue in a Data packet.
Interest & setCanBePrefix(bool canBePrefix)
Add or remove CanBePrefix element.
Interest & setParameters(const Block ¶meters)
Set parameters from a Block.
shared_ptr< const Buffer > ConstBufferPtr