aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt5
-rw-r--r--autotests/callcandidateseventtest.cpp2
-rw-r--r--lib/eventitem.h5
-rw-r--r--lib/events/callanswerevent.cpp34
-rw-r--r--lib/events/callanswerevent.h24
-rw-r--r--lib/events/callcandidatesevent.h27
-rw-r--r--lib/events/callevents.cpp82
-rw-r--r--lib/events/callevents.h99
-rw-r--r--lib/events/callhangupevent.h17
-rw-r--r--lib/events/callinviteevent.cpp37
-rw-r--r--lib/events/callinviteevent.h26
-rw-r--r--lib/events/event.cpp3
-rw-r--r--lib/events/event.h8
-rw-r--r--lib/events/roomevent.cpp16
-rw-r--r--lib/events/roomevent.h25
-rw-r--r--lib/room.cpp7
16 files changed, 194 insertions, 223 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d4cf52d0..1c4d9545 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -158,10 +158,7 @@ list(APPEND lib_SRCS
lib/events/accountdataevents.h
lib/events/receiptevent.h lib/events/receiptevent.cpp
lib/events/reactionevent.h
- lib/events/callinviteevent.h lib/events/callinviteevent.cpp
- lib/events/callcandidatesevent.h
- lib/events/callanswerevent.h lib/events/callanswerevent.cpp
- lib/events/callhangupevent.h
+ lib/events/callevents.h lib/events/callevents.cpp
lib/events/directchatevent.h lib/events/directchatevent.cpp
lib/events/encryptionevent.h lib/events/encryptionevent.cpp
lib/events/encryptedevent.h lib/events/encryptedevent.cpp
diff --git a/autotests/callcandidateseventtest.cpp b/autotests/callcandidateseventtest.cpp
index 0d5a543b..b37dd109 100644
--- a/autotests/callcandidateseventtest.cpp
+++ b/autotests/callcandidateseventtest.cpp
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: LGPL-2.1-or-later
-#include "events/callcandidatesevent.h"
+#include "events/callevents.h"
#include <QtTest/QtTest>
diff --git a/lib/eventitem.h b/lib/eventitem.h
index 90d9f458..2e55a724 100644
--- a/lib/eventitem.h
+++ b/lib/eventitem.h
@@ -5,6 +5,7 @@
#include "quotient_common.h"
+#include "events/callevents.h"
#include "events/filesourceinfo.h"
#include "events/stateevent.h"
@@ -101,9 +102,9 @@ inline const StateEventBase* EventItemBase::viewAs<StateEventBase>() const
}
template <>
-inline const CallEventBase* EventItemBase::viewAs<CallEventBase>() const
+inline const CallEvent* EventItemBase::viewAs<CallEvent>() const
{
- return evt->isCallEvent() ? weakPtrCast<const CallEventBase>(evt) : nullptr;
+ return evt->is<CallEvent>() ? weakPtrCast<const CallEvent>(evt) : nullptr;
}
class QUOTIENT_API PendingEventItem : public EventItemBase {
diff --git a/lib/events/callanswerevent.cpp b/lib/events/callanswerevent.cpp
deleted file mode 100644
index 89dcd7fd..00000000
--- a/lib/events/callanswerevent.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-// SPDX-FileCopyrightText: 2017 Marius Gripsgard <marius@ubports.com>
-// SPDX-FileCopyrightText: 2018 Josip Delic <delijati@googlemail.com>
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#include "callanswerevent.h"
-
-/*
-m.call.answer
-{
- "age": 242352,
- "content": {
- "answer": {
- "sdp": "v=0\r\no=- 6584580628695956864 2 IN IP4 127.0.0.1[...]",
- "type": "answer"
- },
- "call_id": "12345",
- "version": 0
- },
- "event_id": "$WLGTSEFSEF:localhost",
- "origin_server_ts": 1431961217939,
- "room_id": "!Cuyf34gef24t:localhost",
- "sender": "@example:localhost",
- "type": "m.call.answer"
-}
-*/
-
-using namespace Quotient;
-
-CallAnswerEvent::CallAnswerEvent(const QString& callId, const QString& sdp)
- : EventTemplate(callId, { { QStringLiteral("answer"),
- QJsonObject { { QStringLiteral("type"),
- QStringLiteral("answer") },
- { QStringLiteral("sdp"), sdp } } } })
-{}
diff --git a/lib/events/callanswerevent.h b/lib/events/callanswerevent.h
deleted file mode 100644
index c5ad14df..00000000
--- a/lib/events/callanswerevent.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// SPDX-FileCopyrightText: 2017 Marius Gripsgard <marius@ubports.com>
-// SPDX-FileCopyrightText: 2018 Josip Delic <delijati@googlemail.com>
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#pragma once
-
-#include "roomevent.h"
-
-namespace Quotient {
-class QUOTIENT_API CallAnswerEvent
- : public EventTemplate<CallAnswerEvent, CallEventBase> {
-public:
- QUO_EVENT(CallAnswerEvent, "m.call.answer")
-
- using EventTemplate::EventTemplate;
-
- explicit CallAnswerEvent(const QString& callId, const QString& sdp);
-
- QString sdp() const
- {
- return contentPart<QJsonObject>("answer"_ls).value("sdp"_ls).toString();
- }
-};
-} // namespace Quotient
diff --git a/lib/events/callcandidatesevent.h b/lib/events/callcandidatesevent.h
deleted file mode 100644
index f5d2f815..00000000
--- a/lib/events/callcandidatesevent.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// SPDX-FileCopyrightText: 2017 Marius Gripsgard <marius@ubports.com>
-// SPDX-FileCopyrightText: 2018 Josip Delic <delijati@googlemail.com>
-// SPDX-FileCopyrightText: 2018 Kitsune Ral <Kitsune-Ral@users.sf.net>
-// SPDX-FileCopyrightText: 2020 Carl Schwan <carlschwan@kde.org>
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#pragma once
-
-#include "roomevent.h"
-
-namespace Quotient {
-class CallCandidatesEvent : public EventTemplate<CallCandidatesEvent, CallEventBase> {
-public:
- QUO_EVENT(CallCandidatesEvent, "m.call.candidates")
-
- using EventTemplate::EventTemplate;
-
- explicit CallCandidatesEvent(const QString& callId,
- const QJsonArray& candidates)
- : EventTemplate(callId, { { QStringLiteral("candidates"), candidates } })
- {}
-
- QUO_CONTENT_GETTER(QJsonArray, candidates)
- QUO_CONTENT_GETTER(QString, callId)
- QUO_CONTENT_GETTER(int, version)
-};
-} // namespace Quotient
diff --git a/lib/events/callevents.cpp b/lib/events/callevents.cpp
new file mode 100644
index 00000000..3873614d
--- /dev/null
+++ b/lib/events/callevents.cpp
@@ -0,0 +1,82 @@
+// SPDX-FileCopyrightText: 2022 Kitsune Ral <Kitsune-Ral@users.sf.net>
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#include "callevents.h"
+
+#include "logging.h"
+
+using namespace Quotient;
+
+QJsonObject CallEvent::basicJson(const QString& matrixType,
+ const QString& callId, int version,
+ QJsonObject contentJson)
+{
+ contentJson.insert(QStringLiteral("call_id"), callId);
+ contentJson.insert(QStringLiteral("version"), version);
+ return RoomEvent::basicJson(matrixType, contentJson);
+}
+
+CallEvent::CallEvent(const QJsonObject& json)
+ : RoomEvent(json)
+{
+ if (callId().isEmpty())
+ qCWarning(EVENTS) << id() << "is a call event with an empty call id";
+}
+
+/*
+m.call.invite
+{
+ "age": 242352,
+ "content": {
+ "call_id": "12345",
+ "lifetime": 60000,
+ "offer": {
+ "sdp": "v=0\r\no=- 6584580628695956864 2 IN IP4 127.0.0.1[...]",
+ "type": "offer"
+ },
+ "version": 0
+ },
+ "event_id": "$WLGTSEFSEF:localhost",
+ "origin_server_ts": 1431961217939,
+ "room_id": "!Cuyf34gef24t:localhost",
+ "sender": "@example:localhost",
+ "type": "m.call.invite"
+}
+*/
+
+CallInviteEvent::CallInviteEvent(const QString& callId, int lifetime,
+ const QString& sdp)
+ : EventTemplate(
+ callId,
+ { { QStringLiteral("lifetime"), lifetime },
+ { QStringLiteral("offer"),
+ QJsonObject{ { QStringLiteral("type"), QStringLiteral("offer") },
+ { QStringLiteral("sdp"), sdp } } } })
+{}
+
+/*
+m.call.answer
+{
+ "age": 242352,
+ "content": {
+ "answer": {
+ "sdp": "v=0\r\no=- 6584580628695956864 2 IN IP4 127.0.0.1[...]",
+ "type": "answer"
+ },
+ "call_id": "12345",
+ "version": 0
+ },
+ "event_id": "$WLGTSEFSEF:localhost",
+ "origin_server_ts": 1431961217939,
+ "room_id": "!Cuyf34gef24t:localhost",
+ "sender": "@example:localhost",
+ "type": "m.call.answer"
+}
+*/
+
+CallAnswerEvent::CallAnswerEvent(const QString& callId, const QString& sdp)
+ : EventTemplate(callId, { { QStringLiteral("answer"),
+ QJsonObject { { QStringLiteral("type"),
+ QStringLiteral("answer") },
+ { QStringLiteral("sdp"), sdp } } } })
+{}
diff --git a/lib/events/callevents.h b/lib/events/callevents.h
new file mode 100644
index 00000000..6d9feae4
--- /dev/null
+++ b/lib/events/callevents.h
@@ -0,0 +1,99 @@
+// SPDX-FileCopyrightText: 2022 Kitsune Ral <Kitsune-Ral@users.sf.net>
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#pragma once
+
+#include "roomevent.h"
+
+namespace Quotient {
+
+class QUOTIENT_API CallEvent : public RoomEvent {
+public:
+ QUO_BASE_EVENT(CallEvent, "m.call.*"_ls, RoomEvent::BaseMetaType)
+ static bool matches(const QJsonObject&, const QString& mType)
+ {
+ return mType.startsWith("m.call.");
+ }
+
+ explicit CallEvent(const QJsonObject& json);
+
+ QUO_CONTENT_GETTER(QString, callId)
+ QUO_CONTENT_GETTER(int, version)
+
+protected:
+ static QJsonObject basicJson(const QString& matrixType,
+ const QString& callId, int version,
+ QJsonObject contentJson = {});
+};
+using CallEventBase
+ [[deprecated("CallEventBase is CallEvent now")]] = CallEvent;
+
+template <typename EventT>
+class EventTemplate<EventT, CallEvent> : public CallEvent {
+public:
+ using CallEvent::CallEvent;
+ explicit EventTemplate(const QString& callId,
+ const QJsonObject& contentJson = {})
+ : EventTemplate(basicJson(EventT::TypeId, callId, 0, contentJson))
+ {}
+};
+
+template <typename EventT, typename ContentT>
+class EventTemplate<EventT, CallEvent, ContentT>
+ : public EventTemplate<EventT, CallEvent> {
+public:
+ using EventTemplate<EventT, CallEvent>::EventTemplate;
+ template <typename... ContentParamTs>
+ explicit EventTemplate(const QString& callId,
+ ContentParamTs&&... contentParams)
+ : EventTemplate<EventT, CallEvent>(
+ callId,
+ toJson(ContentT{ std::forward<ContentParamTs>(contentParams)... }))
+ {}
+};
+
+class QUOTIENT_API CallInviteEvent
+ : public EventTemplate<CallInviteEvent, CallEvent> {
+public:
+ QUO_EVENT(CallInviteEvent, "m.call.invite")
+
+ using EventTemplate::EventTemplate;
+
+ explicit CallInviteEvent(const QString& callId, int lifetime,
+ const QString& sdp);
+
+ QUO_CONTENT_GETTER(int, lifetime)
+ QString sdp() const
+ {
+ return contentPart<QJsonObject>("offer"_ls).value("sdp"_ls).toString();
+ }
+};
+
+DEFINE_SIMPLE_EVENT(CallCandidatesEvent, CallEvent, "m.call.candidates",
+ QJsonArray, candidates, "candidates")
+
+class QUOTIENT_API CallAnswerEvent
+ : public EventTemplate<CallAnswerEvent, CallEvent> {
+public:
+ QUO_EVENT(CallAnswerEvent, "m.call.answer")
+
+ using EventTemplate::EventTemplate;
+
+ explicit CallAnswerEvent(const QString& callId, const QString& sdp);
+
+ QString sdp() const
+ {
+ return contentPart<QJsonObject>("answer"_ls).value("sdp"_ls).toString();
+ }
+};
+
+class QUOTIENT_API CallHangupEvent
+ : public EventTemplate<CallHangupEvent, CallEvent> {
+public:
+ QUO_EVENT(CallHangupEvent, "m.call.hangup")
+ using EventTemplate::EventTemplate;
+};
+
+} // namespace Quotient
+Q_DECLARE_METATYPE(Quotient::CallEvent*)
+Q_DECLARE_METATYPE(const Quotient::CallEvent*)
diff --git a/lib/events/callhangupevent.h b/lib/events/callhangupevent.h
deleted file mode 100644
index f0b131b9..00000000
--- a/lib/events/callhangupevent.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// SPDX-FileCopyrightText: 2017 Marius Gripsgard <marius@ubports.com>
-// SPDX-FileCopyrightText: 2018 Josip Delic <delijati@googlemail.com>
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#pragma once
-
-#include "roomevent.h"
-
-namespace Quotient {
-class QUOTIENT_API CallHangupEvent
- : public EventTemplate<CallHangupEvent, CallEventBase> {
-public:
- QUO_EVENT(CallHangupEvent, "m.call.hangup")
- using EventTemplate::EventTemplate;
-};
-//REGISTER_EVENT_TYPE(CallHangupEvent)
-} // namespace Quotient
diff --git a/lib/events/callinviteevent.cpp b/lib/events/callinviteevent.cpp
deleted file mode 100644
index 0232275b..00000000
--- a/lib/events/callinviteevent.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-// SPDX-FileCopyrightText: 2017 Marius Gripsgard <marius@ubports.com>
-// SPDX-FileCopyrightText: 2018 Josip Delic <delijati@googlemail.com>
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#include "callinviteevent.h"
-
-/*
-m.call.invite
-{
- "age": 242352,
- "content": {
- "call_id": "12345",
- "lifetime": 60000,
- "offer": {
- "sdp": "v=0\r\no=- 6584580628695956864 2 IN IP4 127.0.0.1[...]",
- "type": "offer"
- },
- "version": 0
- },
- "event_id": "$WLGTSEFSEF:localhost",
- "origin_server_ts": 1431961217939,
- "room_id": "!Cuyf34gef24t:localhost",
- "sender": "@example:localhost",
- "type": "m.call.invite"
-}
-*/
-
-using namespace Quotient;
-
-CallInviteEvent::CallInviteEvent(const QString& callId, int lifetime,
- const QString& sdp)
- : EventTemplate<CallInviteEvent, CallEventBase>(callId,
- { { QStringLiteral("lifetime"), lifetime },
- { QStringLiteral("offer"),
- QJsonObject { { QStringLiteral("type"), QStringLiteral("offer") },
- { QStringLiteral("sdp"), sdp } } } })
-{}
diff --git a/lib/events/callinviteevent.h b/lib/events/callinviteevent.h
deleted file mode 100644
index fc22f7e1..00000000
--- a/lib/events/callinviteevent.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// SPDX-FileCopyrightText: 2017 Marius Gripsgard <marius@ubports.com>
-// SPDX-FileCopyrightText: 2018 Josip Delic <delijati@googlemail.com>
-// SPDX-License-Identifier: LGPL-2.1-or-later
-
-#pragma once
-
-#include "roomevent.h"
-
-namespace Quotient {
-class QUOTIENT_API CallInviteEvent
- : public EventTemplate<CallInviteEvent, CallEventBase> {
-public:
- QUO_EVENT(CallInviteEvent, "m.call.invite")
-
- using EventTemplate::EventTemplate;
-
- explicit CallInviteEvent(const QString& callId, int lifetime,
- const QString& sdp);
-
- QUO_CONTENT_GETTER(int, lifetime)
- QString sdp() const
- {
- return contentPart<QJsonObject>("offer"_ls).value("sdp"_ls).toString();
- }
-};
-} // namespace Quotient
diff --git a/lib/events/event.cpp b/lib/events/event.cpp
index 2843e1dc..ca751081 100644
--- a/lib/events/event.cpp
+++ b/lib/events/event.cpp
@@ -3,6 +3,7 @@
#include "event.h"
+#include "callevents.h"
#include "logging.h"
#include "stateevent.h"
@@ -74,7 +75,7 @@ const QJsonObject Event::unsignedJson() const
bool Event::isStateEvent() const { return is<StateEventBase>(); }
-bool Event::isCallEvent() const { return is<CallEventBase>(); }
+bool Event::isCallEvent() const { return is<CallEvent>(); }
void Event::dumpTo(QDebug dbg) const
{
diff --git a/lib/events/event.h b/lib/events/event.h
index ea5a2554..6a7acf28 100644
--- a/lib/events/event.h
+++ b/lib/events/event.h
@@ -361,7 +361,7 @@ public:
// as an exception. For other base events, Event::is<>() and
// Quotient::is<>() should be used; don't add is* methods here
bool isStateEvent() const;
- [[deprecated("Use is<CallEventBase>() instead")]] bool isCallEvent() const;
+ [[deprecated("Use is<CallEvent>() instead")]] bool isCallEvent() const;
protected:
QJsonObject& editJson() { return _json; }
@@ -386,7 +386,7 @@ using Events = EventsArray<Event>;
//! don't need to create an event from its content structure, just go and derive
//! straight from the respective \p EventBaseT instead of using EventTemplate);
//! specialisations may override that and provide useful semantics even without
-//! \p ContentT (see EventTemplate<CallEventBase>, e.g.).
+//! \p ContentT (see EventTemplate<CallEvent>, e.g.).
//!
//! The template uses CRTP to pick the event type id from the actual class;
//! it will fail to compile if \p EventT doesn't provide TypeId. It also uses
@@ -402,8 +402,8 @@ public:
!std::is_same_v<ContentT, void>,
"If you see this, you tried to use EventTemplate with the default"
" ContentT type, which is void. This default is only used with explicit"
- " specialisations (see CallEventBase, e.g.). Otherwise, if you don't"
- " intend to use the content part of EventTemplate then you don't need"
+ " specialisations (see CallEvent, e.g.). Otherwise, if you don't intend"
+ " to use the content part of EventTemplate then you don't need"
" EventTemplate; just use the base event class directly");
using content_type = ContentT;
diff --git a/lib/events/roomevent.cpp b/lib/events/roomevent.cpp
index bd06f5c5..8928c81c 100644
--- a/lib/events/roomevent.cpp
+++ b/lib/events/roomevent.cpp
@@ -96,22 +96,6 @@ void RoomEvent::dumpTo(QDebug dbg) const
dbg << " (made at " << originTimestamp().toString(Qt::ISODate) << ')';
}
-QJsonObject CallEventBase::basicJson(const QString& matrixType,
- const QString& callId, int version,
- QJsonObject contentJson)
-{
- contentJson.insert(QStringLiteral("call_id"), callId);
- contentJson.insert(QStringLiteral("version"), version);
- return RoomEvent::basicJson(matrixType, contentJson);
-}
-
-CallEventBase::CallEventBase(const QJsonObject& json)
- : RoomEvent(json)
-{
- if (callId().isEmpty())
- qCWarning(EVENTS) << id() << "is a call event with an empty call id";
-}
-
#ifdef Quotient_E2EE_ENABLED
void RoomEvent::setOriginalEvent(event_ptr_tt<RoomEvent>&& originalEvent)
{
diff --git a/lib/events/roomevent.h b/lib/events/roomevent.h
index 830f1d30..47b0b59d 100644
--- a/lib/events/roomevent.h
+++ b/lib/events/roomevent.h
@@ -79,31 +79,6 @@ using RoomEventPtr = event_ptr_tt<RoomEvent>;
using RoomEvents = EventsArray<RoomEvent>;
using RoomEventsRange = Range<RoomEvents>;
-class QUOTIENT_API CallEventBase : public RoomEvent {
-public:
- QUO_BASE_EVENT(CallEventBase, "m.call.*"_ls, RoomEvent::BaseMetaType)
-
- explicit CallEventBase(const QJsonObject& json);
-
- QUO_CONTENT_GETTER(QString, callId)
- QUO_CONTENT_GETTER(int, version)
-
-protected:
- static QJsonObject basicJson(const QString& matrixType,
- const QString& callId, int version,
- QJsonObject contentJson = {});
-};
-
-template <typename EventT>
-class EventTemplate<EventT, CallEventBase, void> : public CallEventBase {
-public:
- using CallEventBase::CallEventBase;
- explicit EventTemplate(const QString& callId,
- const QJsonObject& contentJson = {})
- : EventTemplate(basicJson(EventT::TypeId, callId, 0, contentJson))
- {}
-};
-
} // namespace Quotient
Q_DECLARE_METATYPE(Quotient::RoomEvent*)
Q_DECLARE_METATYPE(const Quotient::RoomEvent*)
diff --git a/lib/room.cpp b/lib/room.cpp
index a6617cc3..24939b55 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -35,10 +35,7 @@
#include "csapi/rooms.h"
#include "csapi/tags.h"
-#include "events/callanswerevent.h"
-#include "events/callcandidatesevent.h"
-#include "events/callhangupevent.h"
-#include "events/callinviteevent.h"
+#include "events/callevents.h"
#include "events/encryptionevent.h"
#include "events/reactionevent.h"
#include "events/receiptevent.h"
@@ -2916,7 +2913,7 @@ Room::Changes Room::Private::addNewMessageEvents(RoomEvents&& events)
if (q->supportsCalls())
for (auto it = from; it != syncEdge(); ++it)
- if (const auto* evt = it->viewAs<CallEventBase>())
+ if (const auto* evt = it->viewAs<CallEvent>())
emit q->callEvent(q, evt);
if (totalInserted > 0) {