diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/debian/changelog qxmpp-devel-1.0.0-7-g95063b1/debian/changelog --- qxmpp-devel-1.0.0-6-g2a34abc/debian/changelog 2019-01-18 22:37:58.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/debian/changelog 2019-01-21 19:44:50.000000000 +0000 @@ -1,8 +1,14 @@ -qxmpp-devel (1.0.0-6-g2a34abc-0ppa1~cosmic1) cosmic; urgency=medium +qxmpp-devel (1.0.0-7-g95063b1-0ppa1~cosmic1) cosmic; urgency=medium * Automatic backport; no changes required. - -- Boris Pek Sat, 19 Jan 2019 01:37:58 +0300 + -- Boris Pek Mon, 21 Jan 2019 22:44:50 +0300 + +qxmpp-devel (1.0.0-7-g95063b1-0ppa1~disco1) disco; urgency=medium + + * New Git snapshot. + + -- Boris Pek Mon, 21 Jan 2019 22:44:39 +0300 qxmpp-devel (1.0.0-6-g2a34abc-0ppa1~disco1) disco; urgency=medium diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/debian/copyright qxmpp-devel-1.0.0-7-g95063b1/debian/copyright --- qxmpp-devel-1.0.0-6-g2a34abc/debian/copyright 2019-01-18 22:37:55.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/debian/copyright 2019-01-21 19:44:39.000000000 +0000 @@ -32,7 +32,7 @@ PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with - this program. If not, see . + this program. If not, see . . On Debian systems, the complete text of the GNU Lesser General Public License can be found in `/usr/share/common-licenses/LGPL-2.1'. diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/doc/xep.doc qxmpp-devel-1.0.0-7-g95063b1/doc/xep.doc --- qxmpp-devel-1.0.0-6-g2a34abc/doc/xep.doc 2019-01-04 10:00:33.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/doc/xep.doc 2019-01-20 15:00:32.000000000 +0000 @@ -46,5 +46,7 @@ - XEP-0009: Jabber-RPC (API is not finalized yet) - XEP-0060: Publish-Subscribe (Only basic IQ implemented) - XEP-0077: In-Band Registration (Only basic IQ implemented) +- XEP-0369: Mediated Information eXchange (MIX) (Only IQ queries implemented) (v0.14.1) +- XEP-0405: Mediated Information eXchange (MIX): Participant Server Requirements (Only IQ queries implemented) (v0.3.1) */ diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/src/base/QXmppConstants.cpp qxmpp-devel-1.0.0-7-g95063b1/src/base/QXmppConstants.cpp --- qxmpp-devel-1.0.0-6-g2a34abc/src/base/QXmppConstants.cpp 2019-01-08 10:17:43.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/src/base/QXmppConstants.cpp 2019-01-20 15:00:32.000000000 +0000 @@ -132,3 +132,15 @@ const char* ns_chat_markers = "urn:xmpp:chat-markers:0"; // XEP-0352: Client State Indication const char* ns_csi = "urn:xmpp:csi:0"; +// XEP-0369: Mediated Information eXchange (MIX) +const char* ns_mix = "urn:xmpp:mix:core:0"; +const char* ns_mix_create_channel = "urn:xmpp:mix:core:0#create-channel"; +const char* ns_mix_searchable = "urn:xmpp:mix:core:0#searchable"; +const char* ns_mix_node_messages = "urn:xmpp:mix:nodes:messages"; +const char* ns_mix_node_participants = "urn:xmpp:mix:nodes:participants"; +const char* ns_mix_node_presence = "urn:xmpp:mix:nodes:presence"; +const char* ns_mix_node_config = "urn:xmpp:mix:nodes:config"; +const char* ns_mix_node_info = "urn:xmpp:mix:nodes:info"; +// XEP-0405: Mediated Information eXchange (MIX): Participant Server Requirements +const char* ns_mix_pam = "urn:xmpp:mix:pam:0"; +const char* ns_mix_roster = "urn:xmpp:mix:roster:0"; diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/src/base/QXmppConstants_p.h qxmpp-devel-1.0.0-7-g95063b1/src/base/QXmppConstants_p.h --- qxmpp-devel-1.0.0-6-g2a34abc/src/base/QXmppConstants_p.h 2019-01-08 10:17:43.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/src/base/QXmppConstants_p.h 2019-01-20 15:00:32.000000000 +0000 @@ -144,5 +144,17 @@ extern const char* ns_chat_markers; // XEP-0352: Client State Indication extern const char* ns_csi; +// XEP-0369: Mediated Information eXchange (MIX) +extern const char* ns_mix; +extern const char* ns_mix_create_channel; +extern const char* ns_mix_searchable; +extern const char* ns_mix_node_messages; +extern const char* ns_mix_node_participants; +extern const char* ns_mix_node_presence; +extern const char* ns_mix_node_config; +extern const char* ns_mix_node_info; +// XEP-0405: Mediated Information eXchange (MIX): Participant Server Requirements +extern const char* ns_mix_pam; +extern const char* ns_mix_roster; #endif // QXMPPCONSTANTS_H diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/src/base/QXmppMixIq.cpp qxmpp-devel-1.0.0-7-g95063b1/src/base/QXmppMixIq.cpp --- qxmpp-devel-1.0.0-6-g2a34abc/src/base/QXmppMixIq.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/src/base/QXmppMixIq.cpp 2019-01-20 15:00:32.000000000 +0000 @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2008-2019 The QXmpp developers + * + * Author: + * Linus Jahn + * + * Source: + * https://github.com/qxmpp-project/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include "QXmppMixIq.h" +#include "QXmppDataForm.h" +#include "QXmppConstants_p.h" +#include "QXmppUtils.h" +#include + +static const QStringList MIX_ACTION_TYPES = QStringList() << "" + << "client-join" << "client-leave" << "join" << "leave" + << "update-subscription" << "setnick" << "create" << "destroy"; + +/// Returns the channel JID. It also contains a participant id for Join/ +/// ClientJoin results. + +QString QXmppMixIq::jid() const +{ + return m_jid; +} + +/// Sets the channel JID. For results of Join/ClientJoin queries this also +/// needs to contain a participant id. + +void QXmppMixIq::setJid(const QString& jid) +{ + m_jid = jid; +} + +/// Returns the channel name (the name part of the channel JID). This may still +/// be empty, if a JID was set. + +QString QXmppMixIq::channelName() const +{ + return m_channelName; +} + +/// Sets the channel name for creating/destroying specific channels. When you +/// create a new channel, this can also be left empty to let the server +/// generate a name. + +void QXmppMixIq::setChannelName(const QString& channelName) +{ + m_channelName = channelName; +} + +/// Returns the list of nodes to subscribe to. + +QStringList QXmppMixIq::nodes() const +{ + return m_nodes; +} + +/// Sets the nodes to subscribe to. Note that for UpdateSubscription queries +/// you only need to include the new subscriptions. + +void QXmppMixIq::setNodes(const QStringList& nodes) +{ + m_nodes = nodes; +} + +/// Returns the user's nickname in the channel. + +QString QXmppMixIq::nick() const +{ + return m_nick; +} + +/// Sets the nickname for the channel. + +void QXmppMixIq::setNick(const QString& nick) +{ + m_nick = nick; +} + +/// Returns the MIX channel action type. + +QXmppMixIq::Type QXmppMixIq::actionType() const +{ + return m_actionType; +} + +/// Sets the channel action. + +void QXmppMixIq::setActionType(QXmppMixIq::Type type) +{ + m_actionType = type; +} + +/// \cond +bool QXmppMixIq::isMixIq(const QDomElement& element) +{ + const QDomElement& child = element.firstChildElement(); + return !child.isNull() && (child.namespaceURI() == ns_mix + || child.namespaceURI() == ns_mix_pam); +} + +void QXmppMixIq::parseElementFromChild(const QDomElement& element) +{ + QDomElement child = element.firstChildElement(); + // determine action type + m_actionType = (QXmppMixIq::Type) MIX_ACTION_TYPES.indexOf(child.tagName()); + + if (child.namespaceURI() == ns_mix_pam) { + if (child.hasAttribute("channel")) + m_jid = child.attribute("channel"); + + child = child.firstChildElement(); + } + + if (!child.isNull() && child.namespaceURI() == ns_mix) { + if (child.hasAttribute("jid")) + m_jid = child.attribute("jid"); + if (child.hasAttribute("channel")) + m_channelName = child.attribute("channel"); + + QDomElement subChild = child.firstChildElement(); + while (!subChild.isNull()) { + if (subChild.tagName() == "subscribe") + m_nodes << subChild.attribute("node"); + else if (subChild.tagName() == "nick") + m_nick = subChild.text(); + + subChild = subChild.nextSiblingElement(); + } + } +} + +void QXmppMixIq::toXmlElementFromChild(QXmlStreamWriter* writer) const +{ + if (m_actionType == None) + return; + + writer->writeStartElement(MIX_ACTION_TYPES.at(m_actionType)); + if (m_actionType == ClientJoin || m_actionType == ClientLeave) { + writer->writeAttribute("xmlns", ns_mix_pam); + if (type() == Set) + helperToXmlAddAttribute(writer, "channel", m_jid); + + if (m_actionType == ClientJoin) + writer->writeStartElement("join"); + else if (m_actionType == ClientLeave) + writer->writeStartElement("leave"); + } + + writer->writeAttribute("xmlns", ns_mix); + helperToXmlAddAttribute(writer, "channel", m_channelName); + if (type() == Result) + helperToXmlAddAttribute(writer, "jid", m_jid); + + for (auto node : m_nodes) { + writer->writeStartElement("subscribe"); + writer->writeAttribute("node", node); + writer->writeEndElement(); + } + if (!m_nick.isEmpty()) + writer->writeTextElement("nick", m_nick); + + writer->writeEndElement(); + if (m_actionType == ClientJoin || m_actionType == ClientLeave) + writer->writeEndElement(); +} +/// \endcond diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/src/base/QXmppMixIq.h qxmpp-devel-1.0.0-7-g95063b1/src/base/QXmppMixIq.h --- qxmpp-devel-1.0.0-6-g2a34abc/src/base/QXmppMixIq.h 1970-01-01 00:00:00.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/src/base/QXmppMixIq.h 2019-01-20 15:00:32.000000000 +0000 @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2008-2019 The QXmpp developers + * + * Author: + * Linus Jahn + * + * Source: + * https://github.com/qxmpp-project/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#ifndef QXMPPMIXIQ_H +#define QXMPPMIXIQ_H + +#include "QXmppIq.h" + +/// \brief The QXmppMixIq class represents an IQ used to do actions on a MIX +/// channel as defined by XEP-0369: Mediated Information eXchange (MIX) +/// (v0.14.1) and XEP-0405: Mediated Information eXchange (MIX): Participant +/// Server Requirements (v0.3.1). +/// +/// \ingroup Stanzas + +class QXMPP_EXPORT QXmppMixIq : public QXmppIq +{ +public: + enum Type { + None, + ClientJoin, + ClientLeave, + Join, + Leave, + UpdateSubscription, + SetNick, + Create, + Destroy + }; + + QXmppMixIq::Type actionType() const; + void setActionType(QXmppMixIq::Type); + + QString jid() const; + void setJid(const QString&); + + QString channelName() const; + void setChannelName(const QString&); + + QStringList nodes() const; + void setNodes(const QStringList&); + + QString nick() const; + void setNick(const QString&); + + /// \cond + static bool isMixIq(const QDomElement&); + /// \endcond + +protected: + /// \cond + void parseElementFromChild(const QDomElement&); + void toXmlElementFromChild(QXmlStreamWriter*) const; + /// \endcond + +private: + QString m_jid; + QString m_channelName; + QStringList m_nodes; + QString m_nick; + QXmppMixIq::Type m_actionType = QXmppMixIq::None; +}; + +#endif // QXMPPMIXIQ_H diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/src/CMakeLists.txt qxmpp-devel-1.0.0-7-g95063b1/src/CMakeLists.txt --- qxmpp-devel-1.0.0-6-g2a34abc/src/CMakeLists.txt 2018-11-26 11:00:38.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/src/CMakeLists.txt 2019-01-20 15:00:32.000000000 +0000 @@ -25,6 +25,7 @@ base/QXmppLogger.h base/QXmppMamIq.h base/QXmppMessage.h + base/QXmppMixIq.h base/QXmppMucIq.h base/QXmppNonSASLAuth.h base/QXmppPingIq.h @@ -99,6 +100,7 @@ base/QXmppLogger.cpp base/QXmppMamIq.cpp base/QXmppMessage.cpp + base/QXmppMixIq.cpp base/QXmppMucIq.cpp base/QXmppNonSASLAuth.cpp base/QXmppPingIq.cpp diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/tests/CMakeLists.txt qxmpp-devel-1.0.0-7-g95063b1/tests/CMakeLists.txt --- qxmpp-devel-1.0.0-6-g2a34abc/tests/CMakeLists.txt 2019-01-17 08:00:35.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/tests/CMakeLists.txt 2019-01-20 15:00:32.000000000 +0000 @@ -26,6 +26,7 @@ add_simple_test(qxmppjingleiq) add_simple_test(qxmppmammanager) add_simple_test(qxmppmessage) +add_simple_test(qxmppmixiq) add_simple_test(qxmppnonsaslauthiq) add_simple_test(qxmpppresence) add_simple_test(qxmpppubsubiq) diff -Nru qxmpp-devel-1.0.0-6-g2a34abc/tests/qxmppmixiq/tst_qxmppmixiq.cpp qxmpp-devel-1.0.0-7-g95063b1/tests/qxmppmixiq/tst_qxmppmixiq.cpp --- qxmpp-devel-1.0.0-6-g2a34abc/tests/qxmppmixiq/tst_qxmppmixiq.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qxmpp-devel-1.0.0-7-g95063b1/tests/qxmppmixiq/tst_qxmppmixiq.cpp 2019-01-20 15:00:32.000000000 +0000 @@ -0,0 +1,419 @@ +/* + * Copyright (C) 2008-2019 The QXmpp developers + * + * Author: + * Linus Jahn + * + * Source: + * https://github.com/qxmpp-project/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include + +#include "QXmppMixIq.h" +#include "util.h" + +Q_DECLARE_METATYPE(QXmppIq::Type); +Q_DECLARE_METATYPE(QXmppMixIq::Type); + +class tst_QXmppMixIq : public QObject +{ + Q_OBJECT + +private slots: + void testBase_data(); + void testBase(); + void testDefaults(); + void testSetters(); + void testIsMixIq(); +}; + +void tst_QXmppMixIq::testBase_data() +{ + QByteArray joinC2sSetXml( + "" + "" + "" + "" + "" + "" + "" + "third witch" + "" + "" + "" + ); + QByteArray joinS2sSetXml( + "" + "" + "" + "" + "" + "" + "stpeter" + "" + "" + ); + QByteArray joinS2sResultXml( + "" + "" + "" + "" + "" + "" + "third witch" + "" + "" + ); + QByteArray joinC2sResultXml( + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ); + QByteArray leaveC2sSetXml( + "" + "" + "" + "" + "" + ); + QByteArray leaveS2sSetXml( + "" + "" + "" + ); + QByteArray leaveS2sResultXml( + "" + "" + "" + ); + QByteArray leaveC2sResultXml( + "" + "" + "" + "" + "" + ); + QByteArray updateSubscriptionSetXml( + "" + "" + "" + "" + "" + ); + QByteArray updateSubscriptionResultXml( + "" + "" + "" + "" + "" + ); + QByteArray setNickSetXml( + "" + "" + "thirdwitch" + "" + "" + ); + QByteArray setNickResultXml( + "" + "" + "thirdwitch" + "" + "" + ); + QByteArray createXml( + "" + "" + "" + ); + QByteArray createWithoutNameXml( + "" + "" + "" + ); + QByteArray destroyXml( + "" + "" + "" + ); + QByteArray emptyXml( + "" + ); + + QStringList emptyNodes; + QStringList defaultNodes; + defaultNodes << "urn:xmpp:mix:nodes:messages" << "urn:xmpp:mix:nodes:presence" + << "urn:xmpp:mix:nodes:participants" << "urn:xmpp:mix:nodes:info"; + + QTest::addColumn("xml"); + QTest::addColumn("type"); + QTest::addColumn("actionType"); + QTest::addColumn("jid"); + QTest::addColumn("channelName"); + QTest::addColumn("nodes"); + QTest::addColumn("nick"); + + QTest::newRow("join-c2s-set") + << joinC2sSetXml + << QXmppIq::Set + << QXmppMixIq::ClientJoin + << "coven@mix.shakespeare.example" + << "" + << defaultNodes + << "third witch"; + QTest::newRow("join-s2s-set") + << joinS2sSetXml + << QXmppIq::Set + << QXmppMixIq::Join + << "" + << "" + << defaultNodes + << "stpeter"; + QTest::newRow("join-s2s-result") + << joinS2sResultXml + << QXmppIq::Result + << QXmppMixIq::Join + << "123456#coven@mix.shakespeare.example" + << "" + << defaultNodes + << "third witch"; + QTest::newRow("join-c2s-result") + << joinC2sResultXml + << QXmppIq::Result + << QXmppMixIq::ClientJoin + << "123456#coven@mix.shakespeare.example" + << "" + << defaultNodes + << ""; + QTest::newRow("leave-c2s-set") + << leaveC2sSetXml + << QXmppIq::Set + << QXmppMixIq::ClientLeave + << "coven@mix.shakespeare.example" + << "" << emptyNodes << ""; + QTest::newRow("leave-s2s-set") + << leaveS2sSetXml + << QXmppIq::Set + << QXmppMixIq::Leave + << "" << "" << emptyNodes << ""; + QTest::newRow("leave-s2s-result") + << leaveS2sResultXml + << QXmppIq::Result + << QXmppMixIq::Leave + << "" << "" << emptyNodes << ""; + QTest::newRow("leave-c2s-result") + << leaveC2sResultXml + << QXmppIq::Result + << QXmppMixIq::ClientLeave + << "" << "" << emptyNodes << ""; + QTest::newRow("update-subscription-set") + << updateSubscriptionSetXml + << QXmppIq::Set + << QXmppMixIq::UpdateSubscription + << "" + << "" + << (QStringList() << "urn:xmpp:mix:nodes:messages") + << ""; + QTest::newRow("update-subscription-result") + << updateSubscriptionResultXml + << QXmppIq::Result + << QXmppMixIq::UpdateSubscription + << "hag66@shakespeare.example" + << "" + << (QStringList() << "urn:xmpp:mix:nodes:messages") + << ""; + QTest::newRow("setnick-set") + << setNickSetXml + << QXmppIq::Set + << QXmppMixIq::SetNick + << "" << "" << emptyNodes + << "thirdwitch"; + QTest::newRow("setnick-result") + << setNickResultXml + << QXmppIq::Result + << QXmppMixIq::SetNick + << "" << "" << emptyNodes + << "thirdwitch"; + QTest::newRow("create") + << createXml + << QXmppIq::Set + << QXmppMixIq::Create + << "" << "coven" << emptyNodes << ""; + QTest::newRow("create-without-name") + << createWithoutNameXml + << QXmppIq::Set + << QXmppMixIq::Create + << "" << "" << emptyNodes << ""; + QTest::newRow("destroy") + << destroyXml + << QXmppIq::Set + << QXmppMixIq::Destroy + << "" << "coven" << emptyNodes << ""; + QTest::newRow("empty") + << emptyXml + << QXmppIq::Set + << QXmppMixIq::None + << "" << "" << emptyNodes << ""; +} + +void tst_QXmppMixIq::testBase() +{ + QFETCH(QByteArray, xml); + QFETCH(QXmppIq::Type, type); + QFETCH(QXmppMixIq::Type, actionType); + QFETCH(QString, jid); + QFETCH(QString, channelName); + QFETCH(QStringList, nodes); + QFETCH(QString, nick); + + QXmppMixIq iq; + parsePacket(iq, xml); + QCOMPARE(iq.type(), type); + QCOMPARE(iq.actionType(), actionType); + QCOMPARE(iq.jid(), jid); + QCOMPARE(iq.channelName(), channelName); + QCOMPARE(iq.nodes(), nodes); + QCOMPARE(iq.nick(), nick); + serializePacket(iq, xml); +} + +void tst_QXmppMixIq::testDefaults() +{ + QXmppMixIq iq; + QCOMPARE(iq.actionType(), QXmppMixIq::None); + QCOMPARE(iq.jid(), QString()); + QCOMPARE(iq.channelName(), QString()); + QCOMPARE(iq.nodes(), QStringList()); + QCOMPARE(iq.nick(), QString()); +} + +void tst_QXmppMixIq::testSetters() +{ + QXmppMixIq iq; + iq.setActionType(QXmppMixIq::Join); + QCOMPARE(iq.actionType(), QXmppMixIq::Join); + iq.setJid("interestingnews@mix.example.com"); + QCOMPARE(iq.jid(), QString("interestingnews@mix.example.com")); + iq.setChannelName("interestingnews"); + QCOMPARE(iq.channelName(), QString("interestingnews")); + iq.setNodes(QStringList() << "com:example:mix:node:custom"); + QCOMPARE(iq.nodes(), QStringList() << "com:example:mix:node:custom"); + iq.setNick("SMUDO"); + QCOMPARE(iq.nick(), QString("SMUDO")); +} + +void tst_QXmppMixIq::testIsMixIq() +{ + const QByteArray trueXml( + "" + "" + "" + ); + const QByteArray truePamXml( + "" + "" + "" + "" + "" + ); + const QByteArray falseXml( + "" + "" + "" + ); + + QDomDocument doc; + doc.setContent(trueXml, true); + QDomElement trueElement = doc.documentElement(); + QVERIFY(QXmppMixIq::isMixIq(trueElement)); + + doc.setContent(truePamXml, true); + QDomElement truePamElement = doc.documentElement(); + QVERIFY(QXmppMixIq::isMixIq(truePamElement)); + + doc.setContent(falseXml, true); + QDomElement falseElement = doc.documentElement(); + QVERIFY(!QXmppMixIq::isMixIq(falseElement)); +} + +QTEST_MAIN(tst_QXmppMixIq) +#include "tst_qxmppmixiq.moc"