diff --git a/Source/init.cpp b/Source/init.cpp index 4d77be1aa..e18dbeabc 100644 --- a/Source/init.cpp +++ b/Source/init.cpp @@ -12,11 +12,10 @@ #include "dx.h" #include "pfile.h" #include "storm/storm.h" -#include "utils/file_util.h" +#include "utils/language.h" +#include "utils/log.hpp" #include "utils/paths.h" #include "utils/ui_fwd.h" -#include "utils/log.hpp" -#include "utils/language.h" #ifdef __vita__ // increase default allowed heap size on Vita @@ -60,7 +59,7 @@ HANDLE init_test_access(const std::vector &paths, const char *mpq_n std::string mpq_abspath; for (const auto &path : paths) { mpq_abspath = path + mpq_name; - if (SFileOpenArchiveDiablo(mpq_abspath.c_str(), 0, MPQ_OPEN_READ_ONLY, &archive)) { + if (SFileOpenArchive(mpq_abspath.c_str(), 0, MPQ_OPEN_READ_ONLY, &archive)) { LogVerbose(" Found: {} in {}", mpq_name, path); SFileSetBasePath(path.c_str()); return archive; diff --git a/Source/pfile.cpp b/Source/pfile.cpp index fde2cd707..e6d6e87af 100644 --- a/Source/pfile.cpp +++ b/Source/pfile.cpp @@ -15,8 +15,8 @@ #include "pack.h" #include "storm/storm.h" #include "utils/file_util.h" -#include "utils/paths.h" #include "utils/language.h" +#include "utils/paths.h" namespace devilution { @@ -195,7 +195,7 @@ static HANDLE pfile_open_save_archive(DWORD save_num) { HANDLE archive; - if (SFileOpenArchiveDiablo(GetSavePath(save_num).c_str(), 0, 0, &archive)) + if (SFileOpenArchive(GetSavePath(save_num).c_str(), 0, 0, &archive)) return archive; return nullptr; } diff --git a/Source/storm/storm.cpp b/Source/storm/storm.cpp index 4406c42e7..001b4057c 100644 --- a/Source/storm/storm.cpp +++ b/Source/storm/storm.cpp @@ -10,10 +10,11 @@ #include "DiabloUI/diabloui.h" #include "options.h" -#include "utils/paths.h" -#include "utils/stubs.h" +#include "utils/file_util.h" #include "utils/log.hpp" +#include "utils/paths.h" #include "utils/sdl_mutex.h" +#include "utils/stubs.h" // Include Windows headers for Get/SetLastError. #if defined(_WIN32) @@ -260,4 +261,17 @@ bool SFileEnableDirectAccess(bool enable) directFileAccess = enable; return true; } + +#if defined(_WIN64) || defined(_WIN32) +bool SFileOpenArchive(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq) +{ + const auto szMpqNameUtf16 = ToWideChar(szMpqName); + if (szMpqNameUtf16 == nullptr) { + LogError("UTF-8 -> UTF-16 conversion error code {}", ::GetLastError()); + return false; + } + return SFileOpenArchive(szMpqNameUtf16.get(), dwPriority, dwFlags, phMpq); +} +#endif + } // namespace devilution diff --git a/Source/storm/storm.h b/Source/storm/storm.h index a397b4160..efc974543 100644 --- a/Source/storm/storm.h +++ b/Source/storm/storm.h @@ -324,6 +324,10 @@ bool SFileEnableDirectAccess(bool enable); } // Additions to Storm API: +#if defined(_WIN64) || defined(_WIN32) +// On Windows, handles wchar conversion and calls the wchar version of SFileOpenArchive. +bool SFileOpenArchive(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq); +#endif // Locks ReadFile and CloseFile under a mutex. // See https://github.com/ladislav-zezula/StormLib/issues/175 diff --git a/Source/utils/file_util.cpp b/Source/utils/file_util.cpp index 7151651c8..8b0d4772d 100644 --- a/Source/utils/file_util.cpp +++ b/Source/utils/file_util.cpp @@ -1,12 +1,11 @@ #include "utils/file_util.h" -#include "utils/log.hpp" #include #include #include -#include "utils/stdcompat/string_view.hpp" +#include "utils/log.hpp" #ifdef USE_SDL1 #include "utils/sdl2_to_1_2_backports.h" @@ -31,12 +30,8 @@ #include #endif -#include "storm/storm.h" - namespace devilution { -namespace { - #if defined(_WIN64) || defined(_WIN32) std::unique_ptr ToWideChar(string_view path) { @@ -52,8 +47,6 @@ std::unique_ptr ToWideChar(string_view path) } #endif -} // namespace - bool FileExists(const char *path) { #if defined(_WIN64) || defined(_WIN32) @@ -172,18 +165,4 @@ std::unique_ptr CreateFileStream(const char *path, std::ios::openm #endif } -bool SFileOpenArchiveDiablo(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq) -{ -#if defined(_WIN64) || defined(_WIN32) - const auto szMpqNameUtf16 = ToWideChar(szMpqName); - if (szMpqNameUtf16 == nullptr) { - LogError("UTF-8 -> UTF-16 conversion error code {}", ::GetLastError()); - return false; - } - return SFileOpenArchive(szMpqNameUtf16.get(), dwPriority, dwFlags, phMpq); -#else - return SFileOpenArchive(szMpqName, dwPriority, dwFlags, phMpq); -#endif -} - } // namespace devilution diff --git a/Source/utils/file_util.h b/Source/utils/file_util.h index 80f8a9438..7d339e42a 100644 --- a/Source/utils/file_util.h +++ b/Source/utils/file_util.h @@ -4,7 +4,7 @@ #include #include -#include "miniwin/miniwin.h" +#include "utils/stdcompat/string_view.hpp" namespace devilution { @@ -13,6 +13,9 @@ bool GetFileSize(const char *path, std::uintmax_t *size); bool ResizeFile(const char *path, std::uintmax_t size); void RemoveFile(const char *lpFileName); std::unique_ptr CreateFileStream(const char *path, std::ios::openmode mode); -bool SFileOpenArchiveDiablo(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq); + +#if defined(_WIN64) || defined(_WIN32) +std::unique_ptr ToWideChar(string_view path); +#endif } // namespace devilution