Load and cache langValuesMapping on demand

This commit is contained in:
Henrik Rydgård 2022-12-05 11:55:23 +01:00
parent 4233e8dece
commit 93e5060137
7 changed files with 59 additions and 33 deletions

View File

@ -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<std::string>::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<std::string>& values)
bool Section::Get(const char* key, std::vector<std::string>& values) const
{
std::string temp;
bool retval = Get(key, &temp, 0);
@ -303,7 +316,7 @@ bool Section::Get(const char* key, std::vector<std::string>& 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);

View File

@ -25,14 +25,16 @@ public:
std::map<std::string, std::string> 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<std::string>& 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<std::string>& values) const;
bool operator < (const Section& other) const {
return name_ < other.name_;

View File

@ -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<std::string, std::pair<std::string, int>> GetLangValuesMapping() {
std::map<std::string, std::pair<std::string, int>> langValuesMapping;
void Config::LoadLangValuesMapping() {
IniFile mapping;
mapping.LoadFromVFS("langregion.ini");
std::vector<std::string> keys;
mapping.GetKeys("LangRegionNames", keys);
std::map<std::string, int> langCodeMapping;
langCodeMapping["JAPANESE"] = PSP_SYSTEMPARAM_LANGUAGE_JAPANESE;
langCodeMapping["ENGLISH"] = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH;
@ -1306,9 +1305,15 @@ std::map<std::string, std::pair<std::string, int>> 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<std::string, std::pair<std::string, int>> &Config::GetLangValuesMapping() {
if (langValuesMapping_.empty()) {
LoadLangValuesMapping();
}
return langValuesMapping_;
}
void Config::Reload() {

View File

@ -568,21 +568,24 @@ public:
bool HasRecentIsos() const;
void ClearRecentIsos();
const std::map<std::string, std::pair<std::string, int>> &GetLangValuesMapping();
protected:
void LoadStandardControllerIni();
void LoadLangValuesMapping();
private:
bool reload_ = false;
std::string gameId_;
std::string gameIdTitle_;
std::vector<std::string> recentIsos;
std::map<std::string, std::pair<std::string, int>> langValuesMapping_;
Path iniFilename_;
Path controllerIniFilename_;
Path searchPath_;
ConfigPrivate *private_ = nullptr;
};
std::map<std::string, std::pair<std::string, int>> GetLangValuesMapping();
std::string CreateRandMAC();
// TODO: Find a better place for this.

View File

@ -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();

View File

@ -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<File::FileInfo> 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 {

View File

@ -106,7 +106,6 @@ public:
private:
void OnCompleted(DialogResult result) override;
bool ShowButtons() const override { return true; }
std::map<std::string, std::pair<std::string, int>> langValuesMapping;
std::map<std::string, std::string> titleCodeMapping;
std::vector<File::FileInfo> langs_;
};