You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.7 KiB
74 lines
1.7 KiB
#include "storm_file_wrapper.h" |
|
|
|
#ifdef DEVILUTIONX_STORM_FILE_WRAPPER_AVAILABLE |
|
|
|
#include "storm/storm.h" |
|
#include "utils/log.hpp" |
|
|
|
namespace devilution { |
|
extern "C" { |
|
|
|
#ifdef DEVILUTIONX_STORM_FILE_WRAPPER_IMPL_FOPENCOOKIE |
|
|
|
ssize_t SFileCookieRead(void *cookie, char *buf, size_t nbytes) |
|
{ |
|
DWORD numRead = 0; |
|
if (!SFileReadFileThreadSafe(static_cast<HANDLE>(cookie), buf, nbytes, &numRead)) { |
|
const DWORD errCode = SErrGetLastError(); |
|
if (errCode != STORM_ERROR_HANDLE_EOF) { |
|
Log("SFileRwRead error: {} ERROR CODE {}", (unsigned int)nbytes, (unsigned int)errCode); |
|
} |
|
} |
|
return numRead; |
|
} |
|
|
|
int SFileCookieSeek(void *cookie, off64_t *pos, int whence) |
|
{ |
|
int swhence; |
|
switch (whence) { |
|
case SEEK_SET: |
|
swhence = DVL_FILE_BEGIN; |
|
break; |
|
case SEEK_CUR: |
|
swhence = DVL_FILE_CURRENT; |
|
break; |
|
case SEEK_END: |
|
swhence = DVL_FILE_END; |
|
break; |
|
default: |
|
return -1; |
|
} |
|
const std::uint64_t spos = SFileSetFilePointer(static_cast<HANDLE>(cookie), *pos, swhence); |
|
if (spos == static_cast<std::uint64_t>(-1)) { |
|
Log("SFileRwSeek error: {}", (unsigned int)SErrGetLastError()); |
|
return -1; |
|
} |
|
*pos = static_cast<off64_t>(spos); |
|
return 0; |
|
} |
|
|
|
int SFileCookieClose(void *cookie) |
|
{ |
|
return SFileCloseFileThreadSafe(static_cast<HANDLE>(cookie)) ? 0 : -1; |
|
} |
|
|
|
} // extern "C" |
|
#endif |
|
|
|
FILE *FILE_FromStormHandle(HANDLE handle) |
|
{ |
|
#ifdef DEVILUTIONX_STORM_FILE_WRAPPER_IMPL_FOPENCOOKIE |
|
cookie_io_functions_t ioFns; |
|
std::memset(&ioFns, 0, sizeof(ioFns)); |
|
ioFns.read = &SFileCookieRead; |
|
ioFns.seek = &SFileCookieSeek; |
|
ioFns.close = &SFileCookieClose; |
|
return fopencookie(handle, "rb", ioFns); |
|
#else |
|
#error "unimplemented" |
|
#endif |
|
} |
|
|
|
} // namespace devilution |
|
|
|
#endif
|
|
|