aboutsummaryrefslogtreecommitdiff
path: root/lib/events
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2018-12-14 23:32:16 +0900
committerGitHub <noreply@github.com>2018-12-14 23:32:16 +0900
commitfcc8d2ca615fce6e42bf1cf6585d60f94a2db926 (patch)
treeb0dd17b632a5c5775f2221fd0b53b21a8c02ce58 /lib/events
parent50571a92b4e9f634c4daf546222fa082120db6c7 (diff)
parent12a0b95fdcfea15cd0ef313aec8868656629b986 (diff)
downloadlibquotient-fcc8d2ca615fce6e42bf1cf6585d60f94a2db926.tar.gz
libquotient-fcc8d2ca615fce6e42bf1cf6585d60f94a2db926.zip
Merge pull request #263 from QMatrixClient/kitsune-lazy-loading
Lazy loading members
Diffstat (limited to 'lib/events')
-rw-r--r--lib/events/accountdataevents.h35
-rw-r--r--lib/events/eventcontent.h3
-rw-r--r--lib/events/eventloader.h10
-rw-r--r--lib/events/roommemberevent.cpp12
-rw-r--r--lib/events/roommemberevent.h24
5 files changed, 54 insertions, 30 deletions
diff --git a/lib/events/accountdataevents.h b/lib/events/accountdataevents.h
index d1c1abc8..a99d85ac 100644
--- a/lib/events/accountdataevents.h
+++ b/lib/events/accountdataevents.h
@@ -36,37 +36,38 @@ namespace QMatrixClient
order_type order;
TagRecord (order_type order = none) : order(order) { }
- explicit TagRecord(const QJsonObject& jo)
+
+ 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>
+ {
+ 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())
- order = fromJson<float>(orderJv);
- else if (orderJv.isString())
+ rec.order = fromJson<float>(orderJv);
+ if (orderJv.isString())
{
bool ok;
- order = orderJv.toString().toFloat(&ok);
+ rec.order = orderJv.toString().toFloat(&ok);
if (!ok)
- order = none;
+ rec.order = none;
}
}
-
- bool operator<(const TagRecord& other) const
+ static void dumpTo(QJsonObject& jo, const TagRecord& rec)
{
- // Per The Spec, rooms with no order should be after those with order
- return !order.omitted() &&
- (other.order.omitted() || order.value() < other.order.value());
+ addParam<IfNotEmpty>(jo, QStringLiteral("order"), rec.order);
}
};
- inline QJsonValue toJson(const TagRecord& rec)
- {
- QJsonObject o;
- addParam<IfNotEmpty>(o, QStringLiteral("order"), rec.order);
- return o;
- }
-
using TagsMap = QHash<QString, TagRecord>;
#define DEFINE_SIMPLE_EVENT(_Name, _TypeId, _ContentType, _ContentKey) \
diff --git a/lib/events/eventcontent.h b/lib/events/eventcontent.h
index 91d7a8c8..bedf0078 100644
--- a/lib/events/eventcontent.h
+++ b/lib/events/eventcontent.h
@@ -43,9 +43,10 @@ namespace QMatrixClient
class Base
{
public:
- explicit Base (const QJsonObject& o = {}) : originalJson(o) { }
+ explicit Base (QJsonObject o = {}) : originalJson(std::move(o)) { }
virtual ~Base() = default;
+ // FIXME: make toJson() from converters.* work on base classes
QJsonObject toJson() const;
public:
diff --git a/lib/events/eventloader.h b/lib/events/eventloader.h
index cd2f9149..da663392 100644
--- a/lib/events/eventloader.h
+++ b/lib/events/eventloader.h
@@ -57,11 +57,15 @@ namespace QMatrixClient {
matrixType);
}
- template <typename EventT> struct FromJsonObject<event_ptr_tt<EventT>>
+ template <typename EventT> struct JsonConverter<event_ptr_tt<EventT>>
{
- auto operator()(const QJsonObject& jo) const
+ static auto load(const QJsonValue& jv)
{
- return loadEvent<EventT>(jo);
+ return loadEvent<EventT>(jv.toObject());
+ }
+ static auto load(const QJsonDocument& jd)
+ {
+ return loadEvent<EventT>(jd.object());
}
};
} // namespace QMatrixClient
diff --git a/lib/events/roommemberevent.cpp b/lib/events/roommemberevent.cpp
index eaa3302c..a5ac3c5f 100644
--- a/lib/events/roommemberevent.cpp
+++ b/lib/events/roommemberevent.cpp
@@ -23,20 +23,17 @@
#include <array>
-using namespace QMatrixClient;
-
static const std::array<QString, 5> membershipStrings = { {
QStringLiteral("invite"), QStringLiteral("join"),
QStringLiteral("knock"), QStringLiteral("leave"),
QStringLiteral("ban")
} };
-namespace QMatrixClient
-{
+namespace QMatrixClient {
template <>
- struct FromJson<MembershipType>
+ struct JsonConverter<MembershipType>
{
- MembershipType operator()(const QJsonValue& jv) const
+ static MembershipType load(const QJsonValue& jv)
{
const auto& membershipString = jv.toString();
for (auto it = membershipStrings.begin();
@@ -48,9 +45,10 @@ namespace QMatrixClient
return MembershipType::Undefined;
}
};
-
}
+using namespace QMatrixClient;
+
MemberEventContent::MemberEventContent(const QJsonObject& json)
: membership(fromJson<MembershipType>(json["membership"_ls]))
, isDirect(json["is_direct"_ls].toBool())
diff --git a/lib/events/roommemberevent.h b/lib/events/roommemberevent.h
index 149d74f8..b8224033 100644
--- a/lib/events/roommemberevent.h
+++ b/lib/events/roommemberevent.h
@@ -60,8 +60,16 @@ namespace QMatrixClient
: StateEvent(typeId(), matrixTypeId(), c)
{ }
- // This is a special constructor enabling RoomMemberEvent to be
- // a base class for more specific member events.
+ /// 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)
{ }
@@ -81,6 +89,18 @@ namespace QMatrixClient
private:
REGISTER_ENUM(MembershipType)
};
+
+ template <>
+ class EventFactory<RoomMemberEvent>
+ {
+ public:
+ static event_ptr_tt<RoomMemberEvent> make(const QJsonObject& json,
+ const QString&)
+ {
+ return makeEvent<RoomMemberEvent>(json);
+ }
+ };
+
REGISTER_EVENT_TYPE(RoomMemberEvent)
DEFINE_EVENTTYPE_ALIAS(RoomMember, RoomMemberEvent)
} // namespace QMatrixClient