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