summary refs log tree commit diff
path: root/include
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-07-27 13:49:44 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-07-30 14:30:55 +0300
commite5ccb73a20f559983960db2daa08d6086c90b8ec (patch)
tree3212d0727d63611e5398e8eab2a3a4bc1cddbb5d /include
parentAppend backwards events after the spacer (diff)
downloadnheko-e5ccb73a20f559983960db2daa08d6086c90b8ec.tar.xz
Add serialization on matrix events
Diffstat (limited to 'include')
-rw-r--r--include/Deserializable.h6
-rw-r--r--include/events/AliasesEventContent.h3
-rw-r--r--include/events/AvatarEventContent.h3
-rw-r--r--include/events/CanonicalAliasEventContent.h3
-rw-r--r--include/events/CreateEventContent.h3
-rw-r--r--include/events/Event.h54
-rw-r--r--include/events/HistoryVisibilityEventContent.h3
-rw-r--r--include/events/JoinRulesEventContent.h3
-rw-r--r--include/events/MemberEventContent.h3
-rw-r--r--include/events/MessageEventContent.h3
-rw-r--r--include/events/NameEventContent.h3
-rw-r--r--include/events/PowerLevelsEventContent.h3
-rw-r--r--include/events/RoomEvent.h14
-rw-r--r--include/events/StateEvent.h16
-rw-r--r--include/events/TopicEventContent.h3
15 files changed, 111 insertions, 12 deletions
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<QString> 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 <QDebug> #include <QJsonValue> #include "Deserializable.h" @@ -58,13 +59,14 @@ bool isMessageEvent(EventType type); bool isStateEvent(EventType type); template <class Content> -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<Content>::deserialize(const QJsonValue &data) auto object = data.toObject(); content_.deserialize(object.value("content")); + type_ = extractEventType(object); +} + +template <class Content> +QJsonObject Event<Content>::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<Content>::deserialize(const QJsonValue &data) sender_ = object.value("sender").toString(); origin_server_ts_ = object.value("origin_server_ts").toDouble(); } + +template <class Content> +QJsonObject RoomEvent<Content>::serialize() const +{ + QJsonObject object = Event<Content>::serialize(); + + object["event_id"] = event_id_; + object["room_id"] = room_id_; + object["sender"] = sender_; + object["origin_server_ts"] = QJsonValue(static_cast<qint64>(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<Content>::deserialize(const QJsonValue &data) if (object.contains("prev_content")) prev_content_.deserialize(object.value("prev_content")); } + +template <class Content> +QJsonObject StateEvent<Content>::serialize() const +{ + QJsonObject object = RoomEvent<Content>::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;