diff --git a/storm/CMakeLists.txt b/storm/CMakeLists.txt index e563ed9..63d58e6 100644 --- a/storm/CMakeLists.txt +++ b/storm/CMakeLists.txt @@ -42,7 +42,7 @@ endif() list(APPEND STORM_SOURCES "file/SFileClass.cpp") if(WHOA_SFILE_MODE STREQUAL "STORMLIB") - list(APPEND STORM_SOURCES "file/SFile.cpp") + list(APPEND STORM_SOURCES "file/SFile.cpp" "file/SFileStormLibShim.cpp") else() list(APPEND STORM_SOURCES "file/SFileNative.cpp") endif() @@ -62,6 +62,7 @@ target_include_directories(storm target_link_libraries(storm PRIVATE system + stormlib-9.31 ) if(HAS_NO_INVALID_OFFSETOF) diff --git a/storm/file/SFile.cpp b/storm/file/SFile.cpp index 3b26693..32f06fb 100644 --- a/storm/file/SFile.cpp +++ b/storm/file/SFile.cpp @@ -1,58 +1,51 @@ #include "storm/File.hpp" -// TODO: implement StormLib-backed SFile functions. +int32_t StormLib_SFileOpenArchive(const char* archivename, uint32_t priority, uint32_t flags, void** handle); +int32_t StormLib_SFileCloseArchive(void* handle); +int32_t StormLib_SFileOpenFileEx(void* archivehandle, const char* filename, uint32_t flags, void** handle); +int32_t StormLib_SFileReadFile(void* handle, void* buffer, uint32_t bytestoread, uint32_t* bytesread, void* overlapped); +uint32_t StormLib_SFileGetFileSize(void* handle, uint32_t* filesizehigh); +uint32_t StormLib_SFileSetFilePointer(void* handle, int32_t distancetomove, int32_t* distancetomovehigh, uint32_t movemethod); +int32_t StormLib_SFileCloseFile(void* handle); int32_t STORMAPI SFileOpenArchive(const char* archivename, int32_t priority, uint32_t flags, HSARCHIVE* handle) { - (void)archivename; - (void)priority; - (void)flags; - (void)handle; - return 0; + if (!handle) { + return 0; + } + + void* archive = nullptr; + int32_t result = StormLib_SFileOpenArchive(archivename, static_cast(priority), flags, &archive); + *handle = reinterpret_cast(archive); + return result; } int32_t STORMAPI SFileCloseArchive(HSARCHIVE handle) { - (void)handle; - return 0; + return StormLib_SFileCloseArchive(reinterpret_cast(handle)); } int32_t STORMAPI SFileOpenFileEx(HSARCHIVE archivehandle, const char* filename, uint32_t flags, HSFILE* handle) { - (void)archivehandle; - (void)filename; - (void)flags; - (void)handle; - return 0; + if (!handle) { + return 0; + } + + void* file = nullptr; + int32_t result = StormLib_SFileOpenFileEx(reinterpret_cast(archivehandle), filename, flags, &file); + *handle = reinterpret_cast(file); + return result; } int32_t STORMAPI SFileReadFile(HSFILE handle, void* buffer, uint32_t bytestoread, uint32_t* bytesread, LPOVERLAPPED overlapped) { - (void)handle; - (void)buffer; - (void)bytestoread; - (void)overlapped; - if (bytesread) { - *bytesread = 0; - } - return 0; + return StormLib_SFileReadFile(reinterpret_cast(handle), buffer, bytestoread, bytesread, reinterpret_cast(overlapped)); } uint32_t STORMAPI SFileGetFileSize(HSFILE handle, uint32_t* filesizehigh) { - (void)handle; - if (filesizehigh) { - *filesizehigh = 0; - } - return 0; + return StormLib_SFileGetFileSize(reinterpret_cast(handle), filesizehigh); } uint32_t STORMAPI SFileSetFilePointer(HSFILE handle, int32_t distancetomove, int32_t* distancetomovehigh, uint32_t movemethod) { - (void)handle; - (void)distancetomove; - (void)movemethod; - if (distancetomovehigh) { - *distancetomovehigh = 0; - } - return 0; + return StormLib_SFileSetFilePointer(reinterpret_cast(handle), distancetomove, distancetomovehigh, movemethod); } int32_t STORMAPI SFileCloseFile(HSFILE handle) { - (void)handle; - return 0; + return StormLib_SFileCloseFile(reinterpret_cast(handle)); } diff --git a/storm/file/SFileStormLibShim.cpp b/storm/file/SFileStormLibShim.cpp new file mode 100644 index 0000000..5f924f2 --- /dev/null +++ b/storm/file/SFileStormLibShim.cpp @@ -0,0 +1,58 @@ +#include "StormLib.h" +#include + +int32_t StormLib_SFileOpenArchive(const char* archivename, uint32_t priority, uint32_t flags, void** handle) { + if (!handle) { + return 0; + } + + HANDLE archive = nullptr; + bool result = SFileOpenArchive(archivename, static_cast(priority), static_cast(flags), &archive); + *handle = archive; + return result; +} + +int32_t StormLib_SFileCloseArchive(void* handle) { + return SFileCloseArchive(static_cast(handle)); +} + +int32_t StormLib_SFileOpenFileEx(void* archivehandle, const char* filename, uint32_t flags, void** handle) { + if (!handle) { + return 0; + } + + HANDLE file = nullptr; + bool result = SFileOpenFileEx(static_cast(archivehandle), filename, static_cast(flags), &file); + *handle = file; + return result; +} + +int32_t StormLib_SFileReadFile(void* handle, void* buffer, uint32_t bytestoread, uint32_t* bytesread, void* overlapped) { + return SFileReadFile( + static_cast(handle), + buffer, + static_cast(bytestoread), + reinterpret_cast(bytesread), + reinterpret_cast(overlapped) + ); +} + +uint32_t StormLib_SFileGetFileSize(void* handle, uint32_t* filesizehigh) { + return SFileGetFileSize( + static_cast(handle), + reinterpret_cast(filesizehigh) + ); +} + +uint32_t StormLib_SFileSetFilePointer(void* handle, int32_t distancetomove, int32_t* distancetomovehigh, uint32_t movemethod) { + return SFileSetFilePointer( + static_cast(handle), + static_cast(distancetomove), + reinterpret_cast(distancetomovehigh), + static_cast(movemethod) + ); +} + +int32_t StormLib_SFileCloseFile(void* handle) { + return SFileCloseFile(static_cast(handle)); +}