Browse Source

Only save diablo.ini if there are changes

pull/2423/head
obligaron 5 years ago committed by Anders Jenbo
parent
commit
207c182fdf
  1. 44
      Source/options.cpp

44
Source/options.cpp

@ -59,6 +59,41 @@ CSimpleIni &GetIni()
return ini;
}
static bool IniChanged = false;
/**
* @brief Checks if a ini entry is changed by comparing value before and after
*/
class IniChangedChecker {
public:
IniChangedChecker(const char *sectionName, const char *keyName)
{
this->sectionName = sectionName;
this->keyName = keyName;
std::list<CSimpleIni::Entry> values;
if (!GetIni().GetAllValues(sectionName, keyName, values)) {
// No entry found in original ini => new entry => changed
IniChanged = true;
}
auto value = GetIni().GetValue(sectionName, keyName);
if (value != nullptr)
oldValue = value;
}
~IniChangedChecker()
{
auto value = GetIni().GetValue(sectionName, keyName);
std::string newValue;
if (value != nullptr)
newValue = value;
if (oldValue != newValue)
IniChanged = true;
}
private:
std::string oldValue;
const char *sectionName;
const char *keyName;
};
int GetIniInt(const char *keyname, const char *valuename, int defaultValue)
{
return GetIni().GetLongValue(keyname, valuename, defaultValue);
@ -76,40 +111,49 @@ float GetIniFloat(const char *sectionName, const char *keyName, float defaultVal
void SetIniValue(const char *keyname, const char *valuename, int value)
{
IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetLongValue(keyname, valuename, value);
}
void SetIniValue(const char *keyname, const char *valuename, std::uint8_t value)
{
IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetLongValue(keyname, valuename, value);
}
void SetIniValue(const char *keyname, const char *valuename, std::uint32_t value)
{
IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetLongValue(keyname, valuename, value);
}
void SetIniValue(const char *keyname, const char *valuename, bool value)
{
IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetLongValue(keyname, valuename, value ? 1 : 0);
}
void SetIniValue(const char *keyname, const char *valuename, float value)
{
IniChangedChecker changedChecker(keyname, valuename);
GetIni().SetDoubleValue(keyname, valuename, value);
}
void SaveIni()
{
if (!IniChanged)
return;
auto iniPath = GetIniPath();
auto stream = CreateFileStream(iniPath.c_str(), std::fstream::out | std::fstream::trunc | std::fstream::binary);
GetIni().Save(*stream, true);
IniChanged = false;
}
} // namespace
void SetIniValue(const char *sectionName, const char *keyName, const char *value, int len)
{
IniChangedChecker changedChecker(sectionName, keyName);
auto &ini = GetIni();
std::string stringValue(value, len != 0 ? len : strlen(value));
ini.SetValue(sectionName, keyName, stringValue.c_str());

Loading…
Cancel
Save