summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKatja Marttila <katja.marttila@qt.io>2020-04-15 15:37:50 +0300
committerKatja Marttila <katja.marttila@qt.io>2020-04-16 17:33:19 +0300
commitc995fbab3164e520affeb4f543dcfb3d03946830 (patch)
treee5aef31236e686d20d277ce68ccdb8d492d541bb
parentfd27609c721837b88a480d52be0cbc0b87d4ee36 (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.cpp5
-rw-r--r--src/libs/installer/constants.h1
-rw-r--r--src/libs/installer/messageboxhandler.cpp6
-rw-r--r--src/sdk/sdkapp.h38
-rw-r--r--tests/auto/installer/messageboxhandler/data/messagebox/A/1.0.2-1meta.7zbin0 -> 937 bytes
-rw-r--r--tests/auto/installer/messageboxhandler/data/messagebox/Updates.xml13
-rw-r--r--tests/auto/installer/messageboxhandler/messageboxhandler.pro2
-rw-r--r--tests/auto/installer/messageboxhandler/settings.qrc2
-rw-r--r--tests/auto/installer/messageboxhandler/tst_messageboxhandler.cpp28
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
new file mode 100644
index 000000000..3c2832174
--- /dev/null
+++ b/tests/auto/installer/messageboxhandler/data/messagebox/A/1.0.2-1meta.7z
Binary files differ
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"