1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#pragma once
#include "all_fwd.hpp"
#include <QLatin1String>
#include <QVersionNumber>
#include <cstddef>
#include <memory>
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,
WorkspaceOpen,
WorkspaceFetchIndex,
WorkspaceFetchKnowledge,
WorkspaceUpdateKnowledge,
WorkspaceCreateKnowledge,
WorkspaceDeleteKnowledge,
WorkspaceFetchKeyword,
WorkspaceUpdateKeyword,
WorkspaceCreateKeyword,
WorkspaceDeleteKeyword,
NotificationWorkspaceUpdated,
NotificationKnowledgeUpdated,
KindCOUNT,
};
Q_ENUM(Kind)
static std::unique_ptr<ProtocolRequest> createRequest(Kind kind);
static std::unique_ptr<ProtocolReply> 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;
};
struct ProtocolRequest : public ProtocolMessage
{
ProtocolRequest(Kind kind);
static QJsonObject serialize(const ProtocolRequest& msg);
static std::unique_ptr<ProtocolRequest> deserialize(const QJsonObject& object);
};
struct ProtocolReply : public ProtocolMessage
{
int sequence;
ProtocolReply(Kind kind);
static QJsonObject serialize(const ProtocolReply& msg);
static std::unique_ptr<ProtocolReply> deserialize(const QJsonObject& object);
};
// ===========================
// Individual messages classes
struct ProtocolRequest_SessionAuth : public ProtocolRequest
{
int theSession;
bool createIfInvalid;
ProtocolRequest_SessionAuth();
protected:
virtual void serializeFields(QJsonObject& object) const override;
virtual void deserializeFields(const QJsonObject& object) override;
};
struct ProtocolReply_SessionAuth : public ProtocolReply
{
/// 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;
};
struct ProtocolNotification_WorkspaceUpdate : public ProtocolRequest
{
};
} // namespace Epistmool::Server
|