diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2011-05-02 13:42:07 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2011-05-02 13:42:07 +0000 |
| commit | 9bfc3bcab2e5772b34f2f3fd4bd125e5507c32d2 (patch) | |
| tree | 6a720d60499bb0e6cadc0d6979cca8a0de5613b9 | |
| parent | ac74e91fc474785391b6be798f527dc3daf2f502 (diff) | |
| download | qxmpp-9bfc3bcab2e5772b34f2f3fd4bd125e5507c32d2.tar.gz | |
rename QXmppMucAdminIq::Item to QXmppMucItem
| -rw-r--r-- | src/QXmppMucIq.cpp | 151 | ||||
| -rw-r--r-- | src/QXmppMucIq.h | 127 | ||||
| -rw-r--r-- | src/QXmppMucManager.cpp | 102 | ||||
| -rw-r--r-- | src/QXmppMucManager.h | 5 |
4 files changed, 226 insertions, 159 deletions
diff --git a/src/QXmppMucIq.cpp b/src/QXmppMucIq.cpp index 0a349860..97328a2f 100644 --- a/src/QXmppMucIq.cpp +++ b/src/QXmppMucIq.cpp @@ -27,133 +27,192 @@ #include "QXmppMucIq.h" #include "QXmppUtils.h" -QXmppMucAdminIq::Item::Item() - : m_affiliation(QXmppMucAdminIq::Item::UnspecifiedAffiliation), - m_role(QXmppMucAdminIq::Item::UnspecifiedRole) +QXmppMucItem::QXmppMucItem() + : m_affiliation(QXmppMucItem::UnspecifiedAffiliation), + m_role(QXmppMucItem::UnspecifiedRole) { } -QXmppMucAdminIq::Item::Affiliation QXmppMucAdminIq::Item::affiliation() const +bool QXmppMucItem::isNull() const +{ + return m_actor.isEmpty() && + m_affiliation == UnspecifiedAffiliation && + m_jid.isEmpty() && + m_nick.isEmpty() && + m_reason.isEmpty() && + m_role == UnspecifiedRole; +} + +QString QXmppMucItem::actor() const +{ + return m_actor; +} + +void QXmppMucItem::setActor(const QString &actor) +{ + m_actor = actor; +} + +/// Returns the user's affiliation, i.e. long-lived permissions. + +QXmppMucItem::Affiliation QXmppMucItem::affiliation() const { return m_affiliation; } -QXmppMucAdminIq::Item::Affiliation QXmppMucAdminIq::Item::affiliationFromString(const QString &affiliationStr) +QXmppMucItem::Affiliation QXmppMucItem::affiliationFromString(const QString &affiliationStr) { if (affiliationStr == "owner") - return QXmppMucAdminIq::Item::OwnerAffiliation; + return QXmppMucItem::OwnerAffiliation; else if (affiliationStr == "admin") - return QXmppMucAdminIq::Item::AdminAffiliation; + return QXmppMucItem::AdminAffiliation; else if (affiliationStr == "member") - return QXmppMucAdminIq::Item::MemberAffiliation; + return QXmppMucItem::MemberAffiliation; else if (affiliationStr == "outcast") - return QXmppMucAdminIq::Item::OutcastAffiliation; + return QXmppMucItem::OutcastAffiliation; else if (affiliationStr == "none") - return QXmppMucAdminIq::Item::NoAffiliation; + return QXmppMucItem::NoAffiliation; else - return QXmppMucAdminIq::Item::UnspecifiedAffiliation; + return QXmppMucItem::UnspecifiedAffiliation; } -QString QXmppMucAdminIq::Item::affiliationToString(Affiliation affiliation) +QString QXmppMucItem::affiliationToString(Affiliation affiliation) { switch (affiliation) { - case QXmppMucAdminIq::Item::OwnerAffiliation: + case QXmppMucItem::OwnerAffiliation: return "owner"; - case QXmppMucAdminIq::Item::AdminAffiliation: + case QXmppMucItem::AdminAffiliation: return "admin"; - case QXmppMucAdminIq::Item::MemberAffiliation: + case QXmppMucItem::MemberAffiliation: return "member"; - case QXmppMucAdminIq::Item::OutcastAffiliation: + case QXmppMucItem::OutcastAffiliation: return "outcast"; - case QXmppMucAdminIq::Item::NoAffiliation: + case QXmppMucItem::NoAffiliation: return "none"; default: return QString(); } } -void QXmppMucAdminIq::Item::setAffiliation(Affiliation affiliation) +/// Sets the user's affiliation, i.e. long-lived permissions. +/// +/// \param affiliation + +void QXmppMucItem::setAffiliation(Affiliation affiliation) { m_affiliation = affiliation; } -QString QXmppMucAdminIq::Item::jid() const +/// Returns the user's real JID. + +QString QXmppMucItem::jid() const { return m_jid; } -void QXmppMucAdminIq::Item::setJid(const QString &jid) +/// Sets the user's real JID. +/// +/// \param jid + +void QXmppMucItem::setJid(const QString &jid) { m_jid = jid; } -QString QXmppMucAdminIq::Item::nick() const +/// Returns the user's nickname. + +QString QXmppMucItem::nick() const { return m_nick; } -void QXmppMucAdminIq::Item::setNick(const QString &nick) +/// Sets the user's nickname. +/// +/// \param nick + +void QXmppMucItem::setNick(const QString &nick) { m_nick = nick; } -QString QXmppMucAdminIq::Item::reason() const +QString QXmppMucItem::reason() const { return m_reason; } -void QXmppMucAdminIq::Item::setReason(const QString &reason) +void QXmppMucItem::setReason(const QString &reason) { m_reason = reason; } -QXmppMucAdminIq::Item::Role QXmppMucAdminIq::Item::role() const +/// Returns the user's role, i.e. short-lived permissions. + +QXmppMucItem::Role QXmppMucItem::role() const { return m_role; } -QXmppMucAdminIq::Item::Role QXmppMucAdminIq::Item::roleFromString(const QString &roleStr) +QXmppMucItem::Role QXmppMucItem::roleFromString(const QString &roleStr) { if (roleStr == "moderator") - return QXmppMucAdminIq::Item::ModeratorRole; + return QXmppMucItem::ModeratorRole; else if (roleStr == "participant") - return QXmppMucAdminIq::Item::ParticipantRole; + return QXmppMucItem::ParticipantRole; else if (roleStr == "visitor") - return QXmppMucAdminIq::Item::VisitorRole; + return QXmppMucItem::VisitorRole; else if (roleStr == "none") - return QXmppMucAdminIq::Item::NoRole; + return QXmppMucItem::NoRole; else - return QXmppMucAdminIq::Item::UnspecifiedRole; + return QXmppMucItem::UnspecifiedRole; } -QString QXmppMucAdminIq::Item::roleToString(Role role) +QString QXmppMucItem::roleToString(Role role) { switch (role) { - case QXmppMucAdminIq::Item::ModeratorRole: + case QXmppMucItem::ModeratorRole: return "moderator"; - case QXmppMucAdminIq::Item::ParticipantRole: + case QXmppMucItem::ParticipantRole: return "participant"; - case QXmppMucAdminIq::Item::VisitorRole: + case QXmppMucItem::VisitorRole: return "visitor"; - case QXmppMucAdminIq::Item::NoRole: + case QXmppMucItem::NoRole: return "none"; default: return QString(); } } -void QXmppMucAdminIq::Item::setRole(Role role) +/// Sets the user's role, i.e. short-lived permissions. +/// +/// \param role + +void QXmppMucItem::setRole(Role role) { m_role = role; } -void QXmppMucAdminIq::Item::toXml(QXmlStreamWriter *writer) const +void QXmppMucItem::parse(const QDomElement &element) +{ + m_affiliation = QXmppMucItem::affiliationFromString(element.attribute("affiliation").toLower()); + m_jid = element.attribute("jid"); + m_nick = element.attribute("nick"); + m_role = QXmppMucItem::roleFromString(element.attribute("role").toLower()); + m_actor = element.firstChildElement("actor").attribute("jid"); + m_reason = element.firstChildElement("reason").text(); +} + +void QXmppMucItem::toXml(QXmlStreamWriter *writer) const { writer->writeStartElement("item"); - helperToXmlAddAttribute(writer, "jid", m_jid); helperToXmlAddAttribute(writer, "affiliation", affiliationToString(m_affiliation)); + helperToXmlAddAttribute(writer, "jid", m_jid); helperToXmlAddAttribute(writer, "nick", m_nick); helperToXmlAddAttribute(writer, "role", roleToString(m_role)); + if (!m_actor.isEmpty()) { + writer->writeStartElement("actor"); + helperToXmlAddAttribute(writer, "jid", m_actor); + writer->writeEndElement(); + } if (!m_reason.isEmpty()) helperToXmlAddTextElement(writer, "reason", m_reason); writer->writeEndElement(); @@ -161,7 +220,7 @@ void QXmppMucAdminIq::Item::toXml(QXmlStreamWriter *writer) const /// Returns the IQ's items. -QList<QXmppMucAdminIq::Item> QXmppMucAdminIq::items() const +QList<QXmppMucItem> QXmppMucAdminIq::items() const { return m_items; } @@ -170,7 +229,7 @@ QList<QXmppMucAdminIq::Item> QXmppMucAdminIq::items() const /// /// \param items -void QXmppMucAdminIq::setItems(const QList<QXmppMucAdminIq::Item> &items) +void QXmppMucAdminIq::setItems(const QList<QXmppMucItem> &items) { m_items = items; } @@ -187,12 +246,8 @@ void QXmppMucAdminIq::parseElementFromChild(const QDomElement &element) QDomElement child = queryElement.firstChildElement("item"); while (!child.isNull()) { - QXmppMucAdminIq::Item item; - item.setAffiliation(QXmppMucAdminIq::Item::affiliationFromString(child.attribute("affiliation").toLower())); - item.setJid(child.attribute("jid")); - item.setNick(child.attribute("nick")); - item.setRole(QXmppMucAdminIq::Item::roleFromString(child.attribute("role").toLower())); - item.setReason(child.firstChildElement("reason").text()); + QXmppMucItem item; + item.parse(child); m_items << item; child = child.nextSiblingElement("item"); } @@ -202,7 +257,7 @@ void QXmppMucAdminIq::toXmlElementFromChild(QXmlStreamWriter *writer) const { writer->writeStartElement("query"); writer->writeAttribute("xmlns", ns_muc_admin); - foreach (const QXmppMucAdminIq::Item &item, m_items) + foreach (const QXmppMucItem &item, m_items) item.toXml(writer); writer->writeEndElement(); } diff --git a/src/QXmppMucIq.h b/src/QXmppMucIq.h index 337dac6e..5e73fc9b 100644 --- a/src/QXmppMucIq.h +++ b/src/QXmppMucIq.h @@ -27,6 +27,73 @@ #include "QXmppDataForm.h" #include "QXmppIq.h" +/// \brief The QXmppMucItem class represents a chat room "item". +/// +/// It is used to convey information such as permissions. +/// +/// \ingroup Stanzas + +class QXmppMucItem +{ +public: + /// This enum is used to represent long-lived permissions in a room (affiliations). + enum Affiliation { + UnspecifiedAffiliation, + OutcastAffiliation, + NoAffiliation, + MemberAffiliation, + AdminAffiliation, + OwnerAffiliation, + }; + + /// This enum is used to represent short-lived permissions in a room (roles). + enum Role { + UnspecifiedRole, + NoRole, + VisitorRole, + ParticipantRole, + ModeratorRole, + }; + + QXmppMucItem(); + bool isNull() const; + + QString actor() const; + void setActor(const QString &actor); + + Affiliation affiliation() const; + void setAffiliation(Affiliation affiliation); + + QString jid() const; + void setJid(const QString &jid); + + QString nick() const; + void setNick(const QString &nick); + + QString reason() const; + void setReason(const QString &reason); + + Role role() const; + void setRole(Role role); + + void parse(const QDomElement &element); + void toXml(QXmlStreamWriter *writer) const; + + /// \cond + static Affiliation affiliationFromString(const QString &affiliationStr); + static QString affiliationToString(Affiliation affiliation); + static Role roleFromString(const QString &roleStr); + static QString roleToString(Role role); + /// \endcond +private: + QString m_actor; + Affiliation m_affiliation; + QString m_jid; + QString m_nick; + QString m_reason; + Role m_role; +}; + /// \brief The QXmppMucAdminIq class represents a chat room administration IQ /// as defined by XEP-0045: Multi-User Chat. /// @@ -37,62 +104,8 @@ class QXmppMucAdminIq : public QXmppIq { public: - class Item - { - public: - enum Affiliation { - UnspecifiedAffiliation, - OutcastAffiliation, - NoAffiliation, - MemberAffiliation, - AdminAffiliation, - OwnerAffiliation, - }; - - enum Role { - UnspecifiedRole, - NoRole, - VisitorRole, - ParticipantRole, - ModeratorRole, - }; - - Item(); - - Affiliation affiliation() const; - void setAffiliation(Affiliation affiliation); - - QString jid() const; - void setJid(const QString &jid); - - QString nick() const; - void setNick(const QString &nick); - - QString reason() const; - void setReason(const QString &reason); - - Role role() const; - void setRole(Role role); - - void parse(const QDomElement &element); - void toXml(QXmlStreamWriter *writer) const; - - /// \cond - static Affiliation affiliationFromString(const QString &affiliationStr); - static QString affiliationToString(Affiliation affiliation); - static Role roleFromString(const QString &roleStr); - static QString roleToString(Role role); - /// \endcond - private: - Affiliation m_affiliation; - QString m_jid; - QString m_nick; - QString m_reason; - Role m_role; - }; - - QList<QXmppMucAdminIq::Item> items() const; - void setItems(const QList<QXmppMucAdminIq::Item> &items); + QList<QXmppMucItem> items() const; + void setItems(const QList<QXmppMucItem> &items); /// \cond static bool isMucAdminIq(const QDomElement &element); @@ -105,7 +118,7 @@ protected: /// \endcond private: - QList<QXmppMucAdminIq::Item> m_items; + QList<QXmppMucItem> m_items; }; /// \brief The QXmppMucOwnerIq class represents a chat room configuration IQ as 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<QString, QXmppPresence> participants; QString password; - QMap<QString, QXmppMucAdminIq::Item::Affiliation> affiliations; + QMap<QString, QXmppMucItem::Affiliation> 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<QXmppMucRoom*>(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<QXmppMucAdminIq::Item>() << item); + iq.setItems(QList<QXmppMucItem>() << item); return d->client->sendPacket(iq); } @@ -423,18 +431,18 @@ bool QXmppMucRoom::setConfiguration(const QXmppDataForm &form) bool QXmppMucRoom::requestPermissions() { - QList<QXmppMucAdminIq::Item::Affiliation> 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<QXmppMucItem::Affiliation> 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<QXmppMucAdminIq::Item>() << item); + iq.setItems(QList<QXmppMucItem>() << 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<QXmppMucAdminIq::Item> &permissions) +bool QXmppMucRoom::setPermissions(const QList<QXmppMucItem> &permissions) { - QList<QXmppMucAdminIq::Item> items; + QList<QXmppMucItem> 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<QXmppMucAdminIq::Item> &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(); } diff --git a/src/QXmppMucManager.h b/src/QXmppMucManager.h index 4280ee0b..be439857 100644 --- a/src/QXmppMucManager.h +++ b/src/QXmppMucManager.h @@ -81,6 +81,7 @@ protected: private slots: void _q_messageReceived(const QXmppMessage &message); + void _q_roomDestroyed(QObject *object); private: QXmppMucManagerPrivate *d; @@ -159,7 +160,7 @@ signals: void participantRemoved(const QString &jid); /// This signal is emitted when the room's permissions are received. - void permissionsReceived(const QList<QXmppMucAdminIq::Item> &permissions); + void permissionsReceived(const QList<QXmppMucItem> &permissions); /// This signal is emitted when the room's subject changes. void subjectChanged(const QString &subject); @@ -171,7 +172,7 @@ public slots: bool requestConfiguration(); bool requestPermissions(); bool setConfiguration(const QXmppDataForm &form); - bool setPermissions(const QList<QXmppMucAdminIq::Item> &permissions); + bool setPermissions(const QList<QXmppMucItem> &permissions); bool sendInvitation(const QString &jid, const QString &reason); bool sendMessage(const QString &text); |
