From 3922ef5e8534ab7d68f8ed54a0fb53be9a0ae9bf Mon Sep 17 00:00:00 2001 From: goeiecool9999 <> Date: Wed, 7 Sep 2022 20:25:03 +0200 Subject: [PATCH] Something like this maybe? --- src/Cafe/Filesystem/fscDeviceHostFS.cpp | 53 ++----------------------- src/Cafe/Filesystem/fscDeviceHostFS.h | 3 +- src/Cafe/IOSU/legacy/iosu_boss.cpp | 4 +- src/Cafe/TitleList/TitleInfo.cpp | 2 +- src/Common/unix/FileStream_unix.cpp | 2 +- src/Common/unix/FileStream_unix.h | 3 +- src/config/ActiveSettings.cpp | 8 +++- src/config/ActiveSettings.h | 10 ++--- 8 files changed, 21 insertions(+), 64 deletions(-) diff --git a/src/Cafe/Filesystem/fscDeviceHostFS.cpp b/src/Cafe/Filesystem/fscDeviceHostFS.cpp index 1203c8f6..c24acbc9 100644 --- a/src/Cafe/Filesystem/fscDeviceHostFS.cpp +++ b/src/Cafe/Filesystem/fscDeviceHostFS.cpp @@ -1,6 +1,7 @@ #include "config/ActiveSettings.h" #include "Cafe/Filesystem/fsc.h" #include "Cafe/Filesystem/fscDeviceHostFS.h" +#include "Cafe/Filesystem/FSPath.h" #include "Common/FileStream.h" @@ -157,7 +158,7 @@ bool FSCVirtualFile_Host::fscDirNext(FSCDirEntry* dirEntry) return true; } -FSCVirtualFile* FSCVirtualFile_Host::OpenFile(const fs::path& path, FSC_ACCESS_FLAG accessFlags, sint32& fscStatus) +FSCVirtualFile* FSCVirtualFile_Host::OpenFile(const FSPath& path, FSC_ACCESS_FLAG accessFlags, sint32& fscStatus) { if (!HAS_FLAG(accessFlags, FSC_ACCESS_FLAG::OPEN_FILE) && !HAS_FLAG(accessFlags, FSC_ACCESS_FLAG::OPEN_DIR)) cemu_assert_debug(false); // not allowed. At least one of both flags must be set @@ -226,55 +227,7 @@ class fscDeviceHostFSC : public fscDeviceC { // todo: implement caching. *fscStatus = FSC_STATUS_OK; - // explore directories recursively and find the matching cases. - std::filesystem::path path = pathString; - std::filesystem::path relPath = path.relative_path(); - std::filesystem::path correctedPath = path.root_path(); - - // helper function to convert a path's alphabet characters to lowercase. - auto static lowercase_path = [](std::filesystem::path const & path) - { - std::wstring string = path.wstring(); - for (auto& i : string) - { - i = std::isalpha(i) ? std::tolower(i) : i; - } - return string; - }; - - bool found; - for (auto const &it : relPath) - { - found = false; - std::error_code listErr; - for (auto const& dirEntry : std::filesystem::directory_iterator{correctedPath, listErr}) - { - std::filesystem::path entryName = dirEntry.path().filename(); - if (lowercase_path(entryName) == lowercase_path(it)) - { - correctedPath /= entryName; - found = true; - break; - } - } - - // if we can't iterate directory, just copy the original case. - if(listErr) - { - correctedPath /= it; - found = true; - } - - if (!found) - break; - } - - if(!found) - { - *fscStatus = FSC_STATUS_FILE_NOT_FOUND; - return nullptr; - } - + FSPath correctedPath = FSPath::Convert(pathString); return FSCVirtualFile_Host::OpenFile(correctedPath, accessFlags, *fscStatus); } diff --git a/src/Cafe/Filesystem/fscDeviceHostFS.h b/src/Cafe/Filesystem/fscDeviceHostFS.h index 7121594c..b1c14765 100644 --- a/src/Cafe/Filesystem/fscDeviceHostFS.h +++ b/src/Cafe/Filesystem/fscDeviceHostFS.h @@ -1,9 +1,10 @@ #include "Cafe/Filesystem/fsc.h" +#include "FSPath.h" class FSCVirtualFile_Host : public FSCVirtualFile { public: - static FSCVirtualFile* OpenFile(const fs::path& path, FSC_ACCESS_FLAG accessFlags, sint32& fscStatus); + static FSCVirtualFile* OpenFile(const FSPath& path, FSC_ACCESS_FLAG accessFlags, sint32& fscStatus); ~FSCVirtualFile_Host() override; sint32 fscGetType() override; diff --git a/src/Cafe/IOSU/legacy/iosu_boss.cpp b/src/Cafe/IOSU/legacy/iosu_boss.cpp index 22c11eba..538f1b3e 100644 --- a/src/Cafe/IOSU/legacy/iosu_boss.cpp +++ b/src/Cafe/IOSU/legacy/iosu_boss.cpp @@ -649,7 +649,7 @@ namespace iosu // create/open fad db content BossStorageFadFile fad_content{}; - fs::path db_file = ActiveSettings::GetMlcPath("usr/boss/{:08x}/{:08x}/user/common/{:08x}/{}", (uint32)(it->title_id >> 32), (uint32)(it->title_id & 0xFFFFFFFF), it->account_id, taskIdStr); + FSPath db_file = ActiveSettings::GetMlcPath("usr/boss/{:08x}/{:08x}/user/common/{:08x}/{}", (uint32)(it->title_id >> 32), (uint32)(it->title_id & 0xFFFFFFFF), it->account_id, taskIdStr); if (!fs::exists(db_file)) fs::create_directories(db_file); @@ -800,7 +800,7 @@ namespace iosu strncpy(fileName, (char*)&it->task_settings.settings[TaskSetting::kFileName], TaskSetting::kFileNameLen); // mcl01\usr\boss\00050000\1018dd00\user\\\ - fs::path path = ActiveSettings::GetMlcPath("usr/boss/{:08x}/{:08x}/user/{:08x}", (uint32)(it->title_id >> 32), + FSPath path = ActiveSettings::GetMlcPath("usr/boss/{:08x}/{:08x}/user/{:08x}", (uint32)(it->title_id >> 32), (uint32)(it->title_id & 0xFFFFFFFF), iosuAct_getAccountIdOfCurrentAccount()); path /= directoryName; diff --git a/src/Cafe/TitleList/TitleInfo.cpp b/src/Cafe/TitleList/TitleInfo.cpp index 6606c130..2cd19232 100644 --- a/src/Cafe/TitleList/TitleInfo.cpp +++ b/src/Cafe/TitleList/TitleInfo.cpp @@ -289,7 +289,7 @@ void TitleInfo::CalcUID() } std::error_code ec; // get absolute normalized path - fs::path normalizedPath; + FSPath normalizedPath; if (m_fullPath.is_relative()) { normalizedPath = ActiveSettings::GetPath(); diff --git a/src/Common/unix/FileStream_unix.cpp b/src/Common/unix/FileStream_unix.cpp index b1e95ae9..229bb086 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 fs::path& path, bool allowWrite) +FileStream* FileStream::openFile2(const FSPath& 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 12c971d1..0b179b5e 100644 --- a/src/Common/unix/FileStream_unix.h +++ b/src/Common/unix/FileStream_unix.h @@ -1,4 +1,5 @@ #pragma once +#include #include "Common/precompiled.h" class FileStream @@ -6,7 +7,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 fs::path& path, bool allowWrite = false); + static FileStream* openFile2(const FSPath& 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 c7ff4fe6..023cdd65 100644 --- a/src/config/ActiveSettings.cpp +++ b/src/config/ActiveSettings.cpp @@ -209,7 +209,7 @@ bool ActiveSettings::ForceSamplerRoundToPrecision() return false; } -fs::path ActiveSettings::GetMlcPath() +FSPath ActiveSettings::GetMlcPath() { if(const auto launch_mlc = LaunchSettings::GetMLCPath(); launch_mlc.has_value()) return launch_mlc.value(); @@ -220,6 +220,12 @@ fs::path ActiveSettings::GetMlcPath() return GetDefaultMLCPath(); } +FSPath ActiveSettings::GetMlcPath(std::string_view p) +{ + std::basic_string_view s((const char8_t*)p.data(), p.size()); + return GetMlcPath() / fs::path(s); +} + fs::path ActiveSettings::GetDefaultMLCPath() { return GetPath("mlc01"); diff --git a/src/config/ActiveSettings.h b/src/config/ActiveSettings.h index 95ceae16..9a05752b 100644 --- a/src/config/ActiveSettings.h +++ b/src/config/ActiveSettings.h @@ -12,7 +12,7 @@ public: [[nodiscard]] static fs::path GetPath() { return s_path; } [[nodiscard]] static fs::path GetFilename() { return s_filename; } - [[nodiscard]] static fs::path GetMlcPath(); + [[nodiscard]] static FSPath GetMlcPath(); [[nodiscard]] static fs::path GetPath(std::string_view p) { @@ -20,12 +20,8 @@ public: return s_path / fs::path(s); } - [[nodiscard]] static fs::path GetMlcPath(std::string_view p) - { - std::basic_string_view s((const char8_t*)p.data(), p.size()); - return GetMlcPath() / fs::path(s); - } - + [[nodiscard]] static FSPath GetMlcPath(std::string_view p); + template [[nodiscard]] static fs::path GetPath(std::string_view format, TArgs&&... args) {