Provide Quassel::configDirPath() and Quassel::findDataFilePath()
authorManuel Nickschas <sputnick@quassel-irc.org>
Sat, 17 Jan 2009 00:18:43 +0000 (01:18 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 20 Jan 2009 21:07:48 +0000 (22:07 +0100)
These functions are about to obsolete their pendants in util.cpp. With KDE integration
enabled, data files will (only) be looked for in KDE's data directories rather than XDG.
This is in preparation of build system changes that will install stuff into KDE's dirs.
Still lacks some stuff to work properly on Win and Mac, I guess.

Instead of --datadir, use --configdir now. We'll move all user files in one location soon.

src/common/main.cpp
src/common/quassel.cpp
src/common/quassel.h
src/qtui/qtuiapplication.cpp

index 3bcecbb..362f821 100644 (file)
@@ -92,7 +92,8 @@ int main(int argc, char **argv) {
   cliParser->addSwitch("norestore", 'n', "Don't restore last core's state");
   cliParser->addOption("logfile <path>", 'l', "Path to logfile");
   cliParser->addOption("loglevel <level>", 'L', "Loglevel Debug|Info|Warning|Error", "Info");
-  cliParser->addOption("datadir <path>", 0, "Specify the directory holding datafiles like the Sqlite DB and the SSL Cert");
+  cliParser->addOption("configdir <path>", 'c', "Specify the directory holding configuration files, the SQlite database and the SSL Cert");
+  cliParser->addOption("datadir <path>", 0, "DEPRECATED - Use --configdir instead");
 #endif
 
 #ifdef HAVE_KDE
index e8cd8f5..849920d 100644 (file)
@@ -37,6 +37,8 @@
 Quassel::BuildInfo Quassel::_buildInfo;
 AbstractCliParser *Quassel::_cliParser = 0;
 Quassel::RunMode Quassel::_runMode;
+QString Quassel::_configDirPath;
+QStringList Quassel::_dataDirPaths;
 bool Quassel::_initialized = false;
 bool Quassel::DEBUG = false;
 QString Quassel::_coreDumpFileName;
@@ -225,3 +227,84 @@ const QString &Quassel::coreDumpFileName() {
   }
   return _coreDumpFileName;
 }
+
+QString Quassel::configDirPath() {
+  if(!_configDirPath.isEmpty())
+    return _configDirPath;
+
+  if(Quassel::isOptionSet("datadir")) {
+    qWarning() << "Obsolete option --datadir used!";
+    _configDirPath = Quassel::optionValue("datadir");
+  } else if(Quassel::isOptionSet("configdir")) {
+    _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/";
+#else
+  _configDirPath = QDir::homePath() + "/.quassel/";
+#endif
+  }
+
+  QDir qDir(_configDirPath);
+  if(!qDir.exists(_configDirPath)) {
+    if(!qDir.mkpath(_configDirPath)) {
+      qCritical() << "Unable to create Quassel config directory:" << qPrintable(qDir.absolutePath());
+      return QString();
+    }
+  }
+
+  return _configDirPath;
+}
+
+QStringList Quassel::dataDirPaths() {
+  return _dataDirPaths;
+}
+
+QStringList Quassel::findDataDirPaths() const {
+  QStringList dataDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts);
+
+  if(!dataDirNames.isEmpty()) {
+    for(int i = 0; i < dataDirNames.count(); i++)
+      dataDirNames[i].append("/apps/quassel/");
+  } else {
+  // Provide a fallback
+  // FIXME fix this for win and mac!
+#ifdef Q_OS_WIN32
+    dataDirNames << qgetenv("APPDATA") + "/quassel/"
+                 << 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);
+    }
+#endif
+  }
+
+  // add resource path just in case
+  dataDirNames << ":/data/";
+  return dataDirNames;
+}
+
+QString Quassel::findDataFilePath(const QString &fileName) {
+  QStringList dataDirs = dataDirPaths();
+  foreach(QString dataDir, dataDirs) {
+    QString path = dataDir + fileName;
+    if(QFile::exists(path))
+      return path;
+  }
+  return QString();
+}
index 1a8f818..cb29f3f 100644 (file)
@@ -63,6 +63,10 @@ public:
   static inline const BuildInfo & buildInfo();
   static inline RunMode runMode();
 
+  static QString configDirPath();
+  static QStringList dataDirPaths();
+  static QString findDataFilePath(const QString &filename);
+
   static inline void setCliParser(AbstractCliParser *cliParser);
   static inline AbstractCliParser *cliParser();
   static inline QString optionValue(const QString &option);
@@ -79,6 +83,8 @@ protected:
   virtual bool init();
 
   inline void setRunMode(RunMode mode);
+  inline void setDataDirPaths(const QStringList &paths);
+  QStringList findDataDirPaths() const;
 
 private:
   void registerMetaTypes();
@@ -92,11 +98,14 @@ private:
   static bool _initialized;
 
   static QString _coreDumpFileName;
+  static QString _configDirPath;
+  static QStringList _dataDirPaths;
 };
 
 const Quassel::BuildInfo & Quassel::buildInfo() { return _buildInfo; }
 Quassel::RunMode Quassel::runMode() { return _runMode; }
 void Quassel::setRunMode(Quassel::RunMode mode) { _runMode = mode; }
+void Quassel::setDataDirPaths(const QStringList &paths) { _dataDirPaths = paths; }
 
 void Quassel::setCliParser(AbstractCliParser *parser) { _cliParser = parser; }
 AbstractCliParser *Quassel::cliParser() { return _cliParser; }
index 33829e8..abe1036 100644 (file)
 
 #include <QStringList>
 
+#ifdef HAVE_KDE
+#  include <KStandardDirs>
+#endif
+
 #include "client.h"
 #include "cliparser.h"
 #include "qtui.h"
@@ -37,9 +41,20 @@ QtUiApplication::QtUiApplication(int &argc, char **argv)
     _aboutToQuit(false)
 {
 #ifdef HAVE_KDE
-  Q_UNUSED(argc)
-  Q_UNUSED(argv)
-#endif
+  Q_UNUSED(argc); Q_UNUSED(argv);
+
+  // We need to setup KDE's data dirs
+  QStringList dataDirs = KGlobal::dirs()->findDirs("data", "");
+  for(int i = 0; i < dataDirs.count(); i++)
+    dataDirs[i].append("quassel/");
+  dataDirs.append(":/data/");
+  setDataDirPaths(dataDirs);
+
+#else /* HAVE_KDE */
+
+  setDataDirPaths(findDataDirPaths());
+
+#endif /* HAVE_KDE */
 
   setRunMode(Quassel::ClientOnly);