aboutsummaryrefslogtreecommitdiff
path: root/lib/events
diff options
context:
space:
mode:
Diffstat (limited to 'lib/events')
-rw-r--r--lib/events/callanswerevent.cpp32
-rw-r--r--lib/events/callanswerevent.h33
-rw-r--r--lib/events/callcandidatesevent.cpp27
-rw-r--r--lib/events/callcandidatesevent.h31
-rw-r--r--lib/events/callhangupevent.cpp11
-rw-r--r--lib/events/callhangupevent.h20
-rw-r--r--lib/events/callinviteevent.cpp20
-rw-r--r--lib/events/callinviteevent.h41
-rw-r--r--lib/events/event.h17
-rw-r--r--lib/events/roomevent.cpp22
-rw-r--r--lib/events/roomevent.h14
11 files changed, 101 insertions, 167 deletions
diff --git a/lib/events/callanswerevent.cpp b/lib/events/callanswerevent.cpp
index c28ad305..d2862241 100644
--- a/lib/events/callanswerevent.cpp
+++ b/lib/events/callanswerevent.cpp
@@ -48,29 +48,25 @@ m.call.answer
using namespace QMatrixClient;
CallAnswerEvent::CallAnswerEvent(const QJsonObject& obj)
- : RoomEvent(typeId(), obj)
- , _lifetime(contentJson()["lifetime"].toInt())
- , _sdp(contentJson()["answer"].toObject()["sdp"].toString())
- , _callId(contentJson()["call_id"].toString())
- , _version(contentJson()["version"].toInt())
+ : CallEventBase(typeId(), obj)
{
qCDebug(EVENTS) << "Call Answer event";
}
CallAnswerEvent::CallAnswerEvent(const QString& callId, const int lifetime,
const QString& sdp)
- : RoomEvent(typeId(), NULL)
-{
- _version = 0;
- _callId = callId;
- _lifetime = lifetime;
- _sdp = sdp;
-}
+ : CallEventBase(typeId(), matrixTypeId(), callId, 0,
+ { { QStringLiteral("lifetime"), lifetime }
+ , { QStringLiteral("answer"), QJsonObject {
+ { QStringLiteral("type"), QStringLiteral("answer") },
+ { QStringLiteral("sdp"), sdp } } }
+ })
+{ }
CallAnswerEvent::CallAnswerEvent(const QString& callId, const QString& sdp)
- : RoomEvent(typeId(), NULL)
-{
- _version = 0;
- _callId = callId;
- _sdp = sdp;
-}
+ : CallEventBase(typeId(), matrixTypeId(), callId, 0,
+ { { QStringLiteral("answer"), QJsonObject {
+ { QStringLiteral("type"), QStringLiteral("answer") },
+ { QStringLiteral("sdp"), sdp } } }
+ })
+{ }
diff --git a/lib/events/callanswerevent.h b/lib/events/callanswerevent.h
index b5b47899..2d9e5bb0 100644
--- a/lib/events/callanswerevent.h
+++ b/lib/events/callanswerevent.h
@@ -22,7 +22,7 @@
namespace QMatrixClient
{
- class CallAnswerEvent: public RoomEvent
+ class CallAnswerEvent: public CallEventBase
{
public:
DEFINE_EVENT_TYPEID("m.call.answer", CallAnswerEvent)
@@ -33,34 +33,11 @@ namespace QMatrixClient
const QString& sdp);
explicit CallAnswerEvent(const QString& callId, const QString& sdp);
- bool isStateEvent() const override { return true; }
-
- const int lifetime() const { return _lifetime; }
- const QString& sdp() const { return _sdp; }
- const QString& callId() const { return _callId; }
- const int version() const { return _version; }
-
- QJsonObject toJson() const
- {
- QJsonObject answer;
- answer.insert("sdp", _sdp);
- answer.insert("type", QStringLiteral("answer"));
-
- QJsonObject obj;
- obj.insert("call_id", _callId);
- obj.insert("version", _version);
- if (_lifetime != NULL)
- obj.insert("lifetime", _lifetime);
- obj.insert("answer", answer);
- return obj;
+ int lifetime() const { return content<int>("lifetime"_ls); } // FIXME: Omittable<>?
+ QString sdp() const {
+ return contentJson()["answer"_ls].toObject()
+ .value("sdp"_ls).toString();
}
-
- private:
- int _lifetime;
- QJsonObject _answer;
- QString _sdp;
- QString _callId;
- int _version;
};
REGISTER_EVENT_TYPE(CallAnswerEvent)
diff --git a/lib/events/callcandidatesevent.cpp b/lib/events/callcandidatesevent.cpp
index 40d9ce05..52cd1856 100644
--- a/lib/events/callcandidatesevent.cpp
+++ b/lib/events/callcandidatesevent.cpp
@@ -18,12 +18,6 @@
#include "callcandidatesevent.h"
-#include "event.h"
-
-#include "logging.h"
-
-#include <QtCore/QJsonDocument>
-
/*
m.call.candidates
{
@@ -46,24 +40,3 @@ m.call.candidates
"type": "m.call.candidates"
}
*/
-
-using namespace QMatrixClient;
-
-
-CallCandidatesEvent::CallCandidatesEvent(const QJsonObject& obj)
- : RoomEvent(typeId(), obj)
- , _candidates(contentJson()["candidates"].toArray())
- , _callId(contentJson()["call_id"].toString())
- , _version(contentJson()["version"].toInt())
-{
- qCDebug(EVENTS) << "Call Candidates event";
-}
-
-CallCandidatesEvent::CallCandidatesEvent(const QString& callId,
- const QJsonArray& candidates)
- : RoomEvent(typeId(), NULL)
-{
- _version = 0;
- _callId = callId;
- _candidates = candidates;
-}
diff --git a/lib/events/callcandidatesevent.h b/lib/events/callcandidatesevent.h
index 8e66499d..4618832c 100644
--- a/lib/events/callcandidatesevent.h
+++ b/lib/events/callcandidatesevent.h
@@ -19,39 +19,28 @@
#pragma once
#include "roomevent.h"
-#include <QtCore/QJsonArray>
namespace QMatrixClient
{
- class CallCandidatesEvent: public RoomEvent
+ class CallCandidatesEvent: public CallEventBase
{
public:
DEFINE_EVENT_TYPEID("m.call.candidates", CallCandidatesEvent)
- explicit CallCandidatesEvent(const QJsonObject& obj);
+ explicit CallCandidatesEvent(const QJsonObject& obj)
+ : CallEventBase(typeId(), obj)
+ { }
explicit CallCandidatesEvent(const QString& callId,
- const QJsonArray& candidates);
+ const QJsonArray& candidates)
+ : CallEventBase(typeId(), matrixTypeId(), callId, 0,
+ {{ QStringLiteral("candidates"), candidates }})
+ { }
- bool isStateEvent() const override { return true; }
-
- const QJsonArray& candidates() const { return _candidates; }
- const QString& callId() const { return _callId; }
- const int version() const { return _version; }
-
- QJsonObject toJson() const
+ QJsonArray candidates() const
{
- QJsonObject obj;
- obj.insert("call_id", _callId);
- obj.insert("version", _version);
- obj.insert("candidates", _candidates);
- return obj;
+ return content<QJsonArray>("candidates"_ls);
}
-
- private:
- QJsonArray _candidates;
- QString _callId;
- int _version;
};
REGISTER_EVENT_TYPE(CallCandidatesEvent)
diff --git a/lib/events/callhangupevent.cpp b/lib/events/callhangupevent.cpp
index 27f41a5f..b1154806 100644
--- a/lib/events/callhangupevent.cpp
+++ b/lib/events/callhangupevent.cpp
@@ -44,16 +44,11 @@ using namespace QMatrixClient;
CallHangupEvent::CallHangupEvent(const QJsonObject& obj)
- : RoomEvent(typeId(), obj)
- , _callId(contentJson()["call_id"].toString())
- , _version(contentJson()["version"].toInt())
+ : CallEventBase(typeId(), obj)
{
qCDebug(EVENTS) << "Call Hangup event";
}
CallHangupEvent::CallHangupEvent(const QString& callId)
- : RoomEvent(typeId(), NULL)
-{
- _version = 0;
- _callId = callId;
-}
+ : CallEventBase(typeId(), matrixTypeId(), callId, 0)
+{ }
diff --git a/lib/events/callhangupevent.h b/lib/events/callhangupevent.h
index 57e565a6..c74e20d5 100644
--- a/lib/events/callhangupevent.h
+++ b/lib/events/callhangupevent.h
@@ -22,31 +22,13 @@
namespace QMatrixClient
{
- class CallHangupEvent: public RoomEvent
+ class CallHangupEvent: public CallEventBase
{
public:
DEFINE_EVENT_TYPEID("m.call.hangup", CallHangupEvent)
explicit CallHangupEvent(const QJsonObject& obj);
-
explicit CallHangupEvent(const QString& callId);
-
- bool isStateEvent() const override { return true; }
-
- const QString& callId() const { return _callId; }
- const int version() const { return _version; }
-
- QJsonObject toJson() const
- {
- QJsonObject obj;
- obj.insert("call_id", _callId);
- obj.insert("version", _version);
- return obj;
- }
-
- private:
- QString _callId;
- int _version;
};
REGISTER_EVENT_TYPE(CallHangupEvent)
diff --git a/lib/events/callinviteevent.cpp b/lib/events/callinviteevent.cpp
index 71c49d66..bca3f296 100644
--- a/lib/events/callinviteevent.cpp
+++ b/lib/events/callinviteevent.cpp
@@ -48,21 +48,17 @@ m.call.invite
using namespace QMatrixClient;
CallInviteEvent::CallInviteEvent(const QJsonObject& obj)
- : RoomEvent(typeId(), obj)
- , _lifetime(contentJson()["lifetime"].toInt())
- , _sdp(contentJson()["offer"].toObject()["sdp"].toString())
- , _callId(contentJson()["call_id"].toString())
- , _version(contentJson()["version"].toInt())
+ : CallEventBase(typeId(), obj)
{
qCDebug(EVENTS) << "Call Invite event";
}
CallInviteEvent::CallInviteEvent(const QString& callId, const int lifetime,
const QString& sdp)
- : RoomEvent(typeId(), NULL)
-{
- _version = 0;
- _callId = callId;
- _lifetime = lifetime;
- _sdp = sdp;
-}
+ : CallEventBase(typeId(), matrixTypeId(), callId, lifetime,
+ { { 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
index 029b2e3d..d5315309 100644
--- a/lib/events/callinviteevent.h
+++ b/lib/events/callinviteevent.h
@@ -22,42 +22,21 @@
namespace QMatrixClient
{
- class CallInviteEvent: public RoomEvent
+ class CallInviteEvent: public CallEventBase
{
public:
- DEFINE_EVENT_TYPEID("m.call.invite", CallInviteEvent)
+ DEFINE_EVENT_TYPEID("m.call.invite", CallInviteEvent)
- explicit CallInviteEvent(const QJsonObject& obj);
+ explicit CallInviteEvent(const QJsonObject& obj);
- explicit CallInviteEvent(const QString& callId, const int lifetime,
- const QString& sdp);
+ explicit CallInviteEvent(const QString& callId, const int lifetime,
+ const QString& sdp);
- bool isStateEvent() const override { return true; }
-
- const int lifetime() const { return _lifetime; }
- const QString& sdp() const { return _sdp; }
- const QString& callId() const { return _callId; }
- const int version() const { return _version; }
-
- QJsonObject toJson() const
- {
- QJsonObject offer;
- offer.insert("sdp", _sdp);
- offer.insert("type", QStringLiteral("offer"));
-
- QJsonObject obj;
- obj.insert("call_id", _callId);
- obj.insert("version", _version);
- obj.insert("lifetime", _lifetime);
- obj.insert("offer", offer);
- return obj;
- }
-
- private:
- int _lifetime;
- QString _sdp;
- QString _callId;
- int _version;
+ int lifetime() const { return content<int>("lifetime"_ls); } // FIXME: Omittable<>?
+ QString sdp() const {
+ return contentJson()["offer"_ls].toObject()
+ .value("sdp"_ls).toString();
+ }
};
REGISTER_EVENT_TYPE(CallInviteEvent)
diff --git a/lib/events/event.h b/lib/events/event.h
index 9ba4b85a..cd23a818 100644
--- a/lib/events/event.h
+++ b/lib/events/event.h
@@ -18,11 +18,9 @@
#pragma once
-#include "util.h"
+#include "converters.h"
#include "logging.h"
-#include <QtCore/QJsonObject>
-
#ifndef DISABLE_EVENTTYPE
#define USE_EVENTTYPE 1
#endif
@@ -247,7 +245,20 @@ namespace QMatrixClient
const QJsonObject contentJson() const;
const QJsonObject unsignedJson() const;
+ template <typename T>
+ T content(const QString& key) const
+ {
+ return fromJson<T>(contentJson()[key]);
+ }
+
+ template <typename T>
+ T content(const QLatin1String& key) const
+ {
+ return fromJson<T>(contentJson()[key]);
+ }
+
virtual bool isStateEvent() const { return false; }
+ virtual bool isCallEvent() const { return false; }
protected:
QJsonObject& editJson() { return _json; }
diff --git a/lib/events/roomevent.cpp b/lib/events/roomevent.cpp
index e9d74cf6..80d121de 100644
--- a/lib/events/roomevent.cpp
+++ b/lib/events/roomevent.cpp
@@ -101,3 +101,25 @@ void RoomEvent::addId(const QString& newId)
qCDebug(EVENTS) << "Event txnId -> id:" << transactionId() << "->" << id();
Q_ASSERT(id() == newId);
}
+
+QJsonObject makeCallContentJson(const QString& callId, int version,
+ QJsonObject content)
+{
+ content.insert(QStringLiteral("call_id"), callId);
+ content.insert(QStringLiteral("version"), version);
+ return content;
+}
+
+CallEventBase::CallEventBase(Type type, event_mtype_t matrixType,
+ const QString& callId, int version,
+ const QJsonObject& contentJson)
+ : RoomEvent(type, matrixType,
+ makeCallContentJson(callId, version, contentJson))
+{ }
+
+CallEventBase::CallEventBase(Event::Type type, const QJsonObject& json)
+ : RoomEvent(type, json)
+{
+ if (callId().isEmpty())
+ qCWarning(EVENTS) << id() << "is a call event with an empty call id";
+}
diff --git a/lib/events/roomevent.h b/lib/events/roomevent.h
index f057753f..ce96174e 100644
--- a/lib/events/roomevent.h
+++ b/lib/events/roomevent.h
@@ -87,6 +87,20 @@ namespace QMatrixClient
using RoomEventPtr = event_ptr_tt<RoomEvent>;
using RoomEvents = EventsArray<RoomEvent>;
using RoomEventsRange = Range<RoomEvents>;
+
+ class CallEventBase: public RoomEvent
+ {
+ public:
+ CallEventBase(Type type, event_mtype_t matrixType,
+ const QString& callId, int version,
+ const QJsonObject& contentJson = {});
+ CallEventBase(Type type, const QJsonObject& json);
+ ~CallEventBase() override = default;
+ bool isCallEvent() const override { return true; }
+
+ QString callId() const { return content<QString>("call_id"_ls); }
+ int version() const { return content<int>("version"_ls); }
+ };
} // namespace QMatrixClient
Q_DECLARE_METATYPE(QMatrixClient::RoomEvent*)
Q_DECLARE_METATYPE(const QMatrixClient::RoomEvent*)