Refactoring: Android Deployment failure error codes

Change-Id: I88165fcad770e8b8341b252e4fc32b437528647b
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
This commit is contained in:
Vikas Pachdha
2016-07-28 17:32:08 +02:00
parent 7e73e9c48f
commit 5cdff92c58
2 changed files with 42 additions and 17 deletions

View File

@@ -69,6 +69,8 @@ const Core::Id AndroidDeployQtStep::Id("Qt4ProjectManager.AndroidDeployQtStep");
// AndroidDeployQtStepFactory // AndroidDeployQtStepFactory
///////////////// /////////////////
AndroidDeployQtStepFactory::AndroidDeployQtStepFactory(QObject *parent) AndroidDeployQtStepFactory::AndroidDeployQtStepFactory(QObject *parent)
: IBuildStepFactory(parent) : IBuildStepFactory(parent)
{ {
@@ -266,7 +268,6 @@ bool AndroidDeployQtStep::init(QList<const BuildStep *> &earlierSteps)
AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterface<bool> &fi) AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterface<bool> &fi)
{ {
m_installOk = true;
QString args; QString args;
if (m_useAndroiddeployqt) { if (m_useAndroiddeployqt) {
args = m_androiddeployqtArgs; args = m_androiddeployqtArgs;
@@ -309,10 +310,11 @@ AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterfac
if (Utils::HostOsInfo::isWindowsHost()) if (Utils::HostOsInfo::isWindowsHost())
m_process->setUseCtrlCStub(true); m_process->setUseCtrlCStub(true);
DeployErrorCode deployError = NoError;
connect(m_process, &Utils::QtcProcess::readyReadStandardOutput, 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, connect(m_process, &Utils::QtcProcess::readyReadStandardError,
this, &AndroidDeployQtStep::processReadyReadStdError, Qt::DirectConnection); std::bind(&AndroidDeployQtStep::processReadyReadStdError, this, std::ref(deployError)));
m_process->start(); m_process->start();
@@ -331,12 +333,16 @@ AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterfac
} }
QString line = QString::fromLocal8Bit(m_process->readAllStandardError()); QString line = QString::fromLocal8Bit(m_process->readAllStandardError());
if (!line.isEmpty()) if (!line.isEmpty()) {
deployError |= parseDeployErrors(line);
stdError(line); stdError(line);
}
line = QString::fromLocal8Bit(m_process->readAllStandardOutput()); line = QString::fromLocal8Bit(m_process->readAllStandardOutput());
if (!line.isEmpty()) if (!line.isEmpty()) {
deployError |= parseDeployErrors(line);
stdOutput(line); stdOutput(line);
}
QProcess::ExitStatus exitStatus = m_process->exitStatus(); QProcess::ExitStatus exitStatus = m_process->exitStatus();
int exitCode = m_process->exitCode(); int exitCode = m_process->exitCode();
@@ -355,7 +361,7 @@ AndroidDeployQtStep::DeployResult AndroidDeployQtStep::runDeploy(QFutureInterfac
} }
if (exitCode == 0 && exitStatus == QProcess::NormalExit) { if (exitCode == 0 && exitStatus == QProcess::NormalExit) {
if (!m_installOk) { if (deployError != NoError) {
if (!m_uninstallPreviousPackageRun) if (!m_uninstallPreviousPackageRun)
return AskUinstall; return AskUinstall;
else else
@@ -451,40 +457,48 @@ ProjectExplorer::BuildStepConfigWidget *AndroidDeployQtStep::createConfigWidget(
return new AndroidDeployQtWidget(this); return new AndroidDeployQtWidget(this);
} }
void AndroidDeployQtStep::processReadyReadStdOutput() void AndroidDeployQtStep::processReadyReadStdOutput(DeployErrorCode &errorCode)
{ {
m_process->setReadChannel(QProcess::StandardOutput); m_process->setReadChannel(QProcess::StandardOutput);
while (m_process->canReadLine()) { while (m_process->canReadLine()) {
QString line = QString::fromLocal8Bit(m_process->readLine()); QString line = QString::fromLocal8Bit(m_process->readLine());
errorCode |= parseDeployErrors(line);
stdOutput(line); stdOutput(line);
} }
} }
void AndroidDeployQtStep::stdOutput(const QString &line) void AndroidDeployQtStep::stdOutput(const QString &line)
{ {
if (line.contains(InstallFailedInconsistentCertificatesString)
|| line.contains(InstallFailedInconsistentCertificatesString2))
m_installOk = false;
emit addOutput(line, BuildStep::NormalOutput, BuildStep::DontAppendNewline); emit addOutput(line, BuildStep::NormalOutput, BuildStep::DontAppendNewline);
} }
void AndroidDeployQtStep::processReadyReadStdError() void AndroidDeployQtStep::processReadyReadStdError(DeployErrorCode &errorCode)
{ {
m_process->setReadChannel(QProcess::StandardError); m_process->setReadChannel(QProcess::StandardError);
while (m_process->canReadLine()) { while (m_process->canReadLine()) {
QString line = QString::fromLocal8Bit(m_process->readLine()); QString line = QString::fromLocal8Bit(m_process->readLine());
errorCode |= parseDeployErrors(line);
stdError(line); stdError(line);
} }
} }
void AndroidDeployQtStep::stdError(const QString &line) void AndroidDeployQtStep::stdError(const QString &line)
{ {
if (line.contains(InstallFailedInconsistentCertificatesString)
|| line.contains(InstallFailedInconsistentCertificatesString2))
m_installOk = false;
emit addOutput(line, BuildStep::ErrorOutput, BuildStep::DontAppendNewline); 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) bool AndroidDeployQtStep::fromMap(const QVariantMap &map)
{ {
m_uninstallPreviousPackage = map.value(UninstallPreviousPackageKey, m_uninstallPreviousPackage).toBool(); m_uninstallPreviousPackage = map.value(UninstallPreviousPackageKey, m_uninstallPreviousPackage).toBool();

View File

@@ -59,6 +59,14 @@ class AndroidDeployQtStep : public ProjectExplorer::BuildStep
{ {
Q_OBJECT Q_OBJECT
friend class AndroidDeployQtStepFactory; friend class AndroidDeployQtStepFactory;
enum DeployErrorCode
{
NoError = 0,
InconsistentCertificates = 0x0001,
UpdateIncompatible = 0x0002
};
public: public:
enum UninstallType { enum UninstallType {
Keep, Keep,
@@ -98,14 +106,18 @@ private:
ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override;
bool immutable() const override { return true; } bool immutable() const override { return true; }
void processReadyReadStdOutput(); void processReadyReadStdOutput(DeployErrorCode &errorCode);
void stdOutput(const QString &line); void stdOutput(const QString &line);
void processReadyReadStdError(); void processReadyReadStdError(DeployErrorCode &errorCode);
void stdError(const QString &line); void stdError(const QString &line);
DeployErrorCode parseDeployErrors(QString &deployOutputLine) const;
void slotProcessFinished(int, QProcess::ExitStatus); void slotProcessFinished(int, QProcess::ExitStatus);
void processFinished(int exitCode, QProcess::ExitStatus status); void processFinished(int exitCode, QProcess::ExitStatus status);
friend void operator|=(DeployErrorCode &e1, const DeployErrorCode &e2) { e1 = static_cast<AndroidDeployQtStep::DeployErrorCode>((int)e1 | (int)e2); }
friend DeployErrorCode operator|(const DeployErrorCode &e1, const DeployErrorCode &e2) { return static_cast<AndroidDeployQtStep::DeployErrorCode>((int)e1 | (int)e2); }
Utils::FileName m_manifestName; Utils::FileName m_manifestName;
QString m_serialNumber; QString m_serialNumber;
QString m_buildDirectory; QString m_buildDirectory;
@@ -117,7 +129,6 @@ private:
QString m_targetArch; QString m_targetArch;
bool m_uninstallPreviousPackage; bool m_uninstallPreviousPackage;
bool m_uninstallPreviousPackageRun; bool m_uninstallPreviousPackageRun;
bool m_installOk;
bool m_useAndroiddeployqt; bool m_useAndroiddeployqt;
bool m_askForUinstall; bool m_askForUinstall;
static const Core::Id Id; static const Core::Id Id;