From 57978b1a6e77ac756a3addbdbed6ca0286a1c7c5 Mon Sep 17 00:00:00 2001 From: James Graham Date: Sun, 29 Oct 2023 14:51:25 +0000 Subject: [PATCH] EventHandler Nullptr checks So I got lazy halfway through doing this the first time. Add missing checks for null m_room and m_event to EventHandler and add tests for them. --- autotests/eventhandlertest.cpp | 245 +++++++++++++++++++++++++++++++++ src/eventhandler.cpp | 112 ++++++++++++++- 2 files changed, 355 insertions(+), 2 deletions(-) diff --git a/autotests/eventhandlertest.cpp b/autotests/eventhandlertest.cpp index d68619df9..6a6bafd1c 100644 --- a/autotests/eventhandlertest.cpp +++ b/autotests/eventhandlertest.cpp @@ -39,34 +39,61 @@ private: Connection *connection = nullptr; TestRoom *room = nullptr; EventHandler eventHandler; + EventHandler emptyHandler; + EventHandler noEventHandler; private Q_SLOTS: void initTestCase(); + void nullSetEvent(); void eventId(); + void nullEventId(); void delegateType_data(); void delegateType(); + void nullDelegateType(); void author(); + void nullAuthor(); void authorDisplayName(); + void nullAuthorDisplayName(); void time(); + void nullTime(); void timeString(); + void nullTimeString(); void highlighted(); + void nullHighlighted(); void hidden(); + void nullHidden(); void body(); + void nullBody(); void genericBody_data(); void genericBody(); + void nullGenericBody(); void mediaInfo(); + void nullMediaInfo(); void linkPreviewer(); + void nullLinkPreviewer(); void reactions(); + void nullReactions(); void hasReply(); + void nullHasReply(); void replyId(); + void nullReplyId(); void replyDelegateType(); + void nullReplyDelegateType(); void replyAuthor(); + void nullReplyAuthor(); void replyBody(); + void nullReplyBody(); void replyMediaInfo(); + void nullReplyMediaInfo(); void thread(); + void nullThread(); void location(); + void nullLocation(); void readMarkers(); + void nullReadMarkers(); + + void cleanup(); }; void EventHandlerTest::initTestCase() @@ -82,6 +109,13 @@ void EventHandlerTest::initTestCase() room->update(std::move(roomData)); eventHandler.setRoom(room); + noEventHandler.setRoom(room); +} + +void EventHandlerTest::nullSetEvent() +{ + QTest::ignoreMessage(QtWarningMsg, "cannot setEvent when m_room is set to nullptr."); + emptyHandler.setEvent(room->messageEvents().at(0).get()); } void EventHandlerTest::eventId() @@ -91,6 +125,12 @@ void EventHandlerTest::eventId() QCOMPARE(eventHandler.getId(), QStringLiteral("$153456789:example.org")); } +void EventHandlerTest::nullEventId() +{ + QTest::ignoreMessage(QtWarningMsg, "getId called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getId(), QString()); +} + void EventHandlerTest::delegateType_data() { QTest::addColumn("eventNum"); @@ -114,6 +154,12 @@ void EventHandlerTest::delegateType() QCOMPARE(eventHandler.getDelegateType(), delegateType); } +void EventHandlerTest::nullDelegateType() +{ + QTest::ignoreMessage(QtWarningMsg, "getDelegateType called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getDelegateType(), DelegateType::Other); +} + void EventHandlerTest::author() { auto event = room->messageEvents().at(0).get(); @@ -131,6 +177,15 @@ void EventHandlerTest::author() QCOMPARE(eventHandlerAuthor["object"_ls], QVariant::fromValue(author)); } +void EventHandlerTest::nullAuthor() +{ + QTest::ignoreMessage(QtWarningMsg, "getAuthor called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getAuthor(), QVariantMap()); + + QTest::ignoreMessage(QtWarningMsg, "getAuthor called with m_event set to nullptr. Returning empty user."); + QCOMPARE(noEventHandler.getAuthor(), room->getUser(nullptr)); +} + void EventHandlerTest::authorDisplayName() { auto event = room->messageEvents().at(1).get(); @@ -139,6 +194,15 @@ void EventHandlerTest::authorDisplayName() QCOMPARE(eventHandler.getAuthorDisplayName(), QStringLiteral("before")); } +void EventHandlerTest::nullAuthorDisplayName() +{ + QTest::ignoreMessage(QtWarningMsg, "getAuthorDisplayName called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getAuthorDisplayName(), QString()); + + QTest::ignoreMessage(QtWarningMsg, "getAuthorDisplayName called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getAuthorDisplayName(), QString()); +} + void EventHandlerTest::time() { auto event = room->messageEvents().at(0).get(); @@ -148,6 +212,16 @@ void EventHandlerTest::time() QCOMPARE(eventHandler.getTime(true, QDateTime::fromMSecsSinceEpoch(1234, Qt::UTC)), QDateTime::fromMSecsSinceEpoch(1234, Qt::UTC)); } +void EventHandlerTest::nullTime() +{ + QTest::ignoreMessage(QtWarningMsg, "getTime called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getTime(), QDateTime()); + + eventHandler.setEvent(room->messageEvents().at(0).get()); + QTest::ignoreMessage(QtWarningMsg, "a value must be provided for lastUpdated for a pending event."); + QCOMPARE(eventHandler.getTime(true), QDateTime()); +} + void EventHandlerTest::timeString() { auto event = room->messageEvents().at(0).get(); @@ -169,6 +243,16 @@ void EventHandlerTest::timeString() format.formatRelativeDate(QDateTime::fromMSecsSinceEpoch(1690699214545, Qt::UTC).toLocalTime().date(), QLocale::LongFormat)); } +void EventHandlerTest::nullTimeString() +{ + QTest::ignoreMessage(QtWarningMsg, "getTimeString called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getTimeString(false), QString()); + + eventHandler.setEvent(room->messageEvents().at(0).get()); + QTest::ignoreMessage(QtWarningMsg, "a value must be provided for lastUpdated for a pending event."); + QCOMPARE(eventHandler.getTimeString(false, QLocale::ShortFormat, true), QString()); +} + void EventHandlerTest::highlighted() { auto event = room->messageEvents().at(2).get(); @@ -182,6 +266,15 @@ void EventHandlerTest::highlighted() QCOMPARE(eventHandler.isHighlighted(), false); } +void EventHandlerTest::nullHighlighted() +{ + QTest::ignoreMessage(QtWarningMsg, "isHighlighted called with m_room set to nullptr."); + QCOMPARE(emptyHandler.isHighlighted(), false); + + QTest::ignoreMessage(QtWarningMsg, "isHighlighted called with m_event set to nullptr."); + QCOMPARE(noEventHandler.isHighlighted(), false); +} + void EventHandlerTest::hidden() { auto event = room->messageEvents().at(3).get(); @@ -195,6 +288,15 @@ void EventHandlerTest::hidden() QCOMPARE(eventHandler.isHidden(), false); } +void EventHandlerTest::nullHidden() +{ + QTest::ignoreMessage(QtWarningMsg, "isHidden called with m_room set to nullptr."); + QCOMPARE(emptyHandler.isHidden(), false); + + QTest::ignoreMessage(QtWarningMsg, "isHidden called with m_event set to nullptr."); + QCOMPARE(noEventHandler.isHidden(), false); +} + void EventHandlerTest::body() { auto event = room->messageEvents().at(0).get(); @@ -206,6 +308,15 @@ void EventHandlerTest::body() QCOMPARE(eventHandler.getPlainBody(true), QStringLiteral("This is an example text message")); } +void EventHandlerTest::nullBody() +{ + QTest::ignoreMessage(QtWarningMsg, "getRichBody called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getRichBody(), QString()); + + QTest::ignoreMessage(QtWarningMsg, "getPlainBody called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getPlainBody(), QString()); +} + void EventHandlerTest::genericBody_data() { QTest::addColumn("eventNum"); @@ -228,6 +339,12 @@ void EventHandlerTest::genericBody() QCOMPARE(eventHandler.getGenericBody(), output); } +void EventHandlerTest::nullGenericBody() +{ + QTest::ignoreMessage(QtWarningMsg, "getGenericBody called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getGenericBody(), QString()); +} + void EventHandlerTest::mediaInfo() { auto event = room->messageEvents().at(4).get(); @@ -251,6 +368,15 @@ void EventHandlerTest::mediaInfo() QCOMPARE(thumbnailInfo["height"_ls], 450); } +void EventHandlerTest::nullMediaInfo() +{ + QTest::ignoreMessage(QtWarningMsg, "getMediaInfo called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getMediaInfo(), QVariantMap()); + + QTest::ignoreMessage(QtWarningMsg, "getMediaInfo called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getMediaInfo(), QVariantMap()); +} + void EventHandlerTest::linkPreviewer() { auto event = room->messageEvents().at(2).get(); @@ -264,6 +390,15 @@ void EventHandlerTest::linkPreviewer() QCOMPARE(eventHandler.getLinkPreviewer(), nullptr); } +void EventHandlerTest::nullLinkPreviewer() +{ + QTest::ignoreMessage(QtWarningMsg, "getLinkPreviewer called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getLinkPreviewer(), nullptr); + + QTest::ignoreMessage(QtWarningMsg, "getLinkPreviewer called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getLinkPreviewer(), nullptr); +} + void EventHandlerTest::reactions() { auto event = room->messageEvents().at(0).get(); @@ -272,6 +407,15 @@ void EventHandlerTest::reactions() QCOMPARE(eventHandler.getReactions()->rowCount(), 1); } +void EventHandlerTest::nullReactions() +{ + QTest::ignoreMessage(QtWarningMsg, "getReactions called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getReactions(), nullptr); + + QTest::ignoreMessage(QtWarningMsg, "getReactions called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getReactions(), nullptr); +} + void EventHandlerTest::hasReply() { auto event = room->messageEvents().at(5).get(); @@ -285,6 +429,12 @@ void EventHandlerTest::hasReply() QCOMPARE(eventHandler.hasReply(), false); } +void EventHandlerTest::nullHasReply() +{ + QTest::ignoreMessage(QtWarningMsg, "hasReply called with m_event set to nullptr."); + QCOMPARE(noEventHandler.hasReply(), false); +} + void EventHandlerTest::replyId() { auto event = room->messageEvents().at(5).get(); @@ -298,6 +448,12 @@ void EventHandlerTest::replyId() QCOMPARE(eventHandler.getReplyId(), QStringLiteral("")); } +void EventHandlerTest::nullReplyId() +{ + QTest::ignoreMessage(QtWarningMsg, "getReplyId called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getReplyId(), QString()); +} + void EventHandlerTest::replyDelegateType() { auto event = room->messageEvents().at(5).get(); @@ -311,6 +467,15 @@ void EventHandlerTest::replyDelegateType() QCOMPARE(eventHandler.getReplyDelegateType(), DelegateType::Other); } +void EventHandlerTest::nullReplyDelegateType() +{ + QTest::ignoreMessage(QtWarningMsg, "getReplyDelegateType called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getReplyDelegateType(), DelegateType::Other); + + QTest::ignoreMessage(QtWarningMsg, "getReplyDelegateType called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getReplyDelegateType(), DelegateType::Other); +} + void EventHandlerTest::replyAuthor() { auto event = room->messageEvents().at(5).get(); @@ -334,6 +499,15 @@ void EventHandlerTest::replyAuthor() QCOMPARE(eventHandler.getReplyAuthor(), room->getUser(nullptr)); } +void EventHandlerTest::nullReplyAuthor() +{ + QTest::ignoreMessage(QtWarningMsg, "getReplyAuthor called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getReplyAuthor(), QVariantMap()); + + QTest::ignoreMessage(QtWarningMsg, "getReplyAuthor called with m_event set to nullptr. Returning empty user."); + QCOMPARE(noEventHandler.getReplyAuthor(), room->getUser(nullptr)); +} + void EventHandlerTest::replyBody() { auto event = room->messageEvents().at(5).get(); @@ -345,6 +519,15 @@ void EventHandlerTest::replyBody() QCOMPARE(eventHandler.getReplyPlainBody(true), QStringLiteral("This is an example text message")); } +void EventHandlerTest::nullReplyBody() +{ + QTest::ignoreMessage(QtWarningMsg, "getReplyRichBody called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getReplyRichBody(), QString()); + + QTest::ignoreMessage(QtWarningMsg, "getReplyPlainBody called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getReplyPlainBody(), QString()); +} + void EventHandlerTest::replyMediaInfo() { auto event = room->messageEvents().at(6).get(); @@ -369,6 +552,15 @@ void EventHandlerTest::replyMediaInfo() QCOMPARE(thumbnailInfo["height"_ls], 450); } +void EventHandlerTest::nullReplyMediaInfo() +{ + QTest::ignoreMessage(QtWarningMsg, "getReplyMediaInfo called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getReplyMediaInfo(), QVariantMap()); + + QTest::ignoreMessage(QtWarningMsg, "getReplyMediaInfo called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getReplyMediaInfo(), QVariantMap()); +} + void EventHandlerTest::thread() { auto event = room->messageEvents().at(0).get(); @@ -392,6 +584,15 @@ void EventHandlerTest::thread() QCOMPARE(eventHandler.getReplyId(), QStringLiteral("$threadmessage1:example.org")); } +void EventHandlerTest::nullThread() +{ + QTest::ignoreMessage(QtWarningMsg, "isThreaded called with m_event set to nullptr."); + QCOMPARE(emptyHandler.isThreaded(), false); + + QTest::ignoreMessage(QtWarningMsg, "threadRoot called with m_event set to nullptr."); + QCOMPARE(noEventHandler.threadRoot(), QString()); +} + void EventHandlerTest::location() { auto event = room->messageEvents().at(7).get(); @@ -402,6 +603,18 @@ void EventHandlerTest::location() QCOMPARE(eventHandler.getLocationAssetType(), QStringLiteral("m.pin")); } +void EventHandlerTest::nullLocation() +{ + QTest::ignoreMessage(QtWarningMsg, "getLatitude called with m_event set to nullptr."); + QCOMPARE(emptyHandler.getLatitude(), -100.0); + + QTest::ignoreMessage(QtWarningMsg, "getLongitude called with m_event set to nullptr."); + QCOMPARE(emptyHandler.getLongitude(), -200.0); + + QTest::ignoreMessage(QtWarningMsg, "getLocationAssetType called with m_event set to nullptr."); + QCOMPARE(emptyHandler.getLocationAssetType(), QString()); +} + void EventHandlerTest::readMarkers() { auto event = room->messageEvents().at(0).get(); @@ -431,5 +644,37 @@ void EventHandlerTest::readMarkers() QCOMPARE(eventHandler.getReadMarkersString().startsWith(QStringLiteral("6 users:")), true); } +void EventHandlerTest::nullReadMarkers() +{ + QTest::ignoreMessage(QtWarningMsg, "hasReadMarkers called with m_room set to nullptr."); + QCOMPARE(emptyHandler.hasReadMarkers(), false); + + QTest::ignoreMessage(QtWarningMsg, "getReadMarkers called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getReadMarkers(), QVariantList()); + + QTest::ignoreMessage(QtWarningMsg, "getNumberExcessReadMarkers called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getNumberExcessReadMarkers(), QString()); + + QTest::ignoreMessage(QtWarningMsg, "getReadMarkersString called with m_room set to nullptr."); + QCOMPARE(emptyHandler.getReadMarkersString(), QString()); + + QTest::ignoreMessage(QtWarningMsg, "hasReadMarkers called with m_event set to nullptr."); + QCOMPARE(noEventHandler.hasReadMarkers(), false); + + QTest::ignoreMessage(QtWarningMsg, "getReadMarkers called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getReadMarkers(), QVariantList()); + + QTest::ignoreMessage(QtWarningMsg, "getNumberExcessReadMarkers called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getNumberExcessReadMarkers(), QString()); + + QTest::ignoreMessage(QtWarningMsg, "getReadMarkersString called with m_event set to nullptr."); + QCOMPARE(noEventHandler.getReadMarkersString(), QString()); +} + +void EventHandlerTest::cleanup() +{ + eventHandler.setEvent(nullptr); +} + QTEST_MAIN(EventHandlerTest) #include "eventhandlertest.moc" diff --git a/src/eventhandler.cpp b/src/eventhandler.cpp index 3b94f5809..b27d6bd3d 100644 --- a/src/eventhandler.cpp +++ b/src/eventhandler.cpp @@ -19,6 +19,7 @@ #include #include +#include "delegatetype.h" #include "eventhandler_logging.h" #include "events/pollevent.h" #include "linkpreviewer.h" @@ -50,6 +51,10 @@ const Quotient::Event *EventHandler::getEvent() const void EventHandler::setEvent(const Quotient::RoomEvent *event) { + if (m_room == nullptr) { + qCWarning(EventHandling) << "cannot setEvent when m_room is set to nullptr."; + return; + } if (event == m_event) { return; } @@ -181,7 +186,7 @@ QDateTime EventHandler::getTime(bool isPending, QDateTime lastUpdated) const QString EventHandler::getTimeString(bool relative, QLocale::FormatType format, bool isPending, QDateTime lastUpdated) const { if (m_event == nullptr) { - qCWarning(EventHandling) << "getTime called with m_event set to nullptr."; + qCWarning(EventHandling) << "getTimeString called with m_event set to nullptr."; return {}; } if (isPending && lastUpdated == QDateTime()) { @@ -216,6 +221,15 @@ bool EventHandler::isHighlighted() bool EventHandler::isHidden() { + if (m_room == nullptr) { + qCWarning(EventHandling) << "isHidden called with m_room set to nullptr."; + return false; + } + if (m_event == nullptr) { + qCWarning(EventHandling) << "isHidden called with m_event set to nullptr."; + return false; + } + if (m_event->isStateEvent() && !NeoChatConfig::self()->showStateEvent()) { return true; } @@ -611,6 +625,14 @@ QString EventHandler::getGenericBody() const QVariantMap EventHandler::getMediaInfo() const { + if (m_room == nullptr) { + qCWarning(EventHandling) << "getMediaInfo called with m_room set to nullptr."; + return {}; + } + if (m_event == nullptr) { + qCWarning(EventHandling) << "getMediaInfo called with m_event set to nullptr."; + return {}; + } return getMediaInfoForEvent(m_event); } @@ -723,6 +745,14 @@ QVariantMap EventHandler::getMediaInfoFromFileInfo(const EventContent::FileInfo QSharedPointer EventHandler::getLinkPreviewer() const { + if (m_room == nullptr) { + qCWarning(EventHandling) << "getLinkPreviewer called with m_room set to nullptr."; + return nullptr; + } + if (m_event == nullptr) { + qCWarning(EventHandling) << "getLinkPreviewer called with m_event set to nullptr."; + return nullptr; + } if (!m_event->is()) { return nullptr; } @@ -754,7 +784,7 @@ QSharedPointer EventHandler::getReactions() const { if (m_room == nullptr) { qCWarning(EventHandling) << "getReactions called with m_room set to nullptr."; - return {}; + return nullptr; } if (m_event == nullptr) { qCWarning(EventHandling) << "getReactions called with m_event set to nullptr."; @@ -806,16 +836,33 @@ QSharedPointer EventHandler::getReactions() const bool EventHandler::hasReply() const { + if (m_event == nullptr) { + qCWarning(EventHandling) << "hasReply called with m_event set to nullptr."; + return false; + } return !m_event->contentJson()["m.relates_to"_ls].toObject()["m.in_reply_to"_ls].toObject()["event_id"_ls].toString().isEmpty(); } QString EventHandler::getReplyId() const { + if (m_event == nullptr) { + qCWarning(EventHandling) << "getReplyId called with m_event set to nullptr."; + return {}; + } return m_event->contentJson()["m.relates_to"_ls].toObject()["m.in_reply_to"_ls].toObject()["event_id"_ls].toString(); } DelegateType::Type EventHandler::getReplyDelegateType() const { + if (m_room == nullptr) { + qCWarning(EventHandling) << "getReplyDelegateType called with m_room set to nullptr."; + return DelegateType::Other; + } + if (m_event == nullptr) { + qCWarning(EventHandling) << "getReplyDelegateType called with m_event set to nullptr."; + return DelegateType::Other; + } + auto replyEvent = m_room->getReplyForEvent(*m_event); if (replyEvent == nullptr) { return DelegateType::Other; @@ -903,6 +950,11 @@ QVariantMap EventHandler::getReplyMediaInfo() const bool EventHandler::isThreaded() const { + if (m_event == nullptr) { + qCWarning(EventHandling) << "isThreaded called with m_event set to nullptr."; + return false; + } + return (m_event->contentPart("m.relates_to"_ls).contains("rel_type"_ls) && m_event->contentPart("m.relates_to"_ls)["rel_type"_ls].toString() == "m.thread"_ls) || (!m_event->unsignedPart("m.relations"_ls).isEmpty() && m_event->unsignedPart("m.relations"_ls).contains("m.thread"_ls)); @@ -910,6 +962,11 @@ bool EventHandler::isThreaded() const QString EventHandler::threadRoot() const { + if (m_event == nullptr) { + qCWarning(EventHandling) << "threadRoot called with m_event set to nullptr."; + return {}; + } + // Get the thread root ID from m.relates_to if it exists. if (m_event->contentPart("m.relates_to"_ls).contains("rel_type"_ls) && m_event->contentPart("m.relates_to"_ls)["rel_type"_ls].toString() == "m.thread"_ls) { @@ -925,6 +982,11 @@ QString EventHandler::threadRoot() const float EventHandler::getLatitude() const { + if (m_event == nullptr) { + qCWarning(EventHandling) << "getLatitude called with m_event set to nullptr."; + return -100.0; + } + const auto geoUri = m_event->contentJson()["geo_uri"_ls].toString(); if (geoUri.isEmpty()) { return -100.0; // latitude runs from -90deg to +90deg so -100 is out of range. @@ -935,6 +997,11 @@ float EventHandler::getLatitude() const float EventHandler::getLongitude() const { + if (m_event == nullptr) { + qCWarning(EventHandling) << "getLongitude called with m_event set to nullptr."; + return -200.0; + } + const auto geoUri = m_event->contentJson()["geo_uri"_ls].toString(); if (geoUri.isEmpty()) { return -200.0; // longitude runs from -180deg to +180deg so -200 is out of range. @@ -945,6 +1012,11 @@ float EventHandler::getLongitude() const QString EventHandler::getLocationAssetType() const { + if (m_event == nullptr) { + qCWarning(EventHandling) << "getLocationAssetType called with m_event set to nullptr."; + return {}; + } + const auto assetType = m_event->contentJson()["org.matrix.msc3488.asset"_ls].toObject()["type"_ls].toString(); if (assetType.isEmpty()) { return {}; @@ -954,6 +1026,15 @@ QString EventHandler::getLocationAssetType() const bool EventHandler::hasReadMarkers() const { + if (m_room == nullptr) { + qCWarning(EventHandling) << "hasReadMarkers called with m_room set to nullptr."; + return false; + } + if (m_event == nullptr) { + qCWarning(EventHandling) << "hasReadMarkers called with m_event set to nullptr."; + return false; + } + auto userIds = m_room->userIdsAtEvent(m_event->id()); userIds.remove(m_room->localUser()->id()); return userIds.size() > 0; @@ -961,6 +1042,15 @@ bool EventHandler::hasReadMarkers() const QVariantList EventHandler::getReadMarkers(int maxMarkers) const { + if (m_room == nullptr) { + qCWarning(EventHandling) << "getReadMarkers called with m_room set to nullptr."; + return {}; + } + if (m_event == nullptr) { + qCWarning(EventHandling) << "getReadMarkers called with m_event set to nullptr."; + return {}; + } + auto userIds_temp = m_room->userIdsAtEvent(m_event->id()); userIds_temp.remove(m_room->localUser()->id()); @@ -981,6 +1071,15 @@ QVariantList EventHandler::getReadMarkers(int maxMarkers) const QString EventHandler::getNumberExcessReadMarkers(int maxMarkers) const { + if (m_room == nullptr) { + qCWarning(EventHandling) << "getNumberExcessReadMarkers called with m_room set to nullptr."; + return {}; + } + if (m_event == nullptr) { + qCWarning(EventHandling) << "getNumberExcessReadMarkers called with m_event set to nullptr."; + return {}; + } + auto userIds = m_room->userIdsAtEvent(m_event->id()); userIds.remove(m_room->localUser()->id()); @@ -993,6 +1092,15 @@ QString EventHandler::getNumberExcessReadMarkers(int maxMarkers) const QString EventHandler::getReadMarkersString() const { + if (m_room == nullptr) { + qCWarning(EventHandling) << "getReadMarkersString called with m_room set to nullptr."; + return {}; + } + if (m_event == nullptr) { + qCWarning(EventHandling) << "getReadMarkersString called with m_event set to nullptr."; + return {}; + } + auto userIds = m_room->userIdsAtEvent(m_event->id()); userIds.remove(m_room->localUser()->id());