From 370c08213c2c7800c3ed97cfebef2eca98e43df9 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 22 Nov 2024 14:30:58 +0100 Subject: [PATCH] Core: Fix unicode path names under Windows --- src/Gui/PreferencePackManager.cpp | 62 +++++++++++++++---------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/Gui/PreferencePackManager.cpp b/src/Gui/PreferencePackManager.cpp index dfc54240c0..6fab14694d 100644 --- a/src/Gui/PreferencePackManager.cpp +++ b/src/Gui/PreferencePackManager.cpp @@ -60,9 +60,9 @@ PreferencePack::PreferencePack(const fs::path& path, const App::Metadata& metada auto cssPaths = QDir::searchPaths(QString::fromUtf8("css")); auto overlayPaths = QDir::searchPaths(QString::fromUtf8("overlay")); - qssPaths.append(QString::fromStdString(_path.string())); - cssPaths.append(QString::fromStdString(_path.string())); - overlayPaths.append(QString::fromStdString(_path.string() + "/overlay")); + qssPaths.append(QString::fromStdString(Base::FileInfo::pathToString(_path))); + cssPaths.append(QString::fromStdString(Base::FileInfo::pathToString(_path))); + overlayPaths.append(QString::fromStdString(Base::FileInfo::pathToString(_path) + "/overlay")); QDir::setSearchPaths(QString::fromUtf8("qss"), qssPaths); QDir::setSearchPaths(QString::fromUtf8("css"), cssPaths); @@ -80,7 +80,7 @@ bool PreferencePack::apply() const auto preMacroPath = _path / "pre.FCMacro"; if (fs::exists(preMacroPath)) { try { - Base::Interpreter().runFile(preMacroPath.string().c_str(), false); + Base::Interpreter().runFile(Base::FileInfo::pathToString(preMacroPath).c_str(), false); } catch (...) { Base::Console().Message("PreferencePack application aborted by the preferencePack's pre.FCMacro"); @@ -89,13 +89,13 @@ bool PreferencePack::apply() const } // Back up the old config file - auto savedPreferencePacksDirectory = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks"; + auto savedPreferencePacksDirectory = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks"; auto backupFile = savedPreferencePacksDirectory / "user.cfg.backup"; try { fs::remove(backupFile); } catch (...) {} - App::GetApplication().GetUserParameter().SaveDocument(backupFile.string().c_str()); + App::GetApplication().GetUserParameter().SaveDocument(Base::FileInfo::pathToString(backupFile).c_str()); // Apply the config settings applyConfigChanges(); @@ -104,11 +104,11 @@ bool PreferencePack::apply() const auto postMacroPath = _path / "post.FCMacro"; if (fs::exists(postMacroPath)) { try { - Base::Interpreter().runFile(postMacroPath.string().c_str(), false); + Base::Interpreter().runFile(Base::FileInfo::pathToString(postMacroPath).c_str(), false); } catch (...) { Base::Console().Message("PreferencePack application reverted by the preferencePack's post.FCMacro"); - App::GetApplication().GetUserParameter().LoadDocument(backupFile.string().c_str()); + App::GetApplication().GetUserParameter().LoadDocument(Base::FileInfo::pathToString(backupFile).c_str()); return false; } } @@ -127,7 +127,7 @@ void PreferencePack::applyConfigChanges() const auto configFile = _path / (_metadata.name() + ".cfg"); if (fs::exists(configFile)) { auto newParameters = ParameterManager::Create(); - newParameters->LoadDocument(configFile.string().c_str()); + newParameters->LoadDocument(Base::FileInfo::pathToString(configFile).c_str()); auto baseAppGroup = App::GetApplication().GetUserParameter().GetGroup("BaseApp"); newParameters->GetGroup("BaseApp")->insertTo(baseAppGroup); } @@ -135,9 +135,9 @@ void PreferencePack::applyConfigChanges() const PreferencePackManager::PreferencePackManager() { - auto modPath = fs::path(App::Application::getUserAppDataDir()) / "Mod"; - auto savedPath = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks"; - auto resourcePath = fs::path(App::Application::getResourceDir()) / "Gui" / "PreferencePacks"; + auto modPath = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "Mod"; + auto savedPath = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks"; + auto resourcePath = fs::path(Base::FileInfo::stringToPath(App::Application::getResourceDir())) / "Gui" / "PreferencePacks"; _preferencePackPaths.push_back(resourcePath); _preferencePackPaths.push_back(modPath); _preferencePackPaths.push_back(savedPath); @@ -167,7 +167,7 @@ void Gui::PreferencePackManager::AddPackToMetadata(const std::string &packName) { std::lock_guard lock(_mutex); auto savedPreferencePacksDirectory = - fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks"; + fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks"; fs::path preferencePackDirectory(savedPreferencePacksDirectory / packName); if (fs::exists(preferencePackDirectory) && !fs::is_directory(preferencePackDirectory)) throw std::runtime_error("Cannot create " + savedPreferencePacksDirectory.string() @@ -222,7 +222,7 @@ void Gui::PreferencePackManager::importConfig(const std::string& packName, AddPackToMetadata(packName); auto savedPreferencePacksDirectory = - fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks"; + fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks"; auto cfgFilename = savedPreferencePacksDirectory / packName / (packName + ".cfg"); #if BOOST_VERSION >= 107400 fs::copy_file(path, cfgFilename, fs::copy_options::overwrite_existing); @@ -243,20 +243,20 @@ void Gui::PreferencePackManager::FindPreferencePacksInPackage(const fs::path &mo catch (...) { // Failed to read the metadata, or to create the preferencePack based on it... auto packageMetadataFile = mod / "package.xml"; - Base::Console().Error("Failed to read %s\n", packageMetadataFile.string().c_str()); + Base::Console().Error("Failed to read %s\n", Base::FileInfo::pathToString(packageMetadataFile).c_str()); } } void PreferencePackManager::TryFindPreferencePacksInPackage(const boost::filesystem::path& mod) { auto packageMetadataFile = mod / "package.xml"; - static const auto modDirectory = fs::path(App::Application::getUserAppDataDir()) / "Mod" / "SavedPreferencePacks"; - static const auto resourcePath = fs::path(App::Application::getResourceDir()) / "Gui" / "PreferencePacks"; + static const auto modDirectory = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "Mod" / "SavedPreferencePacks"; + static const auto resourcePath = fs::path(Base::FileInfo::stringToPath(App::Application::getResourceDir())) / "Gui" / "PreferencePacks"; if (fs::exists(packageMetadataFile) && fs::is_regular_file(packageMetadataFile)) { App::Metadata metadata(packageMetadataFile); auto content = metadata.content(); - auto basename = mod.filename().string(); + auto basename = Base::FileInfo::pathToString(mod.filename()); if (mod == modDirectory) basename = "##USER_SAVED##"; else if (mod == resourcePath) @@ -365,7 +365,7 @@ void Gui::PreferencePackManager::deleteUserPack(const std::string& name) { if (name.empty()) return; - auto savedPreferencePacksDirectory = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks"; + auto savedPreferencePacksDirectory = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks"; auto savedPath = savedPreferencePacksDirectory / name; std::unique_ptr metadata; if (fs::exists(savedPreferencePacksDirectory / "package.xml")) { @@ -454,13 +454,13 @@ void PreferencePackManager::save(const std::string& name, const std::vectorCreateDocument(); for (const auto& t : templates) { auto templateParameterManager = ParameterManager::Create(); - templateParameterManager->LoadDocument(t.path.string().c_str()); + templateParameterManager->LoadDocument(Base::FileInfo::pathToString(t.path).c_str()); copyTemplateParameters(*templateParameterManager, *outputParameterManager); } auto savedPreferencePacksDirectory = - fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks"; + fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks"; auto cfgFilename = savedPreferencePacksDirectory / name / (name + ".cfg"); - outputParameterManager->SaveDocument(cfgFilename.string().c_str()); + outputParameterManager->SaveDocument(Base::FileInfo::pathToString(cfgFilename).c_str()); } // Needed until we support only C++20 and above and can use std::string's built-in ends_with() @@ -480,7 +480,7 @@ std::vector scanForTemplateFolders(const std::string& groupName, const templateFolders.push_back(entry); } else { - std::string subgroupName = groupName + "/" + entry.filename().string(); + std::string subgroupName = groupName + "/" + Base::FileInfo::pathToString(entry.filename()); for (const auto& subentry : fs::directory_iterator(entry)) { auto contents = scanForTemplateFolders(subgroupName, subentry); std::copy(contents.begin(), contents.end(), std::back_inserter(templateFolders)); @@ -501,7 +501,7 @@ std::vector scanForTemplateFiles(const std: continue; for (const auto& entry : fs::directory_iterator(templateDir)) { if (entry.path().extension() == ".cfg") { - auto name = entry.path().filename().stem().string(); + auto name = Base::FileInfo::pathToString(entry.path().filename().stem()); std::replace(name.begin(), name.end(), '_', ' '); // Make sure we don't insert the same thing twice... if (std::find_if(templateFiles.begin(), templateFiles.end(), [groupName, name](const auto &rhs)->bool { @@ -527,8 +527,8 @@ std::vector PreferencePackManager::template // * $DATA_DIR/Mod/**/PreferencePackTemplates/(Appearance|Behavior)/* // (alternate spellings are provided for packages using CamelCase and snake_case, and both major English dialects) - auto resourcePath = fs::path(App::Application::getResourceDir()) / "Gui"; - auto modPath = fs::path(App::Application::getUserAppDataDir()) / "Mod"; + auto resourcePath = fs::path(Base::FileInfo::stringToPath(App::Application::getResourceDir())) / "Gui"; + auto modPath = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "Mod"; std::string group = "Built-In"; if (fs::exists(resourcePath) && fs::is_directory(resourcePath)) { @@ -538,7 +538,7 @@ std::vector PreferencePackManager::template if (fs::exists(modPath) && fs::is_directory(modPath)) { for (const auto& mod : fs::directory_iterator(modPath)) { - group = mod.path().filename().string(); + group = Base::FileInfo::pathToString(mod.path().filename()); const auto localFiles = scanForTemplateFiles(group, mod); std::copy(localFiles.begin(), localFiles.end(), std::back_inserter(_templateFiles)); } @@ -549,7 +549,7 @@ std::vector PreferencePackManager::template void Gui::PreferencePackManager::BackupCurrentConfig() const { - auto backupDirectory = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks" / "Backups"; + auto backupDirectory = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks" / "Backups"; fs::create_directories(backupDirectory); // Create a timestamped filename: @@ -559,14 +559,14 @@ void Gui::PreferencePackManager::BackupCurrentConfig() const auto filename = backupDirectory / timestampStream.str(); // Save the current config: - App::GetApplication().GetUserParameter().SaveDocument(filename.string().c_str()); + App::GetApplication().GetUserParameter().SaveDocument(Base::FileInfo::pathToString(filename).c_str()); } void Gui::PreferencePackManager::DeleteOldBackups() const { constexpr auto oneWeek = 60.0 * 60.0 * 24.0 * 7.0; const auto now = std::time(nullptr); - auto backupDirectory = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks" / "Backups"; + auto backupDirectory = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks" / "Backups"; if (fs::exists(backupDirectory) && fs::is_directory(backupDirectory)) { for (const auto& backup : fs::directory_iterator(backupDirectory)) { if (std::difftime(now, fs::last_write_time(backup)) > oneWeek) { @@ -582,7 +582,7 @@ void Gui::PreferencePackManager::DeleteOldBackups() const std::vector Gui::PreferencePackManager::configBackups() const { std::vector results; - auto backupDirectory = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks" / "Backups"; + auto backupDirectory = fs::path(Base::FileInfo::stringToPath(App::Application::getUserAppDataDir())) / "SavedPreferencePacks" / "Backups"; if (fs::exists(backupDirectory) && fs::is_directory(backupDirectory)) { for (const auto& backup : fs::directory_iterator(backupDirectory)) { results.push_back(backup);