diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp index a9bcc354e0f..44474a2c41b 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp @@ -98,22 +98,56 @@ bool S60Devices::read() #endif } +// Windows: Get list of paths containing common program data +// as pointed to by environment. +static QStringList commonProgramFilesPaths() +{ + const QChar pathSep = QLatin1Char(';'); + QStringList rc; + const QByteArray commonX86 = qgetenv("CommonProgramFiles(x86)"); + if (!commonX86.isEmpty()) + rc += QString::fromLocal8Bit(commonX86).split(pathSep); + const QByteArray common = qgetenv("CommonProgramFiles"); + if (!common.isEmpty()) + rc += QString::fromLocal8Bit(common).split(pathSep); + return rc; +} + // Windows EPOC +// Find the "devices.xml" file containing the SDKs +static QString devicesXmlFile(QString *errorMessage) +{ + const QString devicesFile = QLatin1String(SYMBIAN_DEVICES_FILE); + // Try registry + const QSettings settings(QLatin1String(SYMBIAN_SDKS_KEY), QSettings::NativeFormat); + const QString devicesRegistryXmlPath = settings.value(QLatin1String(SYMBIAN_PATH_KEY)).toString(); + if (!devicesRegistryXmlPath.isEmpty()) + return QDir::cleanPath(devicesRegistryXmlPath + QLatin1Char('/') + devicesFile); + // Look up common program data files + const QString symbianDir = QLatin1String("/symbian/"); + foreach(const QString &commonDataDir, commonProgramFilesPaths()) { + const QFileInfo fi(commonDataDir + symbianDir + devicesFile); + if (fi.isFile()) + return fi.absoluteFilePath(); + } + // None found... + *errorMessage = QString::fromLatin1("The file '%1' containing the device SDK configuration " + "could not be found looking at the registry key " + "%2\\%3 or the common program data directories."). + arg(devicesFile, QLatin1String(SYMBIAN_SDKS_KEY), + QLatin1String(SYMBIAN_PATH_KEY)); + return QString(); +} + bool S60Devices::readWin() { - // Check the windows registry via QSettings for devices.xml path - QSettings settings(SYMBIAN_SDKS_KEY, QSettings::NativeFormat); - QString devicesXmlPath = settings.value(SYMBIAN_PATH_KEY).toString(); - if (devicesXmlPath.isEmpty()) { - m_errorString = "Could not find installed SDKs in registry."; + const QString devicesXmlPath = devicesXmlFile(&m_errorString); + if (devicesXmlPath.isEmpty()) return false; - } - - devicesXmlPath += QLatin1String("/") + QLatin1String(SYMBIAN_DEVICES_FILE); QFile devicesFile(devicesXmlPath); - if (!devicesFile.open(QIODevice::ReadOnly)) { - m_errorString = QString("Could not read devices file at %1.").arg(devicesXmlPath); + if (!devicesFile.open(QIODevice::ReadOnly|QIODevice::Text)) { + m_errorString = QString::fromLatin1("Could not open the devices file %1: %2").arg(devicesXmlPath, devicesFile.errorString()); return false; } QXmlStreamReader xml(&devicesFile); @@ -152,10 +186,10 @@ bool S60Devices::readWin() } devicesFile.close(); if (xml.hasError()) { - m_errorString = xml.errorString(); + m_errorString = QString::fromLatin1("Syntax error in devices file %1: %2"). + arg(devicesXmlPath, xml.errorString()); return false; } - return true; } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp index 81023915f02..c1b616eb772 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp @@ -72,8 +72,26 @@ void S60DevicesWidget::updateDevicesList() item->setToolTip(1, tooltip); m_ui->list->addTopLevelItem(item); } + const QString errorString = m_devices->errorString(); + if (errorString.isEmpty()) { + clearErrorLabel(); + } else { + setErrorLabel(errorString); + } } +void S60DevicesWidget::setErrorLabel(const QString& t) +{ + m_ui->errorLabel->setText(t); + m_ui->errorLabel->setVisible(true); +} + +void S60DevicesWidget::clearErrorLabel() +{ + m_ui->errorLabel->setVisible(false); +} + + S60DevicesPreferencePane::S60DevicesPreferencePane(S60Devices *devices, QObject *parent) : Core::IOptionsPage(parent), m_widget(0), @@ -121,3 +139,5 @@ void S60DevicesPreferencePane::apply() void S60DevicesPreferencePane::finish() { } + + diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.h b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.h index 3378dcd3169..92efc14e499 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.h @@ -56,6 +56,9 @@ private slots: private: void updateDevicesList(); + void setErrorLabel(const QString&); + void clearErrorLabel(); + Ui::S60DevicesPreferencePane *m_ui; S60Devices *m_devices; }; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.ui b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.ui index f739161007a..1693e3e8a5b 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.ui +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.ui @@ -15,7 +15,7 @@ - + Installed S60 SDKs: @@ -50,6 +50,22 @@ + + + + background-color: red; + + + Error + + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + +