#include "types.h"
#include "util.h"
-// Currently building with LDAP bindings is optional.
#ifdef HAVE_LDAP
-#include "ldapauthenticator.h"
+# include "ldapauthenticator.h"
#endif
// migration related
Core::Core()
: Singleton<Core>{this}
{
+ Q_INIT_RESOURCE(sql);
+
// Parent all QObject-derived attributes, so when the Core instance gets moved into another
// thread, they get moved with it
_server.setParent(this);
Core::~Core()
{
- saveState();
qDeleteAll(_connectingClients);
qDeleteAll(_sessions);
syncStorage();
{
_startTime = QDateTime::currentDateTime().toUTC(); // for uptime :)
- if (Quassel::runMode() == Quassel::RunMode::CoreOnly) {
- Quassel::loadTranslation(QLocale::system());
- }
-
// check settings version
// so far, we only have 1
CoreSettings s;
}
+void Core::shutdown()
+{
+ quInfo() << "Core shutting down...";
+
+ saveState();
+
+ for (auto &&client : _connectingClients) {
+ client->deleteLater();
+ }
+ _connectingClients.clear();
+
+ if (_sessions.isEmpty()) {
+ emit shutdownComplete();
+ return;
+ }
+
+ for (auto &&session : _sessions) {
+ connect(session, SIGNAL(shutdownComplete(SessionThread*)), this, SLOT(onSessionShutdown(SessionThread*)));
+ session->shutdown();
+ }
+}
+
+
+void Core::onSessionShutdown(SessionThread *session)
+{
+ _sessions.take(_sessions.key(session))->deleteLater();
+ if (_sessions.isEmpty()) {
+ quInfo() << "Core shutdown complete!";
+ emit shutdownComplete();
+ }
+}
+
+
/*** Session Restore ***/
void Core::saveState()
bool Core::sslSupported()
{
#ifdef HAVE_SSL
- SslServer *sslServer = qobject_cast<SslServer *>(&instance()->_server);
+ auto *sslServer = qobject_cast<SslServer *>(&instance()->_server);
return sslServer && sslServer->isCertValid();
#else
return false;
bool Core::reloadCerts()
{
#ifdef HAVE_SSL
- SslServer *sslServerv4 = qobject_cast<SslServer *>(&_server);
+ auto *sslServerv4 = qobject_cast<SslServer *>(&_server);
bool retv4 = sslServerv4->reloadCerts();
- SslServer *sslServerv6 = qobject_cast<SslServer *>(&_v6server);
+ auto *sslServerv6 = qobject_cast<SslServer *>(&_v6server);
bool retv6 = sslServerv6->reloadCerts();
return retv4 && retv6;
void Core::incomingConnection()
{
- QTcpServer *server = qobject_cast<QTcpServer *>(sender());
+ auto *server = qobject_cast<QTcpServer *>(sender());
Q_ASSERT(server);
while (server->hasPendingConnections()) {
QTcpSocket *socket = server->nextPendingConnection();
- CoreAuthHandler *handler = new CoreAuthHandler(socket, this);
+ auto *handler = new CoreAuthHandler(socket, this);
_connectingClients.insert(handler);
connect(handler, SIGNAL(disconnected()), SLOT(clientDisconnected()));
// Potentially called during the initialization phase (before handing the connection off to the session)
void Core::clientDisconnected()
{
- CoreAuthHandler *handler = qobject_cast<CoreAuthHandler *>(sender());
+ auto *handler = qobject_cast<CoreAuthHandler *>(sender());
Q_ASSERT(handler);
quInfo() << qPrintable(tr("Non-authed client disconnected:")) << qPrintable(handler->socket()->peerAddress().toString());
void Core::setupClientSession(RemotePeer *peer, UserId uid)
{
- CoreAuthHandler *handler = qobject_cast<CoreAuthHandler *>(sender());
+ auto *handler = qobject_cast<CoreAuthHandler *>(sender());
Q_ASSERT(handler);
// From now on everything is handled by the client session
- disconnect(handler, 0, this, 0);
+ disconnect(handler, nullptr, this, nullptr);
_connectingClients.remove(handler);
handler->deleteLater();
void Core::customEvent(QEvent *event)
{
if (event->type() == AddClientEventId) {
- AddClientEvent *addClientEvent = static_cast<AddClientEvent *>(event);
+ auto *addClientEvent = static_cast<AddClientEvent *>(event);
addClientHelper(addClientEvent->peer, addClientEvent->userId);
return;
}
return;
}
- InternalPeer *corePeer = new InternalPeer(this);
+ auto *corePeer = new InternalPeer(this);
corePeer->setPeer(clientPeer);
clientPeer->setPeer(corePeer);
if (_sessions.contains(uid))
return _sessions[uid];
- SessionThread *session = new SessionThread(uid, restore, strictIdentEnabled(), this);
- _sessions[uid] = session;
- session->start();
- return session;
+ return (_sessions[uid] = new SessionThread(uid, restore, strictIdentEnabled(), this));
}
if (!storage)
return nullptr;
- AbstractSqlStorage *sqlStorage = qobject_cast<AbstractSqlStorage *>(storage);
+ auto *sqlStorage = qobject_cast<AbstractSqlStorage *>(storage);
if (!sqlStorage) {
qDebug() << "Core::migrateDb(): only SQL based backends can be migrated!";
return nullptr;
if (!storage)
return nullptr;
- AbstractSqlStorage *sqlStorage = qobject_cast<AbstractSqlStorage *>(storage);
+ auto *sqlStorage = qobject_cast<AbstractSqlStorage *>(storage);
if (!sqlStorage) {
qDebug() << "Core::migrateDb(): only SQL based backends can be migrated!";
return nullptr;