aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/c++/.clang-format6
-rw-r--r--server-v1/source/EpistmoolServer/Connection.hpp3
-rw-r--r--server-v1/source/EpistmoolServer/Protocol/Command.cpp82
-rw-r--r--server-v1/source/EpistmoolServer/Protocol/Command.hpp84
-rw-r--r--server-v1/source/EpistmoolServer/Protocol/Error.hpp3
-rw-r--r--server-v1/source/EpistmoolServer/Protocol/fwd.hpp4
-rw-r--r--server-v1/source/EpistmoolServer/Server.cpp1
-rw-r--r--server-v1/source/EpistmoolServer/Session.cpp33
-rw-r--r--server-v1/source/EpistmoolServer/Session.hpp7
9 files changed, 184 insertions, 39 deletions
diff --git a/common/c++/.clang-format b/common/c++/.clang-format
index 9f015c9..3290fe2 100644
--- a/common/c++/.clang-format
+++ b/common/c++/.clang-format
@@ -14,12 +14,12 @@ BinPackParameters: false
BraceWrapping:
AfterClass: true
AfterControlStatement: MultiLine
- AfterEnum: true
+ AfterEnum: false
AfterFunction: true
AfterNamespace: false
AfterObjCDeclaration: false
- AfterStruct: true
- AfterUnion: true
+ AfterStruct: false
+ AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
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<ProtocolMessage::KindTrait, static_cast<size_t>(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<ProtocolRequest> ProtocolMessage::createRequest(Kind kind)
{
switch(kind) {
case SessionAuth: return std::make_unique<ProtocolRequest_SessionAuth>();
- case SessionDestroy: return nullptr;
+ case SessionDestroy: return std::make_unique<ProtocolRequest_SessionDestroy>();
case WorkspaceCreate: return nullptr;
- case WorkspaceOpen: return nullptr;
- case WorkspaceFetchIndex: return nullptr;
+ case WorkspaceFetchIndex: return std::make_unique<ProtocolRequest_WorkspaceFetchIndex>();
case WorkspaceFetchKnowledge: return nullptr;
case WorkspaceUpdateKnowledge: return nullptr;
@@ -55,7 +53,7 @@ std::unique_ptr<ProtocolRequest> ProtocolMessage::createRequest(Kind kind)
case WorkspaceCreateKeyword: return nullptr;
case WorkspaceDeleteKeyword: return nullptr;
- case NotificationWorkspaceUpdated: return nullptr;
+ case NotificationWorkspaceUpdated: return std::make_unique<ProtocolNotification_WorkspaceUpdate>();
case NotificationKnowledgeUpdated: return nullptr;
default: return nullptr;
@@ -66,11 +64,10 @@ std::unique_ptr<ProtocolReply> ProtocolMessage::createReply(Kind kind)
{
switch(kind) {
case SessionAuth: return std::make_unique<ProtocolReply_SessionAuth>();
- case SessionDestroy: return nullptr;
+ case SessionDestroy: return std::make_unique<ProtocolReply_SessionDestroy>();
case WorkspaceCreate: return nullptr;
- case WorkspaceOpen: return nullptr;
- case WorkspaceFetchIndex: return nullptr;
+ case WorkspaceFetchIndex: return std::make_unique<ProtocolReply_WorkspaceFetchIndex>();
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 <QLatin1String>
+#include <QString>
#include <QVersionNumber>
#include <cstddef>
#include <memory>
@@ -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<ProtocolReply> 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<ProtocolRequest> 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 <QVersionNumber>
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 <algorithm>
+
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<ConnectionId>& getConnections() const;