From 87fa3adb2d96723ffb39ffb5487866e47b52e94b Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@digia.com> Date: Thu, 4 Jul 2013 14:17:41 +0200 Subject: [PATCH] Persistent settings reader: Emit proper warning on value read failure. Fix annoying assertion when reading session files: SOFT ASSERT: "simpleValue.isValid()" in file .\persistentsettings.cpp, line 126 . Change-Id: Ia73a7a4a6f7a28c20876daf11a527b638ee02d89 Reviewed-by: hjk <hjk121@nokiamail.com> --- src/libs/utils/persistentsettings.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/persistentsettings.cpp b/src/libs/utils/persistentsettings.cpp index 40608803248..7b841eed2cb 100644 --- a/src/libs/utils/persistentsettings.cpp +++ b/src/libs/utils/persistentsettings.cpp @@ -174,6 +174,8 @@ private: bool handleStartElement(QXmlStreamReader &r); bool handleEndElement(const QStringRef &name); + static QString formatWarning(const QXmlStreamReader &r, const QString &message); + QStack<ParseValueStackEntry> m_valueStack; QVariantMap m_result; QString m_currentVariableName; @@ -223,10 +225,16 @@ bool ParseContext::handleStartElement(QXmlStreamReader &r) const QString key = attributes.hasAttribute(keyAttribute) ? attributes.value(keyAttribute).toString() : QString(); switch (e) { - case SimpleValueElement: + case SimpleValueElement: { // This reads away the end element, so, handle end element right here. - m_valueStack.push_back(ParseValueStackEntry(readSimpleValue(r, attributes), key)); + const QVariant v = readSimpleValue(r, attributes); + if (!v.isValid()) { + qWarning() << ParseContext::formatWarning(r, QString::fromLatin1("Failed to read element \"%1\".").arg(name.toString())); + return false; + } + m_valueStack.push_back(ParseValueStackEntry(v, key)); return handleEndElement(name); + } case ListValueElement: m_valueStack.push_back(ParseValueStackEntry(QVariant::List, key)); break; @@ -256,6 +264,18 @@ bool ParseContext::handleEndElement(const QStringRef &name) return e == QtCreatorElement; } +QString ParseContext::formatWarning(const QXmlStreamReader &r, const QString &message) +{ + QString result = QLatin1String("Warning reading "); + if (const QIODevice *device = r.device()) + if (const QFile *file = qobject_cast<const QFile *>(device)) + result += QDir::toNativeSeparators(file->fileName()) + QLatin1Char(':'); + result += QString::number(r.lineNumber()); + result += QLatin1String(": "); + result += message; + return result; +} + ParseContext::Element ParseContext::element(const QStringRef &r) const { if (r == valueElement) -- GitLab