diff options
| author | Linus Jahn <lnj@kaidan.im> | 2019-09-04 20:26:48 +0200 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2019-09-08 13:31:40 +0200 |
| commit | 35256b7d95374717905f8ac8d4d524c4b691389e (patch) | |
| tree | 55074a75a34eb4a2eaa051e8afe7b4779ab50431 /src/base | |
| parent | e7394afc6730b16673f4173fcbc55d54a810a80b (diff) | |
| download | qxmpp-35256b7d95374717905f8ac8d4d524c4b691389e.tar.gz | |
Implement XEP-0334: Message Processing Hints
This implements parsing and serialization of XEP-0334: Message
Processing Hints in version 0.3.0.
https://xmpp.org/extensions/xep-0334.html
Co-authored-by: Juan Aragon <jaaragont@gmail.com>
Co-authored-by: Sam Truscott <sam@wumpus.co.uk>
Diffstat (limited to 'src/base')
| -rw-r--r-- | src/base/QXmppConstants.cpp | 2 | ||||
| -rw-r--r-- | src/base/QXmppConstants_p.h | 2 | ||||
| -rw-r--r-- | src/base/QXmppMessage.cpp | 56 | ||||
| -rw-r--r-- | src/base/QXmppMessage.h | 14 |
4 files changed, 74 insertions, 0 deletions
diff --git a/src/base/QXmppConstants.cpp b/src/base/QXmppConstants.cpp index 80c97b56..92ff8689 100644 --- a/src/base/QXmppConstants.cpp +++ b/src/base/QXmppConstants.cpp @@ -133,6 +133,8 @@ const char* ns_mam = "urn:xmpp:mam:1"; const char* ns_idle = "urn:xmpp:idle:1"; // XEP-0333: Chat Markers const char* ns_chat_markers = "urn:xmpp:chat-markers:0"; +// XEP-0334: Message Processing Hints +const char* ns_message_processing_hints = "urn:xmpp:hints"; // XEP-0352: Client State Indication const char* ns_csi = "urn:xmpp:csi:0"; // XEP-0363: HTTP File Upload diff --git a/src/base/QXmppConstants_p.h b/src/base/QXmppConstants_p.h index 86003970..ba39ee05 100644 --- a/src/base/QXmppConstants_p.h +++ b/src/base/QXmppConstants_p.h @@ -145,6 +145,8 @@ extern const char* ns_mam; extern const char* ns_idle; // XEP-0333: Char Markers extern const char* ns_chat_markers; +// XEP-0334: Message Processing Hints: +extern const char* ns_message_processing_hints; // XEP-0352: Client State Indication extern const char* ns_csi; // XEP-0363: HTTP File Upload diff --git a/src/base/QXmppMessage.cpp b/src/base/QXmppMessage.cpp index 54ef4cd6..9806edf0 100644 --- a/src/base/QXmppMessage.cpp +++ b/src/base/QXmppMessage.cpp @@ -64,6 +64,13 @@ static const QStringList ENCRYPTION_NAMESPACES = { ns_omemo }; +static const QStringList HINT_TYPES = { + QStringLiteral("no-permanent-store"), + QStringLiteral("no-store"), + QStringLiteral("no-copy"), + QStringLiteral("store") +}; + static const QStringList ENCRYPTION_NAMES = { QString(), QString(), @@ -121,6 +128,9 @@ public: // XEP-0308: Last Message Correction QString replaceId; + // XEP-0334: Message Processing Hints + quint8 hints; + // XEP-0367: Message Attaching QString attachId; @@ -161,6 +171,8 @@ QXmppMessage::QXmppMessage(const QString& from, const QString& to, const d->marker = NoMarker; d->privatemsg = false; + + d->hints = 0; } /// Constructs a copy of \a other. @@ -546,6 +558,38 @@ void QXmppMessage::setReplaceId(const QString &replaceId) d->replaceId = replaceId; } +/// Returns true if the message contains the hint passed, as defined in +/// XEP-0334: Message Processing Hints + +bool QXmppMessage::hasHint(const Hint hint) const +{ + return d->hints & hint; +} + +/// Adds a hint to the message, as defined in XEP-0334: Message Processing +/// Hints + +void QXmppMessage::addHint(const Hint hint) +{ + d->hints |= hint; +} + +/// Removes a hint from the message, as defined in XEP-0334: Message Processing +/// Hints + +void QXmppMessage::removeHint(const Hint hint) +{ + d->hints &= ~hint; +} + +/// Removes all hints from the message, as defined in XEP-0334: Message +/// Processing Hints + +void QXmppMessage::removeAllHints() +{ + d->hints = 0; +} + /// Returns the message id this message is linked/attached to. See XEP-0367: /// Message Attaching for details. @@ -848,6 +892,9 @@ void QXmppMessage::parse(const QDomElement &element) else { extensions << QXmppElement(xElement); } + // XEP-0334: Message Processing Hints + } else if (xElement.namespaceURI() == ns_message_processing_hints && HINT_TYPES.contains(xElement.tagName())) { + addHint(Hint(1 << HINT_TYPES.indexOf(xElement.tagName()))); // XEP-0367: Message Attaching } else if (xElement.tagName() == "attach-to" && xElement.namespaceURI() == ns_message_attaching) { d->attachId = xElement.attribute("id"); @@ -1000,6 +1047,15 @@ void QXmppMessage::toXml(QXmlStreamWriter *xmlWriter) const xmlWriter->writeEndElement(); } + // XEP-0334: Message Processing Hints + for (quint8 i = 0; i < HINT_TYPES.size(); i++) { + if (hasHint(Hint(1 << i))) { + xmlWriter->writeStartElement(HINT_TYPES.at(i)); + xmlWriter->writeAttribute("xmlns", ns_message_processing_hints); + xmlWriter->writeEndElement(); + } + } + // XEP-0367: Message Attaching if (!d->attachId.isEmpty()) { xmlWriter->writeStartElement("attach-to"); diff --git a/src/base/QXmppMessage.h b/src/base/QXmppMessage.h index 69e2d451..9021f0cb 100644 --- a/src/base/QXmppMessage.h +++ b/src/base/QXmppMessage.h @@ -66,6 +66,14 @@ public: Acknowledged }; + /// XEP-0334: Message Processing Hints + enum Hint { + NoPermanentStore = 1 << 0, ///< Do not allow permanent storage + NoStore = 1 << 1, ///< Do not store at all + NoCopy = 1 << 2, ///< Do not copy the message + Store = 1 << 3 ///< Do store the message + }; + /// This enum describes different end-to-end encryption methods. These can /// be used to mark a message explicitly as encrypted with a specific /// algothim. See XEP-0380: Explicit Message Encryption for details. @@ -152,6 +160,12 @@ public: QString replaceId() const; void setReplaceId(const QString&); + // XEP-0334: Message Processing Hints + bool hasHint(const Hint hint) const; + void addHint(const Hint hint); + void removeHint(const Hint hint); + void removeAllHints(); + // XEP-0367: Message Attaching QString attachId() const; void setAttachId(const QString&); |
