diff options
| author | Linus Jahn <lnj@kaidan.im> | 2019-01-04 22:02:37 +0100 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2019-05-01 10:24:51 +0200 |
| commit | f8fc440ef424dec4e465eb6a57eadb734f43da59 (patch) | |
| tree | 1fb9eba0b57690941cf63614e91a454da2370b47 | |
| parent | 27f6a12ee97dc3968aa46ce004ecd87d3c55c8ac (diff) | |
| download | qxmpp-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.cpp | 45 | ||||
| -rw-r--r-- | src/base/QXmppMessage.h | 7 | ||||
| -rw-r--r-- | tests/qxmppmessage/tst_qxmppmessage.cpp | 28 |
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" |
