From e4496c41bd83bd1f20e76bdd33dd9e2977b817a3 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 5 Jan 2022 15:00:16 +0100 Subject: [PATCH] Upgrade platform_sanitise_filename() --- src/openrct2/interface/Screenshot.cpp | 2 +- src/openrct2/platform/Platform2.h | 2 ++ src/openrct2/platform/Shared.cpp | 34 +++++++++++++++------------ src/openrct2/platform/Windows.cpp | 14 ----------- src/openrct2/platform/platform.h | 1 - test/tests/Platform.cpp | 18 ++++++-------- 6 files changed, 29 insertions(+), 42 deletions(-) diff --git a/src/openrct2/interface/Screenshot.cpp b/src/openrct2/interface/Screenshot.cpp index 6f2674d823..0aa89605c3 100644 --- a/src/openrct2/interface/Screenshot.cpp +++ b/src/openrct2/interface/Screenshot.cpp @@ -139,7 +139,7 @@ static std::optional screenshot_get_next_path() // Generate a path with a `tries` number auto pathComposer = [&screenshotDirectory, &name](int tries) { - auto composedFilename = platform_sanitise_filename( + auto composedFilename = Platform::SanitiseFilename( name + ((tries > 0) ? " ("s + std::to_string(tries) + ")" : ""s) + ".png"); return screenshotDirectory + PATH_SEPARATOR + composedFilename; }; diff --git a/src/openrct2/platform/Platform2.h b/src/openrct2/platform/Platform2.h index ab99e0fc14..dee152a456 100644 --- a/src/openrct2/platform/Platform2.h +++ b/src/openrct2/platform/Platform2.h @@ -50,6 +50,8 @@ namespace Platform std::string GetUsername(); + std::string SanitiseFilename(std::string_view originalName); + #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) std::string GetEnvironmentPath(const char* name); std::string GetHomePath(); diff --git a/src/openrct2/platform/Shared.cpp b/src/openrct2/platform/Shared.cpp index 8e17060ed6..7dc3e0b8b7 100644 --- a/src/openrct2/platform/Shared.cpp +++ b/src/openrct2/platform/Shared.cpp @@ -21,6 +21,7 @@ #include "../config/Config.h" #include "../core/FileSystem.hpp" #include "../core/Path.hpp" +#include "../core/String.hpp" #include "../drawing/Drawing.h" #include "../drawing/LightFX.h" #include "../localisation/Currency.h" @@ -106,6 +107,24 @@ namespace Platform std::string combinedPath = Path::ResolveCasing(Path::Combine(path, "Data", "g1.dat")); return Platform::FileExists(combinedPath); } + + std::string SanitiseFilename(std::string_view originalName) + { +#ifdef _WIN32 + static constexpr std::array prohibited = { '<', '>', '*', '\\', ':', '|', '?', '"', '/' }; +#else + static constexpr std::array prohibited = { '/' }; +#endif + auto sanitised = std::string(originalName); + std::replace_if( + sanitised.begin(), sanitised.end(), + [](const std::string::value_type& ch) -> bool { + return std::find(prohibited.begin(), prohibited.end(), ch) != prohibited.end(); + }, + '_'); + sanitised = String::Trim(sanitised); + return sanitised; + } } // namespace Platform GamePalette gPalette; @@ -241,21 +260,6 @@ CurrencyType platform_get_currency_value(const char* currCode) return CurrencyType::Pounds; } -#ifndef _WIN32 -std::string platform_sanitise_filename(const std::string& path) -{ - static constexpr std::array prohibited = { '/' }; - auto sanitised = path; - std::replace_if( - sanitised.begin(), sanitised.end(), - [](const std::string::value_type& ch) -> bool { - return std::find(prohibited.begin(), prohibited.end(), ch) != prohibited.end(); - }, - '_'); - return sanitised; -} -#endif - #ifndef __ANDROID__ float platform_get_default_scale() { diff --git a/src/openrct2/platform/Windows.cpp b/src/openrct2/platform/Windows.cpp index 19738ebb28..13aefacb2b 100644 --- a/src/openrct2/platform/Windows.cpp +++ b/src/openrct2/platform/Windows.cpp @@ -185,20 +185,6 @@ std::string platform_get_rct2_steam_dir() return "Rollercoaster Tycoon 2"; } -std::string platform_sanitise_filename(const std::string& path) -{ - static constexpr std::array prohibited = { '<', '>', '*', '\\', ':', '|', '?', '"', '/' }; - auto sanitised = path; - std::replace_if( - sanitised.begin(), sanitised.end(), - [](const std::string::value_type& ch) -> bool { - return std::find(prohibited.begin(), prohibited.end(), ch) != prohibited.end(); - }, - '_'); - sanitised = String::Trim(sanitised); - return sanitised; -} - uint16_t platform_get_locale_language() { CHAR langCode[4]; diff --git a/src/openrct2/platform/platform.h b/src/openrct2/platform/platform.h index 17e37d9b9b..3b547ddbfb 100644 --- a/src/openrct2/platform/platform.h +++ b/src/openrct2/platform/platform.h @@ -115,7 +115,6 @@ bool platform_process_is_elevated(); bool platform_get_steam_path(utf8* outPath, size_t outSize); std::string platform_get_rct1_steam_dir(); std::string platform_get_rct2_steam_dir(); -std::string platform_sanitise_filename(const std::string&); #ifndef NO_TTF bool platform_get_font_path(TTFFontDescriptor* font, utf8* buffer, size_t size); diff --git a/test/tests/Platform.cpp b/test/tests/Platform.cpp index dccea3aad0..4724d6735d 100644 --- a/test/tests/Platform.cpp +++ b/test/tests/Platform.cpp @@ -8,21 +8,17 @@ *****************************************************************************/ #include -#include +#include TEST(platform, sanitise_filename) { + ASSERT_EQ("normal-filename.png", Platform::SanitiseFilename("normal-filename.png")); + ASSERT_EQ("utf🎱", Platform::SanitiseFilename("utf🎱")); + ASSERT_EQ("forbidden_char", Platform::SanitiseFilename("forbidden/char")); + ASSERT_EQ("non trimmed", Platform::SanitiseFilename(" non trimmed ")); #ifndef _WIN32 - ASSERT_EQ("normal-filename.png", platform_sanitise_filename("normal-filename.png")); - ASSERT_EQ("utf🎱", platform_sanitise_filename("utf🎱")); - ASSERT_EQ("forbidden_char", platform_sanitise_filename("forbidden/char")); - ASSERT_EQ("forbidden_\\:\"|?*chars", platform_sanitise_filename("forbidden/\\:\"|?*chars")); - ASSERT_EQ(" non trimmed ", platform_sanitise_filename(" non trimmed ")); + ASSERT_EQ("forbidden_\\:\"|?*chars", Platform::SanitiseFilename("forbidden/\\:\"|?*chars")); #else - ASSERT_EQ("normal-filename.png", platform_sanitise_filename("normal-filename.png")); - ASSERT_EQ("utf🎱", platform_sanitise_filename("utf🎱")); - ASSERT_EQ("forbidden_char", platform_sanitise_filename("forbidden/char")); - ASSERT_EQ("forbidden_______chars", platform_sanitise_filename("forbidden/\\:\"|?*chars")); - ASSERT_EQ("non trimmed", platform_sanitise_filename(" non trimmed ")); + ASSERT_EQ("forbidden_______chars", Platform::SanitiseFilename("forbidden/\\:\"|?*chars")); #endif }