From 1a8cffddf383872b84d0df9acef5662e02189f2b Mon Sep 17 00:00:00 2001 From: rtk0c Date: Mon, 27 Jun 2022 00:15:35 +0000 Subject: (From git) Update code style, misc clean up git-svn-id: file:///home/arch/svn/epistmool/trunk@6 71f44415-077c-4ad7-a976-72ddbf76608f --- server-v1/source/EpistmoolServer/Connection.hpp | 3 +- .../source/EpistmoolServer/Protocol/Command.cpp | 82 +++++++++++++++++---- .../source/EpistmoolServer/Protocol/Command.hpp | 84 ++++++++++++++++++---- .../source/EpistmoolServer/Protocol/Error.hpp | 3 +- server-v1/source/EpistmoolServer/Protocol/fwd.hpp | 4 +- server-v1/source/EpistmoolServer/Server.cpp | 1 + server-v1/source/EpistmoolServer/Session.cpp | 33 ++++++++- server-v1/source/EpistmoolServer/Session.hpp | 7 +- 8 files changed, 181 insertions(+), 36 deletions(-) (limited to 'server-v1') diff --git a/server-v1/source/EpistmoolServer/Connection.hpp b/server-v1/source/EpistmoolServer/Connection.hpp index 78e34db..2a3a239 100644 --- a/server-v1/source/EpistmoolServer/Connection.hpp +++ b/server-v1/source/EpistmoolServer/Connection.hpp @@ -8,8 +8,7 @@ class QJsonDocument; namespace Epistmool::Server { -struct ConnectionId -{ +struct ConnectionId { int index; int generation; diff --git a/server-v1/source/EpistmoolServer/Protocol/Command.cpp b/server-v1/source/EpistmoolServer/Protocol/Command.cpp index a108e0e..3e76b9c 100644 --- a/server-v1/source/EpistmoolServer/Protocol/Command.cpp +++ b/server-v1/source/EpistmoolServer/Protocol/Command.cpp @@ -7,7 +7,7 @@ using namespace Epistmool::Server; namespace { -auto kKindTraits = []() { +const auto kKindTraits = []() { using enum ProtocolMessage::Kind; std::array(KindCOUNT)> array; @@ -15,7 +15,6 @@ auto kKindTraits = []() { array[SessionDestroy] = { .isC2S = true, .hasReply = true }; array[WorkspaceCreate] = { .isC2S = true, .hasReply = true }; - array[WorkspaceOpen] = { .isC2S = true, .hasReply = true }; array[WorkspaceFetchIndex] = { .isC2S = true, .hasReply = true }; array[WorkspaceFetchKnowledge] = { .isC2S = true, .hasReply = true }; @@ -39,11 +38,10 @@ std::unique_ptr ProtocolMessage::createRequest(Kind kind) { switch(kind) { case SessionAuth: return std::make_unique(); - case SessionDestroy: return nullptr; + case SessionDestroy: return std::make_unique(); case WorkspaceCreate: return nullptr; - case WorkspaceOpen: return nullptr; - case WorkspaceFetchIndex: return nullptr; + case WorkspaceFetchIndex: return std::make_unique(); case WorkspaceFetchKnowledge: return nullptr; case WorkspaceUpdateKnowledge: return nullptr; @@ -55,7 +53,7 @@ std::unique_ptr ProtocolMessage::createRequest(Kind kind) case WorkspaceCreateKeyword: return nullptr; case WorkspaceDeleteKeyword: return nullptr; - case NotificationWorkspaceUpdated: return nullptr; + case NotificationWorkspaceUpdated: return std::make_unique(); case NotificationKnowledgeUpdated: return nullptr; default: return nullptr; @@ -66,11 +64,10 @@ std::unique_ptr ProtocolMessage::createReply(Kind kind) { switch(kind) { case SessionAuth: return std::make_unique(); - case SessionDestroy: return nullptr; + case SessionDestroy: return std::make_unique(); case WorkspaceCreate: return nullptr; - case WorkspaceOpen: return nullptr; - case WorkspaceFetchIndex: return nullptr; + case WorkspaceFetchIndex: return std::make_unique(); case WorkspaceFetchKnowledge: return nullptr; case WorkspaceUpdateKnowledge: return nullptr; @@ -172,14 +169,12 @@ ProtocolRequest_SessionAuth::ProtocolRequest_SessionAuth() void ProtocolRequest_SessionAuth::serializeFields(QJsonObject& object) const { - ProtocolRequest::serializeFields(object); object.insert("session", theSession); object.insert("createIfInvalid", createIfInvalid); } void ProtocolRequest_SessionAuth::deserializeFields(const QJsonObject& object) { - ProtocolRequest::deserializeFields(object); theSession = object.value("session").toInt(); createIfInvalid = object.value("createIfInvalid").toBool(); } @@ -189,12 +184,73 @@ ProtocolReply_SessionAuth::ProtocolReply_SessionAuth() void ProtocolReply_SessionAuth::serializeFields(QJsonObject& object) const { - ProtocolReply::serializeFields(object); object.insert("session", theSession); } void ProtocolReply_SessionAuth::deserializeFields(const QJsonObject& object) { - ProtocolReply::deserializeFields(object); theSession = object.value("session").toInt(); } + +ProtocolRequest_SessionDestroy::ProtocolRequest_SessionDestroy() + : ProtocolRequest(SessionDestroy) {} + +void ProtocolRequest_SessionDestroy::serializeFields(QJsonObject& object) const +{ +} + +void ProtocolRequest_SessionDestroy::deserializeFields(const QJsonObject& object) +{ +} + +ProtocolReply_SessionDestroy::ProtocolReply_SessionDestroy() + : ProtocolReply(SessionDestroy) {} + +void ProtocolReply_SessionDestroy::serializeFields(QJsonObject& object) const +{ +} + +void ProtocolReply_SessionDestroy::deserializeFields(const QJsonObject& object) +{ +} + +ProtocolRequest_WorkspaceFetchIndex::ProtocolRequest_WorkspaceFetchIndex() + : ProtocolRequest(WorkspaceFetchIndex) {} + +void ProtocolRequest_WorkspaceFetchIndex::serializeFields(QJsonObject& object) const +{ + object.insert("knowledgeFilter", knowledgeFilter); + object.insert("knowledgeMaxCount", knowledgeMaxCount); + object.insert("keywordFilter", keywordFilter); + object.insert("keywordMaxCount", keywordMaxCount); +} + +void ProtocolRequest_WorkspaceFetchIndex::deserializeFields(const QJsonObject& object) +{ + knowledgeFilter = object.value("knowledgeFilter").toString(); + knowledgeMaxCount = object.value("knowledgeMaxCount").toInt(); + keywordFilter = object.value("keywordFilter").toString(); + keywordMaxCount = object.value("keywordMaxCount").toInt(); +} + +ProtocolReply_WorkspaceFetchIndex::ProtocolReply_WorkspaceFetchIndex() + : ProtocolReply(WorkspaceFetchIndex) {} + +void ProtocolReply_WorkspaceFetchIndex::serializeFields(QJsonObject& object) const +{ +} + +void ProtocolReply_WorkspaceFetchIndex::deserializeFields(const QJsonObject& object) +{ +} + +ProtocolNotification_WorkspaceUpdate::ProtocolNotification_WorkspaceUpdate() + : ProtocolRequest(NotificationWorkspaceUpdated) {} + +void ProtocolNotification_WorkspaceUpdate::serializeFields(QJsonObject& object) const +{ +} + +void ProtocolNotification_WorkspaceUpdate::deserializeFields(const QJsonObject& object) +{ +} diff --git a/server-v1/source/EpistmoolServer/Protocol/Command.hpp b/server-v1/source/EpistmoolServer/Protocol/Command.hpp index 9ec9786..6d6ecd6 100644 --- a/server-v1/source/EpistmoolServer/Protocol/Command.hpp +++ b/server-v1/source/EpistmoolServer/Protocol/Command.hpp @@ -3,6 +3,7 @@ #include "all_fwd.hpp" #include +#include #include #include #include @@ -17,19 +18,16 @@ class ProtocolMessage Q_GADGET public: - struct KindTrait - { + struct KindTrait { bool isC2S; bool hasReply; }; - enum Kind - { + enum Kind { SessionAuth, SessionDestroy, WorkspaceCreate, - WorkspaceOpen, WorkspaceFetchIndex, WorkspaceFetchKnowledge, @@ -53,8 +51,7 @@ public: static std::unique_ptr createReply(Kind kind); static const KindTrait& getKindTrait(Kind kind); - enum Variant - { + enum Variant { RequestVariant, ReplyVariant, }; @@ -73,15 +70,17 @@ protected: virtual void deserializeFields(const QJsonObject& object) = 0; }; -struct ProtocolRequest : public ProtocolMessage +class ProtocolRequest : public ProtocolMessage { +public: ProtocolRequest(Kind kind); static QJsonObject serialize(const ProtocolRequest& msg); static std::unique_ptr deserialize(const QJsonObject& object); }; -struct ProtocolReply : public ProtocolMessage +class ProtocolReply : public ProtocolMessage { +public: int sequence; ProtocolReply(Kind kind); @@ -92,8 +91,9 @@ struct ProtocolReply : public ProtocolMessage // =========================== // Individual messages classes -struct ProtocolRequest_SessionAuth : public ProtocolRequest +class ProtocolRequest_SessionAuth : public ProtocolRequest { +public: int theSession; bool createIfInvalid; @@ -104,8 +104,9 @@ protected: virtual void deserializeFields(const QJsonObject& object) override; }; -struct ProtocolReply_SessionAuth : public ProtocolReply +class ProtocolReply_SessionAuth : public ProtocolReply { +public: /// The same value as provided in the request message. /// If \l ProcotolCommandSessionAuth::createIfValid is set and the given session is invalid, a new session is created and written here instead of the original value. int theSession; @@ -117,8 +118,67 @@ protected: virtual void deserializeFields(const QJsonObject& object) override; }; -struct ProtocolNotification_WorkspaceUpdate : public ProtocolRequest +class ProtocolRequest_SessionDestroy : public ProtocolRequest +{ +public: + // TODO + + ProtocolRequest_SessionDestroy(); + +protected: + virtual void serializeFields(QJsonObject& object) const override; + virtual void deserializeFields(const QJsonObject& object) override; +}; + +class ProtocolReply_SessionDestroy : public ProtocolReply +{ +public: + // TODO + + ProtocolReply_SessionDestroy(); + +protected: + virtual void serializeFields(QJsonObject& object) const override; + virtual void deserializeFields(const QJsonObject& object) override; +}; + +class ProtocolRequest_WorkspaceFetchIndex : public ProtocolRequest +{ +public: + QString knowledgeFilter; + QString keywordFilter; + int knowledgeMaxCount; + int keywordMaxCount; + + ProtocolRequest_WorkspaceFetchIndex(); + +protected: + virtual void serializeFields(QJsonObject& object) const override; + virtual void deserializeFields(const QJsonObject& object) override; +}; + +class ProtocolReply_WorkspaceFetchIndex : public ProtocolReply { +public: + // TODO + + ProtocolReply_WorkspaceFetchIndex(); + +protected: + virtual void serializeFields(QJsonObject& object) const override; + virtual void deserializeFields(const QJsonObject& object) override; +}; + +class ProtocolNotification_WorkspaceUpdate : public ProtocolRequest +{ +public: + // TODO + + ProtocolNotification_WorkspaceUpdate(); + +protected: + virtual void serializeFields(QJsonObject& object) const override; + virtual void deserializeFields(const QJsonObject& object) override; }; } // namespace Epistmool::Server diff --git a/server-v1/source/EpistmoolServer/Protocol/Error.hpp b/server-v1/source/EpistmoolServer/Protocol/Error.hpp index 1ddedf9..43bbd62 100644 --- a/server-v1/source/EpistmoolServer/Protocol/Error.hpp +++ b/server-v1/source/EpistmoolServer/Protocol/Error.hpp @@ -6,8 +6,7 @@ #include namespace Epistmool::Server { -struct ProtocolError -{ +struct ProtocolError { QVersionNumber since; QLatin1String name; }; diff --git a/server-v1/source/EpistmoolServer/Protocol/fwd.hpp b/server-v1/source/EpistmoolServer/Protocol/fwd.hpp index adf8138..9ec40fb 100644 --- a/server-v1/source/EpistmoolServer/Protocol/fwd.hpp +++ b/server-v1/source/EpistmoolServer/Protocol/fwd.hpp @@ -4,8 +4,8 @@ namespace Epistmool::Server{ // Command.hpp class ProtocolMessage; -struct ProtocolRequest; -struct ProtocolReply; +class ProtocolRequest; +class ProtocolReply; // Error.hpp struct ProtocolError; diff --git a/server-v1/source/EpistmoolServer/Server.cpp b/server-v1/source/EpistmoolServer/Server.cpp index 4dc3b16..915c9ed 100644 --- a/server-v1/source/EpistmoolServer/Server.cpp +++ b/server-v1/source/EpistmoolServer/Server.cpp @@ -51,6 +51,7 @@ void Server::onMessage(const QJsonDocument& message, ConnectionId connId) // Extract as empty string if non-existent auto versionString = root.value("version").toString(); + // TODO handle if id field is not here? int id = root.value("id").toInt(); SessionId sessionId; diff --git a/server-v1/source/EpistmoolServer/Session.cpp b/server-v1/source/EpistmoolServer/Session.cpp index 6db51d8..cc95c6a 100644 --- a/server-v1/source/EpistmoolServer/Session.cpp +++ b/server-v1/source/EpistmoolServer/Session.cpp @@ -1,5 +1,7 @@ #include "Session.hpp" +#include + using namespace Epistmool::Server; namespace { @@ -63,14 +65,41 @@ Session* SessionManager::findSession(SessionId id) void SessionManager::addConnection(SessionId id, ConnectionId connId) { + // Add session -> connection links auto session = findSession(id); - if (!session) return; + 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); + } - session->mConnections.push_back(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); } diff --git a/server-v1/source/EpistmoolServer/Session.hpp b/server-v1/source/EpistmoolServer/Session.hpp index 931c428..7cce3d1 100644 --- a/server-v1/source/EpistmoolServer/Session.hpp +++ b/server-v1/source/EpistmoolServer/Session.hpp @@ -9,12 +9,13 @@ namespace Epistmool::Server { -struct SessionId -{ +struct SessionId { int index; static SessionId makeInvalid(); bool isInvalid() const; + + bool operator==(const SessionId&) const = default; }; class Session @@ -26,7 +27,7 @@ private: SessionId mSessionId; public: - Session(SessionId id); + explicit Session(SessionId id); SessionId getSessionId() const; const std::vector& getConnections() const; -- cgit v1.2.3-70-g09d2