aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2011-05-03 14:45:25 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2011-05-03 14:45:25 +0000
commite0a5eb58a2cb5617e5c638b5e4a2581dd6ec347b (patch)
tree888be64cd54a53d5af8f76d6f276a693923bad22 /src
parent2cda4e999fd59fab7fd16ec7cb718b95dd83b2f6 (diff)
downloadqxmpp-e0a5eb58a2cb5617e5c638b5e4a2581dd6ec347b.tar.gz
make requestPermissions() generate a single permissionsReceived()
Diffstat (limited to 'src')
-rw-r--r--src/QXmppMucManager.cpp25
1 files changed, 16 insertions, 9 deletions
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<QString, QXmppPresence> participants;
QString password;
- QMap<QString, QXmppMucItem::Affiliation> affiliations;
+ QMap<QString, QXmppMucItem> permissions;
+ QSet<QString> 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<QXmppMucItem>() << item);
if (!d->client->sendPacket(iq))
return false;
+ d->permissionsQueue += iq.id();
}
return true;
}
@@ -469,18 +476,18 @@ bool QXmppMucRoom::setPermissions(const QList<QXmppMucItem> &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