aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2020-04-05 12:48:58 +0200
committerLNJ <lnj@kaidan.im>2020-04-05 13:07:31 +0200
commit420fddae862b0f67e7d8fe712006525c0239154e (patch)
tree8293c6b0cda42f6cc4fd57b6b79de4bb316180ee
parent2197c188f21d563a192be711d13db7d0d1600681 (diff)
downloadqxmpp-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.cpp37
-rw-r--r--src/base/QXmppMessage.h3
-rw-r--r--tests/qxmppmessage/tst_qxmppmessage.cpp31
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 &amp; 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 &amp; 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);
}