diff --git a/src/Cafe/Account/Account.cpp b/src/Cafe/Account/Account.cpp index 2cf424f1..2234bd16 100644 --- a/src/Cafe/Account/Account.cpp +++ b/src/Cafe/Account/Account.cpp @@ -175,7 +175,7 @@ std::error_code Account::Load() std::error_code Account::Save() { - fs::path path = CemuApp::GetMLCPath(fmt::format(L"usr/save/system/act/{:08x}", m_persistent_id)).ToStdWstring(); + FSPath path = CemuApp::GetMLCPath(fmt::format(L"usr/save/system/act/{:08x}", m_persistent_id)).ToStdWstring(); if (!fs::exists(path)) { std::error_code ec; diff --git a/src/Cafe/Filesystem/FSPath.cpp b/src/Cafe/Filesystem/FSPath.cpp index 0720f55a..22e8e363 100644 --- a/src/Cafe/Filesystem/FSPath.cpp +++ b/src/Cafe/Filesystem/FSPath.cpp @@ -1,16 +1,13 @@ #include "FSPath.h" +#ifdef BOOST_OS_LINUX + FSPath& FSPath::operator/ (const FSPath & other) { *this /= other; return *this; } -#ifndef BOOST_OS_UNIX -FSPath& FSPath::operator/= (const FSPath & other) -{ - fs::path::operator/=(other); -} -#else + FSPath& FSPath::operator/= (const FSPath & other) { // todo: implement caching. @@ -20,9 +17,9 @@ FSPath& FSPath::operator/= (const FSPath & other) fs::path correctedPath = empty() ? other.root_path() : *this; // helper function to convert a path's alphabet characters to lowercase. - auto static lowercase_path = [](fs::path const & path) + auto static lowercase_path = [](FSPath const & path) { - std::wstring string = path.wstring(); + std::string string = path.string(); for (auto& i : string) { i = std::isalpha(i) ? std::tolower(i) : i; @@ -47,19 +44,13 @@ FSPath& FSPath::operator/= (const FSPath & other) } // if we can't iterate directory, just copy the original case. - if(listErr) + if(listErr || !found) { correctedPath /= it; - found = true; } - - if (!found) - break; } - if (found) - *this = correctedPath; - + *this = FSPath(correctedPath); return *this; } diff --git a/src/Cafe/Filesystem/FSPath.h b/src/Cafe/Filesystem/FSPath.h index 30194760..543fb8f6 100644 --- a/src/Cafe/Filesystem/FSPath.h +++ b/src/Cafe/Filesystem/FSPath.h @@ -6,8 +6,9 @@ class FSPath : public fs::path { FSPath() = default; template - FSPath(const T & other) : fs::path(other) {}; + FSPath(const T& other) : fs::path(other) {}; +#ifdef BOOST_OS_UNIX template static FSPath Convert(const T& input) { @@ -15,4 +16,5 @@ class FSPath : public fs::path { } FSPath& operator/= (const FSPath & other); FSPath& operator/ (const FSPath & other); +#endif }; \ No newline at end of file diff --git a/src/Cafe/Filesystem/fscDeviceHostFS.cpp b/src/Cafe/Filesystem/fscDeviceHostFS.cpp index 8216c6e1..aa76fc7e 100644 --- a/src/Cafe/Filesystem/fscDeviceHostFS.cpp +++ b/src/Cafe/Filesystem/fscDeviceHostFS.cpp @@ -219,9 +219,9 @@ FSCVirtualFile* FSCVirtualFile_Host::OpenFile(const FSPath& path, FSC_ACCESS_FLA /* Device implementation */ -class fscDeviceHostFSC : public fscDeviceC { - public: - +class fscDeviceHostFSC : public fscDeviceC +{ +public: FSCVirtualFile* fscDeviceOpenByPath(std::wstring_view path, FSC_ACCESS_FLAG accessFlags, void* ctx, sint32* fscStatus) override { *fscStatus = FSC_STATUS_OK; diff --git a/src/Cafe/TitleList/SaveInfo.h b/src/Cafe/TitleList/SaveInfo.h index 2ea66a54..10d9618c 100644 --- a/src/Cafe/TitleList/SaveInfo.h +++ b/src/Cafe/TitleList/SaveInfo.h @@ -23,7 +23,7 @@ private: static fs::path GetSavePath(TitleId titleId); TitleId m_titleId; - fs::path m_path; + FSPath m_path; bool m_isValid{false}; bool m_hasMetaLoaded{false}; ParsedMetaXml* m_parsedMetaXml{nullptr}; diff --git a/src/Common/unix/FileStream_unix.cpp b/src/Common/unix/FileStream_unix.cpp index 229bb086..b1e95ae9 100644 --- a/src/Common/unix/FileStream_unix.cpp +++ b/src/Common/unix/FileStream_unix.cpp @@ -10,7 +10,7 @@ FileStream* FileStream::openFile(const wchar_t* path, bool allowWrite) return openFile2(path, allowWrite); } -FileStream* FileStream::openFile2(const FSPath& path, bool allowWrite) +FileStream* FileStream::openFile2(const fs::path& path, bool allowWrite) { //return openFile(path.generic_wstring().c_str(), allowWrite); FileStream* fs = new FileStream(path, true, allowWrite); diff --git a/src/Common/unix/FileStream_unix.h b/src/Common/unix/FileStream_unix.h index 0b179b5e..12c971d1 100644 --- a/src/Common/unix/FileStream_unix.h +++ b/src/Common/unix/FileStream_unix.h @@ -1,5 +1,4 @@ #pragma once -#include #include "Common/precompiled.h" class FileStream @@ -7,7 +6,7 @@ class FileStream public: static FileStream* openFile(std::string_view path); static FileStream* openFile(const wchar_t* path, bool allowWrite = false); - static FileStream* openFile2(const FSPath& path, bool allowWrite = false); + static FileStream* openFile2(const fs::path& path, bool allowWrite = false); static FileStream* createFile(const wchar_t* path); static FileStream* createFile(std::string_view path); diff --git a/src/config/ActiveSettings.cpp b/src/config/ActiveSettings.cpp index a3f34d58..c7e3c4fa 100644 --- a/src/config/ActiveSettings.cpp +++ b/src/config/ActiveSettings.cpp @@ -223,7 +223,7 @@ FSPath ActiveSettings::GetMlcPath() FSPath ActiveSettings::GetMlcPath(std::string_view p) { std::basic_string_view s((const char8_t*)p.data(), p.size()); - return GetMlcPath() / FSPath(s); + return GetMlcPath() / s; } fs::path ActiveSettings::GetDefaultMLCPath() diff --git a/src/config/ActiveSettings.h b/src/config/ActiveSettings.h index afa2c5e9..53af1fc2 100644 --- a/src/config/ActiveSettings.h +++ b/src/config/ActiveSettings.h @@ -1,6 +1,7 @@ #pragma once #include "config/CemuConfig.h" +#include "Cafe/Filesystem/FSPath.h" // global active settings for fast access (reflects settings from command line and game profile) class ActiveSettings @@ -39,15 +40,15 @@ public: } template - [[nodiscard]] static fs::path GetMlcPath(std::string_view format, TArgs&&... args) + [[nodiscard]] static FSPath GetMlcPath(std::string_view format, TArgs&&... args) { cemu_assert_debug(format.empty() || (format[0] != '/' && format[0] != '\\')); auto tmp = fmt::format(fmt::runtime(format), std::forward(args)...); - return GetMlcPath() / FSPath(_asUtf8(tmp)); + return GetMlcPath() / _asUtf8(tmp); } template - [[nodiscard]] static fs::path GetMlcPath(std::wstring_view format, TArgs&&... args) + [[nodiscard]] static FSPath GetMlcPath(std::wstring_view format, TArgs&&... args) { cemu_assert_debug(format.empty() || (format[0] != L'/' && format[0] != L'\\')); return GetMlcPath() / fmt::format(fmt::runtime(format), std::forward(args)...);