diff options
Diffstat (limited to 'server-v1/source/EpistmoolServer/Session.hpp')
-rw-r--r-- | server-v1/source/EpistmoolServer/Session.hpp | 59 |
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 |