blob: 8117f76d17b0cdbf4f280f75e717e5cd62f97876 [file] [log] [blame]
Nikhil Namjoshida6e5572023-03-13 10:52:53 -07001#include "bej_encoder_json.hpp"
2
3namespace libbej
4{
5
6bool stackEmpty(void* dataPtr)
7{
8 return (reinterpret_cast<std::vector<void*>*>(dataPtr))->empty();
9}
10
11void* stackPeek(void* dataPtr)
12{
13 auto stack = reinterpret_cast<std::vector<void*>*>(dataPtr);
14 if (stack->empty())
15 {
16 return nullptr;
17 }
18 return stack->back();
19}
20
21void* stackPop(void* dataPtr)
22{
23 auto stack = reinterpret_cast<std::vector<void*>*>(dataPtr);
24 if (stack->empty())
25 {
26 return nullptr;
27 }
28 void* value = stack->back();
29 stack->pop_back();
30 return value;
31}
32
33int stackPush(void* property, void* dataPtr)
34{
35 auto stack = reinterpret_cast<std::vector<void*>*>(dataPtr);
36 stack->emplace_back(property);
37 return 0;
38}
39
40int getBejEncodedBuffer(const void* data, size_t dataSize, void* handlerContext)
41{
42 auto stack = reinterpret_cast<std::vector<uint8_t>*>(handlerContext);
43 const uint8_t* dataBuf = reinterpret_cast<const uint8_t*>(data);
44 stack->insert(stack->end(), dataBuf, dataBuf + dataSize);
45 return 0;
46}
47
48std::vector<uint8_t> BejEncoderJson::getOutput()
49{
50 std::vector<uint8_t> currentEncodedPayload = std::move(encodedPayload);
51 // Re-Initialize encodedPayload with empty vector to be used again for
52 // next encoding
53 encodedPayload = {};
54
55 return currentEncodedPayload;
56}
57
58int BejEncoderJson::encode(const struct BejDictionaries* dictionaries,
59 enum BejSchemaClass schemaClass,
60 struct RedfishPropertyParent* root)
61{
62 struct BejEncoderOutputHandler output = {
63 .handlerContext = &encodedPayload,
64 .recvOutput = &getBejEncodedBuffer,
65 };
66
67 struct BejPointerStackCallback stackCallbacks = {
68 .stackContext = &stack,
69 .stackEmpty = stackEmpty,
70 .stackPeek = stackPeek,
71 .stackPop = stackPop,
72 .stackPush = stackPush,
73 .deleteStack = nullptr,
74 };
75
76 return bejEncode(dictionaries, BEJ_DICTIONARY_START_AT_HEAD, schemaClass,
77 root, &output, &stackCallbacks);
78}
79
80} // namespace libbej