From f74b261fad3f06e9e27d5aca7e86d9ca14b5a67a Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Wed, 5 Sep 2012 17:35:21 +0200 Subject: Add QXmppMucRoom::name() to get the room's human-readable name. --- src/client/QXmppMucManager.cpp | 40 +++++++++++++++++++++++++++++++++++++++- src/client/QXmppMucManager.h | 7 +++++++ 2 files changed, 46 insertions(+), 1 deletion(-) (limited to 'src/client') diff --git a/src/client/QXmppMucManager.cpp b/src/client/QXmppMucManager.cpp index 7b981459..9ca71d77 100644 --- a/src/client/QXmppMucManager.cpp +++ b/src/client/QXmppMucManager.cpp @@ -26,6 +26,7 @@ #include "QXmppClient.h" #include "QXmppConstants.h" +#include "QXmppDiscoveryManager.h" #include "QXmppMessage.h" #include "QXmppMucIq.h" #include "QXmppMucManager.h" @@ -42,8 +43,10 @@ class QXmppMucRoomPrivate public: QString ownJid() const { return jid + "/" + nickName; } QXmppClient *client; + QXmppDiscoveryManager *discoManager; QXmppMucRoom::Actions allowedActions; QString jid; + QString name; QMap participants; QString password; QMap permissions; @@ -190,6 +193,7 @@ QXmppMucRoom::QXmppMucRoom(QXmppClient *client, const QString &jid, QObject *par d = new QXmppMucRoomPrivate; d->allowedActions = NoAction; d->client = client; + d->discoManager = client->findExtension(); d->jid = jid; check = connect(d->client, SIGNAL(disconnected()), @@ -204,6 +208,10 @@ QXmppMucRoom::QXmppMucRoom(QXmppClient *client, const QString &jid, QObject *par this, SLOT(_q_presenceReceived(QXmppPresence))); Q_ASSERT(check); + check = connect(d->discoManager, SIGNAL(infoReceived(QXmppDiscoveryIq)), + this, SLOT(_q_discoveryInfoReceived(QXmppDiscoveryIq))); + Q_ASSERT(check); + // convenience signals for properties check = connect(this, SIGNAL(joined()), this, SIGNAL(isJoinedChanged())); Q_ASSERT(check); @@ -329,6 +337,15 @@ bool QXmppMucRoom::leave(const QString &message) return d->client->sendPacket(packet); } +/// Returns the chat room's human-readable name. +/// +/// This name will only be available after the room has been joined. + +QString QXmppMucRoom::name() const +{ + return d->name; +} + /// Returns your own nickname. QString QXmppMucRoom::nickName() const @@ -585,6 +602,22 @@ void QXmppMucRoom::_q_disconnected() emit left(); } +void QXmppMucRoom::_q_discoveryInfoReceived(const QXmppDiscoveryIq &iq) +{ + QString name; + foreach (const QXmppDiscoveryIq::Identity &identity, iq.identities()) { + if (identity.category() == "conference") { + name = identity.name(); + break; + } + } + + if (name != d->name) { + d->name = name; + emit nameChanged(name); + } +} + void QXmppMucRoom::_q_messageReceived(const QXmppMessage &message) { if (QXmppUtils::jidToBareJid(message.from())!= d->jid) @@ -643,8 +676,13 @@ void QXmppMucRoom::_q_presenceReceived(const QXmppPresence &presence) if (added) { emit participantAdded(jid); emit participantsChanged(); - if (jid == d->ownJid()) + if (jid == d->ownJid()) { + // request room information + if (d->discoManager) + d->discoManager->requestInfo(d->jid); + emit joined(); + } } else { emit participantChanged(jid); } diff --git a/src/client/QXmppMucManager.h b/src/client/QXmppMucManager.h index d24a780e..341c9663 100644 --- a/src/client/QXmppMucManager.h +++ b/src/client/QXmppMucManager.h @@ -29,6 +29,7 @@ #include "QXmppPresence.h" class QXmppDataForm; +class QXmppDiscoveryIq; class QXmppMessage; class QXmppMucManagerPrivate; class QXmppMucRoom; @@ -104,6 +105,7 @@ class QXMPP_EXPORT QXmppMucRoom : public QObject Q_PROPERTY(QXmppMucRoom::Actions allowedActions READ allowedActions NOTIFY allowedActionsChanged) Q_PROPERTY(bool isJoined READ isJoined NOTIFY isJoinedChanged) Q_PROPERTY(QString jid READ jid CONSTANT) + Q_PROPERTY(QString name READ name NOTIFY nameChanged) Q_PROPERTY(QString nickName READ nickName WRITE setNickName NOTIFY nickNameChanged) Q_PROPERTY(QStringList participants READ participants NOTIFY participantsChanged) Q_PROPERTY(QString password READ password WRITE setPassword) @@ -126,6 +128,7 @@ public: Actions allowedActions() const; bool isJoined() const; QString jid() const; + QString name() const; QString nickName() const; void setNickName(const QString &nickName); @@ -166,6 +169,9 @@ signals: /// This signal is emitted when a message is received. void messageReceived(const QXmppMessage &message); + /// This signal is emitted when the room's human-readable name changes. + void nameChanged(const QString &name); + /// This signal is emitted when your own nick name changes. void nickNameChanged(const QString &nickName); @@ -202,6 +208,7 @@ public slots: private slots: void _q_disconnected(); + void _q_discoveryInfoReceived(const QXmppDiscoveryIq &iq); void _q_messageReceived(const QXmppMessage &message); void _q_presenceReceived(const QXmppPresence &presence); -- cgit v1.2.3