aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Faure <faure@kde.org>2021-03-26 10:05:31 +0100
committerDavid Faure <faure@kde.org>2021-01-26 10:05:31 +0100
commitb132648084df231c196e726c899761d83d0766cc (patch)
tree94f43a1d16905aed554d4feafea7642617856b87
parentd1c58a842196c229913f908f42e8e3799b0717fc (diff)
downloadkconfig-b132648084df231c196e726c899761d83d0766cc.tar.gz
kconfig-b132648084df231c196e726c899761d83d0766cc.tar.bz2
KConfig: preserve the milliseconds component of QDateTime
I stored a file's lastModified() into KConfig, to compare with it again on next start, and the loss of milliseconds made the code think the timestamps didn't match, even when they did.
-rw-r--r--autotests/kconfigtest.cpp8
-rw-r--r--src/core/kconfiggroup.cpp13
2 files changed, 15 insertions, 6 deletions
diff --git a/autotests/kconfigtest.cpp b/autotests/kconfigtest.cpp
index 6f79f072..6ab50b2f 100644
--- a/autotests/kconfigtest.cpp
+++ b/autotests/kconfigtest.cpp
@@ -66,6 +66,7 @@ static QString homePath()
#define SIZEENTRY QSize( 10, 20 )
#define RECTENTRY QRect( 10, 23, 5321, 13 )
#define DATETIMEENTRY QDateTime( QDate( 2002, 06, 23 ), QTime( 12, 55, 40 ) )
+#define DATETIMEWITHMSENTRY QDateTime( QDate( 2002, 06, 23 ), QTime( 12, 55, 40, 532 ) )
#define STRINGLISTENTRY (QStringList( "Hello," ) << " World")
#define STRINGLISTEMPTYENTRY QStringList()
#define STRINGLISTJUSTEMPTYELEMENT QStringList(QString())
@@ -154,6 +155,7 @@ void KConfigTest::initTestCase()
cg.writeEntry("sizeEntry", SIZEENTRY);
cg.writeEntry("dateTimeEntry", DATETIMEENTRY);
cg.writeEntry("dateEntry", DATETIMEENTRY.date());
+ cg.writeEntry("dateTimeWithMSEntry", DATETIMEWITHMSENTRY);
KConfigGroup ct = cg;
cg = KConfigGroup(&ct, "Nested Group 1");
@@ -620,10 +622,12 @@ void KConfigTest::testComplex()
QCOMPARE(sc3.readEntry("pointEntry", QPoint()), POINTENTRY);
QCOMPARE(sc3.readEntry("sizeEntry", SIZEENTRY), SIZEENTRY);
QCOMPARE(sc3.readEntry("rectEntry", QRect(1, 2, 3, 4)), RECTENTRY);
- QCOMPARE(sc3.readEntry("dateTimeEntry", QDateTime()).toString(Qt::ISODate),
- DATETIMEENTRY.toString(Qt::ISODate));
+ QCOMPARE(sc3.readEntry("dateTimeEntry", QDateTime()).toString(Qt::ISODateWithMs),
+ DATETIMEENTRY.toString(Qt::ISODateWithMs));
QCOMPARE(sc3.readEntry("dateEntry", QDate()).toString(Qt::ISODate),
DATETIMEENTRY.date().toString(Qt::ISODate));
+ QCOMPARE(sc3.readEntry("dateTimeWithMSEntry", QDateTime()).toString(Qt::ISODateWithMs),
+ DATETIMEWITHMSENTRY.toString(Qt::ISODateWithMs));
QCOMPARE(sc3.readEntry("dateTimeEntry", QDate()), DATETIMEENTRY.date());
}
diff --git a/src/core/kconfiggroup.cpp b/src/core/kconfiggroup.cpp
index cc4f8d0c..14cbcab8 100644
--- a/src/core/kconfiggroup.cpp
+++ b/src/core/kconfiggroup.cpp
@@ -27,6 +27,7 @@
#include <QUrl>
#include <stdlib.h>
+#include <math.h>
class KConfigGroupPrivate : public QSharedData
{
@@ -325,14 +326,18 @@ QVariant KConfigGroup::convertToQVariant(const char *pKey, const QByteArray &val
return size;
}
case QMetaType::QDateTime: {
- const auto list = asIntList(value);
- if (list.count() != 6) {
+ const auto list = asRealList(value);
+ if (list.count() < 6) {
qCWarning(KCONFIG_CORE_LOG) << errString(pKey, value, aDefault)
<< formatError(6, list.count());
return aDefault;
}
const QDate date(list.at(0), list.at(1), list.at(2));
- const QTime time(list.at(3), list.at(4), list.at(5));
+ const qreal totalSeconds = list.at(5);
+ qreal seconds;
+ const qreal fractional = modf(totalSeconds, &seconds);
+ const qreal milliseconds = round(fractional * 1000.0);
+ const QTime time(list.at(3), list.at(4), seconds, milliseconds);
const QDateTime dt(date, time);
if (!dt.isValid()) {
qCWarning(KCONFIG_CORE_LOG) << errString(pKey, value, aDefault);
@@ -1044,7 +1049,7 @@ void KConfigGroup::writeEntry(const char *key, const QVariant &value,
time.hour(),
time.minute(),
- time.second(),
+ time.second() + time.msec()/1000.0,
};
writeEntry(key, list, flags);