From 9bfc3bcab2e5772b34f2f3fd4bd125e5507c32d2 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Mon, 2 May 2011 13:42:07 +0000 Subject: rename QXmppMucAdminIq::Item to QXmppMucItem --- src/QXmppMucManager.cpp | 102 ++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 52 deletions(-) (limited to 'src/QXmppMucManager.cpp') diff --git a/src/QXmppMucManager.cpp b/src/QXmppMucManager.cpp index bc31cbb4..2e6e4c26 100644 --- a/src/QXmppMucManager.cpp +++ b/src/QXmppMucManager.cpp @@ -46,7 +46,7 @@ public: QString jid; QMap participants; QString password; - QMap affiliations; + QMap affiliations; QString nickName; QString subject; }; @@ -59,7 +59,7 @@ QXmppMucManager::QXmppMucManager() } -/// Destroys a new QXmppMucManager. +/// Destroys a QXmppMucManager. QXmppMucManager::~QXmppMucManager() { @@ -76,6 +76,8 @@ QXmppMucRoom *QXmppMucManager::addRoom(const QString &roomJid) if (!room) { room = new QXmppMucRoom(client(), roomJid, this); d->rooms.insert(roomJid, room); + connect(room, SIGNAL(destroyed(QObject*)), + this, SLOT(_q_roomDestroyed(QObject*))); } return room; } @@ -110,7 +112,7 @@ bool QXmppMucManager::handleStanza(const QDomElement &element) QXmppMucRoom *room = d->rooms.value(iq.from()); if (room && iq.type() == QXmppIq::Result) { - foreach (const QXmppMucAdminIq::Item &item, iq.items()) { + foreach (const QXmppMucItem &item, iq.items()) { const QString jid = item.jid(); if (!room->d->affiliations.contains(jid)) room->d->affiliations.insert(jid, item.affiliation()); @@ -151,6 +153,12 @@ void QXmppMucManager::_q_messageReceived(const QXmppMessage &msg) } } +void QXmppMucManager::_q_roomDestroyed(QObject *object) +{ + const QString key = d->rooms.key(static_cast(object)); + d->rooms.remove(key); +} + /// Constructs a new QXmppMucRoom. /// /// \param parent @@ -242,15 +250,15 @@ bool QXmppMucRoom::join() bool QXmppMucRoom::kick(const QString &jid, const QString &reason) { - QXmppMucAdminIq::Item item; + QXmppMucItem item; item.setNick(jidToResource(jid)); - item.setRole(QXmppMucAdminIq::Item::NoRole); + item.setRole(QXmppMucItem::NoRole); item.setReason(reason); QXmppMucAdminIq iq; iq.setType(QXmppIq::Set); iq.setTo(d->jid); - iq.setItems(QList() << item); + iq.setItems(QList() << item); return d->client->sendPacket(iq); } @@ -423,18 +431,18 @@ bool QXmppMucRoom::setConfiguration(const QXmppDataForm &form) bool QXmppMucRoom::requestPermissions() { - QList affiliations; - affiliations << QXmppMucAdminIq::Item::OwnerAffiliation; - affiliations << QXmppMucAdminIq::Item::AdminAffiliation; - affiliations << QXmppMucAdminIq::Item::MemberAffiliation; - affiliations << QXmppMucAdminIq::Item::OutcastAffiliation; - foreach (QXmppMucAdminIq::Item::Affiliation affiliation, affiliations) { - QXmppMucAdminIq::Item item; + QList affiliations; + affiliations << QXmppMucItem::OwnerAffiliation; + affiliations << QXmppMucItem::AdminAffiliation; + affiliations << QXmppMucItem::MemberAffiliation; + affiliations << QXmppMucItem::OutcastAffiliation; + foreach (QXmppMucItem::Affiliation affiliation, affiliations) { + QXmppMucItem item; item.setAffiliation(affiliation); QXmppMucAdminIq iq; iq.setTo(d->jid); - iq.setItems(QList() << item); + iq.setItems(QList() << item); if (!d->client->sendPacket(iq)) return false; } @@ -447,12 +455,12 @@ bool QXmppMucRoom::requestPermissions() /// /// \return true if the request was sent, false otherwise -bool QXmppMucRoom::setPermissions(const QList &permissions) +bool QXmppMucRoom::setPermissions(const QList &permissions) { - QList items; + QList items; // Process changed members - foreach (const QXmppMucAdminIq::Item &item, permissions) { + foreach (const QXmppMucItem &item, permissions) { const QString jid = item.jid(); if (d->affiliations.value(jid) != item.affiliation()) items << item; @@ -461,8 +469,8 @@ bool QXmppMucRoom::setPermissions(const QList &permission // Process deleted members foreach (const QString &jid, d->affiliations.keys()) { - QXmppMucAdminIq::Item item; - item.setAffiliation(QXmppMucAdminIq::Item::NoAffiliation); + QXmppMucItem item; + item.setAffiliation(QXmppMucItem::NoAffiliation); item.setJid(jid); items << item; d->affiliations.remove(jid); @@ -532,24 +540,19 @@ void QXmppMucRoom::_q_presenceReceived(const QXmppPresence &presence) if (jid == d->ownJid()) { // check whether we own the room - foreach (const QXmppElement &x, presence.extensions()) { - if (x.tagName() == "x" && x.attribute("xmlns") == ns_muc_user) - { - QXmppElement item = x.firstChildElement("item"); - if (item.attribute("jid") == d->client->configuration().jid()) { - d->allowedActions = NoAction; - - // role - if (item.attribute("role") == "moderator") - d->allowedActions |= (KickAction | SubjectAction); - - // affiliation - if (item.attribute("affiliation") == "owner") - d->allowedActions |= (ConfigurationAction | PermissionsAction | SubjectAction); - else if (item.attribute("affiliation") == "admin") - d->allowedActions |= (PermissionsAction | SubjectAction); - } - } + QXmppMucItem mucItem = presence.mucItem(); + if (mucItem.jid() == d->client->configuration().jid()) { + d->allowedActions = NoAction; + + // role + if (mucItem.role() == QXmppMucItem::ModeratorRole) + d->allowedActions |= (KickAction | SubjectAction); + + // affiliation + if (mucItem.affiliation() == QXmppMucItem::OwnerAffiliation) + d->allowedActions |= (ConfigurationAction | PermissionsAction | SubjectAction); + else if (mucItem.affiliation() == QXmppMucItem::AdminAffiliation) + d->allowedActions |= (PermissionsAction | SubjectAction); } emit joined(); @@ -566,23 +569,18 @@ void QXmppMucRoom::_q_presenceReceived(const QXmppPresence &presence) if (jid == d->ownJid()) { // check whether we were kicked - foreach (const QXmppElement &extension, presence.extensions()) { - if (extension.tagName() == "x" && - extension.attribute("xmlns") == ns_muc_user) { - QXmppElement status = extension.firstChildElement("status"); - while (!status.isNull()) { - if (status.attribute("code").toInt() == 307) { - // emit kick - const QString actor = extension.firstChildElement("item").firstChildElement("actor").attribute("jid"); - const QString reason = extension.firstChildElement("item").firstChildElement("reason").value(); - emit kicked(actor, reason); - break; - } - status = status.nextSiblingElement("status"); - } - } + if (presence.mucStatusCodes().contains(307)) { + const QString actor = presence.mucItem().actor(); + const QString reason = presence.mucItem().reason(); + emit kicked(actor, reason); } + // clear chat room participants + const QStringList removed = d->participants.keys(); + d->participants.clear(); + foreach (const QString &jid, removed) + emit participantRemoved(jid); + // notify user we left the room emit left(); } -- cgit v1.2.3