From 93e50601379b9e68deec9c22aa45ba69dd36253e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 5 Dec 2022 11:55:23 +0100 Subject: [PATCH] Load and cache langValuesMapping on demand --- Common/Data/Format/IniFile.cpp | 29 +++++++++++++++++++++-------- Common/Data/Format/IniFile.h | 20 +++++++++++--------- Core/Config.cpp | 21 +++++++++++++-------- Core/Config.h | 5 ++++- Core/Dialog/PSPOskDialog.cpp | 2 +- UI/MiscScreens.cpp | 14 +++++++++----- UI/MiscScreens.h | 1 - 7 files changed, 59 insertions(+), 33 deletions(-) diff --git a/Common/Data/Format/IniFile.cpp b/Common/Data/Format/IniFile.cpp index cd2a658e5c..72aeee6f89 100644 --- a/Common/Data/Format/IniFile.cpp +++ b/Common/Data/Format/IniFile.cpp @@ -174,6 +174,19 @@ std::string* Section::GetLine(const char* key, std::string* valueOut, std::strin return 0; } +const std::string* Section::GetLine(const char* key, std::string* valueOut, std::string* commentOut) const +{ + for (std::vector::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) + { + const std::string& line = *iter; + std::string lineKey; + ParseLine(line, &lineKey, valueOut, commentOut); + if (!strcasecmp(lineKey.c_str(), key)) + return &line; + } + return 0; +} + void Section::Set(const char* key, uint32_t newValue) { Set(key, StringFromFormat("0x%08x", newValue).c_str()); } @@ -218,7 +231,7 @@ void Section::Set(const char* key, const std::string& newValue, const std::strin Delete(key); } -bool Section::Get(const char* key, std::string* value, const char* defaultValue) +bool Section::Get(const char* key, std::string* value, const char* defaultValue) const { const std::string* line = GetLine(key, value, 0); if (!line) @@ -275,7 +288,7 @@ void Section::AddComment(const std::string &comment) { lines.emplace_back("# " + comment); } -bool Section::Get(const char* key, std::vector& values) +bool Section::Get(const char* key, std::vector& values) const { std::string temp; bool retval = Get(key, &temp, 0); @@ -303,7 +316,7 @@ bool Section::Get(const char* key, std::vector& values) return true; } -bool Section::Get(const char* key, int* value, int defaultValue) +bool Section::Get(const char* key, int* value, int defaultValue) const { std::string temp; bool retval = Get(key, &temp, 0); @@ -313,7 +326,7 @@ bool Section::Get(const char* key, int* value, int defaultValue) return false; } -bool Section::Get(const char* key, uint32_t* value, uint32_t defaultValue) +bool Section::Get(const char* key, uint32_t* value, uint32_t defaultValue) const { std::string temp; bool retval = Get(key, &temp, 0); @@ -323,7 +336,7 @@ bool Section::Get(const char* key, uint32_t* value, uint32_t defaultValue) return false; } -bool Section::Get(const char* key, uint64_t* value, uint64_t defaultValue) +bool Section::Get(const char* key, uint64_t* value, uint64_t defaultValue) const { std::string temp; bool retval = Get(key, &temp, 0); @@ -333,7 +346,7 @@ bool Section::Get(const char* key, uint64_t* value, uint64_t defaultValue) return false; } -bool Section::Get(const char* key, bool* value, bool defaultValue) +bool Section::Get(const char* key, bool* value, bool defaultValue) const { std::string temp; bool retval = Get(key, &temp, 0); @@ -343,7 +356,7 @@ bool Section::Get(const char* key, bool* value, bool defaultValue) return false; } -bool Section::Get(const char* key, float* value, float defaultValue) +bool Section::Get(const char* key, float* value, float defaultValue) const { std::string temp; bool retval = Get(key, &temp, 0); @@ -353,7 +366,7 @@ bool Section::Get(const char* key, float* value, float defaultValue) return false; } -bool Section::Get(const char* key, double* value, double defaultValue) +bool Section::Get(const char* key, double* value, double defaultValue) const { std::string temp; bool retval = Get(key, &temp, 0); diff --git a/Common/Data/Format/IniFile.h b/Common/Data/Format/IniFile.h index 87bd1d1830..707f0ab3eb 100644 --- a/Common/Data/Format/IniFile.h +++ b/Common/Data/Format/IniFile.h @@ -25,14 +25,16 @@ public: std::map ToMap() const; - std::string* GetLine(const char* key, std::string* valueOut, std::string* commentOut); + std::string *GetLine(const char* key, std::string* valueOut, std::string* commentOut); + const std::string *GetLine(const char* key, std::string* valueOut, std::string* commentOut) const; + void Set(const char* key, const char* newValue); void Set(const char* key, const std::string& newValue, const std::string& defaultValue); void Set(const std::string &key, const std::string &value) { Set(key.c_str(), value.c_str()); } - bool Get(const char* key, std::string* value, const char* defaultValue); + bool Get(const char* key, std::string* value, const char* defaultValue) const; void Set(const char* key, uint32_t newValue); void Set(const char* key, uint64_t newValue); @@ -57,13 +59,13 @@ public: void AddComment(const std::string &comment); - bool Get(const char* key, int* value, int defaultValue = 0); - bool Get(const char* key, uint32_t* value, uint32_t defaultValue = 0); - bool Get(const char* key, uint64_t* value, uint64_t defaultValue = 0); - bool Get(const char* key, bool* value, bool defaultValue = false); - bool Get(const char* key, float* value, float defaultValue = false); - bool Get(const char* key, double* value, double defaultValue = false); - bool Get(const char* key, std::vector& values); + bool Get(const char* key, int* value, int defaultValue = 0) const; + bool Get(const char* key, uint32_t* value, uint32_t defaultValue = 0) const; + bool Get(const char* key, uint64_t* value, uint64_t defaultValue = 0) const; + bool Get(const char* key, bool* value, bool defaultValue = false) const; + bool Get(const char* key, float* value, float defaultValue = false) const; + bool Get(const char* key, double* value, double defaultValue = false) const; + bool Get(const char* key, std::vector& values) const; bool operator < (const Section& other) const { return name_ < other.name_; diff --git a/Core/Config.cpp b/Core/Config.cpp index b053500bf1..24497fc89a 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1124,9 +1124,10 @@ static int DefaultSystemParamLanguage() { int defaultLang = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; if (g_Config.bFirstRun) { // TODO: Be smart about same language, different country - auto langValuesMapping = GetLangValuesMapping(); - if (langValuesMapping.find(g_Config.sLanguageIni) != langValuesMapping.end()) { - defaultLang = langValuesMapping[g_Config.sLanguageIni].second; + auto &langValuesMapping = g_Config.GetLangValuesMapping(); + auto iter = langValuesMapping.find(g_Config.sLanguageIni); + if (iter != langValuesMapping.end()) { + defaultLang = iter->second.second; } } return defaultLang; @@ -1273,14 +1274,12 @@ Config::~Config() { delete private_; } -std::map> GetLangValuesMapping() { - std::map> langValuesMapping; +void Config::LoadLangValuesMapping() { IniFile mapping; mapping.LoadFromVFS("langregion.ini"); std::vector keys; mapping.GetKeys("LangRegionNames", keys); - std::map langCodeMapping; langCodeMapping["JAPANESE"] = PSP_SYSTEMPARAM_LANGUAGE_JAPANESE; langCodeMapping["ENGLISH"] = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; @@ -1306,9 +1305,15 @@ std::map> GetLangValuesMapping() { int iLangCode = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; if (langCodeMapping.find(langCode) != langCodeMapping.end()) iLangCode = langCodeMapping[langCode]; - langValuesMapping[keys[i]] = std::make_pair(langName, iLangCode); + langValuesMapping_[keys[i]] = std::make_pair(langName, iLangCode); } - return langValuesMapping; +} + +const std::map> &Config::GetLangValuesMapping() { + if (langValuesMapping_.empty()) { + LoadLangValuesMapping(); + } + return langValuesMapping_; } void Config::Reload() { diff --git a/Core/Config.h b/Core/Config.h index 342b5c3450..64d17da3a1 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -568,21 +568,24 @@ public: bool HasRecentIsos() const; void ClearRecentIsos(); + const std::map> &GetLangValuesMapping(); + protected: void LoadStandardControllerIni(); + void LoadLangValuesMapping(); private: bool reload_ = false; std::string gameId_; std::string gameIdTitle_; std::vector recentIsos; + std::map> langValuesMapping_; Path iniFilename_; Path controllerIniFilename_; Path searchPath_; ConfigPrivate *private_ = nullptr; }; -std::map> GetLangValuesMapping(); std::string CreateRandMAC(); // TODO: Find a better place for this. diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index 36574f3522..54f2ea723d 100755 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -346,7 +346,7 @@ int PSPOskDialog::Init(u32 oskPtr) { inputChars += c; } - languageMapping = GetLangValuesMapping(); + languageMapping = g_Config.GetLangValuesMapping(); // Eat any keys pressed before the dialog inited. UpdateButtons(); diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 769fb2f01f..505897dba6 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -619,7 +619,7 @@ NewLanguageScreen::NewLanguageScreen(const std::string &title) : ListPopupScreen #ifdef _MSC_VER #pragma warning(disable:4566) #endif - langValuesMapping = GetLangValuesMapping(); + auto &langValuesMapping = g_Config.GetLangValuesMapping(); std::vector tempLangs; VFSGetFileListing("lang", &tempLangs, "ini"); @@ -655,11 +655,12 @@ NewLanguageScreen::NewLanguageScreen(const std::string &title) : ListPopupScreen std::string buttonTitle = lang.name; if (!code.empty()) { - if (langValuesMapping.find(code) == langValuesMapping.end()) { + auto iter = langValuesMapping.find(code); + if (iter == langValuesMapping.end()) { // No title found, show locale code buttonTitle = code; } else { - buttonTitle = langValuesMapping[code].first; + buttonTitle = iter->second.first; } } if (g_Config.sLanguageIni == code) @@ -700,11 +701,14 @@ void NewLanguageScreen::OnCompleted(DialogResult result) { if (iniLoadedSuccessfully) { // Dunno what else to do here. - if (langValuesMapping.find(code) == langValuesMapping.end()) { + auto &langValuesMapping = g_Config.GetLangValuesMapping(); + + auto iter = langValuesMapping.find(code); + if (iter == langValuesMapping.end()) { // Fallback to English g_Config.iLanguage = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; } else { - g_Config.iLanguage = langValuesMapping[code].second; + g_Config.iLanguage = iter->second.second; } RecreateViews(); } else { diff --git a/UI/MiscScreens.h b/UI/MiscScreens.h index 341e3b7915..6166fdb94a 100644 --- a/UI/MiscScreens.h +++ b/UI/MiscScreens.h @@ -106,7 +106,6 @@ public: private: void OnCompleted(DialogResult result) override; bool ShowButtons() const override { return true; } - std::map> langValuesMapping; std::map titleCodeMapping; std::vector langs_; };