/* Copyright (c) 2015 Alex Diener This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Alex Diener alex@ludobloom.com */ #ifndef __BinarySerializationContext_H__ #define __BinarySerializationContext_H__ #ifdef __cplusplus extern "C" { #endif #include "serialization/SerializationContext.h" #include "binaryserialization/BinarySerializationShared.h" #include "utilities/IOUtilities.h" typedef struct BinarySerializationContext BinarySerializationContext; #define BinarySerializationContext_superclass SerializationContext struct BinarySerializationContext_containerNode { enum BinarySerializationContainerType type; uint32_t count; size_t startOffset; size_t keyListSize; char ** keys; uint32_t * offsets; }; #define BinarySerializationContext_ivars \ SerializationContext_ivars \ \ bool bigEndian; \ struct memwriteContext memwriteContext; \ size_t containerCount; \ size_t containerListSize; \ struct BinarySerializationContext_containerNode * containerStack; \ bool finished; #define BinarySerializationContext_vtable(self_type) \ SerializationContext_vtable(self_type) stemobject_declare(BinarySerializationContext) BinarySerializationContext * BinarySerializationContext_create(bool bigEndian); bool BinarySerializationContext_init(BinarySerializationContext * self, bool bigEndian); void BinarySerializationContext_dispose(BinarySerializationContext * self); // Returned object owned by caller; free when done void * BinarySerializationContext_writeToBytes(BinarySerializationContext * self, size_t * outLength) __attribute__((nonnull (2))); bool BinarySerializationContext_writeToFile(BinarySerializationContext * self, const char * filePath); void BinarySerializationContext_beginStructure(BinarySerializationContext * self, const char * key); void BinarySerializationContext_beginDictionary(BinarySerializationContext * self, const char * key); void BinarySerializationContext_beginArray(BinarySerializationContext * self, const char * key); void BinarySerializationContext_endStructure(BinarySerializationContext * self); void BinarySerializationContext_endDictionary(BinarySerializationContext * self); void BinarySerializationContext_endArray(BinarySerializationContext * self); void BinarySerializationContext_writeBoolean(BinarySerializationContext * self, const char * key, bool value); void BinarySerializationContext_writeInt8(BinarySerializationContext * self, const char * key, int8_t value); void BinarySerializationContext_writeUInt8(BinarySerializationContext * self, const char * key, uint8_t value); void BinarySerializationContext_writeInt16(BinarySerializationContext * self, const char * key, int16_t value); void BinarySerializationContext_writeUInt16(BinarySerializationContext * self, const char * key, uint16_t value); void BinarySerializationContext_writeInt32(BinarySerializationContext * self, const char * key, int32_t value); void BinarySerializationContext_writeUInt32(BinarySerializationContext * self, const char * key, uint32_t value); void BinarySerializationContext_writeInt64(BinarySerializationContext * self, const char * key, int64_t value); void BinarySerializationContext_writeUInt64(BinarySerializationContext * self, const char * key, uint64_t value); void BinarySerializationContext_writeFloat(BinarySerializationContext * self, const char * key, float value); void BinarySerializationContext_writeDouble(BinarySerializationContext * self, const char * key, double value); void BinarySerializationContext_writeFixed16_16(BinarySerializationContext * self, const char * key, fixed16_16 value); void BinarySerializationContext_writeEnumeration(BinarySerializationContext * self, const char * key, int value, unsigned int valueCount, Serialization_enumKeyValue * values); void BinarySerializationContext_writeEnumeration8(BinarySerializationContext * self, const char * key, int8_t value, unsigned int valueCount, Serialization_enumKeyValue * values); void BinarySerializationContext_writeEnumeration16(BinarySerializationContext * self, const char * key, int16_t value, unsigned int valueCount, Serialization_enumKeyValue * values); void BinarySerializationContext_writeEnumeration32(BinarySerializationContext * self, const char * key, int32_t value, unsigned int valueCount, Serialization_enumKeyValue * values); void BinarySerializationContext_writeBitfield8(BinarySerializationContext * self, const char * key, uint8_t value, unsigned int bitNameCount, Serialization_bitName * bitNames); void BinarySerializationContext_writeBitfield16(BinarySerializationContext * self, const char * key, uint16_t value, unsigned int bitNameCount, Serialization_bitName * bitNames); void BinarySerializationContext_writeBitfield32(BinarySerializationContext * self, const char * key, uint32_t value, unsigned int bitNameCount, Serialization_bitName * bitNames); void BinarySerializationContext_writeBitfield64(BinarySerializationContext * self, const char * key, uint64_t value, unsigned int bitNameCount, Serialization_bitName * bitNames); void BinarySerializationContext_writeString(BinarySerializationContext * self, const char * key, const char * value); void BinarySerializationContext_writeStringNullable(BinarySerializationContext * self, const char * key, const char * value); void BinarySerializationContext_writeBlob(BinarySerializationContext * self, const char * key, const void * value, size_t length); #ifdef __cplusplus } #endif #endif