Add serialization on matrix events
This commit is contained in:
parent
c6c024ccbf
commit
e5ccb73a20
27 changed files with 285 additions and 12 deletions
|
|
@ -47,3 +47,9 @@ public:
|
|||
{
|
||||
}
|
||||
};
|
||||
|
||||
class Serializable
|
||||
{
|
||||
public:
|
||||
virtual QJsonObject serialize() const = 0;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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_;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue