1// SPDX-FileCopyrightText: 2022 Kitsune Ral <Kitsune-Ral@users.sf.net>
2// SPDX-License-Identifier: LGPL-2.1-or-later
3
4#pragma once
5
6#include "roomevent.h"
7
8namespace Quotient {
9
10class QUOTIENT_API CallEvent : public RoomEvent {
11public:
12 QUO_BASE_EVENT(CallEvent, RoomEvent, "m.call.*")
13
14 QUO_CONTENT_GETTER(QString, callId)
15 QUO_CONTENT_GETTER(int, version)
16
17protected:
18 explicit CallEvent(const QJsonObject& json);
19
20 static QJsonObject basicJson(const QString& matrixType,
21 const QString& callId, int version,
22 QJsonObject contentJson = {});
23};
24using CallEventBase
25 [[deprecated("CallEventBase is CallEvent now")]] = CallEvent;
26
27template <typename EventT>
28class EventTemplate<EventT, CallEvent> : public CallEvent {
29public:
30 using CallEvent::CallEvent;
31 explicit EventTemplate(const QString& callId,
32 const QJsonObject& contentJson = {})
33 : EventTemplate(basicJson(matrixType: EventT::TypeId, callId, version: 0, contentJson))
34 {}
35};
36
37template <typename EventT, typename ContentT>
38class EventTemplate<EventT, CallEvent, ContentT>
39 : public EventTemplate<EventT, CallEvent> {
40public:
41 using EventTemplate<EventT, CallEvent>::EventTemplate;
42 template <typename... ContentParamTs>
43 explicit EventTemplate(const QString& callId,
44 ContentParamTs&&... contentParams)
45 : EventTemplate<EventT, CallEvent>(
46 callId,
47 toJson(ContentT{ std::forward<ContentParamTs>(contentParams)... }))
48 {}
49};
50
51class QUOTIENT_API CallInviteEvent
52 : public EventTemplate<CallInviteEvent, CallEvent> {
53public:
54 QUO_EVENT(CallInviteEvent, "m.call.invite")
55
56 using EventTemplate::EventTemplate;
57
58 explicit CallInviteEvent(const QString& callId, int lifetime,
59 const QString& sdp);
60
61 QUO_CONTENT_GETTER(int, lifetime)
62 QString sdp() const
63 {
64 return contentPart<QJsonObject>(key: "offer"_ls).value(key: "sdp"_ls).toString();
65 }
66};
67
68DEFINE_SIMPLE_EVENT(CallCandidatesEvent, CallEvent, "m.call.candidates",
69 QJsonArray, candidates, "candidates")
70
71class QUOTIENT_API CallAnswerEvent
72 : public EventTemplate<CallAnswerEvent, CallEvent> {
73public:
74 QUO_EVENT(CallAnswerEvent, "m.call.answer")
75
76 using EventTemplate::EventTemplate;
77
78 explicit CallAnswerEvent(const QString& callId, const QString& sdp);
79
80 QString sdp() const
81 {
82 return contentPart<QJsonObject>(key: "answer"_ls).value(key: "sdp"_ls).toString();
83 }
84};
85
86class QUOTIENT_API CallHangupEvent
87 : public EventTemplate<CallHangupEvent, CallEvent> {
88public:
89 QUO_EVENT(CallHangupEvent, "m.call.hangup")
90 using EventTemplate::EventTemplate;
91};
92
93} // namespace Quotient
94Q_DECLARE_METATYPE(Quotient::CallEvent*)
95Q_DECLARE_METATYPE(const Quotient::CallEvent*)
96