diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp index 8d0a941c0f23b94d61e649311a8616bb9c2c7b6b..cbb0309a7cf0e131fbf17cbb4d3ef7db65746b9d 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp @@ -98,22 +98,30 @@ MaemoManager &MaemoManager::instance() bool MaemoManager::isValidMaemoQtVersion(const QtVersion *version) const { QString path = QDir::cleanPath(version->qmakeCommand()); - path = path.remove(QLatin1String("/bin/qmake" EXEC_SUFFIX)); - + path.remove(QLatin1String("/bin/qmake" EXEC_SUFFIX)); QDir dir(path); + const QByteArray target = dir.dirName().toAscii(); dir.cdUp(); dir.cdUp(); - - QFile file(dir.absolutePath() + QLatin1String("/cache/madde.conf")); - if (file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text)) { - const QString &target = path.mid(path.lastIndexOf(QLatin1Char('/')) + 1); - QTextStream stream(&file); - while (!stream.atEnd()) { - const QString &line = stream.readLine().trimmed(); - if (line.startsWith(QLatin1String("target")) - && line.endsWith(target)) { - return true; - } - } + QString madAdminCommand(dir.absolutePath() + QLatin1String("/bin/mad-admin")); + if (!QFileInfo(madAdminCommand).exists()) + return false; + + QStringList arguments(QLatin1String("list")); +#ifdef Q_OS_WIN + arguments.prepend(madAdminCommand); + madAdminCommand = dir.absolutePath() + QLatin1String("/bin/sh.exe"); +#endif + + QProcess madAdminProc; + madAdminProc.start(madAdminCommand, arguments); + if (!madAdminProc.waitForStarted() || !madAdminProc.waitForFinished()) + return false; + + madAdminProc.setReadChannel(QProcess::StandardOutput); + while (madAdminProc.canReadLine()) { + const QByteArray &line = madAdminProc.readLine(); + if (line.contains(target) && line.contains("(installed)")) + return true; } return false; } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp index 954f1364c6651fd3d1dc9281fe523da07e414c2c..a508773fd10cf735b5637def7fdd286572fbf6a0 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp @@ -45,14 +45,18 @@ #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> +#include <QtCore/QDebug> #include <QtCore/QDir> #include <QtCore/QList> #include <QtCore/QSet> #include <QtCore/QStringBuilder> #include <QtCore/QTextStream> -#include <QtGui/QMessageBox> #include <QtGui/QAction> +#include <QtGui/QDesktopServices> +#include <QtGui/QMessageBox> + +#include <QtXml/QXmlStreamReader> using namespace ProjectExplorer; using namespace Qt4ProjectManager; @@ -663,32 +667,56 @@ QString MaemoQemuManager::runtimeForQtVersion(const QString &qmakeCommand) const const QString &target = targetRoot(qmakeCommand); const QString &madRoot = maddeRoot(qmakeCommand); - QFile file(madRoot + QLatin1String("/cache/madde.conf")); - if (file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - QString line = stream.readLine().trimmed(); - if (!line.startsWith(QLatin1String("target"))) - continue; - - const QStringList &list = line.split(QLatin1Char(' ')); - if (list.count() <= 1 || list.at(1) != target) - continue; - - line = stream.readLine().trimmed(); - while (!stream.atEnd() && line != QLatin1String("end")) { - if (line.startsWith(QLatin1String("runtime"))) { - const QStringList &list = line.split(QLatin1Char(' ')); - if (list.count() > 1) { - return QDir::fromNativeSeparators(madRoot - + QLatin1String("/runtimes/") + list.at(1).trimmed()); + QString madCommand = madRoot + QLatin1String("/bin/mad"); + if (!QFileInfo(madCommand).exists()) + return QString(); + + QProcess madProc; + QStringList arguments(QLatin1String("info")); + +#ifdef Q_OS_WIN + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert("HOME", + QDesktopServices::storageLocation(QDesktopServices::HomeLocation)); + madProc.setProcessEnvironment(env); + + arguments.prepend(madCommand); + madCommand = madRoot + QLatin1String("/bin/sh.exe"); +#endif + + madProc.start(madCommand, arguments); + if (!madProc.waitForStarted() || !madProc.waitForFinished()) + return QString(); + + QStringList installedRuntimes; + QString targetRuntime; + QXmlStreamReader infoReader(madProc.readAllStandardOutput()); + while (!infoReader.atEnd() && !installedRuntimes.contains(targetRuntime)) { + if (infoReader.readNext() == QXmlStreamReader::StartElement) { + if (targetRuntime.isEmpty() + && infoReader.name() == QLatin1String("target")) { + const QXmlStreamAttributes &attrs = infoReader.attributes(); + if (attrs.value(QLatin1String("target_id")) == target) + targetRuntime = attrs.value("runtime_id").toString(); + } else if (infoReader.name() == QLatin1String("runtime")) { + const QXmlStreamAttributes attrs = infoReader.attributes(); + while (!infoReader.atEnd()) { + if (infoReader.readNext() == QXmlStreamReader::EndElement + && infoReader.name() == QLatin1String("runtime")) + break; + if (infoReader.tokenType() == QXmlStreamReader::StartElement + && infoReader.name() == QLatin1String("installed")) { + if (infoReader.readNext() == QXmlStreamReader::Characters + && infoReader.text() == QLatin1String("true")) + installedRuntimes << attrs.value(QLatin1String("runtime_id")).toString(); + break; } - break; } - line = stream.readLine().trimmed(); } } } + if (installedRuntimes.contains(targetRuntime)) + return madRoot + QLatin1String("/runtimes/") + targetRuntime; return QString(); }