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;
160 ndn_TlvDecoder_skipRemainingNestedTlvs
161 (
struct ndn_TlvDecoder *
self,
size_t endOffset,
int skipCritical);
177 static __inline ndn_Error
178 ndn_TlvDecoder_finishNestedTlvs(
struct ndn_TlvDecoder *
self,
size_t endOffset)
181 if (self->offset != endOffset)
182 return ndn_TlvDecoder_skipRemainingNestedTlvs(
self, endOffset, 0);
184 return NDN_ERROR_success;
196 static __inline ndn_Error
197 ndn_TlvDecoder_finishNestedTlvsSkipCritical
201 if (self->offset != endOffset)
202 return ndn_TlvDecoder_skipRemainingNestedTlvs(
self, endOffset, 1);
204 return NDN_ERROR_success;
218 static __inline ndn_Error
219 ndn_TlvDecoder_peekType(
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
int *gotExpectedType)
221 if (self->offset >= endOffset)
223 *gotExpectedType = 0;
225 size_t saveOffset =
self->offset;
227 ndn_Error error = ndn_TlvDecoder_readVarNumber(
self, &type);
229 self->offset = saveOffset;
233 *gotExpectedType = (type == expectedType ? 1 : 0);
236 return NDN_ERROR_success;
247 ndn_TlvDecoder_readExtendedNonNegativeInteger(
struct ndn_TlvDecoder *
self,
size_t length, uint64_t *value);
256 static __inline ndn_Error
257 ndn_TlvDecoder_readNonNegativeInteger(
struct ndn_TlvDecoder *
self,
size_t length, uint64_t *value)
261 if (self->offset >= self->inputLength)
262 return NDN_ERROR_read_past_the_end_of_the_input;
264 *value = (uint64_t)self->input[self->offset++];
265 return NDN_ERROR_success;
268 return ndn_TlvDecoder_readExtendedNonNegativeInteger(
self, length, value);
280 static __inline ndn_Error
281 ndn_TlvDecoder_readNonNegativeIntegerTlv(
struct ndn_TlvDecoder *
self,
unsigned int expectedType, uint64_t *value)
285 if ((error = ndn_TlvDecoder_readTypeAndLength(
self, expectedType, &length)))
287 if ((error = ndn_TlvDecoder_readNonNegativeInteger(
self, length, value)))
290 return NDN_ERROR_success;
303 static __inline ndn_Error
304 ndn_TlvDecoder_readOptionalNonNegativeIntegerTlv
305 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
310 uint64_t unsignedValue;
312 if ((error = ndn_TlvDecoder_peekType
313 (
self, expectedType, endOffset, &gotExpectedType)))
316 if (!gotExpectedType) {
318 return NDN_ERROR_success;
321 if ((error = ndn_TlvDecoder_readNonNegativeIntegerTlv
322 (
self, expectedType, &unsignedValue)))
325 *value = (int)unsignedValue;
326 return NDN_ERROR_success;
339 static __inline ndn_Error
340 ndn_TlvDecoder_readOptionalNonNegativeIntegerTlvAsDouble
341 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
346 uint64_t unsignedValue;
348 if ((error = ndn_TlvDecoder_peekType
349 (
self, expectedType, endOffset, &gotExpectedType)))
352 if (!gotExpectedType) {
354 return NDN_ERROR_success;
357 if ((error = ndn_TlvDecoder_readNonNegativeIntegerTlv
358 (
self, expectedType, &unsignedValue)))
361 *value = (double)unsignedValue;
362 return NDN_ERROR_success;
374 static __inline ndn_Error
375 ndn_TlvDecoder_readBlobTlv
379 if ((error = ndn_TlvDecoder_readTypeAndLength(
self, expectedType, &value->
length)))
383 value->
value =
self->input +
self->offset;
384 self->offset += value->
length;
386 return NDN_ERROR_success;
402 static __inline ndn_Error
403 ndn_TlvDecoder_readOptionalBlobTlv
404 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
410 if ((error = ndn_TlvDecoder_peekType
411 (
self, expectedType, endOffset, &gotExpectedType)))
414 if (!gotExpectedType) {
417 return NDN_ERROR_success;
420 if ((error = ndn_TlvDecoder_readBlobTlv(
self, expectedType, value)))
423 return NDN_ERROR_success;
436 static __inline ndn_Error
437 ndn_TlvDecoder_readBooleanTlv
438 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset,
int *value)
442 if ((error = ndn_TlvDecoder_peekType(
self, expectedType, endOffset, &gotExpectedType)))
445 if (!gotExpectedType)
449 if ((error = ndn_TlvDecoder_readTypeAndLength(
self, expectedType, &length)))
452 self->offset += length;
457 return NDN_ERROR_success;
469 static __inline ndn_Error
470 ndn_TlvDecoder_skipTlv
476 if ((error = ndn_TlvDecoder_readTypeAndLength(
self, expectedType, &length)))
479 self->offset += length;
481 return NDN_ERROR_success;
493 static __inline ndn_Error
494 ndn_TlvDecoder_skipOptionalTlv
495 (
struct ndn_TlvDecoder *
self,
unsigned int expectedType,
size_t endOffset)
500 if ((error = ndn_TlvDecoder_peekType
501 (
self, expectedType, endOffset, &gotExpectedType)))
505 return ndn_TlvDecoder_skipTlv(
self, expectedType);
507 return NDN_ERROR_success;
515 static __inline
void ndn_TlvDecoder_seek(
struct ndn_TlvDecoder *
self,
size_t offset)
517 self->offset = offset;
529 static __inline ndn_Error
530 ndn_TlvDecoder_getSlice
531 (
struct ndn_TlvDecoder *
self,
size_t beginOffset,
size_t endOffset,
534 if (beginOffset > self->inputLength || endOffset > self->inputLength)
535 return NDN_ERROR_read_past_the_end_of_the_input;
537 slice->
value =
self->input + beginOffset;
538 if (beginOffset > endOffset)
542 slice->
length = endOffset - beginOffset;
544 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-2018 Regents of the University of California.
Definition: blob-types.h:33
Copyright (C) 2014-2018 Regents of the University of California.
Definition: tlv-decoder.h:34