#pragma once #include "all_fwd.hpp" #include #include #include #include #include class QJsonObject; namespace Epistmool::Server { // Note: not all message kinds have a corresponding reply format. In such case the Kind enum is prefixed with 'Notification'. class ProtocolMessage { Q_GADGET public: struct KindTrait { bool isC2S; bool hasReply; }; enum Kind { SessionAuth, SessionDestroy, WorkspaceCreate, WorkspaceFetchIndex, WorkspaceFetchKnowledge, WorkspaceUpdateKnowledge, WorkspaceCreateKnowledge, WorkspaceDeleteKnowledge, WorkspaceFetchKeyword, WorkspaceUpdateKeyword, WorkspaceCreateKeyword, WorkspaceDeleteKeyword, NotificationWorkspaceUpdated, NotificationKnowledgeUpdated, KindCOUNT, }; Q_ENUM(Kind) static std::unique_ptr createRequest(Kind kind); static std::unique_ptr createReply(Kind kind); static const KindTrait& getKindTrait(Kind kind); enum Variant { RequestVariant, ReplyVariant, }; Q_ENUM(Variant) public: Kind kind; Variant variant; public: ProtocolMessage(Kind kind, Variant variant); virtual ~ProtocolMessage() = default; protected: virtual void serializeFields(QJsonObject& object) const = 0; virtual void deserializeFields(const QJsonObject& object) = 0; }; class ProtocolRequest : public ProtocolMessage { public: ProtocolRequest(Kind kind); static QJsonObject serialize(const ProtocolRequest& msg); static std::unique_ptr deserialize(const QJsonObject& object); }; class ProtocolReply : public ProtocolMessage { public: int sequence; ProtocolReply(Kind kind); static QJsonObject serialize(const ProtocolReply& msg); static std::unique_ptr deserialize(const QJsonObject& object); }; // =========================== // Individual messages classes class ProtocolRequest_SessionAuth : public ProtocolRequest { public: int theSession; bool createIfInvalid; ProtocolRequest_SessionAuth(); protected: virtual void serializeFields(QJsonObject& object) const override; virtual void deserializeFields(const QJsonObject& object) override; }; 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; ProtocolReply_SessionAuth(); protected: virtual void serializeFields(QJsonObject& object) const override; virtual void deserializeFields(const QJsonObject& object) override; }; 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