Maemo: Qemu improvements.

Get rid of redundancy, add sanity check, better status reporting.
This commit is contained in:
ck
2010-07-22 12:10:44 +02:00
parent c95d83d6fc
commit 9927249665
2 changed files with 57 additions and 41 deletions

View File

@@ -110,6 +110,10 @@ QemuRuntimeManager::QemuRuntimeManager(QObject *parent)
SLOT(qemuProcessError(QProcess::ProcessError))); SLOT(qemuProcessError(QProcess::ProcessError)));
connect(m_qemuProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, connect(m_qemuProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this,
SLOT(qemuProcessFinished())); SLOT(qemuProcessFinished()));
connect(m_qemuProcess, SIGNAL(readyReadStandardOutput()), this,
SLOT(qemuOutput()));
connect(m_qemuProcess, SIGNAL(readyReadStandardError()), this,
SLOT(qemuOutput()));
connect(this, SIGNAL(qemuProcessStatus(QemuStatus, QString)), connect(this, SIGNAL(qemuProcessStatus(QemuStatus, QString)),
this, SLOT(qemuStatusChanged(QemuStatus, QString))); this, SLOT(qemuStatusChanged(QemuStatus, QString)));
} }
@@ -285,7 +289,7 @@ void QemuRuntimeManager::runConfigurationRemoved(ProjectExplorer::RunConfigurati
void QemuRuntimeManager::runConfigurationChanged(ProjectExplorer::RunConfiguration *rc) void QemuRuntimeManager::runConfigurationChanged(ProjectExplorer::RunConfiguration *rc)
{ {
if (rc) if (rc)
m_qemuAction->setEnabled(targetUsesRuntimeConfig(rc->target())); m_qemuAction->setEnabled(targetUsesMatchingRuntimeConfig(rc->target()));
} }
void QemuRuntimeManager::buildConfigurationAdded(ProjectExplorer::BuildConfiguration *bc) void QemuRuntimeManager::buildConfigurationAdded(ProjectExplorer::BuildConfiguration *bc)
@@ -321,7 +325,7 @@ void QemuRuntimeManager::environmentChanged()
void QemuRuntimeManager::deviceConfigurationChanged(ProjectExplorer::Target *target) void QemuRuntimeManager::deviceConfigurationChanged(ProjectExplorer::Target *target)
{ {
m_qemuAction->setEnabled(targetUsesRuntimeConfig(target)); m_qemuAction->setEnabled(targetUsesMatchingRuntimeConfig(target));
} }
void QemuRuntimeManager::startRuntime() void QemuRuntimeManager::startRuntime()
@@ -330,38 +334,33 @@ void QemuRuntimeManager::startRuntime()
Project *p = ProjectExplorerPlugin::instance()->session()->startupProject(); Project *p = ProjectExplorerPlugin::instance()->session()->startupProject();
if (!p) if (!p)
return; return;
QtVersion *version;
Qt4Target *qt4Target = qobject_cast<Qt4Target*> (p->activeTarget()); if (!targetUsesMatchingRuntimeConfig(p->activeTarget(), &version)) {
if (!qt4Target) qWarning("Strange: Qemu button was enabled, but target does not match.");
return; return;
}
Qt4BuildConfiguration *bc = qt4Target->activeBuildConfiguration(); m_runningQtId = version->uniqueId();
if (!bc) const QString root
return; = QDir::toNativeSeparators(maddeRoot(version->qmakeCommand())
QtVersion *version = bc->qtVersion();
if (version && m_runtimes.contains(version->uniqueId())) {
m_runningQtId = version->uniqueId();
const QString root =
QDir::toNativeSeparators(maddeRoot(version->qmakeCommand())
+ QLatin1Char('/')); + QLatin1Char('/'));
const Runtime rt = m_runtimes.value(version->uniqueId()); const Runtime rt = m_runtimes.value(version->uniqueId());
QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
const QLatin1Char colon(';'); const QLatin1Char colon(';');
const QLatin1String key("PATH"); const QLatin1String key("PATH");
env.insert(key, env.value(key) % colon % root % QLatin1String("bin")); env.insert(key, env.value(key) % colon % root % QLatin1String("bin"));
env.insert(key, env.value(key) % colon % root % QLatin1String("madlib")); env.insert(key, env.value(key) % colon % root % QLatin1String("madlib"));
#elif defined(Q_OS_UNIX) #elif defined(Q_OS_UNIX)
const QLatin1String key("LD_LIBRARY_PATH"); const QLatin1String key("LD_LIBRARY_PATH");
env.insert(key, env.value(key) % QLatin1Char(':') % rt.m_libPath); env.insert(key, env.value(key) % QLatin1Char(':') % rt.m_libPath);
#endif #endif
m_qemuProcess->setProcessEnvironment(env); m_qemuProcess->setProcessEnvironment(env);
m_qemuProcess->setWorkingDirectory(rt.m_root); m_qemuProcess->setWorkingDirectory(rt.m_root);
// This is complex because of extreme MADDE weirdness. // This is complex because of extreme MADDE weirdness.
const bool pathIsRelative = QFileInfo(rt.m_bin).isRelative(); const bool pathIsRelative = QFileInfo(rt.m_bin).isRelative();
const QString app = const QString app =
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
root % (pathIsRelative root % (pathIsRelative
? QLatin1String("madlib/") % rt.m_bin // Fremantle. ? QLatin1String("madlib/") % rt.m_bin // Fremantle.
@@ -373,15 +372,14 @@ void QemuRuntimeManager::startRuntime()
: rt.m_bin; // Haramattan. : rt.m_bin; // Haramattan.
#endif #endif
m_qemuProcess->start(app % QLatin1Char(' ') % rt.m_args, m_qemuProcess->start(app % QLatin1Char(' ') % rt.m_args,
QIODevice::ReadWrite); QIODevice::ReadWrite);
if (!m_qemuProcess->waitForStarted()) if (!m_qemuProcess->waitForStarted())
return; return;
emit qemuProcessStatus(QemuStarting); emit qemuProcessStatus(QemuStarting);
connect(m_qemuAction, SIGNAL(triggered()), this, SLOT(terminateRuntime())); connect(m_qemuAction, SIGNAL(triggered()), this, SLOT(terminateRuntime()));
disconnect(m_qemuAction, SIGNAL(triggered()), this, SLOT(startRuntime())); disconnect(m_qemuAction, SIGNAL(triggered()), this, SLOT(startRuntime()));
}
} }
void QemuRuntimeManager::terminateRuntime() void QemuRuntimeManager::terminateRuntime()
@@ -401,14 +399,20 @@ void QemuRuntimeManager::qemuProcessFinished()
{ {
m_runningQtId = -1; m_runningQtId = -1;
QemuStatus status = QemuFinished; QemuStatus status = QemuFinished;
QString error;
if (!m_userTerminated) { if (!m_userTerminated) {
status = m_qemuProcess->exitStatus() == QProcess::CrashExit if (m_qemuProcess->exitStatus() == QProcess::CrashExit) {
? QemuCrashed : QemuFinished; status = QemuCrashed;
error = m_qemuProcess->errorString();
} else if (m_qemuProcess->exitCode() != 0) {
error = tr("Qemu finished with error: Exit code was %1.")
.arg(m_qemuProcess->exitCode());
}
} }
m_userTerminated = false; m_userTerminated = false;
emit qemuProcessStatus(status); emit qemuProcessStatus(status, error);
} }
void QemuRuntimeManager::qemuProcessError(QProcess::ProcessError error) void QemuRuntimeManager::qemuProcessError(QProcess::ProcessError error)
@@ -433,6 +437,7 @@ void QemuRuntimeManager::qemuStatusChanged(QemuStatus status, const QString &err
message = tr("Qemu crashed"); message = tr("Qemu crashed");
break; break;
case QemuFinished: case QemuFinished:
message = error;
break; break;
case QemuUserReason: case QemuUserReason:
message = error; message = error;
@@ -446,6 +451,12 @@ void QemuRuntimeManager::qemuStatusChanged(QemuStatus status, const QString &err
updateStarterIcon(running); updateStarterIcon(running);
} }
void QemuRuntimeManager::qemuOutput()
{
qDebug("%s", m_qemuProcess->readAllStandardOutput().data());
qDebug("%s", m_qemuProcess->readAllStandardError().data());
}
// -- private // -- private
void QemuRuntimeManager::setupRuntimes() void QemuRuntimeManager::setupRuntimes()
@@ -498,7 +509,7 @@ void QemuRuntimeManager::toggleStarterButton(Target *target)
isRunning = false; isRunning = false;
m_qemuAction->setEnabled(m_runtimes.contains(uniqueId) m_qemuAction->setEnabled(m_runtimes.contains(uniqueId)
&& targetUsesRuntimeConfig(target) && !isRunning); && targetUsesMatchingRuntimeConfig(target) && !isRunning);
} }
bool QemuRuntimeManager::sessionHasMaemoTarget() const bool QemuRuntimeManager::sessionHasMaemoTarget() const
@@ -511,7 +522,8 @@ bool QemuRuntimeManager::sessionHasMaemoTarget() const
return result; return result;
} }
bool QemuRuntimeManager::targetUsesRuntimeConfig(Target *target) bool QemuRuntimeManager::targetUsesMatchingRuntimeConfig(Target *target,
QtVersion **qtVersion)
{ {
if (!target) if (!target)
return false; return false;
@@ -528,6 +540,8 @@ bool QemuRuntimeManager::targetUsesRuntimeConfig(Target *target)
if (!version || !m_runtimes.contains(version->uniqueId())) if (!version || !m_runtimes.contains(version->uniqueId()))
return false; return false;
if (qtVersion)
*qtVersion = version;
const MaemoDeviceConfig &config = mrc->deviceConfig(); const MaemoDeviceConfig &config = mrc->deviceConfig();
return config.isValid() && config.type == MaemoDeviceConfig::Simulator; return config.isValid() && config.type == MaemoDeviceConfig::Simulator;
} }

View File

@@ -110,6 +110,7 @@ private slots:
void qemuProcessFinished(); void qemuProcessFinished();
void qemuProcessError(QProcess::ProcessError error); void qemuProcessError(QProcess::ProcessError error);
void qemuStatusChanged(QemuStatus status, const QString &error); void qemuStatusChanged(QemuStatus status, const QString &error);
void qemuOutput();
private: private:
void setupRuntimes(); void setupRuntimes();
@@ -117,7 +118,8 @@ private:
void updateStarterIcon(bool running); void updateStarterIcon(bool running);
void toggleStarterButton(ProjectExplorer::Target *target); void toggleStarterButton(ProjectExplorer::Target *target);
bool targetUsesRuntimeConfig(ProjectExplorer::Target *target); bool targetUsesMatchingRuntimeConfig(ProjectExplorer::Target *target,
QtVersion **qtVersion = 0);
QString maddeRoot(const QString &qmake) const; QString maddeRoot(const QString &qmake) const;
QString targetRoot(const QString &qmake) const; QString targetRoot(const QString &qmake) const;