diff options
Diffstat (limited to 'server-v1/source/EpistmoolServer/Session.cpp')
-rw-r--r-- | server-v1/source/EpistmoolServer/Session.cpp | 76 |
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); +} |