aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-02-06 20:13:06 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2012-02-06 20:13:06 +0000
commitd793ea8b18527009ddd47816afbf52ada6ae7736 (patch)
tree64beacd1ca0188b14c08f93f8f13b6c0edafd27d
parent78711c314a4cc20aaf276e519d9db1d91cf22fa7 (diff)
downloadqxmpp-d793ea8b18527009ddd47816afbf52ada6ae7736.tar.gz
make QXmppMessage carry a receipt ID for XEP-0184
-rw-r--r--src/QXmppMessage.cpp28
-rw-r--r--src/QXmppMessage.h4
-rw-r--r--tests/tests.cpp30
-rw-r--r--tests/tests.h2
4 files changed, 58 insertions, 6 deletions
diff --git a/src/QXmppMessage.cpp b/src/QXmppMessage.cpp
index a10ee7e5..58579c43 100644
--- a/src/QXmppMessage.cpp
+++ b/src/QXmppMessage.cpp
@@ -118,6 +118,22 @@ void QXmppMessage::setReceiptRequested(bool requested)
generateAndSetNextId();
}
+/// If this message is a delivery receipt, returns the ID of the
+/// original message.
+
+QString QXmppMessage::receiptId() const
+{
+ return m_receiptId;
+}
+
+/// Make this message a delivery receipt for the message with
+/// the given \a id.
+
+void QXmppMessage::setReceiptId(const QString &id)
+{
+ m_receiptId = id;
+}
+
/// Returns the message's type.
///
@@ -251,6 +267,12 @@ void QXmppMessage::parse(const QDomElement &element)
}
// XEP-0184: Message Delivery Receipts
+ QDomElement receivedElement = element.firstChildElement("received");
+ if (!receivedElement.isNull() && receivedElement.namespaceURI() == ns_message_receipts) {
+ m_receiptId = receivedElement.attribute("id");
+ } else {
+ m_receiptId = QString();
+ }
m_receiptRequested = element.firstChildElement("request").namespaceURI() == ns_message_receipts;
// XEP-0203: Delayed Delivery
@@ -331,6 +353,12 @@ void QXmppMessage::toXml(QXmlStreamWriter *xmlWriter) const
}
// XEP-0184: Message Delivery Receipts
+ if (!m_receiptId.isEmpty()) {
+ xmlWriter->writeStartElement("received");
+ xmlWriter->writeAttribute("xmlns", ns_message_receipts);
+ xmlWriter->writeAttribute("id", m_receiptId);
+ xmlWriter->writeEndElement();
+ }
if (m_receiptRequested) {
xmlWriter->writeStartElement("request");
xmlWriter->writeAttribute("xmlns", ns_message_receipts);
diff --git a/src/QXmppMessage.h b/src/QXmppMessage.h
index 645bd96d..a981f1db 100644
--- a/src/QXmppMessage.h
+++ b/src/QXmppMessage.h
@@ -71,6 +71,9 @@ public:
bool isReceiptRequested() const;
void setReceiptRequested(bool requested);
+ QString receiptId() const;
+ void setReceiptId(const QString &id);
+
QDateTime stamp() const;
void setStamp(const QDateTime &stamp);
@@ -113,6 +116,7 @@ private:
QString m_thread;
// Request message receipt as per XEP-0184.
+ QString m_receiptId;
bool m_receiptRequested;
};
diff --git a/tests/tests.cpp b/tests/tests.cpp
index 82dbcd4b..b7582486 100644
--- a/tests/tests.cpp
+++ b/tests/tests.cpp
@@ -324,6 +324,7 @@ void TestPackets::testMessage()
QCOMPARE(message.state(), QXmppMessage::None);
QCOMPARE(message.isAttentionRequested(), false);
QCOMPARE(message.isReceiptRequested(), false);
+ QCOMPARE(message.receiptId(), QString());
serializePacket(message, xml);
}
@@ -342,13 +343,14 @@ void TestPackets::testMessageAttention()
QCOMPARE(message.body(), QString());
QCOMPARE(message.isAttentionRequested(), true);
QCOMPARE(message.isReceiptRequested(), false);
+ QCOMPARE(message.receiptId(), QString());
serializePacket(message, xml);
}
-void TestPackets::testMessageDelivery()
+void TestPackets::testMessageReceipt()
{
const QByteArray xml(
- "<message id=\"richard2-4.1.247\" to=\"foo@example.com/QXmpp\" from=\"bar@example.com/QXmpp\" type=\"normal\">"
+ "<message id=\"richard2-4.1.247\" to=\"kingrichard@royalty.england.lit/throne\" from=\"northumberland@shakespeare.lit/westminster\" type=\"normal\">"
"<body>My lord, dispatch; read o'er these articles.</body>"
"<request xmlns=\"urn:xmpp:receipts\"/>"
"</message>");
@@ -356,13 +358,31 @@ void TestPackets::testMessageDelivery()
QXmppMessage message;
parsePacket(message, xml);
QCOMPARE(message.id(), QString("richard2-4.1.247"));
- QCOMPARE(message.to(), QString("foo@example.com/QXmpp"));
- QCOMPARE(message.from(), QString("bar@example.com/QXmpp"));
+ QCOMPARE(message.to(), QString("kingrichard@royalty.england.lit/throne"));
+ QCOMPARE(message.from(), QString("northumberland@shakespeare.lit/westminster"));
QCOMPARE(message.type(), QXmppMessage::Normal);
- QCOMPARE(message.body(), QLatin1String("My lord, dispatch; read o'er these articles."));
+ QCOMPARE(message.body(), QString("My lord, dispatch; read o'er these articles."));
QCOMPARE(message.isAttentionRequested(), false);
QCOMPARE(message.isReceiptRequested(), true);
+ QCOMPARE(message.receiptId(), QString());
serializePacket(message, xml);
+
+ const QByteArray receiptXml(
+ "<message id=\"bi29sg183b4v\" to=\"northumberland@shakespeare.lit/westminster\" from=\"kingrichard@royalty.england.lit/throne\" type=\"normal\">"
+ "<received xmlns=\"urn:xmpp:receipts\" id=\"richard2-4.1.247\"/>"
+ "</message>");
+
+ QXmppMessage receipt;
+ parsePacket(receipt, receiptXml);
+ QCOMPARE(receipt.id(), QString("bi29sg183b4v"));
+ QCOMPARE(receipt.to(), QString("northumberland@shakespeare.lit/westminster"));
+ QCOMPARE(receipt.from(), QString("kingrichard@royalty.england.lit/throne"));
+ QCOMPARE(receipt.type(), QXmppMessage::Normal);
+ QCOMPARE(receipt.body(), QString());
+ QCOMPARE(receipt.isAttentionRequested(), false);
+ QCOMPARE(receipt.isReceiptRequested(), false);
+ QCOMPARE(receipt.receiptId(), QString("richard2-4.1.247"));
+ serializePacket(receipt, receiptXml);
}
void TestPackets::testMessageFull()
diff --git a/tests/tests.h b/tests/tests.h
index fa59c59d..fd62d9b0 100644
--- a/tests/tests.h
+++ b/tests/tests.h
@@ -52,7 +52,7 @@ private slots:
void testMessage();
void testMessageFull();
void testMessageAttention();
- void testMessageDelivery();
+ void testMessageReceipt();
void testMessageDelay();
void testMessageLegacyDelay();
void testNonSaslAuth();