Improve data and icon file handling
[quassel.git] / src / common / quassel.cpp
index bf0cbee..5444979 100644 (file)
@@ -241,19 +241,24 @@ QString Quassel::configDirPath() {
     _configDirPath = Quassel::optionValue("configdir");
   } else {
 
-    // We abuse QSettings to find us a sensible path on all platforms
-#ifdef Q_WS_WIN
+#ifdef Q_WS_MAC
+    // On Mac, the path is always the same
+    _configDirPath = QDir::homePath() + "/Library/Application Support/Quassel/";
+#else
+    // We abuse QSettings to find us a sensible path on the other platforms
+#  ifdef Q_WS_WIN
     // don't use the registry
     QSettings::Format format = QSettings::IniFormat;
-#else
+#  else
     QSettings::Format format = QSettings::NativeFormat;
-#endif
+#  endif
     QSettings s(format, QSettings::UserScope, QCoreApplication::organizationDomain(), buildInfo().applicationName);
     QFileInfo fileInfo(s.fileName());
     _configDirPath = fileInfo.dir().absolutePath();
+#endif /* Q_WS_MAC */
   }
 
-  if(!_configDirPath.endsWith(QDir::separator()))
+  if(!_configDirPath.endsWith(QDir::separator()) && !_configDirPath.endsWith('/'))
     _configDirPath += QDir::separator();
 
   QDir qDir(_configDirPath);
@@ -279,30 +284,44 @@ QStringList Quassel::findDataDirPaths() const {
       dataDirNames[i].append("/apps/quassel/");
   } else {
   // Provide a fallback
-  // FIXME fix this for win and mac!
 #ifdef Q_OS_WIN32
-    dataDirNames << qgetenv("APPDATA") + "/quassel/"
+    dataDirNames << qgetenv("APPDATA") + QCoreApplication::organizationDomain() + "/share/apps/quassel/"
+                 << qgetenv("APPDATA") + QCoreApplication::organizationDomain()
                  << QCoreApplication::applicationDirPath();
+  }
 #elif defined Q_WS_MAC
     dataDirNames << QDir::homePath() + "/Library/Application Support/Quassel/"
                  << QCoreApplication::applicationDirPath();
+  }
 #else
-    if(dataDirNames.isEmpty())
-      dataDirNames.append("/usr/share/apps/quassel/");
-    // on UNIX, we always check our install prefix
-    QString appDir = QCoreApplication::applicationDirPath();
-    int binpos = appDir.lastIndexOf("/bin");
-    if(binpos >= 0) {
-      appDir.replace(binpos, 4, "/share");
-      appDir.append("/apps/quassel/");
-      if(!dataDirNames.contains(appDir))
-        dataDirNames.append(appDir);
-    }
+    dataDirNames.append("/usr/share/apps/quassel/");
+  }
+  // on UNIX, we always check our install prefix
+  QString appDir = QCoreApplication::applicationDirPath();
+  int binpos = appDir.lastIndexOf("/bin");
+  if(binpos >= 0) {
+    appDir.replace(binpos, 4, "/share");
+    appDir.append("/apps/quassel/");
+    if(!dataDirNames.contains(appDir))
+      dataDirNames.append(appDir);
+  }
 #endif
+
+  // add resource path and workdir just in case
+  dataDirNames << QCoreApplication::applicationDirPath() + "/data/"
+               << ":/data/";
+
+  // append trailing '/' and check for existence
+  QStringList::Iterator iter = dataDirNames.begin();
+  while(iter != dataDirNames.end()) {
+    if(!iter->endsWith(QDir::separator()) && !iter->endsWith('/'))
+      iter->append(QDir::separator());
+    if(!QFile::exists(*iter))
+      iter = dataDirNames.erase(iter);
+    else
+      ++iter;
   }
 
-  // add resource path just in case
-  dataDirNames << ":/data/";
   return dataDirNames;
 }