diff options
author | Kitsune Ral <Kitsune-Ral@users.sf.net> | 2017-11-28 12:42:03 +0900 |
---|---|---|
committer | Kitsune Ral <Kitsune-Ral@users.sf.net> | 2017-11-28 12:42:03 +0900 |
commit | 357625eb55e2f4569bb487ffe14a9236188e25f3 (patch) | |
tree | d39340ab74f25a23a5855f679973628f7457fd87 /events/roommessageevent.h | |
parent | 94e6636d8225a0561ed7df3fa8081c5b0183610c (diff) | |
parent | 8f762a2458db773f6db24b568b2e944427297c2b (diff) | |
download | libquotient-357625eb55e2f4569bb487ffe14a9236188e25f3.tar.gz libquotient-357625eb55e2f4569bb487ffe14a9236188e25f3.zip |
Merge branch 'master' into kitsune-gtad
Diffstat (limited to 'events/roommessageevent.h')
-rw-r--r-- | events/roommessageevent.h | 246 |
1 files changed, 20 insertions, 226 deletions
diff --git a/events/roommessageevent.h b/events/roommessageevent.h index 74e0defb..eef6b657 100644 --- a/events/roommessageevent.h +++ b/events/roommessageevent.h @@ -20,65 +20,11 @@ #include "event.h" -#include <QtCore/QUrl> -#include <QtCore/QMimeType> -#include <QtCore/QSize> +#include "eventcontent.h" namespace QMatrixClient { - namespace MessageEventContent - { - /** - * A base class for all content types that can be stored - * in a RoomMessageEvent - * - * Each content type class should have a constructor taking - * a QJsonObject and override fillJson() with an implementation - * that will fill the target QJsonObject with stored values. It is - * assumed but not required that a content object can also be created - * from plain data. fillJson() should only fill the main JSON object - * but not the "info" subobject if it exists for a certain content type; - * use \p InfoBase to de/serialize "info" parts with an optional URL - * on the top level. - */ - class Base - { - public: - virtual ~Base() = default; - - QJsonObject toJson() const; - - QMimeType mimeType; - - protected: - Base() = default; - explicit Base(const QMimeType& type) : mimeType(type) { } - - virtual void fillJson(QJsonObject* o) const = 0; - }; - - /** - * A base class for content types that have an "info" object in their - * JSON representation - * - * These include most multimedia types currently in the CS API spec. - * Derived classes should override fillInfoJson() to fill the "info" - * subobject, BUT NOT the main JSON object. Most but not all "info" - * classes (specifically, those deriving from UrlInfo) should also - * have a constructor that accepts two parameters, QUrl and QJsonObject, - * in order to load the URL+info part from JSON. - */ - class InfoBase: public Base - { - public: - QJsonObject toInfoJson() const; - - protected: - using Base::Base; - - virtual void fillInfoJson(QJsonObject* infoJson) const { } - }; - } // namespace MessageEventContent + namespace MessageEventContent = EventContent; // Back-compatibility /** * The event class corresponding to m.room.message events @@ -94,19 +40,19 @@ namespace QMatrixClient RoomMessageEvent(const QString& plainBody, const QString& jsonMsgType, - MessageEventContent::Base* content = nullptr) + EventContent::TypedBase* content = nullptr) : RoomEvent(Type::RoomMessage) , _msgtype(jsonMsgType), _plainBody(plainBody), _content(content) { } explicit RoomMessageEvent(const QString& plainBody, MsgType msgType = MsgType::Text, - MessageEventContent::Base* content = nullptr); + EventContent::TypedBase* content = nullptr); explicit RoomMessageEvent(const QJsonObject& obj); MsgType msgtype() const; QString rawMsgtype() const { return _msgtype; } const QString& plainBody() const { return _plainBody; } - const MessageEventContent::Base* content() const + const EventContent::TypedBase* content() const { return _content.data(); } QMimeType mimeType() const; @@ -117,18 +63,15 @@ namespace QMatrixClient private: QString _msgtype; QString _plainBody; - QScopedPointer<MessageEventContent::Base> _content; + QScopedPointer<EventContent::TypedBase> _content; REGISTER_ENUM(MsgType) }; using MessageEventType = RoomMessageEvent::MsgType; - namespace MessageEventContent + namespace EventContent { - // The below structures fairly follow CS spec 11.2.1.6. The overall - // set of attributes for each content types is a superset of the spec - // but specific aggregation structure is altered. See doc comments to - // each type for the list of available attributes. + // Additional event content types /** * Rich text content for m.text, m.emote, m.notice @@ -136,175 +79,22 @@ namespace QMatrixClient * Available fields: mimeType, body. The body can be either rich text * or plain text, depending on what mimeType specifies. */ - class TextContent: public Base + class TextContent: public TypedBase { public: TextContent(const QString& text, const QString& contentType); explicit TextContent(const QJsonObject& json); - void fillJson(QJsonObject* json) const override; + QMimeType type() const override { return mimeType; } + QMimeType mimeType; QString body; - }; - - /** - * Base class for content types that consist of a URL along with - * additional information - * - * All message types except the (hyper)text mentioned above and - * m.location fall under this category. - */ - class FileInfo: public InfoBase - { - public: - explicit FileInfo(const QUrl& u, int payloadSize = -1, - const QMimeType& mimeType = {}, - const QString& originalFilename = {}); - FileInfo(const QUrl& u, const QJsonObject& infoJson, - const QString& originalFilename = {}); - - QUrl url; - int payloadSize; - QString originalName; protected: void fillJson(QJsonObject* json) const override; - void fillInfoJson(QJsonObject* infoJson) const override; - }; - - /** - * A base class for image info types: image, thumbnail, video - * - * \tparam InfoT base info class; should derive from \p InfoBase - */ - template <class InfoT = FileInfo> - class ImageInfo : public InfoT - { - public: - explicit ImageInfo(const QUrl& u, int fileSize = -1, - QMimeType mimeType = {}, - const QSize& imageSize = {}) - : InfoT(u, fileSize, mimeType), imageSize(imageSize) - { } - ImageInfo(const QUrl& u, const QJsonObject& infoJson, - const QString& originalFilename = {}) - : InfoT(u, infoJson, originalFilename) - , imageSize(infoJson["w"].toInt(), infoJson["h"].toInt()) - { } - - void fillInfoJson(QJsonObject* infoJson) const /* override */ - { - InfoT::fillInfoJson(infoJson); - infoJson->insert("w", imageSize.width()); - infoJson->insert("h", imageSize.height()); - } - - QSize imageSize; - }; - - /** - * A base class for an info type that carries a thumbnail - * - * This class provides a means to save/load a thumbnail to/from "info" - * subobject of the JSON representation of a message; namely, - * "info/thumbnail_url" and "info/thumbnail_info" fields are used. - * - * \tparam InfoT base info class; should derive from \p InfoBase - */ - template <class InfoT = InfoBase> - class Thumbnailed : public InfoT - { - public: - template <typename... ArgTs> - explicit Thumbnailed(const ImageInfo<>& thumbnail, - ArgTs&&... infoArgs) - : InfoT(std::forward<ArgTs>(infoArgs)...) - , thumbnail(thumbnail) - { } - - explicit Thumbnailed(const QJsonObject& infoJson) - : thumbnail(infoJson["thumbnail_url"].toString(), - infoJson["thumbnail_info"].toObject()) - { } - - Thumbnailed(const QUrl& u, const QJsonObject& infoJson, - const QString& originalFilename = {}) - : InfoT(u, infoJson, originalFilename) - , thumbnail(infoJson["thumbnail_url"].toString(), - infoJson["thumbnail_info"].toObject()) - { } - - void fillInfoJson(QJsonObject* infoJson) const /* override */ - { - InfoT::fillInfoJson(infoJson); - infoJson->insert("thumbnail_url", thumbnail.url.toString()); - infoJson->insert("thumbnail_info", thumbnail.toInfoJson()); - } - - ImageInfo<> thumbnail; }; /** - * One more facility base class for content types that have a URL and - * additional info - * - * The assumed layout for types enabled by a combination of UrlInfo and - * UrlWith<> is the following: "url" and, optionally, "filename" in the - * top-level JSON and the rest of information inside the "info" subobject. - * - * \tparam InfoT base info class; should derive from \p UrlInfo or - * provide a constructor with a compatible signature - */ - template <class InfoT> // InfoT : public FileInfo - class UrlWith : public InfoT - { - public: - using InfoT::InfoT; - explicit UrlWith(const QJsonObject& json) - : InfoT(json["url"].toString(), json["info"].toObject(), - json["filename"].toString()) - { } - }; - - /** - * Content class for m.image - * - * Available fields: - * - corresponding to the top-level JSON: - * - url - * - filename (extension to the spec) - * - corresponding to the "info" subobject: - * - payloadSize ("size" in JSON) - * - mimeType ("mimetype" in JSON) - * - imageSize (QSize for a combination of "h" and "w" in JSON) - * - thumbnail.url ("thumbnail_url" in JSON) - * - corresponding to the "info/thumbnail_info" subobject: contents of - * thumbnail field, in the same vein as for the main image: - * - payloadSize - * - mimeType - * - imageSize - */ - using ImageContent = UrlWith<Thumbnailed<ImageInfo<>>>; - - /** - * Content class for m.file - * - * Available fields: - * - corresponding to the top-level JSON: - * - url - * - filename - * - corresponding to the "info" subobject: - * - payloadSize ("size" in JSON) - * - mimeType ("mimetype" in JSON) - * - thumbnail.url ("thumbnail_url" in JSON) - * - corresponding to the "info/thumbnail_info" subobject: - * - thumbnail.payloadSize - * - thumbnail.mimeType - * - thumbnail.imageSize (QSize for "h" and "w" in JSON) - */ - using FileContent = UrlWith<Thumbnailed<FileInfo>>; - - /** * Content class for m.location * * Available fields: @@ -317,16 +107,19 @@ namespace QMatrixClient * - thumbnail.mimeType * - thumbnail.imageSize */ - class LocationContent: public Thumbnailed<> + class LocationContent: public TypedBase, public Thumbnailed<> { public: LocationContent(const QString& geoUri, const ImageInfo<>& thumbnail); explicit LocationContent(const QJsonObject& json); - void fillJson(QJsonObject* o) const override; + QMimeType type() const override; QString geoUri; + + protected: + void fillJson(QJsonObject* o) const override; }; /** @@ -341,9 +134,10 @@ namespace QMatrixClient PlayableInfo(const QUrl& u, const QJsonObject& infoJson, const QString& originalFilename = {}); - void fillInfoJson(QJsonObject* infoJson) const override; - int duration; + + protected: + void fillInfoJson(QJsonObject* infoJson) const override; }; /** @@ -380,5 +174,5 @@ namespace QMatrixClient * - duration */ using AudioContent = UrlWith<PlayableInfo>; - } // namespace MessageEventContent + } // namespace EventContent } // namespace QMatrixClient |