aboutsummaryrefslogtreecommitdiff
path: root/events/roommessageevent.h
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2017-11-28 12:42:03 +0900
committerKitsune Ral <Kitsune-Ral@users.sf.net>2017-11-28 12:42:03 +0900
commit357625eb55e2f4569bb487ffe14a9236188e25f3 (patch)
treed39340ab74f25a23a5855f679973628f7457fd87 /events/roommessageevent.h
parent94e6636d8225a0561ed7df3fa8081c5b0183610c (diff)
parent8f762a2458db773f6db24b568b2e944427297c2b (diff)
downloadlibquotient-357625eb55e2f4569bb487ffe14a9236188e25f3.tar.gz
libquotient-357625eb55e2f4569bb487ffe14a9236188e25f3.zip
Merge branch 'master' into kitsune-gtad
Diffstat (limited to 'events/roommessageevent.h')
-rw-r--r--events/roommessageevent.h246
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