aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-09-05 17:35:21 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2012-09-05 17:35:21 +0200
commitf74b261fad3f06e9e27d5aca7e86d9ca14b5a67a (patch)
treebccc1e0066a4c28198c6d6743a2dbd5d13e8f294
parent94545f5d9303dc1e04ff3d1260bc62ce6f2ec5ee (diff)
downloadqxmpp-f74b261fad3f06e9e27d5aca7e86d9ca14b5a67a.tar.gz
Add QXmppMucRoom::name() to get the room's human-readable name.
-rw-r--r--CHANGELOG3
-rw-r--r--src/client/QXmppMucManager.cpp40
-rw-r--r--src/client/QXmppMucManager.h7
3 files changed, 48 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 94ebc214..6e98cce2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,8 +4,9 @@ QXmpp 0.7.2 (Unreleased)
- Handle Error replies in QXmppDiscoveryManager so that library users can know
about errors.
- If building with Qt 5, use Qt's QDnsLookup instead of our backport.
- - Improve MUC scritability:
+ - Improve MUC scriptability:
* Add QXmppMucRoom::ban() to ban users.
+ * Add QXmppMucRoom::name() to get the room's human-readable name.
* Add QXmppMucRoom::participantFullJid() to lookup an occupant full JID.
QXmpp 0.7.1 (Sep 3, 2012)
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<QString, QXmppPresence> participants;
QString password;
QMap<QString, QXmppMucItem> 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<QXmppDiscoveryManager>();
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);