aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2011-05-04 21:09:52 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2011-05-04 21:09:52 +0000
commit89b85eda7570337e2e9611a547e28f21bba0d48a (patch)
treed4466c6bd2a06e295dff0b31268d7f7f6b7a0c14 /src
parente0a5eb58a2cb5617e5c638b5e4a2581dd6ec347b (diff)
downloadqxmpp-89b85eda7570337e2e9611a547e28f21bba0d48a.tar.gz
emit a signal when allowed MUC actions change
Diffstat (limited to 'src')
-rw-r--r--src/QXmppMucManager.cpp51
-rw-r--r--src/QXmppMucManager.h4
2 files changed, 38 insertions, 17 deletions
diff --git a/src/QXmppMucManager.cpp b/src/QXmppMucManager.cpp
index 60cf6ebd..f2a8933b 100644
--- a/src/QXmppMucManager.cpp
+++ b/src/QXmppMucManager.cpp
@@ -511,6 +511,12 @@ void QXmppMucRoom::_q_disconnected()
foreach (const QString &jid, removed)
emit participantRemoved(jid);
+ // update available actions
+ if (d->allowedActions != NoAction) {
+ d->allowedActions = NoAction;
+ emit allowedActionsChanged(d->allowedActions);
+ }
+
// emit "left" signal if we had joined the room
if (wasJoined)
emit left();
@@ -548,28 +554,33 @@ void QXmppMucRoom::_q_presenceReceived(const QXmppPresence &presence)
if (presence.type() == QXmppPresence::Available) {
const bool added = !d->participants.contains(jid);
d->participants.insert(jid, presence);
- if (added) {
- emit participantAdded(jid);
- if (jid == d->ownJid()) {
- // check whether we own the room
- QXmppMucItem mucItem = presence.mucItem();
- if (mucItem.jid() == d->client->configuration().jid()) {
- d->allowedActions = NoAction;
+ // refresh allowed actions
+ if (jid == d->ownJid()) {
- // role
- if (mucItem.role() == QXmppMucItem::ModeratorRole)
- d->allowedActions |= (KickAction | SubjectAction);
+ QXmppMucItem mucItem = presence.mucItem();
+ Actions newActions = NoAction;
- // affiliation
- if (mucItem.affiliation() == QXmppMucItem::OwnerAffiliation)
- d->allowedActions |= (ConfigurationAction | PermissionsAction | SubjectAction);
- else if (mucItem.affiliation() == QXmppMucItem::AdminAffiliation)
- d->allowedActions |= (PermissionsAction | SubjectAction);
- }
+ // role
+ if (mucItem.role() == QXmppMucItem::ModeratorRole)
+ newActions |= (KickAction | SubjectAction);
- emit joined();
+ // affiliation
+ if (mucItem.affiliation() == QXmppMucItem::OwnerAffiliation)
+ newActions |= (ConfigurationAction | PermissionsAction | SubjectAction);
+ else if (mucItem.affiliation() == QXmppMucItem::AdminAffiliation)
+ newActions |= (PermissionsAction | SubjectAction);
+
+ if (newActions != d->allowedActions) {
+ d->allowedActions = newActions;
+ emit allowedActionsChanged(d->allowedActions);
}
+ }
+
+ if (added) {
+ emit participantAdded(jid);
+ if (jid == d->ownJid())
+ emit joined();
} else {
emit participantChanged(jid);
}
@@ -594,6 +605,12 @@ void QXmppMucRoom::_q_presenceReceived(const QXmppPresence &presence)
foreach (const QString &jid, removed)
emit participantRemoved(jid);
+ // update available actions
+ if (d->allowedActions != NoAction) {
+ d->allowedActions = NoAction;
+ emit allowedActionsChanged(d->allowedActions);
+ }
+
// notify user we left the room
emit left();
}
diff --git a/src/QXmppMucManager.h b/src/QXmppMucManager.h
index 889364ca..cbf9e5ce 100644
--- a/src/QXmppMucManager.h
+++ b/src/QXmppMucManager.h
@@ -95,6 +95,7 @@ private:
class QXmppMucRoom : public QObject
{
Q_OBJECT
+ Q_PROPERTY(QXmppMucRoom::Actions allowedActions READ allowedActions NOTIFY allowedActionsChanged)
Q_PROPERTY(QString jid READ jid)
Q_PROPERTY(QString nickName READ nickName WRITE setNickName)
Q_PROPERTY(QStringList participants READ participants)
@@ -132,6 +133,9 @@ public:
void setSubject(const QString &subject);
signals:
+ /// This signal is emitted when the allowed actions change.
+ void allowedActionsChanged(QXmppMucRoom::Actions actions) const;
+
/// This signal is emitted when the configuration form for the room is received.
void configurationReceived(const QXmppDataForm &configuration);