From 771637f24c5ec1e38d0afc7feb84aa5c0870f5d7 Mon Sep 17 00:00:00 2001 From: Silent Date: Wed, 16 Mar 2022 21:02:42 +0100 Subject: [PATCH] Refactor filename_valid_characters into Platform::IsFilenameValid --- src/openrct2-ui/windows/LoadSave.cpp | 4 ++-- src/openrct2-ui/windows/Themes.cpp | 4 ++-- src/openrct2-ui/windows/TitleEditor.cpp | 6 +++--- src/openrct2-ui/windows/TrackDesignManage.cpp | 4 ++-- src/openrct2/platform/Platform.h | 1 + src/openrct2/platform/Shared.cpp | 18 ++++++++++++------ src/openrct2/util/Util.cpp | 11 ----------- src/openrct2/util/Util.h | 2 -- 8 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/openrct2-ui/windows/LoadSave.cpp b/src/openrct2-ui/windows/LoadSave.cpp index a7d07e6335..7c55c87547 100644 --- a/src/openrct2-ui/windows/LoadSave.cpp +++ b/src/openrct2-ui/windows/LoadSave.cpp @@ -579,7 +579,7 @@ static void WindowLoadsaveTextinput(rct_window* w, rct_widgetindex widgetIndex, { case WIDX_NEW_FOLDER: { - if (!filename_valid_characters(text)) + if (!Platform::IsFilenameValid(text)) { context_show_error(STR_ERROR_INVALID_CHARACTERS, STR_NONE, {}); return; @@ -971,7 +971,7 @@ static bool IsValidPath(const char* path) // which handles multiple patterns auto filename = Path::GetFileNameWithoutExtension(path); - return filename_valid_characters(filename.c_str()); + return Platform::IsFilenameValid(filename); } static void WindowLoadsaveSelect(rct_window* w, const char* path) diff --git a/src/openrct2-ui/windows/Themes.cpp b/src/openrct2-ui/windows/Themes.cpp index 5af77f7cbd..607e1ebc40 100644 --- a/src/openrct2-ui/windows/Themes.cpp +++ b/src/openrct2-ui/windows/Themes.cpp @@ -19,8 +19,8 @@ #include #include #include +#include #include -#include enum { @@ -698,7 +698,7 @@ static void WindowThemesTextinput(rct_window* w, rct_widgetindex widgetIndex, ch { case WIDX_THEMES_DUPLICATE_BUTTON: case WIDX_THEMES_RENAME_BUTTON: - if (filename_valid_characters(text)) + if (Platform::IsFilenameValid(text)) { if (ThemeGetIndexForName(text) == SIZE_MAX) { diff --git a/src/openrct2-ui/windows/TitleEditor.cpp b/src/openrct2-ui/windows/TitleEditor.cpp index 53a76b5aa0..725b3dd2a9 100644 --- a/src/openrct2-ui/windows/TitleEditor.cpp +++ b/src/openrct2-ui/windows/TitleEditor.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -32,7 +33,6 @@ #include #include #include -#include #include using namespace OpenRCT2; @@ -635,7 +635,7 @@ static void WindowTitleEditorTextinput(rct_window* w, rct_widgetindex widgetInde case WIDX_TITLE_EDITOR_NEW_BUTTON: case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: case WIDX_TITLE_EDITOR_RENAME_BUTTON: - if (filename_valid_characters(text)) + if (Platform::IsFilenameValid(text)) { if (title_sequence_manager_get_index_for_name(text) == SIZE_MAX) { @@ -1137,7 +1137,7 @@ static void WindowTitleEditorAddParkCallback(int32_t result, const utf8* path) static void WindowTitleEditorRenamePark(size_t index, const utf8* name) { - if (!filename_valid_characters(name)) + if (!Platform::IsFilenameValid(name)) { context_show_error(STR_ERROR_INVALID_CHARACTERS, STR_NONE, {}); return; diff --git a/src/openrct2-ui/windows/TrackDesignManage.cpp b/src/openrct2-ui/windows/TrackDesignManage.cpp index 1e0890085b..dcebe49508 100644 --- a/src/openrct2-ui/windows/TrackDesignManage.cpp +++ b/src/openrct2-ui/windows/TrackDesignManage.cpp @@ -14,8 +14,8 @@ #include #include #include +#include #include -#include static constexpr const rct_string_id WINDOW_TITLE = STR_STRING; static constexpr const int32_t WH = 44; @@ -164,7 +164,7 @@ static void WindowTrackManageTextinput(rct_window* w, rct_widgetindex widgetInde return; } - if (!filename_valid_characters(text)) + if (!Platform::IsFilenameValid(text)) { context_show_error(STR_CANT_RENAME_TRACK_DESIGN, STR_NEW_NAME_CONTAINS_INVALID_CHARACTERS, {}); return; diff --git a/src/openrct2/platform/Platform.h b/src/openrct2/platform/Platform.h index 5aa9a04351..0a827fcd7d 100644 --- a/src/openrct2/platform/Platform.h +++ b/src/openrct2/platform/Platform.h @@ -71,6 +71,7 @@ namespace Platform uint64_t GetFileSize(std::string_view path); std::string ResolveCasing(std::string_view path, bool fileExists); std::string SanitiseFilename(std::string_view originalName); + bool IsFilenameValid(u8string_view fileName); uint16_t GetLocaleLanguage(); CurrencyType GetLocaleCurrency(); diff --git a/src/openrct2/platform/Shared.cpp b/src/openrct2/platform/Shared.cpp index 3bb9a2d216..e64f0ca90d 100644 --- a/src/openrct2/platform/Shared.cpp +++ b/src/openrct2/platform/Shared.cpp @@ -26,6 +26,12 @@ #include #include +#ifdef _WIN32 +static constexpr std::array _prohibitedCharacters = { '<', '>', '*', '\\', ':', '|', '?', '"', '/' }; +#else +static constexpr std::array _prohibitedCharacters = { '/' }; +#endif + namespace Platform { void CoreInit() @@ -96,22 +102,22 @@ namespace Platform 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(); + return std::find(_prohibitedCharacters.begin(), _prohibitedCharacters.end(), ch) != _prohibitedCharacters.end(); }, '_'); sanitised = String::Trim(sanitised); return sanitised; } + bool IsFilenameValid(u8string_view fileName) + { + return fileName.find_first_of(_prohibitedCharacters.data(), 0, _prohibitedCharacters.size()) == fileName.npos; + } + #ifndef __ANDROID__ float GetDefaultScale() { diff --git a/src/openrct2/util/Util.cpp b/src/openrct2/util/Util.cpp index 5a5574a540..e4b9b7c6b7 100644 --- a/src/openrct2/util/Util.cpp +++ b/src/openrct2/util/Util.cpp @@ -51,17 +51,6 @@ int32_t mph_to_dmps(int32_t mph) return (mph * 73243) >> 14; } -bool filename_valid_characters(const utf8* filename) -{ - for (int32_t i = 0; filename[i] != '\0'; i++) - { - if (filename[i] == '\\' || filename[i] == '/' || filename[i] == ':' || filename[i] == '?' || filename[i] == '*' - || filename[i] == '<' || filename[i] == '>' || filename[i] == '|') - return false; - } - return true; -} - int32_t bitscanforward(int32_t source) { #if defined(_MSC_VER) && (_MSC_VER >= 1400) // Visual Studio 2005 diff --git a/src/openrct2/util/Util.h b/src/openrct2/util/Util.h index b0f82f6fad..01290233b4 100644 --- a/src/openrct2/util/Util.h +++ b/src/openrct2/util/Util.h @@ -23,8 +23,6 @@ int32_t metres_to_feet(int32_t metres); int32_t mph_to_kmph(int32_t mph); int32_t mph_to_dmps(int32_t mph); -bool filename_valid_characters(const utf8* filename); - bool sse41_available(); bool avx2_available();