1 #include "bej_encoder_json.hpp" 2 3 namespace libbej 4 { 5 6 bool stackEmpty(void* dataPtr) 7 { 8 return (reinterpret_cast<std::vector<void*>*>(dataPtr))->empty(); 9 } 10 11 void* 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 21 void* 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 33 int 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 40 int 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 48 std::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 58 int 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 81