aboutsummaryrefslogtreecommitdiff
path: root/events/simplestateevents.h
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/simplestateevents.h
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/simplestateevents.h')
-rw-r--r--events/simplestateevents.h54
1 files changed, 54 insertions, 0 deletions
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