summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ClientInfo.hpp4
-rw-r--r--src/Util.cpp49
-rw-r--r--src/Util.hpp2
-rw-r--r--src/crsm.hpp8
4 files changed, 57 insertions, 6 deletions
diff --git a/src/ClientInfo.hpp b/src/ClientInfo.hpp
index 1334e71..83005e6 100644
--- a/src/ClientInfo.hpp
+++ b/src/ClientInfo.hpp
@@ -144,7 +144,7 @@ public:
{
info = ClientInfo();
if(string == "empty") return;
- QStringList parts(string.split(':', QString::KeepEmptyParts));
+ QStringList parts(Util::splitEscaped(string, ':', '|'));
ClientInterface interface = static_cast<ClientInterface>(parts.first().toUInt(0, 36));
if(interface > ClientInterface::Last || interface < ClientInterface::First)
{
@@ -190,6 +190,6 @@ public:
case IRC: ret.append(info.nick); break;
case Management: ret.append(info.management.name); break;
}
- return ret.join(':');
+ return Util::joinEscape(ret, ':', '|');
}
};
diff --git a/src/Util.cpp b/src/Util.cpp
index 8b5bc67..014f1f8 100644
--- a/src/Util.cpp
+++ b/src/Util.cpp
@@ -82,5 +82,54 @@ namespace Util {
return ret;
}
+ QString joinEscape(const QStringList &list, const QChar joinChar, const QChar escapeChar)
+ {
+ QString ret;
+ bool first = true;
+ foreach(const QString& part, list)
+ {
+ if(!first)
+ {
+ ret.append(joinChar);
+ }
+ else
+ {
+ first = false;
+ }
+ ret.append(escape(part, escapeChar, joinChar));
+ }
+ return ret;
+ }
+
+ QStringList splitEscaped(const QString &joined, const QChar splitChar, const QChar escapeChar)
+ {
+ QStringList ret;
+
+ int partPos = 0;
+ bool escaped = false;
+ for(int i = 0; i < joined.length(); ++i)
+ {
+ QChar c = joined.at(i);
+ if(!escaped)
+ {
+ if(c == escapeChar)
+ {
+ escaped = true;
+ }
+ else if(c == splitChar)
+ {
+ ret.append(Util::unescape(joined.mid(partPos, i - partPos), escapeChar));
+ partPos = i + 1;
+ }
+ }
+ else
+ {
+ escaped = false;
+ }
+ }
+ ret.append(Util::unescape(joined.mid(partPos), escapeChar));
+
+ return ret;
+ }
}
diff --git a/src/Util.hpp b/src/Util.hpp
index ffd2fa3..c2ed916 100644
--- a/src/Util.hpp
+++ b/src/Util.hpp
@@ -11,4 +11,6 @@ namespace Util {
QString trimQuotes(QString string, bool& trimmed);
QString unescape(const QString& string, const QChar escapeChar = '\\');
QString escape(const QString& string, const QChar escapeChar = '\\', const QString& escapeChars = "");
+ QString joinEscape(const QStringList& list, const QChar joinChar, const QChar escapeChar = '\\');
+ QStringList splitEscaped(const QString& joined, const QChar splitChar, const QChar escapeChar = '\\');
}
diff --git a/src/crsm.hpp b/src/crsm.hpp
index cdce0d1..3e11054 100644
--- a/src/crsm.hpp
+++ b/src/crsm.hpp
@@ -65,8 +65,8 @@ public:
void setValue(const QString& val)
{
- QStringList parts = val.split(':', QString::KeepEmptyParts);
- if(parts.length() < 3)
+ QStringList parts = Util::splitEscaped(val, ':', '|');
+ if(parts.length() != 3)
{
throw ConfigException("Cannot read corrupt ScenarioSettings");
}
@@ -77,11 +77,11 @@ public:
config.league = ConfigValueBase::getValue<bool>(parts.first());
parts.removeFirst();
config.randomLeague = false;
- config.wishClient = ConfigValueBase::getValue<ClientInfo>(parts.join(':'));
+ config.wishClient = ConfigValueBase::getValue<ClientInfo>(parts.first());
}
}
- QString value() { return ConfigValueBase::getStringValue(config.name) + ":" + ConfigValueBase::getStringValue(config.league) + ":" + ConfigValueBase::getStringValue(config.wishClient); }
+ QString value() { return Util::joinEscape({ConfigValueBase::getStringValue(config.name), ConfigValueBase::getStringValue(config.league), ConfigValueBase::getStringValue(config.wishClient)}, ':', '|'); }
};
class CRSM : public QObject