modernize: Use override instead of virtual
[quassel.git] / src / core / core.h
index 45e1596..45d0607 100644 (file)
 
 #pragma once
 
+#include "core-export.h"
+
 #include <memory>
 #include <vector>
 
 #include <QDateTime>
+#include <QPointer>
 #include <QString>
 #include <QVariant>
 #include <QTimer>
 #include "authenticator.h"
 #include "bufferinfo.h"
 #include "deferredptr.h"
+#include "identserver.h"
 #include "message.h"
 #include "oidentdconfiggenerator.h"
 #include "sessionthread.h"
+#include "singleton.h"
 #include "storage.h"
 #include "types.h"
 
 class CoreAuthHandler;
 class CoreSession;
-struct NetworkInfo;
+class InternalPeer;
 class SessionThread;
 class SignalProxy;
 
+struct NetworkInfo;
+
 class AbstractSqlMigrationReader;
 class AbstractSqlMigrationWriter;
 
-class Core : public QObject
+class CORE_EXPORT Core : public QObject, public Singleton<Core>
 {
     Q_OBJECT
 
 public:
-    static Core *instance();
-    static void destroy();
+    Core();
+    ~Core() override;
+
+    void init();
+
+    /**
+     * Shuts down active core sessions, saves state and emits the shutdownComplete() signal afterwards.
+     */
+    void shutdown();
 
-    static void saveState();
-    static void restoreState();
 
     /*** Storage access ***/
     // These methods are threadsafe.
@@ -551,13 +563,6 @@ public:
         return instance()->_storage->setBufferLastSeenMsg(user, bufferId, msgId);
     }
 
-    //! Get the auth username associated with a userId
-    /** \param user  The user to retrieve the username for
-     *  \return      The username for the user
-     */
-    static inline QString getAuthUserName(UserId user) {
-        return instance()->_storage->getAuthUserName(user);
-    }
 
     //! Get a usable sysident for the given user in oidentd-strict mode
     /** \param user    The user to retrieve the sysident for
@@ -672,36 +677,28 @@ public:
 
     static inline QDateTime startTime() { return instance()->_startTime; }
     static inline bool isConfigured() { return instance()->_configured; }
-    static bool sslSupported();
 
     /**
-     * Reloads SSL certificates used for connection with clients
+     * Whether or not strict ident mode is enabled, locking users' idents to Quassel username
      *
-     * @return True if certificates reloaded successfully, otherwise false.
+     * @return True if strict mode enabled, otherwise false
      */
-    static bool reloadCerts();
+    static inline bool strictIdentEnabled() { return instance()->_strictIdentEnabled; }
 
-    static void cacheSysIdent();
+    static bool sslSupported();
 
     static QVariantList backendInfo();
     static QVariantList authenticatorInfo();
 
     static QString setup(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData, const QString &authenticator, const QVariantMap &authSetupMap);
 
-    static inline QTimer &syncTimer() { return instance()->_storageSyncTimer; }
+    static inline QTimer *syncTimer() { return &instance()->_storageSyncTimer; }
 
     inline OidentdConfigGenerator *oidentdConfigGenerator() const { return _oidentdConfigGenerator; }
+    inline IdentServer *identServer() const { return _identServer; }
 
     static const int AddClientEventId;
 
-public slots:
-    //! Make storage data persistent
-    /** \note This method is threadsafe.
-     */
-    void syncStorage();
-    void setupInternalClientSession(InternalPeer *clientConnection);
-    QString setupCore(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData, const QString &authenticator, const QVariantMap &authSetupMap);
-
 signals:
     //! Sent when a BufferInfo is updated in storage.
     void bufferInfoUpdated(UserId user, const BufferInfo &info);
@@ -709,8 +706,39 @@ signals:
     //! Relay from CoreSession::sessionState(). Used for internal connection only
     void sessionState(const Protocol::SessionState &sessionState);
 
+    //! Emitted when database schema upgrade starts or ends
+    void dbUpgradeInProgress(bool inProgress);
+
+    //! Emitted when a fatal error was encountered during async initialization
+    void exitRequested(int exitCode, const QString &reason);
+
+    //! Emitted once core shutdown is complete
+    void shutdownComplete();
+
+public slots:
+    void initAsync();
+
+    /** Persist storage.
+     *
+     * @note This method is threadsafe.
+     */
+    void syncStorage();
+
+    /**
+     * Reload SSL certificates used for connection with clients.
+     *
+     * @return True if certificates reloaded successfully, otherwise false.
+     */
+    bool reloadCerts();
+
+    void cacheSysIdent();
+
+    QString setupCore(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData, const QString &authenticator, const QVariantMap &authSetupMap);
+
+    void connectInternalPeer(QPointer<InternalPeer> peer);
+
 protected:
-    virtual void customEvent(QEvent *event);
+    void customEvent(QEvent *event) override;
 
 private slots:
     bool startListening();
@@ -730,16 +758,14 @@ private slots:
 
     bool changeUserPass(const QString &username);
 
-private:
-    Core();
-    ~Core();
-    void init();
-    static Core *instanceptr;
+    void onSessionShutdown(SessionThread *session);
 
+private:
     SessionThread *sessionForUser(UserId userId, bool restoreState = false);
     void addClientHelper(RemotePeer *peer, UserId uid);
     //void processCoreSetup(QTcpSocket *socket, QVariantMap &msg);
     QString setupCoreForInternalUsage();
+    void setupInternalClientSession(QPointer<InternalPeer> peer);
 
     bool createUser();
 
@@ -761,17 +787,22 @@ private:
     bool saveBackendSettings(const QString &backend, const QVariantMap &settings);
     void saveAuthenticatorSettings(const QString &backend, const QVariantMap &settings);
 
+    void saveState();
+    void restoreState();
+
     template<typename Backend>
     QVariantMap promptForSettings(const Backend *backend);
 
 private:
+    static Core *_instance;
     QSet<CoreAuthHandler *> _connectingClients;
     QHash<UserId, SessionThread *> _sessions;
     DeferredSharedPtr<Storage>       _storage;        ///< Active storage backend
     DeferredSharedPtr<Authenticator> _authenticator;  ///< Active authenticator
-    QTimer _storageSyncTimer;
     QMap<UserId, QString> _authUserNames;
 
+    QTimer _storageSyncTimer;
+
 #ifdef HAVE_SSL
     SslServer _server, _v6server;
 #else
@@ -785,7 +816,15 @@ private:
 
     QDateTime _startTime;
 
-    bool _configured;
+    IdentServer *_identServer {nullptr};
+
+    bool _initialized{false};
+    bool _configured{false};
+
+    QPointer<InternalPeer> _pendingInternalConnection;
+
+    /// Whether or not strict ident mode is enabled, locking users' idents to Quassel username
+    bool _strictIdentEnabled;
 
     static std::unique_ptr<AbstractSqlMigrationReader> getMigrationReader(Storage *storage);
     static std::unique_ptr<AbstractSqlMigrationWriter> getMigrationWriter(Storage *storage);