diff --git a/src/plugins/android/androiddeployqtstep.cpp b/src/plugins/android/androiddeployqtstep.cpp index da413ec15fd..6dab07ba880 100644 --- a/src/plugins/android/androiddeployqtstep.cpp +++ b/src/plugins/android/androiddeployqtstep.cpp @@ -69,6 +69,8 @@ const Core::Id AndroidDeployQtStep::Id("Qt4ProjectManager.AndroidDeployQtStep"); // AndroidDeployQtStepFactory ///////////////// + + AndroidDeployQtStepFactory::AndroidDeployQtStepFactory(QObject *parent) : IBuildStepFactory(parent) { @@ -266,7 +268,6 @@ bool AndroidDeployQtStep::init(QList &earlierSteps) AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterface &fi) { - m_installOk = true; QString args; if (m_useAndroiddeployqt) { args = m_androiddeployqtArgs; @@ -309,10 +310,11 @@ AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterfac if (Utils::HostOsInfo::isWindowsHost()) m_process->setUseCtrlCStub(true); + DeployErrorCode deployError = NoError; connect(m_process, &Utils::QtcProcess::readyReadStandardOutput, - this, &AndroidDeployQtStep::processReadyReadStdOutput, Qt::DirectConnection); + std::bind(&AndroidDeployQtStep::processReadyReadStdOutput, this, std::ref(deployError))); connect(m_process, &Utils::QtcProcess::readyReadStandardError, - this, &AndroidDeployQtStep::processReadyReadStdError, Qt::DirectConnection); + std::bind(&AndroidDeployQtStep::processReadyReadStdError, this, std::ref(deployError))); m_process->start(); @@ -331,12 +333,16 @@ AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterfac } QString line = QString::fromLocal8Bit(m_process->readAllStandardError()); - if (!line.isEmpty()) + if (!line.isEmpty()) { + deployError |= parseDeployErrors(line); stdError(line); + } line = QString::fromLocal8Bit(m_process->readAllStandardOutput()); - if (!line.isEmpty()) + if (!line.isEmpty()) { + deployError |= parseDeployErrors(line); stdOutput(line); + } QProcess::ExitStatus exitStatus = m_process->exitStatus(); int exitCode = m_process->exitCode(); @@ -355,7 +361,7 @@ AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterfac } if (exitCode == 0 && exitStatus == QProcess::NormalExit) { - if (!m_installOk) { + if (deployError != NoError) { if (!m_uninstallPreviousPackageRun) return AskUinstall; else @@ -451,40 +457,48 @@ ProjectExplorer::BuildStepConfigWidget *AndroidDeployQtStep::createConfigWidget( return new AndroidDeployQtWidget(this); } -void AndroidDeployQtStep::processReadyReadStdOutput() +void AndroidDeployQtStep::processReadyReadStdOutput(DeployErrorCode &errorCode) { m_process->setReadChannel(QProcess::StandardOutput); while (m_process->canReadLine()) { QString line = QString::fromLocal8Bit(m_process->readLine()); + errorCode |= parseDeployErrors(line); stdOutput(line); } } void AndroidDeployQtStep::stdOutput(const QString &line) { - if (line.contains(InstallFailedInconsistentCertificatesString) - || line.contains(InstallFailedInconsistentCertificatesString2)) - m_installOk = false; emit addOutput(line, BuildStep::NormalOutput, BuildStep::DontAppendNewline); } -void AndroidDeployQtStep::processReadyReadStdError() +void AndroidDeployQtStep::processReadyReadStdError(DeployErrorCode &errorCode) { m_process->setReadChannel(QProcess::StandardError); while (m_process->canReadLine()) { QString line = QString::fromLocal8Bit(m_process->readLine()); + errorCode |= parseDeployErrors(line); stdError(line); } } void AndroidDeployQtStep::stdError(const QString &line) { - if (line.contains(InstallFailedInconsistentCertificatesString) - || line.contains(InstallFailedInconsistentCertificatesString2)) - m_installOk = false; emit addOutput(line, BuildStep::ErrorOutput, BuildStep::DontAppendNewline); } +AndroidDeployQtStep::DeployErrorCode AndroidDeployQtStep::parseDeployErrors(QString &deployOutputLine) const +{ + DeployErrorCode errorCode = NoError; + + if (deployOutputLine.contains(InstallFailedInconsistentCertificatesString)) + errorCode |= InconsistentCertificates; + if (deployOutputLine.contains(InstallFailedInconsistentCertificatesString2)) + errorCode |= UpdateIncompatible; + + return errorCode; +} + bool AndroidDeployQtStep::fromMap(const QVariantMap &map) { m_uninstallPreviousPackage = map.value(UninstallPreviousPackageKey, m_uninstallPreviousPackage).toBool(); diff --git a/src/plugins/android/androiddeployqtstep.h b/src/plugins/android/androiddeployqtstep.h index 99075b60467..32c8a854baa 100644 --- a/src/plugins/android/androiddeployqtstep.h +++ b/src/plugins/android/androiddeployqtstep.h @@ -59,6 +59,14 @@ class AndroidDeployQtStep : public ProjectExplorer::BuildStep { Q_OBJECT friend class AndroidDeployQtStepFactory; + + enum DeployErrorCode + { + NoError = 0, + InconsistentCertificates = 0x0001, + UpdateIncompatible = 0x0002 + }; + public: enum UninstallType { Keep, @@ -98,14 +106,18 @@ private: ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; bool immutable() const override { return true; } - void processReadyReadStdOutput(); + void processReadyReadStdOutput(DeployErrorCode &errorCode); void stdOutput(const QString &line); - void processReadyReadStdError(); + void processReadyReadStdError(DeployErrorCode &errorCode); void stdError(const QString &line); + DeployErrorCode parseDeployErrors(QString &deployOutputLine) const; void slotProcessFinished(int, QProcess::ExitStatus); void processFinished(int exitCode, QProcess::ExitStatus status); + friend void operator|=(DeployErrorCode &e1, const DeployErrorCode &e2) { e1 = static_cast((int)e1 | (int)e2); } + friend DeployErrorCode operator|(const DeployErrorCode &e1, const DeployErrorCode &e2) { return static_cast((int)e1 | (int)e2); } + Utils::FileName m_manifestName; QString m_serialNumber; QString m_buildDirectory; @@ -117,7 +129,6 @@ private: QString m_targetArch; bool m_uninstallPreviousPackage; bool m_uninstallPreviousPackageRun; - bool m_installOk; bool m_useAndroiddeployqt; bool m_askForUinstall; static const Core::Id Id;