diff --git a/src/core/kconfiggroup.h b/src/core/kconfiggroup.h --- a/src/core/kconfiggroup.h +++ b/src/core/kconfiggroup.h @@ -647,9 +647,12 @@ * reporting * @param value the UTF-8 data to be converted * @param aDefault the default value if @p pKey is not found + * @param xdgCompatibility parse values as coming from an XDG-compliant desktop file @since 5.62 @see readXdgListEntry * @return @p value converted to QVariant, or @p aDefault if @p value is invalid or cannot be converted. */ - static QVariant convertToQVariant(const char *pKey, const QByteArray &value, const QVariant &aDefault); + static QVariant convertToQVariant(const char *pKey, const QByteArray &value, const QVariant &aDefault, bool xdgCompatibility); + + KCONFIGCORE_DEPRECATED_EXPORT static QVariant convertToQVariant(const char *pKey, const QByteArray &value, const QVariant &aDefault) { return convertToQVariant(pKey, value, aDefault, false); } friend class KServicePrivate; // XXX yeah, ugly^5 }; diff --git a/src/core/kconfiggroup.cpp b/src/core/kconfiggroup.cpp --- a/src/core/kconfiggroup.cpp +++ b/src/core/kconfiggroup.cpp @@ -121,7 +121,7 @@ } static QByteArray serializeList(const QList &list); - static QStringList deserializeList(const QString &data); + static QStringList deserializeList(const QString &data, QLatin1Char separator = QLatin1Char(',')); }; QByteArray KConfigGroupPrivate::serializeList(const QList &list) @@ -152,7 +152,7 @@ return value; } -QStringList KConfigGroupPrivate::deserializeList(const QString &data) +QStringList KConfigGroupPrivate::deserializeList(const QString &data, QLatin1Char separator) { if (data.isEmpty()) { return QStringList(); @@ -170,7 +170,7 @@ quoted = false; } else if (data[p].unicode() == '\\') { quoted = true; - } else if (data[p].unicode() == ',') { + } else if (data[p].unicode() == separator) { val.squeeze(); // release any unused memory value.append(val); val.clear(); @@ -220,7 +220,7 @@ return QStringLiteral(" (wrong format: expected %1 items, got %2)").arg(expected).arg(got); } -QVariant KConfigGroup::convertToQVariant(const char *pKey, const QByteArray &value, const QVariant &aDefault) +QVariant KConfigGroup::convertToQVariant(const char *pKey, const QByteArray &value, const QVariant &aDefault, bool xdgCompliant) { // if a type handler is added here you must add a QVConversions definition // to conversioncheck.h, or ConversionCheck::to_QVariant will not allow @@ -234,9 +234,12 @@ // readEntry(key, QString) not readEntry(key, QVariant) return QString::fromUtf8(value); case QMetaType::QVariantList: - case QMetaType::QStringList: - return KConfigGroupPrivate::deserializeList(QString::fromUtf8(value)); - case QMetaType::QByteArray: + case QMetaType::QStringList: { + auto valueList = KConfigGroupPrivate::deserializeList(QString::fromUtf8(value), QLatin1Char(xdgCompliant ? ';' : ',')); + if (xdgCompliant && !valueList.isEmpty() && valueList.constLast().isEmpty()) + valueList.removeLast(); + return valueList; + } case QMetaType::QByteArray: return value; case QMetaType::Bool: { const QByteArray lower(value.toLower()); @@ -780,29 +783,9 @@ return aDefault; } - QStringList value; - QString val; - val.reserve(data.size()); - // XXX List serialization being a separate layer from low-level parsing is - // probably a bug. No affected entries are defined, though. - bool quoted = false; - for (int p = 0; p < data.length(); p++) { - if (quoted) { - val += data[p]; - quoted = false; - } else if (data[p] == QLatin1Char('\\')) { - quoted = true; - } else if (data[p] == QLatin1Char(';')) { - value.append(val); - val.clear(); - val.reserve(data.size() - p); - } else { - val += data[p]; - } - } - if (!val.isEmpty()) { - value.append(val); - } + QStringList value = KConfigGroupPrivate::deserializeList(data, QLatin1Char(';')); + if (!value.isEmpty() && value.constLast().isEmpty()) + value.removeLast(); return value; }