diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-03-02 22:31:12 +0100 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-03-03 13:49:50 +0100 |
| commit | 274da5d7bc049c748b0eb04f24275efe15ab7720 (patch) | |
| tree | 829789ee3cdf377a570830642d262027cdf0dd53 | |
| parent | ec1480a11ee69924712b3b1b10cde7fbf6ba1866 (diff) | |
| download | qxmpp-274da5d7bc049c748b0eb04f24275efe15ab7720.tar.gz | |
Stanza: Make E2eeMetadata optional to avoid allocation
Avoids an allocation of the E2eeMetadataPrivate object when it's not
used.
It doesn't use optional<E2eeMetadata> directly because that wouldn't
avoid the allocation and takes up 16 bytes instead of 8.
This concept could be generalized and used elsewhere in the code
(e.g. extended addresses in the stanza are unused 99% of the time).
| -rw-r--r-- | src/base/QXmppStanza.cpp | 28 | ||||
| -rw-r--r-- | src/base/QXmppStanza.h | 14 | ||||
| -rw-r--r-- | src/client/QXmppAtmManager.cpp | 3 | ||||
| -rw-r--r-- | tests/qxmppatmmanager/tst_qxmppatmmanager.cpp | 2 | ||||
| -rw-r--r-- | tests/qxmppstanza/tst_qxmppstanza.cpp | 16 |
5 files changed, 48 insertions, 15 deletions
diff --git a/src/base/QXmppStanza.cpp b/src/base/QXmppStanza.cpp index 25b9baac..3aff0404 100644 --- a/src/base/QXmppStanza.cpp +++ b/src/base/QXmppStanza.cpp @@ -525,6 +525,24 @@ QXmppE2eeMetadata::QXmppE2eeMetadata(const QXmppE2eeMetadata &other) = default; QXmppE2eeMetadata::~QXmppE2eeMetadata() = default; +/// \cond +QXmppE2eeMetadata::QXmppE2eeMetadata(const std::optional<QXmppE2eeMetadata> &other) + : d(nullptr) +{ + if (other) { + *this = *other; + } +} + +std::optional<QXmppE2eeMetadata> QXmppE2eeMetadata::toOptional() const +{ + if (d) { + return *this; + } + return {}; +} +/// \endcond + /// /// Assigns \a other to this end-to-end encryption metadata class. /// @@ -618,7 +636,7 @@ public: QXmppStanza::Error error; QXmppElementList extensions; QList<QXmppExtendedAddress> extendedAddresses; - QXmppE2eeMetadata e2eeMetadata; + QXmppE2eeMetadata e2eeMetadata = QXmppE2eeMetadata(std::nullopt); }; /// @@ -776,9 +794,9 @@ void QXmppStanza::setExtendedAddresses(const QList<QXmppExtendedAddress> &addres /// /// \since QXmpp 1.5 /// -QXmppE2eeMetadata QXmppStanza::e2eeMetadata() const +std::optional<QXmppE2eeMetadata> QXmppStanza::e2eeMetadata() const { - return d->e2eeMetadata; + return d->e2eeMetadata.toOptional(); } /// @@ -786,9 +804,9 @@ QXmppE2eeMetadata QXmppStanza::e2eeMetadata() const /// /// \since QXmpp 1.5 /// -void QXmppStanza::setE2eeMetadata(const QXmppE2eeMetadata &e2eeMetadata) +void QXmppStanza::setE2eeMetadata(const std::optional<QXmppE2eeMetadata> &e2eeMetadata) { - d->e2eeMetadata = e2eeMetadata; + d->e2eeMetadata = QXmppE2eeMetadata(e2eeMetadata); } /// \cond diff --git a/src/base/QXmppStanza.h b/src/base/QXmppStanza.h index 34cd1aed..91c01af0 100644 --- a/src/base/QXmppStanza.h +++ b/src/base/QXmppStanza.h @@ -8,6 +8,8 @@ #ifndef QXMPPSTANZA_H #define QXMPPSTANZA_H +#include <optional> + #include <QByteArray> #include <QSharedData> #include <QString> @@ -83,6 +85,14 @@ public: void setSceTimestamp(const QDateTime ×tamp); private: + friend class QXmppStanza; + friend class QXmppStanzaPrivate; + + /// \cond + explicit QXmppE2eeMetadata(const std::optional<QXmppE2eeMetadata> &other); + std::optional<QXmppE2eeMetadata> toOptional() const; + /// \endcond + QSharedDataPointer<QXmppE2eeMetadataPrivate> d; }; @@ -225,8 +235,8 @@ public: QList<QXmppExtendedAddress> extendedAddresses() const; void setExtendedAddresses(const QList<QXmppExtendedAddress> &extendedAddresses); - QXmppE2eeMetadata e2eeMetadata() const; - void setE2eeMetadata(const QXmppE2eeMetadata &e2eeMetadata); + std::optional<QXmppE2eeMetadata> e2eeMetadata() const; + void setE2eeMetadata(const std::optional<QXmppE2eeMetadata> &e2eeMetadata); /// \cond void parse(const QDomElement &element) override; diff --git a/src/client/QXmppAtmManager.cpp b/src/client/QXmppAtmManager.cpp index 957ed8ef..2c9a8568 100644 --- a/src/client/QXmppAtmManager.cpp +++ b/src/client/QXmppAtmManager.cpp @@ -297,7 +297,8 @@ QFuture<void> QXmppAtmManager::handleMessage(const QXmppMessage &message) trustMessageElement->usage() == ns_atm && message.from() != client()->configuration().jid()) { const auto senderJid = QXmppUtils::jidToBareJid(message.from()); - const auto senderKey = message.e2eeMetadata().senderKey(); + const auto e2eeMetadata = message.e2eeMetadata(); + const auto senderKey = e2eeMetadata ? e2eeMetadata->senderKey() : QByteArray(); const auto encryption = trustMessageElement->encryption(); auto future = m_trustStorage->trustLevel(encryption, senderKey); diff --git a/tests/qxmppatmmanager/tst_qxmppatmmanager.cpp b/tests/qxmppatmmanager/tst_qxmppatmmanager.cpp index e8fd08a4..215d7e8c 100644 --- a/tests/qxmppatmmanager/tst_qxmppatmmanager.cpp +++ b/tests/qxmppatmmanager/tst_qxmppatmmanager.cpp @@ -842,7 +842,7 @@ void tst_QXmppAtmManager::testHandleMessage() QFETCH(bool, isSenderKeyAuthenticated); const auto senderJid = QXmppUtils::jidToBareJid(message.from()); - const auto senderKey = message.e2eeMetadata().senderKey(); + const auto senderKey = message.e2eeMetadata()->senderKey(); // Add the sender key in preparation for the test. if (areTrustDecisionsValid) { diff --git a/tests/qxmppstanza/tst_qxmppstanza.cpp b/tests/qxmppstanza/tst_qxmppstanza.cpp index 98be3d63..b4826e1b 100644 --- a/tests/qxmppstanza/tst_qxmppstanza.cpp +++ b/tests/qxmppstanza/tst_qxmppstanza.cpp @@ -386,22 +386,26 @@ void tst_QXmppStanza::testSenderKey() { QXmppStanzaStub stanza; auto e2eeMetadata = stanza.e2eeMetadata(); - QVERIFY(e2eeMetadata.senderKey().isEmpty()); - e2eeMetadata.setSenderKey(QByteArray::fromBase64(QByteArrayLiteral("aFABnX7Q/rbTgjBySYzrT2FsYCVYb49mbca5yB734KQ="))); + QVERIFY(!e2eeMetadata.has_value()); + e2eeMetadata = QXmppE2eeMetadata(); + e2eeMetadata->setSenderKey(QByteArray::fromBase64(QByteArrayLiteral("aFABnX7Q/rbTgjBySYzrT2FsYCVYb49mbca5yB734KQ="))); stanza.setE2eeMetadata(e2eeMetadata); e2eeMetadata = stanza.e2eeMetadata(); - QCOMPARE(e2eeMetadata.senderKey(), QByteArray::fromBase64(QByteArrayLiteral("aFABnX7Q/rbTgjBySYzrT2FsYCVYb49mbca5yB734KQ="))); + QCOMPARE(e2eeMetadata->senderKey(), QByteArray::fromBase64(QByteArrayLiteral("aFABnX7Q/rbTgjBySYzrT2FsYCVYb49mbca5yB734KQ="))); } void tst_QXmppStanza::testSceTimestamp() { QXmppStanzaStub stanza; auto e2eeMetadata = stanza.e2eeMetadata(); - QVERIFY(e2eeMetadata.sceTimestamp().isNull()); - e2eeMetadata.setSceTimestamp(QDateTime(QDate(2022, 01, 01), QTime())); + QVERIFY(!e2eeMetadata.has_value()); + e2eeMetadata = QXmppE2eeMetadata(); + QVERIFY(e2eeMetadata->senderKey().isEmpty()); + QVERIFY(e2eeMetadata->sceTimestamp().isNull()); + e2eeMetadata->setSceTimestamp(QDateTime(QDate(2022, 01, 01), QTime())); stanza.setE2eeMetadata(e2eeMetadata); e2eeMetadata = stanza.e2eeMetadata(); - QCOMPARE(e2eeMetadata.sceTimestamp(), QDateTime(QDate(2022, 01, 01), QTime())); + QCOMPARE(e2eeMetadata->sceTimestamp(), QDateTime(QDate(2022, 01, 01), QTime())); } QTEST_MAIN(tst_QXmppStanza) |
