diff --git a/src/Files/Files.cpp b/src/Files/Files.cpp index 508ba30..301431e 100644 --- a/src/Files/Files.cpp +++ b/src/Files/Files.cpp @@ -112,7 +112,9 @@ OSErr FSMakeFSSpec(short vRefNum, long dirID, const char* cstrFileName, FSSpec* if (!IsVolumeLegal(vRefNum)) return nsvErr; - return volumes.at(vRefNum)->FSMakeFSSpec(dirID, cstrFileName, spec); + u8string fileName((const char8_t*)cstrFileName); + + return volumes.at(vRefNum)->FSMakeFSSpec(dirID, fileName, spec); } static OSErr OpenFork(const FSSpec* spec, ForkType forkType, char permission, short* refNum) @@ -165,7 +167,7 @@ OSErr FindFolder(short vRefNum, OSType folderType, Boolean createFolder, short* throw std::runtime_error("FindFolder only supports kOnSystemDisk"); } - fs::path path; + fs::path path = ""; switch (folderType) { @@ -175,7 +177,8 @@ OSErr FindFolder(short vRefNum, OSType folderType, Boolean createFolder, short* path = Pomme::Platform::Windows::GetPreferencesFolder(); #elif defined(__APPLE__) const char *home = getenv("HOME"); - if (!home) { + if (!home) + { return fnfErr; } path = fs::path(home) / "Library" / "Preferences"; @@ -203,6 +206,11 @@ OSErr FindFolder(short vRefNum, OSType folderType, Boolean createFolder, short* return fnfErr; } + if (path.empty()) + { + return fnfErr; + } + path = path.lexically_normal(); bool exists = fs::exists(path); @@ -223,9 +231,15 @@ OSErr FindFolder(short vRefNum, OSType folderType, Boolean createFolder, short* OSErr DirCreate(short vRefNum, long parentDirID, const char* cstrDirectoryName, long* createdDirID) { - return IsVolumeLegal(vRefNum) - ? volumes.at(vRefNum)->DirCreate(parentDirID, cstrDirectoryName, createdDirID) - : (OSErr)nsvErr; + if (!IsVolumeLegal(vRefNum)) + { + return (OSErr)nsvErr; + } + + u8string directoryName((const char8_t*)cstrDirectoryName); + + const auto& volume = volumes.at(vRefNum); + return volume->DirCreate(parentDirID, directoryName, createdDirID); } OSErr FSpCreate(const FSSpec* spec, OSType creator, OSType fileType, ScriptCode scriptTag) diff --git a/src/Files/HostVolume.cpp b/src/Files/HostVolume.cpp index dc25cc9..7b3845f 100644 --- a/src/Files/HostVolume.cpp +++ b/src/Files/HostVolume.cpp @@ -68,9 +68,15 @@ long HostVolume::GetDirectoryID(const fs::path& dirPath) //----------------------------------------------------------------------------- // Internal utilities -fs::path HostVolume::ToPath(long parID, const std::string& name) +fs::path HostVolume::ToPath(long parID, const char* name) { - fs::path path = directories.at(parID) / AsU8(name); + return ToPath(parID, u8string((const char8_t*)name)); +} + +fs::path HostVolume::ToPath(long parID, const u8string& name) +{ + fs::path path = directories.at(parID); + path /= name; return path.lexically_normal(); } @@ -161,12 +167,9 @@ OSErr HostVolume::OpenFork(const FSSpec* spec, ForkType forkType, char permissio return noErr; } -static bool CaseInsensitiveAppendToPath( - fs::path& path, - const std::string& element, - bool skipFiles = false) +static bool CaseInsensitiveAppendToPath(fs::path& path, const u8string& element, bool skipFiles = false) { - fs::path naiveConcat = path / AsU8(element); + fs::path naiveConcat = path / element; if (!fs::exists(path)) { @@ -199,11 +202,7 @@ static bool CaseInsensitiveAppendToPath( } // Convert candidate filename to uppercase for case-insensitive comparison -#if LEGACY_FILESYSTEM_IMPLEMENTATION // ghc::path::u8string returns an std::string - const std::string uppercaseCandidateFilename = UppercaseCopy(candidateFilename.u8string()); -#else // C++20 - const std::string uppercaseCandidateFilename = UppercaseCopy(FromU8(candidateFilename.u8string())); -#endif + const u8string uppercaseCandidateFilename = UppercaseCopy(candidateFilename.u8string()); if (uppercaseElement == uppercaseCandidateFilename) { @@ -219,7 +218,7 @@ static bool CaseInsensitiveAppendToPath( //----------------------------------------------------------------------------- // Implementation -OSErr HostVolume::FSMakeFSSpec(long dirID, const std::string& fileName, FSSpec* spec) +OSErr HostVolume::FSMakeFSSpec(long dirID, const u8string& fileName, FSSpec* spec) { if (dirID < 0 || (unsigned long) dirID >= directories.size()) { @@ -231,12 +230,12 @@ OSErr HostVolume::FSMakeFSSpec(long dirID, const std::string& fileName, FSSpec* // Case-insensitive sanitization bool exists = fs::exists(path); - std::string::size_type begin = (suffix.at(0) == ':') ? 1 : 0; + u8string::size_type begin = (suffix.at(0) == ':') ? 1 : 0; // Iterate on path elements between colons while (begin < suffix.length()) { - auto end = suffix.find(":", begin); + auto end = suffix.find(':', begin); bool isLeaf = end == std::string::npos; // no ':' found => end of path if (isLeaf) end = suffix.length(); @@ -264,7 +263,7 @@ OSErr HostVolume::FSMakeFSSpec(long dirID, const std::string& fileName, FSSpec* return exists ? noErr : fnfErr; } -OSErr HostVolume::DirCreate(long parentDirID, const std::string& directoryName, long* createdDirID) +OSErr HostVolume::DirCreate(long parentDirID, const u8string& directoryName, long* createdDirID) { const auto path = ToPath(parentDirID, directoryName); diff --git a/src/Files/HostVolume.h b/src/Files/HostVolume.h index 74cf83c..a1aebba 100644 --- a/src/Files/HostVolume.h +++ b/src/Files/HostVolume.h @@ -2,6 +2,7 @@ #include "Files/Volume.h" #include "CompilerSupport/filesystem.h" +#include "Utilities/StringUtils.h" #include namespace Pomme::Files @@ -14,7 +15,8 @@ namespace Pomme::Files { std::vector directories; - fs::path ToPath(long parID, const std::string& name); + fs::path ToPath(long parID, const char* name); + fs::path ToPath(long parID, const u8string& name); public: explicit HostVolume(short vRefNum); @@ -31,7 +33,7 @@ namespace Pomme::Files //----------------------------------------------------------------------------- // Toolbox API Implementation - OSErr FSMakeFSSpec(long dirID, const std::string& fileName, FSSpec* spec) override; + OSErr FSMakeFSSpec(long dirID, const u8string& fileName, FSSpec* spec) override; OSErr OpenFork(const FSSpec* spec, ForkType forkType, char permission, std::unique_ptr& stream) override; @@ -39,6 +41,6 @@ namespace Pomme::Files OSErr FSpDelete(const FSSpec* spec) override; - OSErr DirCreate(long parentDirID, const std::string& directoryName, long* createdDirID) override; + OSErr DirCreate(long parentDirID, const u8string& directoryName, long* createdDirID) override; }; } diff --git a/src/Files/Volume.h b/src/Files/Volume.h index a70007f..4f9c786 100644 --- a/src/Files/Volume.h +++ b/src/Files/Volume.h @@ -1,6 +1,7 @@ #pragma once #include +#include "Utilities/StringUtils.h" namespace Pomme::Files { @@ -48,7 +49,7 @@ namespace Pomme::Files //----------------------------------------------------------------------------- // Toolbox API Implementation - virtual OSErr FSMakeFSSpec(long dirID, const std::string& suffix, FSSpec* spec) = 0; + virtual OSErr FSMakeFSSpec(long dirID, const u8string& suffix, FSSpec* spec) = 0; virtual OSErr OpenFork(const FSSpec* spec, ForkType forkType, char permission, std::unique_ptr& handle) = 0; @@ -56,6 +57,6 @@ namespace Pomme::Files virtual OSErr FSpDelete(const FSSpec* spec) = 0; - virtual OSErr DirCreate(long parentDirID, const std::string& directoryName, long* createdDirID) = 0; + virtual OSErr DirCreate(long parentDirID, const u8string& directoryName, long* createdDirID) = 0; }; } \ No newline at end of file diff --git a/src/Platform/Windows/PommeWindows.cpp b/src/Platform/Windows/PommeWindows.cpp index 3d5607f..159beb1 100644 --- a/src/Platform/Windows/PommeWindows.cpp +++ b/src/Platform/Windows/PommeWindows.cpp @@ -1,14 +1,22 @@ #undef NOUSER +#include "PommeDebug.h" #include "Platform/Windows/PommeWindows.h" #include std::filesystem::path Pomme::Platform::Windows::GetPreferencesFolder() { - wchar_t* wpath = nullptr; - SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &wpath); - auto path = std::filesystem::path(wpath); + PWSTR wpath = nullptr; + HRESULT result = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &wpath); + + std::filesystem::path path = ""; + + if (result == S_OK) + { + path = std::filesystem::path(wpath); + } + CoTaskMemFree(static_cast(wpath)); return path; } diff --git a/src/SoundFormats/SoundFormats.cpp b/src/SoundFormats/SoundFormats.cpp index a629657..fd0c542 100644 --- a/src/SoundFormats/SoundFormats.cpp +++ b/src/SoundFormats/SoundFormats.cpp @@ -268,8 +268,9 @@ SndListHandle Pomme_SndLoadFileAsResource(short fRefNum) auto& spec = Pomme::Files::GetSpec(fRefNum); auto& stream = Pomme::Files::GetStream(fRefNum); - std::string fileName = UppercaseCopy(spec.cName); - fs::path extension = fs::path(AsU8(fileName)).extension(); + u8string fileName((const char8_t*) spec.cName); + fileName = UppercaseCopy(fileName); + fs::path extension = fs::path(fileName).extension(); // Guess media container from extension if (extension == ".AIFF" diff --git a/src/Utilities/StringUtils.cpp b/src/Utilities/StringUtils.cpp index d3421b9..c3bc467 100644 --- a/src/Utilities/StringUtils.cpp +++ b/src/Utilities/StringUtils.cpp @@ -3,9 +3,9 @@ #include #include -std::string UppercaseCopy(const std::string& in) +std::u8string UppercaseCopy(const u8string& in) { - std::string out; + std::u8string out; std::transform( in.begin(), in.end(), @@ -16,13 +16,3 @@ std::string UppercaseCopy(const std::string& in) }); return out; } - -u8string AsU8(const std::string s) -{ - return u8string(s.begin(), s.end()); -} - -std::string FromU8(const u8string u8s) -{ - return std::string(u8s.begin(), u8s.end()); -} diff --git a/src/Utilities/StringUtils.h b/src/Utilities/StringUtils.h index 624e145..b42b1ca 100644 --- a/src/Utilities/StringUtils.h +++ b/src/Utilities/StringUtils.h @@ -6,10 +6,7 @@ typedef std::u8string u8string; #else typedef std::string u8string; + typedef char char8_t; #endif -std::string UppercaseCopy(const std::string&); - -u8string AsU8(const std::string); - -std::string FromU8(const u8string); +u8string UppercaseCopy(const u8string&);