aboutsummaryrefslogtreecommitdiff
path: root/events/event.h
diff options
context:
space:
mode:
Diffstat (limited to 'events/event.h')
-rw-r--r--events/event.h103
1 files changed, 76 insertions, 27 deletions
diff --git a/events/event.h b/events/event.h
index f60dfb64..fd2f6feb 100644
--- a/events/event.h
+++ b/events/event.h
@@ -21,43 +21,92 @@
#include <QtCore/QString>
#include <QtCore/QDateTime>
#include <QtCore/QJsonObject>
-#include <QtCore/QVector>
+#include <QtCore/QJsonArray>
-class QJsonArray;
+#include "util.h"
namespace QMatrixClient
{
- enum class EventType
- {
- RoomMessage, RoomName, RoomAliases, RoomCanonicalAlias,
- RoomMember, RoomTopic, Typing, Receipt, Unknown
- };
-
class Event
{
+ Q_GADGET
public:
- explicit Event(EventType type);
- Event(Event&) = delete;
- virtual ~Event();
-
- EventType type() const;
- QString id() const;
- QDateTime timestamp() const;
- QString roomId() const;
- QString senderId() const;
- // only for debug purposes!
- QString originalJson() const;
+ enum class Type
+ {
+ RoomMessage, RoomName, RoomAliases, RoomCanonicalAlias,
+ RoomMember, RoomTopic, Typing, Receipt, Unknown
+ };
+
+ explicit Event(Type type, const QJsonObject& rep);
+ Event(const Event&) = delete;
+
+ Type type() const { return _type; }
+ QByteArray originalJson() const;
+
+ // Every event also has a "content" object but since its structure is
+ // different for different types, we're implementing it per-event type
+ // (and in most cases it will be a combination of other fields
+ // instead of "content" field).
static Event* fromJson(const QJsonObject& obj);
-
+
protected:
- bool parseJson(const QJsonObject& obj);
-
+ static QDateTime toTimestamp(const QJsonValue& v);
+ static QStringList toStringList(const QJsonValue& v);
+
+ const QJsonObject contentJson() const;
+
private:
- class Private;
- Private* d;
+ Type _type;
+ QJsonObject _originalJson;
+
+ REGISTER_ENUM(Type)
};
- using Events = QVector<Event*>;
+ using EventType = Event::Type;
+ template <typename EventT>
+ using EventsBatch = std::vector<EventT*>;
+ using Events = EventsBatch<Event>;
+
+ template <typename BaseEventT>
+ BaseEventT* makeEvent(const QJsonObject& obj)
+ {
+ if (auto e = BaseEventT::fromJson(obj))
+ return e;
+
+ return new BaseEventT(EventType::Unknown, obj);
+ }
+
+ template <typename BaseEventT = Event,
+ typename BatchT = EventsBatch<BaseEventT> >
+ BatchT makeEvents(const QJsonArray& objs)
+ {
+ BatchT evs;
+ // The below line accommodates the difference in size types of
+ // STL and Qt containers.
+ evs.reserve(static_cast<typename BatchT::size_type>(objs.size()));
+ for (auto obj: objs)
+ evs.push_back(makeEvent<BaseEventT>(obj.toObject()));
+ return evs;
+ }
- Events eventsFromJson(const QJsonArray& json);
-}
+ class RoomEvent : public Event
+ {
+ public:
+ RoomEvent(Type type, const QJsonObject& rep);
+
+ const QString& id() const { return _id; }
+ const QDateTime& timestamp() const { return _serverTimestamp; }
+ const QString& roomId() const { return _roomId; }
+ const QString& senderId() const { return _senderId; }
+
+ // "Static override" of the one in Event
+ static RoomEvent* fromJson(const QJsonObject& obj);
+
+ private:
+ QString _id;
+ QDateTime _serverTimestamp;
+ QString _roomId;
+ QString _senderId;
+ };
+ using RoomEvents = EventsBatch<RoomEvent>;
+} // namespace QMatrixClient