diff --git a/src/ObjCommon/Localize/CommonLocalizeEntry.cpp b/src/ObjCommon/Localize/CommonLocalizeEntry.cpp new file mode 100644 index 000000000..6d20809c7 --- /dev/null +++ b/src/ObjCommon/Localize/CommonLocalizeEntry.cpp @@ -0,0 +1,9 @@ +#include "CommonLocalizeEntry.h" + +CommonLocalizeEntry::CommonLocalizeEntry() = default; + +CommonLocalizeEntry::CommonLocalizeEntry(std::string key, std::string value) + : m_key(std::move(key)), + m_value(std::move(value)) +{ +} diff --git a/src/ObjCommon/Localize/CommonLocalizeEntry.h b/src/ObjCommon/Localize/CommonLocalizeEntry.h new file mode 100644 index 000000000..811ad33af --- /dev/null +++ b/src/ObjCommon/Localize/CommonLocalizeEntry.h @@ -0,0 +1,12 @@ +#pragma once +#include + +class CommonLocalizeEntry +{ +public: + std::string m_key; + std::string m_value; + + CommonLocalizeEntry(); + CommonLocalizeEntry(std::string key, std::string value); +}; diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 6295f5219..a4fd689ca 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -1,9 +1,6 @@ #include "AssetLoaderLocalizeEntry.h" -#include "Localize/LocalizeCommon.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include +#include "Localize/LocalizeCommonAssetLoader.h" using namespace IW4; @@ -25,29 +22,15 @@ bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const bool AssetLoaderLocalizeEntry::LoadFromRaw( const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const { - std::string fileName; - { - std::ostringstream str; - str << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - fileName = str.str(); - } - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); - - for (const auto& [key, value] : localizeEntries) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(key.c_str()); - localizeEntry->value = memory->Dup(value.c_str()); - - manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, key, localizeEntry); - } + LocalizeCommonAssetLoader commonLoader( + [memory, manager](const CommonLocalizeEntry& entry) + { + auto* localizeEntry = memory->Create(); + localizeEntry->name = memory->Dup(entry.m_key.c_str()); + localizeEntry->value = memory->Dup(entry.m_value.c_str()); - return true; + manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, entry.m_key, localizeEntry); + }); + + return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); } diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h index 9833c10bc..4dbf15218 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h @@ -1,4 +1,5 @@ #pragma once + #include "AssetLoading/BasicAssetLoader.h" #include "AssetLoading/IAssetLoadingManager.h" #include "Game/IW4/IW4.h" diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 52c4a53e0..f8c47383b 100644 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -1,9 +1,6 @@ #include "AssetLoaderLocalizeEntry.h" -#include "Localize/LocalizeCommon.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include +#include "Localize/LocalizeCommonAssetLoader.h" using namespace IW5; @@ -25,29 +22,15 @@ bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const bool AssetLoaderLocalizeEntry::LoadFromRaw( const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const { - std::string fileName; - { - std::ostringstream str; - str << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - fileName = str.str(); - } - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); - - for (const auto& [key, value] : localizeEntries) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(key.c_str()); - localizeEntry->value = memory->Dup(value.c_str()); - - manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, key, localizeEntry); - } + LocalizeCommonAssetLoader commonLoader( + [memory, manager](const CommonLocalizeEntry& entry) + { + auto* localizeEntry = memory->Create(); + localizeEntry->name = memory->Dup(entry.m_key.c_str()); + localizeEntry->value = memory->Dup(entry.m_value.c_str()); - return true; + manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, entry.m_key, localizeEntry); + }); + + return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); } diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h index d21c80c70..e35c2fd51 100644 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h +++ b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h @@ -1,4 +1,5 @@ #pragma once + #include "AssetLoading/BasicAssetLoader.h" #include "AssetLoading/IAssetLoadingManager.h" #include "Game/IW5/IW5.h" diff --git a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 05e353a97..6152f8775 100644 --- a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -1,9 +1,6 @@ #include "AssetLoaderLocalizeEntry.h" -#include "Localize/LocalizeCommon.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include +#include "Localize/LocalizeCommonAssetLoader.h" using namespace T5; @@ -25,29 +22,15 @@ bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const bool AssetLoaderLocalizeEntry::LoadFromRaw( const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const { - std::string fileName; - { - std::ostringstream str; - str << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - fileName = str.str(); - } - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); - - for (const auto& [key, value] : localizeEntries) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(key.c_str()); - localizeEntry->value = memory->Dup(value.c_str()); - - manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, key, localizeEntry); - } + LocalizeCommonAssetLoader commonLoader( + [memory, manager](const CommonLocalizeEntry& entry) + { + auto* localizeEntry = memory->Create(); + localizeEntry->name = memory->Dup(entry.m_key.c_str()); + localizeEntry->value = memory->Dup(entry.m_value.c_str()); - return true; + manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, entry.m_key, localizeEntry); + }); + + return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); } diff --git a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h index b311172cc..005f51cc3 100644 --- a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h +++ b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h @@ -1,4 +1,5 @@ #pragma once + #include "AssetLoading/BasicAssetLoader.h" #include "AssetLoading/IAssetLoadingManager.h" #include "Game/T5/T5.h" diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp index 9dda88e42..2aaa13e53 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp @@ -1,9 +1,6 @@ #include "AssetLoaderLocalizeEntry.h" -#include "Localize/LocalizeCommon.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include +#include "Localize/LocalizeCommonAssetLoader.h" using namespace T6; @@ -25,29 +22,15 @@ bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const bool AssetLoaderLocalizeEntry::LoadFromRaw( const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const { - std::string fileName; - { - std::ostringstream str; - str << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - fileName = str.str(); - } - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - const auto localizeEntries = reader.ReadLocalizeFile(); - - for (const auto& [key, value] : localizeEntries) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(key.c_str()); - localizeEntry->value = memory->Dup(value.c_str()); - - manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, key, localizeEntry); - } + LocalizeCommonAssetLoader commonLoader( + [memory, manager](const CommonLocalizeEntry& entry) + { + auto* localizeEntry = memory->Create(); + localizeEntry->name = memory->Dup(entry.m_key.c_str()); + localizeEntry->value = memory->Dup(entry.m_value.c_str()); - return true; + manager->AddAsset(ASSET_TYPE_LOCALIZE_ENTRY, entry.m_key, localizeEntry); + }); + + return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); } diff --git a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp new file mode 100644 index 000000000..bbfd8bd35 --- /dev/null +++ b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp @@ -0,0 +1,42 @@ +#include "LocalizeCommonAssetLoader.h" + +#include "Localize/LocalizeCommon.h" +#include "Localize/LocalizeReadingZoneState.h" +#include "Localize/Parsing/LocalizeFileReader.h" + +#include + +LocalizeCommonAssetLoader::LocalizeCommonAssetLoader(std::function entryCallback) + : m_entry_callback(std::move(entryCallback)) +{ +} + +std::string LocalizeCommonAssetLoader::GetFileName(const std::string& assetName, Zone* zone) const +{ + std::ostringstream ss; + ss << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; + return ss.str(); +} + +bool LocalizeCommonAssetLoader::LoadLocalizeAsset(const std::string& assetName, ISearchPath* searchPath, IAssetLoadingManager* manager, Zone* zone) const +{ + std::string fileName = GetFileName(assetName, zone); + + const auto file = searchPath->Open(fileName); + if (!file.IsOpen()) + return false; + + auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); + LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); + + std::vector localizeEntries; + if (!reader.ReadLocalizeFile(localizeEntries)) + return false; + + for (const auto& entry : localizeEntries) + { + m_entry_callback(entry); + } + + return true; +} diff --git a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h new file mode 100644 index 000000000..0955b6309 --- /dev/null +++ b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h @@ -0,0 +1,22 @@ +#pragma once + +#include "AssetLoading/IAssetLoadingManager.h" +#include "Localize/CommonLocalizeEntry.h" +#include "SearchPath/ISearchPath.h" +#include "Zone/Zone.h" + +#include +#include + +class LocalizeCommonAssetLoader +{ +public: + explicit LocalizeCommonAssetLoader(std::function entryCallback); + + bool LoadLocalizeAsset(const std::string& assetName, ISearchPath* searchPath, IAssetLoadingManager* manager, Zone* zone) const; + +private: + std::string GetFileName(const std::string& assetName, Zone* zone) const; + + std::function m_entry_callback; +}; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp index 56413ac65..35958c067 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp @@ -32,7 +32,7 @@ const std::vector::se return !m_state->m_end ? tests : noTests; } -std::map LocalizeFileParser::GetParsedValues() +std::vector LocalizeFileParser::GetParsedValues() { return std::move(m_state->m_entries); } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h index e9072cf2f..20b5b39bc 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h @@ -13,5 +13,5 @@ class LocalizeFileParser final : public AbstractParser GetParsedValues(); + std::vector GetParsedValues(); }; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp index 35dbc8086..0a52c5f8b 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp @@ -1,6 +1,7 @@ #include "LocalizeFileParserState.h" #include "Localize/LocalizeCommon.h" +#include "Utils/StringUtils.h" LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language, LocalizeReadingZoneState* zoneState) : m_end(false), @@ -8,6 +9,5 @@ LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language, Lo m_zone_state(zoneState) { m_language_name_caps = LocalizeCommon::GetNameOfLanguage(m_language); - for (auto& c : m_language_name_caps) - c = static_cast(toupper(c)); + utils::MakeStringUpperCase(m_language_name_caps); } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h index ad83741ea..bee910d78 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h @@ -1,17 +1,18 @@ #pragma once #include "Game/GameLanguage.h" +#include "Localize/CommonLocalizeEntry.h" #include "Localize/LocalizeReadingZoneState.h" -#include #include +#include class LocalizeFileParserState { public: bool m_end; - std::map m_entries; + std::vector m_entries; GameLanguage m_language; LocalizeReadingZoneState* m_zone_state; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp index a2c1a3444..fbe1ff23b 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp @@ -28,7 +28,7 @@ void LocalizeFileReader::SetupStreamProxies() m_stream = m_open_streams.back().get(); } -std::map LocalizeFileReader::ReadLocalizeFile() +bool LocalizeFileReader::ReadLocalizeFile(std::vector& entries) { SimpleLexer::Config lexerConfig; lexerConfig.m_emit_new_line_tokens = true; @@ -41,8 +41,11 @@ std::map LocalizeFileReader::ReadLocalizeFile() const auto parser = std::make_unique(lexer.get(), m_language, m_zone_state); if (parser->Parse()) - return parser->GetParsedValues(); + { + entries = parser->GetParsedValues(); + return true; + } - std::cout << "Parsing localization file failed!" << std::endl; - return std::map(); + std::cerr << "Parsing localization file failed!" << std::endl; + return false; } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h index cf4572bc8..1abb4d600 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h @@ -1,6 +1,7 @@ #pragma once #include "Game/GameLanguage.h" +#include "Localize/CommonLocalizeEntry.h" #include "Localize/LocalizeReadingZoneState.h" #include "Parsing/IParserLineStream.h" @@ -23,5 +24,5 @@ class LocalizeFileReader public: LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState); - std::map ReadLocalizeFile(); + bool ReadLocalizeFile(std::vector& entries); }; diff --git a/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp b/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp index 064a5fcd6..fbf8110bf 100644 --- a/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp +++ b/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp @@ -38,6 +38,6 @@ void SequenceLocalizeFileLanguageValue::ProcessMatch(LocalizeFileParserState* st std::cout << "Localize: a value for reference \"" << currentReference << "\" was already defined\n"; } - state->m_entries[currentReference] = valueToken.StringValue(); + state->m_entries.emplace_back(currentReference, valueToken.StringValue()); } }