mirror of
https://github.com/thunderbrewhq/squall.git
synced 2026-05-03 14:23:50 +00:00
feat(file): implement stormlib sfile backend (#113)
This commit is contained in:
parent
5472065b8b
commit
b4e950a1c9
3 changed files with 88 additions and 36 deletions
|
|
@ -42,7 +42,7 @@ endif()
|
||||||
list(APPEND STORM_SOURCES "file/SFileClass.cpp")
|
list(APPEND STORM_SOURCES "file/SFileClass.cpp")
|
||||||
|
|
||||||
if(WHOA_SFILE_MODE STREQUAL "STORMLIB")
|
if(WHOA_SFILE_MODE STREQUAL "STORMLIB")
|
||||||
list(APPEND STORM_SOURCES "file/SFile.cpp")
|
list(APPEND STORM_SOURCES "file/SFile.cpp" "file/SFileStormLibShim.cpp")
|
||||||
else()
|
else()
|
||||||
list(APPEND STORM_SOURCES "file/SFileNative.cpp")
|
list(APPEND STORM_SOURCES "file/SFileNative.cpp")
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -62,6 +62,7 @@ target_include_directories(storm
|
||||||
target_link_libraries(storm
|
target_link_libraries(storm
|
||||||
PRIVATE
|
PRIVATE
|
||||||
system
|
system
|
||||||
|
stormlib-9.31
|
||||||
)
|
)
|
||||||
|
|
||||||
if(HAS_NO_INVALID_OFFSETOF)
|
if(HAS_NO_INVALID_OFFSETOF)
|
||||||
|
|
|
||||||
|
|
@ -1,58 +1,51 @@
|
||||||
#include "storm/File.hpp"
|
#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) {
|
int32_t STORMAPI SFileOpenArchive(const char* archivename, int32_t priority, uint32_t flags, HSARCHIVE* handle) {
|
||||||
(void)archivename;
|
if (!handle) {
|
||||||
(void)priority;
|
|
||||||
(void)flags;
|
|
||||||
(void)handle;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* archive = nullptr;
|
||||||
|
int32_t result = StormLib_SFileOpenArchive(archivename, static_cast<uint32_t>(priority), flags, &archive);
|
||||||
|
*handle = reinterpret_cast<HSARCHIVE>(archive);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t STORMAPI SFileCloseArchive(HSARCHIVE handle) {
|
int32_t STORMAPI SFileCloseArchive(HSARCHIVE handle) {
|
||||||
(void)handle;
|
return StormLib_SFileCloseArchive(reinterpret_cast<void*>(handle));
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t STORMAPI SFileOpenFileEx(HSARCHIVE archivehandle, const char* filename, uint32_t flags, HSFILE* handle) {
|
int32_t STORMAPI SFileOpenFileEx(HSARCHIVE archivehandle, const char* filename, uint32_t flags, HSFILE* handle) {
|
||||||
(void)archivehandle;
|
if (!handle) {
|
||||||
(void)filename;
|
|
||||||
(void)flags;
|
|
||||||
(void)handle;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* file = nullptr;
|
||||||
|
int32_t result = StormLib_SFileOpenFileEx(reinterpret_cast<void*>(archivehandle), filename, flags, &file);
|
||||||
|
*handle = reinterpret_cast<HSFILE>(file);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t STORMAPI SFileReadFile(HSFILE handle, void* buffer, uint32_t bytestoread, uint32_t* bytesread, LPOVERLAPPED overlapped) {
|
int32_t STORMAPI SFileReadFile(HSFILE handle, void* buffer, uint32_t bytestoread, uint32_t* bytesread, LPOVERLAPPED overlapped) {
|
||||||
(void)handle;
|
return StormLib_SFileReadFile(reinterpret_cast<void*>(handle), buffer, bytestoread, bytesread, reinterpret_cast<void*>(overlapped));
|
||||||
(void)buffer;
|
|
||||||
(void)bytestoread;
|
|
||||||
(void)overlapped;
|
|
||||||
if (bytesread) {
|
|
||||||
*bytesread = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t STORMAPI SFileGetFileSize(HSFILE handle, uint32_t* filesizehigh) {
|
uint32_t STORMAPI SFileGetFileSize(HSFILE handle, uint32_t* filesizehigh) {
|
||||||
(void)handle;
|
return StormLib_SFileGetFileSize(reinterpret_cast<void*>(handle), filesizehigh);
|
||||||
if (filesizehigh) {
|
|
||||||
*filesizehigh = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t STORMAPI SFileSetFilePointer(HSFILE handle, int32_t distancetomove, int32_t* distancetomovehigh, uint32_t movemethod) {
|
uint32_t STORMAPI SFileSetFilePointer(HSFILE handle, int32_t distancetomove, int32_t* distancetomovehigh, uint32_t movemethod) {
|
||||||
(void)handle;
|
return StormLib_SFileSetFilePointer(reinterpret_cast<void*>(handle), distancetomove, distancetomovehigh, movemethod);
|
||||||
(void)distancetomove;
|
|
||||||
(void)movemethod;
|
|
||||||
if (distancetomovehigh) {
|
|
||||||
*distancetomovehigh = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t STORMAPI SFileCloseFile(HSFILE handle) {
|
int32_t STORMAPI SFileCloseFile(HSFILE handle) {
|
||||||
(void)handle;
|
return StormLib_SFileCloseFile(reinterpret_cast<void*>(handle));
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
58
storm/file/SFileStormLibShim.cpp
Normal file
58
storm/file/SFileStormLibShim.cpp
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
#include "StormLib.h"
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
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<DWORD>(priority), static_cast<DWORD>(flags), &archive);
|
||||||
|
*handle = archive;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t StormLib_SFileCloseArchive(void* handle) {
|
||||||
|
return SFileCloseArchive(static_cast<HANDLE>(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<HANDLE>(archivehandle), filename, static_cast<DWORD>(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>(handle),
|
||||||
|
buffer,
|
||||||
|
static_cast<DWORD>(bytestoread),
|
||||||
|
reinterpret_cast<LPDWORD>(bytesread),
|
||||||
|
reinterpret_cast<LPOVERLAPPED>(overlapped)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t StormLib_SFileGetFileSize(void* handle, uint32_t* filesizehigh) {
|
||||||
|
return SFileGetFileSize(
|
||||||
|
static_cast<HANDLE>(handle),
|
||||||
|
reinterpret_cast<LPDWORD>(filesizehigh)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t StormLib_SFileSetFilePointer(void* handle, int32_t distancetomove, int32_t* distancetomovehigh, uint32_t movemethod) {
|
||||||
|
return SFileSetFilePointer(
|
||||||
|
static_cast<HANDLE>(handle),
|
||||||
|
static_cast<LONG>(distancetomove),
|
||||||
|
reinterpret_cast<PLONG>(distancetomovehigh),
|
||||||
|
static_cast<DWORD>(movemethod)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t StormLib_SFileCloseFile(void* handle) {
|
||||||
|
return SFileCloseFile(static_cast<HANDLE>(handle));
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue