diff options
| -rw-r--r-- | src/ClientInfo.hpp | 4 | ||||
| -rw-r--r-- | src/Util.cpp | 49 | ||||
| -rw-r--r-- | src/Util.hpp | 2 | ||||
| -rw-r--r-- | src/crsm.hpp | 8 |
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 |
