diff options
author | Kitsune Ral <Kitsune-Ral@users.sf.net> | 2018-05-05 19:36:15 +0900 |
---|---|---|
committer | Kitsune Ral <Kitsune-Ral@users.sf.net> | 2018-05-05 19:36:15 +0900 |
commit | a8d2a73c771f188fc0fdc6351b4923af788317d5 (patch) | |
tree | b2795b93149f7c0ae3cd5005331b650a8eb6fd1e /lib/events | |
parent | da16225dfbec9b155c2c299757203f7676ac6ccf (diff) | |
parent | a63838235134b066c092ad98e1f18ff7991c91c1 (diff) | |
download | libquotient-a8d2a73c771f188fc0fdc6351b4923af788317d5.tar.gz libquotient-a8d2a73c771f188fc0fdc6351b4923af788317d5.zip |
Merge branch 'kitsune-gtad'
Diffstat (limited to 'lib/events')
-rw-r--r-- | lib/events/accountdataevents.h | 3 | ||||
-rw-r--r-- | lib/events/directchatevent.h | 2 | ||||
-rw-r--r-- | lib/events/event.cpp | 25 | ||||
-rw-r--r-- | lib/events/event.h | 86 | ||||
-rw-r--r-- | lib/events/receiptevent.cpp | 2 | ||||
-rw-r--r-- | lib/events/receiptevent.h | 2 | ||||
-rw-r--r-- | lib/events/redactionevent.h | 2 | ||||
-rw-r--r-- | lib/events/roomavatarevent.h | 2 | ||||
-rw-r--r-- | lib/events/roommemberevent.h | 9 | ||||
-rw-r--r-- | lib/events/roommessageevent.h | 2 | ||||
-rw-r--r-- | lib/events/simplestateevents.h | 2 | ||||
-rw-r--r-- | lib/events/typingevent.h | 2 |
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); |