Skip to content
Snippets Groups Projects
Commit e5ccb73a authored by Konstantinos Sideris's avatar Konstantinos Sideris
Browse files

Add serialization on matrix events

parent c6c024cc
No related branches found
No related tags found
No related merge requests found
Showing
with 172 additions and 12 deletions
...@@ -47,3 +47,9 @@ public: ...@@ -47,3 +47,9 @@ public:
{ {
} }
}; };
class Serializable
{
public:
virtual QJsonObject serialize() const = 0;
};
...@@ -26,10 +26,11 @@ namespace matrix ...@@ -26,10 +26,11 @@ namespace matrix
{ {
namespace events namespace events
{ {
class AliasesEventContent : public Deserializable class AliasesEventContent : public Deserializable, public Serializable
{ {
public: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline QList<QString> aliases() const; inline QList<QString> aliases() const;
......
...@@ -30,10 +30,11 @@ namespace events ...@@ -30,10 +30,11 @@ namespace events
* A picture that is associated with the room. * A picture that is associated with the room.
*/ */
class AvatarEventContent : public Deserializable class AvatarEventContent : public Deserializable, public Serializable
{ {
public: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline QUrl url() const; inline QUrl url() const;
......
...@@ -32,10 +32,11 @@ namespace events ...@@ -32,10 +32,11 @@ namespace events
* users which alias to use to advertise the room. * users which alias to use to advertise the room.
*/ */
class CanonicalAliasEventContent : public Deserializable class CanonicalAliasEventContent : public Deserializable, public Serializable
{ {
public: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline QString alias() const; inline QString alias() const;
......
...@@ -29,10 +29,11 @@ namespace events ...@@ -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. * 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: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline QString creator() const; inline QString creator() const;
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#pragma once #pragma once
#include <QDebug>
#include <QJsonValue> #include <QJsonValue>
#include "Deserializable.h" #include "Deserializable.h"
...@@ -58,13 +59,14 @@ bool isMessageEvent(EventType type); ...@@ -58,13 +59,14 @@ bool isMessageEvent(EventType type);
bool isStateEvent(EventType type); bool isStateEvent(EventType type);
template <class Content> template <class Content>
class Event : public Deserializable class Event : public Deserializable, public Serializable
{ {
public: public:
inline Content content() const; inline Content content() const;
inline EventType eventType() const; inline EventType eventType() const;
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
private: private:
Content content_; Content content_;
...@@ -92,6 +94,56 @@ void Event<Content>::deserialize(const QJsonValue &data) ...@@ -92,6 +94,56 @@ void Event<Content>::deserialize(const QJsonValue &data)
auto object = data.toObject(); auto object = data.toObject();
content_.deserialize(object.value("content")); 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 events
} // namespace matrix } // namespace matrix
...@@ -32,12 +32,13 @@ enum class HistoryVisibility { ...@@ -32,12 +32,13 @@ enum class HistoryVisibility {
WorldReadable, WorldReadable,
}; };
class HistoryVisibilityEventContent : public Deserializable class HistoryVisibilityEventContent : public Deserializable, public Serializable
{ {
public: public:
inline HistoryVisibility historyVisibility() const; inline HistoryVisibility historyVisibility() const;
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
private: private:
HistoryVisibility history_visibility_; HistoryVisibility history_visibility_;
......
...@@ -44,10 +44,11 @@ enum class JoinRule { ...@@ -44,10 +44,11 @@ enum class JoinRule {
* Describes how users are allowed to join the room. * Describes how users are allowed to join the room.
*/ */
class JoinRulesEventContent : public Deserializable class JoinRulesEventContent : public Deserializable, public Serializable
{ {
public: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline JoinRule joinRule() const; inline JoinRule joinRule() const;
......
...@@ -47,10 +47,11 @@ enum class Membership { ...@@ -47,10 +47,11 @@ enum class Membership {
* The current membership state of a user in the room. * The current membership state of a user in the room.
*/ */
class MemberEventContent : public Deserializable class MemberEventContent : public Deserializable, public Serializable
{ {
public: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline QUrl avatarUrl() const; inline QUrl avatarUrl() const;
inline QString displayName() const; inline QString displayName() const;
......
...@@ -56,10 +56,11 @@ enum class MessageEventType { ...@@ -56,10 +56,11 @@ enum class MessageEventType {
MessageEventType extractMessageEventType(const QJsonObject &data); MessageEventType extractMessageEventType(const QJsonObject &data);
class MessageEventContent : public Deserializable class MessageEventContent : public Deserializable, public Serializable
{ {
public: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline QString body() const; inline QString body() const;
......
...@@ -29,10 +29,11 @@ namespace events ...@@ -29,10 +29,11 @@ namespace events
* A human-friendly room name designed to be displayed to the end-user. * A human-friendly room name designed to be displayed to the end-user.
*/ */
class NameEventContent : public Deserializable class NameEventContent : public Deserializable, public Serializable
{ {
public: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline QString name() const; inline QString name() const;
......
...@@ -36,10 +36,11 @@ enum class PowerLevels { ...@@ -36,10 +36,11 @@ enum class PowerLevels {
* Defines the power levels (privileges) of users in the room. * Defines the power levels (privileges) of users in the room.
*/ */
class PowerLevelsEventContent : public Deserializable class PowerLevelsEventContent : public Deserializable, public Serializable
{ {
public: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline int banLevel() const; inline int banLevel() const;
inline int inviteLevel() const; inline int inviteLevel() const;
......
...@@ -36,6 +36,7 @@ public: ...@@ -36,6 +36,7 @@ public:
inline uint64_t timestamp() const; inline uint64_t timestamp() const;
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
private: private:
QString event_id_; QString event_id_;
...@@ -94,5 +95,18 @@ void RoomEvent<Content>::deserialize(const QJsonValue &data) ...@@ -94,5 +95,18 @@ void RoomEvent<Content>::deserialize(const QJsonValue &data)
sender_ = object.value("sender").toString(); sender_ = object.value("sender").toString();
origin_server_ts_ = object.value("origin_server_ts").toDouble(); 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 events
} // namespace matrix } // namespace matrix
...@@ -33,6 +33,7 @@ public: ...@@ -33,6 +33,7 @@ public:
inline Content previousContent() const; inline Content previousContent() const;
void deserialize(const QJsonValue &data); void deserialize(const QJsonValue &data);
QJsonObject serialize() const;
private: private:
QString state_key_; QString state_key_;
...@@ -66,5 +67,20 @@ void StateEvent<Content>::deserialize(const QJsonValue &data) ...@@ -66,5 +67,20 @@ void StateEvent<Content>::deserialize(const QJsonValue &data)
if (object.contains("prev_content")) if (object.contains("prev_content"))
prev_content_.deserialize(object.value("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 events
} // namespace matrix } // namespace matrix
...@@ -29,10 +29,11 @@ namespace events ...@@ -29,10 +29,11 @@ namespace events
* A topic is a short message detailing what is currently being discussed in the room. * 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: public:
void deserialize(const QJsonValue &data) override; void deserialize(const QJsonValue &data) override;
QJsonObject serialize() const override;
inline QString topic() const; inline QString topic() const;
......
...@@ -36,3 +36,18 @@ void AliasesEventContent::deserialize(const QJsonValue &data) ...@@ -36,3 +36,18 @@ void AliasesEventContent::deserialize(const QJsonValue &data)
for (const auto &alias : aliases) for (const auto &alias : aliases)
aliases_.push_back(alias.toString()); aliases_.push_back(alias.toString());
} }
QJsonObject AliasesEventContent::serialize() const
{
QJsonObject object;
QJsonArray aliases;
for (const auto &alias : aliases_)
aliases.push_back(alias);
if (aliases.size() > 0)
object["aliases"] = aliases;
return object;
}
...@@ -36,3 +36,13 @@ void AvatarEventContent::deserialize(const QJsonValue &data) ...@@ -36,3 +36,13 @@ void AvatarEventContent::deserialize(const QJsonValue &data)
if (!url_.isValid()) if (!url_.isValid())
qWarning() << "Invalid avatar url" << url_; qWarning() << "Invalid avatar url" << url_;
} }
QJsonObject AvatarEventContent::serialize() const
{
QJsonObject object;
if (!url_.isEmpty())
object["url"] = url_.toString();
return object;
}
...@@ -31,3 +31,13 @@ void CanonicalAliasEventContent::deserialize(const QJsonValue &data) ...@@ -31,3 +31,13 @@ void CanonicalAliasEventContent::deserialize(const QJsonValue &data)
alias_ = object.value("alias").toString(); alias_ = object.value("alias").toString();
} }
QJsonObject CanonicalAliasEventContent::serialize() const
{
QJsonObject object;
if (!alias_.isEmpty())
object["alias"] = alias_;
return object;
}
...@@ -31,3 +31,13 @@ void CreateEventContent::deserialize(const QJsonValue &data) ...@@ -31,3 +31,13 @@ void CreateEventContent::deserialize(const QJsonValue &data)
creator_ = object.value("creator").toString(); creator_ = object.value("creator").toString();
} }
QJsonObject CreateEventContent::serialize() const
{
QJsonObject object;
if (!creator_.isEmpty())
object["creator"] = creator_;
return object;
}
...@@ -42,3 +42,19 @@ void HistoryVisibilityEventContent::deserialize(const QJsonValue &data) ...@@ -42,3 +42,19 @@ void HistoryVisibilityEventContent::deserialize(const QJsonValue &data)
else else
throw DeserializationException(QString("Unknown history_visibility value: %1").arg(value).toUtf8().constData()); throw DeserializationException(QString("Unknown history_visibility value: %1").arg(value).toUtf8().constData());
} }
QJsonObject HistoryVisibilityEventContent::serialize() const
{
QJsonObject object;
if (history_visibility_ == HistoryVisibility::Invited)
object["history_visibility"] = "invited";
else if (history_visibility_ == HistoryVisibility::Joined)
object["history_visibility"] = "joined";
else if (history_visibility_ == HistoryVisibility::Shared)
object["history_visibility"] = "shared";
else if (history_visibility_ == HistoryVisibility::WorldReadable)
object["history_visibility"] = "world_readable";
return object;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment