#pragma once
+#include "core-export.h"
+
#include <memory>
#include <vector>
#include "message.h"
#include "oidentdconfiggenerator.h"
#include "sessionthread.h"
+#include "singleton.h"
#include "storage.h"
#include "types.h"
class AbstractSqlMigrationReader;
class AbstractSqlMigrationWriter;
-class Core : public QObject
+class CORE_EXPORT Core : public QObject, public Singleton<Core>
{
Q_OBJECT
public:
- static Core *instance();
-
Core();
~Core() override;
void init();
+ /**
+ * Shuts down active core sessions, saves state and emits the shutdownComplete() signal afterwards.
+ */
+ void shutdown();
+
+
/*** Storage access ***/
// These methods are threadsafe.
void bufferInfoUpdated(UserId user, const BufferInfo &info);
//! Relay from CoreSession::sessionState(). Used for internal connection only
- void sessionState(const Protocol::SessionState &sessionState);
+ void sessionStateReceived(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();
bool changeUserPass(const QString &username);
+ void onSessionShutdown(SessionThread *session);
+
private:
SessionThread *sessionForUser(UserId userId, bool restoreState = false);
void addClientHelper(RemotePeer *peer, UserId uid);