aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2011-05-02 13:42:07 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2011-05-02 13:42:07 +0000
commit9bfc3bcab2e5772b34f2f3fd4bd125e5507c32d2 (patch)
tree6a720d60499bb0e6cadc0d6979cca8a0de5613b9
parentac74e91fc474785391b6be798f527dc3daf2f502 (diff)
downloadqxmpp-9bfc3bcab2e5772b34f2f3fd4bd125e5507c32d2.tar.gz
rename QXmppMucAdminIq::Item to QXmppMucItem
-rw-r--r--src/QXmppMucIq.cpp151
-rw-r--r--src/QXmppMucIq.h127
-rw-r--r--src/QXmppMucManager.cpp102
-rw-r--r--src/QXmppMucManager.h5
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);