diff --git a/src/ObjCommon/Game/IW4/InfoStringIW4.cpp b/src/ObjCommon/Game/IW4/InfoStringIW4.cpp deleted file mode 100644 index 362e6528..00000000 --- a/src/ObjCommon/Game/IW4/InfoStringIW4.cpp +++ /dev/null @@ -1,171 +0,0 @@ -#include "InfoStringIW4.h" - -#include - -using namespace IW4; - -void InfoStringToStructConverter::FillStructure() -{ -} - -InfoStringToStructConverter::InfoStringToStructConverter(const InfoString& infoString, void* structure, - const cspField_t* fields, const size_t fieldCount) - : InfoStringToStructConverterBase(infoString, structure), - m_fields(fields), - m_field_count(fieldCount) -{ -} - -void InfoStringFromStructConverter::FillFromBaseField(const cspField_t& field) -{ - switch (static_cast(field.iFieldType)) - { - case CSPFT_STRING: - FillFromString(std::string(field.szName), field.iOffset); - break; - - case CSPFT_STRING_MAX_STRING_CHARS: - FillFromStringBuffer(std::string(field.szName), field.iOffset, 1024); - break; - - case CSPFT_STRING_MAX_QPATH: - FillFromStringBuffer(std::string(field.szName), field.iOffset, 64); - break; - - case CSPFT_STRING_MAX_OSPATH: - FillFromStringBuffer(std::string(field.szName), field.iOffset, 256); - break; - - case CSPFT_INT: - FillFromInt(std::string(field.szName), field.iOffset); - break; - - case CSPFT_QBOOLEAN: - FillFromQBoolean(std::string(field.szName), field.iOffset); - break; - - case CSPFT_BOOL: - FillFromBool(std::string(field.szName), field.iOffset); - break; - - case CSPFT_FLOAT: - FillFromFloat(std::string(field.szName), field.iOffset); - break; - - case CSPFT_MPH_TO_INCHES_PER_SEC: - { - const auto* num = reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); - m_info_string.SetValueForKey(std::string(field.szName), std::to_string(*num / 17.6f)); - break; - } - - case CSPFT_MILLISECONDS: - FillFromMilliseconds(std::string(field.szName), field.iOffset); - break; - - case CSPFT_FX: - { - const auto* fx = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); - - if (fx) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(fx->name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_XMODEL: - { - const auto* model = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); - - if (model) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(model->name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_MATERIAL: - { - const auto* material = *reinterpret_cast(reinterpret_cast(m_structure) + field. - iOffset); - - if (material) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(material->info.name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_PHYS_COLLMAP: - { - const auto* physCollMap = *reinterpret_cast(reinterpret_cast(m_structure) + field. - iOffset); - - if (physCollMap) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(physCollMap->name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_SOUND: - { - const auto* sndAlias = reinterpret_cast(reinterpret_cast(m_structure) + field. - iOffset); - - if (sndAlias->name) - m_info_string.SetValueForKey(std::string(field.szName), std::string(sndAlias->name->soundName)); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_TRACER: - { - const auto* tracer = *reinterpret_cast(reinterpret_cast(m_structure) + field. - iOffset); - - if (tracer) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(tracer->name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_NUM_BASE_FIELD_TYPES: - default: - assert(false); - break; - } -} - -void InfoStringFromStructConverter::FillInfoString() -{ - for (auto fieldIndex = 0u; fieldIndex < m_field_count; fieldIndex++) - { - const auto& field = m_fields[fieldIndex]; - assert(field.iFieldType >= 0); - - if (field.iFieldType < CSPFT_NUM_BASE_FIELD_TYPES) - FillFromBaseField(field); - else - FillFromExtensionField(field); - } -} - -InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, - const size_t fieldCount) - : InfoStringFromStructConverterBase(structure), - m_fields(fields), - m_field_count(fieldCount) -{ -} - -InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, const size_t fieldCount, - std::function scriptStringValueCallback) - : InfoStringFromStructConverterBase(structure, std::move(scriptStringValueCallback)), - m_fields(fields), - m_field_count(fieldCount) -{ -} diff --git a/src/ObjCommon/Game/T6/InfoStringT6.cpp b/src/ObjCommon/Game/T6/InfoStringT6.cpp deleted file mode 100644 index 6098fbd7..00000000 --- a/src/ObjCommon/Game/T6/InfoStringT6.cpp +++ /dev/null @@ -1,168 +0,0 @@ -#include "InfoStringT6.h" - -#include - -using namespace T6; - -void InfoStringToStructConverter::FillStructure() -{ -} - -InfoStringToStructConverter::InfoStringToStructConverter(const InfoString& infoString, void* structure, - const cspField_t* fields, const size_t fieldCount) - : InfoStringToStructConverterBase(infoString, structure), - m_fields(fields), - m_field_count(fieldCount) -{ -} - -void InfoStringFromStructConverter::FillFromBaseField(const cspField_t& field) -{ - switch (static_cast(field.iFieldType)) - { - case CSPFT_STRING: - FillFromString(std::string(field.szName), field.iOffset); - break; - - case CSPFT_STRING_MAX_STRING_CHARS: - FillFromStringBuffer(std::string(field.szName), field.iOffset, 1024); - break; - - case CSPFT_STRING_MAX_QPATH: - FillFromStringBuffer(std::string(field.szName), field.iOffset, 64); - break; - - case CSPFT_STRING_MAX_OSPATH: - FillFromStringBuffer(std::string(field.szName), field.iOffset, 256); - break; - - case CSPFT_INT: - FillFromInt(std::string(field.szName), field.iOffset); - break; - - case CSPFT_UINT: - FillFromUint(std::string(field.szName), field.iOffset); - break; - - case CSPFT_BOOL: - FillFromBool(std::string(field.szName), field.iOffset); - break; - - case CSPFT_QBOOLEAN: - FillFromQBoolean(std::string(field.szName), field.iOffset); - break; - - case CSPFT_FLOAT: - FillFromFloat(std::string(field.szName), field.iOffset); - break; - - case CSPFT_MILLISECONDS: - FillFromMilliseconds(std::string(field.szName), field.iOffset); - break; - - case CSPFT_FX: - { - const auto* fx = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); - - if (fx) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(fx->name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_XMODEL: - { - const auto* model = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); - - if (model) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(model->name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_MATERIAL: - case CSPFT_MATERIAL_STREAM: - { - const auto* material = *reinterpret_cast(reinterpret_cast(m_structure) + field. - iOffset); - - if (material) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(material->info.name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_PHYS_PRESET: - { - const auto* physPreset = *reinterpret_cast(reinterpret_cast(m_structure) + field. - iOffset); - - if (physPreset) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(physPreset->name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_SCRIPT_STRING: - FillFromScriptString(std::string(field.szName), field.iOffset); - break; - - case CSPFT_TRACER: - { - const auto* tracer = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); - - if (tracer) - m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(tracer->name))); - else - m_info_string.SetValueForKey(std::string(field.szName), ""); - break; - } - - case CSPFT_SOUND_ALIAS_ID: - { - // TODO: Search sound files for files matching the hash - const auto* hash = reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); - m_info_string.SetValueForKey(std::string(field.szName), "@" + std::to_string(*hash)); - break; - } - - case CSPFT_NUM_BASE_FIELD_TYPES: - default: - assert(false); - break; - } -} - -void InfoStringFromStructConverter::FillInfoString() -{ - for (auto fieldIndex = 0u; fieldIndex < m_field_count; fieldIndex++) - { - const auto& field = m_fields[fieldIndex]; - assert(field.iFieldType >= 0); - - if (field.iFieldType < CSPFT_NUM_BASE_FIELD_TYPES) - FillFromBaseField(field); - else - FillFromExtensionField(field); - } -} - -InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, - const size_t fieldCount) - : InfoStringFromStructConverterBase(structure), - m_fields(fields), - m_field_count(fieldCount) -{ -} - -InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, const size_t fieldCount, - std::function scriptStringValueCallback) - : InfoStringFromStructConverterBase(structure, std::move(scriptStringValueCallback)), - m_fields(fields), - m_field_count(fieldCount) -{ -} diff --git a/src/ObjCommon/InfoString/InfoString.cpp b/src/ObjCommon/InfoString/InfoString.cpp new file mode 100644 index 00000000..0b39f0bd --- /dev/null +++ b/src/ObjCommon/InfoString/InfoString.cpp @@ -0,0 +1,105 @@ +#include "InfoString.h" + +#include +#include + +const std::string InfoString::EMPTY_VALUE; + +bool InfoString::HasKey(const std::string& key) const +{ + return m_values.find(key) != m_values.end(); +} + +const std::string& InfoString::GetValueForKey(const std::string& key) const +{ + const auto& value = m_values.find(key); + + if (value == m_values.end()) + return EMPTY_VALUE; + + return value->second; +} + +const std::string& InfoString::GetValueForKey(const std::string& key, bool* foundValue) const +{ + const auto& value = m_values.find(key); + + if (value == m_values.end()) + { + if (foundValue) + *foundValue = false; + return EMPTY_VALUE; + } + + if (foundValue) + *foundValue = true; + return value->second; +} + +void InfoString::SetValueForKey(const std::string& key, std::string value) +{ + if (!HasKey(key)) + m_keys_by_insertion.push_back(key); + + m_values[key] = std::move(value); +} + +void InfoString::RemoveKey(const std::string& key) +{ + const auto& value = m_values.find(key); + + if (value != m_values.end()) + m_values.erase(value); +} + +std::string InfoString::ToString() const +{ + std::stringstream ss; + bool first = true; + + for (const auto& key : m_keys_by_insertion) + { + const auto value = m_values.find(key); + if (!first) + ss << '\\'; + else + first = false; + + ss << key << '\\' << value->second; + } + + return ss.str(); +} + +std::string InfoString::ToString(const std::string& prefix) const +{ + std::stringstream ss; + ss << prefix; + + for (const auto& key : m_keys_by_insertion) + { + const auto value = m_values.find(key); + ss << '\\' << key << '\\' << value->second; + } + + return ss.str(); +} + +void InfoString::ToGdtProperties(const std::string& prefix, GdtEntry& gdtEntry) const +{ + for (const auto& key : m_keys_by_insertion) + { + const auto value = m_values.find(key); + gdtEntry.m_properties[key] = value->second; + } + + gdtEntry.m_properties["configstringFileType"] = prefix; +} + +void InfoString::FromString() +{ +} + +void InfoString::FromString(const std::string& prefix) +{ +} diff --git a/src/ObjCommon/InfoString/InfoString.h b/src/ObjCommon/InfoString/InfoString.h new file mode 100644 index 00000000..86ac1690 --- /dev/null +++ b/src/ObjCommon/InfoString/InfoString.h @@ -0,0 +1,28 @@ +#pragma once +#include +#include +#include + +#include "Utils/ClassUtils.h" +#include "Obj/Gdt/GdtEntry.h" + +class InfoString +{ + static const std::string EMPTY_VALUE; + std::unordered_map m_values; + std::vector m_keys_by_insertion; + +public: + _NODISCARD bool HasKey(const std::string& key) const; + _NODISCARD const std::string& GetValueForKey(const std::string& key) const; + const std::string& GetValueForKey(const std::string& key, bool* foundValue) const; + void SetValueForKey(const std::string& key, std::string value); + void RemoveKey(const std::string& key); + + _NODISCARD std::string ToString() const; + _NODISCARD std::string ToString(const std::string& prefix) const; + void ToGdtProperties(const std::string& prefix, GdtEntry& gdtEntry) const; + + void FromString(); + void FromString(const std::string& prefix); +}; \ No newline at end of file diff --git a/src/ObjLoading/Game/IW4/InfoString/InfoStringToStructConverter.cpp b/src/ObjLoading/Game/IW4/InfoString/InfoStringToStructConverter.cpp new file mode 100644 index 00000000..edd1f053 --- /dev/null +++ b/src/ObjLoading/Game/IW4/InfoString/InfoStringToStructConverter.cpp @@ -0,0 +1,15 @@ +#include "InfoStringToStructConverter.h" + +using namespace IW4; + +void InfoStringToStructConverter::FillStructure() +{ +} + +InfoStringToStructConverter::InfoStringToStructConverter(const InfoString& infoString, void* structure, + const cspField_t* fields, const size_t fieldCount) + : InfoStringToStructConverterBase(infoString, structure), + m_fields(fields), + m_field_count(fieldCount) +{ +} \ No newline at end of file diff --git a/src/ObjLoading/Game/IW4/InfoString/InfoStringToStructConverter.h b/src/ObjLoading/Game/IW4/InfoString/InfoStringToStructConverter.h new file mode 100644 index 00000000..eb51a804 --- /dev/null +++ b/src/ObjLoading/Game/IW4/InfoString/InfoStringToStructConverter.h @@ -0,0 +1,18 @@ +#pragma once +#include "InfoString/InfoStringToStructConverterBase.h" +#include "Game/IW4/IW4.h" + +namespace IW4 +{ + class InfoStringToStructConverter : public InfoStringToStructConverterBase + { + const cspField_t* m_fields; + size_t m_field_count; + + protected: + void FillStructure() override; + + public: + InfoStringToStructConverter(const InfoString& infoString, void* structure, const cspField_t* fields, size_t fieldCount); + }; +} \ No newline at end of file diff --git a/src/ObjLoading/Game/T6/InfoString/InfoStringToStructConverter.cpp b/src/ObjLoading/Game/T6/InfoString/InfoStringToStructConverter.cpp new file mode 100644 index 00000000..8a1afdcb --- /dev/null +++ b/src/ObjLoading/Game/T6/InfoString/InfoStringToStructConverter.cpp @@ -0,0 +1,17 @@ +#include "InfoStringToStructConverter.h" + +#include + +using namespace T6; + +void InfoStringToStructConverter::FillStructure() +{ +} + +InfoStringToStructConverter::InfoStringToStructConverter(const InfoString& infoString, void* structure, + const cspField_t* fields, const size_t fieldCount) + : InfoStringToStructConverterBase(infoString, structure), + m_fields(fields), + m_field_count(fieldCount) +{ +} \ No newline at end of file diff --git a/src/ObjLoading/Game/T6/InfoString/InfoStringToStructConverter.h b/src/ObjLoading/Game/T6/InfoString/InfoStringToStructConverter.h new file mode 100644 index 00000000..3afc1201 --- /dev/null +++ b/src/ObjLoading/Game/T6/InfoString/InfoStringToStructConverter.h @@ -0,0 +1,18 @@ +#pragma once +#include "InfoString/InfoStringToStructConverterBase.h" +#include "Game/T6/T6.h" + +namespace T6 +{ + class InfoStringToStructConverter : public InfoStringToStructConverterBase + { + const cspField_t* m_fields; + size_t m_field_count; + + protected: + void FillStructure() override; + + public: + InfoStringToStructConverter(const InfoString& infoString, void* structure, const cspField_t* fields, size_t fieldCount); + }; +} \ No newline at end of file diff --git a/src/ObjLoading/InfoString/InfoStringToStructConverterBase.cpp b/src/ObjLoading/InfoString/InfoStringToStructConverterBase.cpp new file mode 100644 index 00000000..e34e6f30 --- /dev/null +++ b/src/ObjLoading/InfoString/InfoStringToStructConverterBase.cpp @@ -0,0 +1,15 @@ +#include "InfoStringToStructConverterBase.h" + +InfoStringToStructConverterBase::InfoStringToStructConverterBase(const InfoString& infoString, void* structure) + : m_info_string(infoString), + m_structure(structure) +{ +} + +InfoStringToStructConverterBase::~InfoStringToStructConverterBase() += default; + +void InfoStringToStructConverterBase::Convert() +{ + FillStructure(); +} \ No newline at end of file diff --git a/src/ObjLoading/InfoString/InfoStringToStructConverterBase.h b/src/ObjLoading/InfoString/InfoStringToStructConverterBase.h new file mode 100644 index 00000000..40c5c0a4 --- /dev/null +++ b/src/ObjLoading/InfoString/InfoStringToStructConverterBase.h @@ -0,0 +1,22 @@ +#pragma once + +#include "InfoString/InfoString.h" + +class InfoStringToStructConverterBase +{ +protected: + const InfoString& m_info_string; + void* m_structure; + + virtual void FillStructure() = 0; + +public: + InfoStringToStructConverterBase(const InfoString& infoString, void* structure); + virtual ~InfoStringToStructConverterBase(); + InfoStringToStructConverterBase(const InfoStringToStructConverterBase& other) = delete; + InfoStringToStructConverterBase(InfoStringToStructConverterBase&& other) noexcept = delete; + InfoStringToStructConverterBase& operator=(const InfoStringToStructConverterBase& other) = delete; + InfoStringToStructConverterBase& operator=(InfoStringToStructConverterBase&& other) noexcept = delete; + + void Convert(); +}; \ No newline at end of file diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperVehicle.cpp b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperVehicle.cpp index c146f5a1..fe59e8b5 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperVehicle.cpp +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperVehicle.cpp @@ -5,7 +5,7 @@ #include #include "Game/IW4/CommonIW4.h" -#include "Game/IW4/InfoStringIW4.h" +#include "Game/IW4/InfoString/InfoStringFromStructConverter.h" using namespace IW4; diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperVehicle.h b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperVehicle.h index 6df71449..b1a2c514 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperVehicle.h +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperVehicle.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/IW4/IW4.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace IW4 { diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperWeapon.cpp b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperWeapon.cpp index b08eaca8..4eb7e40f 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperWeapon.cpp +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperWeapon.cpp @@ -6,7 +6,7 @@ #include #include "Game/IW4/CommonIW4.h" -#include "Game/IW4/InfoStringIW4.h" +#include "Game/IW4/InfoString/InfoStringFromStructConverter.h" using namespace IW4; diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperWeapon.h b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperWeapon.h index 4597d81a..450c2961 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperWeapon.h +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperWeapon.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/IW4/IW4.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace IW4 { diff --git a/src/ObjWriting/Game/IW4/InfoString/InfoStringFromStructConverter.cpp b/src/ObjWriting/Game/IW4/InfoString/InfoStringFromStructConverter.cpp new file mode 100644 index 00000000..ca9fe620 --- /dev/null +++ b/src/ObjWriting/Game/IW4/InfoString/InfoStringFromStructConverter.cpp @@ -0,0 +1,159 @@ +#include "InfoStringFromStructConverter.h" + +#include + +using namespace IW4; + +void InfoStringFromStructConverter::FillFromBaseField(const cspField_t& field) +{ + switch (static_cast(field.iFieldType)) + { + case CSPFT_STRING: + FillFromString(std::string(field.szName), field.iOffset); + break; + + case CSPFT_STRING_MAX_STRING_CHARS: + FillFromStringBuffer(std::string(field.szName), field.iOffset, 1024); + break; + + case CSPFT_STRING_MAX_QPATH: + FillFromStringBuffer(std::string(field.szName), field.iOffset, 64); + break; + + case CSPFT_STRING_MAX_OSPATH: + FillFromStringBuffer(std::string(field.szName), field.iOffset, 256); + break; + + case CSPFT_INT: + FillFromInt(std::string(field.szName), field.iOffset); + break; + + case CSPFT_QBOOLEAN: + FillFromQBoolean(std::string(field.szName), field.iOffset); + break; + + case CSPFT_BOOL: + FillFromBool(std::string(field.szName), field.iOffset); + break; + + case CSPFT_FLOAT: + FillFromFloat(std::string(field.szName), field.iOffset); + break; + + case CSPFT_MPH_TO_INCHES_PER_SEC: + { + const auto* num = reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + m_info_string.SetValueForKey(std::string(field.szName), std::to_string(*num / 17.6f)); + break; + } + + case CSPFT_MILLISECONDS: + FillFromMilliseconds(std::string(field.szName), field.iOffset); + break; + + case CSPFT_FX: + { + const auto* fx = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + + if (fx) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(fx->name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_XMODEL: + { + const auto* model = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + + if (model) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(model->name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_MATERIAL: + { + const auto* material = *reinterpret_cast(reinterpret_cast(m_structure) + field. + iOffset); + + if (material) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(material->info.name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_PHYS_COLLMAP: + { + const auto* physCollMap = *reinterpret_cast(reinterpret_cast(m_structure) + field. + iOffset); + + if (physCollMap) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(physCollMap->name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_SOUND: + { + const auto* sndAlias = reinterpret_cast(reinterpret_cast(m_structure) + field. + iOffset); + + if (sndAlias->name) + m_info_string.SetValueForKey(std::string(field.szName), std::string(sndAlias->name->soundName)); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_TRACER: + { + const auto* tracer = *reinterpret_cast(reinterpret_cast(m_structure) + field. + iOffset); + + if (tracer) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(tracer->name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_NUM_BASE_FIELD_TYPES: + default: + assert(false); + break; + } +} + +void InfoStringFromStructConverter::FillInfoString() +{ + for (auto fieldIndex = 0u; fieldIndex < m_field_count; fieldIndex++) + { + const auto& field = m_fields[fieldIndex]; + assert(field.iFieldType >= 0); + + if (field.iFieldType < CSPFT_NUM_BASE_FIELD_TYPES) + FillFromBaseField(field); + else + FillFromExtensionField(field); + } +} + +InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, + const size_t fieldCount) + : InfoStringFromStructConverterBase(structure), + m_fields(fields), + m_field_count(fieldCount) +{ +} + +InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, const size_t fieldCount, + std::function scriptStringValueCallback) + : InfoStringFromStructConverterBase(structure, std::move(scriptStringValueCallback)), + m_fields(fields), + m_field_count(fieldCount) +{ +} diff --git a/src/ObjCommon/Game/IW4/InfoStringIW4.h b/src/ObjWriting/Game/IW4/InfoString/InfoStringFromStructConverter.h similarity index 64% rename from src/ObjCommon/Game/IW4/InfoStringIW4.h rename to src/ObjWriting/Game/IW4/InfoString/InfoStringFromStructConverter.h index eff5661a..2e33b602 100644 --- a/src/ObjCommon/Game/IW4/InfoStringIW4.h +++ b/src/ObjWriting/Game/IW4/InfoString/InfoStringFromStructConverter.h @@ -1,21 +1,9 @@ #pragma once -#include "Utils/InfoString.h" +#include "InfoString/InfoStringFromStructConverterBase.h" #include "Game/IW4/IW4.h" namespace IW4 { - class InfoStringToStructConverter : public InfoStringToStructConverterBase - { - const cspField_t* m_fields; - size_t m_field_count; - - protected: - void FillStructure() override; - - public: - InfoStringToStructConverter(const InfoString& infoString, void* structure, const cspField_t* fields, size_t fieldCount); - }; - class InfoStringFromStructConverter : public InfoStringFromStructConverterBase { protected: @@ -30,4 +18,4 @@ namespace IW4 InfoStringFromStructConverter(const void* structure, const cspField_t* fields, size_t fieldCount); InfoStringFromStructConverter(const void* structure, const cspField_t* fields, size_t fieldCount, std::function scriptStringValueCallback); }; -} +} \ No newline at end of file diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysConstraints.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysConstraints.cpp index 30be30f5..90e2b8a0 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysConstraints.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysConstraints.cpp @@ -5,7 +5,7 @@ #include "Game/T6/CommonT6.h" -#include "Game/T6/InfoStringT6.h" +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" using namespace T6; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysConstraints.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysConstraints.h index 5f8e4a0d..bd2b23cf 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysConstraints.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysConstraints.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace T6 { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysPreset.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysPreset.cpp index a0803c8c..262def13 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysPreset.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysPreset.cpp @@ -5,7 +5,7 @@ #include #include -#include "Game/T6/InfoStringT6.h" +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" using namespace T6; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysPreset.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysPreset.h index 641b1ba6..abcad281 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysPreset.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperPhysPreset.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace T6 { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperTracer.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperTracer.cpp index dd43399b..5f90fec2 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperTracer.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperTracer.cpp @@ -4,7 +4,7 @@ #include #include "Game/T6/CommonT6.h" -#include "Game/T6/InfoStringT6.h" +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" using namespace T6; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperTracer.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperTracer.h index 34839337..bab18c80 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperTracer.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperTracer.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace T6 { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperVehicle.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperVehicle.cpp index 40cacf61..4ebea4ef 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperVehicle.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperVehicle.cpp @@ -5,7 +5,7 @@ #include "Game/T6/CommonT6.h" -#include "Game/T6/InfoStringT6.h" +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" using namespace T6; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperVehicle.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperVehicle.h index 279771c9..d3ead850 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperVehicle.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperVehicle.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace T6 { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.cpp index 4c19a19a..c5b34707 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.cpp @@ -6,7 +6,7 @@ #include #include "Game/T6/CommonT6.h" -#include "Game/T6/InfoStringT6.h" +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" using namespace T6; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.h index 1b043f4f..5e055396 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeapon.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace T6 { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachment.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachment.cpp index ebfb1f30..ac49b71a 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachment.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachment.cpp @@ -6,7 +6,7 @@ #include #include "Game/T6/CommonT6.h" -#include "Game/T6/InfoStringT6.h" +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" using namespace T6; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachment.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachment.h index 98f59fba..5db68909 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachment.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachment.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace T6 { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachmentUnique.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachmentUnique.cpp index bb102347..f52f2e81 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachmentUnique.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachmentUnique.cpp @@ -6,7 +6,7 @@ #include #include "Game/T6/CommonT6.h" -#include "Game/T6/InfoStringT6.h" +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" using namespace T6; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachmentUnique.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachmentUnique.h index f8adf8d5..422338dc 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachmentUnique.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponAttachmentUnique.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace T6 { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperZBarrier.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperZBarrier.cpp index f6b9e7b9..ed70eb74 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperZBarrier.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperZBarrier.cpp @@ -3,7 +3,7 @@ #include #include -#include "Game/T6/InfoStringT6.h" +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" using namespace T6; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperZBarrier.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperZBarrier.h index a8a2505f..2669f284 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperZBarrier.h +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperZBarrier.h @@ -2,7 +2,7 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -#include "Utils/InfoString.h" +#include "InfoString/InfoString.h" namespace T6 { diff --git a/src/ObjWriting/Game/T6/InfoString/InfoStringFromStructConverter.cpp b/src/ObjWriting/Game/T6/InfoString/InfoStringFromStructConverter.cpp new file mode 100644 index 00000000..06d09342 --- /dev/null +++ b/src/ObjWriting/Game/T6/InfoString/InfoStringFromStructConverter.cpp @@ -0,0 +1,156 @@ +#include "InfoStringFromStructConverter.h" + +#include + +using namespace T6; + +void InfoStringFromStructConverter::FillFromBaseField(const cspField_t& field) +{ + switch (static_cast(field.iFieldType)) + { + case CSPFT_STRING: + FillFromString(std::string(field.szName), field.iOffset); + break; + + case CSPFT_STRING_MAX_STRING_CHARS: + FillFromStringBuffer(std::string(field.szName), field.iOffset, 1024); + break; + + case CSPFT_STRING_MAX_QPATH: + FillFromStringBuffer(std::string(field.szName), field.iOffset, 64); + break; + + case CSPFT_STRING_MAX_OSPATH: + FillFromStringBuffer(std::string(field.szName), field.iOffset, 256); + break; + + case CSPFT_INT: + FillFromInt(std::string(field.szName), field.iOffset); + break; + + case CSPFT_UINT: + FillFromUint(std::string(field.szName), field.iOffset); + break; + + case CSPFT_BOOL: + FillFromBool(std::string(field.szName), field.iOffset); + break; + + case CSPFT_QBOOLEAN: + FillFromQBoolean(std::string(field.szName), field.iOffset); + break; + + case CSPFT_FLOAT: + FillFromFloat(std::string(field.szName), field.iOffset); + break; + + case CSPFT_MILLISECONDS: + FillFromMilliseconds(std::string(field.szName), field.iOffset); + break; + + case CSPFT_FX: + { + const auto* fx = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + + if (fx) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(fx->name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_XMODEL: + { + const auto* model = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + + if (model) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(model->name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_MATERIAL: + case CSPFT_MATERIAL_STREAM: + { + const auto* material = *reinterpret_cast(reinterpret_cast(m_structure) + field. + iOffset); + + if (material) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(material->info.name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_PHYS_PRESET: + { + const auto* physPreset = *reinterpret_cast(reinterpret_cast(m_structure) + field. + iOffset); + + if (physPreset) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(physPreset->name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_SCRIPT_STRING: + FillFromScriptString(std::string(field.szName), field.iOffset); + break; + + case CSPFT_TRACER: + { + const auto* tracer = *reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + + if (tracer) + m_info_string.SetValueForKey(std::string(field.szName), std::string(AssetName(tracer->name))); + else + m_info_string.SetValueForKey(std::string(field.szName), ""); + break; + } + + case CSPFT_SOUND_ALIAS_ID: + { + // TODO: Search sound files for files matching the hash + const auto* hash = reinterpret_cast(reinterpret_cast(m_structure) + field.iOffset); + m_info_string.SetValueForKey(std::string(field.szName), "@" + std::to_string(*hash)); + break; + } + + case CSPFT_NUM_BASE_FIELD_TYPES: + default: + assert(false); + break; + } +} + +void InfoStringFromStructConverter::FillInfoString() +{ + for (auto fieldIndex = 0u; fieldIndex < m_field_count; fieldIndex++) + { + const auto& field = m_fields[fieldIndex]; + assert(field.iFieldType >= 0); + + if (field.iFieldType < CSPFT_NUM_BASE_FIELD_TYPES) + FillFromBaseField(field); + else + FillFromExtensionField(field); + } +} + +InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, + const size_t fieldCount) + : InfoStringFromStructConverterBase(structure), + m_fields(fields), + m_field_count(fieldCount) +{ +} + +InfoStringFromStructConverter::InfoStringFromStructConverter(const void* structure, const cspField_t* fields, const size_t fieldCount, + std::function scriptStringValueCallback) + : InfoStringFromStructConverterBase(structure, std::move(scriptStringValueCallback)), + m_fields(fields), + m_field_count(fieldCount) +{ +} diff --git a/src/ObjCommon/Game/T6/InfoStringT6.h b/src/ObjWriting/Game/T6/InfoString/InfoStringFromStructConverter.h similarity index 64% rename from src/ObjCommon/Game/T6/InfoStringT6.h rename to src/ObjWriting/Game/T6/InfoString/InfoStringFromStructConverter.h index fdb4066d..9a8b7956 100644 --- a/src/ObjCommon/Game/T6/InfoStringT6.h +++ b/src/ObjWriting/Game/T6/InfoString/InfoStringFromStructConverter.h @@ -1,21 +1,9 @@ #pragma once -#include "Utils/InfoString.h" +#include "InfoString/InfoStringFromStructConverterBase.h" #include "Game/T6/T6.h" namespace T6 { - class InfoStringToStructConverter : public InfoStringToStructConverterBase - { - const cspField_t* m_fields; - size_t m_field_count; - - protected: - void FillStructure() override; - - public: - InfoStringToStructConverter(const InfoString& infoString, void* structure, const cspField_t* fields, size_t fieldCount); - }; - class InfoStringFromStructConverter : public InfoStringFromStructConverterBase { protected: @@ -30,4 +18,4 @@ namespace T6 InfoStringFromStructConverter(const void* structure, const cspField_t* fields, size_t fieldCount); InfoStringFromStructConverter(const void* structure, const cspField_t* fields, size_t fieldCount, std::function scriptStringValueCallback); }; -} +} \ No newline at end of file diff --git a/src/ObjCommon/Utils/InfoString.cpp b/src/ObjWriting/InfoString/InfoStringFromStructConverterBase.cpp similarity index 61% rename from src/ObjCommon/Utils/InfoString.cpp rename to src/ObjWriting/InfoString/InfoStringFromStructConverterBase.cpp index 938e46e9..48b7e5a2 100644 --- a/src/ObjCommon/Utils/InfoString.cpp +++ b/src/ObjWriting/InfoString/InfoStringFromStructConverterBase.cpp @@ -1,123 +1,6 @@ -#include "InfoString.h" +#include "InfoStringFromStructConverterBase.h" #include -#include -#include - -const std::string InfoString::EMPTY_VALUE; - -bool InfoString::HasKey(const std::string& key) const -{ - return m_values.find(key) != m_values.end(); -} - -const std::string& InfoString::GetValueForKey(const std::string& key) const -{ - const auto& value = m_values.find(key); - - if (value == m_values.end()) - return EMPTY_VALUE; - - return value->second; -} - -const std::string& InfoString::GetValueForKey(const std::string& key, bool* foundValue) const -{ - const auto& value = m_values.find(key); - - if (value == m_values.end()) - { - if (foundValue) - *foundValue = false; - return EMPTY_VALUE; - } - - if (foundValue) - *foundValue = true; - return value->second; -} - -void InfoString::SetValueForKey(const std::string& key, std::string value) -{ - if (!HasKey(key)) - m_keys_by_insertion.push_back(key); - - m_values[key] = std::move(value); -} - -void InfoString::RemoveKey(const std::string& key) -{ - const auto& value = m_values.find(key); - - if (value != m_values.end()) - m_values.erase(value); -} - -std::string InfoString::ToString() const -{ - std::stringstream ss; - bool first = true; - - for (const auto& key : m_keys_by_insertion) - { - const auto value = m_values.find(key); - if (!first) - ss << '\\'; - else - first = false; - - ss << key << '\\' << value->second; - } - - return ss.str(); -} - -std::string InfoString::ToString(const std::string& prefix) const -{ - std::stringstream ss; - ss << prefix; - - for (const auto& key : m_keys_by_insertion) - { - const auto value = m_values.find(key); - ss << '\\' << key << '\\' << value->second; - } - - return ss.str(); -} - -void InfoString::ToGdtProperties(const std::string& prefix, GdtEntry& gdtEntry) const -{ - for (const auto& key : m_keys_by_insertion) - { - const auto value = m_values.find(key); - gdtEntry.m_properties[key] = value->second; - } - - gdtEntry.m_properties["configstringFileType"] = prefix; -} - -void InfoString::FromString() -{ -} - -void InfoString::FromString(const std::string& prefix) -{ -} - -InfoStringToStructConverterBase::InfoStringToStructConverterBase(const InfoString& infoString, void* structure) - : m_info_string(infoString), - m_structure(structure) -{ -} - -InfoStringToStructConverterBase::~InfoStringToStructConverterBase() -= default; - -void InfoStringToStructConverterBase::Convert() -{ - FillStructure(); -} InfoStringFromStructConverterBase::InfoStringFromStructConverterBase(const void* structure) : m_structure(structure), diff --git a/src/ObjCommon/Utils/InfoString.h b/src/ObjWriting/InfoString/InfoStringFromStructConverterBase.h similarity index 52% rename from src/ObjCommon/Utils/InfoString.h rename to src/ObjWriting/InfoString/InfoStringFromStructConverterBase.h index 9263944d..a1032375 100644 --- a/src/ObjCommon/Utils/InfoString.h +++ b/src/ObjWriting/InfoString/InfoStringFromStructConverterBase.h @@ -1,52 +1,9 @@ #pragma once #include -#include -#include -#include -#include "Obj/Gdt/GdtEntry.h" +#include "InfoString/InfoString.h" #include "Zone/ZoneTypes.h" -class InfoString -{ - static const std::string EMPTY_VALUE; - std::unordered_map m_values; - std::vector m_keys_by_insertion; - -public: - bool HasKey(const std::string& key) const; - const std::string& GetValueForKey(const std::string& key) const; - const std::string& GetValueForKey(const std::string& key, bool* foundValue) const; - void SetValueForKey(const std::string& key, std::string value); - void RemoveKey(const std::string& key); - - std::string ToString() const; - std::string ToString(const std::string& prefix) const; - void ToGdtProperties(const std::string& prefix, GdtEntry& gdtEntry) const; - - void FromString(); - void FromString(const std::string& prefix); -}; - -class InfoStringToStructConverterBase -{ -protected: - const InfoString& m_info_string; - void* m_structure; - - virtual void FillStructure() = 0; - -public: - InfoStringToStructConverterBase(const InfoString& infoString, void* structure); - virtual ~InfoStringToStructConverterBase(); - InfoStringToStructConverterBase(const InfoStringToStructConverterBase& other) = delete; - InfoStringToStructConverterBase(InfoStringToStructConverterBase&& other) noexcept = delete; - InfoStringToStructConverterBase& operator=(const InfoStringToStructConverterBase& other) = delete; - InfoStringToStructConverterBase& operator=(InfoStringToStructConverterBase&& other) noexcept = delete; - - void Convert(); -}; - class InfoStringFromStructConverterBase { protected: