X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcore.cpp;h=cf943b98e438d1a50fb0e3b377600c42596d3b2c;hp=48e4f0f4fb538856328312bfcdbff2559f0a7c9d;hb=752237a05d424c132f51a0bba76dea84e2d72b81;hpb=c068c516487c4699d5dbefe449d62c9ebad29684 diff --git a/src/core/core.cpp b/src/core/core.cpp index 48e4f0f4..cf943b98 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -81,6 +81,12 @@ Core::Core() delete _instance; } _instance = this; + + // Parent all QObject-derived attributes, so when the Core instance gets moved into another + // thread, they get moved with it + _server.setParent(this); + _v6server.setParent(this); + _storageSyncTimer.setParent(this); } @@ -98,7 +104,9 @@ bool Core::init() { _startTime = QDateTime::currentDateTime().toUTC(); // for uptime :) - Quassel::loadTranslation(QLocale::system()); + if (Quassel::runMode() == Quassel::RunMode::CoreOnly) { + Quassel::loadTranslation(QLocale::system()); + } // check settings version // so far, we only have 1 @@ -240,6 +248,13 @@ bool Core::init() Core::restoreState(); } + _initialized = true; + + if (_pendingInternalConnection) { + connectInternalPeer(_pendingInternalConnection); + _pendingInternalConnection = {}; + } + return true; } @@ -391,6 +406,8 @@ bool Core::initStorage(const QString &backend, const QVariantMap &settings, return false; } + connect(storage.get(), SIGNAL(dbUpgradeInProgress(bool)), this, SIGNAL(dbUpgradeInProgress(bool))); + Storage::State storageState = storage->init(settings, environment, loadFromEnvironment); switch (storageState) { case Storage::NeedsSetup: @@ -752,7 +769,18 @@ void Core::addClientHelper(RemotePeer *peer, UserId uid) } -void Core::setupInternalClientSession(InternalPeer *clientPeer) +void Core::connectInternalPeer(QPointer peer) +{ + if (_initialized && peer) { + setupInternalClientSession(peer); + } + else { + _pendingInternalConnection = peer; + } +} + + +void Core::setupInternalClientSession(QPointer clientPeer) { if (!_configured) { stopListening(); @@ -765,6 +793,12 @@ void Core::setupInternalClientSession(InternalPeer *clientPeer) } else { quWarning() << "Core::setupInternalClientSession(): You're trying to run monolithic Quassel with an unusable Backend! Go fix it!"; + QCoreApplication::exit(EXIT_FAILURE); + return; + } + + if (!clientPeer) { + quWarning() << "Client peer went away, not starting a session"; return; }