aboutsummaryrefslogtreecommitdiff
path: root/events
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2017-11-01 18:19:56 +0300
committerKitsune Ral <Kitsune-Ral@users.sf.net>2017-11-01 18:19:56 +0300
commita275ef911b3f4d0334df0628324aee0081dd3a65 (patch)
tree87d9b2bbbc67ceeb9c39d5c09f242b1776de8460 /events
parent64c0b7e045d9e8d58d91f252219a5579d4ba9441 (diff)
downloadlibquotient-a275ef911b3f4d0334df0628324aee0081dd3a65.tar.gz
libquotient-a275ef911b3f4d0334df0628324aee0081dd3a65.zip
StateEvent; EventContent::SimpleContent; event types refactoring
* StateEvent<> is a new class template for all state events. It provides a uniform interface to the state content, as well as a means to serialize the content back to JSON. In addition, StateEvent now parses the "prev_content" JSON object, so one can refer to the previous state now (a notable step to proper reflection of state changes in the displayed timeline in clients). * EventContent::SimpleContent, together with StateEvent<>, forms a generalisation for simple state events, such as room name, topic, aliases etc. that boil down to a single key-value pair. DECLARE_SIMPLE_STATE_EVENT is a macro defined to streamline creation of events based on SimpleContent, providing API back-compatibility for events defined so far. As a result, a very concise simplestateevents.h replaces all those room*event.* files. * Event/RoomEvent::fromJson() code is squeezed down to plain type lists passed to makeIfMatches() "chained factory" function template. TypeId is mandatory for an event type to be included into that factory. * Event::toTimestamp() and Event::toStringList are completely superseded by respective fromJson<>() converters.
Diffstat (limited to 'events')
-rw-r--r--events/encryptedevent.cpp5
-rw-r--r--events/encryptedevent.h39
-rw-r--r--events/event.cpp61
-rw-r--r--events/event.h53
-rw-r--r--events/eventcontent.h31
-rw-r--r--events/roomaliasesevent.cpp43
-rw-r--r--events/roomaliasesevent.h37
-rw-r--r--events/roomavatarevent.h22
-rw-r--r--events/roomcanonicalaliasevent.cpp21
-rw-r--r--events/roomcanonicalaliasevent.h38
-rw-r--r--events/roomnameevent.cpp22
-rw-r--r--events/roomnameevent.h38
-rw-r--r--events/roomtopicevent.cpp22
-rw-r--r--events/roomtopicevent.h50
-rw-r--r--events/simplestateevents.h54
15 files changed, 148 insertions, 388 deletions
diff --git a/events/encryptedevent.cpp b/events/encryptedevent.cpp
deleted file mode 100644
index 90e77c36..00000000
--- a/events/encryptedevent.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-//
-// Created by rusakov on 26/09/2017.
-//
-
-#include "encryptedevent.h"
diff --git a/events/encryptedevent.h b/events/encryptedevent.h
deleted file mode 100644
index 9db462e1..00000000
--- a/events/encryptedevent.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2017 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 "event.h"
-
-namespace QMatrixClient
-{
- class EncryptionEvent : public RoomEvent
- {
- public:
- explicit EncryptionEvent(const QJsonObject& obj)
- : RoomEvent(Type::RoomEncryption, obj)
- , _algorithm(contentJson()["algorithm"].toString())
- { }
-
- QString algorithm() const { return _algorithm; }
-
- private:
- QString _algorithm;
- };
-} // namespace QMatrixClient
-
diff --git a/events/event.cpp b/events/event.cpp
index 9963a0ef..44b742c1 100644
--- a/events/event.cpp
+++ b/events/event.cpp
@@ -19,15 +19,11 @@
#include "event.h"
#include "roommessageevent.h"
-#include "roomnameevent.h"
-#include "roomaliasesevent.h"
-#include "roomcanonicalaliasevent.h"
+#include "simplestateevents.h"
#include "roommemberevent.h"
-#include "roomtopicevent.h"
#include "roomavatarevent.h"
#include "typingevent.h"
#include "receiptevent.h"
-#include "encryptedevent.h"
#include "logging.h"
#include <QtCore/QJsonDocument>
@@ -54,32 +50,24 @@ QJsonObject Event::originalJsonObject() const
return _originalJson;
}
-QDateTime Event::toTimestamp(const QJsonValue& v)
+const QJsonObject Event::contentJson() const
{
- Q_ASSERT(v.isDouble() || v.isNull() || v.isUndefined());
- return QDateTime::fromMSecsSinceEpoch(
- static_cast<long long int>(v.toDouble()), Qt::UTC);
+ return _originalJson["content"].toObject();
}
-QStringList Event::toStringList(const QJsonValue& v)
+template <typename BaseEventT>
+inline BaseEventT* makeIfMatches(const QJsonObject&, const QString&)
{
- Q_ASSERT(v.isArray() || v.isNull() || v.isUndefined());
-
- QStringList l;
- for( const QJsonValue& e : v.toArray() )
- l.push_back(e.toString());
- return l;
+ return nullptr;
}
-const QJsonObject Event::contentJson() const
+template <typename BaseEventT, typename EventT, typename... EventTs>
+inline BaseEventT* makeIfMatches(const QJsonObject& o, const QString& selector)
{
- return _originalJson["content"].toObject();
-}
+ if (selector == EventT::TypeId)
+ return new EventT(o);
-template <typename EventT>
-EventT* make(const QJsonObject& o)
-{
- return new EventT(o);
+ return makeIfMatches<BaseEventT, EventTs...>(o, selector);
}
Event* Event::fromJson(const QJsonObject& obj)
@@ -88,17 +76,14 @@ Event* Event::fromJson(const QJsonObject& obj)
if (auto e = RoomEvent::fromJson(obj))
return e;
- return dispatch<Event*>(obj).to(obj["type"].toString(),
- "m.typing", make<TypingEvent>,
- "m.receipt", make<ReceiptEvent>,
- /* Insert new event types (except room events) BEFORE this line */
- nullptr
- );
+ return makeIfMatches<Event,
+ TypingEvent, ReceiptEvent>(obj, obj["type"].toString());
}
RoomEvent::RoomEvent(Type type, const QJsonObject& rep)
: Event(type, rep), _id(rep["event_id"].toString())
- , _serverTimestamp(toTimestamp(rep["origin_server_ts"]))
+ , _serverTimestamp(
+ QMatrixClient::fromJson<QDateTime>(rep["origin_server_ts"]))
, _roomId(rep["room_id"].toString())
, _senderId(rep["sender"].toString())
, _txnId(rep["unsigned"].toObject().value("transactionId").toString())
@@ -130,16 +115,8 @@ void RoomEvent::addId(const QString& id)
RoomEvent* RoomEvent::fromJson(const QJsonObject& obj)
{
- return dispatch<RoomEvent*>(obj).to(obj["type"].toString(),
- "m.room.message", make<RoomMessageEvent>,
- "m.room.name", make<RoomNameEvent>,
- "m.room.aliases", make<RoomAliasesEvent>,
- "m.room.canonical_alias", make<RoomCanonicalAliasEvent>,
- "m.room.member", make<RoomMemberEvent>,
- "m.room.topic", make<RoomTopicEvent>,
- "m.room.avatar", make<RoomAvatarEvent>,
- "m.room.encryption", make<EncryptionEvent>,
- /* Insert new ROOM event types BEFORE this line */
- nullptr
- );
+ return makeIfMatches<RoomEvent,
+ RoomMessageEvent, RoomNameEvent, RoomAliasesEvent,
+ RoomCanonicalAliasEvent, RoomMemberEvent, RoomTopicEvent,
+ RoomAvatarEvent, EncryptionEvent>(obj, obj["type"].toString());
}
diff --git a/events/event.h b/events/event.h
index c151ac0e..020ef54b 100644
--- a/events/event.h
+++ b/events/event.h
@@ -56,9 +56,6 @@ namespace QMatrixClient
static Event* fromJson(const QJsonObject& obj);
protected:
- static QDateTime toTimestamp(const QJsonValue& v);
- static QStringList toStringList(const QJsonValue& v);
-
const QJsonObject contentJson() const;
private:
@@ -74,25 +71,20 @@ namespace QMatrixClient
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)
+ inline 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()));
+ for (auto objValue: objs)
+ {
+ const auto o = objValue.toObject();
+ auto e = BaseEventT::fromJson(o);
+ evs.push_back(e ? e : new BaseEventT(EventType::Unknown, o));
+ }
return evs;
}
@@ -147,6 +139,37 @@ namespace QMatrixClient
QString _txnId;
};
using RoomEvents = EventsBatch<RoomEvent>;
+
+ template <typename ContentT>
+ class StateEvent: public RoomEvent
+ {
+ public:
+ using content_type = ContentT;
+
+ template <typename... ContentParamTs>
+ explicit StateEvent(Type type, const QJsonObject& obj,
+ ContentParamTs&&... contentParams)
+ : RoomEvent(type, obj)
+ , _content(contentJson(),
+ std::forward<ContentParamTs>(contentParams)...)
+ , _prev(new ContentT(obj["prev_content"].toObject(),
+ std::forward<ContentParamTs>(contentParams)...))
+ { }
+ template <typename... ContentParamTs>
+ explicit StateEvent(Type type, ContentParamTs&&... contentParams)
+ : RoomEvent(type)
+ , _content(std::forward<ContentParamTs>(contentParams)...)
+ { }
+
+ QJsonObject toJson() const { return _content.toJson(); }
+
+ ContentT content() const { return _content; }
+ ContentT* prev_content() const { return _prev.data(); }
+
+ protected:
+ ContentT _content;
+ QScopedPointer<ContentT> _prev;
+ };
} // namespace QMatrixClient
Q_DECLARE_OPAQUE_POINTER(QMatrixClient::Event*)
Q_DECLARE_METATYPE(QMatrixClient::Event*)
diff --git a/events/eventcontent.h b/events/eventcontent.h
index f9cdaf11..60437995 100644
--- a/events/eventcontent.h
+++ b/events/eventcontent.h
@@ -21,6 +21,8 @@
// This file contains generic event content definitions, applicable to room
// message events as well as other events (e.g., avatars).
+#include "converters.h"
+
#include <QtCore/QJsonObject>
#include <QtCore/QMimeType>
#include <QtCore/QUrl>
@@ -60,6 +62,35 @@ namespace QMatrixClient
virtual QMimeType type() const = 0;
};
+ template <typename T = QString>
+ class SimpleContent: public Base
+ {
+ 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(QMatrixClient::fromJson<T>(json[keyName]))
+ , key(std::move(keyName))
+ { }
+
+ T value;
+
+ protected:
+ QString key;
+
+ private:
+ void fillJson(QJsonObject* json) const override
+ {
+ Q_ASSERT(json);
+ json->insert(key, QMatrixClient::toJson(value));
+ }
+ };
+
/**
* A base class for content types that have an "info" object in their
* JSON representation
diff --git a/events/roomaliasesevent.cpp b/events/roomaliasesevent.cpp
deleted file mode 100644
index 344b4367..00000000
--- a/events/roomaliasesevent.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Felix Rohrbach <kde@fxrh.de>
- *
- * 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
- */
-
-// Example of a RoomAliases Event:
-//
-// {
-// "age":3758857346,
-// "content":{
-// "aliases":["#freenode_#testest376:matrix.org"]
-// },
-// "event_id":"$1439989428122drFjY:matrix.org",
-// "origin_server_ts":1439989428910,
-// "replaces_state":"$143613875199223YYPrN:matrix.org",
-// "room_id":"!UoqtanuuSGTMvNRfDG:matrix.org",
-// "state_key":"matrix.org",
-// "type":"m.room.aliases",
-// "user_id":"@appservice-irc:matrix.org"
-// }
-
-#include "roomaliasesevent.h"
-
-using namespace QMatrixClient;
-
-RoomAliasesEvent::RoomAliasesEvent(const QJsonObject& obj)
- : RoomEvent(Type::RoomAliases, obj)
- , _aliases(toStringList(contentJson()["aliases"]))
-{ }
-
diff --git a/events/roomaliasesevent.h b/events/roomaliasesevent.h
deleted file mode 100644
index efafcb30..00000000
--- a/events/roomaliasesevent.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Felix Rohrbach <kde@fxrh.de>
- *
- * 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 "event.h"
-
-#include <QtCore/QStringList>
-
-namespace QMatrixClient
-{
- class RoomAliasesEvent: public RoomEvent
- {
- public:
- explicit RoomAliasesEvent(const QJsonObject& obj);
-
- QStringList aliases() const { return _aliases; }
-
- private:
- QStringList _aliases;
- };
-} // namespace QMatrixClient
diff --git a/events/roomavatarevent.h b/events/roomavatarevent.h
index 411de4e8..ccfe8fbf 100644
--- a/events/roomavatarevent.h
+++ b/events/roomavatarevent.h
@@ -26,28 +26,18 @@
namespace QMatrixClient
{
- class RoomAvatarEvent: public RoomEvent
+ 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:
- explicit RoomAvatarEvent(EventContent::ImageContent avatar)
- : RoomEvent(Type::RoomAvatar), _avatar(std::move(avatar))
- { }
explicit RoomAvatarEvent(const QJsonObject& obj)
- : RoomEvent(Type::RoomAvatar, obj), _avatar(contentJson())
+ : StateEvent(Type::RoomAvatar, obj)
{ }
- const EventContent::ImageContent& content() const { return _avatar; }
-
- QJsonObject toJson() const { return _avatar.toJson(); }
-
static constexpr const char* TypeId = "m.room.avatar";
-
- private:
- // 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.
- EventContent::ImageContent _avatar;
};
} // namespace QMatrixClient
diff --git a/events/roomcanonicalaliasevent.cpp b/events/roomcanonicalaliasevent.cpp
deleted file mode 100644
index 6884bc15..00000000
--- a/events/roomcanonicalaliasevent.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2016 Felix Rohrbach <kde@fxrh.de>
- *
- * 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 "roomcanonicalaliasevent.h"
-
-using namespace QMatrixClient;
diff --git a/events/roomcanonicalaliasevent.h b/events/roomcanonicalaliasevent.h
deleted file mode 100644
index 72620d74..00000000
--- a/events/roomcanonicalaliasevent.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2016 Felix Rohrbach <kde@fxrh.de>
- *
- * 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 "event.h"
-
-namespace QMatrixClient
-{
- class RoomCanonicalAliasEvent : public RoomEvent
- {
- public:
- explicit RoomCanonicalAliasEvent(const QJsonObject& obj)
- : RoomEvent(Type::RoomCanonicalAlias, obj)
- , _canonicalAlias(contentJson()["alias"].toString())
- { }
-
- QString alias() const { return _canonicalAlias; }
-
- private:
- QString _canonicalAlias;
- };
-} // namespace QMatrixClient
diff --git a/events/roomnameevent.cpp b/events/roomnameevent.cpp
deleted file mode 100644
index c202d17a..00000000
--- a/events/roomnameevent.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 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 "roomnameevent.h"
-
-using namespace QMatrixClient;
-
diff --git a/events/roomnameevent.h b/events/roomnameevent.h
deleted file mode 100644
index bb823933..00000000
--- a/events/roomnameevent.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 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 "event.h"
-
-namespace QMatrixClient
-{
- class RoomNameEvent : public RoomEvent
- {
- public:
- explicit RoomNameEvent(const QJsonObject& obj)
- : RoomEvent(Type::RoomName, obj)
- , _name(contentJson()["name"].toString())
- { }
-
- QString name() const { return _name; }
-
- private:
- QString _name{};
- };
-} // namespace QMatrixClient
diff --git a/events/roomtopicevent.cpp b/events/roomtopicevent.cpp
deleted file mode 100644
index 26677e78..00000000
--- a/events/roomtopicevent.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Felix Rohrbach <kde@fxrh.de>
- *
- * 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 "roomtopicevent.h"
-
-using namespace QMatrixClient;
-
diff --git a/events/roomtopicevent.h b/events/roomtopicevent.h
deleted file mode 100644
index 95ad0e04..00000000
--- a/events/roomtopicevent.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/******************************************************************************
- * Copyright (C) 2015 Felix Rohrbach <kde@fxrh.de>
- *
- * 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 "event.h"
-
-namespace QMatrixClient
-{
- class RoomTopicEvent: public RoomEvent
- {
- public:
- explicit RoomTopicEvent(const QString& topic)
- : RoomEvent(Type::RoomTopic), _topic(topic)
- { }
- explicit RoomTopicEvent(const QJsonObject& obj)
- : RoomEvent(Type::RoomTopic, obj)
- , _topic(contentJson()["topic"].toString())
- { }
-
- QString topic() const { return _topic; }
-
- QJsonObject toJson() const
- {
- QJsonObject obj;
- obj.insert("topic", _topic);
- return obj;
- }
-
- static constexpr const char* TypeId = "m.room.topic";
-
- private:
- QString _topic;
- };
-} // namespace QMatrixClient
diff --git a/events/simplestateevents.h b/events/simplestateevents.h
new file mode 100644
index 00000000..d5841bdc
--- /dev/null
+++ b/events/simplestateevents.h
@@ -0,0 +1,54 @@
+/******************************************************************************
+ * Copyright (C) 2017 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 "event.h"
+
+#include "eventcontent.h"
+
+namespace QMatrixClient
+{
+#define DECLARE_SIMPLE_STATE_EVENT(_Name, _TypeId, _EnumType, _ContentType, _ContentKey) \
+ class _Name \
+ : public StateEvent<EventContent::SimpleContent<_ContentType>> \
+ { \
+ public: \
+ static constexpr const char* TypeId = _TypeId; \
+ explicit _Name(const QJsonObject& obj) \
+ : StateEvent(_EnumType, obj, #_ContentKey) \
+ { } \
+ template <typename T> \
+ explicit _Name(T&& value) \
+ : StateEvent(_EnumType, #_ContentKey, \
+ std::forward<T>(value)) \
+ { } \
+ _ContentType _ContentKey() const { return content().value; } \
+ };
+
+ DECLARE_SIMPLE_STATE_EVENT(RoomNameEvent, "m.room.name",
+ Event::Type::RoomName, QString, name)
+ DECLARE_SIMPLE_STATE_EVENT(RoomAliasesEvent, "m.room.aliases",
+ Event::Type::RoomAliases, QStringList, aliases)
+ DECLARE_SIMPLE_STATE_EVENT(RoomCanonicalAliasEvent, "m.room.canonical_alias",
+ Event::Type::RoomCanonicalAlias, QString, alias)
+ DECLARE_SIMPLE_STATE_EVENT(RoomTopicEvent, "m.room.topic",
+ Event::Type::RoomTopic, QString, topic)
+ DECLARE_SIMPLE_STATE_EVENT(EncryptionEvent, "m.room.encryption",
+ Event::Type::RoomEncryption, QString, algorithm)
+} // namespace QMatrixClient