#include "HGBuffer.h" #include "HGInc.h" struct HGBufferImpl { HGBufferImpl() { m_data = NULL; m_size = 0; m_alloc = HGFALSE; } ~HGBufferImpl() { if (m_alloc) { free(m_data); m_data = NULL; } } HGByte* m_data; HGUSize m_size; HGBool m_alloc; }; HGResult HGAPI HGBase_CreateBuffer(HGUSize size, HGBuffer* buffer) { if (0 == size || NULL == buffer) { return HGBASE_ERR_INVALIDARG; } HGByte* data = (HGByte*)malloc(size); if (NULL == data) { return HGBASE_ERR_OUTOFMEMORY; } HGBufferImpl* bufferImpl = new HGBufferImpl; bufferImpl->m_data = data; bufferImpl->m_size = size; bufferImpl->m_alloc = HGTRUE; *buffer = (HGBuffer)bufferImpl; return HGBASE_ERR_OK; } HGResult HGAPI HGBase_CreateBufferFromData(const HGByte* data, HGUSize size, HGBuffer* buffer) { if (NULL == data || 0 == size || NULL == buffer) { return HGBASE_ERR_INVALIDARG; } HGByte* data2 = (HGByte*)malloc(size); if (NULL == data2) { return HGBASE_ERR_OUTOFMEMORY; } memcpy(data2, data, size); HGBufferImpl* bufferImpl = new HGBufferImpl; bufferImpl->m_data = data2; bufferImpl->m_size = size; bufferImpl->m_alloc = HGTRUE; *buffer = (HGBuffer)bufferImpl; return HGBASE_ERR_OK; } HGResult HGAPI HGBase_CreateBufferWithData(HGByte* data, HGUSize size, HGBuffer* buffer) { if (NULL == data || 0 == size || NULL == buffer) { return HGBASE_ERR_INVALIDARG; } HGBufferImpl* bufferImpl = new HGBufferImpl; bufferImpl->m_data = data; bufferImpl->m_size = size; bufferImpl->m_alloc = HGFALSE; *buffer = (HGBuffer)bufferImpl; return HGBASE_ERR_OK; } HGResult HGAPI HGBase_CloneBuffer(HGBuffer srcBuffer, HGBuffer* buffer) { if (NULL == srcBuffer || NULL == buffer) { return HGBASE_ERR_INVALIDARG; } HGBufferImpl* srcBufferImpl = (HGBufferImpl*)srcBuffer; HGByte* data = (HGByte*)malloc(srcBufferImpl->m_size); if (NULL == data) { return HGBASE_ERR_OUTOFMEMORY; } memcpy(data, srcBufferImpl->m_data, srcBufferImpl->m_size); HGBufferImpl* bufferImpl = new HGBufferImpl; bufferImpl->m_data = data; bufferImpl->m_size = srcBufferImpl->m_size; bufferImpl->m_alloc = HGTRUE; *buffer = (HGBuffer)bufferImpl; return HGBASE_ERR_OK; } HGResult HGAPI HGBase_DestroyBuffer(HGBuffer buffer) { if (NULL == buffer) { return HGBASE_ERR_INVALIDARG; } HGBufferImpl* bufferImpl = (HGBufferImpl*)buffer; delete bufferImpl; return HGBASE_ERR_OK; } HGResult HGAPI HGBase_GetBufferData(HGBuffer buffer, HGByte** data) { if (NULL == buffer || NULL == data) { return HGBASE_ERR_INVALIDARG; } HGBufferImpl* bufferImpl = (HGBufferImpl*)buffer; *data = bufferImpl->m_data; return HGBASE_ERR_OK; } HGResult HGAPI HGBase_GetBufferSize(HGBuffer buffer, HGUSize* size) { if (NULL == buffer || NULL == size) { return HGBASE_ERR_INVALIDARG; } HGBufferImpl* bufferImpl = (HGBufferImpl*)buffer; *size = bufferImpl->m_size; return HGBASE_ERR_OK; }