diff --git a/lib/VCMIDirs.cpp b/lib/VCMIDirs.cpp index d5a911267..4f4bdcccd 100644 --- a/lib/VCMIDirs.cpp +++ b/lib/VCMIDirs.cpp @@ -24,7 +24,7 @@ namespace bfs = boost::filesystem; bfs::path IVCMIDirs::userLogsPath() const { return userCachePath(); } -bfs::path IVCMIDirs::userSavePath() const { return userDataPath() / "saves"; } +bfs::path IVCMIDirs::userSavePath() const { return userDataPath() / "Saves"; } bfs::path IVCMIDirs::userExtractedPath() const { return userCachePath() / "extracted"; } @@ -96,8 +96,6 @@ class VCMIDirsWIN32 final : public IVCMIDirs std::string libraryName(const std::string& basename) const override; - void init() override; - protected: mutable std::optional dirsConfig; void loadDirsJsonIfNeeded() const; @@ -124,7 +122,6 @@ void VCMIDirsWIN32::loadDirsJsonIfNeeded() const wchar_t currentPath[MAX_PATH]; GetModuleFileNameW(nullptr, currentPath, MAX_PATH); - auto configPath = bfs::path(currentPath).parent_path() / "config" / "dirs.json"; if (!bfs::exists(configPath)) @@ -133,7 +130,7 @@ void VCMIDirsWIN32::loadDirsJsonIfNeeded() const return; } - std::ifstream in(configPath.c_str(), std::ios::binary); + std::ifstream in(configPath.wstring(), std::ios::binary); if (!in) { dirsConfig = std::nullopt; @@ -141,7 +138,13 @@ void VCMIDirsWIN32::loadDirsJsonIfNeeded() const } std::string buffer((std::istreambuf_iterator(in)), {}); - dirsConfig = JsonNode(reinterpret_cast(buffer.data()), buffer.size(), configPath.string()); + std::wstring wstr = configPath.wstring(); + + int size = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr); + std::string utf8path(size - 1, 0); + WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, utf8path.data(), size, nullptr, nullptr); + + dirsConfig = JsonNode(reinterpret_cast(buffer.data()), buffer.size(), utf8path); } bfs::path VCMIDirsWIN32::getPathFromConfigOrDefault(const std::string& key, const std::function& fallbackFunc) const @@ -164,16 +167,10 @@ bfs::path VCMIDirsWIN32::getPathFromConfigOrDefault(const std::string& key, cons return bfs::path(raw); } -void VCMIDirsWIN32::init() -{ - // Call base (init dirs) - IVCMIDirs::init(); -} - static bfs::path getDefaultUserDataPath() { wchar_t profileDir[MAX_PATH]; - if (SHGetSpecialFolderPathW(nullptr, profileDir, CSIDL_MYDOCUMENTS, FALSE)) + if (SHGetSpecialFolderPathW(nullptr, profileDir, CSIDL_MYDOCUMENTS, FALSE) != FALSE) return bfs::path(profileDir) / "My Games" / "vcmi"; return bfs::path("."); } @@ -200,7 +197,7 @@ bfs::path VCMIDirsWIN32::userLogsPath() const bfs::path VCMIDirsWIN32::userSavePath() const { - return getPathFromConfigOrDefault("userSavePath", [this] { return userDataPath() / "saves"; }); + return getPathFromConfigOrDefault("userSavePath", [this] { return userDataPath() / "Saves"; }); } std::vector VCMIDirsWIN32::dataPaths() const