diff --git a/libdiscover/Transaction/Transaction.h b/libdiscover/Transaction/Transaction.h --- a/libdiscover/Transaction/Transaction.h +++ b/libdiscover/Transaction/Transaction.h @@ -60,7 +60,9 @@ /// Transaction is doing an installation/removal CommittingStatus, /// Transaction is done - DoneStatus + DoneStatus, + /// Transaction is done, but there was an error during transaction + DoneWithErrorStatus }; Q_ENUM(Status) diff --git a/libdiscover/backends/FlatpakBackend/FlatpakTransaction.h b/libdiscover/backends/FlatpakBackend/FlatpakTransaction.h --- a/libdiscover/backends/FlatpakBackend/FlatpakTransaction.h +++ b/libdiscover/backends/FlatpakBackend/FlatpakTransaction.h @@ -47,18 +47,16 @@ void setRuntime(FlatpakResource *runtime); public Q_SLOTS: - void onAppJobFinished(bool success, const QString &errorMessage); + void onAppJobFinished(); void onAppJobProgressChanged(int progress); - void onRuntimeJobFinished(bool success, const QString &errorMessage); + void onRuntimeJobFinished(); void onRuntimeJobProgressChanged(int progress); - void finishTransaction(bool success); + void finishTransaction(); void start(); private: void updateProgress(); - bool m_appJobFinished; - bool m_runtimeJobFinished; int m_appJobProgress; int m_runtimeJobProgress; QPointer m_app; diff --git a/libdiscover/backends/FlatpakBackend/FlatpakTransaction.cpp b/libdiscover/backends/FlatpakBackend/FlatpakTransaction.cpp --- a/libdiscover/backends/FlatpakBackend/FlatpakTransaction.cpp +++ b/libdiscover/backends/FlatpakBackend/FlatpakTransaction.cpp @@ -36,8 +36,6 @@ FlatpakTransaction::FlatpakTransaction(FlatpakInstallation* installation, FlatpakResource *app, FlatpakResource *runtime, Transaction::Role role, bool delayStart) : Transaction(app->backend(), app, role, {}) - , m_appJobFinished(false) - , m_runtimeJobFinished(false) , m_appJobProgress(0) , m_runtimeJobProgress(0) , m_app(app) @@ -75,37 +73,31 @@ void FlatpakTransaction::start() { if (m_runtime) { - m_runtimeJob = new FlatpakTransactionJob(m_installation, m_runtime, role()); - connect(m_runtimeJob, &FlatpakTransactionJob::finished, m_runtimeJob, &FlatpakTransactionJob::deleteLater); - connect(m_runtimeJob, &FlatpakTransactionJob::jobFinished, this, &FlatpakTransaction::onRuntimeJobFinished); + m_runtimeJob = new FlatpakTransactionJob(m_installation, m_runtime, role(), this); + connect(m_runtimeJob, &FlatpakTransactionJob::finished, this, &FlatpakTransaction::onRuntimeJobFinished); connect(m_runtimeJob, &FlatpakTransactionJob::progressChanged, this, &FlatpakTransaction::onRuntimeJobProgressChanged); m_runtimeJob->start(); - } else { - // We can mark runtime job as finished as we don't need to start it - m_runtimeJobFinished = true; } // App job will be started everytime - m_appJob = new FlatpakTransactionJob(m_installation, m_app, role()); - connect(m_appJob, &FlatpakTransactionJob::finished, m_appJob, &FlatpakTransactionJob::deleteLater); - connect(m_appJob, &FlatpakTransactionJob::jobFinished, this, &FlatpakTransaction::onAppJobFinished); + m_appJob = new FlatpakTransactionJob(m_installation, m_app, role(), this); + connect(m_appJob, &FlatpakTransactionJob::finished, this, &FlatpakTransaction::onAppJobFinished); connect(m_appJob, &FlatpakTransactionJob::progressChanged, this, &FlatpakTransaction::onAppJobProgressChanged); m_appJob->start(); } -void FlatpakTransaction::onAppJobFinished(bool success, const QString &errorMessage) +void FlatpakTransaction::onAppJobFinished() { - m_appJobFinished = true; m_appJobProgress = 100; updateProgress(); - if (!success) { - Q_EMIT passiveMessage(errorMessage); + if (!m_appJob->result()) { + Q_EMIT passiveMessage(m_appJob->errorMessage()); } - if (m_runtimeJobFinished) { - finishTransaction(success); + if ((m_runtimeJob && m_runtimeJob->isFinished()) || !m_runtimeJob) { + finishTransaction(); } } @@ -116,19 +108,23 @@ updateProgress(); } -void FlatpakTransaction::onRuntimeJobFinished(bool success, const QString &errorMessage) +void FlatpakTransaction::onRuntimeJobFinished() { - m_runtimeJobFinished = true; m_runtimeJobProgress = 100; updateProgress(); - if (!success) { - Q_EMIT passiveMessage(errorMessage); + if (!m_runtimeJob->result()) { + Q_EMIT passiveMessage(m_runtimeJob->errorMessage()); + } else { + // This should be the only case when runtime is automatically installed, but better to check + if (role() == InstallRole) { + m_runtime->setState(AbstractResource::Installed); + } } - if (m_appJobFinished) { - finishTransaction(success); + if (m_appJob->isFinished()) { + finishTransaction(); } } @@ -148,9 +144,9 @@ } } -void FlatpakTransaction::finishTransaction(bool success) +void FlatpakTransaction::finishTransaction() { - if (success) { + if (m_appJob->result()) { AbstractResource::State newState = AbstractResource::None; switch(role()) { case InstallRole: @@ -161,13 +157,13 @@ newState = AbstractResource::None; break; } + m_app->setState(newState); - if (m_runtime && role() == InstallRole) { - m_runtime->setState(newState); - } - } - setStatus(DoneStatus); + setStatus(DoneStatus); + } else { + setStatus(DoneWithErrorStatus); + } TransactionModel::global()->removeTransaction(this); } diff --git a/libdiscover/backends/FlatpakBackend/FlatpakTransactionJob.h b/libdiscover/backends/FlatpakBackend/FlatpakTransactionJob.h --- a/libdiscover/backends/FlatpakBackend/FlatpakTransactionJob.h +++ b/libdiscover/backends/FlatpakBackend/FlatpakTransactionJob.h @@ -35,18 +35,21 @@ { Q_OBJECT public: - FlatpakTransactionJob(FlatpakInstallation *installation, FlatpakResource *app, Transaction::Role role); + FlatpakTransactionJob(FlatpakInstallation *installation, FlatpakResource *app, Transaction::Role role, QObject *parent = nullptr); ~FlatpakTransactionJob(); void cancel(); void run() override; + QString errorMessage() const; + bool result() const; Q_SIGNALS: - void jobFinished(bool success, const QString& errorMessage); void progressChanged(int progress); private: + bool m_result; + QString m_errorMessage; GCancellable *m_cancellable; FlatpakResource *m_app; FlatpakInstallation *m_installation; diff --git a/libdiscover/backends/FlatpakBackend/FlatpakTransactionJob.cpp b/libdiscover/backends/FlatpakBackend/FlatpakTransactionJob.cpp --- a/libdiscover/backends/FlatpakBackend/FlatpakTransactionJob.cpp +++ b/libdiscover/backends/FlatpakBackend/FlatpakTransactionJob.cpp @@ -36,8 +36,9 @@ Q_EMIT transactionJob->progressChanged(progress); } -FlatpakTransactionJob::FlatpakTransactionJob(FlatpakInstallation *installation, FlatpakResource *app, Transaction::Role role) - : QThread() +FlatpakTransactionJob::FlatpakTransactionJob(FlatpakInstallation *installation, FlatpakResource *app, Transaction::Role role, QObject *parent) + : QThread(parent) + , m_result(false) , m_app(app) , m_installation(installation) , m_role(role) @@ -58,7 +59,6 @@ void FlatpakTransactionJob::run() { g_autoptr(GError) localError = nullptr; - g_autoptr(GCancellable) cancellable = g_cancellable_new(); g_autoptr(FlatpakInstalledRef) ref = nullptr; if (m_role == Transaction::Role::InstallRole) { @@ -71,7 +71,7 @@ m_app->branch().toStdString().c_str(), flatpakInstallationProgressCallback, this, - cancellable, &localError); + m_cancellable, &localError); } else { if (m_app->flatpakFileType() == QStringLiteral("flatpak")) { g_autoptr(GFile) file = g_file_new_for_path(m_app->resourceFile().toLocalFile().toStdString().c_str()); @@ -88,13 +88,14 @@ m_app->branch().toStdString().c_str(), flatpakInstallationProgressCallback, this, - cancellable, &localError); + m_cancellable, &localError); } } if (!ref) { - qWarning() << "Failed to install" << m_app->name() << ':' << localError->message; - Q_EMIT jobFinished(false, QString::fromUtf8(localError->message)); + m_result = false; + m_errorMessage = QString::fromUtf8(localError->message); + qWarning() << "Failed to install" << m_app->name() << ':' << m_errorMessage; return; } } else if (m_role == Transaction::Role::RemoveRole) { @@ -105,12 +106,24 @@ m_app->branch().toStdString().c_str(), flatpakInstallationProgressCallback, this, - cancellable, &localError)) { - qWarning() << "Failed to uninstall" << m_app->name() << ':' << localError->message; - Q_EMIT jobFinished(false, QString::fromUtf8(localError->message)); + m_cancellable, &localError)) { + m_result = false; + m_errorMessage = QString::fromUtf8(localError->message); + qWarning() << "Failed to uninstall" << m_app->name() << ':' << m_errorMessage; return; } } - Q_EMIT jobFinished(true, QString()); + m_result = true; } + +QString FlatpakTransactionJob::errorMessage() const +{ + return m_errorMessage; +} + +bool FlatpakTransactionJob::result() const +{ + return m_result; +} +