diff options
Diffstat (limited to 'source/libs/asura-lib-utils/filesystem')
4 files changed, 141 insertions, 47 deletions
diff --git a/source/libs/asura-lib-utils/filesystem/binding/data_buffer.binding.cpp b/source/libs/asura-lib-utils/filesystem/binding/data_buffer.binding.cpp index a9113a7..8e92eee 100644 --- a/source/libs/asura-lib-utils/filesystem/binding/data_buffer.binding.cpp +++ b/source/libs/asura-lib-utils/filesystem/binding/data_buffer.binding.cpp @@ -9,59 +9,101 @@ namespace AsuraEngine LUAX_REGISTRY(DataBuffer) { - luaL_Reg f[] = { + LUAX_REGISTER_METHODS(state, { "New", _New }, - { "SetContent", _SetContent }, - { "GetContent", _GetContent }, - { "GetContentLength", _GetContentLength }, - {0, 0} - }; - - state.RegisterMethods(f); + { "GetBuffer", _GetBuffer }, + { "GetSize", _GetSize }, + { "Load", _Load }, + { "Clear", _Clear } + ); } LUAX_POSTPROCESS(DataBuffer) { - } + // databuffer = DataBuffer.New(lstring) + // databuffer = DataBuffer.New(size) LUAX_IMPL_METHOD(DataBuffer, _New) { + LUAX_STATE(L); + if (state.IsType(1, LUA_TSTRING)) + { + byte* bytes; + size_t size; + lua_tolstring(L, 1, &size); + DataBuffer* buffer = new DataBuffer(bytes, size); + buffer->PushLuaxUserdata(state); + return 1; + } + else if (state.IsType(1, LUA_TNUMBER)) + { + size_t size = lua_tonumber(L, 1); + DataBuffer* buffer = new DataBuffer(size); + buffer->PushLuaxUserdata(state); + } + else + { + return state.ErrorType(1, "number or string"); + } } - // SetContent(dataBuffer, lString) - LUAX_IMPL_METHOD(DataBuffer, _SetContent) + // lsting, len = databuffer:GetBuffer() + LUAX_IMPL_METHOD(DataBuffer, _GetBuffer) { - LUAX_SETUP(L, "US"); - // params: - // 1: data buffer - // 2: lstring + LUAX_SETUP(L, "U"); - DataBuffer* self = state.GetLuaUserdata<DataBuffer>(1); - size_t size = 0; - const char* str = lua_tolstring(L, 2, &size); - void* data = new char[size]; - memcpy(data, str, size); - self->SetContent(data, size); - return 0; + DataBuffer* self = state.GetUserdata<DataBuffer>(1); + lua_pushlstring(L, self->GetBuffer(), self->GetSize()); + return 2; } - LUAX_IMPL_METHOD(DataBuffer, _GetContent) + // length = databuffer:GetSize() + LUAX_IMPL_METHOD(DataBuffer, _GetSize) { LUAX_SETUP(L, "U"); - DataBuffer* self = state.GetLuaUserdata<DataBuffer>(1); - lua_pushlstring(L, (const char*)self->data, self->size); + DataBuffer* self = state.GetUserdata<DataBuffer>(1); + lua_pushinteger(L, self->GetSize()); return 1; } - LUAX_IMPL_METHOD(DataBuffer, _GetContentLength) + // databuffer:Load(lstring) + // databuffer:Load(src) + LUAX_IMPL_METHOD(DataBuffer, _Load) + { + LUAX_STATE(L); + + DataBuffer* buffer = state.GetUserdata<DataBuffer>(1); + const byte* data; + size_t size; + if (state.IsType(2, LUA_TSTRING)) + { + data = lua_tolstring(L, 2, &size); + buffer->Load(data, size); + return 0; + } + else if(state.IsType(2, LUA_TUSERDATA)) + { + DataBuffer* src = state.CheckUserdata<DataBuffer>(2); + buffer->Load(*src); + return 0; + } + else + { + return state.ErrorType(1, "lstring or DataBuffer"); + } + } + + // databuffer:Clear() + LUAX_IMPL_METHOD(DataBuffer, _Clear) { LUAX_SETUP(L, "U"); - DataBuffer* self = state.GetLuaUserdata<DataBuffer>(1); - lua_pushinteger(L, self->size); - return 1; + + DataBuffer* self = state.GetUserdata<DataBuffer>(1); + self->Clear(); + return 0; } } diff --git a/source/libs/asura-lib-utils/filesystem/data_buffer.cpp b/source/libs/asura-lib-utils/filesystem/data_buffer.cpp index 629dc92..32a123f 100644 --- a/source/libs/asura-lib-utils/filesystem/data_buffer.cpp +++ b/source/libs/asura-lib-utils/filesystem/data_buffer.cpp @@ -1,3 +1,5 @@ +#include <cstdlib> +#include <cstring> #include "data_buffer.h" namespace AsuraEngine @@ -5,24 +7,60 @@ namespace AsuraEngine namespace Filesystem { + DataBuffer::DataBuffer(DataBuffer& src) + { + Load(src); + } + + DataBuffer::DataBuffer(std::size_t size) + : mSize(size) + , mBytes(nullptr) + { + mBytes = new byte[size]; + memset(mBytes, 0, size); + } + DataBuffer::DataBuffer(const void* data, std::size_t size) + : mSize(size) + , mBytes(nullptr) { - this->data = (const byte*)data; - this->size = size; + Load(data, size); } DataBuffer::~DataBuffer() { - delete[] data; + delete[] mBytes; } - void DataBuffer::SetContent(const void* data, std::size_t siez) + void DataBuffer::Load(DataBuffer& db) { - if (this->data != nullptr) - delete[] this->data; + Load(db.GetBuffer(), db.GetSize()); + } - this->data = (const byte*)data; - this->size = size; + void DataBuffer::Load(const void* data, std::size_t size) + { + if (!mBytes || mSize != size) + { + delete[] mBytes; + mBytes = new byte[size]; + } + memcpy(mBytes, data, size); + } + + byte* DataBuffer::GetBuffer() + { + return mBytes; + } + + void DataBuffer::Clear() + { + if (mBytes) + memset(mBytes, 0, mSize); + } + + std::size_t DataBuffer::GetSize() + { + return mSize; } } diff --git a/source/libs/asura-lib-utils/filesystem/data_buffer.h b/source/libs/asura-lib-utils/filesystem/data_buffer.h index 4b013ed..5c80efb 100644 --- a/source/libs/asura-lib-utils/filesystem/data_buffer.h +++ b/source/libs/asura-lib-utils/filesystem/data_buffer.h @@ -3,7 +3,6 @@ #include <cstdlib> -#include "../scripting/Luax.hpp" #include "../scripting/portable.hpp" namespace AsuraEngine @@ -19,23 +18,34 @@ namespace AsuraEngine { public: - DataBuffer(const void* data, std::size_t size); - + DataBuffer(DataBuffer& src); + DataBuffer(std::size_t size); + DataBuffer(const void* bytes, std::size_t size); ~DataBuffer(); - void SetContent(const void* data, std::size_t siez); + byte* GetBuffer(); + size_t GetSize(); + + void Load(DataBuffer& db); + void Load(const void* bytes, std::size_t size); + void Clear(); - const byte* data; - size_t size; + private: - //---------------------------------------------------------------------------------------------------------- + byte* mBytes; + size_t mSize; + + //------------------------------------------------------------------------------------------------------------ + + public: LUAX_DECL_FACTORY(DataBuffer); LUAX_DECL_METHOD(_New); - LUAX_DECL_METHOD(_SetContent); - LUAX_DECL_METHOD(_GetContent); - LUAX_DECL_METHOD(_GetContentLength); + LUAX_DECL_METHOD(_GetBuffer); + LUAX_DECL_METHOD(_GetSize); + LUAX_DECL_METHOD(_Load); + LUAX_DECL_METHOD(_Clear); }; diff --git a/source/libs/asura-lib-utils/filesystem/resource_manager.h b/source/libs/asura-lib-utils/filesystem/resource_manager.h index c5d8f06..36d46cf 100644 --- a/source/libs/asura-lib-utils/filesystem/resource_manager.h +++ b/source/libs/asura-lib-utils/filesystem/resource_manager.h @@ -36,6 +36,10 @@ namespace AsuraEngine /// void SaveFile(const std::string& path, const DataBuffer* buffer); + //---------------------------------------------------------------------------------------------------------- + + LUAX_DECL_SINGLETON(ResourceManager); + }; } |