blob: 0f3285b019c9a88ab6f65feefe319cd8cf012e01 [file] [log] [blame]
Jeff Thompson76317aa2013-06-25 19:11:48 -07001/*
2 * Author: Jeff Thompson
3 *
4 * BSD license, See the LICENSE file for more information.
5 */
6
7#ifndef NDN_BINARYXMLDECODER_H
8#define NDN_BINARYXMLDECODER_H
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14struct ndn_BinaryXMLDecoder {
Jeff Thompsond6f13282013-06-27 17:31:50 -070015 unsigned char *input;
Jeff Thompsonf7316692013-06-26 21:31:42 -070016 unsigned int inputLength;
Jeff Thompson76317aa2013-06-25 19:11:48 -070017 unsigned int offset;
18};
19
Jeff Thompsond6f13282013-06-27 17:31:50 -070020static inline void ndn_BinaryXMLDecoder_init(struct ndn_BinaryXMLDecoder *self, unsigned char *input, unsigned int inputLength)
Jeff Thompson6c9b6512013-06-27 15:59:47 -070021{
Jeff Thompson76317aa2013-06-25 19:11:48 -070022 self->input = input;
Jeff Thompsonf7316692013-06-26 21:31:42 -070023 self->inputLength = inputLength;
Jeff Thompson76317aa2013-06-25 19:11:48 -070024 self->offset = 0;
25}
26
Jeff Thompson179d0502013-06-28 11:36:00 -070027/**
28 * Decode the header's type and value from self's input starting at offset. Update offset.
Jeff Thompson179d0502013-06-28 11:36:00 -070029 * @param self pointer to the ndn_BinaryXMLDecoder struct
30 * @param type output for the header type
31 * @param value output for the header value
Jeff Thompson38cbd572013-06-28 14:01:10 -070032 * @return 0 for success, else an error string for read past the end of the input or if the initial byte is zero
Jeff Thompson179d0502013-06-28 11:36:00 -070033 */
Jeff Thompsond6f13282013-06-27 17:31:50 -070034char *ndn_BinaryXMLDecoder_decodeTypeAndValue(struct ndn_BinaryXMLDecoder *self, unsigned int *type, unsigned int *value);
Jeff Thompson76317aa2013-06-25 19:11:48 -070035
Jeff Thompsonf7316692013-06-26 21:31:42 -070036/**
Jeff Thompson74ab0812013-06-28 12:25:04 -070037 * Decode the header from self's input starting at offset, expecting the type to be DTAG and the value to be expectedTag.
38 * Update offset.
Jeff Thompson179d0502013-06-28 11:36:00 -070039 * @param self pointer to the ndn_BinaryXMLDecoder struct
Jeff Thompson74ab0812013-06-28 12:25:04 -070040 * @param expectedTag the expected value for DTAG
Jeff Thompson179d0502013-06-28 11:36:00 -070041 * @return 0 for success, else an error string, including an error if not the expected tag
42 */
Jeff Thompson74ab0812013-06-28 12:25:04 -070043char *ndn_BinaryXMLDecoder_readDTag(struct ndn_BinaryXMLDecoder *self, unsigned int expectedTag);
44
45/**
46 * Read one byte from self's input starting at offset, expecting it to be the element close.
47 * @param self pointer to the ndn_BinaryXMLDecoder struct
48 * @return 0 for success, else an error string, including an error if not the element close
49 */
50char *ndn_BinaryXMLDecoder_readElementClose(struct ndn_BinaryXMLDecoder *self);
51
52/**
53 * Decode the header from self's input starting at offset, and if it is a DTAG where the value is the expectedTag,
54 * then set gotExpectedTag to 1, else 0. Do not update offset, including if returning an error.
55 * @param self pointer to the ndn_BinaryXMLDecoder struct
56 * @param expectedTag the expected value for DTAG
57 * @param gotExpectedTag output a 1 if got the expected tag, else 0
58 * @return 0 for success, else an error string for read past the end of the input
59 */
60char *ndn_BinaryXMLDecoder_peekDTag(struct ndn_BinaryXMLDecoder *self, unsigned int expectedTag, int *gotExpectedTag);
Jeff Thompson179d0502013-06-28 11:36:00 -070061
62/**
Jeff Thompsonb4ee4002013-06-28 13:41:43 -070063 * Decode the header from self's input starting at offset, expecting the type to be DTAG and the value to be expectedTag.
64 * Then read one item of any type (presumably BLOB, UDATA, TAG or ATTR) and return the item's value and length.
65 * However, if allowNull is 1, then the item may be absent.
66 * Finally, read the element close. Update offset.
67 * @param self pointer to the ndn_BinaryXMLDecoder struct
68 * @param expectedTag the expected value for DTAG
69 * @param allowNull 1 if the binary item may be missing
70 * @param value output a pointer to the binary data inside self's input buffer. However, if allowNull is 1 and the
71 * binary data item is absent, then return 0.
72 * @param valueLen output the length of the binary data. However, if allowNull is 1 and the
73 * binary data item is absent, then return 0.
74 * @return 0 for success, else an error string, including an error if not the expected tag, or if allowNull is 0
75 * and the binary data is absent
76 */
77char *ndn_BinaryXMLDecoder_readBinaryDTagElement
78 (struct ndn_BinaryXMLDecoder *self, unsigned int expectedTag, int allowNull, unsigned char **value, unsigned int *valueLen);
79
80/**
Jeff Thompsonf7316692013-06-26 21:31:42 -070081 * Set the offset into the input, used for the next read.
82 * @param self pointer to the ndn_BinaryXMLDecoder struct
83 * @param offset the new offset
84 */
Jeff Thompson6c9b6512013-06-27 15:59:47 -070085static inline void ndn_BinaryXMLDecoder_seek(struct ndn_BinaryXMLDecoder *self, unsigned int offset)
86{
Jeff Thompsonf7316692013-06-26 21:31:42 -070087 self->offset = offset;
88}
89
Jeff Thompson76317aa2013-06-25 19:11:48 -070090#ifdef __cplusplus
91}
92#endif
93
94#endif