diff options
author | Katja Marttila <katja.marttila@qt.io> | 2020-04-15 15:37:50 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2020-04-16 17:33:19 +0300 |
commit | c995fbab3164e520affeb4f543dcfb3d03946830 (patch) | |
tree | e5aef31236e686d20d277ce68ccdb8d492d541bb | |
parent | fd27609c721837b88a480d52be0cbc0b87d4ee36 (diff) |
Add new option --auto-answer
With this change user can individually answer to message queries if
message id is known. The syntax is --auto-answer
message.id=QMessageBox::Ok,message.id2=QMessageBox::Cancel
Task-number: QTIFW-1740
Change-Id: I86d08df77cf5f3d665901b599586d8c52b7dcdf6
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
-rw-r--r-- | src/libs/installer/commandlineparser.cpp | 5 | ||||
-rw-r--r-- | src/libs/installer/constants.h | 1 | ||||
-rw-r--r-- | src/libs/installer/messageboxhandler.cpp | 6 | ||||
-rw-r--r-- | src/sdk/sdkapp.h | 38 | ||||
-rw-r--r-- | tests/auto/installer/messageboxhandler/data/messagebox/A/1.0.2-1meta.7z | bin | 0 -> 937 bytes | |||
-rw-r--r-- | tests/auto/installer/messageboxhandler/data/messagebox/Updates.xml | 13 | ||||
-rw-r--r-- | tests/auto/installer/messageboxhandler/messageboxhandler.pro | 2 | ||||
-rw-r--r-- | tests/auto/installer/messageboxhandler/settings.qrc | 2 | ||||
-rw-r--r-- | tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp | 28 |
9 files changed, 89 insertions, 6 deletions
diff --git a/src/libs/installer/commandlineparser.cpp b/src/libs/installer/commandlineparser.cpp index dc4569fbd..42bcd362e 100644 --- a/src/libs/installer/commandlineparser.cpp +++ b/src/libs/installer/commandlineparser.cpp @@ -151,6 +151,11 @@ CommandLineParser::CommandLineParser() QLatin1String("Accepts all message queries without user input."))); m_parser.addOption(QCommandLineOption(QStringList() << CommandLineOptions::scRejectMessageQuery, QLatin1String("Rejects all message queries without user input."))); + m_parser.addOption(QCommandLineOption(QStringList() << CommandLineOptions::scMessageAutomaticAnswer, + QLatin1String("Automatically answers the message queries with the message identifier and button value. " + "Several identifier=value pairs can be given separated with comma, " + "for example --auto-answer message.id=QMessageBox::Ok,message.id2=QMessageBox::Cancel."), + QLatin1String("identifier=value"))); // Developer options m_parser.addOption(QCommandLineOption(QStringList() diff --git a/src/libs/installer/constants.h b/src/libs/installer/constants.h index 1d9be8525..2b00fc1e2 100644 --- a/src/libs/installer/constants.h +++ b/src/libs/installer/constants.h @@ -154,6 +154,7 @@ static const QLatin1String scStartUninstallerLong("start-uninstaller"); // Message acceptance options static const QLatin1String scAcceptMessageQuery("accept-messages"); static const QLatin1String scRejectMessageQuery("reject-messages"); +static const QLatin1String scMessageAutomaticAnswer("auto-answer"); // Misc installation options static const QLatin1String scRootShort("t"); diff --git a/src/libs/installer/messageboxhandler.cpp b/src/libs/installer/messageboxhandler.cpp index 4562f0f3c..acc1b3137 100644 --- a/src/libs/installer/messageboxhandler.cpp +++ b/src/libs/installer/messageboxhandler.cpp @@ -406,6 +406,9 @@ QMessageBox::StandardButton MessageBoxHandler::showMessageBox(MessageType messag qCDebug(QInstaller::lcInstallerInstallLog).nospace() << "Created " << messageTypeHash.value(messageType).toUtf8().constData() << " message box " << identifier << ": " << title << ", " << text; + if (m_automaticAnswers.contains(identifier)) + return m_automaticAnswers.value(identifier); + if (qobject_cast<QApplication*> (qApp) == nullptr) { if (m_defaultAction != AskUser) return autoReply(buttons); @@ -413,9 +416,6 @@ QMessageBox::StandardButton MessageBoxHandler::showMessageBox(MessageType messag return defaultButton; } - if (m_automaticAnswers.contains(identifier)) - return m_automaticAnswers.value(identifier); - if (m_defaultAction == AskUser) { switch (messageType) { case criticalType: diff --git a/src/sdk/sdkapp.h b/src/sdk/sdkapp.h index 3c0dd0da8..57a141f69 100644 --- a/src/sdk/sdkapp.h +++ b/src/sdk/sdkapp.h @@ -52,6 +52,8 @@ #include <QResource> #include <QLoggingCategory> #include <QUuid> +#include <QMessageBox> +#include <QMetaEnum> template<class T> class SDKApp : public T @@ -279,6 +281,18 @@ public: if (m_parser.isSet(CommandLineOptions::scRejectMessageQuery)) m_core->autoRejectMessageBoxes(); + if (m_parser.isSet(CommandLineOptions::scMessageAutomaticAnswer)) { + const QString positionalArguments = m_parser.value(CommandLineOptions::scMessageAutomaticAnswer); + const QStringList items = positionalArguments.split(QLatin1Char(','), QString::SkipEmptyParts); + if (items.count() > 0) { + errorMessage = setMessageBoxAutomaticAnswers(items); + if (!errorMessage.isEmpty()) + return false; + } else { + errorMessage = QObject::tr("Arguments missing for option %1").arg(CommandLineOptions::scMessageAutomaticAnswer); + return false; + } + } return true; } @@ -385,6 +399,30 @@ public: return params; } + QString setMessageBoxAutomaticAnswers(const QStringList &items) + { + foreach (const QString &item, items) { + if (item.contains(QLatin1Char('='))) { + const QMetaObject metaObject = QMessageBox::staticMetaObject; + int enumIndex = metaObject.indexOfEnumerator("StandardButton"); + if (enumIndex != -1) { + QMetaEnum en = metaObject.enumerator(enumIndex); + const QString name = item.section(QLatin1Char('='), 0, 0); + const QString value = item.section(QLatin1Char('='), 1, 1); + bool ok = false; + int buttonValue = en.keyToValue(value.toLocal8Bit().data(), &ok); + if (ok) + m_core->setMessageBoxAutomaticAnswer(name, buttonValue); + else + return QObject::tr("Invalid button value %1 ").arg(value); + } + } else { + return QObject::tr("Incorrect arguments for %1").arg(CommandLineOptions::scMessageAutomaticAnswer); + } + } + return QString(); + } + private: QList<QByteArray> m_resourceMappings; diff --git a/tests/auto/installer/messageboxhandler/data/messagebox/A/1.0.2-1meta.7z b/tests/auto/installer/messageboxhandler/data/messagebox/A/1.0.2-1meta.7z Binary files differnew file mode 100644 index 000000000..3c2832174 --- /dev/null +++ b/tests/auto/installer/messageboxhandler/data/messagebox/A/1.0.2-1meta.7z diff --git a/tests/auto/installer/messageboxhandler/data/messagebox/Updates.xml b/tests/auto/installer/messageboxhandler/data/messagebox/Updates.xml new file mode 100644 index 000000000..77b5a9956 --- /dev/null +++ b/tests/auto/installer/messageboxhandler/data/messagebox/Updates.xml @@ -0,0 +1,13 @@ +<Updates> + <ApplicationName>{AnyApplication}</ApplicationName> + <ApplicationVersion>1.0.0</ApplicationVersion> + <PackageUpdate> + <Name>A</Name> + <DisplayName>A</DisplayName> + <Description>Example component A</Description> + <Version>1.0.2-1</Version> + <ReleaseDate>2015-01-01</ReleaseDate> + <Default>true</Default> + <Script>script.qs</Script> + </PackageUpdate> +</Updates> diff --git a/tests/auto/installer/messageboxhandler/messageboxhandler.pro b/tests/auto/installer/messageboxhandler/messageboxhandler.pro index 3bb0f7b64..fd87ba92e 100644 --- a/tests/auto/installer/messageboxhandler/messageboxhandler.pro +++ b/tests/auto/installer/messageboxhandler/messageboxhandler.pro @@ -1,7 +1,5 @@ include(../../qttest.pri) -QT += qml widgets - SOURCES += tst_messageboxhandler.cpp RESOURCES += \ diff --git a/tests/auto/installer/messageboxhandler/settings.qrc b/tests/auto/installer/messageboxhandler/settings.qrc index 51e4bba19..2e0d88a2b 100644 --- a/tests/auto/installer/messageboxhandler/settings.qrc +++ b/tests/auto/installer/messageboxhandler/settings.qrc @@ -7,5 +7,7 @@ <file>data/invalidoperation/A/1.0.2-1meta.7z</file> <file>data/missingarchive/Updates.xml</file> <file>data/missingarchive/C/1.0.0content.7z.sha1</file> + <file>data/messagebox/Updates.xml</file> + <file>data/messagebox/A/1.0.2-1meta.7z</file> </qresource> </RCC> diff --git a/tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp b/tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp index 1c819fa7c..a6d100603 100644 --- a/tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp +++ b/tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp @@ -197,6 +197,32 @@ private slots: QCOMPARE(PackageManagerCore::Canceled, core->status()); } + void messageBoxFromScriptDefaultAnswer() + { + setRepository(":///data/messagebox"); + // Resets in autoAcceptMessageBoxes set in previous function + MessageBoxHandler::instance()->setDefaultAction(MessageBoxHandler::AskUser); + core->installSelectedComponentsSilently(QStringList () << "A"); + + // These values are written in script based on default + // messagebox query results. + QCOMPARE(core->value("test.question.default.ok"), QLatin1String("Ok")); + QCOMPARE(core->value("test.question.default.cancel"), QLatin1String("Cancel")); + } + + void messageBoxFromScriptAutoAnswer() + { + setRepository(":///data/messagebox"); + core->setMessageBoxAutomaticAnswer("test.question.default.ok", QMessageBox::Cancel); + core->setMessageBoxAutomaticAnswer("test.question.default.cancel", QMessageBox::Ok); + core->installSelectedComponentsSilently(QStringList () << "A"); + + // These values are written in script based on + // messagebox query results. + QCOMPARE(core->value("test.question.default.ok"), QLatin1String("Cancel")); + QCOMPARE(core->value("test.question.default.cancel"), QLatin1String("Ok")); + } + void cleanupTestCase() { core->deleteLater(); @@ -211,6 +237,6 @@ private: QString m_installDir; }; -QTEST_MAIN(tst_MessageBoxHandler) +QTEST_GUILESS_MAIN(tst_MessageBoxHandler) #include "tst_messageboxhandler.moc" |