22 #ifndef NDN_TLV_DECODER_H
23 #define NDN_TLV_DECODER_H
25 #include <ndn-cpp/c/common.h>
26 #include <ndn-cpp/c/errors.h>
27 #include "../../util/blob.h"
47 ndn_TlvDecoder_initialize(
struct ndn_TlvDecoder *
self,
const uint8_t *input,
size_t inputLength)
50 self->inputLength = inputLength;
62 ndn_TlvDecoder_readExtendedVarNumber(
struct ndn_TlvDecoder *
self,
unsigned int firstOctet, uint64_t *varNumber);
70 static __inline ndn_Error
71 ndn_TlvDecoder_readVarNumber(
struct ndn_TlvDecoder *
self, uint64_t *varNumber)
73 unsigned int firstOctet;
76 if (self->offset >= self->inputLength)
77 return NDN_ERROR_read_past_the_end_of_the_input;
79 firstOctet = (
unsigned int)self->input[self->offset++];
80 if (firstOctet < 253) {
82 *varNumber = (uint64_t)firstOctet;
83 return NDN_ERROR_success;
86 return ndn_TlvDecoder_readExtendedVarNumber(
self, firstOctet, varNumber);
98 static __inline ndn_Error
99 ndn_TlvDecoder_readTypeAndLength
100 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t *length)
104 uint64_t lengthVarNumber;
106 if ((error = ndn_TlvDecoder_readVarNumber(
self, &type)))
109 if (type != (uint64_t)expectedType)
110 return NDN_ERROR_did_not_get_the_expected_TLV_type;
112 if ((error = ndn_TlvDecoder_readVarNumber(
self, &lengthVarNumber)))
116 *length = (size_t)lengthVarNumber;
117 if (self->offset + *length > self->inputLength)
118 return NDN_ERROR_TLV_length_exceeds_buffer_length;
120 return NDN_ERROR_success;
134 static __inline ndn_Error
135 ndn_TlvDecoder_readNestedTlvsStart(
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t *endOffset)
139 if ((error = ndn_TlvDecoder_readTypeAndLength(
self, expectedType, &length)))
141 *endOffset =
self->offset + length;
143 return NDN_ERROR_success;
156 ndn_TlvDecoder_skipRemainingNestedTlvs
167 static __inline ndn_Error
168 ndn_TlvDecoder_finishNestedTlvs(
struct ndn_TlvDecoder *
self,
size_t endOffset)
171 if (self->offset != endOffset)
172 return ndn_TlvDecoder_skipRemainingNestedTlvs(
self, endOffset);
174 return NDN_ERROR_success;
188 static __inline ndn_Error
189 ndn_TlvDecoder_peekType(
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
int *gotExpectedType)
191 if (self->offset >= endOffset)
193 *gotExpectedType = 0;
195 size_t saveOffset =
self->offset;
197 ndn_Error error = ndn_TlvDecoder_readVarNumber(
self, &type);
199 self->offset = saveOffset;
203 *gotExpectedType = (type == expectedType ? 1 : 0);
206 return NDN_ERROR_success;
217 ndn_TlvDecoder_readExtendedNonNegativeInteger(
struct ndn_TlvDecoder *
self,
size_t length, uint64_t *value);
226 static __inline ndn_Error
227 ndn_TlvDecoder_readNonNegativeInteger(
struct ndn_TlvDecoder *
self,
size_t length, uint64_t *value)
231 if (self->offset >= self->inputLength)
232 return NDN_ERROR_read_past_the_end_of_the_input;
234 *value = (uint64_t)self->input[self->offset++];
235 return NDN_ERROR_success;
238 return ndn_TlvDecoder_readExtendedNonNegativeInteger(
self, length, value);
250 static __inline ndn_Error
251 ndn_TlvDecoder_readNonNegativeIntegerTlv(
struct ndn_TlvDecoder *
self,
unsigned int expectedType, uint64_t *value)
255 if ((error = ndn_TlvDecoder_readTypeAndLength(
self, expectedType, &length)))
257 if ((error = ndn_TlvDecoder_readNonNegativeInteger(
self, length, value)))
260 return NDN_ERROR_success;
273 static __inline ndn_Error
274 ndn_TlvDecoder_readOptionalNonNegativeIntegerTlv
275 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
280 uint64_t unsignedValue;
282 if ((error = ndn_TlvDecoder_peekType
283 (
self, expectedType, endOffset, &gotExpectedType)))
286 if (!gotExpectedType) {
288 return NDN_ERROR_success;
291 if ((error = ndn_TlvDecoder_readNonNegativeIntegerTlv
292 (
self, expectedType, &unsignedValue)))
295 *value = (int)unsignedValue;
296 return NDN_ERROR_success;
309 static __inline ndn_Error
310 ndn_TlvDecoder_readOptionalNonNegativeIntegerTlvAsDouble
311 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
316 uint64_t unsignedValue;
318 if ((error = ndn_TlvDecoder_peekType
319 (
self, expectedType, endOffset, &gotExpectedType)))
322 if (!gotExpectedType) {
324 return NDN_ERROR_success;
327 if ((error = ndn_TlvDecoder_readNonNegativeIntegerTlv
328 (
self, expectedType, &unsignedValue)))
331 *value = (double)unsignedValue;
332 return NDN_ERROR_success;
344 static __inline ndn_Error
345 ndn_TlvDecoder_readBlobTlv
349 if ((error = ndn_TlvDecoder_readTypeAndLength(
self, expectedType, &value->
length)))
353 value->
value =
self->input +
self->offset;
354 self->offset += value->
length;
356 return NDN_ERROR_success;
372 static __inline ndn_Error
373 ndn_TlvDecoder_readOptionalBlobTlv
374 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
380 if ((error = ndn_TlvDecoder_peekType
381 (
self, expectedType, endOffset, &gotExpectedType)))
384 if (!gotExpectedType) {
387 return NDN_ERROR_success;
390 if ((error = ndn_TlvDecoder_readBlobTlv(
self, expectedType, value)))
393 return NDN_ERROR_success;
406 static __inline ndn_Error
407 ndn_TlvDecoder_readBooleanTlv
408 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
int *value)
412 if ((error = ndn_TlvDecoder_peekType(
self, expectedType, endOffset, &gotExpectedType)))
415 if (!gotExpectedType)
419 if ((error = ndn_TlvDecoder_readTypeAndLength(
self, expectedType, &length)))
422 self->offset += length;
427 return NDN_ERROR_success;
435 static __inline
void ndn_TlvDecoder_seek(
struct ndn_TlvDecoder *
self,
size_t offset)
437 self->offset = offset;
449 static __inline ndn_Error
450 ndn_TlvDecoder_getSlice
451 (
struct ndn_TlvDecoder *
self,
size_t beginOffset,
size_t endOffset,
454 if (beginOffset > self->inputLength || endOffset > self->inputLength)
455 return NDN_ERROR_read_past_the_end_of_the_input;
457 slice->
value =
self->input + beginOffset;
458 if (beginOffset > endOffset)
462 slice->
length = endOffset - beginOffset;
464 return NDN_ERROR_success;
size_t length
the number of bytes in value.
Definition: blob-types.h:35
const uint8_t * value
pointer to the pre-allocated buffer for the value.
Definition: blob-types.h:34
Copyright (C) 2015-2016 Regents of the University of California.
Definition: blob-types.h:33
Copyright (C) 2014-2016 Regents of the University of California.
Definition: tlv-decoder.h:34