diff options
| author | Linus Jahn <lnj@kaidan.im> | 2019-11-16 23:14:46 +0100 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2019-12-06 22:26:12 +0100 |
| commit | 46e148fb2d3396ca33bba1aa400e55651c7a9c61 (patch) | |
| tree | bcec9b21b6b360f016135bee542902efcab0c973 | |
| parent | 0ef3588af37a7eb28af1dd33c9c3ad06b29f80d7 (diff) | |
| download | qxmpp-46e148fb2d3396ca33bba1aa400e55651c7a9c61.tar.gz | |
Implement XEP-0231: Bits of Binary: message extension
This adds support for XEP-0231: Bits of Binary attachments in messages.
| -rw-r--r-- | src/base/QXmppMessage.cpp | 44 | ||||
| -rw-r--r-- | src/base/QXmppMessage.h | 6 | ||||
| -rw-r--r-- | tests/qxmppmessage/tst_qxmppmessage.cpp | 98 |
3 files changed, 148 insertions, 0 deletions
diff --git a/src/base/QXmppMessage.cpp b/src/base/QXmppMessage.cpp index 47f9bed9..6ef292ef 100644 --- a/src/base/QXmppMessage.cpp +++ b/src/base/QXmppMessage.cpp @@ -28,6 +28,7 @@ #include <QTextStream> #include <QXmlStreamWriter> +#include "QXmppBitsOfBinaryDataList.h" #include "QXmppConstants_p.h" #include "QXmppMessage.h" #include "QXmppUtils.h" @@ -125,6 +126,9 @@ public: QString markedId; QString markedThread; + // XEP-0231: Bits of Binary + QXmppBitsOfBinaryDataList bitsOfBinaryData; + // XEP-0280: Message Carbons bool privatemsg; @@ -481,6 +485,37 @@ void QXmppMessage::setMarker(const Marker marker) d->marker = marker; } +/// Returns a list of data packages attached using XEP-0231: Bits of Binary. +/// +/// This could be used to resolve \c cid: URIs found in the X-HTML body. +/// +/// \since QXmpp 1.2 + +QXmppBitsOfBinaryDataList QXmppMessage::bitsOfBinaryData() const +{ + return d->bitsOfBinaryData; +} + +/// Returns a list of data attached using XEP-0231: Bits of Binary. +/// +/// This could be used to resolve \c cid: URIs found in the X-HTML body. +/// +/// \since QXmpp 1.2 + +QXmppBitsOfBinaryDataList &QXmppMessage::bitsOfBinaryData() +{ + return d->bitsOfBinaryData; +} + +/// Sets a list of XEP-0231: Bits of Binary attachments to be included. +/// +/// \since QXmpp 1.2 + +void QXmppMessage::setBitsOfBinaryData(const QXmppBitsOfBinaryDataList &bitsOfBinaryData) +{ + d->bitsOfBinaryData = bitsOfBinaryData; +} + /// Returns if the message is marked with a <private> tag, /// in which case it will not be forwarded to other resources /// according to XEP-0280: Message Carbons. @@ -896,6 +931,10 @@ void QXmppMessage::toXml(QXmlStreamWriter *xmlWriter) const xmlWriter->writeEndElement(); } + // XEP-0231: Bits of Binary + for (const auto &data : qAsConst(d->bitsOfBinaryData)) + data.toXmlElementFromChild(xmlWriter); + // XEP-0280: Message Carbons if (d->privatemsg) { xmlWriter->writeStartElement(QStringLiteral("private")); @@ -1016,6 +1055,11 @@ void QXmppMessage::parseExtension(const QDomElement &element, QXmppElementList & // XEP-0224: Attention } else if (checkElement(element, QStringLiteral("attention"), ns_attention)) { d->attentionRequested = true; + // XEP-0231: Bits of Binary + } else if (QXmppBitsOfBinaryData::isBitsOfBinaryData(element)) { + QXmppBitsOfBinaryData data; + data.parseElementFromChild(element); + d->bitsOfBinaryData << data; // XEP-0280: Message Carbons } else if (checkElement(element, QStringLiteral("private"), ns_carbons)) { d->privatemsg = true; diff --git a/src/base/QXmppMessage.h b/src/base/QXmppMessage.h index 3eebce81..b4864eec 100644 --- a/src/base/QXmppMessage.h +++ b/src/base/QXmppMessage.h @@ -32,6 +32,7 @@ #include "QXmppStanza.h" class QXmppMessagePrivate; +class QXmppBitsOfBinaryDataList; /// \brief The QXmppMessage class represents an XMPP message. /// @@ -154,6 +155,11 @@ public: Marker marker() const; void setMarker(const Marker); + // XEP-0231: Bits of Binary + QXmppBitsOfBinaryDataList bitsOfBinaryData() const; + QXmppBitsOfBinaryDataList &bitsOfBinaryData(); + void setBitsOfBinaryData(const QXmppBitsOfBinaryDataList &bitsOfBinaryData); + // XEP-0280: Message Carbons bool isPrivate() const; void setPrivate(const bool); diff --git a/tests/qxmppmessage/tst_qxmppmessage.cpp b/tests/qxmppmessage/tst_qxmppmessage.cpp index a5b595d3..ceddd73a 100644 --- a/tests/qxmppmessage/tst_qxmppmessage.cpp +++ b/tests/qxmppmessage/tst_qxmppmessage.cpp @@ -23,6 +23,8 @@ */ #include <QObject> +#include "QXmppBitsOfBinaryContentId.h" +#include "QXmppBitsOfBinaryDataList.h" #include "QXmppMessage.h" #include "util.h" @@ -55,6 +57,7 @@ private slots: void testEme(); void testSpoiler(); void testProcessingHints(); + void testBobData(); }; void tst_QXmppMessage::testBasic_data() @@ -124,6 +127,7 @@ void tst_QXmppMessage::testBasic() QVERIFY(!message.hasHint(QXmppMessage::NoStore)); QVERIFY(!message.hasHint(QXmppMessage::NoCopy)); QVERIFY(!message.hasHint(QXmppMessage::Store)); + QCOMPARE(message.bitsOfBinaryData(), QXmppBitsOfBinaryDataList()); message = QXmppMessage(); message.setTo(QStringLiteral("foo@example.com/QXmpp")); @@ -875,5 +879,99 @@ void tst_QXmppMessage::testProcessingHints() QVERIFY(!message2.hasHint(QXmppMessage::Store)); } +void tst_QXmppMessage::testBobData() +{ + const QByteArray xml = QByteArrayLiteral( + "<message type=\"chat\">" + "<data xmlns=\"urn:xmpp:bob\" " + "cid=\"sha1+5a4c38d44fc64805cbb2d92d8b208be13ff40c0f@bob.xmpp.org\" " + "max-age=\"86400\" " + "type=\"image/png\">" + "iVBORw0KGgoAAAANSUhEUgAAALQAAAA8BAMAAAA9AI20AAAAG1BMVEX///8AAADf39+" + "/v79/f39fX1+fn58/Pz8fHx/8ACGJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADS0lEQV" + "RYhe2WS3MSQRCAYTf7OKY1kT0CxsRjHmh5BENIjqEk6pHVhFzdikqO7CGyP9t59Ox2z" + "y6UeWBVqugLzM70Nz39mqnV1lIWgBWiYXV0BYfNZ0mvwypds1r62vH/gf76ZL/88Qlc" + "41zeAnQrpx5H3z1Npfr5ovmHusa9SpRiNNIOcdrto6PJ5LLfb5bp9zM+VDq/vptxDEa" + "a1sql9I3R5KhtfQsA5gNCWYyulV3TyTUDdfL56BvdDl4x7RiybDq9uBgxh1TTPUHDvA" + "qNQb+LpT5sWehxJZKKcU2MZ6sDE7PMgW2mdlBGdy6ODe6fJFdMI+us95dNqftDMdwU6" + "+MhpuTS9slcy5TFAcwq0Jt6qssJMTQGp4BGURlmSsNoo5oHL4kqc66NdkDO75mIfCxm" + "RAlvHxMLdcb7JONavMJbttXXKoMSneYu3OQTlwkUh4mNayi6js55/2VcsZOQfXIYelz" + "xLcntEGc3WVCsCORJVCc5r0ajAcq+EO1Q0oPm7n7+X/3jEReGdL6qT7Ml6FCjY+quJC" + "r+D01f6BG0SaHG56ZG32DnY2jcEV1+pU0kxTaEwaGcekN7jyu50U/TV4q6YeieyiNTu" + "klDKZLukyjKVNwotCUB3B0XO1WjHT3c0DHSO2zACwut8GOiljJIHaJsrlof/fpWNzGM" + "os6TgIY0hZNpJshzSi4igOhy3cl4qK+YgnqHkAYcZEgdW6/HyrEK7afoY7RCFzArLl2" + "LLDdrdmmHZfROajwIDfWj8yQG+rzwlA3WvdJiMHtjUekiNrp1oCbmyZDEyKROGjFVDr" + "PRzlkR9UAfG/OErnPxrop5BwpoEpXQorq2zcGxbnBJndx8Bh0yljGiGv0B4E8+YP3Xp" + "2rGydZNy4csW8W2pIvWhvijoujRJ0luXsoymV+8AXvE9HjII72+oReS6OfomHe3xWg/" + "f2coSbDa1XZ1CvGMjy1nH9KBl83oPnQKi+vAXKLjCrRvvT2WCMkPmSFbquiVuTH1qjv" + "p4j/u7CWyI5/Hn3KAaJJ90eP0Zp1Kjets4WPaElkxheF7cpBESzXuIdLwyFjSub07tB" + "6JjxH3DGiu+zwHHimdtFsMvKqG/nBxm2TwbvyU6LWs5RnJX4dSldg3QhDLAAAAAElFT" + "kSuQmCC" + "</data>" + "</message>" + ); + + QXmppBitsOfBinaryData data; + data.setCid(QXmppBitsOfBinaryContentId::fromContentId( + QStringLiteral("sha1+5a4c38d44fc64805cbb2d92d8b208be13ff40c0f@bob.xmpp.org") + )); + data.setContentType(QMimeDatabase().mimeTypeForName(QStringLiteral("image/png"))); + data.setData(QByteArray::fromBase64(QByteArrayLiteral( + "iVBORw0KGgoAAAANSUhEUgAAALQAAAA8BAMAAAA9AI20AAAAG1BMVEX///8AAADf39+" + "/v79/f39fX1+fn58/Pz8fHx/8ACGJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADS0lEQV" + "RYhe2WS3MSQRCAYTf7OKY1kT0CxsRjHmh5BENIjqEk6pHVhFzdikqO7CGyP9t59Ox2z" + "y6UeWBVqugLzM70Nz39mqnV1lIWgBWiYXV0BYfNZ0mvwypds1r62vH/gf76ZL/88Qlc" + "41zeAnQrpx5H3z1Npfr5ovmHusa9SpRiNNIOcdrto6PJ5LLfb5bp9zM+VDq/vptxDEa" + "a1sql9I3R5KhtfQsA5gNCWYyulV3TyTUDdfL56BvdDl4x7RiybDq9uBgxh1TTPUHDvA" + "qNQb+LpT5sWehxJZKKcU2MZ6sDE7PMgW2mdlBGdy6ODe6fJFdMI+us95dNqftDMdwU6" + "+MhpuTS9slcy5TFAcwq0Jt6qssJMTQGp4BGURlmSsNoo5oHL4kqc66NdkDO75mIfCxm" + "RAlvHxMLdcb7JONavMJbttXXKoMSneYu3OQTlwkUh4mNayi6js55/2VcsZOQfXIYelz" + "xLcntEGc3WVCsCORJVCc5r0ajAcq+EO1Q0oPm7n7+X/3jEReGdL6qT7Ml6FCjY+quJC" + "r+D01f6BG0SaHG56ZG32DnY2jcEV1+pU0kxTaEwaGcekN7jyu50U/TV4q6YeieyiNTu" + "klDKZLukyjKVNwotCUB3B0XO1WjHT3c0DHSO2zACwut8GOiljJIHaJsrlof/fpWNzGM" + "os6TgIY0hZNpJshzSi4igOhy3cl4qK+YgnqHkAYcZEgdW6/HyrEK7afoY7RCFzArLl2" + "LLDdrdmmHZfROajwIDfWj8yQG+rzwlA3WvdJiMHtjUekiNrp1oCbmyZDEyKROGjFVDr" + "PRzlkR9UAfG/OErnPxrop5BwpoEpXQorq2zcGxbnBJndx8Bh0yljGiGv0B4E8+YP3Xp" + "2rGydZNy4csW8W2pIvWhvijoujRJ0luXsoymV+8AXvE9HjII72+oReS6OfomHe3xWg/" + "f2coSbDa1XZ1CvGMjy1nH9KBl83oPnQKi+vAXKLjCrRvvT2WCMkPmSFbquiVuTH1qjv" + "p4j/u7CWyI5/Hn3KAaJJ90eP0Zp1Kjets4WPaElkxheF7cpBESzXuIdLwyFjSub07tB" + "6JjxH3DGiu+zwHHimdtFsMvKqG/nBxm2TwbvyU6LWs5RnJX4dSldg3QhDLAAAAAElFT" + "kSuQmCC" + ))); + data.setMaxAge(86400); + + QXmppMessage message; + parsePacket(message, xml); + QCOMPARE(message.type(), QXmppMessage::Chat); + QCOMPARE(message.id(), QStringLiteral("")); + QCOMPARE(message.bitsOfBinaryData().size(), 1); + QCOMPARE(message.bitsOfBinaryData().first().cid().algorithm(), data.cid().algorithm()); + QCOMPARE(message.bitsOfBinaryData().first().cid().hash(), data.cid().hash()); + QCOMPARE(message.bitsOfBinaryData().first().cid(), data.cid()); + QCOMPARE(message.bitsOfBinaryData().first().contentType(), data.contentType()); + QCOMPARE(message.bitsOfBinaryData().first().maxAge(), data.maxAge()); + QCOMPARE(message.bitsOfBinaryData().first().data(), data.data()); + QCOMPARE(message.bitsOfBinaryData().first(), data); + serializePacket(message, xml); + + QXmppMessage msg; + msg.setType(QXmppMessage::Chat); + msg.setId(QStringLiteral("")); + QXmppBitsOfBinaryDataList bobDataList; + bobDataList << data; + msg.setBitsOfBinaryData(bobDataList); + serializePacket(msg, xml); + + QXmppMessage msg2; + msg2.setType(QXmppMessage::Chat); + msg2.setId(QStringLiteral("")); + msg2.bitsOfBinaryData() << data; + serializePacket(msg2, xml); + + // test const getter + const QXmppMessage constMessage = msg; + QCOMPARE(constMessage.bitsOfBinaryData(), msg.bitsOfBinaryData()); +} + QTEST_MAIN(tst_QXmppMessage) #include "tst_qxmppmessage.moc" |
