From e5ccb73a20f559983960db2daa08d6086c90b8ec Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Thu, 27 Jul 2017 13:49:44 +0300 Subject: Add serialization on matrix events --- include/Deserializable.h | 6 +++ include/events/AliasesEventContent.h | 3 +- include/events/AvatarEventContent.h | 3 +- include/events/CanonicalAliasEventContent.h | 3 +- include/events/CreateEventContent.h | 3 +- include/events/Event.h | 54 +++++++++++++++++++++++++- include/events/HistoryVisibilityEventContent.h | 3 +- include/events/JoinRulesEventContent.h | 3 +- include/events/MemberEventContent.h | 3 +- include/events/MessageEventContent.h | 3 +- include/events/NameEventContent.h | 3 +- include/events/PowerLevelsEventContent.h | 3 +- include/events/RoomEvent.h | 14 +++++++ include/events/StateEvent.h | 16 ++++++++ include/events/TopicEventContent.h | 3 +- 15 files changed, 111 insertions(+), 12 deletions(-) (limited to 'include') diff --git a/include/Deserializable.h b/include/Deserializable.h index 76290e1b..f4e8f425 100644 --- a/include/Deserializable.h +++ b/include/Deserializable.h @@ -47,3 +47,9 @@ public: { } }; + +class Serializable +{ +public: + virtual QJsonObject serialize() const = 0; +}; diff --git a/include/events/AliasesEventContent.h b/include/events/AliasesEventContent.h index a21aefd4..3adf8d46 100644 --- a/include/events/AliasesEventContent.h +++ b/include/events/AliasesEventContent.h @@ -26,10 +26,11 @@ namespace matrix { namespace events { -class AliasesEventContent : public Deserializable +class AliasesEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline QList aliases() const; diff --git a/include/events/AvatarEventContent.h b/include/events/AvatarEventContent.h index fa6997e0..43be3122 100644 --- a/include/events/AvatarEventContent.h +++ b/include/events/AvatarEventContent.h @@ -30,10 +30,11 @@ namespace events * A picture that is associated with the room. */ -class AvatarEventContent : public Deserializable +class AvatarEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline QUrl url() const; diff --git a/include/events/CanonicalAliasEventContent.h b/include/events/CanonicalAliasEventContent.h index 00df6207..aed7ea6b 100644 --- a/include/events/CanonicalAliasEventContent.h +++ b/include/events/CanonicalAliasEventContent.h @@ -32,10 +32,11 @@ namespace events * users which alias to use to advertise the room. */ -class CanonicalAliasEventContent : public Deserializable +class CanonicalAliasEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline QString alias() const; diff --git a/include/events/CreateEventContent.h b/include/events/CreateEventContent.h index a0e40fb8..eedee9f1 100644 --- a/include/events/CreateEventContent.h +++ b/include/events/CreateEventContent.h @@ -29,10 +29,11 @@ namespace events * This is the first event in a room and cannot be changed. It acts as the root of all other events. */ -class CreateEventContent : public Deserializable +class CreateEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline QString creator() const; diff --git a/include/events/Event.h b/include/events/Event.h index ea3eecea..af538644 100644 --- a/include/events/Event.h +++ b/include/events/Event.h @@ -17,6 +17,7 @@ #pragma once +#include #include #include "Deserializable.h" @@ -58,13 +59,14 @@ bool isMessageEvent(EventType type); bool isStateEvent(EventType type); template -class Event : public Deserializable +class Event : public Deserializable, public Serializable { public: inline Content content() const; inline EventType eventType() const; void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; private: Content content_; @@ -92,6 +94,56 @@ void Event::deserialize(const QJsonValue &data) auto object = data.toObject(); content_.deserialize(object.value("content")); + type_ = extractEventType(object); +} + +template +QJsonObject Event::serialize() const +{ + QJsonObject object; + + switch (type_) { + case EventType::RoomAliases: + object["type"] = "m.room.aliases"; + break; + case EventType::RoomAvatar: + object["type"] = "m.room.avatar"; + break; + case EventType::RoomCanonicalAlias: + object["type"] = "m.room.canonical_alias"; + break; + case EventType::RoomCreate: + object["type"] = "m.room.create"; + break; + case EventType::RoomHistoryVisibility: + object["type"] = "m.room.history_visibility"; + break; + case EventType::RoomJoinRules: + object["type"] = "m.room.join_rules"; + break; + case EventType::RoomMember: + object["type"] = "m.room.member"; + break; + case EventType::RoomMessage: + object["type"] = "m.room.message"; + break; + case EventType::RoomName: + object["type"] = "m.room.name"; + break; + case EventType::RoomPowerLevels: + object["type"] = "m.room.power_levels"; + break; + case EventType::RoomTopic: + object["type"] = "m.room.topic"; + break; + case EventType::Unsupported: + qWarning() << "Unsupported type to serialize"; + break; + } + + object["content"] = content_.serialize(); + + return object; } } // namespace events } // namespace matrix diff --git a/include/events/HistoryVisibilityEventContent.h b/include/events/HistoryVisibilityEventContent.h index 1df83d09..3edc7ce5 100644 --- a/include/events/HistoryVisibilityEventContent.h +++ b/include/events/HistoryVisibilityEventContent.h @@ -32,12 +32,13 @@ enum class HistoryVisibility { WorldReadable, }; -class HistoryVisibilityEventContent : public Deserializable +class HistoryVisibilityEventContent : public Deserializable, public Serializable { public: inline HistoryVisibility historyVisibility() const; void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; private: HistoryVisibility history_visibility_; diff --git a/include/events/JoinRulesEventContent.h b/include/events/JoinRulesEventContent.h index 746188e4..9b07e9a6 100644 --- a/include/events/JoinRulesEventContent.h +++ b/include/events/JoinRulesEventContent.h @@ -44,10 +44,11 @@ enum class JoinRule { * Describes how users are allowed to join the room. */ -class JoinRulesEventContent : public Deserializable +class JoinRulesEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline JoinRule joinRule() const; diff --git a/include/events/MemberEventContent.h b/include/events/MemberEventContent.h index e61d0cda..feaf1559 100644 --- a/include/events/MemberEventContent.h +++ b/include/events/MemberEventContent.h @@ -47,10 +47,11 @@ enum class Membership { * The current membership state of a user in the room. */ -class MemberEventContent : public Deserializable +class MemberEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline QUrl avatarUrl() const; inline QString displayName() const; diff --git a/include/events/MessageEventContent.h b/include/events/MessageEventContent.h index a9d7e470..3bfd11c2 100644 --- a/include/events/MessageEventContent.h +++ b/include/events/MessageEventContent.h @@ -56,10 +56,11 @@ enum class MessageEventType { MessageEventType extractMessageEventType(const QJsonObject &data); -class MessageEventContent : public Deserializable +class MessageEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline QString body() const; diff --git a/include/events/NameEventContent.h b/include/events/NameEventContent.h index bf5a9209..ab90fd23 100644 --- a/include/events/NameEventContent.h +++ b/include/events/NameEventContent.h @@ -29,10 +29,11 @@ namespace events * A human-friendly room name designed to be displayed to the end-user. */ -class NameEventContent : public Deserializable +class NameEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline QString name() const; diff --git a/include/events/PowerLevelsEventContent.h b/include/events/PowerLevelsEventContent.h index e5762812..7def9800 100644 --- a/include/events/PowerLevelsEventContent.h +++ b/include/events/PowerLevelsEventContent.h @@ -36,10 +36,11 @@ enum class PowerLevels { * Defines the power levels (privileges) of users in the room. */ -class PowerLevelsEventContent : public Deserializable +class PowerLevelsEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline int banLevel() const; inline int inviteLevel() const; diff --git a/include/events/RoomEvent.h b/include/events/RoomEvent.h index b73d5ce9..79fc4be2 100644 --- a/include/events/RoomEvent.h +++ b/include/events/RoomEvent.h @@ -36,6 +36,7 @@ public: inline uint64_t timestamp() const; void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; private: QString event_id_; @@ -94,5 +95,18 @@ void RoomEvent::deserialize(const QJsonValue &data) sender_ = object.value("sender").toString(); origin_server_ts_ = object.value("origin_server_ts").toDouble(); } + +template +QJsonObject RoomEvent::serialize() const +{ + QJsonObject object = Event::serialize(); + + object["event_id"] = event_id_; + object["room_id"] = room_id_; + object["sender"] = sender_; + object["origin_server_ts"] = QJsonValue(static_cast(origin_server_ts_)); + + return object; +} } // namespace events } // namespace matrix diff --git a/include/events/StateEvent.h b/include/events/StateEvent.h index 2075a996..26313048 100644 --- a/include/events/StateEvent.h +++ b/include/events/StateEvent.h @@ -33,6 +33,7 @@ public: inline Content previousContent() const; void deserialize(const QJsonValue &data); + QJsonObject serialize() const; private: QString state_key_; @@ -66,5 +67,20 @@ void StateEvent::deserialize(const QJsonValue &data) if (object.contains("prev_content")) prev_content_.deserialize(object.value("prev_content")); } + +template +QJsonObject StateEvent::serialize() const +{ + QJsonObject object = RoomEvent::serialize(); + + object["state_key"] = state_key_; + + auto prev = prev_content_.serialize(); + + if (!prev.isEmpty()) + object["prev_content"] = prev; + + return object; +} } // namespace events } // namespace matrix diff --git a/include/events/TopicEventContent.h b/include/events/TopicEventContent.h index 460d019e..ff2fe3bb 100644 --- a/include/events/TopicEventContent.h +++ b/include/events/TopicEventContent.h @@ -29,10 +29,11 @@ namespace events * A topic is a short message detailing what is currently being discussed in the room. */ -class TopicEventContent : public Deserializable +class TopicEventContent : public Deserializable, public Serializable { public: void deserialize(const QJsonValue &data) override; + QJsonObject serialize() const override; inline QString topic() const; -- cgit 1.5.1