diff options
author | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-09-23 08:45:08 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-09-24 11:25:36 +0000 |
commit | 73b8cd879cd723fbcce42e63f21cc864d13cb91e (patch) | |
tree | 91015dae17a79ccb05a2933477aa40e40ed41929 /src/corelib/io/qsettings.cpp | |
parent | 9f779088f434901cd4b81f90fc00e3b34601e071 (diff) |
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 <joerg.bornemann@theqtcompany.com>
Diffstat (limited to 'src/corelib/io/qsettings.cpp')
-rw-r--r-- | src/corelib/io/qsettings.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
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; |