aboutsummaryrefslogtreecommitdiff
path: root/lib/events
diff options
context:
space:
mode:
Diffstat (limited to 'lib/events')
-rw-r--r--lib/events/accountdataevents.h124
-rw-r--r--lib/events/callanswerevent.cpp29
-rw-r--r--lib/events/callanswerevent.h39
-rw-r--r--lib/events/callcandidatesevent.cpp7
-rw-r--r--lib/events/callcandidatesevent.h44
-rw-r--r--lib/events/callhangupevent.cpp6
-rw-r--r--lib/events/callhangupevent.h26
-rw-r--r--lib/events/callinviteevent.cpp17
-rw-r--r--lib/events/callinviteevent.h41
-rw-r--r--lib/events/directchatevent.cpp7
-rw-r--r--lib/events/directchatevent.h26
-rw-r--r--lib/events/encryptedevent.cpp31
-rw-r--r--lib/events/encryptedevent.h114
-rw-r--r--lib/events/encryptionevent.cpp44
-rw-r--r--lib/events/encryptionevent.h88
-rw-r--r--lib/events/event.cpp30
-rw-r--r--lib/events/event.h657
-rw-r--r--lib/events/eventcontent.cpp19
-rw-r--r--lib/events/eventcontent.h482
-rw-r--r--lib/events/eventloader.h141
-rw-r--r--lib/events/reactionevent.cpp6
-rw-r--r--lib/events/reactionevent.h13
-rw-r--r--lib/events/receiptevent.cpp28
-rw-r--r--lib/events/receiptevent.h54
-rw-r--r--lib/events/redactionevent.h32
-rw-r--r--lib/events/roomavatarevent.h37
-rw-r--r--lib/events/roomcreateevent.cpp38
-rw-r--r--lib/events/roomcreateevent.h75
-rw-r--r--lib/events/roomevent.cpp56
-rw-r--r--lib/events/roomevent.h178
-rw-r--r--lib/events/roommemberevent.cpp56
-rw-r--r--lib/events/roommemberevent.h154
-rw-r--r--lib/events/roommessageevent.cpp121
-rw-r--r--lib/events/roommessageevent.h379
-rw-r--r--lib/events/roomtombstoneevent.cpp32
-rw-r--r--lib/events/roomtombstoneevent.h62
-rw-r--r--lib/events/simplestateevents.h139
-rw-r--r--lib/events/stateevent.cpp44
-rw-r--r--lib/events/stateevent.h243
-rw-r--r--lib/events/typingevent.cpp8
-rw-r--r--lib/events/typingevent.h28
41 files changed, 1833 insertions, 1922 deletions
diff --git a/lib/events/accountdataevents.h b/lib/events/accountdataevents.h
index ffee5ba6..3f519668 100644
--- a/lib/events/accountdataevents.h
+++ b/lib/events/accountdataevents.h
@@ -15,86 +15,82 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
+#include "converters.h"
#include "event.h"
#include "eventcontent.h"
-#include "converters.h"
-namespace QMatrixClient
-{
- constexpr const char* FavouriteTag = "m.favourite";
- constexpr const char* LowPriorityTag = "m.lowpriority";
+namespace QMatrixClient {
+constexpr const char* FavouriteTag = "m.favourite";
+constexpr const char* LowPriorityTag = "m.lowpriority";
- struct TagRecord
- {
- using order_type = Omittable<float>;
+struct TagRecord {
+ using order_type = Omittable<float>;
- order_type order;
+ order_type order;
- TagRecord (order_type order = none) : order(order) { }
+ TagRecord(order_type order = none) : order(order) {}
- bool operator<(const TagRecord& other) const
- {
- // Per The Spec, rooms with no order should be after those with order
- return !order.omitted() &&
- (other.order.omitted() || order.value() < other.order.value());
- }
- };
+ bool operator<(const TagRecord& other) const
+ {
+ // Per The Spec, rooms with no order should be after those with order
+ return !order.omitted()
+ && (other.order.omitted() || order.value() < other.order.value());
+ }
+};
- template <> struct JsonObjectConverter<TagRecord>
+template <>
+struct JsonObjectConverter<TagRecord> {
+ static void fillFrom(const QJsonObject& jo, TagRecord& rec)
{
- static void fillFrom(const QJsonObject& jo, TagRecord& rec)
- {
- // Parse a float both from JSON double and JSON string because
- // libqmatrixclient previously used to use strings to store order.
- const auto orderJv = jo.value("order"_ls);
- if (orderJv.isDouble())
- rec.order = fromJson<float>(orderJv);
- if (orderJv.isString())
- {
- bool ok;
- rec.order = orderJv.toString().toFloat(&ok);
- if (!ok)
- rec.order = none;
- }
- }
- static void dumpTo(QJsonObject& jo, const TagRecord& rec)
- {
- addParam<IfNotEmpty>(jo, QStringLiteral("order"), rec.order);
+ // Parse a float both from JSON double and JSON string because
+ // libqmatrixclient previously used to use strings to store order.
+ const auto orderJv = jo.value("order"_ls);
+ if (orderJv.isDouble())
+ rec.order = fromJson<float>(orderJv);
+ if (orderJv.isString()) {
+ bool ok;
+ rec.order = orderJv.toString().toFloat(&ok);
+ if (!ok)
+ rec.order = none;
}
- };
+ }
+ static void dumpTo(QJsonObject& jo, const TagRecord& rec)
+ {
+ addParam<IfNotEmpty>(jo, QStringLiteral("order"), rec.order);
+ }
+};
- using TagsMap = QHash<QString, TagRecord>;
+using TagsMap = QHash<QString, TagRecord>;
-#define DEFINE_SIMPLE_EVENT(_Name, _TypeId, _ContentType, _ContentKey) \
- class _Name : public Event \
- { \
- public: \
- using content_type = _ContentType; \
- DEFINE_EVENT_TYPEID(_TypeId, _Name) \
- explicit _Name(QJsonObject obj) \
- : Event(typeId(), std::move(obj)) \
- { } \
- explicit _Name(_ContentType content) \
- : Event(typeId(), matrixTypeId(), \
- QJsonObject { { QStringLiteral(#_ContentKey), \
- toJson(std::move(content)) } }) \
- { } \
- auto _ContentKey() const \
- { return content<content_type>(#_ContentKey##_ls); } \
- }; \
- REGISTER_EVENT_TYPE(_Name) \
+#define DEFINE_SIMPLE_EVENT(_Name, _TypeId, _ContentType, _ContentKey) \
+ class _Name : public Event { \
+ public: \
+ using content_type = _ContentType; \
+ DEFINE_EVENT_TYPEID(_TypeId, _Name) \
+ explicit _Name(QJsonObject obj) : Event(typeId(), std::move(obj)) {} \
+ explicit _Name(_ContentType content) \
+ : Event(typeId(), matrixTypeId(), \
+ QJsonObject { { QStringLiteral(#_ContentKey), \
+ toJson(std::move(content)) } }) \
+ {} \
+ auto _ContentKey() const \
+ { \
+ return content<content_type>(#_ContentKey##_ls); \
+ } \
+ }; \
+ REGISTER_EVENT_TYPE(_Name) \
// End of macro
- DEFINE_SIMPLE_EVENT(TagEvent, "m.tag", TagsMap, tags)
- DEFINE_SIMPLE_EVENT(ReadMarkerEvent, "m.fully_read", QString, event_id)
- DEFINE_SIMPLE_EVENT(IgnoredUsersEvent, "m.ignored_user_list",
- QSet<QString>, ignored_users)
+DEFINE_SIMPLE_EVENT(TagEvent, "m.tag", TagsMap, tags)
+DEFINE_SIMPLE_EVENT(ReadMarkerEvent, "m.fully_read", QString, event_id)
+DEFINE_SIMPLE_EVENT(IgnoredUsersEvent, "m.ignored_user_list", QSet<QString>,
+ ignored_users)
- DEFINE_EVENTTYPE_ALIAS(Tag, TagEvent)
- DEFINE_EVENTTYPE_ALIAS(ReadMarker, ReadMarkerEvent)
-}
+DEFINE_EVENTTYPE_ALIAS(Tag, TagEvent)
+DEFINE_EVENTTYPE_ALIAS(ReadMarker, ReadMarkerEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/callanswerevent.cpp b/lib/events/callanswerevent.cpp
index d2862241..7ab4a6fb 100644
--- a/lib/events/callanswerevent.cpp
+++ b/lib/events/callanswerevent.cpp
@@ -13,13 +13,12 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "callanswerevent.h"
#include "event.h"
-
#include "logging.h"
#include <QtCore/QJsonDocument>
@@ -55,18 +54,18 @@ CallAnswerEvent::CallAnswerEvent(const QJsonObject& obj)
CallAnswerEvent::CallAnswerEvent(const QString& callId, const int lifetime,
const QString& sdp)
- : CallEventBase(typeId(), matrixTypeId(), callId, 0,
- { { QStringLiteral("lifetime"), lifetime }
- , { QStringLiteral("answer"), QJsonObject {
- { QStringLiteral("type"), QStringLiteral("answer") },
- { QStringLiteral("sdp"), sdp } } }
- })
-{ }
+ : CallEventBase(
+ typeId(), matrixTypeId(), callId, 0,
+ { { QStringLiteral("lifetime"), lifetime },
+ { QStringLiteral("answer"),
+ QJsonObject { { QStringLiteral("type"), QStringLiteral("answer") },
+ { QStringLiteral("sdp"), sdp } } } })
+{}
CallAnswerEvent::CallAnswerEvent(const QString& callId, const QString& sdp)
- : CallEventBase(typeId(), matrixTypeId(), callId, 0,
- { { QStringLiteral("answer"), QJsonObject {
- { QStringLiteral("type"), QStringLiteral("answer") },
- { QStringLiteral("sdp"), sdp } } }
- })
-{ }
+ : CallEventBase(
+ typeId(), matrixTypeId(), callId, 0,
+ { { QStringLiteral("answer"),
+ QJsonObject { { QStringLiteral("type"), QStringLiteral("answer") },
+ { QStringLiteral("sdp"), sdp } } } })
+{}
diff --git a/lib/events/callanswerevent.h b/lib/events/callanswerevent.h
index 2d9e5bb0..052f732d 100644
--- a/lib/events/callanswerevent.h
+++ b/lib/events/callanswerevent.h
@@ -13,33 +13,34 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "roomevent.h"
-namespace QMatrixClient
-{
- class CallAnswerEvent: public CallEventBase
- {
- public:
- DEFINE_EVENT_TYPEID("m.call.answer", CallAnswerEvent)
+namespace QMatrixClient {
+class CallAnswerEvent : public CallEventBase {
+public:
+ DEFINE_EVENT_TYPEID("m.call.answer", CallAnswerEvent)
- explicit CallAnswerEvent(const QJsonObject& obj);
+ explicit CallAnswerEvent(const QJsonObject& obj);
- explicit CallAnswerEvent(const QString& callId, const int lifetime,
- const QString& sdp);
- explicit CallAnswerEvent(const QString& callId, const QString& sdp);
+ explicit CallAnswerEvent(const QString& callId, const int lifetime,
+ const QString& sdp);
+ explicit CallAnswerEvent(const QString& callId, const QString& sdp);
- int lifetime() const { return content<int>("lifetime"_ls); } // FIXME: Omittable<>?
- QString sdp() const {
- return contentJson()["answer"_ls].toObject()
- .value("sdp"_ls).toString();
- }
- };
+ int lifetime() const
+ {
+ return content<int>("lifetime"_ls);
+ } // FIXME: Omittable<>?
+ QString sdp() const
+ {
+ return contentJson()["answer"_ls].toObject().value("sdp"_ls).toString();
+ }
+};
- REGISTER_EVENT_TYPE(CallAnswerEvent)
- DEFINE_EVENTTYPE_ALIAS(CallAnswer, CallAnswerEvent)
+REGISTER_EVENT_TYPE(CallAnswerEvent)
+DEFINE_EVENTTYPE_ALIAS(CallAnswer, CallAnswerEvent)
} // namespace QMatrixClient
diff --git a/lib/events/callcandidatesevent.cpp b/lib/events/callcandidatesevent.cpp
index 52cd1856..24f0dd46 100644
--- a/lib/events/callcandidatesevent.cpp
+++ b/lib/events/callcandidatesevent.cpp
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "callcandidatesevent.h"
@@ -26,9 +26,8 @@ m.call.candidates
"call_id": "12345",
"candidates": [
{
- "candidate": "candidate:863018703 1 udp 2122260223 10.9.64.156 43670 typ host generation 0",
- "sdpMLineIndex": 0,
- "sdpMid": "audio"
+ "candidate": "candidate:863018703 1 udp 2122260223 10.9.64.156
+43670 typ host generation 0", "sdpMLineIndex": 0, "sdpMid": "audio"
}
],
"version": 0
diff --git a/lib/events/callcandidatesevent.h b/lib/events/callcandidatesevent.h
index 4618832c..2a915a43 100644
--- a/lib/events/callcandidatesevent.h
+++ b/lib/events/callcandidatesevent.h
@@ -13,36 +13,34 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "roomevent.h"
-namespace QMatrixClient
-{
- class CallCandidatesEvent: public CallEventBase
- {
- public:
- DEFINE_EVENT_TYPEID("m.call.candidates", CallCandidatesEvent)
+namespace QMatrixClient {
+class CallCandidatesEvent : public CallEventBase {
+public:
+ DEFINE_EVENT_TYPEID("m.call.candidates", CallCandidatesEvent)
- explicit CallCandidatesEvent(const QJsonObject& obj)
- : CallEventBase(typeId(), obj)
- { }
+ explicit CallCandidatesEvent(const QJsonObject& obj)
+ : CallEventBase(typeId(), obj)
+ {}
- explicit CallCandidatesEvent(const QString& callId,
- const QJsonArray& candidates)
- : CallEventBase(typeId(), matrixTypeId(), callId, 0,
- {{ QStringLiteral("candidates"), candidates }})
- { }
+ explicit CallCandidatesEvent(const QString& callId,
+ const QJsonArray& candidates)
+ : CallEventBase(typeId(), matrixTypeId(), callId, 0,
+ { { QStringLiteral("candidates"), candidates } })
+ {}
- QJsonArray candidates() const
- {
- return content<QJsonArray>("candidates"_ls);
- }
- };
+ QJsonArray candidates() const
+ {
+ return content<QJsonArray>("candidates"_ls);
+ }
+};
- REGISTER_EVENT_TYPE(CallCandidatesEvent)
- DEFINE_EVENTTYPE_ALIAS(CallCandidates, CallCandidatesEvent)
-}
+REGISTER_EVENT_TYPE(CallCandidatesEvent)
+DEFINE_EVENTTYPE_ALIAS(CallCandidates, CallCandidatesEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/callhangupevent.cpp b/lib/events/callhangupevent.cpp
index b1154806..2a4fd3da 100644
--- a/lib/events/callhangupevent.cpp
+++ b/lib/events/callhangupevent.cpp
@@ -13,13 +13,12 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "callhangupevent.h"
#include "event.h"
-
#include "logging.h"
#include <QtCore/QJsonDocument>
@@ -42,7 +41,6 @@ m.call.hangup
using namespace QMatrixClient;
-
CallHangupEvent::CallHangupEvent(const QJsonObject& obj)
: CallEventBase(typeId(), obj)
{
@@ -51,4 +49,4 @@ CallHangupEvent::CallHangupEvent(const QJsonObject& obj)
CallHangupEvent::CallHangupEvent(const QString& callId)
: CallEventBase(typeId(), matrixTypeId(), callId, 0)
-{ }
+{}
diff --git a/lib/events/callhangupevent.h b/lib/events/callhangupevent.h
index c74e20d5..97fa2f52 100644
--- a/lib/events/callhangupevent.h
+++ b/lib/events/callhangupevent.h
@@ -13,24 +13,22 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "roomevent.h"
-namespace QMatrixClient
-{
- class CallHangupEvent: public CallEventBase
- {
- public:
- DEFINE_EVENT_TYPEID("m.call.hangup", CallHangupEvent)
-
- explicit CallHangupEvent(const QJsonObject& obj);
- explicit CallHangupEvent(const QString& callId);
- };
+namespace QMatrixClient {
+class CallHangupEvent : public CallEventBase {
+public:
+ DEFINE_EVENT_TYPEID("m.call.hangup", CallHangupEvent)
- REGISTER_EVENT_TYPE(CallHangupEvent)
- DEFINE_EVENTTYPE_ALIAS(CallHangup, CallHangupEvent)
-}
+ explicit CallHangupEvent(const QJsonObject& obj);
+ explicit CallHangupEvent(const QString& callId);
+};
+
+REGISTER_EVENT_TYPE(CallHangupEvent)
+DEFINE_EVENTTYPE_ALIAS(CallHangup, CallHangupEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/callinviteevent.cpp b/lib/events/callinviteevent.cpp
index bca3f296..f565fc3e 100644
--- a/lib/events/callinviteevent.cpp
+++ b/lib/events/callinviteevent.cpp
@@ -13,13 +13,12 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "callinviteevent.h"
#include "event.h"
-
#include "logging.h"
#include <QtCore/QJsonDocument>
@@ -55,10 +54,10 @@ CallInviteEvent::CallInviteEvent(const QJsonObject& obj)
CallInviteEvent::CallInviteEvent(const QString& callId, const int lifetime,
const QString& sdp)
- : CallEventBase(typeId(), matrixTypeId(), callId, lifetime,
- { { QStringLiteral("lifetime"), lifetime }
- , { QStringLiteral("offer"), QJsonObject {
- { QStringLiteral("type"), QStringLiteral("offer") },
- { QStringLiteral("sdp"), sdp } }
- }})
-{ }
+ : CallEventBase(
+ typeId(), matrixTypeId(), callId, lifetime,
+ { { QStringLiteral("lifetime"), lifetime },
+ { QStringLiteral("offer"),
+ QJsonObject { { QStringLiteral("type"), QStringLiteral("offer") },
+ { QStringLiteral("sdp"), sdp } } } })
+{}
diff --git a/lib/events/callinviteevent.h b/lib/events/callinviteevent.h
index d5315309..9b9d0ae5 100644
--- a/lib/events/callinviteevent.h
+++ b/lib/events/callinviteevent.h
@@ -13,32 +13,33 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "roomevent.h"
-namespace QMatrixClient
-{
- class CallInviteEvent: public CallEventBase
- {
- public:
- DEFINE_EVENT_TYPEID("m.call.invite", CallInviteEvent)
-
- explicit CallInviteEvent(const QJsonObject& obj);
+namespace QMatrixClient {
+class CallInviteEvent : public CallEventBase {
+public:
+ DEFINE_EVENT_TYPEID("m.call.invite", CallInviteEvent)
+
+ explicit CallInviteEvent(const QJsonObject& obj);
- explicit CallInviteEvent(const QString& callId, const int lifetime,
- const QString& sdp);
+ explicit CallInviteEvent(const QString& callId, const int lifetime,
+ const QString& sdp);
- int lifetime() const { return content<int>("lifetime"_ls); } // FIXME: Omittable<>?
- QString sdp() const {
- return contentJson()["offer"_ls].toObject()
- .value("sdp"_ls).toString();
- }
- };
+ int lifetime() const
+ {
+ return content<int>("lifetime"_ls);
+ } // FIXME: Omittable<>?
+ QString sdp() const
+ {
+ return contentJson()["offer"_ls].toObject().value("sdp"_ls).toString();
+ }
+};
- REGISTER_EVENT_TYPE(CallInviteEvent)
- DEFINE_EVENTTYPE_ALIAS(CallInvite, CallInviteEvent)
-}
+REGISTER_EVENT_TYPE(CallInviteEvent)
+DEFINE_EVENTTYPE_ALIAS(CallInvite, CallInviteEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/directchatevent.cpp b/lib/events/directchatevent.cpp
index 266d60d8..4ba098c2 100644
--- a/lib/events/directchatevent.cpp
+++ b/lib/events/directchatevent.cpp
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "directchatevent.h"
@@ -26,13 +26,12 @@ QMultiHash<QString, QString> DirectChatEvent::usersToDirectChats() const
{
QMultiHash<QString, QString> result;
const auto& json = contentJson();
- for (auto it = json.begin(); it != json.end(); ++it)
- {
+ for (auto it = json.begin(); it != json.end(); ++it) {
// Beware of range-for's over temporary returned from temporary
// (see the bottom of
// http://en.cppreference.com/w/cpp/language/range-for#Explanation)
const auto roomIds = it.value().toArray();
- for (const auto& roomIdValue: roomIds)
+ for (const auto& roomIdValue : roomIds)
result.insert(it.key(), roomIdValue.toString());
}
return result;
diff --git a/lib/events/directchatevent.h b/lib/events/directchatevent.h
index 7559796b..94857a93 100644
--- a/lib/events/directchatevent.h
+++ b/lib/events/directchatevent.h
@@ -13,26 +13,22 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "event.h"
-namespace QMatrixClient
-{
- class DirectChatEvent : public Event
- {
- public:
- DEFINE_EVENT_TYPEID("m.direct", DirectChatEvent)
+namespace QMatrixClient {
+class DirectChatEvent : public Event {
+public:
+ DEFINE_EVENT_TYPEID("m.direct", DirectChatEvent)
- explicit DirectChatEvent(const QJsonObject& obj)
- : Event(typeId(), obj)
- { }
+ explicit DirectChatEvent(const QJsonObject& obj) : Event(typeId(), obj) {}
- QMultiHash<QString, QString> usersToDirectChats() const;
- };
- REGISTER_EVENT_TYPE(DirectChatEvent)
- DEFINE_EVENTTYPE_ALIAS(DirectChat, DirectChatEvent)
-}
+ QMultiHash<QString, QString> usersToDirectChats() const;
+};
+REGISTER_EVENT_TYPE(DirectChatEvent)
+DEFINE_EVENTTYPE_ALIAS(DirectChat, DirectChatEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/encryptedevent.cpp b/lib/events/encryptedevent.cpp
index 6942738a..dac245fa 100644
--- a/lib/events/encryptedevent.cpp
+++ b/lib/events/encryptedevent.cpp
@@ -1,28 +1,31 @@
#include "encryptedevent.h"
+
#include "room.h"
using namespace QMatrixClient;
using namespace QtOlm;
-EncryptedEvent::EncryptedEvent(const QJsonObject &ciphertext, const QString &senderKey)
+EncryptedEvent::EncryptedEvent(const QJsonObject& ciphertext,
+ const QString& senderKey)
: RoomEvent(typeId(), matrixTypeId(),
- { { AlgorithmKeyL , OlmV1Curve25519AesSha2AlgoKey },
- { CiphertextKeyL , ciphertext },
- { SenderKeyKeyL, senderKey }
- })
-{ }
+ { { AlgorithmKeyL, OlmV1Curve25519AesSha2AlgoKey },
+ { CiphertextKeyL, ciphertext },
+ { SenderKeyKeyL, senderKey } })
+{}
-EncryptedEvent::EncryptedEvent(QByteArray ciphertext, const QString &senderKey, const QString& deviceId, const QString& sessionId)
+EncryptedEvent::EncryptedEvent(QByteArray ciphertext, const QString& senderKey,
+ const QString& deviceId, const QString& sessionId)
: RoomEvent(typeId(), matrixTypeId(),
- { { AlgorithmKeyL , MegolmV1AesSha2AlgoKey },
- { CiphertextKeyL , QString(ciphertext) },
- { DeviceIdKeyL, deviceId },
- { SenderKeyKeyL, senderKey },
- { SessionIdKeyL, sessionId },
+ {
+ { AlgorithmKeyL, MegolmV1AesSha2AlgoKey },
+ { CiphertextKeyL, QString(ciphertext) },
+ { DeviceIdKeyL, deviceId },
+ { SenderKeyKeyL, senderKey },
+ { SessionIdKeyL, sessionId },
})
-{ }
+{}
-EncryptedEvent::EncryptedEvent(const QJsonObject &obj)
+EncryptedEvent::EncryptedEvent(const QJsonObject& obj)
: RoomEvent(typeId(), obj)
{
qCDebug(EVENTS) << "Encrypted event" << id();
diff --git a/lib/events/encryptedevent.h b/lib/events/encryptedevent.h
index 2f9e4422..67298a27 100644
--- a/lib/events/encryptedevent.h
+++ b/lib/events/encryptedevent.h
@@ -1,66 +1,66 @@
#pragma once
-#include "roomevent.h"
#include "e2ee.h"
+#include "roomevent.h"
-namespace QMatrixClient
-{
- class Room;
- /*
- * While the specification states:
- *
- * "This event type is used when sending encrypted events.
- * It can be used either within a room
- * (in which case it will have all of the Room Event fields),
- * or as a to-device event."
- * "The encrypted payload can contain any message event."
- * https://matrix.org/docs/spec/client_server/latest#id493
- *
- * -- for most of the cases the message event is the room message event.
- * And even for the to-device events the context is for the room.
- *
- * So, to simplify integration to the timeline, EncryptedEvent is a RoomEvent inheritor.
- * Strictly speaking though, it's not always a RoomEvent, but an Event in general.
- * It's possible, because RoomEvent interface is similar to Event's one
- * and doesn't add new restrictions, just provides additional features.
- */
- class EncryptedEvent : public RoomEvent
- {
- Q_GADGET
- public:
- DEFINE_EVENT_TYPEID("m.room.encrypted", EncryptedEvent)
+namespace QMatrixClient {
+class Room;
+/*
+ * While the specification states:
+ *
+ * "This event type is used when sending encrypted events.
+ * It can be used either within a room
+ * (in which case it will have all of the Room Event fields),
+ * or as a to-device event."
+ * "The encrypted payload can contain any message event."
+ * https://matrix.org/docs/spec/client_server/latest#id493
+ *
+ * -- for most of the cases the message event is the room message event.
+ * And even for the to-device events the context is for the room.
+ *
+ * So, to simplify integration to the timeline, EncryptedEvent is a RoomEvent
+ * inheritor. Strictly speaking though, it's not always a RoomEvent, but an Event
+ * in general. It's possible, because RoomEvent interface is similar to Event's
+ * one and doesn't add new restrictions, just provides additional features.
+ */
+class EncryptedEvent : public RoomEvent {
+ Q_GADGET
+public:
+ DEFINE_EVENT_TYPEID("m.room.encrypted", EncryptedEvent)
- /* In case with Olm, the encrypted content of the event is
- * a map from the recipient Curve25519 identity key to ciphertext information */
- explicit EncryptedEvent(const QJsonObject& ciphertext,
- const QString& senderKey);
- /* In case with Megolm, device_id and session_id are required */
- explicit EncryptedEvent(QByteArray ciphertext,
- const QString& senderKey,
- const QString& deviceId,
- const QString& sessionId);
- explicit EncryptedEvent(const QJsonObject& obj);
+ /* In case with Olm, the encrypted content of the event is
+ * a map from the recipient Curve25519 identity key to ciphertext
+ * information */
+ explicit EncryptedEvent(const QJsonObject& ciphertext,
+ const QString& senderKey);
+ /* In case with Megolm, device_id and session_id are required */
+ explicit EncryptedEvent(QByteArray ciphertext, const QString& senderKey,
+ const QString& deviceId, const QString& sessionId);
+ explicit EncryptedEvent(const QJsonObject& obj);
- QString algorithm() const
- {
- QString algo = content<QString>(AlgorithmKeyL);
- if (!SupportedAlgorithms.contains(algo)) {
- qWarning(MAIN) << "The EncryptedEvent's algorithm" << algo
- << "is not supported";
- }
- return algo;
- }
- QByteArray ciphertext() const { return content<QString>(CiphertextKeyL).toLatin1(); }
- QJsonObject ciphertext(const QString& identityKey) const
- {
- return content<QJsonObject>(CiphertextKeyL).value(identityKey).toObject();
+ QString algorithm() const
+ {
+ QString algo = content<QString>(AlgorithmKeyL);
+ if (!SupportedAlgorithms.contains(algo)) {
+ qWarning(MAIN) << "The EncryptedEvent's algorithm" << algo
+ << "is not supported";
}
- QString senderKey() const { return content<QString>(SenderKeyKeyL); }
+ return algo;
+ }
+ QByteArray ciphertext() const
+ {
+ return content<QString>(CiphertextKeyL).toLatin1();
+ }
+ QJsonObject ciphertext(const QString& identityKey) const
+ {
+ return content<QJsonObject>(CiphertextKeyL).value(identityKey).toObject();
+ }
+ QString senderKey() const { return content<QString>(SenderKeyKeyL); }
- /* device_id and session_id are required with Megolm */
- QString deviceId() const { return content<QString>(DeviceIdKeyL); }
- QString sessionId() const { return content<QString>(SessionIdKeyL); }
- };
- REGISTER_EVENT_TYPE(EncryptedEvent)
+ /* device_id and session_id are required with Megolm */
+ QString deviceId() const { return content<QString>(DeviceIdKeyL); }
+ QString sessionId() const { return content<QString>(SessionIdKeyL); }
+};
+REGISTER_EVENT_TYPE(EncryptedEvent)
-} // namespace QMatrixClient
+} // namespace QMatrixClient
diff --git a/lib/events/encryptionevent.cpp b/lib/events/encryptionevent.cpp
index ee6c92b1..0c732a51 100644
--- a/lib/events/encryptionevent.cpp
+++ b/lib/events/encryptionevent.cpp
@@ -6,32 +6,31 @@
#include "encryptionevent.h"
#include "converters.h"
-#include "logging.h"
#include "e2ee.h"
+#include "logging.h"
#include <array>
-static const std::array<QString, 1> encryptionStrings = { {
- QMatrixClient::MegolmV1AesSha2AlgoKey
-} };
+static const std::array<QString, 1> encryptionStrings = {
+ { QMatrixClient::MegolmV1AesSha2AlgoKey }
+};
namespace QMatrixClient {
- template <>
- struct JsonConverter<EncryptionType>
+template <>
+struct JsonConverter<EncryptionType> {
+ static EncryptionType load(const QJsonValue& jv)
{
- static EncryptionType load(const QJsonValue& jv)
- {
- const auto& encryptionString = jv.toString();
- for (auto it = encryptionStrings.begin();
- it != encryptionStrings.end(); ++it)
- if (encryptionString == *it)
- return EncryptionType(it - encryptionStrings.begin());
-
- qCWarning(EVENTS) << "Unknown EncryptionType: " << encryptionString;
- return EncryptionType::Undefined;
- }
- };
-}
+ const auto& encryptionString = jv.toString();
+ for (auto it = encryptionStrings.begin(); it != encryptionStrings.end();
+ ++it)
+ if (encryptionString == *it)
+ return EncryptionType(it - encryptionStrings.begin());
+
+ qCWarning(EVENTS) << "Unknown EncryptionType: " << encryptionString;
+ return EncryptionType::Undefined;
+ }
+};
+} // namespace QMatrixClient
using namespace QMatrixClient;
@@ -40,13 +39,14 @@ EncryptionEventContent::EncryptionEventContent(const QJsonObject& json)
, algorithm(sanitized(json[AlgorithmKeyL].toString()))
, rotationPeriodMs(json[RotationPeriodMsKeyL].toInt(604800000))
, rotationPeriodMsgs(json[RotationPeriodMsgsKeyL].toInt(100))
-{ }
+{}
void EncryptionEventContent::fillJson(QJsonObject* o) const
{
Q_ASSERT(o);
- Q_ASSERT_X(encryption != EncryptionType::Undefined, __FUNCTION__,
- "The key 'algorithm' must be explicit in EncryptionEventContent");
+ Q_ASSERT_X(
+ encryption != EncryptionType::Undefined, __FUNCTION__,
+ "The key 'algorithm' must be explicit in EncryptionEventContent");
if (encryption != EncryptionType::Undefined)
o->insert(AlgorithmKey, algorithm);
o->insert(RotationPeriodMsKey, rotationPeriodMs);
diff --git a/lib/events/encryptionevent.h b/lib/events/encryptionevent.h
index b9e108f0..debabcae 100644
--- a/lib/events/encryptionevent.h
+++ b/lib/events/encryptionevent.h
@@ -13,66 +13,62 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
-#include "stateevent.h"
#include "eventcontent.h"
+#include "stateevent.h"
-namespace QMatrixClient
-{
- class EncryptionEventContent: public EventContent::Base
- {
- public:
- enum EncryptionType : size_t { MegolmV1AesSha2 = 0,
- Undefined };
+namespace QMatrixClient {
+class EncryptionEventContent : public EventContent::Base {
+public:
+ enum EncryptionType : size_t { MegolmV1AesSha2 = 0, Undefined };
- explicit EncryptionEventContent(EncryptionType et = Undefined)
- : encryption(et)
- { }
- explicit EncryptionEventContent(const QJsonObject& json);
+ explicit EncryptionEventContent(EncryptionType et = Undefined)
+ : encryption(et)
+ {}
+ explicit EncryptionEventContent(const QJsonObject& json);
- EncryptionType encryption;
- QString algorithm;
- int rotationPeriodMs;
- int rotationPeriodMsgs;
+ EncryptionType encryption;
+ QString algorithm;
+ int rotationPeriodMs;
+ int rotationPeriodMsgs;
- protected:
- void fillJson(QJsonObject* o) const override;
- };
+protected:
+ void fillJson(QJsonObject* o) const override;
+};
- using EncryptionType = EncryptionEventContent::EncryptionType;
+using EncryptionType = EncryptionEventContent::EncryptionType;
- class EncryptionEvent : public StateEvent<EncryptionEventContent>
- {
- Q_GADGET
- public:
- DEFINE_EVENT_TYPEID("m.room.encryption", EncryptionEvent)
+class EncryptionEvent : public StateEvent<EncryptionEventContent> {
+ Q_GADGET
+public:
+ DEFINE_EVENT_TYPEID("m.room.encryption", EncryptionEvent)
- using EncryptionType = EncryptionEventContent::EncryptionType;
-
- explicit EncryptionEvent(const QJsonObject& obj = {}) // TODO: apropriate default value
- : StateEvent(typeId(), obj)
- { }
- template <typename... ArgTs>
- EncryptionEvent(ArgTs&&... contentArgs)
- : StateEvent(typeId(), matrixTypeId(), QString(),
- std::forward<ArgTs>(contentArgs)...)
- { }
+ using EncryptionType = EncryptionEventContent::EncryptionType;
- EncryptionType encryption() const { return content().encryption; }
+ explicit EncryptionEvent(const QJsonObject& obj = {}) // TODO: apropriate
+ // default value
+ : StateEvent(typeId(), obj)
+ {}
+ template <typename... ArgTs>
+ EncryptionEvent(ArgTs&&... contentArgs)
+ : StateEvent(typeId(), matrixTypeId(), QString(),
+ std::forward<ArgTs>(contentArgs)...)
+ {}
- QString algorithm() const { return content().algorithm; }
- int rotationPeriodMs() const { return content().rotationPeriodMs; }
- int rotationPeriodMsgs() const { return content().rotationPeriodMsgs; }
+ EncryptionType encryption() const { return content().encryption; }
- private:
- REGISTER_ENUM(EncryptionType)
- };
+ QString algorithm() const { return content().algorithm; }
+ int rotationPeriodMs() const { return content().rotationPeriodMs; }
+ int rotationPeriodMsgs() const { return content().rotationPeriodMsgs; }
- REGISTER_EVENT_TYPE(EncryptionEvent)
- DEFINE_EVENTTYPE_ALIAS(Encryption, EncryptionEvent)
-} // namespace QMatrixClient
+private:
+ REGISTER_ENUM(EncryptionType)
+};
+REGISTER_EVENT_TYPE(EncryptionEvent)
+DEFINE_EVENTTYPE_ALIAS(Encryption, EncryptionEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/event.cpp b/lib/events/event.cpp
index 6505d89a..694254fe 100644
--- a/lib/events/event.cpp
+++ b/lib/events/event.cpp
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "event.h"
@@ -31,23 +31,21 @@ event_type_t EventTypeRegistry::initializeTypeId(event_mtype_t matrixTypeId)
if (strncmp(matrixTypeId, "", 1) == 0)
qDebug(EVENTS) << "Initialized unknown event type with id" << id;
else
- qDebug(EVENTS) << "Initialized event type" << matrixTypeId
- << "with id" << id;
+ qDebug(EVENTS) << "Initialized event type" << matrixTypeId << "with id"
+ << id;
return id;
}
QString EventTypeRegistry::getMatrixType(event_type_t typeId)
{
- return typeId < get().eventTypes.size()
- ? get().eventTypes[typeId] : QString();
+ return typeId < get().eventTypes.size() ? get().eventTypes[typeId]
+ : QString();
}
-Event::Event(Type type, const QJsonObject& json)
- : _type(type), _json(json)
+Event::Event(Type type, const QJsonObject& json) : _type(type), _json(json)
{
- if (!json.contains(ContentKeyL) &&
- !json.value(UnsignedKeyL).toObject().contains(RedactedCauseKeyL))
- {
+ if (!json.contains(ContentKeyL)
+ && !json.value(UnsignedKeyL).toObject().contains(RedactedCauseKeyL)) {
qCWarning(EVENTS) << "Event without 'content' node";
qCWarning(EVENTS) << formatJson << json;
}
@@ -55,19 +53,13 @@ Event::Event(Type type, const QJsonObject& json)
Event::Event(Type type, event_mtype_t matrixType, const QJsonObject& contentJson)
: Event(type, basicEventJson(matrixType, contentJson))
-{ }
+{}
Event::~Event() = default;
-QString Event::matrixType() const
-{
- return fullJson()[TypeKeyL].toString();
-}
+QString Event::matrixType() const { return fullJson()[TypeKeyL].toString(); }
-QByteArray Event::originalJson() const
-{
- return QJsonDocument(_json).toJson();
-}
+QByteArray Event::originalJson() const { return QJsonDocument(_json).toJson(); }
const QJsonObject Event::contentJson() const
{
diff --git a/lib/events/event.h b/lib/events/event.h
index dee1c44a..686bd8e0 100644
--- a/lib/events/event.h
+++ b/lib/events/event.h
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
@@ -22,397 +22,390 @@
#include "logging.h"
#ifdef ENABLE_EVENTTYPE_ALIAS
-#define USE_EVENTTYPE_ALIAS 1
+# define USE_EVENTTYPE_ALIAS 1
#endif
-namespace QMatrixClient
+namespace QMatrixClient {
+// === event_ptr_tt<> and type casting facilities ===
+
+template <typename EventT>
+using event_ptr_tt = std::unique_ptr<EventT>;
+
+/// Unwrap a plain pointer from a smart pointer
+template <typename EventT>
+inline EventT* rawPtr(const event_ptr_tt<EventT>& ptr)
{
- // === event_ptr_tt<> and type casting facilities ===
+ return ptr.get();
+}
- template <typename EventT>
- using event_ptr_tt = std::unique_ptr<EventT>;
+/// Unwrap a plain pointer and downcast it to the specified type
+template <typename TargetEventT, typename EventT>
+inline TargetEventT* weakPtrCast(const event_ptr_tt<EventT>& ptr)
+{
+ return static_cast<TargetEventT*>(rawPtr(ptr));
+}
+
+/// Re-wrap a smart pointer to base into a smart pointer to derived
+template <typename TargetT, typename SourceT>
+[[deprecated("Consider using eventCast() or visit() "
+ "instead")]] inline event_ptr_tt<TargetT>
+ptrCast(event_ptr_tt<SourceT>&& ptr)
+{
+ return unique_ptr_cast<TargetT>(ptr);
+}
+
+// === Standard Matrix key names and basicEventJson() ===
+
+static const auto TypeKey = QStringLiteral("type");
+static const auto BodyKey = QStringLiteral("body");
+static const auto ContentKey = QStringLiteral("content");
+static const auto EventIdKey = QStringLiteral("event_id");
+static const auto UnsignedKey = QStringLiteral("unsigned");
+static const auto StateKeyKey = QStringLiteral("state_key");
+static const auto TypeKeyL = "type"_ls;
+static const auto BodyKeyL = "body"_ls;
+static const auto ContentKeyL = "content"_ls;
+static const auto EventIdKeyL = "event_id"_ls;
+static const auto UnsignedKeyL = "unsigned"_ls;
+static const auto RedactedCauseKeyL = "redacted_because"_ls;
+static const auto PrevContentKeyL = "prev_content"_ls;
+static const auto StateKeyKeyL = "state_key"_ls;
+
+/// Make a minimal correct Matrix event JSON
+template <typename StrT>
+inline QJsonObject basicEventJson(StrT matrixType, const QJsonObject& content)
+{
+ return { { TypeKey, std::forward<StrT>(matrixType) },
+ { ContentKey, content } };
+}
- /// Unwrap a plain pointer from a smart pointer
- template <typename EventT>
- inline EventT* rawPtr(const event_ptr_tt<EventT>& ptr)
- {
- return ptr.get();
- }
+// === Event types and event types registry ===
- /// Unwrap a plain pointer and downcast it to the specified type
- template <typename TargetEventT, typename EventT>
- inline TargetEventT* weakPtrCast(const event_ptr_tt<EventT>& ptr)
- {
- return static_cast<TargetEventT*>(rawPtr(ptr));
- }
+using event_type_t = size_t;
+using event_mtype_t = const char*;
- /// Re-wrap a smart pointer to base into a smart pointer to derived
- template <typename TargetT, typename SourceT>
- [[deprecated("Consider using eventCast() or visit() instead")]]
- inline event_ptr_tt<TargetT> ptrCast(event_ptr_tt<SourceT>&& ptr)
- {
- return unique_ptr_cast<TargetT>(ptr);
- }
+class EventTypeRegistry {
+public:
+ ~EventTypeRegistry() = default;
+
+ static event_type_t initializeTypeId(event_mtype_t matrixTypeId);
- // === Standard Matrix key names and basicEventJson() ===
-
- static const auto TypeKey = QStringLiteral("type");
- static const auto BodyKey = QStringLiteral("body");
- static const auto ContentKey = QStringLiteral("content");
- static const auto EventIdKey = QStringLiteral("event_id");
- static const auto UnsignedKey = QStringLiteral("unsigned");
- static const auto StateKeyKey = QStringLiteral("state_key");
- static const auto TypeKeyL = "type"_ls;
- static const auto BodyKeyL = "body"_ls;
- static const auto ContentKeyL = "content"_ls;
- static const auto EventIdKeyL = "event_id"_ls;
- static const auto UnsignedKeyL = "unsigned"_ls;
- static const auto RedactedCauseKeyL = "redacted_because"_ls;
- static const auto PrevContentKeyL = "prev_content"_ls;
- static const auto StateKeyKeyL = "state_key"_ls;
-
- /// Make a minimal correct Matrix event JSON
- template <typename StrT>
- inline QJsonObject basicEventJson(StrT matrixType,
- const QJsonObject& content)
+ template <typename EventT>
+ static inline event_type_t initializeTypeId()
{
- return { { TypeKey, std::forward<StrT>(matrixType) },
- { ContentKey, content } };
+ return initializeTypeId(EventT::matrixTypeId());
}
- // === Event types and event types registry ===
+ static QString getMatrixType(event_type_t typeId);
- using event_type_t = size_t;
- using event_mtype_t = const char*;
+private:
+ EventTypeRegistry() = default;
+ Q_DISABLE_COPY(EventTypeRegistry)
+ DISABLE_MOVE(EventTypeRegistry)
- class EventTypeRegistry
+ static EventTypeRegistry& get()
{
- public:
- ~EventTypeRegistry() = default;
+ static EventTypeRegistry etr;
+ return etr;
+ }
- static event_type_t initializeTypeId(event_mtype_t matrixTypeId);
+ std::vector<event_mtype_t> eventTypes;
+};
- template <typename EventT>
- static inline event_type_t initializeTypeId()
- {
- return initializeTypeId(EventT::matrixTypeId());
- }
+template <>
+inline event_type_t EventTypeRegistry::initializeTypeId<void>()
+{
+ return initializeTypeId("");
+}
- static QString getMatrixType(event_type_t typeId);
+template <typename EventT>
+struct EventTypeTraits {
+ static event_type_t id()
+ {
+ static const auto id = EventTypeRegistry::initializeTypeId<EventT>();
+ return id;
+ }
+};
- private:
- EventTypeRegistry() = default;
- Q_DISABLE_COPY(EventTypeRegistry)
- DISABLE_MOVE(EventTypeRegistry)
+template <typename EventT>
+inline event_type_t typeId()
+{
+ return EventTypeTraits<std::decay_t<EventT>>::id();
+}
- static EventTypeRegistry& get()
- {
- static EventTypeRegistry etr;
- return etr;
- }
+inline event_type_t unknownEventTypeId() { return typeId<void>(); }
- std::vector<event_mtype_t> eventTypes;
- };
+// === EventFactory ===
- template <>
- inline event_type_t EventTypeRegistry::initializeTypeId<void>()
+/** Create an event of arbitrary type from its arguments */
+template <typename EventT, typename... ArgTs>
+inline event_ptr_tt<EventT> makeEvent(ArgTs&&... args)
+{
+ return std::make_unique<EventT>(std::forward<ArgTs>(args)...);
+}
+
+template <typename BaseEventT>
+class EventFactory {
+public:
+ template <typename FnT>
+ static auto addMethod(FnT&& method)
{
- return initializeTypeId("");
+ factories().emplace_back(std::forward<FnT>(method));
+ return 0;
}
+ /** Chain two type factories
+ * Adds the factory class of EventT2 (EventT2::factory_t) to
+ * the list in factory class of EventT1 (EventT1::factory_t) so
+ * that when EventT1::factory_t::make() is invoked, types of
+ * EventT2 factory are looked through as well. This is used
+ * to include RoomEvent types into the more general Event factory,
+ * and state event types into the RoomEvent factory.
+ */
template <typename EventT>
- struct EventTypeTraits
+ static auto chainFactory()
{
- static event_type_t id()
- {
- static const auto id = EventTypeRegistry::initializeTypeId<EventT>();
- return id;
- }
- };
+ return addMethod(&EventT::factory_t::make);
+ }
- template <typename EventT>
- inline event_type_t typeId()
+ static event_ptr_tt<BaseEventT> make(const QJsonObject& json,
+ const QString& matrixType)
{
- return EventTypeTraits<std::decay_t<EventT>>::id();
+ for (const auto& f : factories())
+ if (auto e = f(json, matrixType))
+ return e;
+ return nullptr;
}
- inline event_type_t unknownEventTypeId() { return typeId<void>(); }
+private:
+ static auto& factories()
+ {
+ using inner_factory_tt = std::function<event_ptr_tt<BaseEventT>(
+ const QJsonObject&, const QString&)>;
+ static std::vector<inner_factory_tt> _factories {};
+ return _factories;
+ }
+};
- // === EventFactory ===
+/** Add a type to its default factory
+ * Adds a standard factory method (via makeEvent<>) for a given
+ * type to EventT::factory_t factory class so that it can be
+ * created dynamically from loadEvent<>().
+ *
+ * \tparam EventT the type to enable dynamic creation of
+ * \return the registered type id
+ * \sa loadEvent, Event::type
+ */
+template <typename EventT>
+inline auto setupFactory()
+{
+ qDebug(EVENTS) << "Adding factory method for" << EventT::matrixTypeId();
+ return EventT::factory_t::addMethod([](const QJsonObject& json,
+ const QString& jsonMatrixType) {
+ return EventT::matrixTypeId() == jsonMatrixType ? makeEvent<EventT>(json)
+ : nullptr;
+ });
+}
+
+template <typename EventT>
+inline auto registerEventType()
+{
+ // Initialise exactly once, even if this function is called twice for
+ // the same type (for whatever reason - you never know the ways of
+ // static initialisation is done).
+ static const auto _ = setupFactory<EventT>();
+ return _; // Only to facilitate usage in static initialisation
+}
+
+// === Event ===
+
+class Event {
+ Q_GADGET
+ Q_PROPERTY(Type type READ type CONSTANT)
+ Q_PROPERTY(QJsonObject contentJson READ contentJson CONSTANT)
+public:
+ using Type = event_type_t;
+ using factory_t = EventFactory<Event>;
+
+ explicit Event(Type type, const QJsonObject& json);
+ explicit Event(Type type, event_mtype_t matrixType,
+ const QJsonObject& contentJson = {});
+ Q_DISABLE_COPY(Event)
+ Event(Event&&) = default;
+ Event& operator=(Event&&) = delete;
+ virtual ~Event();
+
+ Type type() const { return _type; }
+ QString matrixType() const;
+ QByteArray originalJson() const;
+ QJsonObject originalJsonObject() const { return fullJson(); }
+
+ const QJsonObject& fullJson() const { return _json; }
+
+ // According to the CS API spec, every event also has
+ // a "content" object; but since its structure is different for
+ // different types, we're implementing it per-event type.
+
+ const QJsonObject contentJson() const;
+ const QJsonObject unsignedJson() const;
- /** Create an event of arbitrary type from its arguments */
- template <typename EventT, typename... ArgTs>
- inline event_ptr_tt<EventT> makeEvent(ArgTs&&... args)
+ template <typename T>
+ T content(const QString& key) const
{
- return std::make_unique<EventT>(std::forward<ArgTs>(args)...);
+ return fromJson<T>(contentJson()[key]);
}
- template <typename BaseEventT>
- class EventFactory
- {
- public:
- template <typename FnT>
- static auto addMethod(FnT&& method)
- {
- factories().emplace_back(std::forward<FnT>(method));
- return 0;
- }
-
- /** Chain two type factories
- * Adds the factory class of EventT2 (EventT2::factory_t) to
- * the list in factory class of EventT1 (EventT1::factory_t) so
- * that when EventT1::factory_t::make() is invoked, types of
- * EventT2 factory are looked through as well. This is used
- * to include RoomEvent types into the more general Event factory,
- * and state event types into the RoomEvent factory.
- */
- template <typename EventT>
- static auto chainFactory()
- {
- return addMethod(&EventT::factory_t::make);
- }
-
- static event_ptr_tt<BaseEventT> make(const QJsonObject& json,
- const QString& matrixType)
- {
- for (const auto& f: factories())
- if (auto e = f(json, matrixType))
- return e;
- return nullptr;
- }
-
- private:
- static auto& factories()
- {
- using inner_factory_tt =
- std::function<event_ptr_tt<BaseEventT>(const QJsonObject&,
- const QString&)>;
- static std::vector<inner_factory_tt> _factories {};
- return _factories;
- }
- };
-
- /** Add a type to its default factory
- * Adds a standard factory method (via makeEvent<>) for a given
- * type to EventT::factory_t factory class so that it can be
- * created dynamically from loadEvent<>().
- *
- * \tparam EventT the type to enable dynamic creation of
- * \return the registered type id
- * \sa loadEvent, Event::type
- */
- template <typename EventT>
- inline auto setupFactory()
+ template <typename T>
+ T content(QLatin1String key) const
{
- qDebug(EVENTS) << "Adding factory method for" << EventT::matrixTypeId();
- return EventT::factory_t::addMethod(
- [] (const QJsonObject& json, const QString& jsonMatrixType)
- {
- return EventT::matrixTypeId() == jsonMatrixType
- ? makeEvent<EventT>(json) : nullptr;
- });
+ return fromJson<T>(contentJson()[key]);
}
- template <typename EventT>
- inline auto registerEventType()
+ friend QDebug operator<<(QDebug dbg, const Event& e)
{
- // Initialise exactly once, even if this function is called twice for
- // the same type (for whatever reason - you never know the ways of
- // static initialisation is done).
- static const auto _ = setupFactory<EventT>();
- return _; // Only to facilitate usage in static initialisation
+ QDebugStateSaver _dss { dbg };
+ dbg.noquote().nospace() << e.matrixType() << '(' << e.type() << "): ";
+ e.dumpTo(dbg);
+ return dbg;
}
- // === Event ===
+ virtual bool isStateEvent() const { return false; }
+ virtual bool isCallEvent() const { return false; }
+ virtual void dumpTo(QDebug dbg) const;
- class Event
- {
- Q_GADGET
- Q_PROPERTY(Type type READ type CONSTANT)
- Q_PROPERTY(QJsonObject contentJson READ contentJson CONSTANT)
- public:
- using Type = event_type_t;
- using factory_t = EventFactory<Event>;
-
- explicit Event(Type type, const QJsonObject& json);
- explicit Event(Type type, event_mtype_t matrixType,
- const QJsonObject& contentJson = {});
- Q_DISABLE_COPY(Event)
- Event(Event&&) = default;
- Event& operator=(Event&&) = delete;
- virtual ~Event();
-
- Type type() const { return _type; }
- QString matrixType() const;
- QByteArray originalJson() const;
- QJsonObject originalJsonObject() const { return fullJson(); }
-
- const QJsonObject& fullJson() const { return _json; }
-
- // According to the CS API spec, every event also has
- // a "content" object; but since its structure is different for
- // different types, we're implementing it per-event type.
-
- const QJsonObject contentJson() const;
- const QJsonObject unsignedJson() const;
-
- template <typename T>
- T content(const QString& key) const
- {
- return fromJson<T>(contentJson()[key]);
- }
-
- template <typename T>
- T content(QLatin1String key) const
- {
- return fromJson<T>(contentJson()[key]);
- }
-
- friend QDebug operator<<(QDebug dbg, const Event& e)
- {
- QDebugStateSaver _dss { dbg };
- dbg.noquote().nospace()
- << e.matrixType() << '(' << e.type() << "): ";
- e.dumpTo(dbg);
- return dbg;
- }
-
- virtual bool isStateEvent() const { return false; }
- virtual bool isCallEvent() const { return false; }
- virtual void dumpTo(QDebug dbg) const;
-
- protected:
- QJsonObject& editJson() { return _json; }
-
- private:
- Type _type;
- QJsonObject _json;
- };
- using EventPtr = event_ptr_tt<Event>;
+protected:
+ QJsonObject& editJson() { return _json; }
- template <typename EventT>
- using EventsArray = std::vector<event_ptr_tt<EventT>>;
- using Events = EventsArray<Event>;
+private:
+ Type _type;
+ QJsonObject _json;
+};
+using EventPtr = event_ptr_tt<Event>;
- // === Macros used with event class definitions ===
+template <typename EventT>
+using EventsArray = std::vector<event_ptr_tt<EventT>>;
+using Events = EventsArray<Event>;
- // This macro should be used in a public section of an event class to
- // provide matrixTypeId() and typeId().
-#define DEFINE_EVENT_TYPEID(_Id, _Type) \
- static constexpr event_mtype_t matrixTypeId() { return _Id; } \
+// === Macros used with event class definitions ===
+
+// This macro should be used in a public section of an event class to
+// provide matrixTypeId() and typeId().
+#define DEFINE_EVENT_TYPEID(_Id, _Type) \
+ static constexpr event_mtype_t matrixTypeId() { return _Id; } \
static auto typeId() { return QMatrixClient::typeId<_Type>(); } \
// End of macro
- // This macro should be put after an event class definition (in .h or .cpp)
- // to enable its deserialisation from a /sync and other
- // polymorphic event arrays
-#define REGISTER_EVENT_TYPE(_Type) \
- namespace { \
- [[gnu::unused]] \
- static const auto _factoryAdded##_Type = registerEventType<_Type>(); \
- } \
+// This macro should be put after an event class definition (in .h or .cpp)
+// to enable its deserialisation from a /sync and other
+// polymorphic event arrays
+#define REGISTER_EVENT_TYPE(_Type) \
+ namespace { \
+ [[gnu::unused]] static const auto _factoryAdded##_Type = \
+ registerEventType<_Type>(); \
+ } \
// End of macro
#ifdef USE_EVENTTYPE_ALIAS
- namespace EventType
+namespace EventType {
+ inline event_type_t logEventType(event_type_t id, const char* idName)
{
- inline event_type_t logEventType(event_type_t id, const char* idName)
- {
- qDebug(EVENTS) << "Using id" << id << "for" << idName;
- return id;
- }
+ qDebug(EVENTS) << "Using id" << id << "for" << idName;
+ return id;
}
-
- // This macro provides constants in EventType:: namespace for
- // back-compatibility with libQMatrixClient 0.3 event type system.
-#define DEFINE_EVENTTYPE_ALIAS(_Id, _Type) \
- namespace EventType \
- { \
- [[deprecated("Use is<>(), eventCast<>() or visit<>()")]] \
- static const auto _Id = logEventType(typeId<_Type>(), #_Id); \
- } \
- // End of macro
+} // namespace EventType
+
+// This macro provides constants in EventType:: namespace for
+// back-compatibility with libQMatrixClient 0.3 event type system.
+# define DEFINE_EVENTTYPE_ALIAS(_Id, _Type) \
+ namespace EventType { \
+ [[deprecated("Use is<>(), eventCast<>() or " \
+ "visit<>()")]] static const auto _Id = \
+ logEventType(typeId<_Type>(), #_Id); \
+ } \
+ // End of macro
#else
-#define DEFINE_EVENTTYPE_ALIAS(_Id, _Type) // Nothing
+# define DEFINE_EVENTTYPE_ALIAS(_Id, _Type) // Nothing
#endif
- // === is<>(), eventCast<>() and visit<>() ===
-
- template <typename EventT>
- inline bool is(const Event& e) { return e.type() == typeId<EventT>(); }
-
- inline bool isUnknown(const Event& e) { return e.type() == unknownEventTypeId(); }
+// === is<>(), eventCast<>() and visit<>() ===
- template <typename EventT, typename BasePtrT>
- inline auto eventCast(const BasePtrT& eptr)
- -> decltype(static_cast<EventT*>(&*eptr))
- {
- Q_ASSERT(eptr);
- return is<std::decay_t<EventT>>(*eptr)
- ? static_cast<EventT*>(&*eptr) : nullptr;
- }
-
- // A single generic catch-all visitor
- template <typename BaseEventT, typename FnT>
- inline auto visit(const BaseEventT& event, FnT&& visitor)
- -> decltype(visitor(event))
- {
- return visitor(event);
- }
-
- template <typename T>
- constexpr auto is_event()
- {
- return std::is_base_of<Event, std::decay_t<T>>::value;
- }
+template <typename EventT>
+inline bool is(const Event& e)
+{
+ return e.type() == typeId<EventT>();
+}
- template <typename T, typename FnT>
- constexpr auto needs_cast()
- {
- return !std::is_convertible<T, fn_arg_t<FnT>>::value;
- }
+inline bool isUnknown(const Event& e)
+{
+ return e.type() == unknownEventTypeId();
+}
- // A single type-specific void visitor
- template <typename BaseEventT, typename FnT>
- inline
- std::enable_if_t<
- is_event<BaseEventT>() && needs_cast<BaseEventT, FnT>() &&
- std::is_void<fn_return_t<FnT>>::value>
- visit(const BaseEventT& event, FnT&& visitor)
- {
- using event_type = fn_arg_t<FnT>;
- if (is<std::decay_t<event_type>>(event))
- visitor(static_cast<event_type>(event));
- }
+template <typename EventT, typename BasePtrT>
+inline auto eventCast(const BasePtrT& eptr)
+ -> decltype(static_cast<EventT*>(&*eptr))
+{
+ Q_ASSERT(eptr);
+ return is<std::decay_t<EventT>>(*eptr) ? static_cast<EventT*>(&*eptr)
+ : nullptr;
+}
+
+// A single generic catch-all visitor
+template <typename BaseEventT, typename FnT>
+inline auto visit(const BaseEventT& event, FnT&& visitor)
+ -> decltype(visitor(event))
+{
+ return visitor(event);
+}
- // A single type-specific non-void visitor with an optional default value
- template <typename BaseEventT, typename FnT>
- inline
- std::enable_if_t<
- is_event<BaseEventT>() && needs_cast<BaseEventT, FnT>(),
- fn_return_t<FnT>> // non-voidness is guarded by defaultValue type
- visit(const BaseEventT& event, FnT&& visitor,
- fn_return_t<FnT>&& defaultValue = {})
- {
- using event_type = fn_arg_t<FnT>;
- if (is<std::decay_t<event_type>>(event))
- return visitor(static_cast<event_type>(event));
- return std::forward<fn_return_t<FnT>>(defaultValue);
- }
+template <typename T>
+constexpr auto is_event()
+{
+ return std::is_base_of<Event, std::decay_t<T>>::value;
+}
- // A chain of 2 or more visitors
- template <typename BaseEventT, typename FnT1, typename FnT2, typename... FnTs>
- inline
- std::enable_if_t<is_event<BaseEventT>(), fn_return_t<FnT1>>
- visit(const BaseEventT& event, FnT1&& visitor1, FnT2&& visitor2,
- FnTs&&... visitors)
- {
- using event_type1 = fn_arg_t<FnT1>;
- if (is<std::decay_t<event_type1>>(event))
- return visitor1(static_cast<event_type1&>(event));
- return visit(event, std::forward<FnT2>(visitor2),
- std::forward<FnTs>(visitors)...);
- }
-} // namespace QMatrixClient
+template <typename T, typename FnT>
+constexpr auto needs_cast()
+{
+ return !std::is_convertible<T, fn_arg_t<FnT>>::value;
+}
+
+// A single type-specific void visitor
+template <typename BaseEventT, typename FnT>
+inline std::enable_if_t<is_event<BaseEventT>() && needs_cast<BaseEventT, FnT>()
+ && std::is_void<fn_return_t<FnT>>::value>
+visit(const BaseEventT& event, FnT&& visitor)
+{
+ using event_type = fn_arg_t<FnT>;
+ if (is<std::decay_t<event_type>>(event))
+ visitor(static_cast<event_type>(event));
+}
+
+// A single type-specific non-void visitor with an optional default value
+template <typename BaseEventT, typename FnT>
+inline std::enable_if_t<is_event<BaseEventT>() && needs_cast<BaseEventT, FnT>(),
+ fn_return_t<FnT>> // non-voidness is guarded by
+ // defaultValue type
+visit(const BaseEventT& event, FnT&& visitor,
+ fn_return_t<FnT>&& defaultValue = {})
+{
+ using event_type = fn_arg_t<FnT>;
+ if (is<std::decay_t<event_type>>(event))
+ return visitor(static_cast<event_type>(event));
+ return std::forward<fn_return_t<FnT>>(defaultValue);
+}
+
+// A chain of 2 or more visitors
+template <typename BaseEventT, typename FnT1, typename FnT2, typename... FnTs>
+inline std::enable_if_t<is_event<BaseEventT>(), fn_return_t<FnT1>>
+visit(const BaseEventT& event, FnT1&& visitor1, FnT2&& visitor2,
+ FnTs&&... visitors)
+{
+ using event_type1 = fn_arg_t<FnT1>;
+ if (is<std::decay_t<event_type1>>(event))
+ return visitor1(static_cast<event_type1&>(event));
+ return visit(event, std::forward<FnT2>(visitor2),
+ std::forward<FnTs>(visitors)...);
+}
+} // namespace QMatrixClient
Q_DECLARE_METATYPE(QMatrixClient::Event*)
Q_DECLARE_METATYPE(const QMatrixClient::Event*)
diff --git a/lib/events/eventcontent.cpp b/lib/events/eventcontent.cpp
index 77f756cd..814f2787 100644
--- a/lib/events/eventcontent.cpp
+++ b/lib/events/eventcontent.cpp
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "eventcontent.h"
@@ -34,14 +34,17 @@ QJsonObject Base::toJson() const
FileInfo::FileInfo(const QUrl& u, qint64 payloadSize, const QMimeType& mimeType,
const QString& originalFilename)
- : mimeType(mimeType), url(u), payloadSize(payloadSize)
+ : mimeType(mimeType)
+ , url(u)
+ , payloadSize(payloadSize)
, originalName(originalFilename)
-{ }
+{}
FileInfo::FileInfo(const QUrl& u, const QJsonObject& infoJson,
const QString& originalFilename)
: originalInfoJson(infoJson)
- , mimeType(QMimeDatabase().mimeTypeForName(infoJson["mimetype"_ls].toString()))
+ , mimeType(
+ QMimeDatabase().mimeTypeForName(infoJson["mimetype"_ls].toString()))
, url(u)
, payloadSize(fromJson<qint64>(infoJson["size"_ls]))
, originalName(originalFilename)
@@ -53,7 +56,7 @@ FileInfo::FileInfo(const QUrl& u, const QJsonObject& infoJson,
bool FileInfo::isValid() const
{
return url.scheme() == "mxc"
- && (url.authority() + url.path()).count('/') == 1;
+ && (url.authority() + url.path()).count('/') == 1;
}
void FileInfo::fillInfoJson(QJsonObject* infoJson) const
@@ -68,13 +71,13 @@ void FileInfo::fillInfoJson(QJsonObject* infoJson) const
ImageInfo::ImageInfo(const QUrl& u, qint64 fileSize, QMimeType mimeType,
const QSize& imageSize, const QString& originalFilename)
: FileInfo(u, fileSize, mimeType, originalFilename), imageSize(imageSize)
-{ }
+{}
ImageInfo::ImageInfo(const QUrl& u, const QJsonObject& infoJson,
const QString& originalFilename)
: FileInfo(u, infoJson, originalFilename)
, imageSize(infoJson["w"_ls].toInt(), infoJson["h"_ls].toInt())
-{ }
+{}
void ImageInfo::fillInfoJson(QJsonObject* infoJson) const
{
@@ -88,7 +91,7 @@ void ImageInfo::fillInfoJson(QJsonObject* infoJson) const
Thumbnail::Thumbnail(const QJsonObject& infoJson)
: ImageInfo(infoJson["thumbnail_url"_ls].toString(),
infoJson["thumbnail_info"_ls].toObject())
-{ }
+{}
void Thumbnail::fillInfoJson(QJsonObject* infoJson) const
{
diff --git a/lib/events/eventcontent.h b/lib/events/eventcontent.h
index 254eb9a9..5c0f92d1 100644
--- a/lib/events/eventcontent.h
+++ b/lib/events/eventcontent.h
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
@@ -23,268 +23,256 @@
#include <QtCore/QJsonObject>
#include <QtCore/QMimeType>
-#include <QtCore/QUrl>
#include <QtCore/QSize>
+#include <QtCore/QUrl>
-namespace QMatrixClient
-{
- namespace EventContent
- {
- /**
- * 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.
- */
- class Base
- {
- public:
- explicit Base (QJsonObject o = {}) : originalJson(std::move(o)) { }
- virtual ~Base() = default;
-
- // FIXME: make toJson() from converters.* work on base classes
- QJsonObject toJson() const;
-
- public:
- QJsonObject originalJson;
-
- protected:
- Base(const Base&) = default;
- Base(Base&&) = default;
-
- virtual void fillJson(QJsonObject* o) const = 0;
- };
+namespace QMatrixClient {
+namespace EventContent {
+ /**
+ * 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.
+ */
+ class Base {
+ public:
+ explicit Base(QJsonObject o = {}) : originalJson(std::move(o)) {}
+ virtual ~Base() = default;
+
+ // FIXME: make toJson() from converters.* work on base classes
+ QJsonObject toJson() const;
+
+ public:
+ QJsonObject originalJson;
+
+ protected:
+ Base(const Base&) = default;
+ Base(Base&&) = default;
+
+ virtual void fillJson(QJsonObject* o) const = 0;
+ };
+
+ // 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.
+
+ // A quick classes inheritance structure follows:
+ // FileInfo
+ // FileContent : UrlBasedContent<FileInfo, Thumbnail>
+ // AudioContent : UrlBasedContent<FileInfo, Duration>
+ // ImageInfo : FileInfo + imageSize attribute
+ // ImageContent : UrlBasedContent<ImageInfo, Thumbnail>
+ // VideoContent : UrlBasedContent<ImageInfo, Thumbnail, Duration>
+
+ /**
+ * A base/mixin class for structures representing an "info" object for
+ * some content types. These include most attachment types currently in
+ * the CS API spec.
+ *
+ * In order to use it in a content class, derive both from TypedBase
+ * (or Base) and from FileInfo (or its derivative, such as \p ImageInfo)
+ * and call fillInfoJson() to fill the "info" subobject. Make sure
+ * to pass an "info" part of JSON to FileInfo constructor, not the whole
+ * JSON content, as well as contents of "url" (or a similar key) and
+ * optionally "filename" node from the main JSON content. Assuming you
+ * don't do unusual things, you should use \p UrlBasedContent<> instead
+ * of doing multiple inheritance and overriding Base::fillJson() by hand.
+ *
+ * This class is not polymorphic.
+ */
+ class FileInfo {
+ public:
+ explicit FileInfo(const QUrl& u, qint64 payloadSize = -1,
+ const QMimeType& mimeType = {},
+ const QString& originalFilename = {});
+ FileInfo(const QUrl& u, const QJsonObject& infoJson,
+ const QString& originalFilename = {});
- // 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.
+ bool isValid() const;
- // A quick classes inheritance structure follows:
- // FileInfo
- // FileContent : UrlBasedContent<FileInfo, Thumbnail>
- // AudioContent : UrlBasedContent<FileInfo, Duration>
- // ImageInfo : FileInfo + imageSize attribute
- // ImageContent : UrlBasedContent<ImageInfo, Thumbnail>
- // VideoContent : UrlBasedContent<ImageInfo, Thumbnail, Duration>
+ void fillInfoJson(QJsonObject* infoJson) const;
/**
- * A base/mixin class for structures representing an "info" object for
- * some content types. These include most attachment types currently in
- * the CS API spec.
- *
- * In order to use it in a content class, derive both from TypedBase
- * (or Base) and from FileInfo (or its derivative, such as \p ImageInfo)
- * and call fillInfoJson() to fill the "info" subobject. Make sure
- * to pass an "info" part of JSON to FileInfo constructor, not the whole
- * JSON content, as well as contents of "url" (or a similar key) and
- * optionally "filename" node from the main JSON content. Assuming you
- * don't do unusual things, you should use \p UrlBasedContent<> instead
- * of doing multiple inheritance and overriding Base::fillJson() by hand.
+ * \brief Extract media id from the URL
*
- * This class is not polymorphic.
+ * This can be used, e.g., to construct a QML-facing image://
+ * URI as follows:
+ * \code "image://provider/" + info.mediaId() \endcode
*/
- class FileInfo
- {
- public:
- explicit FileInfo(const QUrl& u, qint64 payloadSize = -1,
- const QMimeType& mimeType = {},
- const QString& originalFilename = {});
- FileInfo(const QUrl& u, const QJsonObject& infoJson,
- const QString& originalFilename = {});
-
- bool isValid() const;
-
- void fillInfoJson(QJsonObject* infoJson) const;
-
- /**
- * \brief Extract media id from the URL
- *
- * This can be used, e.g., to construct a QML-facing image://
- * URI as follows:
- * \code "image://provider/" + info.mediaId() \endcode
- */
- QString mediaId() const { return url.authority() + url.path(); }
-
- public:
- QJsonObject originalInfoJson;
- QMimeType mimeType;
- QUrl url;
- qint64 payloadSize;
- QString originalName;
- };
-
- template <typename InfoT>
- QJsonObject toInfoJson(const InfoT& info)
- {
- QJsonObject infoJson;
- info.fillInfoJson(&infoJson);
- return infoJson;
- }
+ QString mediaId() const { return url.authority() + url.path(); }
+
+ public:
+ QJsonObject originalInfoJson;
+ QMimeType mimeType;
+ QUrl url;
+ qint64 payloadSize;
+ QString originalName;
+ };
+
+ template <typename InfoT>
+ QJsonObject toInfoJson(const InfoT& info)
+ {
+ QJsonObject infoJson;
+ info.fillInfoJson(&infoJson);
+ return infoJson;
+ }
+
+ /**
+ * A content info class for image content types: image, thumbnail, video
+ */
+ class ImageInfo : public FileInfo {
+ public:
+ explicit ImageInfo(const QUrl& u, qint64 fileSize = -1,
+ QMimeType mimeType = {}, const QSize& imageSize = {},
+ const QString& originalFilename = {});
+ ImageInfo(const QUrl& u, const QJsonObject& infoJson,
+ const QString& originalFilename = {});
+
+ void fillInfoJson(QJsonObject* infoJson) const;
+
+ public:
+ QSize imageSize;
+ };
+
+ /**
+ * An auxiliary class for an info type that carries a thumbnail
+ *
+ * This class saves/loads a thumbnail to/from "info" subobject of
+ * the JSON representation of event content; namely,
+ * "info/thumbnail_url" and "info/thumbnail_info" fields are used.
+ */
+ class Thumbnail : public ImageInfo {
+ public:
+ Thumbnail() : ImageInfo(QUrl()) {} // To allow empty thumbnails
+ Thumbnail(const QJsonObject& infoJson);
+ Thumbnail(const ImageInfo& info) : ImageInfo(info) {}
+ using ImageInfo::ImageInfo;
/**
- * A content info class for image content types: image, thumbnail, video
+ * Writes thumbnail information to "thumbnail_info" subobject
+ * and thumbnail URL to "thumbnail_url" node inside "info".
*/
- class ImageInfo : public FileInfo
+ void fillInfoJson(QJsonObject* infoJson) const;
+ };
+
+ class TypedBase : public Base {
+ public:
+ explicit TypedBase(QJsonObject o = {}) : Base(std::move(o)) {}
+ virtual QMimeType type() const = 0;
+ virtual const FileInfo* fileInfo() const { return nullptr; }
+ virtual FileInfo* fileInfo() { return nullptr; }
+ virtual const Thumbnail* thumbnailInfo() const { return nullptr; }
+
+ protected:
+ using Base::Base;
+ };
+
+ /**
+ * A base class for content types that have a URL and additional info
+ *
+ * Types that derive from this class template take "url" and,
+ * optionally, "filename" values from the top-level JSON object and
+ * the rest of information from the "info" subobject, as defined by
+ * the parameter type.
+ *
+ * \tparam InfoT base info class
+ */
+ template <class InfoT>
+ class UrlBasedContent : public TypedBase, public InfoT {
+ public:
+ using InfoT::InfoT;
+ explicit UrlBasedContent(const QJsonObject& json)
+ : TypedBase(json)
+ , InfoT(json["url"].toString(), json["info"].toObject(),
+ json["filename"].toString())
{
- public:
- explicit ImageInfo(const QUrl& u, qint64 fileSize = -1,
- QMimeType mimeType = {},
- const QSize& imageSize = {},
- const QString& originalFilename = {});
- ImageInfo(const QUrl& u, const QJsonObject& infoJson,
- const QString& originalFilename = {});
-
- void fillInfoJson(QJsonObject* infoJson) const;
+ // A small hack to facilitate links creation in QML.
+ originalJson.insert("mediaId", InfoT::mediaId());
+ }
- public:
- QSize imageSize;
- };
+ QMimeType type() const override { return InfoT::mimeType; }
+ const FileInfo* fileInfo() const override { return this; }
+ FileInfo* fileInfo() override { return this; }
- /**
- * An auxiliary class for an info type that carries a thumbnail
- *
- * This class saves/loads a thumbnail to/from "info" subobject of
- * the JSON representation of event content; namely,
- * "info/thumbnail_url" and "info/thumbnail_info" fields are used.
- */
- class Thumbnail : public ImageInfo
+ protected:
+ void fillJson(QJsonObject* json) const override
{
- public:
- Thumbnail() : ImageInfo(QUrl()) { } // To allow empty thumbnails
- Thumbnail(const QJsonObject& infoJson);
- Thumbnail(const ImageInfo& info) : ImageInfo(info) { }
- using ImageInfo::ImageInfo;
-
- /**
- * Writes thumbnail information to "thumbnail_info" subobject
- * and thumbnail URL to "thumbnail_url" node inside "info".
- */
- void fillInfoJson(QJsonObject* infoJson) const;
- };
-
- class TypedBase: public Base
+ Q_ASSERT(json);
+ json->insert("url", InfoT::url.toString());
+ if (!InfoT::originalName.isEmpty())
+ json->insert("filename", InfoT::originalName);
+ json->insert("info", toInfoJson<InfoT>(*this));
+ }
+ };
+
+ template <typename InfoT>
+ class UrlWithThumbnailContent : public UrlBasedContent<InfoT> {
+ public:
+ using UrlBasedContent<InfoT>::UrlBasedContent;
+ explicit UrlWithThumbnailContent(const QJsonObject& json)
+ : UrlBasedContent<InfoT>(json), thumbnail(InfoT::originalInfoJson)
{
- public:
- explicit TypedBase(QJsonObject o = {}) : Base(std::move(o)) { }
- virtual QMimeType type() const = 0;
- virtual const FileInfo* fileInfo() const { return nullptr; }
- virtual FileInfo* fileInfo() { return nullptr; }
- virtual const Thumbnail* thumbnailInfo() const { return nullptr; }
-
- protected:
- using Base::Base;
- };
+ // Another small hack, to simplify making a thumbnail link
+ UrlBasedContent<InfoT>::originalJson.insert("thumbnailMediaId",
+ thumbnail.mediaId());
+ }
- /**
- * A base class for content types that have a URL and additional info
- *
- * Types that derive from this class template take "url" and,
- * optionally, "filename" values from the top-level JSON object and
- * the rest of information from the "info" subobject, as defined by
- * the parameter type.
- *
- * \tparam InfoT base info class
- */
- template <class InfoT>
- class UrlBasedContent : public TypedBase, public InfoT
- {
- public:
- using InfoT::InfoT;
- explicit UrlBasedContent(const QJsonObject& json)
- : TypedBase(json)
- , InfoT(json["url"].toString(), json["info"].toObject(),
- json["filename"].toString())
- {
- // A small hack to facilitate links creation in QML.
- originalJson.insert("mediaId", InfoT::mediaId());
- }
-
- QMimeType type() const override { return InfoT::mimeType; }
- const FileInfo* fileInfo() const override { return this; }
- FileInfo* fileInfo() override { return this; }
-
- protected:
- void fillJson(QJsonObject* json) const override
- {
- Q_ASSERT(json);
- json->insert("url", InfoT::url.toString());
- if (!InfoT::originalName.isEmpty())
- json->insert("filename", InfoT::originalName);
- json->insert("info", toInfoJson<InfoT>(*this));
- }
- };
-
- template <typename InfoT>
- class UrlWithThumbnailContent : public UrlBasedContent<InfoT>
- {
- public:
- using UrlBasedContent<InfoT>::UrlBasedContent;
- explicit UrlWithThumbnailContent(const QJsonObject& json)
- : UrlBasedContent<InfoT>(json)
- , thumbnail(InfoT::originalInfoJson)
- {
- // Another small hack, to simplify making a thumbnail link
- UrlBasedContent<InfoT>::originalJson.insert(
- "thumbnailMediaId", thumbnail.mediaId());
- }
-
- const Thumbnail* thumbnailInfo() const override
- { return &thumbnail; }
-
- public:
- Thumbnail thumbnail;
-
- protected:
- void fillJson(QJsonObject* json) const override
- {
- UrlBasedContent<InfoT>::fillJson(json);
- auto infoJson = json->take("info").toObject();
- thumbnail.fillInfoJson(&infoJson);
- json->insert("info", infoJson);
- }
- };
+ const Thumbnail* thumbnailInfo() const override { return &thumbnail; }
- /**
- * 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 = UrlWithThumbnailContent<ImageInfo>;
+ public:
+ Thumbnail thumbnail;
- /**
- * 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 = UrlWithThumbnailContent<FileInfo>;
- } // namespace EventContent
-} // namespace QMatrixClient
+ protected:
+ void fillJson(QJsonObject* json) const override
+ {
+ UrlBasedContent<InfoT>::fillJson(json);
+ auto infoJson = json->take("info").toObject();
+ thumbnail.fillInfoJson(&infoJson);
+ json->insert("info", infoJson);
+ }
+ };
+
+ /**
+ * 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 = UrlWithThumbnailContent<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 = UrlWithThumbnailContent<FileInfo>;
+} // namespace EventContent
+} // namespace QMatrixClient
diff --git a/lib/events/eventloader.h b/lib/events/eventloader.h
index d0fa60a2..9e8bb410 100644
--- a/lib/events/eventloader.h
+++ b/lib/events/eventloader.h
@@ -1,87 +1,86 @@
/******************************************************************************
-* Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#pragma once
#include "stateevent.h"
namespace QMatrixClient {
- namespace _impl {
- template <typename BaseEventT>
- static inline auto loadEvent(const QJsonObject& json,
- const QString& matrixType)
- {
- if (auto e = EventFactory<BaseEventT>::make(json, matrixType))
- return e;
- return makeEvent<BaseEventT>(unknownEventTypeId(), json);
- }
- }
-
- /*! Create an event with proper type from a JSON object
- *
- * Use this factory template to detect the type from the JSON object
- * contents (the detected event type should derive from the template
- * parameter type) and create an event object of that type.
- */
+namespace _impl {
template <typename BaseEventT>
- inline event_ptr_tt<BaseEventT> loadEvent(const QJsonObject& fullJson)
+ static inline auto loadEvent(const QJsonObject& json,
+ const QString& matrixType)
{
- return _impl::loadEvent<BaseEventT>(fullJson,
- fullJson[TypeKeyL].toString());
+ if (auto e = EventFactory<BaseEventT>::make(json, matrixType))
+ return e;
+ return makeEvent<BaseEventT>(unknownEventTypeId(), json);
}
+} // namespace _impl
- /*! Create an event from a type string and content JSON
- *
- * Use this factory template to resolve the C++ type from the Matrix
- * type string in \p matrixType and create an event of that type that has
- * its content part set to \p content.
- */
- template <typename BaseEventT>
- inline event_ptr_tt<BaseEventT> loadEvent(const QString& matrixType,
- const QJsonObject& content)
- {
- return _impl::loadEvent<BaseEventT>(basicEventJson(matrixType, content),
- matrixType);
- }
+/*! Create an event with proper type from a JSON object
+ *
+ * Use this factory template to detect the type from the JSON object
+ * contents (the detected event type should derive from the template
+ * parameter type) and create an event object of that type.
+ */
+template <typename BaseEventT>
+inline event_ptr_tt<BaseEventT> loadEvent(const QJsonObject& fullJson)
+{
+ return _impl::loadEvent<BaseEventT>(fullJson, fullJson[TypeKeyL].toString());
+}
- /*! Create a state event from a type string, content JSON and state key
- *
- * Use this factory to resolve the C++ type from the Matrix type string
- * in \p matrixType and create a state event of that type with content part
- * set to \p content and state key set to \p stateKey (empty by default).
- */
- inline StateEventPtr loadStateEvent(const QString& matrixType,
- const QJsonObject& content,
- const QString& stateKey = {})
+/*! Create an event from a type string and content JSON
+ *
+ * Use this factory template to resolve the C++ type from the Matrix
+ * type string in \p matrixType and create an event of that type that has
+ * its content part set to \p content.
+ */
+template <typename BaseEventT>
+inline event_ptr_tt<BaseEventT> loadEvent(const QString& matrixType,
+ const QJsonObject& content)
+{
+ return _impl::loadEvent<BaseEventT>(basicEventJson(matrixType, content),
+ matrixType);
+}
+
+/*! Create a state event from a type string, content JSON and state key
+ *
+ * Use this factory to resolve the C++ type from the Matrix type string
+ * in \p matrixType and create a state event of that type with content part
+ * set to \p content and state key set to \p stateKey (empty by default).
+ */
+inline StateEventPtr loadStateEvent(const QString& matrixType,
+ const QJsonObject& content,
+ const QString& stateKey = {})
+{
+ return _impl::loadEvent<StateEventBase>(
+ basicStateEventJson(matrixType, content, stateKey), matrixType);
+}
+
+template <typename EventT>
+struct JsonConverter<event_ptr_tt<EventT>> {
+ static auto load(const QJsonValue& jv)
{
- return _impl::loadEvent<StateEventBase>(
- basicStateEventJson(matrixType, content, stateKey), matrixType);
+ return loadEvent<EventT>(jv.toObject());
}
-
- template <typename EventT> struct JsonConverter<event_ptr_tt<EventT>>
+ static auto load(const QJsonDocument& jd)
{
- static auto load(const QJsonValue& jv)
- {
- return loadEvent<EventT>(jv.toObject());
- }
- static auto load(const QJsonDocument& jd)
- {
- return loadEvent<EventT>(jd.object());
- }
- };
+ return loadEvent<EventT>(jd.object());
+ }
+};
} // namespace QMatrixClient
diff --git a/lib/events/reactionevent.cpp b/lib/events/reactionevent.cpp
index 0081edc2..0a080607 100644
--- a/lib/events/reactionevent.cpp
+++ b/lib/events/reactionevent.cpp
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "reactionevent.h"
@@ -21,7 +21,7 @@
using namespace QMatrixClient;
void QMatrixClient::JsonObjectConverter<EventRelation>::dumpTo(
- QJsonObject& jo, const EventRelation& pod)
+ QJsonObject& jo, const EventRelation& pod)
{
if (pod.type.isEmpty()) {
qCWarning(MAIN) << "Empty relation type; won't dump to JSON";
@@ -34,7 +34,7 @@ void QMatrixClient::JsonObjectConverter<EventRelation>::dumpTo(
}
void QMatrixClient::JsonObjectConverter<EventRelation>::fillFrom(
- const QJsonObject& jo, EventRelation& pod)
+ const QJsonObject& jo, EventRelation& pod)
{
// The experimental logic for generic relationships (MSC1849)
fromJson(jo["rel_type"_ls], pod.type);
diff --git a/lib/events/reactionevent.h b/lib/events/reactionevent.h
index 9a6adbbd..b1e04561 100644
--- a/lib/events/reactionevent.h
+++ b/lib/events/reactionevent.h
@@ -22,8 +22,7 @@
namespace QMatrixClient {
-struct EventRelation
-{
+struct EventRelation {
using reltypeid_t = const char*;
static constexpr reltypeid_t Reply() { return "m.in_reply_to"; }
static constexpr reltypeid_t Annotation() { return "m.annotation"; }
@@ -47,14 +46,12 @@ struct EventRelation
}
};
template <>
-struct JsonObjectConverter<EventRelation>
-{
+struct JsonObjectConverter<EventRelation> {
static void dumpTo(QJsonObject& jo, const EventRelation& pod);
static void fillFrom(const QJsonObject& jo, EventRelation& pod);
};
-class ReactionEvent : public RoomEvent
-{
+class ReactionEvent : public RoomEvent {
public:
DEFINE_EVENT_TYPEID("m.reaction", ReactionEvent)
@@ -62,9 +59,7 @@ public:
: RoomEvent(typeId(), matrixTypeId(),
{ { QStringLiteral("m.relates_to"), toJson(value) } })
{}
- explicit ReactionEvent(const QJsonObject& obj)
- : RoomEvent(typeId(), obj)
- {}
+ explicit ReactionEvent(const QJsonObject& obj) : RoomEvent(typeId(), obj) {}
EventRelation relation() const
{
return content<EventRelation>(QStringLiteral("m.relates_to"));
diff --git a/lib/events/receiptevent.cpp b/lib/events/receiptevent.cpp
index 47e1398c..4a54b744 100644
--- a/lib/events/receiptevent.cpp
+++ b/lib/events/receiptevent.cpp
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
@@ -40,30 +40,26 @@ Example of a Receipt Event:
using namespace QMatrixClient;
-ReceiptEvent::ReceiptEvent(const QJsonObject& obj)
- : Event(typeId(), obj)
+ReceiptEvent::ReceiptEvent(const QJsonObject& obj) : Event(typeId(), obj)
{
const auto& contents = contentJson();
_eventsWithReceipts.reserve(contents.size());
- for( auto eventIt = contents.begin(); eventIt != contents.end(); ++eventIt )
- {
- if (eventIt.key().isEmpty())
- {
- qCWarning(EPHEMERAL) << "ReceiptEvent has an empty event id, skipping";
+ for (auto eventIt = contents.begin(); eventIt != contents.end(); ++eventIt) {
+ if (eventIt.key().isEmpty()) {
+ qCWarning(EPHEMERAL)
+ << "ReceiptEvent has an empty event id, skipping";
qCDebug(EPHEMERAL) << "ReceiptEvent content follows:\n" << contents;
continue;
}
- const QJsonObject reads = eventIt.value().toObject()
- .value("m.read"_ls).toObject();
+ const QJsonObject reads =
+ eventIt.value().toObject().value("m.read"_ls).toObject();
QVector<Receipt> receipts;
receipts.reserve(reads.size());
- for( auto userIt = reads.begin(); userIt != reads.end(); ++userIt )
- {
+ for (auto userIt = reads.begin(); userIt != reads.end(); ++userIt) {
const QJsonObject user = userIt.value().toObject();
- receipts.push_back({userIt.key(),
- fromJson<QDateTime>(user["ts"_ls])});
+ receipts.push_back(
+ { userIt.key(), fromJson<QDateTime>(user["ts"_ls]) });
}
- _eventsWithReceipts.push_back({eventIt.key(), std::move(receipts)});
+ _eventsWithReceipts.push_back({ eventIt.key(), std::move(receipts) });
}
}
-
diff --git a/lib/events/receiptevent.h b/lib/events/receiptevent.h
index c15a01c2..c32e0543 100644
--- a/lib/events/receiptevent.h
+++ b/lib/events/receiptevent.h
@@ -13,42 +13,40 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "event.h"
-#include <QtCore/QVector>
#include <QtCore/QDateTime>
+#include <QtCore/QVector>
-namespace QMatrixClient
-{
- struct Receipt
- {
- QString userId;
- QDateTime timestamp;
- };
- struct ReceiptsForEvent
- {
- QString evtId;
- QVector<Receipt> receipts;
- };
- using EventsWithReceipts = QVector<ReceiptsForEvent>;
+namespace QMatrixClient {
+struct Receipt {
+ QString userId;
+ QDateTime timestamp;
+};
+struct ReceiptsForEvent {
+ QString evtId;
+ QVector<Receipt> receipts;
+};
+using EventsWithReceipts = QVector<ReceiptsForEvent>;
- class ReceiptEvent: public Event
- {
- public:
- DEFINE_EVENT_TYPEID("m.receipt", ReceiptEvent)
- explicit ReceiptEvent(const QJsonObject& obj);
+class ReceiptEvent : public Event {
+public:
+ DEFINE_EVENT_TYPEID("m.receipt", ReceiptEvent)
+ explicit ReceiptEvent(const QJsonObject& obj);
- const EventsWithReceipts& eventsWithReceipts() const
- { return _eventsWithReceipts; }
+ const EventsWithReceipts& eventsWithReceipts() const
+ {
+ return _eventsWithReceipts;
+ }
- private:
- EventsWithReceipts _eventsWithReceipts;
- };
- REGISTER_EVENT_TYPE(ReceiptEvent)
- DEFINE_EVENTTYPE_ALIAS(Receipt, ReceiptEvent)
-} // namespace QMatrixClient
+private:
+ EventsWithReceipts _eventsWithReceipts;
+};
+REGISTER_EVENT_TYPE(ReceiptEvent)
+DEFINE_EVENTTYPE_ALIAS(Receipt, ReceiptEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/redactionevent.h b/lib/events/redactionevent.h
index a72a8ff9..3628fb33 100644
--- a/lib/events/redactionevent.h
+++ b/lib/events/redactionevent.h
@@ -13,29 +13,27 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "roomevent.h"
-namespace QMatrixClient
-{
- class RedactionEvent : public RoomEvent
- {
- public:
- DEFINE_EVENT_TYPEID("m.room.redaction", RedactionEvent)
+namespace QMatrixClient {
+class RedactionEvent : public RoomEvent {
+public:
+ DEFINE_EVENT_TYPEID("m.room.redaction", RedactionEvent)
- explicit RedactionEvent(const QJsonObject& obj)
- : RoomEvent(typeId(), obj)
- { }
+ explicit RedactionEvent(const QJsonObject& obj) : RoomEvent(typeId(), obj)
+ {}
- QString redactedEvent() const
- { return fullJson()["redacts"_ls].toString(); }
- QString reason() const
- { return contentJson()["reason"_ls].toString(); }
- };
- REGISTER_EVENT_TYPE(RedactionEvent)
- DEFINE_EVENTTYPE_ALIAS(Redaction, RedactionEvent)
+ QString redactedEvent() const
+ {
+ return fullJson()["redacts"_ls].toString();
+ }
+ QString reason() const { return contentJson()["reason"_ls].toString(); }
+};
+REGISTER_EVENT_TYPE(RedactionEvent)
+DEFINE_EVENTTYPE_ALIAS(Redaction, RedactionEvent)
} // namespace QMatrixClient
diff --git a/lib/events/roomavatarevent.h b/lib/events/roomavatarevent.h
index a43d3a85..16aeb070 100644
--- a/lib/events/roomavatarevent.h
+++ b/lib/events/roomavatarevent.h
@@ -13,29 +13,26 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
-#include "stateevent.h"
#include "eventcontent.h"
+#include "stateevent.h"
-namespace QMatrixClient
-{
- class RoomAvatarEvent: public StateEvent<EventContent::ImageContent>
- {
- // It's a bit of an overkill to use a full-fledged ImageContent
- // because in reality m.room.avatar usually only has a single URL,
- // without a thumbnail. But The Spec says there be thumbnails, and
- // we follow The Spec.
- public:
- DEFINE_EVENT_TYPEID("m.room.avatar", RoomAvatarEvent)
- explicit RoomAvatarEvent(const QJsonObject& obj)
- : StateEvent(typeId(), obj)
- { }
- QUrl url() const { return content().url; }
- };
- REGISTER_EVENT_TYPE(RoomAvatarEvent)
- DEFINE_EVENTTYPE_ALIAS(RoomAvatar, RoomAvatarEvent)
-} // namespace QMatrixClient
+namespace QMatrixClient {
+class RoomAvatarEvent : public StateEvent<EventContent::ImageContent> {
+ // It's a bit of an overkill to use a full-fledged ImageContent
+ // because in reality m.room.avatar usually only has a single URL,
+ // without a thumbnail. But The Spec says there be thumbnails, and
+ // we follow The Spec.
+public:
+ DEFINE_EVENT_TYPEID("m.room.avatar", RoomAvatarEvent)
+ explicit RoomAvatarEvent(const QJsonObject& obj) : StateEvent(typeId(), obj)
+ {}
+ QUrl url() const { return content().url; }
+};
+REGISTER_EVENT_TYPE(RoomAvatarEvent)
+DEFINE_EVENTTYPE_ALIAS(RoomAvatar, RoomAvatarEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/roomcreateevent.cpp b/lib/events/roomcreateevent.cpp
index 8fd0f1de..cb575f24 100644
--- a/lib/events/roomcreateevent.cpp
+++ b/lib/events/roomcreateevent.cpp
@@ -1,20 +1,20 @@
/******************************************************************************
-* Copyright (C) 2019 QMatrixClient project
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2019 QMatrixClient project
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#include "roomcreateevent.h"
@@ -33,10 +33,8 @@ QString RoomCreateEvent::version() const
RoomCreateEvent::Predecessor RoomCreateEvent::predecessor() const
{
const auto predJson = contentJson()["predecessor"_ls].toObject();
- return {
- fromJson<QString>(predJson["room_id"_ls]),
- fromJson<QString>(predJson["event_id"_ls])
- };
+ return { fromJson<QString>(predJson["room_id"_ls]),
+ fromJson<QString>(predJson["event_id"_ls]) };
}
bool RoomCreateEvent::isUpgrade() const
diff --git a/lib/events/roomcreateevent.h b/lib/events/roomcreateevent.h
index 0a8f27cc..c8ba8c40 100644
--- a/lib/events/roomcreateevent.h
+++ b/lib/events/roomcreateevent.h
@@ -1,49 +1,44 @@
/******************************************************************************
-* Copyright (C) 2019 QMatrixClient project
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2019 QMatrixClient project
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#pragma once
#include "stateevent.h"
-namespace QMatrixClient
-{
- class RoomCreateEvent : public StateEventBase
- {
- public:
- DEFINE_EVENT_TYPEID("m.room.create", RoomCreateEvent)
+namespace QMatrixClient {
+class RoomCreateEvent : public StateEventBase {
+public:
+ DEFINE_EVENT_TYPEID("m.room.create", RoomCreateEvent)
- explicit RoomCreateEvent()
- : StateEventBase(typeId(), matrixTypeId())
- { }
- explicit RoomCreateEvent(const QJsonObject& obj)
- : StateEventBase(typeId(), obj)
- { }
+ explicit RoomCreateEvent() : StateEventBase(typeId(), matrixTypeId()) {}
+ explicit RoomCreateEvent(const QJsonObject& obj)
+ : StateEventBase(typeId(), obj)
+ {}
- struct Predecessor
- {
- QString roomId;
- QString eventId;
- };
-
- bool isFederated() const;
- QString version() const;
- Predecessor predecessor() const;
- bool isUpgrade() const;
+ struct Predecessor {
+ QString roomId;
+ QString eventId;
};
- REGISTER_EVENT_TYPE(RoomCreateEvent)
-}
+
+ bool isFederated() const;
+ QString version() const;
+ Predecessor predecessor() const;
+ bool isUpgrade() const;
+};
+REGISTER_EVENT_TYPE(RoomCreateEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/roomevent.cpp b/lib/events/roomevent.cpp
index 0143826a..543640ca 100644
--- a/lib/events/roomevent.cpp
+++ b/lib/events/roomevent.cpp
@@ -1,44 +1,42 @@
/******************************************************************************
-* Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#include "roomevent.h"
-#include "redactionevent.h"
#include "converters.h"
#include "logging.h"
+#include "redactionevent.h"
using namespace QMatrixClient;
[[gnu::unused]] static auto roomEventTypeInitialised =
- Event::factory_t::chainFactory<RoomEvent>();
+ Event::factory_t::chainFactory<RoomEvent>();
RoomEvent::RoomEvent(Type type, event_mtype_t matrixType,
const QJsonObject& contentJson)
: Event(type, matrixType, contentJson)
-{ }
+{}
-RoomEvent::RoomEvent(Type type, const QJsonObject& json)
- : Event(type, json)
+RoomEvent::RoomEvent(Type type, const QJsonObject& json) : Event(type, json)
{
const auto unsignedData = json[UnsignedKeyL].toObject();
const auto redaction = unsignedData[RedactedCauseKeyL];
- if (redaction.isObject())
- {
+ if (redaction.isObject()) {
_redactedBecause = makeEvent<RedactionEvent>(redaction.toObject());
return;
}
@@ -46,10 +44,7 @@ RoomEvent::RoomEvent(Type type, const QJsonObject& json)
RoomEvent::~RoomEvent() = default; // Let the smart pointer do its job
-QString RoomEvent::id() const
-{
- return fullJson()[EventIdKeyL].toString();
-}
+QString RoomEvent::id() const { return fullJson()[EventIdKeyL].toString(); }
QDateTime RoomEvent::timestamp() const
{
@@ -82,7 +77,7 @@ QString RoomEvent::replacedBy() const
QString RoomEvent::redactionReason() const
{
- return isRedacted() ? _redactedBecause->reason() : QString{};
+ return isRedacted() ? _redactedBecause->reason() : QString {};
}
QString RoomEvent::transactionId() const
@@ -115,7 +110,8 @@ void RoomEvent::setTransactionId(const QString& txnId)
void RoomEvent::addId(const QString& newId)
{
- Q_ASSERT(id().isEmpty()); Q_ASSERT(!newId.isEmpty());
+ Q_ASSERT(id().isEmpty());
+ Q_ASSERT(!newId.isEmpty());
editJson().insert(EventIdKey, newId);
qCDebug(EVENTS) << "Event txnId -> id:" << transactionId() << "->" << id();
Q_ASSERT(id() == newId);
@@ -134,7 +130,7 @@ CallEventBase::CallEventBase(Type type, event_mtype_t matrixType,
const QJsonObject& contentJson)
: RoomEvent(type, matrixType,
makeCallContentJson(callId, version, contentJson))
-{ }
+{}
CallEventBase::CallEventBase(Event::Type type, const QJsonObject& json)
: RoomEvent(type, json)
diff --git a/lib/events/roomevent.h b/lib/events/roomevent.h
index 0e6f730d..155d4600 100644
--- a/lib/events/roomevent.h
+++ b/lib/events/roomevent.h
@@ -1,20 +1,20 @@
/******************************************************************************
-* Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#pragma once
@@ -22,90 +22,86 @@
#include <QtCore/QDateTime>
-namespace QMatrixClient
-{
- class RedactionEvent;
+namespace QMatrixClient {
+class RedactionEvent;
- /** This class corresponds to m.room.* events */
- class RoomEvent : public Event
- {
- Q_GADGET
- Q_PROPERTY(QString id READ id)
- Q_PROPERTY(QDateTime timestamp READ timestamp CONSTANT)
- Q_PROPERTY(QString roomId READ roomId CONSTANT)
- Q_PROPERTY(QString senderId READ senderId CONSTANT)
- Q_PROPERTY(QString redactionReason READ redactionReason)
- Q_PROPERTY(bool isRedacted READ isRedacted)
- Q_PROPERTY(QString transactionId READ transactionId WRITE setTransactionId)
- public:
- using factory_t = EventFactory<RoomEvent>;
+/** This class corresponds to m.room.* events */
+class RoomEvent : public Event {
+ Q_GADGET
+ Q_PROPERTY(QString id READ id)
+ Q_PROPERTY(QDateTime timestamp READ timestamp CONSTANT)
+ Q_PROPERTY(QString roomId READ roomId CONSTANT)
+ Q_PROPERTY(QString senderId READ senderId CONSTANT)
+ Q_PROPERTY(QString redactionReason READ redactionReason)
+ Q_PROPERTY(bool isRedacted READ isRedacted)
+ Q_PROPERTY(QString transactionId READ transactionId WRITE setTransactionId)
+public:
+ using factory_t = EventFactory<RoomEvent>;
- // RedactionEvent is an incomplete type here so we cannot inline
- // constructors and destructors and we cannot use 'using'.
- RoomEvent(Type type, event_mtype_t matrixType,
- const QJsonObject& contentJson = {});
- RoomEvent(Type type, const QJsonObject& json);
- ~RoomEvent() override;
+ // RedactionEvent is an incomplete type here so we cannot inline
+ // constructors and destructors and we cannot use 'using'.
+ RoomEvent(Type type, event_mtype_t matrixType,
+ const QJsonObject& contentJson = {});
+ RoomEvent(Type type, const QJsonObject& json);
+ ~RoomEvent() override;
- QString id() const;
- QDateTime timestamp() const;
- QString roomId() const;
- QString senderId() const;
- bool isReplaced() const;
- QString replacedBy() const;
- bool isRedacted() const { return bool(_redactedBecause); }
- const event_ptr_tt<RedactionEvent>& redactedBecause() const
- {
- return _redactedBecause;
- }
- QString redactionReason() const;
- QString transactionId() const;
- QString stateKey() const;
+ QString id() const;
+ QDateTime timestamp() const;
+ QString roomId() const;
+ QString senderId() const;
+ bool isReplaced() const;
+ QString replacedBy() const;
+ bool isRedacted() const { return bool(_redactedBecause); }
+ const event_ptr_tt<RedactionEvent>& redactedBecause() const
+ {
+ return _redactedBecause;
+ }
+ QString redactionReason() const;
+ QString transactionId() const;
+ QString stateKey() const;
- void setRoomId(const QString& roomId);
- void setSender(const QString& senderId);
+ void setRoomId(const QString& roomId);
+ void setSender(const QString& senderId);
- /**
- * Sets the transaction id for locally created events. This should be
- * done before the event is exposed to any code using the respective
- * Q_PROPERTY.
- *
- * \param txnId - transaction id, normally obtained from
- * Connection::generateTxnId()
- */
- void setTransactionId(const QString& txnId);
+ /**
+ * Sets the transaction id for locally created events. This should be
+ * done before the event is exposed to any code using the respective
+ * Q_PROPERTY.
+ *
+ * \param txnId - transaction id, normally obtained from
+ * Connection::generateTxnId()
+ */
+ void setTransactionId(const QString& txnId);
- /**
- * Sets event id for locally created events
- *
- * When a new event is created locally, it has no server id yet.
- * This function allows to add the id once the confirmation from
- * the server is received. There should be no id set previously
- * in the event. It's the responsibility of the code calling addId()
- * to notify clients that use Q_PROPERTY(id) about its change
- */
- void addId(const QString& newId);
+ /**
+ * Sets event id for locally created events
+ *
+ * When a new event is created locally, it has no server id yet.
+ * This function allows to add the id once the confirmation from
+ * the server is received. There should be no id set previously
+ * in the event. It's the responsibility of the code calling addId()
+ * to notify clients that use Q_PROPERTY(id) about its change
+ */
+ void addId(const QString& newId);
- private:
- event_ptr_tt<RedactionEvent> _redactedBecause;
- };
- using RoomEventPtr = event_ptr_tt<RoomEvent>;
- using RoomEvents = EventsArray<RoomEvent>;
- using RoomEventsRange = Range<RoomEvents>;
+private:
+ event_ptr_tt<RedactionEvent> _redactedBecause;
+};
+using RoomEventPtr = event_ptr_tt<RoomEvent>;
+using RoomEvents = EventsArray<RoomEvent>;
+using RoomEventsRange = Range<RoomEvents>;
- class CallEventBase: public RoomEvent
- {
- public:
- CallEventBase(Type type, event_mtype_t matrixType,
- const QString& callId, int version,
- const QJsonObject& contentJson = {});
- CallEventBase(Type type, const QJsonObject& json);
- ~CallEventBase() override = default;
- bool isCallEvent() const override { return true; }
+class CallEventBase : public RoomEvent {
+public:
+ CallEventBase(Type type, event_mtype_t matrixType, const QString& callId,
+ int version, const QJsonObject& contentJson = {});
+ CallEventBase(Type type, const QJsonObject& json);
+ ~CallEventBase() override = default;
+ bool isCallEvent() const override { return true; }
- QString callId() const { return content<QString>("call_id"_ls); }
- int version() const { return content<int>("version"_ls); }
- };
+ QString callId() const { return content<QString>("call_id"_ls); }
+ int version() const { return content<int>("version"_ls); }
+};
} // namespace QMatrixClient
Q_DECLARE_METATYPE(QMatrixClient::RoomEvent*)
Q_DECLARE_METATYPE(const QMatrixClient::RoomEvent*)
diff --git a/lib/events/roommemberevent.cpp b/lib/events/roommemberevent.cpp
index 6da76526..3cbf6685 100644
--- a/lib/events/roommemberevent.cpp
+++ b/lib/events/roommemberevent.cpp
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "roommemberevent.h"
@@ -23,29 +23,27 @@
#include <array>
-static const std::array<QString, 5> membershipStrings = { {
- QStringLiteral("invite"), QStringLiteral("join"),
- QStringLiteral("knock"), QStringLiteral("leave"),
- QStringLiteral("ban")
-} };
+static const std::array<QString, 5> membershipStrings = {
+ { QStringLiteral("invite"), QStringLiteral("join"), QStringLiteral("knock"),
+ QStringLiteral("leave"), QStringLiteral("ban") }
+};
namespace QMatrixClient {
- template <>
- struct JsonConverter<MembershipType>
+template <>
+struct JsonConverter<MembershipType> {
+ static MembershipType load(const QJsonValue& jv)
{
- static MembershipType load(const QJsonValue& jv)
- {
- const auto& membershipString = jv.toString();
- for (auto it = membershipStrings.begin();
- it != membershipStrings.end(); ++it)
- if (membershipString == *it)
- return MembershipType(it - membershipStrings.begin());
+ const auto& membershipString = jv.toString();
+ for (auto it = membershipStrings.begin(); it != membershipStrings.end();
+ ++it)
+ if (membershipString == *it)
+ return MembershipType(it - membershipStrings.begin());
- qCWarning(EVENTS) << "Unknown MembershipType: " << membershipString;
- return MembershipType::Undefined;
- }
- };
-}
+ qCWarning(EVENTS) << "Unknown MembershipType: " << membershipString;
+ return MembershipType::Undefined;
+ }
+};
+} // namespace QMatrixClient
using namespace QMatrixClient;
@@ -54,13 +52,13 @@ MemberEventContent::MemberEventContent(const QJsonObject& json)
, isDirect(json["is_direct"_ls].toBool())
, displayName(sanitized(json["displayname"_ls].toString()))
, avatarUrl(json["avatar_url"_ls].toString())
-{ }
+{}
void MemberEventContent::fillJson(QJsonObject* o) const
{
Q_ASSERT(o);
Q_ASSERT_X(membership != MembershipType::Undefined, __FUNCTION__,
- "The key 'membership' must be explicit in MemberEventContent");
+ "The key 'membership' must be explicit in MemberEventContent");
if (membership != MembershipType::Undefined)
o->insert(QStringLiteral("membership"), membershipStrings[membership]);
o->insert(QStringLiteral("displayname"), displayName);
@@ -70,21 +68,21 @@ void MemberEventContent::fillJson(QJsonObject* o) const
bool RoomMemberEvent::isInvite() const
{
- return membership() == MembershipType::Invite &&
- (!prevContent() || prevContent()->membership != membership());
+ return membership() == MembershipType::Invite
+ && (!prevContent() || prevContent()->membership != membership());
}
bool RoomMemberEvent::isJoin() const
{
- return membership() == MembershipType::Join &&
- (!prevContent() || prevContent()->membership != membership());
+ return membership() == MembershipType::Join
+ && (!prevContent() || prevContent()->membership != membership());
}
bool RoomMemberEvent::isLeave() const
{
- return membership() == MembershipType::Leave &&
- prevContent() && prevContent()->membership != membership() &&
- prevContent()->membership != MembershipType::Ban;
+ return membership() == MembershipType::Leave && prevContent()
+ && prevContent()->membership != membership()
+ && prevContent()->membership != MembershipType::Ban;
}
bool RoomMemberEvent::isRename() const
diff --git a/lib/events/roommemberevent.h b/lib/events/roommemberevent.h
index 39aa280c..59d59e3a 100644
--- a/lib/events/roommemberevent.h
+++ b/lib/events/roommemberevent.h
@@ -13,100 +13,98 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
-#include "stateevent.h"
#include "eventcontent.h"
+#include "stateevent.h"
-namespace QMatrixClient
-{
- class MemberEventContent: public EventContent::Base
- {
- public:
- enum MembershipType : size_t { Invite = 0, Join, Knock, Leave, Ban,
- Undefined };
+namespace QMatrixClient {
+class MemberEventContent : public EventContent::Base {
+public:
+ enum MembershipType : size_t {
+ Invite = 0,
+ Join,
+ Knock,
+ Leave,
+ Ban,
+ Undefined
+ };
- explicit MemberEventContent(MembershipType mt = Join)
- : membership(mt)
- { }
- explicit MemberEventContent(const QJsonObject& json);
+ explicit MemberEventContent(MembershipType mt = Join) : membership(mt) {}
+ explicit MemberEventContent(const QJsonObject& json);
- MembershipType membership;
- bool isDirect = false;
- QString displayName;
- QUrl avatarUrl;
+ MembershipType membership;
+ bool isDirect = false;
+ QString displayName;
+ QUrl avatarUrl;
- protected:
- void fillJson(QJsonObject* o) const override;
- };
+protected:
+ void fillJson(QJsonObject* o) const override;
+};
- using MembershipType = MemberEventContent::MembershipType;
+using MembershipType = MemberEventContent::MembershipType;
- class RoomMemberEvent: public StateEvent<MemberEventContent>
- {
- Q_GADGET
- public:
- DEFINE_EVENT_TYPEID("m.room.member", RoomMemberEvent)
+class RoomMemberEvent : public StateEvent<MemberEventContent> {
+ Q_GADGET
+public:
+ DEFINE_EVENT_TYPEID("m.room.member", RoomMemberEvent)
- using MembershipType = MemberEventContent::MembershipType;
+ using MembershipType = MemberEventContent::MembershipType;
- explicit RoomMemberEvent(const QJsonObject& obj)
- : StateEvent(typeId(), obj)
- { }
- [[deprecated("Use RoomMemberEvent(userId, contentArgs) instead")]]
- RoomMemberEvent(MemberEventContent&& c)
- : StateEvent(typeId(), matrixTypeId(), QString(), c)
- { }
- template <typename... ArgTs>
- RoomMemberEvent(const QString& userId, ArgTs&&... contentArgs)
- : StateEvent(typeId(), matrixTypeId(), userId,
- std::forward<ArgTs>(contentArgs)...)
- { }
+ explicit RoomMemberEvent(const QJsonObject& obj) : StateEvent(typeId(), obj)
+ {}
+ [[deprecated("Use RoomMemberEvent(userId, contentArgs) "
+ "instead")]] RoomMemberEvent(MemberEventContent&& c)
+ : StateEvent(typeId(), matrixTypeId(), QString(), c)
+ {}
+ template <typename... ArgTs>
+ RoomMemberEvent(const QString& userId, ArgTs&&... contentArgs)
+ : StateEvent(typeId(), matrixTypeId(), userId,
+ std::forward<ArgTs>(contentArgs)...)
+ {}
- /// A special constructor to create unknown RoomMemberEvents
- /**
- * This is needed in order to use RoomMemberEvent as a "base event
- * class" in cases like GetMembersByRoomJob when RoomMemberEvents
- * (rather than RoomEvents or StateEvents) are resolved from JSON.
- * For such cases loadEvent<> requires an underlying class to be
- * constructible with unknownTypeId() instead of its genuine id.
- * Don't use it directly.
- * \sa GetMembersByRoomJob, loadEvent, unknownTypeId
- */
- RoomMemberEvent(Type type, const QJsonObject& fullJson)
- : StateEvent(type, fullJson)
- { }
+ /// A special constructor to create unknown RoomMemberEvents
+ /**
+ * This is needed in order to use RoomMemberEvent as a "base event
+ * class" in cases like GetMembersByRoomJob when RoomMemberEvents
+ * (rather than RoomEvents or StateEvents) are resolved from JSON.
+ * For such cases loadEvent<> requires an underlying class to be
+ * constructible with unknownTypeId() instead of its genuine id.
+ * Don't use it directly.
+ * \sa GetMembersByRoomJob, loadEvent, unknownTypeId
+ */
+ RoomMemberEvent(Type type, const QJsonObject& fullJson)
+ : StateEvent(type, fullJson)
+ {}
- MembershipType membership() const { return content().membership; }
- QString userId() const
- { return fullJson()[StateKeyKeyL].toString(); }
- bool isDirect() const { return content().isDirect; }
- QString displayName() const { return content().displayName; }
- QUrl avatarUrl() const { return content().avatarUrl; }
- bool isInvite() const;
- bool isJoin() const;
- bool isLeave() const;
- bool isRename() const;
- bool isAvatarUpdate() const;
+ MembershipType membership() const { return content().membership; }
+ QString userId() const { return fullJson()[StateKeyKeyL].toString(); }
+ bool isDirect() const { return content().isDirect; }
+ QString displayName() const { return content().displayName; }
+ QUrl avatarUrl() const { return content().avatarUrl; }
+ bool isInvite() const;
+ bool isJoin() const;
+ bool isLeave() const;
+ bool isRename() const;
+ bool isAvatarUpdate() const;
- private:
- REGISTER_ENUM(MembershipType)
- };
+private:
+ REGISTER_ENUM(MembershipType)
+};
- template <>
- class EventFactory<RoomMemberEvent>
+template <>
+class EventFactory<RoomMemberEvent> {
+public:
+ static event_ptr_tt<RoomMemberEvent> make(const QJsonObject& json,
+ const QString&)
{
- public:
- static event_ptr_tt<RoomMemberEvent> make(const QJsonObject& json,
- const QString&)
- {
- return makeEvent<RoomMemberEvent>(json);
- }
- };
+ return makeEvent<RoomMemberEvent>(json);
+ }
+};
- REGISTER_EVENT_TYPE(RoomMemberEvent)
- DEFINE_EVENTTYPE_ALIAS(RoomMember, RoomMemberEvent)
-} // namespace QMatrixClient
+REGISTER_EVENT_TYPE(RoomMemberEvent)
+DEFINE_EVENTTYPE_ALIAS(RoomMember, RoomMemberEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/roommessageevent.cpp b/lib/events/roommessageevent.cpp
index 8b6cc730..991931de 100644
--- a/lib/events/roommessageevent.cpp
+++ b/lib/events/roommessageevent.cpp
@@ -13,15 +13,15 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "roommessageevent.h"
#include "logging.h"
-#include <QtCore/QMimeDatabase>
#include <QtCore/QFileInfo>
+#include <QtCore/QMimeDatabase>
#include <QtGui/QImageReader>
#include <QtMultimedia/QMediaResource>
@@ -50,31 +50,33 @@ template <>
TypedBase* make<TextContent>(const QJsonObject& json)
{
return json.contains(FormattedBodyKeyL) || json.contains(RelatesToKeyL)
- ? new TextContent(json) : nullptr;
+ ? new TextContent(json)
+ : nullptr;
}
-struct MsgTypeDesc
-{
+struct MsgTypeDesc {
QString matrixType;
MsgType enumType;
TypedBase* (*maker)(const QJsonObject&);
};
-const std::vector<MsgTypeDesc> msgTypes =
- { { TextTypeKey, MsgType::Text, make<TextContent> }
- , { EmoteTypeKey, MsgType::Emote, make<TextContent> }
- , { NoticeTypeKey, MsgType::Notice, make<TextContent> }
- , { QStringLiteral("m.image"), MsgType::Image, make<ImageContent> }
- , { QStringLiteral("m.file"), MsgType::File, make<FileContent> }
- , { QStringLiteral("m.location"), MsgType::Location, make<LocationContent> }
- , { QStringLiteral("m.video"), MsgType::Video, make<VideoContent> }
- , { QStringLiteral("m.audio"), MsgType::Audio, make<AudioContent> }
- };
+const std::vector<MsgTypeDesc> msgTypes = {
+ { TextTypeKey, MsgType::Text, make<TextContent> },
+ { EmoteTypeKey, MsgType::Emote, make<TextContent> },
+ { NoticeTypeKey, MsgType::Notice, make<TextContent> },
+ { QStringLiteral("m.image"), MsgType::Image, make<ImageContent> },
+ { QStringLiteral("m.file"), MsgType::File, make<FileContent> },
+ { QStringLiteral("m.location"), MsgType::Location, make<LocationContent> },
+ { QStringLiteral("m.video"), MsgType::Video, make<VideoContent> },
+ { QStringLiteral("m.audio"), MsgType::Audio, make<AudioContent> }
+};
QString msgTypeToJson(MsgType enumType)
{
auto it = std::find_if(msgTypes.begin(), msgTypes.end(),
- [=](const MsgTypeDesc& mtd) { return mtd.enumType == enumType; });
+ [=](const MsgTypeDesc& mtd) {
+ return mtd.enumType == enumType;
+ });
if (it != msgTypes.end())
return it->matrixType;
@@ -84,7 +86,9 @@ QString msgTypeToJson(MsgType enumType)
MsgType jsonToMsgType(const QString& matrixType)
{
auto it = std::find_if(msgTypes.begin(), msgTypes.end(),
- [=](const MsgTypeDesc& mtd) { return mtd.matrixType == matrixType; });
+ [=](const MsgTypeDesc& mtd) {
+ return mtd.matrixType == matrixType;
+ });
if (it != msgTypes.end())
return it->enumType;
@@ -92,7 +96,8 @@ MsgType jsonToMsgType(const QString& matrixType)
}
QJsonObject RoomMessageEvent::assembleContentJson(const QString& plainBody,
- const QString& jsonMsgType, TypedBase* content)
+ const QString& jsonMsgType,
+ TypedBase* content)
{
auto json = content ? content->toJson() : QJsonObject();
if (json.contains(RelatesToKeyL)) {
@@ -121,24 +126,24 @@ QJsonObject RoomMessageEvent::assembleContentJson(const QString& plainBody,
}
RoomMessageEvent::RoomMessageEvent(const QString& plainBody,
- const QString& jsonMsgType, TypedBase* content)
+ const QString& jsonMsgType,
+ TypedBase* content)
: RoomEvent(typeId(), matrixTypeId(),
assembleContentJson(plainBody, jsonMsgType, content))
, _content(content)
-{ }
+{}
-RoomMessageEvent::RoomMessageEvent(const QString& plainBody,
- MsgType msgType, TypedBase* content)
+RoomMessageEvent::RoomMessageEvent(const QString& plainBody, MsgType msgType,
+ TypedBase* content)
: RoomMessageEvent(plainBody, msgTypeToJson(msgType), content)
-{ }
+{}
TypedBase* contentFromFile(const QFileInfo& file, bool asGenericFile)
{
auto filePath = file.absoluteFilePath();
auto localUrl = QUrl::fromLocalFile(filePath);
auto mimeType = QMimeDatabase().mimeTypeForFile(file);
- if (!asGenericFile)
- {
+ if (!asGenericFile) {
auto mimeTypeName = mimeType.name();
if (mimeTypeName.startsWith("image/"))
return new ImageContent(localUrl, file.size(), mimeType,
@@ -160,11 +165,12 @@ TypedBase* contentFromFile(const QFileInfo& file, bool asGenericFile)
}
RoomMessageEvent::RoomMessageEvent(const QString& plainBody,
- const QFileInfo& file, bool asGenericFile)
+ const QFileInfo& file, bool asGenericFile)
: RoomMessageEvent(plainBody,
- asGenericFile ? QStringLiteral("m.file") : rawMsgTypeForFile(file),
- contentFromFile(file, asGenericFile))
-{ }
+ asGenericFile ? QStringLiteral("m.file")
+ : rawMsgTypeForFile(file),
+ contentFromFile(file, asGenericFile))
+{}
RoomMessageEvent::RoomMessageEvent(const QJsonObject& obj)
: RoomEvent(typeId(), obj), _content(nullptr)
@@ -172,26 +178,21 @@ RoomMessageEvent::RoomMessageEvent(const QJsonObject& obj)
if (isRedacted())
return;
const QJsonObject content = contentJson();
- if ( content.contains(MsgTypeKeyL) && content.contains(BodyKeyL) )
- {
+ if (content.contains(MsgTypeKeyL) && content.contains(BodyKeyL)) {
auto msgtype = content[MsgTypeKeyL].toString();
bool msgTypeFound = false;
- for (const auto& mt: msgTypes)
- if (mt.matrixType == msgtype)
- {
+ for (const auto& mt : msgTypes)
+ if (mt.matrixType == msgtype) {
_content.reset(mt.maker(content));
msgTypeFound = true;
}
- if (!msgTypeFound)
- {
+ if (!msgTypeFound) {
qCWarning(EVENTS) << "RoomMessageEvent: unknown msg_type,"
<< " full content dump follows";
qCWarning(EVENTS) << formatJson << content;
}
- }
- else
- {
+ } else {
qCWarning(EVENTS) << "No body or msgtype in room message event";
qCWarning(EVENTS) << formatJson << obj;
}
@@ -215,15 +216,15 @@ QString RoomMessageEvent::plainBody() const
QMimeType RoomMessageEvent::mimeType() const
{
static const auto PlainTextMimeType =
- QMimeDatabase().mimeTypeForName("text/plain");
+ QMimeDatabase().mimeTypeForName("text/plain");
return _content ? _content->type() : PlainTextMimeType;
}
bool RoomMessageEvent::hasTextContent() const
{
- return !content() ||
- (msgtype() == MsgType::Text || msgtype() == MsgType::Emote ||
- msgtype() == MsgType::Notice);
+ return !content()
+ || (msgtype() == MsgType::Text || msgtype() == MsgType::Emote
+ || msgtype() == MsgType::Notice);
}
bool RoomMessageEvent::hasFileContent() const
@@ -243,16 +244,19 @@ QString RoomMessageEvent::replacedEvent() const
const auto& rel = static_cast<const TextContent*>(content())->relatesTo;
return !rel.omitted() && rel->type == RelatesTo::ReplacementTypeId()
- ? rel->eventId : QString();
+ ? rel->eventId
+ : QString();
}
QString rawMsgTypeForMimeType(const QMimeType& mimeType)
{
auto name = mimeType.name();
- return name.startsWith("image/") ? QStringLiteral("m.image") :
- name.startsWith("video/") ? QStringLiteral("m.video") :
- name.startsWith("audio/") ? QStringLiteral("m.audio") :
- QStringLiteral("m.file");
+ return name.startsWith("image/")
+ ? QStringLiteral("m.image")
+ : name.startsWith("video/")
+ ? QStringLiteral("m.video")
+ : name.startsWith("audio/") ? QStringLiteral("m.audio")
+ : QStringLiteral("m.file");
}
QString RoomMessageEvent::rawMsgTypeForUrl(const QUrl& url)
@@ -267,15 +271,15 @@ QString RoomMessageEvent::rawMsgTypeForFile(const QFileInfo& fi)
TextContent::TextContent(const QString& text, const QString& contentType,
Omittable<RelatesTo> relatesTo)
- : mimeType(QMimeDatabase().mimeTypeForName(contentType)), body(text)
+ : mimeType(QMimeDatabase().mimeTypeForName(contentType))
+ , body(text)
, relatesTo(std::move(relatesTo))
{
if (contentType == HtmlContentTypeId)
mimeType = QMimeDatabase().mimeTypeForName("text/html");
}
-namespace QMatrixClient
-{
+namespace QMatrixClient {
// Overload the default fromJson<> logic that defined in converters.h
// as we want
template <>
@@ -291,7 +295,7 @@ Omittable<RelatesTo> fromJson(const QJsonValue& jv)
return RelatesTo { jo.value("rel_type"_ls).toString(),
jo.value(EventIdKeyL).toString() };
}
-}
+} // namespace QMatrixClient
TextContent::TextContent(const QJsonObject& json)
: relatesTo(fromJson<Omittable<RelatesTo>>(json[RelatesToKeyL]))
@@ -302,11 +306,11 @@ TextContent::TextContent(const QJsonObject& json)
const auto actualJson =
relatesTo.omitted() || relatesTo->type != RelatesTo::ReplacementTypeId()
- ? json : json.value("m.new_content"_ls).toObject();
+ ? json
+ : json.value("m.new_content"_ls).toObject();
// Special-casing the custom matrix.org's (actually, Riot's) way
// of sending HTML messages.
- if (actualJson["format"_ls].toString() == HtmlContentTypeId)
- {
+ if (actualJson["format"_ls].toString() == HtmlContentTypeId) {
mimeType = HtmlMimeType;
body = actualJson[FormattedBodyKeyL].toString();
} else {
@@ -323,8 +327,7 @@ void TextContent::fillJson(QJsonObject* json) const
static const auto FormattedBodyKey = QStringLiteral("formatted_body");
Q_ASSERT(json);
- if (mimeType.inherits("text/html"))
- {
+ if (mimeType.inherits("text/html")) {
json->insert(FormatKey, HtmlContentTypeId);
json->insert(FormattedBodyKey, body);
}
@@ -345,13 +348,13 @@ void TextContent::fillJson(QJsonObject* json) const
LocationContent::LocationContent(const QString& geoUri,
const Thumbnail& thumbnail)
: geoUri(geoUri), thumbnail(thumbnail)
-{ }
+{}
LocationContent::LocationContent(const QJsonObject& json)
: TypedBase(json)
, geoUri(json["geo_uri"_ls].toString())
, thumbnail(json["info"_ls].toObject())
-{ }
+{}
QMimeType LocationContent::type() const
{
diff --git a/lib/events/roommessageevent.h b/lib/events/roommessageevent.h
index 7320e4ea..c7a5cb47 100644
--- a/lib/events/roommessageevent.h
+++ b/lib/events/roommessageevent.h
@@ -13,211 +13,208 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
-#include "roomevent.h"
#include "eventcontent.h"
+#include "roomevent.h"
class QFileInfo;
-namespace QMatrixClient
-{
- namespace MessageEventContent = EventContent; // Back-compatibility
+namespace QMatrixClient {
+namespace MessageEventContent = EventContent; // Back-compatibility
+
+/**
+ * The event class corresponding to m.room.message events
+ */
+class RoomMessageEvent : public RoomEvent {
+ Q_GADGET
+ Q_PROPERTY(QString msgType READ rawMsgtype CONSTANT)
+ Q_PROPERTY(QString plainBody READ plainBody CONSTANT)
+ Q_PROPERTY(QMimeType mimeType READ mimeType STORED false CONSTANT)
+ Q_PROPERTY(EventContent::TypedBase* content READ content CONSTANT)
+public:
+ DEFINE_EVENT_TYPEID("m.room.message", RoomMessageEvent)
+
+ enum class MsgType {
+ Text,
+ Emote,
+ Notice,
+ Image,
+ File,
+ Location,
+ Video,
+ Audio,
+ Unknown
+ };
+
+ RoomMessageEvent(const QString& plainBody, const QString& jsonMsgType,
+ EventContent::TypedBase* content = nullptr);
+ explicit RoomMessageEvent(const QString& plainBody,
+ MsgType msgType = MsgType::Text,
+ EventContent::TypedBase* content = nullptr);
+ explicit RoomMessageEvent(const QString& plainBody, const QFileInfo& file,
+ bool asGenericFile = false);
+ explicit RoomMessageEvent(const QJsonObject& obj);
+
+ MsgType msgtype() const;
+ QString rawMsgtype() const;
+ QString plainBody() const;
+ EventContent::TypedBase* content() const { return _content.data(); }
+ template <typename VisitorT>
+ void editContent(VisitorT visitor)
+ {
+ visitor(*_content);
+ editJson()[ContentKeyL] = assembleContentJson(plainBody(), rawMsgtype(),
+ content());
+ }
+ QMimeType mimeType() const;
+ bool hasTextContent() const;
+ bool hasFileContent() const;
+ bool hasThumbnail() const;
+ QString replacedEvent() const;
+
+ static QString rawMsgTypeForUrl(const QUrl& url);
+ static QString rawMsgTypeForFile(const QFileInfo& fi);
+
+private:
+ QScopedPointer<EventContent::TypedBase> _content;
+
+ // FIXME: should it really be static?
+ static QJsonObject assembleContentJson(const QString& plainBody,
+ const QString& jsonMsgType,
+ EventContent::TypedBase* content);
+
+ REGISTER_ENUM(MsgType)
+};
+REGISTER_EVENT_TYPE(RoomMessageEvent)
+DEFINE_EVENTTYPE_ALIAS(RoomMessage, RoomMessageEvent)
+using MessageEventType = RoomMessageEvent::MsgType;
+
+namespace EventContent {
+ // Additional event content types
+
+ struct RelatesTo {
+ static constexpr const char* ReplyTypeId() { return "m.in_reply_to"; }
+ static constexpr const char* ReplacementTypeId() { return "m.replace"; }
+ QString type; // The only supported relation so far
+ QString eventId;
+ };
+ inline RelatesTo replyTo(QString eventId)
+ {
+ return { RelatesTo::ReplyTypeId(), std::move(eventId) };
+ }
/**
- * The event class corresponding to m.room.message events
+ * Rich text content for m.text, m.emote, m.notice
+ *
+ * Available fields: mimeType, body. The body can be either rich text
+ * or plain text, depending on what mimeType specifies.
*/
- class RoomMessageEvent: public RoomEvent
- {
- Q_GADGET
- Q_PROPERTY(QString msgType READ rawMsgtype CONSTANT)
- Q_PROPERTY(QString plainBody READ plainBody CONSTANT)
- Q_PROPERTY(QMimeType mimeType READ mimeType STORED false CONSTANT)
- Q_PROPERTY(EventContent::TypedBase* content READ content CONSTANT)
- public:
- DEFINE_EVENT_TYPEID("m.room.message", RoomMessageEvent)
-
- enum class MsgType
- {
- Text, Emote, Notice, Image, File, Location, Video, Audio, Unknown
- };
-
- RoomMessageEvent(const QString& plainBody,
- const QString& jsonMsgType,
- EventContent::TypedBase* content = nullptr);
- explicit RoomMessageEvent(const QString& plainBody,
- MsgType msgType = MsgType::Text,
- EventContent::TypedBase* content = nullptr);
- explicit RoomMessageEvent(const QString& plainBody,
- const QFileInfo& file,
- bool asGenericFile = false);
- explicit RoomMessageEvent(const QJsonObject& obj);
-
- MsgType msgtype() const;
- QString rawMsgtype() const;
- QString plainBody() const;
- EventContent::TypedBase* content() const
- { return _content.data(); }
- template <typename VisitorT>
- void editContent(VisitorT visitor)
- {
- visitor(*_content);
- editJson()[ContentKeyL] =
- assembleContentJson(plainBody(), rawMsgtype(), content());
- }
- QMimeType mimeType() const;
- bool hasTextContent() const;
- bool hasFileContent() const;
- bool hasThumbnail() const;
- QString replacedEvent() const;
-
- static QString rawMsgTypeForUrl(const QUrl& url);
- static QString rawMsgTypeForFile(const QFileInfo& fi);
-
- private:
- QScopedPointer<EventContent::TypedBase> _content;
-
- // FIXME: should it really be static?
- static QJsonObject assembleContentJson(const QString& plainBody,
- const QString& jsonMsgType, EventContent::TypedBase* content);
-
- REGISTER_ENUM(MsgType)
+ class TextContent : public TypedBase {
+ public:
+ TextContent(const QString& text, const QString& contentType,
+ Omittable<RelatesTo> relatesTo = none);
+ explicit TextContent(const QJsonObject& json);
+
+ QMimeType type() const override { return mimeType; }
+
+ QMimeType mimeType;
+ QString body;
+ Omittable<RelatesTo> relatesTo;
+
+ protected:
+ void fillJson(QJsonObject* json) const override;
};
- REGISTER_EVENT_TYPE(RoomMessageEvent)
- DEFINE_EVENTTYPE_ALIAS(RoomMessage, RoomMessageEvent)
- using MessageEventType = RoomMessageEvent::MsgType;
- namespace EventContent
- {
- // Additional event content types
+ /**
+ * Content class for m.location
+ *
+ * Available fields:
+ * - corresponding to the top-level JSON:
+ * - geoUri ("geo_uri" in JSON)
+ * - corresponding to the "info" subobject:
+ * - thumbnail.url ("thumbnail_url" in JSON)
+ * - corresponding to the "info/thumbnail_info" subobject:
+ * - thumbnail.payloadSize
+ * - thumbnail.mimeType
+ * - thumbnail.imageSize
+ */
+ class LocationContent : public TypedBase {
+ public:
+ LocationContent(const QString& geoUri, const Thumbnail& thumbnail = {});
+ explicit LocationContent(const QJsonObject& json);
- struct RelatesTo
- {
- static constexpr const char* ReplyTypeId() { return "m.in_reply_to"; }
- static constexpr const char* ReplacementTypeId() { return "m.replace"; }
- QString type; // The only supported relation so far
- QString eventId;
- };
- inline RelatesTo replyTo(QString eventId)
+ QMimeType type() const override;
+
+ public:
+ QString geoUri;
+ Thumbnail thumbnail;
+
+ protected:
+ void fillJson(QJsonObject* o) const override;
+ };
+
+ /**
+ * A base class for info types that include duration: audio and video
+ */
+ template <typename ContentT>
+ class PlayableContent : public ContentT {
+ public:
+ using ContentT::ContentT;
+ PlayableContent(const QJsonObject& json)
+ : ContentT(json)
+ , duration(ContentT::originalInfoJson["duration"_ls].toInt())
+ {}
+
+ protected:
+ void fillJson(QJsonObject* json) const override
{
- return { RelatesTo::ReplyTypeId(), std::move(eventId) };
+ ContentT::fillJson(json);
+ auto infoJson = json->take("info"_ls).toObject();
+ infoJson.insert(QStringLiteral("duration"), duration);
+ json->insert(QStringLiteral("info"), infoJson);
}
- /**
- * Rich text content for m.text, m.emote, m.notice
- *
- * Available fields: mimeType, body. The body can be either rich text
- * or plain text, depending on what mimeType specifies.
- */
- class TextContent: public TypedBase
- {
- public:
- TextContent(const QString& text, const QString& contentType,
- Omittable<RelatesTo> relatesTo = none);
- explicit TextContent(const QJsonObject& json);
-
- QMimeType type() const override { return mimeType; }
-
- QMimeType mimeType;
- QString body;
- Omittable<RelatesTo> relatesTo;
-
- protected:
- void fillJson(QJsonObject* json) const override;
- };
-
- /**
- * Content class for m.location
- *
- * Available fields:
- * - corresponding to the top-level JSON:
- * - geoUri ("geo_uri" in JSON)
- * - corresponding to the "info" subobject:
- * - thumbnail.url ("thumbnail_url" in JSON)
- * - corresponding to the "info/thumbnail_info" subobject:
- * - thumbnail.payloadSize
- * - thumbnail.mimeType
- * - thumbnail.imageSize
- */
- class LocationContent: public TypedBase
- {
- public:
- LocationContent(const QString& geoUri,
- const Thumbnail& thumbnail = {});
- explicit LocationContent(const QJsonObject& json);
-
- QMimeType type() const override;
-
- public:
- QString geoUri;
- Thumbnail thumbnail;
-
- protected:
- void fillJson(QJsonObject* o) const override;
- };
-
- /**
- * A base class for info types that include duration: audio and video
- */
- template <typename ContentT>
- class PlayableContent : public ContentT
- {
- public:
- using ContentT::ContentT;
- PlayableContent(const QJsonObject& json)
- : ContentT(json)
- , duration(ContentT::originalInfoJson["duration"_ls].toInt())
- { }
-
- protected:
- void fillJson(QJsonObject* json) const override
- {
- ContentT::fillJson(json);
- auto infoJson = json->take("info"_ls).toObject();
- infoJson.insert(QStringLiteral("duration"), duration);
- json->insert(QStringLiteral("info"), infoJson);
- }
-
- public:
- int duration;
- };
-
- /**
- * Content class for m.video
- *
- * Available fields:
- * - corresponding to the top-level JSON:
- * - url
- * - filename (extension to the CS API spec)
- * - corresponding to the "info" subobject:
- * - payloadSize ("size" in JSON)
- * - mimeType ("mimetype" in JSON)
- * - duration
- * - 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 "info":
- * - payloadSize
- * - mimeType
- * - imageSize
- */
- using VideoContent = PlayableContent<UrlWithThumbnailContent<ImageInfo>>;
-
- /**
- * Content class for m.audio
- *
- * Available fields:
- * - corresponding to the top-level JSON:
- * - url
- * - filename (extension to the CS API spec)
- * - corresponding to the "info" subobject:
- * - payloadSize ("size" in JSON)
- * - mimeType ("mimetype" in JSON)
- * - duration
- */
- using AudioContent = PlayableContent<UrlBasedContent<FileInfo>>;
- } // namespace EventContent
-} // namespace QMatrixClient
+ public:
+ int duration;
+ };
+
+ /**
+ * Content class for m.video
+ *
+ * Available fields:
+ * - corresponding to the top-level JSON:
+ * - url
+ * - filename (extension to the CS API spec)
+ * - corresponding to the "info" subobject:
+ * - payloadSize ("size" in JSON)
+ * - mimeType ("mimetype" in JSON)
+ * - duration
+ * - 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 "info":
+ * - payloadSize
+ * - mimeType
+ * - imageSize
+ */
+ using VideoContent = PlayableContent<UrlWithThumbnailContent<ImageInfo>>;
+
+ /**
+ * Content class for m.audio
+ *
+ * Available fields:
+ * - corresponding to the top-level JSON:
+ * - url
+ * - filename (extension to the CS API spec)
+ * - corresponding to the "info" subobject:
+ * - payloadSize ("size" in JSON)
+ * - mimeType ("mimetype" in JSON)
+ * - duration
+ */
+ using AudioContent = PlayableContent<UrlBasedContent<FileInfo>>;
+} // namespace EventContent
+} // namespace QMatrixClient
diff --git a/lib/events/roomtombstoneevent.cpp b/lib/events/roomtombstoneevent.cpp
index 9c3bafd4..a74bb367 100644
--- a/lib/events/roomtombstoneevent.cpp
+++ b/lib/events/roomtombstoneevent.cpp
@@ -1,20 +1,20 @@
/******************************************************************************
-* Copyright (C) 2019 QMatrixClient project
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2019 QMatrixClient project
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#include "roomtombstoneevent.h"
diff --git a/lib/events/roomtombstoneevent.h b/lib/events/roomtombstoneevent.h
index c7008ec4..95fed998 100644
--- a/lib/events/roomtombstoneevent.h
+++ b/lib/events/roomtombstoneevent.h
@@ -1,41 +1,37 @@
/******************************************************************************
-* Copyright (C) 2019 QMatrixClient project
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2019 QMatrixClient project
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#pragma once
#include "stateevent.h"
-namespace QMatrixClient
-{
- class RoomTombstoneEvent : public StateEventBase
- {
- public:
- DEFINE_EVENT_TYPEID("m.room.tombstone", RoomTombstoneEvent)
+namespace QMatrixClient {
+class RoomTombstoneEvent : public StateEventBase {
+public:
+ DEFINE_EVENT_TYPEID("m.room.tombstone", RoomTombstoneEvent)
- explicit RoomTombstoneEvent()
- : StateEventBase(typeId(), matrixTypeId())
- { }
- explicit RoomTombstoneEvent(const QJsonObject& obj)
- : StateEventBase(typeId(), obj)
- { }
+ explicit RoomTombstoneEvent() : StateEventBase(typeId(), matrixTypeId()) {}
+ explicit RoomTombstoneEvent(const QJsonObject& obj)
+ : StateEventBase(typeId(), obj)
+ {}
- QString serverMessage() const;
- QString successorRoomId() const;
- };
- REGISTER_EVENT_TYPE(RoomTombstoneEvent)
-}
+ QString serverMessage() const;
+ QString successorRoomId() const;
+};
+REGISTER_EVENT_TYPE(RoomTombstoneEvent)
+} // namespace QMatrixClient
diff --git a/lib/events/simplestateevents.h b/lib/events/simplestateevents.h
index ef56c7b2..6dad8020 100644
--- a/lib/events/simplestateevents.h
+++ b/lib/events/simplestateevents.h
@@ -13,90 +13,83 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "stateevent.h"
-namespace QMatrixClient
-{
- namespace EventContent
- {
- template <typename T>
- class SimpleContent
- {
- public:
- using value_type = T;
+namespace QMatrixClient {
+namespace EventContent {
+ template <typename T>
+ class SimpleContent {
+ public:
+ using value_type = T;
- // The constructor is templated to enable perfect forwarding
- template <typename TT>
- SimpleContent(QString keyName, TT&& value)
- : value(std::forward<TT>(value)), key(std::move(keyName))
- { }
- SimpleContent(const QJsonObject& json, QString keyName)
- : value(fromJson<T>(json[keyName]))
- , key(std::move(keyName))
- { }
- QJsonObject toJson() const
- {
- return { { key, QMatrixClient::toJson(value) } };
- }
+ // The constructor is templated to enable perfect forwarding
+ template <typename TT>
+ SimpleContent(QString keyName, TT&& value)
+ : value(std::forward<TT>(value)), key(std::move(keyName))
+ {}
+ SimpleContent(const QJsonObject& json, QString keyName)
+ : value(fromJson<T>(json[keyName])), key(std::move(keyName))
+ {}
+ QJsonObject toJson() const
+ {
+ return { { key, QMatrixClient::toJson(value) } };
+ }
- public:
- T value;
+ public:
+ T value;
- protected:
- QString key;
- };
- } // namespace EventContent
+ protected:
+ QString key;
+ };
+} // namespace EventContent
-#define DEFINE_SIMPLE_STATE_EVENT(_Name, _TypeId, _ValueType, _ContentKey) \
- class _Name : public StateEvent<EventContent::SimpleContent<_ValueType>> \
- { \
- public: \
- using value_type = content_type::value_type; \
- DEFINE_EVENT_TYPEID(_TypeId, _Name) \
- explicit _Name() : _Name(value_type()) { } \
- template <typename T> \
- explicit _Name(T&& value) \
- : StateEvent(typeId(), matrixTypeId(), QString(), \
- QStringLiteral(#_ContentKey), \
- std::forward<T>(value)) \
- { } \
- explicit _Name(QJsonObject obj) \
- : StateEvent(typeId(), std::move(obj), \
- QStringLiteral(#_ContentKey)) \
- { } \
- auto _ContentKey() const { return content().value; } \
- }; \
- REGISTER_EVENT_TYPE(_Name) \
+#define DEFINE_SIMPLE_STATE_EVENT(_Name, _TypeId, _ValueType, _ContentKey) \
+ class _Name : public StateEvent<EventContent::SimpleContent<_ValueType>> { \
+ public: \
+ using value_type = content_type::value_type; \
+ DEFINE_EVENT_TYPEID(_TypeId, _Name) \
+ explicit _Name() : _Name(value_type()) {} \
+ template <typename T> \
+ explicit _Name(T&& value) \
+ : StateEvent(typeId(), matrixTypeId(), QString(), \
+ QStringLiteral(#_ContentKey), std::forward<T>(value)) \
+ {} \
+ explicit _Name(QJsonObject obj) \
+ : StateEvent(typeId(), std::move(obj), \
+ QStringLiteral(#_ContentKey)) \
+ {} \
+ auto _ContentKey() const { return content().value; } \
+ }; \
+ REGISTER_EVENT_TYPE(_Name) \
// End of macro
- DEFINE_SIMPLE_STATE_EVENT(RoomNameEvent, "m.room.name", QString, name)
- DEFINE_EVENTTYPE_ALIAS(RoomName, RoomNameEvent)
- DEFINE_SIMPLE_STATE_EVENT(RoomCanonicalAliasEvent, "m.room.canonical_alias",
- QString, alias)
- DEFINE_EVENTTYPE_ALIAS(RoomCanonicalAlias, RoomCanonicalAliasEvent)
- DEFINE_SIMPLE_STATE_EVENT(RoomTopicEvent, "m.room.topic", QString, topic)
- DEFINE_EVENTTYPE_ALIAS(RoomTopic, RoomTopicEvent)
- DEFINE_EVENTTYPE_ALIAS(RoomEncryption, EncryptionEvent)
+DEFINE_SIMPLE_STATE_EVENT(RoomNameEvent, "m.room.name", QString, name)
+DEFINE_EVENTTYPE_ALIAS(RoomName, RoomNameEvent)
+DEFINE_SIMPLE_STATE_EVENT(RoomCanonicalAliasEvent, "m.room.canonical_alias",
+ QString, alias)
+DEFINE_EVENTTYPE_ALIAS(RoomCanonicalAlias, RoomCanonicalAliasEvent)
+DEFINE_SIMPLE_STATE_EVENT(RoomTopicEvent, "m.room.topic", QString, topic)
+DEFINE_EVENTTYPE_ALIAS(RoomTopic, RoomTopicEvent)
+DEFINE_EVENTTYPE_ALIAS(RoomEncryption, EncryptionEvent)
- class RoomAliasesEvent
- : public StateEvent<EventContent::SimpleContent<QStringList>>
- {
- public:
- DEFINE_EVENT_TYPEID("m.room.aliases", RoomAliasesEvent)
- explicit RoomAliasesEvent(const QJsonObject& obj)
- : StateEvent(typeId(), obj, QStringLiteral("aliases"))
- { }
- RoomAliasesEvent(const QString& server, const QStringList& aliases)
- : StateEvent(typeId(), matrixTypeId(), server,
- QStringLiteral("aliases"), aliases)
- { }
- QString server() const { return stateKey(); }
- QStringList aliases() const { return content().value; }
- };
- REGISTER_EVENT_TYPE(RoomAliasesEvent)
+class RoomAliasesEvent
+ : public StateEvent<EventContent::SimpleContent<QStringList>> {
+public:
+ DEFINE_EVENT_TYPEID("m.room.aliases", RoomAliasesEvent)
+ explicit RoomAliasesEvent(const QJsonObject& obj)
+ : StateEvent(typeId(), obj, QStringLiteral("aliases"))
+ {}
+ RoomAliasesEvent(const QString& server, const QStringList& aliases)
+ : StateEvent(typeId(), matrixTypeId(), server,
+ QStringLiteral("aliases"), aliases)
+ {}
+ QString server() const { return stateKey(); }
+ QStringList aliases() const { return content().value; }
+};
+REGISTER_EVENT_TYPE(RoomAliasesEvent)
} // namespace QMatrixClient
diff --git a/lib/events/stateevent.cpp b/lib/events/stateevent.cpp
index 6a6e7782..bd228abd 100644
--- a/lib/events/stateevent.cpp
+++ b/lib/events/stateevent.cpp
@@ -1,20 +1,20 @@
/******************************************************************************
-* Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#include "stateevent.h"
@@ -25,8 +25,7 @@ using namespace QMatrixClient;
// but the event type is unknown.
[[gnu::unused]] static auto stateEventTypeInitialised =
RoomEvent::factory_t::addMethod(
- [] (const QJsonObject& json, const QString& matrixType) -> StateEventPtr
- {
+ [](const QJsonObject& json, const QString& matrixType) -> StateEventPtr {
if (!json.contains(StateKeyKeyL))
return nullptr;
@@ -37,10 +36,10 @@ using namespace QMatrixClient;
});
StateEventBase::StateEventBase(Event::Type type, event_mtype_t matrixType,
- const QString &stateKey,
- const QJsonObject &contentJson)
+ const QString& stateKey,
+ const QJsonObject& contentJson)
: RoomEvent(type, basicStateEventJson(matrixType, contentJson, stateKey))
-{ }
+{}
bool StateEventBase::repeatsState() const
{
@@ -59,6 +58,7 @@ void StateEventBase::dumpTo(QDebug dbg) const
dbg << '<' << stateKey() << "> ";
if (unsignedJson().contains(PrevContentKeyL))
dbg << QJsonDocument(unsignedJson()[PrevContentKeyL].toObject())
- .toJson(QJsonDocument::Compact) << " -> ";
+ .toJson(QJsonDocument::Compact)
+ << " -> ";
RoomEvent::dumpTo(dbg);
}
diff --git a/lib/events/stateevent.h b/lib/events/stateevent.h
index 3b56a265..757c94ee 100644
--- a/lib/events/stateevent.h
+++ b/lib/events/stateevent.h
@@ -1,20 +1,20 @@
/******************************************************************************
-* Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation; either
-* version 2.1 of the License, or (at your option) any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+ * Copyright (C) 2018 Kitsune Ral <kitsune-ral@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
#pragma once
@@ -22,117 +22,120 @@
namespace QMatrixClient {
- /// Make a minimal correct Matrix state event JSON
- template <typename StrT>
- inline QJsonObject basicStateEventJson(StrT matrixType,
- const QJsonObject& content, const QString& stateKey = {})
+/// Make a minimal correct Matrix state event JSON
+template <typename StrT>
+inline QJsonObject basicStateEventJson(StrT matrixType,
+ const QJsonObject& content,
+ const QString& stateKey = {})
+{
+ return { { TypeKey, std::forward<StrT>(matrixType) },
+ { StateKeyKey, stateKey },
+ { ContentKey, content } };
+}
+
+class StateEventBase : public RoomEvent {
+public:
+ using factory_t = EventFactory<StateEventBase>;
+
+ StateEventBase(Type type, const QJsonObject& json) : RoomEvent(type, json)
+ {}
+ StateEventBase(Type type, event_mtype_t matrixType,
+ const QString& stateKey = {},
+ const QJsonObject& contentJson = {});
+ ~StateEventBase() override = default;
+
+ bool isStateEvent() const override { return true; }
+ QString replacedState() const;
+ void dumpTo(QDebug dbg) const override;
+
+ virtual bool repeatsState() const;
+};
+using StateEventPtr = event_ptr_tt<StateEventBase>;
+using StateEvents = EventsArray<StateEventBase>;
+
+template <>
+inline bool is<StateEventBase>(const Event& e)
+{
+ return e.isStateEvent();
+}
+
+/**
+ * A combination of event type and state key uniquely identifies a piece
+ * of state in Matrix.
+ * \sa
+ * https://matrix.org/docs/spec/client_server/unstable.html#types-of-room-events
+ */
+using StateEventKey = QPair<QString, QString>;
+
+template <typename ContentT>
+struct Prev {
+ template <typename... ContentParamTs>
+ explicit Prev(const QJsonObject& unsignedJson,
+ ContentParamTs&&... contentParams)
+ : senderId(unsignedJson.value("prev_sender"_ls).toString())
+ , content(unsignedJson.value(PrevContentKeyL).toObject(),
+ std::forward<ContentParamTs>(contentParams)...)
+ {}
+
+ QString senderId;
+ ContentT content;
+};
+
+template <typename ContentT>
+class StateEvent : public StateEventBase {
+public:
+ using content_type = ContentT;
+
+ template <typename... ContentParamTs>
+ explicit StateEvent(Type type, const QJsonObject& fullJson,
+ ContentParamTs&&... contentParams)
+ : StateEventBase(type, fullJson)
+ , _content(contentJson(), std::forward<ContentParamTs>(contentParams)...)
+ {
+ const auto& unsignedData = unsignedJson();
+ if (unsignedData.contains(PrevContentKeyL))
+ _prev = std::make_unique<Prev<ContentT>>(
+ unsignedData, std::forward<ContentParamTs>(contentParams)...);
+ }
+ template <typename... ContentParamTs>
+ explicit StateEvent(Type type, event_mtype_t matrixType,
+ const QString& stateKey,
+ ContentParamTs&&... contentParams)
+ : StateEventBase(type, matrixType, stateKey)
+ , _content(std::forward<ContentParamTs>(contentParams)...)
{
- return { { TypeKey, std::forward<StrT>(matrixType) },
- { StateKeyKey, stateKey },
- { ContentKey, content } };
+ editJson().insert(ContentKey, _content.toJson());
}
- class StateEventBase: public RoomEvent
+ const ContentT& content() const { return _content; }
+ template <typename VisitorT>
+ void editContent(VisitorT&& visitor)
{
- public:
- using factory_t = EventFactory<StateEventBase>;
-
- StateEventBase(Type type, const QJsonObject& json)
- : RoomEvent(type, json)
- { }
- StateEventBase(Type type, event_mtype_t matrixType,
- const QString& stateKey = {},
- const QJsonObject& contentJson = {});
- ~StateEventBase() override = default;
-
- bool isStateEvent() const override { return true; }
- QString replacedState() const;
- void dumpTo(QDebug dbg) const override;
-
- virtual bool repeatsState() const;
- };
- using StateEventPtr = event_ptr_tt<StateEventBase>;
- using StateEvents = EventsArray<StateEventBase>;
-
- template <>
- inline bool is<StateEventBase>(const Event& e) { return e.isStateEvent(); }
-
- /**
- * A combination of event type and state key uniquely identifies a piece
- * of state in Matrix.
- * \sa https://matrix.org/docs/spec/client_server/unstable.html#types-of-room-events
- */
- using StateEventKey = QPair<QString, QString>;
-
- template <typename ContentT>
- struct Prev
+ visitor(_content);
+ editJson()[ContentKeyL] = _content.toJson();
+ }
+ [[deprecated("Use prevContent instead")]] const ContentT* prev_content() const
{
- template <typename... ContentParamTs>
- explicit Prev(const QJsonObject& unsignedJson,
- ContentParamTs&&... contentParams)
- : senderId(unsignedJson.value("prev_sender"_ls).toString())
- , content(unsignedJson.value(PrevContentKeyL).toObject(),
- std::forward<ContentParamTs>(contentParams)...)
- { }
-
- QString senderId;
- ContentT content;
- };
-
- template <typename ContentT>
- class StateEvent: public StateEventBase
+ return prevContent();
+ }
+ const ContentT* prevContent() const
{
- public:
- using content_type = ContentT;
-
- template <typename... ContentParamTs>
- explicit StateEvent(Type type, const QJsonObject& fullJson,
- ContentParamTs&&... contentParams)
- : StateEventBase(type, fullJson)
- , _content(contentJson(),
- std::forward<ContentParamTs>(contentParams)...)
- {
- const auto& unsignedData = unsignedJson();
- if (unsignedData.contains(PrevContentKeyL))
- _prev = std::make_unique<Prev<ContentT>>(unsignedData,
- std::forward<ContentParamTs>(contentParams)...);
- }
- template <typename... ContentParamTs>
- explicit StateEvent(Type type, event_mtype_t matrixType,
- const QString& stateKey,
- ContentParamTs&&... contentParams)
- : StateEventBase(type, matrixType, stateKey)
- , _content(std::forward<ContentParamTs>(contentParams)...)
- {
- editJson().insert(ContentKey, _content.toJson());
- }
-
- const ContentT& content() const { return _content; }
- template <typename VisitorT>
- void editContent(VisitorT&& visitor)
- {
- visitor(_content);
- editJson()[ContentKeyL] = _content.toJson();
- }
- [[deprecated("Use prevContent instead")]]
- const ContentT* prev_content() const { return prevContent(); }
- const ContentT* prevContent() const
- { return _prev ? &_prev->content : nullptr; }
- QString prevSenderId() const
- { return _prev ? _prev->senderId : QString(); }
-
- private:
- ContentT _content;
- std::unique_ptr<Prev<ContentT>> _prev;
- };
+ return _prev ? &_prev->content : nullptr;
+ }
+ QString prevSenderId() const { return _prev ? _prev->senderId : QString(); }
+
+private:
+ ContentT _content;
+ std::unique_ptr<Prev<ContentT>> _prev;
+};
} // namespace QMatrixClient
namespace std {
- template <> struct hash<QMatrixClient::StateEventKey>
+template <>
+struct hash<QMatrixClient::StateEventKey> {
+ size_t operator()(const QMatrixClient::StateEventKey& k) const Q_DECL_NOEXCEPT
{
- size_t operator()(const QMatrixClient::StateEventKey& k) const Q_DECL_NOEXCEPT
- {
- return qHash(k);
- }
- };
-}
+ return qHash(k);
+ }
+};
+} // namespace std
diff --git a/lib/events/typingevent.cpp b/lib/events/typingevent.cpp
index 0d39d1be..ee3d6b67 100644
--- a/lib/events/typingevent.cpp
+++ b/lib/events/typingevent.cpp
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "typingevent.h"
@@ -22,11 +22,9 @@
using namespace QMatrixClient;
-TypingEvent::TypingEvent(const QJsonObject& obj)
- : Event(typeId(), obj)
+TypingEvent::TypingEvent(const QJsonObject& obj) : Event(typeId(), obj)
{
const auto& array = contentJson()["user_ids"_ls].toArray();
- for(const auto& user: array )
+ for (const auto& user : array)
_users.push_back(user.toString());
}
-
diff --git a/lib/events/typingevent.h b/lib/events/typingevent.h
index 27b668b4..c8170865 100644
--- a/lib/events/typingevent.h
+++ b/lib/events/typingevent.h
@@ -13,27 +13,25 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#pragma once
#include "event.h"
-namespace QMatrixClient
-{
- class TypingEvent: public Event
- {
- public:
- DEFINE_EVENT_TYPEID("m.typing", TypingEvent)
+namespace QMatrixClient {
+class TypingEvent : public Event {
+public:
+ DEFINE_EVENT_TYPEID("m.typing", TypingEvent)
- TypingEvent(const QJsonObject& obj);
+ TypingEvent(const QJsonObject& obj);
- const QStringList& users() const { return _users; }
+ const QStringList& users() const { return _users; }
- private:
- QStringList _users;
- };
- REGISTER_EVENT_TYPE(TypingEvent)
- DEFINE_EVENTTYPE_ALIAS(Typing, TypingEvent)
-} // namespace QMatrixClient
+private:
+ QStringList _users;
+};
+REGISTER_EVENT_TYPE(TypingEvent)
+DEFINE_EVENTTYPE_ALIAS(Typing, TypingEvent)
+} // namespace QMatrixClient