diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-05-11 11:39:54 +0300 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-05-17 06:42:39 +0000 |
commit | c37cc0616430f6dfd5ba72430a9ae9e539e2598d (patch) | |
tree | 5f71cbec70b642333e757f31b4d2f91e49b9e9f1 | |
parent | d0d848e8849a25b4599e9a7b01093721e1b1a366 (diff) |
Workaround QSettings / QDateTime incompatibility with Qt 6 applications
This causes problems when installers created with IFW share config files
with Qt 6 applications. If the config file contains keys with QDateTime
values written by the other application, the installer and maintenance
tool will segfault when attempting to sync the file, even if we do not
overwrite the values.
This is fixed to recent Qt 5 and 6 versions with the submitted patches
to QTBUG-102334. But as this requires updating the baseline Qt version
for both the Qt IFW and the Qt 6 application, apply the workaround
suggested in the issue comments, to avoid the crash in meantime.
Task-number: QTIFW-2610
Change-Id: I968e293324775dc650315e223f549a81657a27a3
Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r-- | src/libs/installer/permissionsettings.cpp | 26 | ||||
-rw-r--r-- | src/libs/installer/permissionsettings.h | 14 | ||||
-rw-r--r-- | tests/auto/installer/clientserver/tst_clientserver.cpp | 39 |
3 files changed, 67 insertions, 12 deletions
diff --git a/src/libs/installer/permissionsettings.cpp b/src/libs/installer/permissionsettings.cpp index 6d5abdfe6..235c6667b 100644 --- a/src/libs/installer/permissionsettings.cpp +++ b/src/libs/installer/permissionsettings.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -37,6 +37,30 @@ using namespace QInstaller; \internal */ +PermissionSettings::PermissionSettings(const QString &organization, const QString &application, QObject *parent) + : QSettings(organization, application, parent) +{ + setIniCodec("UTF-8"); // to workaround QTBUG-102334 +} + +PermissionSettings::PermissionSettings(Scope scope, const QString &organization, const QString &application, QObject *parent) + : QSettings(scope, organization, application, parent) +{ + setIniCodec("UTF-8"); // QTBUG-102334 +} + +PermissionSettings::PermissionSettings(Format format, Scope scope, const QString &organization, const QString &application, QObject *parent) + : QSettings(format, scope, organization, application, parent) +{ + setIniCodec("UTF-8"); // QTBUG-102334 +} + +PermissionSettings::PermissionSettings(const QString &fileName, Format format, QObject *parent) + : QSettings(fileName, format, parent) +{ + setIniCodec("UTF-8"); // QTBUG-102334 +} + PermissionSettings::~PermissionSettings() { if (!fileName().isEmpty()) { diff --git a/src/libs/installer/permissionsettings.h b/src/libs/installer/permissionsettings.h index 3847c91db..2621624c2 100644 --- a/src/libs/installer/permissionsettings.h +++ b/src/libs/installer/permissionsettings.h @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -37,16 +37,12 @@ class PermissionSettings : public QSettings { public: explicit PermissionSettings(const QString &organization, - const QString &application = QString(), QObject *parent = 0) - : QSettings(organization, application, parent) {} + const QString &application = QString(), QObject *parent = 0); PermissionSettings(Scope scope, const QString &organization, - const QString &application = QString(), QObject *parent = 0) - : QSettings(scope, organization, application, parent) {} + const QString &application = QString(), QObject *parent = 0); PermissionSettings(Format format, Scope scope, const QString &organization, - const QString &application = QString(), QObject *parent = 0) - : QSettings(format, scope, organization, application, parent) {} - PermissionSettings(const QString &fileName, Format format, QObject *parent = 0) - : QSettings(fileName, format, parent) {} + const QString &application = QString(), QObject *parent = 0); + PermissionSettings(const QString &fileName, Format format, QObject *parent = 0); ~PermissionSettings(); }; diff --git a/tests/auto/installer/clientserver/tst_clientserver.cpp b/tests/auto/installer/clientserver/tst_clientserver.cpp index bcd87815d..ffd96d14e 100644 --- a/tests/auto/installer/clientserver/tst_clientserver.cpp +++ b/tests/auto/installer/clientserver/tst_clientserver.cpp @@ -312,8 +312,17 @@ private slots: delete object; } + void testQSettingsWrapper_data() + { + QTest::addColumn<QSettings::Format>("format"); + QTest::newRow("Native format") << QSettings::NativeFormat; + QTest::newRow("INI format") << QSettings::IniFormat; + } + void testQSettingsWrapper() { + QFETCH(QSettings::Format, format); + RemoteServer server; QString socketName = QUuid::createUuid().toString(); server.init(socketName, QLatin1String("SomeKey"), Protocol::Mode::Production); @@ -322,14 +331,16 @@ private slots: RemoteClient::instance().init(socketName, QLatin1String("SomeKey"), Protocol::Mode::Debug, Protocol::StartAs::User); - QSettingsWrapper wrapper("digia", "clientserver"); + QSettingsWrapper wrapper(static_cast<QSettingsWrapper::Format>(format), + QSettingsWrapper::UserScope, "digia", "clientserver"); + QCOMPARE(wrapper.isConnectedToServer(), false); wrapper.clear(); QCOMPARE(wrapper.isConnectedToServer(), true); wrapper.sync(); wrapper.setFallbacksEnabled(false); - QSettings settings("digia", "clientserver"); + QSettings settings(format, QSettings::UserScope, "digia", "clientserver"); settings.setFallbacksEnabled(false); QCOMPARE(settings.fileName(), wrapper.fileName()); @@ -358,6 +369,30 @@ private slots: QCOMPARE(wrapper.contains("key"), false); QCOMPARE(settings.contains("key"), false); + const QDateTime dateTime = QDateTime::currentDateTimeUtc(); + QCOMPARE(settings.iniCodec(), nullptr); + // The wrapper does not support this method, but assume: + // QCOMPARE(wrapper.iniCodec(), QTextCodec::codecForName("UTF-8")); + wrapper.setValue("dateTime", dateTime); + wrapper.sync(); + QCOMPARE(wrapper.value("dateTime").toDateTime(), dateTime); + QCOMPARE(settings.value("dateTime").toDateTime(), dateTime); + + wrapper.remove("dateTime"); + wrapper.sync(); + QCOMPARE(wrapper.contains("dateTime"), false); + QCOMPARE(settings.contains("dateTime"), false); + + settings.setValue("dateTime", dateTime); + settings.sync(); + QCOMPARE(wrapper.value("dateTime").toDateTime(), dateTime); + QCOMPARE(settings.value("dateTime").toDateTime(), dateTime); + + settings.remove("dateTime"); + settings.sync(); + QCOMPARE(wrapper.contains("dateTime"), false); + QCOMPARE(settings.contains("dateTime"), false); + wrapper.beginGroup("group"); wrapper.setValue("key", "value"); wrapper.endGroup(); |