#include "Session.hpp" #include 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& 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) { // Add session -> connection links auto session = findSession(id); if (session) { auto location = std::lower_bound( session->mConnections.begin(), session->mConnections.end(), connId, [](const ConnectionId& a, const ConnectionId& b) -> bool { return a.index < b.index; }); session->mConnections.insert(location, connId); } // Add connection -> session links mConnection2SessionMap.insert(connId.index, id.index); } void SessionManager::dropConnection(ConnectionId connId) { // Remove session -> connection links auto it = mConnection2SessionMap.find(connId.index); while (it != mConnection2SessionMap.end() && it.key() == connId.index) { auto& connList = mSessions.at(it.value()).mConnections; auto range = std::equal_range( connList.begin(), connList.end(), connId, [](const ConnectionId& a, const ConnectionId& b) -> bool { return a.index < b.index; }); connList.erase(range.first, range.second); ++it; } // Remove connection -> sesion links mConnection2SessionMap.remove(connId.index); }