summaryrefslogtreecommitdiffstats
path: root/src/CRSMConfig.cpp
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2015-10-08 14:04:04 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2015-10-08 14:04:04 +0200
commitdbd4d15144c727f967911d41d798758bfb9bad03 (patch)
tree7b3245f2ea9265f98dae5a16ff5b6dd268c8e0d8 /src/CRSMConfig.cpp
parentc59e14b83f8b88f01ec23dcc4e6265cbfb84f733 (diff)
downloadmanager-dbd4d15144c727f967911d41d798758bfb9bad03.tar.gz
manager-dbd4d15144c727f967911d41d798758bfb9bad03.zip
Add config get and config set commands and a -= config syntax to remove
elements from a list or map (by key)
Diffstat (limited to 'src/CRSMConfig.cpp')
-rw-r--r--src/CRSMConfig.cpp122
1 files changed, 86 insertions, 36 deletions
diff --git a/src/CRSMConfig.cpp b/src/CRSMConfig.cpp
index 54b0e8f..5ec0f9b 100644
--- a/src/CRSMConfig.cpp
+++ b/src/CRSMConfig.cpp
@@ -13,6 +13,44 @@ void CRSMConfigBase::setConfigValue(const QString &name, const QString &value)
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);
@@ -23,6 +61,23 @@ void CRSMConfigBase::addConfigListEntry(const QString &name, const QString &valu
((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);
@@ -70,27 +125,13 @@ QString CRSMConfigBase::read(const QString &fileName, bool writeDefault)
}
else if(config.open(QIODevice::ReadOnly | QIODevice::Text))
{
- static QRegExp valueExp(R"(^([^=]+)=(.*)$)");
- static QRegExp listExp(R"(^([^=]+)\+=(.*)$)");
- static QRegExp mapExp(R"(^([^\[]+)\[([^\]]+)\]\s*=\s*(.*)$)");
QString line;
for(size_t lineNr = 1; !config.atEnd(); ++lineNr)
{
try
{
line = config.readLine().trimmed();
- if(listExp.exactMatch(line))
- {
- addConfigListEntry(listExp.cap(1).trimmed(), listExp.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());
- }
+ setConfigLine(line);
}
catch(CRSMConfigException e)
{
@@ -113,27 +154,7 @@ bool CRSMConfigBase::write(const QString &fileName)
{
foreach(const QString& key, configValues.keys())
{
- CRSMConfigValueBase& value = *configValues[key];
- switch(value.type())
- {
- case CRSMConfigValueType::Map:
- {
- const QMap<QString, QString> values = (dynamic_cast<CRSMConfigValueMap*>(&value))->getValues();
- foreach(const QString& mapKey, values.keys())
- {
- config.write(QString(key + "[" + mapKey + "]" + " = " + values.value(mapKey) + "\n").toUtf8());
- }
- break;
- }
- case CRSMConfigValueType::List:
- foreach(const QString& val, (dynamic_cast<CRSMConfigValueList*>(&value))->getValues())
- {
- config.write(QString(key + " += " + val + "\n").toUtf8());
- }
- break;
- default:
- config.write(QString(key + " = " + value.value() + "\n").toUtf8());
- }
+ config.write(getConfigValueLine(key).toUtf8());
}
return true;
@@ -144,6 +165,35 @@ bool CRSMConfigBase::write(const QString &fileName)
}
}
+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");
+ }
+}
+
void CRSMConfig::clear()
{
auto configVals = configValues;