aboutsummaryrefslogtreecommitdiff
path: root/server-v1/source/EpistmoolServer/Session.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'server-v1/source/EpistmoolServer/Session.cpp')
-rw-r--r--server-v1/source/EpistmoolServer/Session.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/server-v1/source/EpistmoolServer/Session.cpp b/server-v1/source/EpistmoolServer/Session.cpp
new file mode 100644
index 0000000..6db51d8
--- /dev/null
+++ b/server-v1/source/EpistmoolServer/Session.cpp
@@ -0,0 +1,76 @@
+#include "Session.hpp"
+
+using namespace Epistmool::Server;
+
+namespace {
+constexpr int kInvalidSessionIndex = -1;
+} // namespace
+
+SessionId SessionId::makeInvalid()
+{
+ return SessionId{
+ .index = kInvalidSessionIndex,
+ };
+}
+
+bool SessionId::isInvalid() const
+{
+ return index == kInvalidSessionIndex;
+}
+
+SessionId Session::getSessionId() const
+{
+ return mSessionId;
+}
+
+const std::vector<ConnectionId>& Session::getConnections() const
+{
+ return mConnections;
+}
+
+Session::Session(SessionId id)
+ : mSessionId{ id }
+{
+}
+
+// TODO delete session if isn't active for N period of time
+SessionManager::SessionManager(QObject* parent)
+ : QObject(parent)
+{
+}
+
+Session* SessionManager::findOrCreateSession(SessionId id)
+{
+ auto it = mSessions.find(id.index);
+ if (it != mSessions.end()) {
+ return &it->second;
+ } else {
+ SessionId newId{ mNextIndex++ };
+ auto [it, _] = mSessions.insert({ newId.index, Session(newId) });
+ return &it->second;
+ }
+}
+
+Session* SessionManager::findSession(SessionId id)
+{
+ auto it = mSessions.find(id.index);
+ if (it != mSessions.end()) {
+ return &it->second;
+ } else {
+ return nullptr;
+ }
+}
+
+void SessionManager::addConnection(SessionId id, ConnectionId connId)
+{
+ auto session = findSession(id);
+ if (!session) return;
+
+ session->mConnections.push_back(connId);
+ mConnection2SessionMap.insert(connId.index, id.index);
+}
+
+void SessionManager::dropConnection(ConnectionId connId)
+{
+ mConnection2SessionMap.remove(connId.index);
+}