OSDN Git Service

S60: Detect Device SDK from paths if registry entry is missing.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Fri, 20 Nov 2009 14:58:24 +0000 (15:58 +0100)
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>
Fri, 20 Nov 2009 14:58:24 +0000 (15:58 +0100)
Display the error in a label of the preferences page.
Reviewed-by: con
src/plugins/qt4projectmanager/qt-s60/s60devices.cpp
src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp
src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.h
src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.ui

index a9bcc35..44474a2 100644 (file)
@@ -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
 
-bool S60Devices::readWin()
+// Find the "devices.xml" file containing the SDKs
+static QString devicesXmlFile(QString *errorMessage)
 {
-    // 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.";
-        return false;
+    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();
+}
 
-    devicesXmlPath += QLatin1String("/") + QLatin1String(SYMBIAN_DEVICES_FILE);
+bool S60Devices::readWin()
+{
+    const QString devicesXmlPath = devicesXmlFile(&m_errorString);
+    if (devicesXmlPath.isEmpty())
+        return false;
     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;
 }
 
index 8102391..c1b616e 100644 (file)
@@ -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()
 {
 }
+
+
index 3378dcd..92efc14 100644 (file)
@@ -56,6 +56,9 @@ private slots:
 
 private:
     void updateDevicesList();
+    void setErrorLabel(const QString&);
+    void clearErrorLabel();
+
     Ui::S60DevicesPreferencePane *m_ui;
     S60Devices *m_devices;
 };
index f739161..1693e3e 100644 (file)
@@ -15,7 +15,7 @@
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <widget class="QLabel" name="label">
+    <widget class="QLabel" name="titleLabel">
      <property name="text">
       <string>Installed S60 SDKs:</string>
      </property>
     </widget>
    </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>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <spacer name="horizontalSpacer">