From e0a5eb58a2cb5617e5c638b5e4a2581dd6ec347b Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Tue, 3 May 2011 14:45:25 +0000 Subject: make requestPermissions() generate a single permissionsReceived() --- src/QXmppMucManager.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'src/QXmppMucManager.cpp') diff --git a/src/QXmppMucManager.cpp b/src/QXmppMucManager.cpp index 146aa40a..60cf6ebd 100644 --- a/src/QXmppMucManager.cpp +++ b/src/QXmppMucManager.cpp @@ -46,7 +46,8 @@ public: QString jid; QMap participants; QString password; - QMap affiliations; + QMap permissions; + QSet permissionsQueue; QString nickName; QString subject; }; @@ -112,13 +113,15 @@ bool QXmppMucManager::handleStanza(const QDomElement &element) iq.parse(element); QXmppMucRoom *room = d->rooms.value(iq.from()); - if (room && iq.type() == QXmppIq::Result) { + if (room && iq.type() == QXmppIq::Result && room->d->permissionsQueue.remove(iq.id())) { foreach (const QXmppMucItem &item, iq.items()) { const QString jid = item.jid(); - if (!room->d->affiliations.contains(jid)) - room->d->affiliations.insert(jid, item.affiliation()); + if (!room->d->permissions.contains(jid)) + room->d->permissions.insert(jid, item); + } + if (room->d->permissionsQueue.isEmpty()) { + emit room->permissionsReceived(room->d->permissions.values()); } - emit room->permissionsReceived(iq.items()); } return true; } @@ -443,6 +446,9 @@ bool QXmppMucRoom::requestPermissions() affiliations << QXmppMucItem::AdminAffiliation; affiliations << QXmppMucItem::MemberAffiliation; affiliations << QXmppMucItem::OutcastAffiliation; + + d->permissions.clear(); + d->permissionsQueue.clear(); foreach (QXmppMucItem::Affiliation affiliation, affiliations) { QXmppMucItem item; item.setAffiliation(affiliation); @@ -452,6 +458,7 @@ bool QXmppMucRoom::requestPermissions() iq.setItems(QList() << item); if (!d->client->sendPacket(iq)) return false; + d->permissionsQueue += iq.id(); } return true; } @@ -469,18 +476,18 @@ bool QXmppMucRoom::setPermissions(const QList &permissions) // Process changed members foreach (const QXmppMucItem &item, permissions) { const QString jid = item.jid(); - if (d->affiliations.value(jid) != item.affiliation()) + if (d->permissions.value(jid).affiliation() != item.affiliation()) items << item; - d->affiliations.remove(jid); + d->permissions.remove(jid); } // Process deleted members - foreach (const QString &jid, d->affiliations.keys()) { + foreach (const QString &jid, d->permissions.keys()) { QXmppMucItem item; item.setAffiliation(QXmppMucItem::NoAffiliation); item.setJid(jid); items << item; - d->affiliations.remove(jid); + d->permissions.remove(jid); } // Don't send request if there are no changes -- cgit v1.2.3