Abort installation when a job fails

This commit is contained in:
Aurélien Gâteau 2014-07-10 14:46:08 +02:00
parent 7894bb9462
commit 165d28fc23
4 changed files with 45 additions and 4 deletions

View File

@ -46,7 +46,12 @@ public:
for( auto job : m_jobs ) for( auto job : m_jobs )
{ {
emitProgress( current, total, job->prettyName() ); emitProgress( current, total, job->prettyName() );
job->exec(); JobResult result = job->exec();
if ( !result )
{
emitFailed( result.message(), result.details() );
return;
}
++current; ++current;
} }
emitProgress( total, total, QString() ); emitProgress( total, total, QString() );
@ -64,6 +69,14 @@ private:
Q_ARG( QString, prettyName ) Q_ARG( QString, prettyName )
); );
} }
void emitFailed( const QString& message, const QString& details )
{
QMetaObject::invokeMethod( m_queue, "failed", Qt::QueuedConnection,
Q_ARG( QString, message ),
Q_ARG( QString, details )
);
}
}; };

View File

@ -43,6 +43,7 @@ public:
signals: signals:
void progress( int current, int total, const QString& prettyName ); void progress( int current, int total, const QString& prettyName );
void failed( const QString& message, const QString& details );
private: private:
static JobQueue* s_instance; static JobQueue* s_instance;

View File

@ -23,8 +23,8 @@
#include "JobQueue.h" #include "JobQueue.h"
#include <QApplication> #include <QApplication>
#include <QLabel>
#include <QBoxLayout> #include <QBoxLayout>
#include <QMessageBox>
namespace Calamares namespace Calamares
{ {
@ -194,11 +194,37 @@ ViewManager::back()
void void
ViewManager::startInstallation() ViewManager::startInstallation()
{ {
JobQueue* queue = JobQueue::instance();
for( ViewStep* step : m_prepareSteps ) for( ViewStep* step : m_prepareSteps )
{ {
JobQueue::instance()->enqueue( step->jobs() ); queue->enqueue( step->jobs() );
} }
JobQueue::instance()->start(); connect( queue, &JobQueue::failed, this, &ViewManager::onInstallationFailed );
queue->start();
}
void
ViewManager::onInstallationFailed( const QString& message, const QString& details )
{
QString text = tr(
"<p><b>Installation Failed</b></p>"
"<p>%1</p>"
).arg( message );
if ( !details.isEmpty() )
{
text += tr(
"<p>%1</p>"
).arg( details );
}
QMessageBox::critical(
QApplication::activeWindow(),
tr( "Error" ),
text,
QMessageBox::Close
);
QApplication::quit();
} }
} }

View File

@ -73,6 +73,7 @@ private:
void insertViewStep( int before, ViewStep* step ); void insertViewStep( int before, ViewStep* step );
void startInstallation(); void startInstallation();
void onInstallationFailed( const QString& message, const QString& details );
}; };
} }