diff --git a/src/libs/utils/persistentsettings.cpp b/src/libs/utils/persistentsettings.cpp index 406088032483b04bcf98e167eb43200adb5e3e1d..7b841eed2cbcf6bbc89e75cb9bd1977efb69949d 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)