S60: Detect Device SDK from paths if registry entry is missing.

Display the error in a label of the preferences page.
Reviewed-by: con
This commit is contained in:
Friedemann Kleint
2009-11-20 15:58:24 +01:00
parent e292554067
commit a9fa7c71fa
4 changed files with 86 additions and 13 deletions

View File

@@ -98,22 +98,56 @@ bool S60Devices::read()
#endif #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 // 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() bool S60Devices::readWin()
{ {
// Check the windows registry via QSettings for devices.xml path const QString devicesXmlPath = devicesXmlFile(&m_errorString);
QSettings settings(SYMBIAN_SDKS_KEY, QSettings::NativeFormat); if (devicesXmlPath.isEmpty())
QString devicesXmlPath = settings.value(SYMBIAN_PATH_KEY).toString();
if (devicesXmlPath.isEmpty()) {
m_errorString = "Could not find installed SDKs in registry.";
return false; return false;
}
devicesXmlPath += QLatin1String("/") + QLatin1String(SYMBIAN_DEVICES_FILE);
QFile devicesFile(devicesXmlPath); QFile devicesFile(devicesXmlPath);
if (!devicesFile.open(QIODevice::ReadOnly)) { if (!devicesFile.open(QIODevice::ReadOnly|QIODevice::Text)) {
m_errorString = QString("Could not read devices file at %1.").arg(devicesXmlPath); m_errorString = QString::fromLatin1("Could not open the devices file %1: %2").arg(devicesXmlPath, devicesFile.errorString());
return false; return false;
} }
QXmlStreamReader xml(&devicesFile); QXmlStreamReader xml(&devicesFile);
@@ -152,10 +186,10 @@ bool S60Devices::readWin()
} }
devicesFile.close(); devicesFile.close();
if (xml.hasError()) { 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 false;
} }
return true; return true;
} }

View File

@@ -72,7 +72,25 @@ void S60DevicesWidget::updateDevicesList()
item->setToolTip(1, tooltip); item->setToolTip(1, tooltip);
m_ui->list->addTopLevelItem(item); 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) S60DevicesPreferencePane::S60DevicesPreferencePane(S60Devices *devices, QObject *parent)
: Core::IOptionsPage(parent), : Core::IOptionsPage(parent),
@@ -121,3 +139,5 @@ void S60DevicesPreferencePane::apply()
void S60DevicesPreferencePane::finish() void S60DevicesPreferencePane::finish()
{ {
} }

View File

@@ -56,6 +56,9 @@ private slots:
private: private:
void updateDevicesList(); void updateDevicesList();
void setErrorLabel(const QString&);
void clearErrorLabel();
Ui::S60DevicesPreferencePane *m_ui; Ui::S60DevicesPreferencePane *m_ui;
S60Devices *m_devices; S60Devices *m_devices;
}; };

View File

@@ -15,7 +15,7 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="titleLabel">
<property name="text"> <property name="text">
<string>Installed S60 SDKs:</string> <string>Installed S60 SDKs:</string>
</property> </property>
@@ -50,6 +50,22 @@
</column> </column>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="errorLabel">
<property name="styleSheet">
<string notr="true">background-color: red;</string>
</property>
<property name="text">
<string>Error</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>