aboutsummaryrefslogtreecommitdiff
path: root/server-v1/source/EpistmoolServer/Session.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'server-v1/source/EpistmoolServer/Session.hpp')
-rw-r--r--server-v1/source/EpistmoolServer/Session.hpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/server-v1/source/EpistmoolServer/Session.hpp b/server-v1/source/EpistmoolServer/Session.hpp
new file mode 100644
index 0000000..931c428
--- /dev/null
+++ b/server-v1/source/EpistmoolServer/Session.hpp
@@ -0,0 +1,59 @@
+#pragma once
+
+#include "EpistmoolServer/Connection.hpp"
+
+#include <QMultiHash>
+#include <QObject>
+#include <unordered_map>
+#include <vector>
+
+namespace Epistmool::Server {
+
+struct SessionId
+{
+ int index;
+
+ static SessionId makeInvalid();
+ bool isInvalid() const;
+};
+
+class Session
+{
+ friend class SessionManager;
+
+private:
+ std::vector<ConnectionId> mConnections;
+ SessionId mSessionId;
+
+public:
+ Session(SessionId id);
+
+ SessionId getSessionId() const;
+ const std::vector<ConnectionId>& getConnections() const;
+};
+
+class SessionManager : public QObject
+{
+ Q_OBJECT
+
+ friend class Session;
+
+private:
+ // Use this intead of QHash for 1. pointer stability 2. Session is a move-only type
+ std::unordered_map<int, Session> mSessions;
+ QMultiHash<int, int> mConnection2SessionMap;
+ int mNextIndex;
+
+public:
+ explicit SessionManager(QObject* parent = nullptr);
+
+ Session* findOrCreateSession(SessionId id);
+ Session* findSession(SessionId id);
+
+ void addConnection(SessionId id, ConnectionId connId);
+
+public slots:
+ void dropConnection(Epistmool::Server::ConnectionId connId);
+};
+
+} // namespace Epistmool::Server