diff options
| author | Linus Jahn <lnj@kaidan.im> | 2020-04-05 12:48:58 +0200 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2020-04-05 13:07:31 +0200 |
| commit | 420fddae862b0f67e7d8fe712006525c0239154e (patch) | |
| tree | 8293c6b0cda42f6cc4fd57b6b79de4bb316180ee | |
| parent | 2197c188f21d563a192be711d13db7d0d1600681 (diff) | |
| download | qxmpp-420fddae862b0f67e7d8fe712006525c0239154e.tar.gz | |
QXmppMessage: Add parent thread attribute from RFC6121
The 'parent' attribute for <thread/> element in messages has been
introduced in RFC6121. This commit adds parsing and serialization for
it, including unit tests.
| -rw-r--r-- | src/base/QXmppMessage.cpp | 37 | ||||
| -rw-r--r-- | src/base/QXmppMessage.h | 3 | ||||
| -rw-r--r-- | tests/qxmppmessage/tst_qxmppmessage.cpp | 31 |
3 files changed, 61 insertions, 10 deletions
diff --git a/src/base/QXmppMessage.cpp b/src/base/QXmppMessage.cpp index daf3e782..743e1dc6 100644 --- a/src/base/QXmppMessage.cpp +++ b/src/base/QXmppMessage.cpp @@ -107,6 +107,7 @@ public: QString body; QString subject; QString thread; + QString parentThread; // XEP-0071: XHTML-IM QString xhtml; @@ -412,6 +413,30 @@ void QXmppMessage::setThread(const QString &thread) d->thread = thread; } +/// +/// Returns the optional parent thread of this message. +/// +/// The possibility to create child threads was added in RFC6121. +/// +/// \since QXmpp 1.3 +/// +QString QXmppMessage::parentThread() const +{ + return d->parentThread; +} + +/// +/// Sets the optional parent thread of this message. +/// +/// The possibility to create child threads was added in RFC6121. +/// +/// \since QXmpp 1.3 +/// +void QXmppMessage::setParentThread(const QString &parent) +{ + d->parentThread = parent; +} + /// Returns the message's XHTML body as defined by /// \xep{0071}: XHTML-IM. @@ -980,6 +1005,8 @@ void QXmppMessage::parse(const QDomElement &element) d->subject = childElement.text(); } else if (childElement.tagName() == QStringLiteral("thread")) { d->thread = childElement.text(); + d->parentThread = childElement.attribute(QStringLiteral("parent")); + // parse message extensions // XEP-0033: Extended Stanza Addressing and errors are parsed by QXmppStanza } else if (!checkElement(childElement, QStringLiteral("addresses"), ns_extended_addressing) && @@ -1003,8 +1030,12 @@ void QXmppMessage::toXml(QXmlStreamWriter *xmlWriter) const helperToXmlAddTextElement(xmlWriter, QStringLiteral("subject"), d->subject); if (!d->body.isEmpty()) helperToXmlAddTextElement(xmlWriter, QStringLiteral("body"), d->body); - if (!d->thread.isEmpty()) - helperToXmlAddTextElement(xmlWriter, QStringLiteral("thread"), d->thread); + if (!d->thread.isEmpty()) { + xmlWriter->writeStartElement(QStringLiteral("thread")); + helperToXmlAddAttribute(xmlWriter, QStringLiteral("parent"), d->parentThread); + xmlWriter->writeCharacters(d->thread); + xmlWriter->writeEndElement(); + } error().toXml(xmlWriter); // chat states @@ -1057,7 +1088,7 @@ void QXmppMessage::toXml(QXmlStreamWriter *xmlWriter) const xmlWriter->writeEndElement(); } - // \xep{0224}: Attention + // XEP-0224: Attention if (d->attentionRequested) { xmlWriter->writeStartElement(QStringLiteral("attention")); xmlWriter->writeDefaultNamespace(ns_attention); diff --git a/src/base/QXmppMessage.h b/src/base/QXmppMessage.h index 3d8e3ed8..3f311519 100644 --- a/src/base/QXmppMessage.h +++ b/src/base/QXmppMessage.h @@ -136,6 +136,9 @@ public: QString thread() const; void setThread(const QString &); + QString parentThread() const; + void setParentThread(const QString &); + QXmppMessage::Type type() const; void setType(QXmppMessage::Type); diff --git a/tests/qxmppmessage/tst_qxmppmessage.cpp b/tests/qxmppmessage/tst_qxmppmessage.cpp index bfd4daec..e9596799 100644 --- a/tests/qxmppmessage/tst_qxmppmessage.cpp +++ b/tests/qxmppmessage/tst_qxmppmessage.cpp @@ -72,38 +72,52 @@ void tst_QXmppMessage::testBasic_data() QTest::addColumn<QString>("body"); QTest::addColumn<QString>("subject"); QTest::addColumn<QString>("thread"); + QTest::addColumn<QString>("parentThread"); QTest::newRow("error") << QByteArray(R"(<message to="foo@example.com/QXmpp" from="bar@example.com/QXmpp" type="error"/>)") << int(QXmppMessage::Error) - << QString() << QString() << QString(); + << QString() << QString() << QString() << QString(); QTest::newRow("normal") << QByteArray(R"(<message to="foo@example.com/QXmpp" from="bar@example.com/QXmpp" type="normal"/>)") << int(QXmppMessage::Normal) - << QString() << QString() << QString(); + << QString() << QString() << QString() << QString(); QTest::newRow("chat") << QByteArray(R"(<message to="foo@example.com/QXmpp" from="bar@example.com/QXmpp" type="chat"/>)") << int(QXmppMessage::Chat) - << QString() << QString() << QString(); + << QString() << QString() << QString() << QString(); QTest::newRow("groupchat") << QByteArray(R"(<message to="foo@example.com/QXmpp" from="bar@example.com/QXmpp" type="groupchat"/>)") << int(QXmppMessage::GroupChat) - << QString() << QString() << QString(); + << QString() << QString() << QString() << QString(); QTest::newRow("headline") << QByteArray(R"(<message to="foo@example.com/QXmpp" from="bar@example.com/QXmpp" type="headline"/>)") << int(QXmppMessage::Headline) - << QString() << QString() << QString(); + << QString() << QString() << QString() << QString(); + + QTest::newRow("no-parent-thread") + << QByteArray("<message to=\"foo@example.com/QXmpp\" from=\"bar@example.com/QXmpp\" type=\"normal\">" + "<subject>test subject</subject>" + "<body>test body & stuff</body>" + "<thread>0e3141cd80894871a68e6fe6b1ec56fa</thread>" + "</message>") + << int(QXmppMessage::Normal) + << "test body & stuff" + << "test subject" + << "0e3141cd80894871a68e6fe6b1ec56fa" + << QString(); QTest::newRow("full") << QByteArray("<message to=\"foo@example.com/QXmpp\" from=\"bar@example.com/QXmpp\" type=\"normal\">" "<subject>test subject</subject>" "<body>test body & stuff</body>" - "<thread>test thread</thread>" + "<thread parent=\"e0ffe42b28561960c6b12b944a092794b9683a38\">0e3141cd80894871a68e6fe6b1ec56fa</thread>" "</message>") << int(QXmppMessage::Normal) << "test body & stuff" << "test subject" - << "test thread"; + << "0e3141cd80894871a68e6fe6b1ec56fa" + << "e0ffe42b28561960c6b12b944a092794b9683a38"; } void tst_QXmppMessage::testBasic() @@ -113,6 +127,7 @@ void tst_QXmppMessage::testBasic() QFETCH(QString, body); QFETCH(QString, subject); QFETCH(QString, thread); + QFETCH(QString, parentThread); QXmppMessage message; parsePacket(message, xml); @@ -123,6 +138,7 @@ void tst_QXmppMessage::testBasic() QCOMPARE(message.body(), body); QCOMPARE(message.subject(), subject); QCOMPARE(message.thread(), thread); + QCOMPARE(message.parentThread(), parentThread); QCOMPARE(message.state(), QXmppMessage::None); QCOMPARE(message.isAttentionRequested(), false); QCOMPARE(message.isReceiptRequested(), false); @@ -147,6 +163,7 @@ void tst_QXmppMessage::testBasic() message.setBody(body); message.setSubject(subject); message.setThread(thread); + message.setParentThread(parentThread); serializePacket(message, xml); } |
