/***************************************************************************
- * Copyright (C) 2005-2015 by the Quassel Project *
+ * Copyright (C) 2005-2016 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
#include "logger.h"
#include "message.h"
#include "network.h"
+#include "peer.h"
#include "protocol.h"
#include "syncableobject.h"
#include "types.h"
// We catch SIGTERM and SIGINT (caused by Ctrl+C) to graceful shutdown Quassel.
signal(SIGTERM, handleSignal);
signal(SIGINT, handleSignal);
+#ifndef Q_OS_WIN
+ // SIGHUP is used to reload configuration (i.e. SSL certificates)
+ // Windows does not support SIGHUP
+ signal(SIGHUP, handleSignal);
+#endif
}
qRegisterMetaType<MsgId>("MsgId");
qRegisterMetaType<QHostAddress>("QHostAddress");
+ qRegisterMetaTypeStreamOperators<QHostAddress>("QHostAddress");
qRegisterMetaType<QUuid>("QUuid");
+ qRegisterMetaTypeStreamOperators<QUuid>("QUuid");
qRegisterMetaTypeStreamOperators<IdentityId>("IdentityId");
qRegisterMetaTypeStreamOperators<BufferId>("BufferId");
qRegisterMetaTypeStreamOperators<MsgId>("MsgId");
qRegisterMetaType<Protocol::SessionState>("Protocol::SessionState");
+ qRegisterMetaType<PeerPtr>("PeerPtr");
+ qRegisterMetaTypeStreamOperators<PeerPtr>("PeerPtr");
// Versions of Qt prior to 4.7 didn't define QVariant as a meta type
if (!QMetaType::type("QVariant")) {
_buildInfo.baseVersion = QUASSEL_VERSION_STRING;
_buildInfo.generatedVersion = GIT_DESCRIBE;
- // This will be imprecise for incremental builds not touching this file, but we really don't want to always recompile
- _buildInfo.buildDate = QString("%1 %2").arg(__DATE__, __TIME__);
-
// Check if we got a commit hash
- if (!QString(GIT_HEAD).isEmpty())
+ if (!QString(GIT_HEAD).isEmpty()) {
_buildInfo.commitHash = GIT_HEAD;
+ QDateTime date;
+ date.setTime_t(GIT_COMMIT_DATE);
+ _buildInfo.commitDate = date.toString();
+ }
else if (!QString(DIST_HASH).contains("Format")) {
_buildInfo.commitHash = DIST_HASH;
- _buildInfo.commitDate = QString(DIST_DATE).toUInt();
+ _buildInfo.commitDate = QString(DIST_DATE);
}
// create a nice version string
else
QCoreApplication::quit();
break;
+#ifndef Q_OS_WIN
+// Windows does not support SIGHUP
+ case SIGHUP:
+ // Most applications use this as the 'configuration reload' command, e.g. nginx uses it for
+ // graceful reloading of processes.
+ if (_instance) {
+ // If the instance exists, reload the configuration
+ quInfo() << "Caught signal" << SIGHUP <<"- reloading configuration";
+ if (_instance->reloadConfig()) {
+ quInfo() << "Successfully reloaded configuration";
+ }
+ }
+ break;
+#endif
case SIGABRT:
case SIGSEGV:
#ifndef Q_OS_WIN
QStringList Quassel::findDataDirPaths() const
{
- QStringList dataDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts);
+ // We don't use QStandardPaths for now, as we still need to provide fallbacks for Qt4 and
+ // want to stay consistent.
- if (!dataDirNames.isEmpty()) {
- for (int i = 0; i < dataDirNames.count(); i++)
- dataDirNames[i].append("/apps/quassel/");
- }
- else {
- // Provide a fallback
+ QStringList dataDirNames;
#ifdef Q_OS_WIN
- dataDirNames << qgetenv("APPDATA") + QCoreApplication::organizationDomain() + "/share/apps/quassel/"
- << qgetenv("APPDATA") + QCoreApplication::organizationDomain()
- << QCoreApplication::applicationDirPath();
- }
+ dataDirNames << qgetenv("APPDATA") + QCoreApplication::organizationDomain() + "/share/apps/quassel/"
+ << qgetenv("APPDATA") + QCoreApplication::organizationDomain()
+ << QCoreApplication::applicationDirPath();
#elif defined Q_OS_MAC
- dataDirNames << QDir::homePath() + "/Library/Application Support/Quassel/"
- << QCoreApplication::applicationDirPath();
- }
+ dataDirNames << QDir::homePath() + "/Library/Application Support/Quassel/"
+ << QCoreApplication::applicationDirPath();
#else
- 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);
- }
+ // Linux et al
+
+ // XDG_DATA_HOME is the location for users to override system-installed files, usually in .local/share
+ // This should thus come first.
+ QString xdgDataHome = QFile::decodeName(qgetenv("XDG_DATA_HOME"));
+ if (xdgDataHome.isEmpty())
+ xdgDataHome = QDir::homePath() + QLatin1String("/.local/share");
+ dataDirNames << xdgDataHome;
+
+ // Now whatever is configured through XDG_DATA_DIRS
+ QString xdgDataDirs = QFile::decodeName(qgetenv("XDG_DATA_DIRS"));
+ if (xdgDataDirs.isEmpty())
+ dataDirNames << "/usr/local/share" << "/usr/share";
+ else
+ dataDirNames << xdgDataDirs.split(':', QString::SkipEmptyParts);
+
+ // Just in case, also check our install prefix
+ dataDirNames << QCoreApplication::applicationDirPath() + "/../share";
+
+ // Normalize and append our application name
+ for (int i = 0; i < dataDirNames.count(); i++)
+ dataDirNames[i] = QDir::cleanPath(dataDirNames.at(i)) + "/quassel/";
+
#endif
- // add resource path and workdir just in case
- dataDirNames << QCoreApplication::applicationDirPath() + "/data/"
- << ":/data/";
+ // Add resource path and workdir just in case.
+ // Workdir should have precedence
+ dataDirNames.prepend(QCoreApplication::applicationDirPath() + "/data/");
+ dataDirNames.append(":/data/");
- // append trailing '/' and check for existence
- QStringList::Iterator iter = dataDirNames.begin();
+ // Append trailing '/' and check for existence
+ auto iter = dataDirNames.begin();
while (iter != dataDirNames.end()) {
if (!iter->endsWith(QDir::separator()) && !iter->endsWith('/'))
iter->append(QDir::separator());
++iter;
}
+ dataDirNames.removeDuplicates();
+
return dataDirNames;
}