diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-09-10 10:22:08 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-09-10 10:22:08 +0000 |
| commit | 874b51e41dcff2187707f4331d274dbb37cde5b0 (patch) | |
| tree | 2c31bef75d6c029a8e19eda3f1eff942e8154410 /src | |
| parent | c9c8c38170863ea3316e92fcfb570e99f7862402 (diff) | |
| download | qxmpp-874b51e41dcff2187707f4331d274dbb37cde5b0.tar.gz | |
refactor QXmppMucManager as a client extension
Diffstat (limited to 'src')
| -rw-r--r-- | src/QXmppClient.cpp | 5 | ||||
| -rw-r--r-- | src/QXmppMucManager.cpp | 82 | ||||
| -rw-r--r-- | src/QXmppMucManager.h | 17 | ||||
| -rw-r--r-- | src/QXmppOutgoingClient.cpp | 14 | ||||
| -rw-r--r-- | src/QXmppOutgoingClient.h | 6 |
5 files changed, 81 insertions, 43 deletions
diff --git a/src/QXmppClient.cpp b/src/QXmppClient.cpp index d3bf7e55..bf27aad5 100644 --- a/src/QXmppClient.cpp +++ b/src/QXmppClient.cpp @@ -172,7 +172,10 @@ QXmppClient::QXmppClient(QObject *parent) d->rosterManager = new QXmppRosterManager(d->stream, this); d->archiveManager = new QXmppArchiveManager(d->stream, this); d->callManager = new QXmppCallManager(d->stream, this); - d->mucManager = new QXmppMucManager(d->stream, this); + + d->mucManager = new QXmppMucManager(this); + addExtension(d->mucManager); + d->transferManager = new QXmppTransferManager(d->stream, this); d->vCardManager = new QXmppVCardManager(d->stream, this); diff --git a/src/QXmppMucManager.cpp b/src/QXmppMucManager.cpp index d9203d4b..6d65517f 100644 --- a/src/QXmppMucManager.cpp +++ b/src/QXmppMucManager.cpp @@ -21,6 +21,8 @@ * */ +#include <QDomElement> + #include "QXmppConstants.h" #include "QXmppMessage.h" #include "QXmppMucIq.h" @@ -28,25 +30,47 @@ #include "QXmppOutgoingClient.h" #include "QXmppUtils.h" -QXmppMucManager::QXmppMucManager(QXmppOutgoingClient* stream, QObject *parent) - : QObject(parent), - m_stream(stream) +QXmppMucManager::QXmppMucManager(QXmppClient* client) { - bool check = connect(stream, SIGNAL(messageReceived(QXmppMessage)), + bool check = connect(client, SIGNAL(messageReceived(QXmppMessage)), this, SLOT(messageReceived(QXmppMessage))); Q_ASSERT(check); - check = connect(stream, SIGNAL(mucAdminIqReceived(QXmppMucAdminIq)), - this, SLOT(mucAdminIqReceived(QXmppMucAdminIq))); + check = QObject::connect(client, SIGNAL(presenceReceived(QXmppPresence)), + this, SLOT(presenceReceived(QXmppPresence))); Q_ASSERT(check); +} - check = connect(stream, SIGNAL(mucOwnerIqReceived(QXmppMucOwnerIq)), - this, SLOT(mucOwnerIqReceived(QXmppMucOwnerIq))); - Q_ASSERT(check); +QStringList QXmppMucManager::discoveryFeatures() const +{ + // XEP-0045: Multi-User Chat + return QStringList() + << ns_muc + << ns_muc_admin + << ns_muc_owner + << ns_muc_user; +} - check = QObject::connect(m_stream, SIGNAL(presenceReceived(QXmppPresence)), - this, SLOT(presenceReceived(QXmppPresence))); - Q_ASSERT(check); +bool QXmppMucManager::handleStanza(QXmppStream *stream, const QDomElement &element) +{ + if (element.tagName() == "iq") + { + if (QXmppMucAdminIq::isMucAdminIq(element)) + { + QXmppMucAdminIq iq; + iq.parse(element); + mucAdminIqReceived(iq); + return true; + } + else if (QXmppMucOwnerIq::isMucOwnerIq(element)) + { + QXmppMucOwnerIq iq; + iq.parse(element); + mucOwnerIqReceived(iq); + return true; + } + } + return false; } /// Joins the given chat room with the requested nickname. @@ -66,7 +90,7 @@ bool QXmppMucManager::joinRoom(const QString &roomJid, const QString &nickName) x.setTagName("x"); x.setAttribute("xmlns", ns_muc); packet.setExtensions(x); - if (m_stream->sendPacket(packet)) + if (client()->sendPacket(packet)) { m_nickNames[roomJid] = nickName; return true; @@ -90,7 +114,7 @@ bool QXmppMucManager::leaveRoom(const QString &roomJid) QXmppPresence packet; packet.setTo(roomJid + "/" + nickName); packet.setType(QXmppPresence::Unavailable); - return m_stream->sendPacket(packet); + return client()->sendPacket(packet); } /// Retrieves the list of participants for the given room. @@ -116,7 +140,7 @@ bool QXmppMucManager::requestRoomConfiguration(const QString &roomJid) { QXmppMucOwnerIq iq; iq.setTo(roomJid); - return m_stream->sendPacket(iq); + return client()->sendPacket(iq); } /// Send the configuration form for the given room. @@ -133,7 +157,25 @@ bool QXmppMucManager::setRoomConfiguration(const QString &roomJid, const QXmppDa iqPacket.setType(QXmppIq::Set); iqPacket.setTo(roomJid); iqPacket.setForm(form); - return m_stream->sendPacket(iqPacket); + return client()->sendPacket(iqPacket); +} + +bool QXmppMucManager::requestRoomPermissions(const QString &roomJid) +{ + QStringList affiliations; + affiliations << "member" << "admin" << "owner" << "outcast"; + foreach (const QString &affiliation, affiliations) + { + QXmppMucAdminIq::Item item; + item.setAffiliation(affiliation); + + QXmppMucAdminIq iq; + iq.setTo(roomJid); + iq.setItems(QList<QXmppMucAdminIq::Item>() << item); + if (!client()->sendPacket(iq)) + return false; + } + return true; } /// Invite a user to a chat room. @@ -157,7 +199,7 @@ bool QXmppMucManager::sendInvitation(const QString &roomJid, const QString &jid, message.setTo(jid); message.setType(QXmppMessage::Normal); message.setExtensions(x); - return m_stream->sendPacket(message); + return client()->sendPacket(message); } /// Send a message to a chat room. @@ -180,7 +222,7 @@ bool QXmppMucManager::sendMessage(const QString &roomJid, const QString &text) msg.setFrom(roomJid + "/" + m_nickNames[roomJid]); msg.setTo(roomJid); msg.setType(QXmppMessage::GroupChat); - return m_stream->sendPacket(msg); + return client()->sendPacket(msg); } void QXmppMucManager::messageReceived(const QXmppMessage &msg) @@ -203,7 +245,9 @@ void QXmppMucManager::messageReceived(const QXmppMessage &msg) void QXmppMucManager::mucAdminIqReceived(const QXmppMucAdminIq &iq) { - Q_UNUSED(iq); + if (iq.type() != QXmppIq::Result) + return; + emit roomPermissionsReceived(iq.from(), iq.items()); } void QXmppMucManager::mucOwnerIqReceived(const QXmppMucOwnerIq &iq) diff --git a/src/QXmppMucManager.h b/src/QXmppMucManager.h index 35295b18..7e353d88 100644 --- a/src/QXmppMucManager.h +++ b/src/QXmppMucManager.h @@ -24,9 +24,10 @@ #ifndef QXMPPMUCMANAGER_H #define QXMPPMUCMANAGER_H -#include <QObject> #include <QMap> +#include "QXmppClientExtension.h" +#include "QXmppMucIq.h" #include "QXmppPresence.h" class QXmppDataForm; @@ -40,12 +41,12 @@ class QXmppOutgoingClient; /// /// \ingroup Managers -class QXmppMucManager : public QObject +class QXmppMucManager : public QXmppClientExtension { Q_OBJECT public: - QXmppMucManager(QXmppOutgoingClient* stream, QObject *parent = 0); + QXmppMucManager(QXmppClient* client); bool joinRoom(const QString &roomJid, const QString &nickName); bool leaveRoom(const QString &roomJid); @@ -53,11 +54,18 @@ public: bool requestRoomConfiguration(const QString &roomJid); bool setRoomConfiguration(const QString &roomJid, const QXmppDataForm &form); + bool requestRoomPermissions(const QString &roomJid); + bool sendInvitation(const QString &roomJid, const QString &jid, const QString &reason); bool sendMessage(const QString &roomJid, const QString &text); QMap<QString, QXmppPresence> roomParticipants(const QString& bareJid) const; + /// \cond + QStringList discoveryFeatures() const; + bool handleStanza(QXmppStream *stream, const QDomElement &element); + /// \endcond + signals: /// This signal is emitted when an invitation to a chat room is received. void invitationReceived(const QString &roomJid, const QString &inviter, const QString &reason); @@ -65,6 +73,9 @@ signals: /// This signal is emitted when the configuration form for a chat room is received. void roomConfigurationReceived(const QString &roomJid, const QXmppDataForm &configuration); + /// This signal is emitted when the permissions for a chat room are received. + void roomPermissionsReceived(const QString &roomJid, const QList<QXmppMucAdminIq::Item> &permissions); + void roomParticipantChanged(const QString &roomJid, const QString &nickName); private slots: diff --git a/src/QXmppOutgoingClient.cpp b/src/QXmppOutgoingClient.cpp index f4ec1bc1..cc225e5a 100644 --- a/src/QXmppOutgoingClient.cpp +++ b/src/QXmppOutgoingClient.cpp @@ -45,7 +45,6 @@ #include "QXmppDiscoveryIq.h" #include "QXmppIbbIq.h" #include "QXmppJingleIq.h" -#include "QXmppMucIq.h" #include "QXmppPingIq.h" #include "QXmppRpcIq.h" #include "QXmppRosterIq.h" @@ -499,19 +498,6 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) emit discoveryIqReceived(discoIq); } } - // XEP-0045: Multi-User Chat - else if (QXmppMucAdminIq::isMucAdminIq(nodeRecv)) - { - QXmppMucAdminIq mucIq; - mucIq.parse(nodeRecv); - emit mucAdminIqReceived(mucIq); - } - else if (QXmppMucOwnerIq::isMucOwnerIq(nodeRecv)) - { - QXmppMucOwnerIq mucIq; - mucIq.parse(nodeRecv); - emit mucOwnerIqReceived(mucIq); - } // XEP-0047 In-Band Bytestreams else if(QXmppIbbCloseIq::isIbbCloseIq(nodeRecv)) { diff --git a/src/QXmppOutgoingClient.h b/src/QXmppOutgoingClient.h index 3aafdd44..f1071995 100644 --- a/src/QXmppOutgoingClient.h +++ b/src/QXmppOutgoingClient.h @@ -53,8 +53,6 @@ class QXmppIbbCloseIq; class QXmppIbbDataIq; class QXmppIbbOpenIq; class QXmppJingleIq; -class QXmppMucAdminIq; -class QXmppMucOwnerIq; class QXmppStreamInitiationIq; class QXmppOutgoingClientPrivate; @@ -104,10 +102,6 @@ signals: void ibbDataIqReceived(const QXmppIbbDataIq&); void ibbOpenIqReceived(const QXmppIbbOpenIq&); - // XEP-0045: Multi-User Chat - void mucAdminIqReceived(const QXmppMucAdminIq&); - void mucOwnerIqReceived(const QXmppMucOwnerIq&); - // XEP-0054: vcard-temp void vCardIqReceived(const QXmppVCardIq&); |
