From 73b8cd879cd723fbcce42e63f21cc864d13cb91e Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 23 Sep 2015 08:45:08 +0200 Subject: QSettings: Special-case serialization of QDateTime. QDateTime values with a UTC offset are not correctly serialized with QDataStream::Qt_4_0. So use a newer QDataStream format for this type and mark it with "@DateTime" instead of "@Variant". Task-number: QTBUG-46551 Change-Id: I211c89e8cd0211c949ec993e6ffd5192d0eebbb3 Reviewed-by: Joerg Bornemann --- src/corelib/io/qsettings.cpp | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp index da4a02e4e4..b9993c454e 100644 --- a/src/corelib/io/qsettings.cpp +++ b/src/corelib/io/qsettings.cpp @@ -453,14 +453,23 @@ QString QSettingsPrivate::variantToString(const QVariant &v) default: { #ifndef QT_NO_DATASTREAM + QDataStream::Version version; + const char *typeSpec; + if (v.type() == QVariant::DateTime) { + version = QDataStream::Qt_5_6; + typeSpec = "@DateTime("; + } else { + version = QDataStream::Qt_4_0; + typeSpec = "@Variant("; + } QByteArray a; { QDataStream s(&a, QIODevice::WriteOnly); - s.setVersion(QDataStream::Qt_4_0); + s.setVersion(version); s << v; } - result = QLatin1String("@Variant("); + result = QLatin1String(typeSpec); result += QString::fromLatin1(a.constData(), a.size()); result += QLatin1Char(')'); #else @@ -480,11 +489,21 @@ QVariant QSettingsPrivate::stringToVariant(const QString &s) if (s.endsWith(QLatin1Char(')'))) { if (s.startsWith(QLatin1String("@ByteArray("))) { return QVariant(s.toLatin1().mid(11, s.size() - 12)); - } else if (s.startsWith(QLatin1String("@Variant("))) { + } else if (s.startsWith(QLatin1String("@Variant(")) + || s.startsWith(QLatin1String("@DateTime("))) { #ifndef QT_NO_DATASTREAM - QByteArray a(s.toLatin1().mid(9)); + QDataStream::Version version; + int offset; + if (s.at(1) == QLatin1Char('D')) { + version = QDataStream::Qt_5_6; + offset = 10; + } else { + version = QDataStream::Qt_4_0; + offset = 9; + } + QByteArray a(s.toLatin1().mid(offset)); QDataStream stream(&a, QIODevice::ReadOnly); - stream.setVersion(QDataStream::Qt_4_0); + stream.setVersion(version); QVariant result; stream >> result; return result; -- cgit v1.2.3