aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2019-01-04 22:02:37 +0100
committerJeremy Lainé <jeremy.laine@m4x.org>2019-05-01 10:24:51 +0200
commitf8fc440ef424dec4e465eb6a57eadb734f43da59 (patch)
tree1fb9eba0b57690941cf63614e91a454da2370b47
parent27f6a12ee97dc3968aa46ce004ecd87d3c55c8ac (diff)
downloadqxmpp-f8fc440ef424dec4e465eb6a57eadb734f43da59.tar.gz
Implement MIX-CORE XEP-0396: Message extension
This implements the new message extension specified by XEP-0369: Mediated Information eXchange (MIX) in version 0.14.2. https://xmpp.org/extensions/xep-0369.html#usecase-user-message
-rw-r--r--src/base/QXmppMessage.cpp45
-rw-r--r--src/base/QXmppMessage.h7
-rw-r--r--tests/qxmppmessage/tst_qxmppmessage.cpp28
3 files changed, 80 insertions, 0 deletions
diff --git a/src/base/QXmppMessage.cpp b/src/base/QXmppMessage.cpp
index f5869bf4..0bd28da6 100644
--- a/src/base/QXmppMessage.cpp
+++ b/src/base/QXmppMessage.cpp
@@ -102,6 +102,10 @@ public:
// XEP-0308: Last Message Correction
QString replaceId;
+
+ // XEP-0369: Mediated Information eXchange (MIX)
+ QString mixUserJid;
+ QString mixUserNick;
};
/// Constructs a QXmppMessage.
@@ -513,6 +517,34 @@ void QXmppMessage::setReplaceId(const QString &replaceId)
d->replaceId = replaceId;
}
+/// Returns the actual JID of a MIX channel participant.
+
+QString QXmppMessage::mixUserJid() const
+{
+ return d->mixUserJid;
+}
+
+/// Sets the actual JID of a MIX channel participant.
+
+void QXmppMessage::setMixUserJid(const QString& mixUserJid)
+{
+ d->mixUserJid = mixUserJid;
+}
+
+/// Returns the MIX participant's nickname.
+
+QString QXmppMessage::mixUserNick() const
+{
+ return d->mixUserNick;
+}
+
+/// Sets the MIX participant's nickname.
+
+void QXmppMessage::setMixUserNick(const QString& mixUserNick)
+{
+ d->mixUserNick = mixUserNick;
+}
+
/// \cond
void QXmppMessage::parse(const QDomElement &element)
{
@@ -654,6 +686,10 @@ void QXmppMessage::parse(const QDomElement &element)
else {
extensions << QXmppElement(xElement);
}
+ // XEP-0369: Mediated Information eXchange (MIX)
+ } else if (xElement.tagName() == "mix" && xElement.namespaceURI() == ns_mix) {
+ d->mixUserJid = xElement.firstChildElement("jid").text();
+ d->mixUserNick = xElement.firstChildElement("nick").text();
} else if (!knownElems.contains(qMakePair(xElement.tagName(), xElement.namespaceURI())) &&
!knownElems.contains(qMakePair(xElement.tagName(), QString()))) {
// other extensions
@@ -791,6 +827,15 @@ void QXmppMessage::toXml(QXmlStreamWriter *xmlWriter) const
xmlWriter->writeEndElement();
}
+ // XEP-0369: Mediated Information eXchange (MIX)
+ if (!d->mixUserJid.isEmpty() || !d->mixUserNick.isEmpty()) {
+ xmlWriter->writeStartElement("mix");
+ xmlWriter->writeAttribute("xmlns", ns_mix);
+ helperToXmlAddTextElement(xmlWriter, "jid", d->mixUserJid);
+ helperToXmlAddTextElement(xmlWriter, "nick", d->mixUserNick);
+ xmlWriter->writeEndElement();
+ }
+
// other extensions
QXmppStanza::extensionsToXml(xmlWriter);
diff --git a/src/base/QXmppMessage.h b/src/base/QXmppMessage.h
index e0c3d831..36f5d3e0 100644
--- a/src/base/QXmppMessage.h
+++ b/src/base/QXmppMessage.h
@@ -143,6 +143,13 @@ public:
QString replaceId() const;
void setReplaceId(const QString&);
+ // XEP-0369: Mediated Information eXchange (MIX)
+ QString mixUserJid() const;
+ void setMixUserJid(const QString&);
+
+ QString mixUserNick() const;
+ void setMixUserNick(const QString&);
+
/// \cond
void parse(const QDomElement &element);
void toXml(QXmlStreamWriter *writer) const;
diff --git a/tests/qxmppmessage/tst_qxmppmessage.cpp b/tests/qxmppmessage/tst_qxmppmessage.cpp
index 0218bb93..c026ad86 100644
--- a/tests/qxmppmessage/tst_qxmppmessage.cpp
+++ b/tests/qxmppmessage/tst_qxmppmessage.cpp
@@ -48,6 +48,7 @@ private slots:
void testPrivateMessage();
void testOutOfBandUrl();
void testMessageCorrect();
+ void testMix();
};
void tst_QXmppMessage::testBasic_data()
@@ -615,5 +616,32 @@ void tst_QXmppMessage::testMessageCorrect()
QCOMPARE(message.replaceId(), QString("someotherid"));
}
+void tst_QXmppMessage::testMix()
+{
+ const QByteArray xml(
+ "<message to=\"hag66@shakespeare.example\" "
+ "from=\"coven@mix.shakespeare.example/123456\" "
+ "type=\"groupchat\">"
+ "<body>Harpier cries: 'tis time, 'tis time.</body>"
+ "<mix xmlns=\"urn:xmpp:mix:core:0\">"
+ "<jid>hag66@shakespeare.example</jid>"
+ "<nick>thirdwitch</nick>"
+ "</mix>"
+ "</message>"
+ );
+
+ QXmppMessage message;
+ parsePacket(message, xml);
+ serializePacket(message, xml);
+
+ QCOMPARE(message.mixUserJid(), QString("hag66@shakespeare.example"));
+ QCOMPARE(message.mixUserNick(), QString("thirdwitch"));
+
+ message.setMixUserJid("alexander@example.org");
+ QCOMPARE(message.mixUserJid(), QString("alexander@example.org"));
+ message.setMixUserNick("erik");
+ QCOMPARE(message.mixUserNick(), QString("erik"));
+}
+
QTEST_MAIN(tst_QXmppMessage)
#include "tst_qxmppmessage.moc"