blob: a0c468629575461f144f45411b5d34554f204c8c [file] [log] [blame]
kasunath64cb1972022-05-13 12:54:23 -07001#pragma once
2
3#include "rde_common.h"
4
5#include <stdbool.h>
6#include <stddef.h>
7#include <stdint.h>
8
9#ifdef __cplusplus
10extern "C"
11{
12#endif
13
14 /**
15 * @brief Indicates whether a new BEJ section falls inside a BEJ array or a
16 * BEJ set or none of those.
17 */
18 enum BejSectionType
19 {
20 bejSectionNoType,
21 bejSectionSet,
22 bejSectionArray,
23 };
24
25 /**
26 * @brief These stack entries are needed to implement the decoding
27 * non-recursively.
28 */
29 struct BejStackProperty
30 {
31 // Indicates whether we are inside an array or a set or an annotation.
32 enum BejSectionType sectionType;
33 // Indicate whether we have property names for properties.
34 bool addPropertyName;
35 // Offset to the parent property in schema dictionary.
36 uint16_t mainDictPropOffset;
37 // Offset to the parent property in annotation dictionary.
38 uint16_t annoDictPropOffset;
39 // Offset to the end of the array or set or annotation.
40 uint32_t streamEndOffset;
41 };
42
43 struct BejDictionaries
44 {
45 const uint8_t* schemaDictionary;
46 const uint8_t* annotationDictionary;
47 const uint8_t* errorDictionary;
48 };
49
50 /**
51 * @brief Holds the information related to the current bejTuple being
52 * decoded.
53 */
54 struct BejDecoderStates
55 {
56 bool addPropertyName;
57 uint16_t mainDictPropOffset;
58 uint16_t annoDictPropOffset;
59 uint32_t encodedStreamOffset;
60 const uint8_t* encodedSubStream;
61 };
62
63 /**
64 * @brief Callbacks for decoded data.
65 *
66 * dataPtr in the callback functions can be used for extra arguments.
67 */
68 struct BejDecodedCallback
69 {
70 /**
71 * @brief Calls when a Set is detected.
72 */
73 int (*callbackSetStart)(const char* propertyName, void* dataPtr);
74
75 /**
76 * @brief Calls when an end of a Set is found.
77 */
78 int (*callbackSetEnd)(void* dataPtr);
79
80 /**
81 * @brief Calls when an array is detected.
82 */
83 int (*callbackArrayStart)(const char* propertyName, void* dataPtr);
84
85 /**
86 * @brief Calls when an end of an array is found.
87 */
88 int (*callbackArrayEnd)(void* dataPtr);
89
90 /**
91 * @brief Calls after a property is finished unless this is the last
92 * property in a Set or an array. In that case appropriate
93 * callbackSetEnd or callbackArrayEnd will be called.
94 */
95 int (*callbackPropertyEnd)(void* dataPtr);
96
97 /**
98 * @brief Calls when a Null property is found or the property length is
99 * 0.
100 */
101 int (*callbackNull)(const char* propertyName, void* dataPtr);
102
103 /**
104 * @brief Calls when an Integer property is found.
105 */
kasunath34a096d2022-05-17 11:36:14 -0700106 int (*callbackInteger)(const char* propertyName, int64_t value,
kasunath64cb1972022-05-13 12:54:23 -0700107 void* dataPtr);
108
109 /**
110 * @brief Calls when an Enum property is found.
111 */
112 int (*callbackEnum)(const char* propertyName, const char* value,
113 void* dataPtr);
114
115 /**
116 * @brief Calls when a String property is found.
117 */
118 int (*callbackString)(const char* propertyName, const char* value,
119 void* dataPtr);
120
121 /**
122 * @brief Calls when a Real value property is found.
123 */
124 int (*callbackReal)(const char* propertyName,
125 const struct BejReal* value, void* dataPtr);
126
127 /**
128 * @brief Calls when a Bool property is found.
129 */
130 int (*callbackBool)(const char* propertyName, bool value,
131 void* dataPtr);
132
133 /**
134 * @brief Calls when an Annotated property is found.
135 */
136 int (*callbackAnnotation)(const char* propertyName, void* dataPtr);
137
138 /**
139 * @brief Calls when a read only property is found.
140 */
141 int (*callbackReadonlyProperty)(uint32_t sequenceNumber, void* dataPtr);
142 };
143
144 /**
145 * @brief Stack for holding BejStackProperty types. Decoder core is not
146 * responsible for creating or deleting stack memory. User of the decoder
147 * core is responsible for creating and deleting stack memory.
148 *
149 * dataPtr in the callback functions can be used for extra arguments.
150 */
151 struct BejStackCallback
152 {
153 /**
154 * @brief Return true if the stack is empty.
155 */
156 bool (*stackEmpty)(void* dataPtr);
157
158 /**
159 * @brief View the object at the top of the stack. If the stack is
160 * empty, this will return NULL.
161 */
162 const struct BejStackProperty* (*stackPeek)(void* dataPtr);
163
164 /**
165 * @brief Removes the top most object from the stack. Client of the
166 * decoder core is responsible for destroying the memory for the removed
167 * object.
168 */
169 void (*stackPop)(void* dataPtr);
170
171 /**
172 * @brief Push an object into the stack. Returns 0 if the operation is
173 * successfull. Client of the decoder core is responsible for allocating
174 * memory for the new object.
175 */
176 int (*stackPush)(const struct BejStackProperty* const property,
177 void* dataPtr);
178 };
179
180 /**
181 * @brief Used to pass parameters to BEJ decoding local functions.
182 */
183 struct BejHandleTypeFuncParam
184 {
185 struct BejDecoderStates state;
186 struct BejSFLV sflv;
187 const uint8_t* mainDictionary;
188 const uint8_t* annotDictionary;
189 const struct BejDecodedCallback* decodedCallback;
190 const struct BejStackCallback* stackCallback;
191 void* callbacksDataPtr;
192 void* stackDataPtr;
193 };
194
195 /**
196 * @brief Decodes a PLDM block. Maximum encoded stream size the decoder
197 * supports is 32bits.
198 *
199 * @param[in] dictionaries - dictionaries needed for decoding.
200 * @param[in] encodedPldmBlock - encoded PLDM block.
201 * @param[in] blockLength - length of the PLDM block.
202 * @param[in] stackCallback - callbacks for stack handlers. callbacks in
203 * stackCallback struct should be set to valid functions.
204 * @param[in] decodedCallback - callbacks for extracting decoded
205 * properties. callbacks in decodedCallback struct should be set to
206 * NULL or valid functions.
207 * @param[in] callbacksDataPtr - data pointer to pass to decoded callbacks.
208 * This can be used pass additional data.
209 * @param[in] stackDataPtr - data pointer to pass to stack callbacks. This
210 * can be used pass additional data.
211 *
212 * @return 0 if successful.
213 */
214 int bejDecodePldmBlock(const struct BejDictionaries* dictionaries,
215 const uint8_t* encodedPldmBlock,
216 uint32_t blockLength,
217 const struct BejStackCallback* stackCallback,
218 const struct BejDecodedCallback* decodedCallback,
219 void* callbacksDataPtr, void* stackDataPtr);
220
221#ifdef __cplusplus
222}
223#endif