aboutsummaryrefslogtreecommitdiff
path: root/lib/events
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2018-05-05 19:36:15 +0900
committerKitsune Ral <Kitsune-Ral@users.sf.net>2018-05-05 19:36:15 +0900
commita8d2a73c771f188fc0fdc6351b4923af788317d5 (patch)
treeb2795b93149f7c0ae3cd5005331b650a8eb6fd1e /lib/events
parentda16225dfbec9b155c2c299757203f7676ac6ccf (diff)
parenta63838235134b066c092ad98e1f18ff7991c91c1 (diff)
downloadlibquotient-a8d2a73c771f188fc0fdc6351b4923af788317d5.tar.gz
libquotient-a8d2a73c771f188fc0fdc6351b4923af788317d5.zip
Merge branch 'kitsune-gtad'
Diffstat (limited to 'lib/events')
-rw-r--r--lib/events/accountdataevents.h3
-rw-r--r--lib/events/directchatevent.h2
-rw-r--r--lib/events/event.cpp25
-rw-r--r--lib/events/event.h86
-rw-r--r--lib/events/receiptevent.cpp2
-rw-r--r--lib/events/receiptevent.h2
-rw-r--r--lib/events/redactionevent.h2
-rw-r--r--lib/events/roomavatarevent.h2
-rw-r--r--lib/events/roommemberevent.h9
-rw-r--r--lib/events/roommessageevent.h2
-rw-r--r--lib/events/simplestateevents.h2
-rw-r--r--lib/events/typingevent.h2
12 files changed, 52 insertions, 87 deletions
diff --git a/lib/events/accountdataevents.h b/lib/events/accountdataevents.h
index f3ba27bb..11667172 100644
--- a/lib/events/accountdataevents.h
+++ b/lib/events/accountdataevents.h
@@ -54,8 +54,7 @@ namespace QMatrixClient
class _Name : public Event \
{ \
public: \
- static constexpr const char* TypeId = _TypeId; \
- static const char* typeId() { return TypeId; } \
+ static constexpr const char* typeId() { return _TypeId; } \
explicit _Name(const QJsonObject& obj) \
: Event((_EnumType), obj) \
, _content(contentJson(), QStringLiteral(#_ContentKey)) \
diff --git a/lib/events/directchatevent.h b/lib/events/directchatevent.h
index 2b0ad0a0..bd8f2d35 100644
--- a/lib/events/directchatevent.h
+++ b/lib/events/directchatevent.h
@@ -29,6 +29,6 @@ namespace QMatrixClient
QMultiHash<QString, QString> usersToDirectChats() const;
- static constexpr const char * TypeId = "m.direct";
+ static constexpr const char* typeId() { return "m.direct"; }
};
}
diff --git a/lib/events/event.cpp b/lib/events/event.cpp
index 1d5f1b0d..576e9426 100644
--- a/lib/events/event.cpp
+++ b/lib/events/event.cpp
@@ -76,7 +76,7 @@ template <typename BaseEventT, typename EventT, typename... EventTs>
inline event_ptr_tt<BaseEventT> makeIfMatches(const QJsonObject& o,
const QString& selector)
{
- if (selector == EventT::TypeId)
+ if (selector == EventT::typeId())
return _impl::create<EventT>(o);
return makeIfMatches<BaseEventT, EventTs...>(o, selector);
@@ -160,14 +160,13 @@ void RoomEvent::addId(const QString& id)
template <>
RoomEventPtr _impl::doMakeEvent(const QJsonObject& obj)
{
- return RoomEventPtr { makeIfMatches<RoomEvent,
- RoomMessageEvent, RoomNameEvent, RoomAliasesEvent,
- RoomCanonicalAliasEvent, RoomMemberEvent, RoomTopicEvent,
- RoomAvatarEvent, EncryptionEvent, RedactionEvent>
- (obj, obj["type"].toString()) };
-}
+ // Check more specific event types first
+ if (auto e = doMakeEvent<StateEventBase>(obj))
+ return ptrCast<RoomEvent>(move(e));
-StateEventBase::~StateEventBase() = default;
+ return makeIfMatches<RoomEvent,
+ RoomMessageEvent, RedactionEvent>(obj, obj["type"].toString());
+}
bool StateEventBase::repeatsState() const
{
@@ -176,3 +175,13 @@ bool StateEventBase::repeatsState() const
.toObject().value("prev_content");
return contentJson == prevContentJson;
}
+
+template<>
+StateEventPtr _impl::doMakeEvent<StateEventBase>(const QJsonObject& obj)
+{
+ return makeIfMatches<StateEventBase,
+ RoomNameEvent, RoomAliasesEvent,
+ RoomCanonicalAliasEvent, RoomMemberEvent, RoomTopicEvent,
+ RoomAvatarEvent, EncryptionEvent>(obj, obj["type"].toString());
+
+}
diff --git a/lib/events/event.h b/lib/events/event.h
index 396406f1..8449c2ec 100644
--- a/lib/events/event.h
+++ b/lib/events/event.h
@@ -53,7 +53,10 @@ namespace QMatrixClient
}
template <typename EventT>
- event_ptr_tt<EventT> doMakeEvent(const QJsonObject& obj);
+ inline event_ptr_tt<EventT> doMakeEvent(const QJsonObject& obj)
+ {
+ return create<EventT>(obj);
+ }
}
class Event
@@ -114,7 +117,7 @@ namespace QMatrixClient
* parameter type) and create an event object of that type.
*/
template <typename EventT>
- event_ptr_tt<EventT> makeEvent(const QJsonObject& obj)
+ inline event_ptr_tt<EventT> makeEvent(const QJsonObject& obj)
{
auto e = _impl::doMakeEvent<EventT>(obj);
if (!e)
@@ -128,50 +131,17 @@ namespace QMatrixClient
EventPtr doMakeEvent<Event>(const QJsonObject& obj);
}
- template <> struct FromJson<EventPtr>
+ template <typename EventT> struct FromJson<event_ptr_tt<EventT>>
{
- EventPtr operator()(const QJsonValue& jv) const
+ auto operator()(const QJsonValue& jv) const
{
- return makeEvent<Event>(jv.toObject());
+ return makeEvent<EventT>(jv.toObject());
}
};
- /**
- * \brief A vector of pointers to events with deserialisation capabilities
- *
- * This is a simple wrapper over a generic vector type that adds
- * a convenience method to deserialise events from QJsonArray.
- * \tparam EventT base type of all events in the vector
- */
template <typename EventT>
- class EventsBatch : public std::vector<event_ptr_tt<EventT>>
- {
- public:
- /**
- * \brief Deserialise events from an array
- *
- * Given the following JSON construct, creates events from
- * the array stored at key "node":
- * \code
- * "container": {
- * "node": [ { "event_id": "!evt1:srv.org", ... }, ... ]
- * }
- * \endcode
- * \param container - the wrapping JSON object
- * \param node - the key in container that holds the array of events
- */
- void fromJson(const QJsonObject& container, const QString& node)
- {
- const auto objs = container.value(node).toArray();
- using size_type = typename std::vector<event_ptr_tt<EventT>>::size_type;
- // The below line accommodates the difference in size types of
- // STL and Qt containers.
- this->reserve(static_cast<size_type>(objs.size()));
- for (const auto& objValue: objs)
- this->emplace_back(makeEvent<EventT>(objValue.toObject()));
- }
- };
- using Events = EventsBatch<Event>;
+ using EventsArray = std::vector<event_ptr_tt<EventT>>;
+ using Events = EventsArray<Event>;
class RedactionEvent;
@@ -231,8 +201,9 @@ namespace QMatrixClient
event_ptr_tt<RedactionEvent> _redactedBecause;
QString _txnId;
};
- using RoomEvents = EventsBatch<RoomEvent>;
using RoomEventPtr = event_ptr_tt<RoomEvent>;
+ using RoomEvents = EventsArray<RoomEvent>;
+ using RoomEventsRange = Range<RoomEvents>;
namespace _impl
{
@@ -240,29 +211,6 @@ namespace QMatrixClient
RoomEventPtr doMakeEvent<RoomEvent>(const QJsonObject& obj);
}
- /**
- * Conceptually similar to QStringView (but much more primitive), it's a
- * simple abstraction over a pair of RoomEvents::const_iterator values
- * referring to the beginning and the end of a range in a RoomEvents
- * container.
- */
- struct RoomEventsRange
- {
- RoomEvents::iterator from;
- RoomEvents::iterator to;
-
- RoomEvents::size_type size() const
- {
- Q_ASSERT(std::distance(from, to) >= 0);
- return RoomEvents::size_type(std::distance(from, to));
- }
- bool empty() const { return from == to; }
- RoomEvents::const_iterator begin() const { return from; }
- RoomEvents::const_iterator end() const { return to; }
- RoomEvents::iterator begin() { return from; }
- RoomEvents::iterator end() { return to; }
- };
-
class StateEventBase: public RoomEvent
{
public:
@@ -273,10 +221,18 @@ namespace QMatrixClient
explicit StateEventBase(Type type)
: RoomEvent(type)
{ }
- ~StateEventBase() override = 0;
+ ~StateEventBase() override = default;
virtual bool repeatsState() const;
};
+ using StateEventPtr = event_ptr_tt<StateEventBase>;
+ using StateEvents = EventsArray<StateEventBase>;
+
+ namespace _impl
+ {
+ template <>
+ StateEventPtr doMakeEvent<StateEventBase>(const QJsonObject& obj);
+ }
template <typename ContentT>
struct Prev
diff --git a/lib/events/receiptevent.cpp b/lib/events/receiptevent.cpp
index 7555db82..a12f4c05 100644
--- a/lib/events/receiptevent.cpp
+++ b/lib/events/receiptevent.cpp
@@ -43,7 +43,7 @@ using namespace QMatrixClient;
ReceiptEvent::ReceiptEvent(const QJsonObject& obj)
: Event(Type::Receipt, obj)
{
- Q_ASSERT(obj["type"].toString() == TypeId);
+ Q_ASSERT(obj["type"].toString() == typeId());
const QJsonObject contents = contentJson();
_eventsWithReceipts.reserve(contents.size());
diff --git a/lib/events/receiptevent.h b/lib/events/receiptevent.h
index 5b99ae3f..e1d2d1ec 100644
--- a/lib/events/receiptevent.h
+++ b/lib/events/receiptevent.h
@@ -42,7 +42,7 @@ namespace QMatrixClient
EventsWithReceipts eventsWithReceipts() const
{ return _eventsWithReceipts; }
- static constexpr const char* const TypeId = "m.receipt";
+ static constexpr const char* typeId() { return "m.receipt"; }
private:
EventsWithReceipts _eventsWithReceipts;
diff --git a/lib/events/redactionevent.h b/lib/events/redactionevent.h
index 829b9085..dad54788 100644
--- a/lib/events/redactionevent.h
+++ b/lib/events/redactionevent.h
@@ -25,7 +25,7 @@ namespace QMatrixClient
class RedactionEvent : public RoomEvent
{
public:
- static constexpr const char* const TypeId = "m.room.redaction";
+ static constexpr const char* typeId() { return "m.room.redaction"; }
explicit RedactionEvent(const QJsonObject& obj)
: RoomEvent(Type::Redaction, obj)
diff --git a/lib/events/roomavatarevent.h b/lib/events/roomavatarevent.h
index ccfe8fbf..0e44ad7c 100644
--- a/lib/events/roomavatarevent.h
+++ b/lib/events/roomavatarevent.h
@@ -37,7 +37,7 @@ namespace QMatrixClient
: StateEvent(Type::RoomAvatar, obj)
{ }
- static constexpr const char* TypeId = "m.room.avatar";
+ static constexpr const char* typeId() { return "m.room.avatar"; }
};
} // namespace QMatrixClient
diff --git a/lib/events/roommemberevent.h b/lib/events/roommemberevent.h
index 89b970c9..8e0cc0a4 100644
--- a/lib/events/roommemberevent.h
+++ b/lib/events/roommemberevent.h
@@ -52,16 +52,18 @@ namespace QMatrixClient
{
Q_GADGET
public:
- static constexpr const char* TypeId = "m.room.member";
+ static constexpr const char* typeId() { return "m.room.member"; }
using MembershipType = MemberEventContent::MembershipType;
+ explicit RoomMemberEvent(Type type, const QJsonObject& obj)
+ : StateEvent(type, obj)
+ { }
RoomMemberEvent(MemberEventContent&& c)
: StateEvent(Type::RoomMember, c)
{ }
explicit RoomMemberEvent(const QJsonObject& obj)
- : StateEvent(Type::RoomMember, obj)
-// , _userId(obj["state_key"].toString())
+ : RoomMemberEvent(Type::RoomMember, obj)
{ }
MembershipType membership() const { return content().membership; }
@@ -72,7 +74,6 @@ namespace QMatrixClient
QUrl avatarUrl() const { return content().avatarUrl; }
private:
-// QString _userId;
REGISTER_ENUM(MembershipType)
};
} // namespace QMatrixClient
diff --git a/lib/events/roommessageevent.h b/lib/events/roommessageevent.h
index a55564ed..dc734b6e 100644
--- a/lib/events/roommessageevent.h
+++ b/lib/events/roommessageevent.h
@@ -65,7 +65,7 @@ namespace QMatrixClient
QJsonObject toJson() const;
- static constexpr const char* TypeId = "m.room.message";
+ static constexpr const char* typeId() { return "m.room.message"; }
private:
QString _msgtype;
diff --git a/lib/events/simplestateevents.h b/lib/events/simplestateevents.h
index 6b0cd51a..d9f403e8 100644
--- a/lib/events/simplestateevents.h
+++ b/lib/events/simplestateevents.h
@@ -28,7 +28,7 @@ namespace QMatrixClient
: public StateEvent<EventContent::SimpleContent<_ContentType>> \
{ \
public: \
- static constexpr const char* TypeId = _TypeId; \
+ static constexpr const char* typeId() { return _TypeId; } \
explicit _Name(const QJsonObject& obj) \
: StateEvent(_EnumType, obj, QStringLiteral(#_ContentKey)) \
{ } \
diff --git a/lib/events/typingevent.h b/lib/events/typingevent.h
index 8c9551a4..6ccbc1c8 100644
--- a/lib/events/typingevent.h
+++ b/lib/events/typingevent.h
@@ -27,7 +27,7 @@ namespace QMatrixClient
class TypingEvent: public Event
{
public:
- static constexpr const char* const TypeId = "m.typing";
+ static constexpr const char* typeId() { return "m.typing"; }
TypingEvent(const QJsonObject& obj);