// Copyright 2009 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. // Utilities to parse and modify a Wii SYSCONF file and its sections. #pragma once #include #include #include #include "Common/Assert.h" #include "Common/CommonTypes.h" #include "Common/NandPaths.h" class SysConf final { public: explicit SysConf(Common::FromWhichRoot root_type); ~SysConf(); void Clear(); void Load(); bool Save() const; struct Entry { enum Type : u8 { BigArray = 1, SmallArray = 2, Byte = 3, Short = 4, Long = 5, LongLong = 6, // Should really be named Bool, but this conflicts with some random macro. :/ ByteBool = 7, }; Entry(Type type_, const std::string& name_); Entry(Type type_, const std::string& name_, const std::vector& bytes_); Entry(Type type_, const std::string& name_, std::vector&& bytes_); // Intended for use with the non array types. template T GetData(T default_value) const { if (bytes.size() != sizeof(T)) return default_value; T value; std::memcpy(&value, bytes.data(), bytes.size()); return value; } template void SetData(T value) { _assert_(sizeof(value) == bytes.size()); std::memcpy(bytes.data(), &value, bytes.size()); } Type type; std::string name; std::vector bytes; }; void AddEntry(Entry&& entry); Entry* GetEntry(const std::string& key); const Entry* GetEntry(const std::string& key) const; Entry* GetOrAddEntry(const std::string& key, Entry::Type type); void RemoveEntry(const std::string& key); // Intended for use with the non array types. template T GetData(const std::string& key, T default_value) const { const Entry* entry = GetEntry(key); return entry ? entry->GetData(default_value) : default_value; } template void SetData(const std::string& key, Entry::Type type, T value) { GetOrAddEntry(key, type)->SetData(value); } private: void InsertDefaultEntries(); bool LoadFromFile(const std::string& file_name); std::string m_file_name; std::vector m_entries; };