diff options
Diffstat (limited to 'src/ConfigBase.cpp')
| -rw-r--r-- | src/ConfigBase.cpp | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/src/ConfigBase.cpp b/src/ConfigBase.cpp new file mode 100644 index 0000000..ea1f874 --- /dev/null +++ b/src/ConfigBase.cpp @@ -0,0 +1,195 @@ +#include "CRSMConfig.hpp" + +#include <QFile> + +void CRSMConfigBase::addConfigValue(QString name, CRSMConfigValueBase* value) +{ + configValues[name] = value; +} + +void CRSMConfigBase::setConfigValue(const QString &name, const QString &value) +{ + CRSMConfigValueBase& configValue = getConfigValue(name); + configValue.setValue(value); +} + +QString CRSMConfigBase::getConfigValueLine(const QString &name) +{ + if(configValues.contains(name)) + { + CRSMConfigValueBase& value = *configValues[name]; + switch(value.type()) + { + case CRSMConfigValueType::Map: + { + QString ret; + const QMap<QString, QString>& values = (dynamic_cast<CRSMConfigValueMap*>(&value))->getValues(); + foreach(const QString& mapKey, values.keys()) + { + ret += name + "[" + mapKey + "]" + " = " + values.value(mapKey) + "\n"; + } + return ret; + break; + } + case CRSMConfigValueType::List: + { + QString ret; + foreach(const QString& val, (dynamic_cast<CRSMConfigValueList*>(&value))->getValues()) + { + ret += name + " += " + val + "\n"; + } + return ret; + break; + } + default: + return name + " = " + value.value() + "\n"; + } + } + else + { + throw CRSMConfigException("Unknown config value \"" + name.toStdString() + "\""); + } +} + +void CRSMConfigBase::addConfigListEntry(const QString &name, const QString &value) +{ + CRSMConfigValueBase& configValue = getConfigValue(name); + if(configValue.type() != CRSMConfigValueType::List) + { + throw CRSMConfigException("Cannot add a list entry to a non-list-config value \"" + name.toStdString() + "\""); + } + ((CRSMConfigValueList*)&configValue)->append(value); +} + +void CRSMConfigBase::removeConfigMapListEntry(const QString &name, const QString &value) +{ + CRSMConfigValueBase& configValue = getConfigValue(name); + if(configValue.type() == CRSMConfigValueType::List) + { + ((CRSMConfigValueList*)&configValue)->remove(value); + } + else if(configValue.type() == CRSMConfigValueType::Map) + { + ((CRSMConfigValueMap*)&configValue)->remove(value); + } + else + { + throw CRSMConfigException("Cannot remove a list entry from a value which is neither a list nor a map \"" + name.toStdString() + "\""); + } +} + +void CRSMConfigBase::setConfigMapValue(const QString &name, const QString &key, const QString &value) +{ + CRSMConfigValueBase& configValue = getConfigValue(name); + if(configValue.type() != CRSMConfigValueType::Map) + { + throw CRSMConfigException("Cannot set a map value on a non-map-config value \"" + name.toStdString() + "\""); + } + ((CRSMConfigValueMap*)&configValue)->setKeyValue(key, value); +} + +CRSMConfigValueBase& CRSMConfigBase::getConfigValue(const QString& name) +{ + if(!configValues.contains(name)) + { + throw CRSMConfigException("Unknown config value \"" + name.toStdString() + "\""); + } + else + { + return *configValues[name]; + } +} + +QString CRSMConfigBase::read(const QString &fileName, bool writeDefault) +{ + QString ret = ""; + + QFile config(fileName); + if(!config.exists()) + { + if(writeDefault) + { + if(write(fileName)) + { + return fileName + ": The config-file did not exist, a new one with default values has been created.\n"; + } + else + { + return fileName + ": The config-file did not exist, a new one could not be created.\n"; + } + } + else + { + return ret; + } + } + else if(config.open(QIODevice::ReadOnly | QIODevice::Text)) + { + QString line; + for(size_t lineNr = 1; !config.atEnd(); ++lineNr) + { + try + { + line = config.readLine().trimmed(); + setConfigLine(line); + } + catch(CRSMConfigException e) + { + ret += fileName + ":" + QString::number(lineNr) + ": " + e.what() + "\n"; + } + } + } + else + { + return fileName + ": The config-file could not be read.\n"; + } + + return ret; +} + +bool CRSMConfigBase::write(const QString &fileName) +{ + QFile config(fileName); + if(config.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) + { + foreach(const QString& key, configValues.keys()) + { + config.write(getConfigValueLine(key).toUtf8()); + } + + return true; + } + else + { + return false; + } +} + +void CRSMConfigBase::setConfigLine(const QString &line) +{ + static QRegExp valueExp(R"(^([^=]+)=(.*)$)"); + static QRegExp listExp(R"(^([^=]+)\+=(.*)$)"); + static QRegExp listMapRemoveExp(R"(^([^=]+)\-=(.*)$)"); + static QRegExp mapExp(R"(^([^\[]+)\[([^\]]+)\]\s*=\s*(.*)$)"); + + if(listExp.exactMatch(line)) + { + addConfigListEntry(listExp.cap(1).trimmed(), listExp.cap(2).trimmed()); + } + else if(listMapRemoveExp.exactMatch(line)) + { + removeConfigMapListEntry(listMapRemoveExp.cap(1).trimmed(), listMapRemoveExp.cap(2).trimmed()); + } + else if(mapExp.exactMatch(line)) + { + setConfigMapValue(mapExp.cap(1).trimmed(), mapExp.cap(2).trimmed(), mapExp.cap(3).trimmed()); + } + else if(valueExp.exactMatch(line)) + { + setConfigValue(valueExp.cap(1).trimmed(), valueExp.cap(2).trimmed()); + } + else + { + throw CRSMConfigException("Syntax error: unkown syntax"); + } +} |
