diff options
author | Katja Marttila <katja.marttila@qt.io> | 2023-03-24 08:32:17 +0000 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2023-03-24 08:32:17 +0000 |
commit | 56a704f6c30ea93434afaa44fa5636c6d4f50158 (patch) | |
tree | 63b2ff456c50b9ea070d0bebeac3b58adfd1bb19 /src | |
parent | 4cd14507e8e7ddfa9092ea475a04f4e91d1cb407 (diff) | |
parent | e6e65cdfbf562e89d5a4440cdc6e27c5e47ed1a8 (diff) |
Merge "Merge remote-tracking branch 'origin/4.5' into master"
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/installer/elevatedexecuteoperation.cpp | 34 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 2 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.cpp | 47 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.h | 1 | ||||
-rw-r--r-- | src/libs/kdtools/filedownloader.cpp | 33 | ||||
-rw-r--r-- | src/sdk/tabcontroller.cpp | 2 |
6 files changed, 79 insertions, 40 deletions
diff --git a/src/libs/installer/elevatedexecuteoperation.cpp b/src/libs/installer/elevatedexecuteoperation.cpp index 6f2393799..87810211e 100644 --- a/src/libs/installer/elevatedexecuteoperation.cpp +++ b/src/libs/installer/elevatedexecuteoperation.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2023 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -65,10 +65,12 @@ public: private: bool needsRerunWithReplacedVariables(QStringList &arguments, const OperationType type); + void setErrorMessage(const QString &message); - +private: QProcessWrapper *process; bool showStandardError; + QString m_customErrorMessage; }; ElevatedExecuteOperation::ElevatedExecuteOperation(PackageManagerCore *core) @@ -120,13 +122,12 @@ int ElevatedExecuteOperation::Private::run(QStringList &arguments, const Operati args.removeAll(workingDirectoryArgument); } - QString customErrorMessage; QStringList filteredCustomErrorMessage = args.filter(QLatin1String("errormessage="), Qt::CaseInsensitive); if (!filteredCustomErrorMessage.isEmpty()) { QString customErrorMessageArgument = filteredCustomErrorMessage.at(0); - customErrorMessage = customErrorMessageArgument; - customErrorMessage.replace(QLatin1String("errormessage="), QString(), Qt::CaseInsensitive); + m_customErrorMessage = customErrorMessageArgument; + m_customErrorMessage.replace(QLatin1String("errormessage="), QString(), Qt::CaseInsensitive); args.removeAll(customErrorMessageArgument); } @@ -157,7 +158,8 @@ int ElevatedExecuteOperation::Private::run(QStringList &arguments, const Operati const bool success = QProcessWrapper::startDetached(args.front(), args.mid(1)); if (!success) { q->setError(UserDefinedError); - q->setErrorString(tr("Cannot start detached: \"%1\"").arg(callstr)); + setErrorMessage(tr("Cannot start detached: \"%1\"").arg(callstr)); + returnValue = Error; } return returnValue; @@ -202,8 +204,7 @@ int ElevatedExecuteOperation::Private::run(QStringList &arguments, const Operati int returnValue = NoError; if (!success) { q->setError(UserDefinedError); - //TODO: pass errorString() through the wrapper */ - q->setErrorString(tr("Cannot start: \"%1\": %2").arg(callstr, + setErrorMessage(tr("Cannot start: \"%1\": %2").arg(callstr, process->errorString())); if (!needsRerunWithReplacedVariables(arguments, type)) { returnValue = Error; @@ -229,17 +230,13 @@ int ElevatedExecuteOperation::Private::run(QStringList &arguments, const Operati if (process->exitStatus() == QProcessWrapper::CrashExit) { q->setError(UserDefinedError); - q->setErrorString(tr("Program crashed: \"%1\"").arg(callstr)); + setErrorMessage(tr("Program crashed: \"%1\"").arg(callstr)); returnValue = Error; } else if (!allowedExitCodes.contains(process->exitCode()) && returnValue != NeedsRerun) { if (!needsRerunWithReplacedVariables(arguments, type)) { q->setError(UserDefinedError); - if (customErrorMessage.isEmpty()) { - q->setErrorString(tr("Execution failed (Unexpected exit code: %1): \"%2\"") - .arg(QString::number(process->exitCode()), callstr)); - } else { - q->setErrorString(customErrorMessage); - } + setErrorMessage(tr("Execution failed (Unexpected exit code: %1): \"%2\"") + .arg(QString::number(process->exitCode()), callstr)); returnValue = Error; } else { returnValue = NeedsRerun; @@ -276,6 +273,13 @@ bool ElevatedExecuteOperation::Private::needsRerunWithReplacedVariables(QStringL return rerun; } +void ElevatedExecuteOperation::Private::setErrorMessage(const QString &message) +{ + if (m_customErrorMessage.isEmpty()) + q->setErrorString(message); + else + q->setErrorString(m_customErrorMessage); +} /*! Cancels the ElevatedExecuteOperation. This methods tries to terminate the process gracefully by calling QProcessWrapper::terminate. After 10 seconds, the process gets killed. diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 1613cf1c7..b7d7d2a26 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -3744,6 +3744,7 @@ bool PackageManagerCore::isUninstaller() const void PackageManagerCore::setUpdater() { d->m_magicBinaryMarker = BinaryContent::MagicUpdaterMarker; + d->m_componentByNameHash.clear(); emit installerBinaryMarkerChanged(d->m_magicBinaryMarker); } @@ -3764,6 +3765,7 @@ bool PackageManagerCore::isUpdater() const void PackageManagerCore::setPackageManager() { d->m_magicBinaryMarker = BinaryContent::MagicPackageManagerMarker; + d->m_componentByNameHash.clear(); emit installerBinaryMarkerChanged(d->m_magicBinaryMarker); } diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index 101e94767..c3642e4ee 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -212,8 +212,9 @@ Q_DECLARE_METATYPE(DynamicInstallerPage*) class PackageManagerGui::Private { public: - Private() - : m_currentId(-1) + Private(PackageManagerGui *qq) + : q(qq) + , m_currentId(-1) , m_modified(false) , m_autoSwitchPage(true) , m_showSettingsButton(false) @@ -237,6 +238,20 @@ public: QLatin1String("unknown button")); } + void showSettingsButton(bool show) + { + if (m_showSettingsButton == show) + return; + q->setOption(QWizard::HaveCustomButton1, show); + q->setButtonText(QWizard::CustomButton1, tr("&Settings")); + q->button(QWizard::CustomButton1)->setToolTip( + PackageManagerGui::tr("Specify proxy settings and configure repositories for add-on components.")); + + q->updateButtonLayout(); + m_showSettingsButton = show; + } + + PackageManagerGui *q; int m_currentId; bool m_modified; bool m_autoSwitchPage; @@ -301,7 +316,7 @@ public: */ PackageManagerGui::PackageManagerGui(PackageManagerCore *core, QWidget *parent) : QWizard(parent) - , d(new Private) + , d(new Private(this)) , m_core(core) { if (m_core->isInstaller()) @@ -1036,16 +1051,18 @@ void PackageManagerGui::showFinishedPage() */ void PackageManagerGui::showSettingsButton(bool show) { - if (d->m_showSettingsButton == show) - return; - - d->m_showSettingsButton = show; - setOption(QWizard::HaveCustomButton1, show); - setButtonText(QWizard::CustomButton1, tr("&Settings")); - button(QWizard::CustomButton1)->setToolTip( - PackageManagerGui::tr("Specify proxy settings and configure repositories for add-on components.")); + m_core->setValue(QLatin1String("ShowSettingsButton"), QString::number(show)); + d->showSettingsButton(show); +} - updateButtonLayout(); +/*! + Shows the \uicontrol Settings button if \a request is \c true. If script has + set the settings button visibility, this function has no effect. +*/ +void PackageManagerGui::requestSettingsButtonByInstaller(bool request) +{ + if (m_core->value(QLatin1String("ShowSettingsButton")).isEmpty()) + d->showSettingsButton(request); } /*! @@ -1839,7 +1856,7 @@ void IntroductionPage::setUpdater(bool value) { if (value) { entering(); - gui()->showSettingsButton(true); + gui()->requestSettingsButtonByInstaller(true); packageManagerCore()->setUpdater(); emit packageManagerCoreTypeChanged(); @@ -1851,7 +1868,7 @@ void IntroductionPage::setUninstaller(bool value) { if (value) { entering(); - gui()->showSettingsButton(true); + gui()->requestSettingsButtonByInstaller(true); packageManagerCore()->setUninstaller(); emit packageManagerCoreTypeChanged(); @@ -1863,7 +1880,7 @@ void IntroductionPage::setPackageManager(bool value) { if (value) { entering(); - gui()->showSettingsButton(true); + gui()->requestSettingsButtonByInstaller(true); packageManagerCore()->setPackageManager(); emit packageManagerCoreTypeChanged(); diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h index a25329b9c..ba27c4af6 100644 --- a/src/libs/installer/packagemanagergui.h +++ b/src/libs/installer/packagemanagergui.h @@ -84,6 +84,7 @@ public: bool isButtonEnabled(int wizardButton); void showSettingsButton(bool show); + void requestSettingsButtonByInstaller(bool request); void setSettingsButtonEnabled(bool enable); void updateButtonLayout(); diff --git a/src/libs/kdtools/filedownloader.cpp b/src/libs/kdtools/filedownloader.cpp index 2510dc4c8..6152811aa 100644 --- a/src/libs/kdtools/filedownloader.cpp +++ b/src/libs/kdtools/filedownloader.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 Klaralvdalens Datakonsult AB (KDAB) +** Copyright (C) 2023 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -1483,21 +1484,35 @@ void KDUpdater::HttpDownloader::startDownload(const QUrl &url) void (QNetworkReply::*errorSignal)(QNetworkReply::NetworkError) = &QNetworkReply::error; connect(d->http, errorSignal, this, &HttpDownloader::httpError); + bool fileOpened = false; if (d->destFileName.isEmpty()) { QTemporaryFile *file = new QTemporaryFile(this); - file->open(); + fileOpened = file->open(); d->destination = file; } else { d->destination = new QFile(d->destFileName, this); - d->destination->open(QIODevice::ReadWrite | QIODevice::Truncate); + fileOpened = d->destination->open(QIODevice::ReadWrite | QIODevice::Truncate); } - - if (!d->destination->isOpen()) { - const QString error = d->destination->errorString(); - const QString fileName = d->destination->fileName(); - d->shutDown(); - setDownloadAborted(tr("Cannot download %1. Cannot create file \"%2\": %3").arg( - url.toString(), fileName, error)); + if (!fileOpened) { + qCWarning(QInstaller::lcInstallerInstallLog).nospace() << "Failed to open file " << d->destFileName + << ": "<<d->destination->errorString() << ". Trying again."; + QFileInfo fileInfo; + fileInfo.setFile(d->destination->fileName()); + if (!QDir().mkpath(fileInfo.absolutePath())) { + setDownloadAborted(tr("Cannot download %1. Cannot create directory for \"%2\"").arg( + url.toString(), fileInfo.filePath())); + } else { + fileOpened = d->destination->open(QIODevice::ReadWrite | QIODevice::Truncate); + if (fileOpened) + return; + if (d->destination->exists()) + qCWarning(QInstaller::lcInstallerInstallLog) << "File exists but installer is unable to open it."; + else + qCWarning(QInstaller::lcInstallerInstallLog) << "File does not exist."; + d->shutDown(); + setDownloadAborted(tr("Cannot download %1. Cannot create file \"%2\": %3").arg( + url.toString(), d->destination->fileName(), d->destination->errorString())); + } } } diff --git a/src/sdk/tabcontroller.cpp b/src/sdk/tabcontroller.cpp index 089bd8468..f82664126 100644 --- a/src/sdk/tabcontroller.cpp +++ b/src/sdk/tabcontroller.cpp @@ -244,7 +244,7 @@ void TabController::onCurrentIdChanged(int newId) { if (d->m_gui) { if (PackageManagerPage *page = qobject_cast<PackageManagerPage *>(d->m_gui->page(newId))) - d->m_gui->showSettingsButton(page->settingsButtonRequested()); + d->m_gui->requestSettingsButtonByInstaller(page->settingsButtonRequested()); } } |