aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-09-10 10:22:08 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-09-10 10:22:08 +0000
commit874b51e41dcff2187707f4331d274dbb37cde5b0 (patch)
tree2c31bef75d6c029a8e19eda3f1eff942e8154410 /src
parentc9c8c38170863ea3316e92fcfb570e99f7862402 (diff)
downloadqxmpp-874b51e41dcff2187707f4331d274dbb37cde5b0.tar.gz
refactor QXmppMucManager as a client extension
Diffstat (limited to 'src')
-rw-r--r--src/QXmppClient.cpp5
-rw-r--r--src/QXmppMucManager.cpp82
-rw-r--r--src/QXmppMucManager.h17
-rw-r--r--src/QXmppOutgoingClient.cpp14
-rw-r--r--src/QXmppOutgoingClient.h6
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&);