From 176fd53453c51debbb963dee303e8853577aaac4 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Sat, 17 Jan 2009 01:18:43 +0100 Subject: [PATCH] Provide Quassel::configDirPath() and Quassel::findDataFilePath() 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 | 3 +- src/common/quassel.cpp | 83 ++++++++++++++++++++++++++++++++++++ src/common/quassel.h | 9 ++++ src/qtui/qtuiapplication.cpp | 21 +++++++-- 4 files changed, 112 insertions(+), 4 deletions(-) diff --git a/src/common/main.cpp b/src/common/main.cpp index 3bcecbbd..362f8216 100644 --- a/src/common/main.cpp +++ b/src/common/main.cpp @@ -92,7 +92,8 @@ int main(int argc, char **argv) { cliParser->addSwitch("norestore", 'n', "Don't restore last core's state"); cliParser->addOption("logfile ", 'l', "Path to logfile"); cliParser->addOption("loglevel ", 'L', "Loglevel Debug|Info|Warning|Error", "Info"); - cliParser->addOption("datadir ", 0, "Specify the directory holding datafiles like the Sqlite DB and the SSL Cert"); + cliParser->addOption("configdir ", 'c', "Specify the directory holding configuration files, the SQlite database and the SSL Cert"); + cliParser->addOption("datadir ", 0, "DEPRECATED - Use --configdir instead"); #endif #ifdef HAVE_KDE diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index e8cd8f59..849920d8 100644 --- a/src/common/quassel.cpp +++ b/src/common/quassel.cpp @@ -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(); +} diff --git a/src/common/quassel.h b/src/common/quassel.h index 1a8f818c..cb29f3f1 100644 --- a/src/common/quassel.h +++ b/src/common/quassel.h @@ -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; } diff --git a/src/qtui/qtuiapplication.cpp b/src/qtui/qtuiapplication.cpp index 33829e81..abe10367 100644 --- a/src/qtui/qtuiapplication.cpp +++ b/src/qtui/qtuiapplication.cpp @@ -22,6 +22,10 @@ #include +#ifdef HAVE_KDE +# include +#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); -- 2.20.1