diff --git a/include/Engine/Core/ConfigFile.h b/include/Engine/Core/ConfigFile.h new file mode 100644 index 00000000..229edd95 --- /dev/null +++ b/include/Engine/Core/ConfigFile.h @@ -0,0 +1,46 @@ +#ifndef ConfigFile_h__ +#define ConfigFile_h__ + +#include +#include +#include +#include + +#include "ResourceManager.h" + +class ConfigFile : public Resource +{ + friend class ResourceManager; + +private: + ConfigFile(std::string path); + +public: + template + T Get(std::string key, T defaultValue); + template + void Set(std::string key, T value); + + void SaveToDisk(); + + private: + boost::filesystem::path m_Path; + boost::property_tree::ptree m_PTreeDefaults; + boost::property_tree::ptree m_PTreeOverrides; + boost::property_tree::ptree m_PTreeMerged; +}; + +template +T ConfigFile::Get(std::string key, T defaultValue) +{ + return m_PTreeMerged.get(key, defaultValue); +} + +template +void ConfigFile::Set(std::string key, T value) +{ + m_PTreeOverrides.put(key, value); + m_PTreeMerged.put(key, value); +} + +#endif diff --git a/src/Engine/Core/ConfigFile.cpp b/src/Engine/Core/ConfigFile.cpp new file mode 100644 index 00000000..dbfb63c0 --- /dev/null +++ b/src/Engine/Core/ConfigFile.cpp @@ -0,0 +1,40 @@ +#include "PrecompiledHeader.h" +#include "Core/ConfigFile.h" + +ConfigFile::ConfigFile(std::string path) +{ + m_Path = path; + + boost::filesystem::path defaultFile; + defaultFile = m_Path.parent_path() / ("Default" + m_Path.filename().string()); + + // Read defaults + if (boost::filesystem::exists(defaultFile)) { + try { + boost::property_tree::ini_parser::read_ini(defaultFile.string(), m_PTreeDefaults); + } catch (boost::property_tree::ptree_error& e) { + LOG_ERROR("Failed to parse \"%s\":\n%s", defaultFile.string().c_str(), e.what()); + } + } else { + LOG_ERROR("Failed to find \"%s\"! Relying on hardcoded default values!", defaultFile.string().c_str()); + } + + m_PTreeMerged = m_PTreeDefaults; + + // Read overrides + if (boost::filesystem::exists(m_Path)) { + try { + boost::property_tree::ini_parser::read_ini(m_Path.string(), m_PTreeOverrides); + for (auto& node : m_PTreeOverrides) { + m_PTreeMerged.put_child(node.first, node.second); + } + } catch (boost::property_tree::ptree_error& e) { + LOG_ERROR("Failed to parse \"%s\":\n%s", m_Path.filename().string().c_str(), e.what()); + } + } +} + +void ConfigFile::SaveToDisk() +{ + boost::property_tree::ini_parser::write_ini(m_Path.string(), m_PTreeOverrides); +}