Improve data directory search
[quassel.git] / src / common / quassel.cpp
index 849920d..52be52b 100644 (file)
 
 #include <QCoreApplication>
 #include <QDateTime>
-#include <QObject>
+#include <QFileInfo>
 #include <QMetaType>
+#include <QObject>
+#include <QSettings>
 
 #include "message.h"
 #include "identity.h"
@@ -125,8 +127,8 @@ void Quassel::registerMetaTypes() {
 
 void Quassel::setupBuildInfo(const QString &generated) {
   _buildInfo.applicationName = "Quassel IRC";
-  _buildInfo.coreApplicationName = "Quassel Core";
-  _buildInfo.clientApplicationName = "Quassel Client";
+  _buildInfo.coreApplicationName = "quasselcore";
+  _buildInfo.clientApplicationName = "quasselclient";
   _buildInfo.organizationName = "Quassel Project";
   _buildInfo.organizationDomain = "quassel-irc.org";
 
@@ -239,16 +241,21 @@ QString Quassel::configDirPath() {
     _configDirPath = Quassel::optionValue("configdir");
   } else {
 
-    // FIXME use QDesktopServices?
-#ifdef Q_OS_WIN32
-  _configDirPath = qgetenv("APPDATA") + "/quassel/";
-#elif defined Q_WS_MAC
-  _configDirPath = QDir::homePath() + "/Library/Application Support/Quassel/";
+    // We abuse QSettings to find us a sensible path on all platforms
+#ifdef Q_WS_WIN
+    // don't use the registry
+    QSettings::Format format = QSettings::IniFormat;
 #else
-  _configDirPath = QDir::homePath() + "/.quassel/";
+    QSettings::Format format = QSettings::NativeFormat;
 #endif
+    QSettings s(format, QSettings::UserScope, QCoreApplication::organizationDomain(), buildInfo().applicationName);
+    QFileInfo fileInfo(s.fileName());
+    _configDirPath = fileInfo.dir().absolutePath();
   }
 
+  if(!_configDirPath.endsWith(QDir::separator()) && !_configDirPath.endsWith('/'))
+    _configDirPath += QDir::separator();
+
   QDir qDir(_configDirPath);
   if(!qDir.exists(_configDirPath)) {
     if(!qDir.mkpath(_configDirPath)) {
@@ -274,7 +281,7 @@ QStringList Quassel::findDataDirPaths() const {
   // Provide a fallback
   // FIXME fix this for win and mac!
 #ifdef Q_OS_WIN32
-    dataDirNames << qgetenv("APPDATA") + "/quassel/"
+    dataDirNames << qgetenv("APPDATA") + QCoreApplication::organizationDomain();
                  << QCoreApplication::applicationDirPath();
 #elif defined Q_WS_MAC
     dataDirNames << QDir::homePath() + "/Library/Application Support/Quassel/"
@@ -294,8 +301,22 @@ QStringList Quassel::findDataDirPaths() const {
 #endif
   }
 
-  // add resource path just in case
-  dataDirNames << ":/data/";
+  // add resource path and workdir just in case
+  dataDirNames << ":/data/"
+               << QCoreApplication::applicationDirPath() + "/data/"
+               << QCoreApplication::applicationDirPath();
+
+  // 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;
+  }
+
   return dataDirNames;
 }