blob: 2c7f0667cdfe8a7f357ad0dada59fbb1caa12dff [file] [log] [blame]
#pragma once
#include "rde_common.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C"
{
#endif
/**
* @brief Indicates whether a new BEJ section falls inside a BEJ array or a
* BEJ set or none of those.
*/
enum BejSectionType
{
bejSectionNoType,
bejSectionSet,
bejSectionArray,
};
/**
* @brief These stack entries are needed to implement the decoding
* non-recursively.
*/
struct BejStackProperty
{
// Indicates whether we are inside an array or a set or an annotation.
enum BejSectionType sectionType;
// Indicate whether we have property names for properties.
bool addPropertyName;
// Offset to the parent property in schema dictionary.
uint16_t mainDictPropOffset;
// Offset to the parent property in annotation dictionary.
uint16_t annoDictPropOffset;
// Offset to the end of the array or set or annotation.
uint32_t streamEndOffset;
};
struct BejDictionaries
{
const uint8_t* schemaDictionary;
const uint8_t* annotationDictionary;
const uint8_t* errorDictionary;
};
/**
* @brief Holds the information related to the current bejTuple being
* decoded.
*/
struct BejDecoderStates
{
bool addPropertyName;
uint16_t mainDictPropOffset;
uint16_t annoDictPropOffset;
uint32_t encodedStreamOffset;
const uint8_t* encodedSubStream;
};
/**
* @brief Callbacks for decoded data.
*
* dataPtr in the callback functions can be used for extra arguments.
*/
struct BejDecodedCallback
{
/**
* @brief Calls when a Set is detected.
*/
int (*callbackSetStart)(const char* propertyName, void* dataPtr);
/**
* @brief Calls when an end of a Set is found.
*/
int (*callbackSetEnd)(void* dataPtr);
/**
* @brief Calls when an array is detected.
*/
int (*callbackArrayStart)(const char* propertyName, void* dataPtr);
/**
* @brief Calls when an end of an array is found.
*/
int (*callbackArrayEnd)(void* dataPtr);
/**
* @brief Calls after a property is finished unless this is the last
* property in a Set or an array. In that case appropriate
* callbackSetEnd or callbackArrayEnd will be called.
*/
int (*callbackPropertyEnd)(void* dataPtr);
/**
* @brief Calls when a Null property is found or the property length is
* 0.
*/
int (*callbackNull)(const char* propertyName, void* dataPtr);
/**
* @brief Calls when an Integer property is found.
*/
int (*callbackInteger)(const char* propertyName, uint64_t value,
void* dataPtr);
/**
* @brief Calls when an Enum property is found.
*/
int (*callbackEnum)(const char* propertyName, const char* value,
void* dataPtr);
/**
* @brief Calls when a String property is found.
*/
int (*callbackString)(const char* propertyName, const char* value,
void* dataPtr);
/**
* @brief Calls when a Real value property is found.
*/
int (*callbackReal)(const char* propertyName,
const struct BejReal* value, void* dataPtr);
/**
* @brief Calls when a Bool property is found.
*/
int (*callbackBool)(const char* propertyName, bool value,
void* dataPtr);
/**
* @brief Calls when an Annotated property is found.
*/
int (*callbackAnnotation)(const char* propertyName, void* dataPtr);
/**
* @brief Calls when a read only property is found.
*/
int (*callbackReadonlyProperty)(uint32_t sequenceNumber, void* dataPtr);
};
/**
* @brief Stack for holding BejStackProperty types. Decoder core is not
* responsible for creating or deleting stack memory. User of the decoder
* core is responsible for creating and deleting stack memory.
*
* dataPtr in the callback functions can be used for extra arguments.
*/
struct BejStackCallback
{
/**
* @brief Return true if the stack is empty.
*/
bool (*stackEmpty)(void* dataPtr);
/**
* @brief View the object at the top of the stack. If the stack is
* empty, this will return NULL.
*/
const struct BejStackProperty* (*stackPeek)(void* dataPtr);
/**
* @brief Removes the top most object from the stack. Client of the
* decoder core is responsible for destroying the memory for the removed
* object.
*/
void (*stackPop)(void* dataPtr);
/**
* @brief Push an object into the stack. Returns 0 if the operation is
* successfull. Client of the decoder core is responsible for allocating
* memory for the new object.
*/
int (*stackPush)(const struct BejStackProperty* const property,
void* dataPtr);
};
/**
* @brief Used to pass parameters to BEJ decoding local functions.
*/
struct BejHandleTypeFuncParam
{
struct BejDecoderStates state;
struct BejSFLV sflv;
const uint8_t* mainDictionary;
const uint8_t* annotDictionary;
const struct BejDecodedCallback* decodedCallback;
const struct BejStackCallback* stackCallback;
void* callbacksDataPtr;
void* stackDataPtr;
};
/**
* @brief Decodes a PLDM block. Maximum encoded stream size the decoder
* supports is 32bits.
*
* @param[in] dictionaries - dictionaries needed for decoding.
* @param[in] encodedPldmBlock - encoded PLDM block.
* @param[in] blockLength - length of the PLDM block.
* @param[in] stackCallback - callbacks for stack handlers. callbacks in
* stackCallback struct should be set to valid functions.
* @param[in] decodedCallback - callbacks for extracting decoded
* properties. callbacks in decodedCallback struct should be set to
* NULL or valid functions.
* @param[in] callbacksDataPtr - data pointer to pass to decoded callbacks.
* This can be used pass additional data.
* @param[in] stackDataPtr - data pointer to pass to stack callbacks. This
* can be used pass additional data.
*
* @return 0 if successful.
*/
int bejDecodePldmBlock(const struct BejDictionaries* dictionaries,
const uint8_t* encodedPldmBlock,
uint32_t blockLength,
const struct BejStackCallback* stackCallback,
const struct BejDecodedCallback* decodedCallback,
void* callbacksDataPtr, void* stackDataPtr);
#ifdef __cplusplus
}
#endif