summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-05-11 11:39:54 +0300
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2022-05-17 06:42:39 +0000
commitc37cc0616430f6dfd5ba72430a9ae9e539e2598d (patch)
tree5f71cbec70b642333e757f31b4d2f91e49b9e9f1
parentd0d848e8849a25b4599e9a7b01093721e1b1a366 (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.cpp26
-rw-r--r--src/libs/installer/permissionsettings.h14
-rw-r--r--tests/auto/installer/clientserver/tst_clientserver.cpp39
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();