aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppMessage.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2014-07-19 10:23:40 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2014-07-19 10:23:40 +0200
commit70e7b6005de3e4a2e0237f18196825d96f4ee4d3 (patch)
tree1b017e68025534d194362a6dc206f04a2ca8f553 /src/base/QXmppMessage.cpp
parent68f89992207c592cf0be8567d5c3d5e43157f9b6 (diff)
parent07ae4a63307928e1af97b75b3de23530c74beb3f (diff)
downloadqxmpp-70e7b6005de3e4a2e0237f18196825d96f4ee4d3.tar.gz
Merge branch 'master' of github.com:qxmpp-project/qxmpp
Diffstat (limited to 'src/base/QXmppMessage.cpp')
-rw-r--r--src/base/QXmppMessage.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/base/QXmppMessage.cpp b/src/base/QXmppMessage.cpp
index e32465b7..4bdc6329 100644
--- a/src/base/QXmppMessage.cpp
+++ b/src/base/QXmppMessage.cpp
@@ -48,6 +48,13 @@ static const char* message_types[] = {
"headline"
};
+static const char* marker_types[] = {
+ "",
+ "received",
+ "displayed",
+ "acknowledged"
+};
+
static const char *ns_xhtml = "http://www.w3.org/1999/xhtml";
enum StampType
@@ -80,6 +87,12 @@ public:
QString mucInvitationJid;
QString mucInvitationPassword;
QString mucInvitationReason;
+
+ // XEP-0333: Chat Markers
+ bool markable;
+ QXmppMessage::Marker marker;
+ QString markedId;
+ QString markedThread;
};
/// Constructs a QXmppMessage.
@@ -101,6 +114,9 @@ QXmppMessage::QXmppMessage(const QString& from, const QString& to, const
d->body = body;
d->thread = thread;
d->receiptRequested = false;
+
+ d->markable = false;
+ d->marker = NoMarker;
}
/// Constructs a copy of \a other.
@@ -363,6 +379,70 @@ namespace
}
}
+/// Returns true if a message is markable, as defined
+/// XEP-0333: Chat Markers.
+
+bool QXmppMessage::isMarkable() const
+{
+ return d->markable;
+}
+
+/// Sets if the message is markable, as defined
+/// XEP-0333: Chat Markers.
+
+void QXmppMessage::setMarkable(const bool markable)
+{
+ d->markable = markable;
+}
+
+/// Returns the message's marker id, as defined
+/// XEP-0333: Chat Markers.
+
+QString QXmppMessage::markedId() const
+{
+ return d->markedId;
+}
+
+/// Sets the message's marker id, as defined
+/// XEP-0333: Chat Markers.
+
+void QXmppMessage::setMarkerId(const QString &markerId)
+{
+ d->markedId = markerId;
+}
+
+/// Returns the message's marker thread, as defined
+/// XEP-0333: Chat Markers.
+
+QString QXmppMessage::markedThread() const
+{
+ return d->markedThread;
+}
+
+/// Sets the message's marked thread, as defined
+/// XEP-0333: Chat Markers.
+
+void QXmppMessage::setMarkedThread(const QString &markedThread)
+{
+ d->markedThread = markedThread;
+}
+
+/// Returns the message's marker, as defined
+/// XEP-0333: Chat Markers.
+
+QXmppMessage::Marker QXmppMessage::marker() const
+{
+ return d->marker;
+}
+
+/// Sets the message's marker, as defined
+/// XEP-0333: Chat Markers
+
+void QXmppMessage::setMarker(const Marker marker)
+{
+ d->marker = marker;
+}
+
/// \cond
void QXmppMessage::parse(const QDomElement &element)
{
@@ -433,6 +513,36 @@ void QXmppMessage::parse(const QDomElement &element)
// XEP-0224: Attention
d->attentionRequested = element.firstChildElement("attention").namespaceURI() == ns_attention;
+ // XEP-0333: Chat Markers
+ QDomElement markableElement = element.firstChildElement("markable");
+ if (!markableElement.isNull())
+ {
+ d->markable = true;
+ }
+ // check for all the marker types
+ QDomElement chatStateElement;
+ QXmppMessage::Marker marker = QXmppMessage::NoMarker;
+ for (int i = Received; i <= Acknowledged; i++)
+ {
+ chatStateElement = element.firstChildElement(marker_types[i]);
+ if (!chatStateElement.isNull() &&
+ chatStateElement.namespaceURI() == ns_chat_markers)
+ {
+ marker = static_cast<QXmppMessage::Marker>(i);
+ break;
+ }
+ }
+ // if marker is present, check it's the right ns
+ if (!chatStateElement.isNull())
+ {
+ if (chatStateElement.namespaceURI() == ns_chat_markers)
+ {
+ d->marker = marker;
+ d->markedId = chatStateElement.attribute("id", QString());
+ d->markedThread = chatStateElement.attribute("thread", QString());
+ }
+ }
+
const QList<QPair<QString, QString> > &knownElems = knownMessageSubelems();
QXmppElementList extensions;
@@ -555,6 +665,22 @@ void QXmppMessage::toXml(QXmlStreamWriter *xmlWriter) const
xmlWriter->writeEndElement();
}
+ // XEP-0333: Chat Markers
+ if (d->markable) {
+ xmlWriter->writeStartElement("markable");
+ xmlWriter->writeAttribute("xmlns", ns_chat_markers);
+ xmlWriter->writeEndElement();
+ }
+ if (d->marker != NoMarker) {
+ xmlWriter->writeStartElement(marker_types[d->marker]);
+ xmlWriter->writeAttribute("xmlns", ns_chat_markers);
+ xmlWriter->writeAttribute("id", d->markedId);
+ if (!d->markedThread.isNull() && !d->markedThread.isEmpty()) {
+ xmlWriter->writeAttribute("thread", d->markedThread);
+ }
+ xmlWriter->writeEndElement();
+ }
+
// other extensions
QXmppStanza::extensionsToXml(xmlWriter);