33 #include <boost/logic/tribool.hpp> 38 BOOST_CONCEPT_ASSERT((boost::EqualityComparable<Component>));
43 "name::Component::Error must inherit from tlv::Error");
60 g_conventionEncoding = convention;
63 NDN_THROW(std::invalid_argument(
"Unknown naming convention"));
76 g_conventionDecoding = convention;
94 static const auto wantAltEnv = []() -> boost::tribool {
95 const char* env = std::getenv(
"NDN_NAME_ALT_URI");
97 return boost::indeterminate;
98 else if (env[0] ==
'0')
100 else if (env[0] ==
'1')
103 return boost::indeterminate;
107 static const bool wantAlt = boost::indeterminate(wantAltEnv) ? false : bool(wantAltEnv);
111 static const bool wantAlt = boost::indeterminate(wantAltEnv) ? true : bool(wantAltEnv);
120 Component::ensureValid()
const 125 getComponentTypeTable().get(
type()).check(*
this);
165 std::ostringstream oss;
167 std::string
value = oss.str();
168 if (value.find_first_not_of(
'.') == std::string::npos) {
169 if (value.size() < 3) {
172 return Component(type, {
reinterpret_cast<const uint8_t*
>(value.data()), value.size() - 3});
174 return Component(type, {
reinterpret_cast<const uint8_t*
>(value.data()), value.size()});
180 size_t equalPos = input.
find(
'=');
181 if (equalPos == std::string::npos) {
185 auto typePrefix = input.substr(0, equalPos);
186 auto type = std::strtoul(typePrefix.data(),
nullptr, 10);
189 size_t valuePos = equalPos + 1;
191 input.data() + valuePos, input.size() - valuePos);
194 auto ct = getComponentTypeTable().findByUriPrefix(typePrefix);
196 NDN_THROW(
Error(
"Unknown TLV-TYPE '" + typePrefix +
"' in NameComponent URI"));
198 return ct->parseAltUriValue(input.substr(equalPos + 1));
205 getComponentTypeTable().get(
type()).writeUri(os, *
this);
208 ComponentType().writeUri(os, *
this);
215 std::ostringstream os;
277 NDN_THROW(
Error(
"Name component does not have NonNegativeInteger value"));
286 NDN_THROW(
Error(
"Name component does not have the requested marker " 287 "or the value is not a NonNegativeInteger"));
370 valueLength += estimator.prependBytes({marker});
371 size_t totalLength = valueLength;
372 totalLength += estimator.prependVarNumber(valueLength);
376 encoder.prependNonNegativeInteger(number);
377 encoder.prependBytes({marker});
378 encoder.prependVarNumber(valueLength);
484 int cmpType =
type() - other.
type();
501 bool isOverflow =
false;
503 std::tie(isOverflow, successor) = getComponentTypeTable().
get(
type()).getSuccessor(*
this);
509 auto value = getComponentTypeTable().get(type).getMinValue();
513 template<encoding::Tag TAG>
517 size_t totalLength = 0;
519 totalLength += encoder.prependBytes(
value_bytes());
521 totalLength += encoder.prependVarNumber(
value_size());
522 totalLength += encoder.prependVarNumber(
type());
static Component fromParametersSha256Digest(ConstBufferPtr digest)
Create ParametersSha256DigestComponent component.
void setConventionDecoding(Convention convention)
Set which Naming Conventions style(s) to accept while decoding.
static Component fromSequenceNumber(uint64_t seqNo)
Create a sequence number component using NDN naming conventions.
Same as UriFormat::CANONICAL, unless NDN_NAME_ALT_URI environment variable is set to '1'...
Copyright (c) 2011-2015 Regents of the University of California.
bool isSequenceNumber() const
Check if the component is a sequence number per NDN naming conventions.
static Convention g_conventionEncoding
uint64_t toSequenceNumber() const
Interpret as sequence number component using NDN naming conventions.
static Component fromNumberWithMarker(uint8_t marker, uint64_t number)
Create a component encoded as NameComponentWithMarker.
constexpr size_t prependNonNegativeInteger(uint64_t n) const noexcept
Prepend n in NonNegativeInteger encoding.
UriFormat
Format used for the URI representation of a name.
std::string to_string(const T &val)
static bool canDecodeMarkerConvention()
static const size_t DIGEST_SIZE
Length in bytes of a SHA-256 digest.
boost::chrono::time_point< system_clock > time_point
bool isByteOffset() const
Check if the component is a byte offset per NDN naming conventions.
Component(uint32_t type=tlv::GenericNameComponent)
Construct a NameComponent of TLV-TYPE type and with empty TLV-VALUE.
bool isNumberWithMarker(uint8_t marker) const
Check if the component is a NameComponentWithMarker per NDN naming conventions rev1.
const_iterator value_begin() const noexcept
Get begin iterator of TLV-VALUE.
boost::chrono::microseconds microseconds
Same as UriFormat::ALTERNATE, unless NDN_NAME_ALT_URI environment variable is set to '0'...
size_t value_size() const noexcept
Return the size of TLV-VALUE, i.e., the TLV-LENGTH.
NDN_CXX_NODISCARD bool empty() const
static Convention g_conventionDecoding
void setConventionEncoding(Convention convention)
Set which Naming Conventions style to use while encoding.
Represents a TLV element of the NDN packet format.
uint64_t readNonNegativeInteger(size_t size, Iterator &begin, Iterator end)
Read a NonNegativeInteger in NDN-TLV encoding.
bool hasWire() const noexcept
Check if the Block contains a fully encoded wire representation.
const uint8_t * wire() const
int compare(const Component &other) const
Compare this to the other Component using NDN canonical ordering.
Block makeNonNegativeIntegerBlock(uint32_t type, uint64_t value)
Create a TLV block containing a non-negative integer.
uint64_t readNonNegativeInteger(const Block &block)
Read a non-negative integer from a TLV element.
Typed name components (revision 3)
bool isNumber() const
Check if the component is a NonNegativeInteger.
time::system_clock::time_point toTimestamp() const
Interpret as timestamp component using NDN naming conventions.
bool isParametersSha256Digest() const
Check if the component is a ParametersSha256DigestComponent.
static Component fromSegment(uint64_t segmentNo)
Create a segment number component using NDN naming conventions.
Component getSuccessor() const
Get the successor of this name component.
a concept check for TLV abstraction with .wireEncode method
Convention getConventionDecoding()
Return which Naming Conventions style(s) to accept while decoding.
size_t size() const
Return the size of the encoded wire, i.e., of the whole TLV.
NDN_CXX_NODISCARD constexpr std::underlying_type_t< T > to_underlying(T val) noexcept
const uint8_t * data() const
Return a raw pointer to the beginning of the encoded wire.
const Block & get(uint32_t type) const
Return the first sub-element of the specified TLV-TYPE.
element_const_iterator find(uint32_t type) const
Find the first sub-element of the specified TLV-TYPE.
static Component fromByteOffset(uint64_t offset)
Create a byte offset component using NDN naming conventions.
static Component fromEscapedString(const char *input, size_t beginOffset, size_t endOffset)
Decode NameComponent from a URI component.
bool isSegment() const
Check if the component is a segment number per NDN naming conventions.
static bool canDecodeTypedConvention()
Block makeStringBlock(uint32_t type, const std::string &value)
Create a TLV block containing a string.
const system_clock::time_point & getUnixEpoch()
Return a system_clock::time_point representing the UNIX time epoch, i.e., 00:00:00 UTC on 1 January 1...
bool isImplicitSha256Digest() const
Check if the component is an ImplicitSha256DigestComponent.
bool equals(const Component &other) const
Check if this is the same component as other.
const Block & wireEncode() const
Encode to a wire format.
Always prefer the alternate format when available.
Block makeBinaryBlock(uint32_t type, span< const uint8_t > value)
Create a TLV block copying the TLV-VALUE from a byte range.
uint64_t toNumber() const
Interpret this name component as a NonNegativeInteger.
static Component parseUriEscapedValue(uint32_t type, const char *input, size_t len)
const uint8_t * value() const noexcept
Return a raw pointer to the beginning of TLV-VALUE.
span< const uint8_t > value_bytes() const noexcept
Return a read-only view of TLV-VALUE as a contiguous range of bytes.
Represents a name component.
void wireDecode(const Block &wire)
Decode from the wire format.
uint64_t toVersion() const
Interpret as version component using NDN naming conventions.
uint32_t type() const noexcept
Return the TLV-TYPE of the Block.
static Component fromTimestamp(const time::system_clock::time_point &timePoint)
Create a timestamp component using NDN naming conventions.
uint64_t toSegment() const
Interpret as segment number component using NDN naming conventions.
static Component fromNumber(uint64_t number, uint32_t type=tlv::GenericNameComponent)
Create a component encoded as NonNegativeInteger.
Component markers (revision 1)
NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Component)
bool isTimestamp() const
Check if the component is a timestamp per NDN naming conventions.
Convention getConventionEncoding()
Return which Naming Conventions style to use while encoding.
static Component fromVersion(uint64_t version)
Create a version component using NDN naming conventions.
const_iterator value_end() const noexcept
Get end iterator of TLV-VALUE.
uint64_t toNumberWithMarker(uint8_t marker) const
Interpret this name component as a NameComponentWithMarker.
Convention
Identify a style of NDN Naming Conventions.
bool isVersion() const
Check if the component is a version per NDN naming conventions.
uint64_t toByteOffset() const
Interpret as byte offset component using NDN naming conventions.
static bool wantAltUri(UriFormat format)
static Component fromImplicitSha256Digest(ConstBufferPtr digest)
Create ImplicitSha256DigestComponent component.
a concept check for TLV abstraction with .wireEncode method
a concept check for TLV abstraction with .wireDecode method and constructible from Block ...
void toUri(std::ostream &os, UriFormat format=UriFormat::DEFAULT) const
Write *this to the output stream, escaping characters according to the NDN URI format.
EncodingImpl< EncoderTag > EncodingBuffer
std::string unescape(const std::string &str)
Decode a percent-encoded string.
EncodingImpl< EstimatorTag > EncodingEstimator
shared_ptr< const Buffer > ConstBufferPtr