22 #ifndef NDN_ENCODING_TLV_HPP 23 #define NDN_ENCODING_TLV_HPP 30 #include <type_traits> 33 #include <boost/endian/conversion.hpp> 52 class Error :
public std::runtime_error
55 using std::runtime_error::runtime_error;
108 [[deprecated(
"use GenericNameComponent")]]
173 return type <= 31 || (type & 0x01);
187 template<
typename Iterator>
189 readVarNumber(Iterator& begin, Iterator end, uint64_t& number) noexcept;
204 template<
typename Iterator>
206 readType(Iterator& begin, Iterator end, uint32_t& type) noexcept;
218 template<
typename Iterator>
234 template<
typename Iterator>
236 readType(Iterator& begin, Iterator end);
264 template<
typename Iterator>
295 template<
typename Iterator>
300 operator()(
size_t size, Iterator& begin, Iterator end, uint64_t& number)
const noexcept
304 for (; begin != end && count < size; ++begin, ++count) {
305 number = (number << 8) | *begin;
307 return count == size;
313 template<
typename Iterator>
318 operator()(
size_t size, Iterator& begin, Iterator end, uint64_t& number)
const noexcept
320 if (begin + size > end) {
332 std::memcpy(&value, &*begin, 2);
334 number = boost::endian::big_to_native(value);
339 std::memcpy(&value, &*begin, 4);
341 number = boost::endian::big_to_native(value);
346 std::memcpy(&value, &*begin, 8);
348 number = boost::endian::big_to_native(value);
364 template<
typename Iterator,
365 typename DecayedIterator = std::decay_t<Iterator>,
366 typename ValueType =
typename std::iterator_traits<DecayedIterator>::value_type>
370 return (std::is_convertible<DecayedIterator, const ValueType*>::value ||
371 std::is_convertible<DecayedIterator,
typename std::basic_string<ValueType>::const_iterator>::value ||
372 std::is_convertible<DecayedIterator,
typename std::vector<ValueType>::const_iterator>::value) &&
373 sizeof(ValueType) == 1 &&
374 !std::is_same<ValueType, bool>::value;
377 template<
typename Iterator>
378 class ReadNumber :
public std::conditional_t<shouldSelectContiguousReadNumber<Iterator>(),
379 ReadNumberFast<Iterator>, ReadNumberSlow<Iterator>>
385 template<
typename Iterator>
392 uint8_t firstOctet = *begin;
394 if (firstOctet < 253) {
399 size_t size = firstOctet == 253 ? 2 :
400 firstOctet == 254 ? 4 : 8;
404 template<
typename Iterator>
406 readType(Iterator& begin, Iterator end, uint32_t& type) noexcept
410 if (!isOk || number > std::numeric_limits<uint32_t>::max()) {
414 type = static_cast<uint32_t>(number);
418 template<
typename Iterator>
423 BOOST_THROW_EXCEPTION(
Error(
"Empty buffer during TLV parsing"));
429 BOOST_THROW_EXCEPTION(
Error(
"Insufficient data during TLV parsing"));
435 template<
typename Iterator>
440 if (type > std::numeric_limits<uint32_t>::max()) {
441 BOOST_THROW_EXCEPTION(
Error(
"TLV-TYPE number exceeds allowed maximum"));
444 return static_cast<uint32_t>(type);
450 return number < 253 ? 1 :
451 number <= std::numeric_limits<uint16_t>::max() ? 3 :
452 number <= std::numeric_limits<uint32_t>::max() ? 5 : 9;
459 os.put(static_cast<char>(number));
462 else if (number <= std::numeric_limits<uint16_t>::max()) {
463 os.put(static_cast<char>(253));
464 uint16_t value = boost::endian::native_to_big(static_cast<uint16_t>(number));
465 os.write(reinterpret_cast<const char*>(&value), 2);
468 else if (number <= std::numeric_limits<uint32_t>::max()) {
469 os.put(static_cast<char>(254));
470 uint32_t value = boost::endian::native_to_big(static_cast<uint32_t>(number));
471 os.write(reinterpret_cast<const char*>(&value), 4);
475 os.put(static_cast<char>(255));
476 uint64_t value = boost::endian::native_to_big(number);
477 os.write(reinterpret_cast<const char*>(&value), 8);
482 template<
typename Iterator>
486 if (size != 1 && size != 2 && size != 4 && size != 8) {
487 BOOST_THROW_EXCEPTION(
Error(
"Invalid length for nonNegativeInteger " 488 "(only 1, 2, 4, and 8 are allowed)"));
494 BOOST_THROW_EXCEPTION(
Error(
"Insufficient data during TLV parsing"));
503 return integer <= std::numeric_limits<uint8_t>::max() ? 1 :
504 integer <= std::numeric_limits<uint16_t>::max() ? 2 :
505 integer <= std::numeric_limits<uint32_t>::max() ? 4 : 8;
511 if (integer <= std::numeric_limits<uint8_t>::max()) {
512 os.put(static_cast<char>(integer));
515 else if (integer <= std::numeric_limits<uint16_t>::max()) {
516 uint16_t value = boost::endian::native_to_big(static_cast<uint16_t>(integer));
517 os.write(reinterpret_cast<const char*>(&value), 2);
520 else if (integer <= std::numeric_limits<uint32_t>::max()) {
521 uint32_t value = boost::endian::native_to_big(static_cast<uint32_t>(integer));
522 os.write(reinterpret_cast<const char*>(&value), 4);
526 uint64_t value = boost::endian::native_to_big(integer);
527 os.write(reinterpret_cast<const char*>(&value), 8);
535 #endif // NDN_ENCODING_TLV_HPP
Represents a signature of Sha256WithRsa type.
Copyright (c) 2011-2015 Regents of the University of California.
constexpr size_t sizeOfNonNegativeInteger(uint64_t integer) noexcept
Get the number of bytes necessary to hold the value of integer encoded as nonNegativeInteger.
Represents a SignatureInfo TLV element.
std::ostream & operator<<(std::ostream &os, SignatureTypeValue st)
constexpr bool operator()(size_t size, Iterator &begin, Iterator end, uint64_t &number) const noexcept
constexpr bool operator()(size_t size, Iterator &begin, Iterator end, uint64_t &number) const noexcept
constexpr bool isCriticalType(uint32_t type)
Determine whether a TLV-TYPE is "critical" for evolvability purpose.
Represents a signature of DigestSha256 type.
Represents an Interest packet.
uint64_t readNonNegativeInteger(size_t size, Iterator &begin, Iterator end)
Read nonNegativeInteger in NDN-TLV encoding.
File-Like ICN Collection.
another name that identifies the actual data content
size_t writeNonNegativeInteger(std::ostream &os, uint64_t integer)
Write nonNegativeInteger to the specified stream.
import common constructs for ndn-cxx library internal use
size_t writeVarNumber(std::ostream &os, uint64_t number)
Write VAR-NUMBER to the specified stream.
Represents a signature of Sha256WithEcdsa type.
constexpr size_t sizeOfVarNumber(uint64_t number) noexcept
Get the number of bytes necessary to hold the value of number encoded as VAR-NUMBER.
bool readType(Iterator &begin, Iterator end, uint32_t &type) noexcept
Read TLV-TYPE.
Abstraction implementing Interest selectors.
constexpr bool shouldSelectContiguousReadNumber()
Determine whether to select ReadNumber implementation for ContiguousIterator.
Represents an absolute name.
ContentTypeValue
ContentType values.
SignatureTypeValue
SignatureType values.
constexpr int NameComponent
Function object to read a number from InputIterator.
Represents a Data packet.
represents an error in TLV encoding or decoding
bool readVarNumber(Iterator &begin, Iterator end, uint64_t &number) noexcept
Read VAR-NUMBER in NDN-TLV encoding.
Represents Exclude selector in NDN Interest.
const size_t MAX_NDN_PACKET_SIZE
practical limit of network layer packet size
Function object to read a number from ContiguousIterator.