bool QXmppSimpleArchiveManager::handleStanza(const QDomElement &element) { bool isIq = (element.tagName() == "iq"); if (!isIq && (element.tagName() != "message")) { return false; } // XEP-0313: Message Archiving if(isIq && !QXmppSimpleArchiveQueryIq::isSimpleArchiveQueryIq(element)) { return false; } if (isIq && (element.attribute("type") == "result")) { QString id = element.attribute("id"); if (m_pendingQueries.contains(id)) { PendingQuery pendingQuery = m_pendingQueries.value(id); m_pendingQueries.remove(id); QXmppSimpleArchiveQueryIq packet; packet.parse(element); emit archiveMessagesReceived(pendingQuery.jid, pendingQuery.messages, packet.resultSetReply()); return true; } } else if (isIq && (element.attribute("type") == "error")) { QDomElement queryElement = element.firstChildElement("query"); if (!queryElement.isNull()) { QString queryId = queryElement.attribute("queryid"); if (m_pendingQueries.contains(queryId)) { PendingQuery pendingQuery = m_pendingQueries.value(queryId); m_pendingQueries.remove(queryId); emit archiveMessagesReceived(pendingQuery.jid, pendingQuery.messages, QXmppResultSetReply()); return true; } } } else { // message, check for result UUID + query ID QDomElement resultElement = element.firstChildElement("result"); if (!resultElement.isNull()) { QString queryId = resultElement.attribute("queryid"); if (m_pendingQueries.contains(queryId)) { QXmppMessage msg; msg.parse(element); m_pendingQueries[queryId].messages.append(msg.mamMessage()); return true; } else { qWarning() << "SimpleArchiveManager: unknown query ID:" << queryId; } } } return false; }