bool QXmppMessageReceiptManager::handleStanza(const QDomElement &stanza) { if (stanza.tagName() != "message") return false; QXmppMessage message; message.parse(stanza); // Handle receipts and cancel any further processing. if (!message.receiptId().isEmpty()) { Q_EMIT messageDelivered(message.from(), message.receiptId()); return true; } // If requested, send a receipt. if (message.isReceiptRequested() && !message.from().isEmpty() && !message.id().isEmpty()) { QXmppMessage receipt; receipt.setTo(message.from()); receipt.setReceiptId(message.id()); client()->sendPacket(receipt); } // Continue processing. return false; }
void tst_QXmppMessage::testMessageReceipt() { const QByteArray xml( "<message id=\"richard2-4.1.247\" to=\"[email protected]/throne\" from=\"[email protected]/westminster\" type=\"normal\">" "<body>My lord, dispatch; read o'er these articles.</body>" "<request xmlns=\"urn:xmpp:receipts\"/>" "</message>"); QXmppMessage message; parsePacket(message, xml); QCOMPARE(message.id(), QString("richard2-4.1.247")); QCOMPARE(message.to(), QString("[email protected]/throne")); QCOMPARE(message.from(), QString("[email protected]/westminster")); QVERIFY(message.extendedAddresses().isEmpty()); QCOMPARE(message.type(), QXmppMessage::Normal); 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=\"[email protected]/westminster\" from=\"[email protected]/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("[email protected]/westminster")); QCOMPARE(receipt.from(), QString("[email protected]/throne")); QVERIFY(receipt.extendedAddresses().isEmpty()); 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); const QByteArray oldXml( "<message id=\"richard2-4.1.247\" to=\"[email protected]/westminster\" from=\"[email protected]/throne\" type=\"normal\">" "<received xmlns=\"urn:xmpp:receipts\"/>" "</message>"); QXmppMessage old; parsePacket(old, oldXml); QCOMPARE(old.id(), QString("richard2-4.1.247")); QCOMPARE(old.to(), QString("[email protected]/westminster")); QCOMPARE(old.from(), QString("[email protected]/throne")); QVERIFY(old.extendedAddresses().isEmpty()); QCOMPARE(old.type(), QXmppMessage::Normal); QCOMPARE(old.body(), QString()); QCOMPARE(old.isAttentionRequested(), false); QCOMPARE(old.isReceiptRequested(), false); QCOMPARE(old.receiptId(), QString("richard2-4.1.247")); }
void tst_QXmppMessage::testChatMarkers() { const QByteArray markableXml( "<message " "from='[email protected]/westminster' " "id='message-1' " "to='[email protected]/throne'>" "<thread>sleeping</thread>" "<body>My lord, dispatch; read o'er these articles.</body>" "<markable xmlns='urn:xmpp:chat-markers:0'/>" "</message>"); QXmppMessage markableMessage; parsePacket(markableMessage, markableXml); QCOMPARE(markableMessage.isMarkable(), true); QCOMPARE(markableMessage.marker(), QXmppMessage::NoMarker); QCOMPARE(markableMessage.id(), QString("message-1")); QCOMPARE(markableMessage.markedId(), QString()); QCOMPARE(markableMessage.thread(), QString("sleeping")); QCOMPARE(markableMessage.markedThread(), QString()); const QByteArray receivedXml( "<message " "from='[email protected]/throne' " "id='message-2' " "to='[email protected]/westminster'>" "<received xmlns='urn:xmpp:chat-markers:0' " "id='message-1' " "thread='sleeping'/>" "</message>"); QXmppMessage receivedMessage; parsePacket(receivedMessage, receivedXml); QCOMPARE(receivedMessage.isMarkable(), false); QCOMPARE(receivedMessage.marker(), QXmppMessage::Received); QCOMPARE(receivedMessage.id(), QString("message-2")); QCOMPARE(receivedMessage.markedId(), QString("message-1")); QCOMPARE(receivedMessage.thread(), QString()); QCOMPARE(receivedMessage.markedThread(), QString("sleeping")); const QByteArray displayedXml( "<message " "from='[email protected]/throne' " "id='message-2' " "to='[email protected]/westminster'>" "<displayed xmlns='urn:xmpp:chat-markers:0' " "id='message-1' " "thread='sleeping'/>" "</message>"); QXmppMessage displayedMessage; parsePacket(displayedMessage, displayedXml); QCOMPARE(displayedMessage.isMarkable(), false); QCOMPARE(displayedMessage.marker(), QXmppMessage::Displayed); QCOMPARE(displayedMessage.id(), QString("message-2")); QCOMPARE(displayedMessage.markedId(), QString("message-1")); QCOMPARE(displayedMessage.thread(), QString()); QCOMPARE(displayedMessage.markedThread(), QString("sleeping")); const QByteArray acknowledgedXml( "<message " "from='[email protected]/throne' " "id='message-2' " "to='[email protected]/westminster'>" "<acknowledged xmlns='urn:xmpp:chat-markers:0' " "id='message-1' " "thread='sleeping'/>" "</message>"); QXmppMessage acknowledgedMessage; parsePacket(acknowledgedMessage, acknowledgedXml); QCOMPARE(acknowledgedMessage.isMarkable(), false); QCOMPARE(acknowledgedMessage.marker(), QXmppMessage::Acknowledged); QCOMPARE(acknowledgedMessage.id(), QString("message-2")); QCOMPARE(acknowledgedMessage.markedId(), QString("message-1")); QCOMPARE(acknowledgedMessage.thread(), QString()); QCOMPARE(acknowledgedMessage.markedThread(), QString("sleeping")); const QByteArray emptyThreadXml( "<message " "from='[email protected]/throne' " "id='message-2' " "to='[email protected]/westminster'>" "<received xmlns='urn:xmpp:chat-markers:0' " "id='message-1'/>" "</message>"); QXmppMessage emptyThreadMessage; parsePacket(emptyThreadMessage, emptyThreadXml); QCOMPARE(emptyThreadMessage.isMarkable(), false); QCOMPARE(emptyThreadMessage.marker(), QXmppMessage::Received); QCOMPARE(emptyThreadMessage.id(), QString("message-2")); QCOMPARE(emptyThreadMessage.markedId(), QString("message-1")); QCOMPARE(emptyThreadMessage.thread(), QString()); QCOMPARE(emptyThreadMessage.markedThread(), QString()); const QByteArray notMarkableSerialisation( "<message " "id=\"message-3\" " "to=\"[email protected]/westminster\" " "from=\"[email protected]/throne\" " "type=\"chat\"/>"); QXmppMessage serialisationMessage; serialisationMessage.setFrom("[email protected]/throne"); serialisationMessage.setTo("[email protected]/westminster"); serialisationMessage.setId("message-3"); serialisationMessage.setMarkable(false); serializePacket(serialisationMessage, notMarkableSerialisation); const QByteArray markableSerialisation( "<message " "id=\"message-3\" " "to=\"[email protected]/westminster\" " "from=\"[email protected]/throne\" " "type=\"chat\">" "<markable xmlns=\"urn:xmpp:chat-markers:0\"/>" "</message>"); serialisationMessage.setMarkable(true); serializePacket(serialisationMessage, markableSerialisation); const QByteArray receivedSerialisation( "<message " "id=\"message-3\" " "to=\"[email protected]/westminster\" " "from=\"[email protected]/throne\" " "type=\"chat\">" "<received xmlns=\"urn:xmpp:chat-markers:0\" " "id=\"message-2\"/>" "</message>"); serialisationMessage.setMarkable(false); serialisationMessage.setMarker(QXmppMessage::Received, "message-2"); serializePacket(serialisationMessage, receivedSerialisation); const QByteArray receivedThreadSerialisation( "<message " "id=\"message-3\" " "to=\"[email protected]/westminster\" " "from=\"[email protected]/throne\" " "type=\"chat\">" "<received xmlns=\"urn:xmpp:chat-markers:0\" " "id=\"message-2\" " "thread=\"sleeping\"/>" "</message>"); serialisationMessage.setMarker(QXmppMessage::Received, "message-2", "sleeping"); serializePacket(serialisationMessage, receivedThreadSerialisation); const QByteArray displayedThreadSerialisation( "<message " "id=\"message-3\" " "to=\"[email protected]/westminster\" " "from=\"[email protected]/throne\" " "type=\"chat\">" "<displayed xmlns=\"urn:xmpp:chat-markers:0\" " "id=\"message-2\" " "thread=\"sleeping\"/>" "</message>"); serialisationMessage.setMarker(QXmppMessage::Displayed, "message-2", "sleeping"); serializePacket(serialisationMessage, displayedThreadSerialisation); const QByteArray acknowledgedThreadSerialisation( "<message " "id=\"message-3\" " "to=\"[email protected]/westminster\" " "from=\"[email protected]/throne\" " "type=\"chat\">" "<acknowledged xmlns=\"urn:xmpp:chat-markers:0\" " "id=\"message-2\" " "thread=\"sleeping\"/>" "</message>"); serialisationMessage.setMarker(QXmppMessage::Acknowledged, "message-2", "sleeping"); serializePacket(serialisationMessage, acknowledgedThreadSerialisation); }