Add a method to find data files in standard directories (such as $PREFIX/share)
[quassel.git] / src / common / util.cpp
index 9e9bf88..a8a3887 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <QCoreApplication>
 #include <QDebug>
 
 #include <QCoreApplication>
 #include <QDebug>
+#include <QFile>
 #include <QLibraryInfo>
 #include <QTextCodec>
 #include <QTranslator>
 #include <QLibraryInfo>
 #include <QTextCodec>
 #include <QTranslator>
@@ -175,6 +176,34 @@ QDir quasselDir() {
   return qDir;
 }
 
   return qDir;
 }
 
+QStringList dataDirPaths() {
+  QStringList dataDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts);
+
+  // Provide a fallback
+# ifdef Q_OS_UNIX
+  if(dataDirNames.isEmpty()) dataDirNames.append("/usr/share");
+  // 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");
+    if(!dataDirNames.contains(appDir)) dataDirNames.append(appDir);
+  }
+# endif
+
+  return dataDirNames;
+}
+
+QString findDataFilePath(const QString &fileName) {
+  QStringList dataDirs = dataDirPaths();
+  foreach(QString dataDir, dataDirs) {
+    QString path = dataDir + "/apps/quassel/" + fileName;
+    if(QFile::exists(path))
+      return path;
+  }
+  return QString();
+}
+
 void loadTranslation(const QLocale &locale) {
   QTranslator *qtTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QtTr");
   QTranslator *quasselTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QuasselTr");
 void loadTranslation(const QLocale &locale) {
   QTranslator *qtTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QtTr");
   QTranslator *quasselTranslator = QCoreApplication::instance()->findChild<QTranslator *>("QuasselTr");