diff --git a/source/org/jivesoftware/smackx/MultiUserChat.java b/source/org/jivesoftware/smackx/MultiUserChat.java index 03fb8ac8d..7f4ae2cec 100644 --- a/source/org/jivesoftware/smackx/MultiUserChat.java +++ b/source/org/jivesoftware/smackx/MultiUserChat.java @@ -86,6 +86,19 @@ public class MultiUserChat { private PacketListener declinesListener; private PacketCollector messageCollector; + // Set on every established connection that this client supports the Multi-User Chat protocol. + // This information will be used when another client tries to discover whether this client + // supports MUC or not. + // Note: The ServiceDiscoveryManager class should have been already initialized + static { + XMPPConnection.addConnectionListener(new ConnectionEstablishedListener() { + public void connectionEstablished(XMPPConnection connection) { + ServiceDiscoveryManager.getInstanceFor(connection).addFeature( + "http://jabber.org/protocol/muc"); + } + }); + } + /** * Creates a new multi user chat with the specified connection and room name. Note: no * information is sent to or received from the server until you attempt to @@ -689,6 +702,36 @@ public class MultiUserChat { } } + /** + * Returns the reserved room nickname for the user in the room. A user may have a reserved + * nickname, for example through explicit room registration or database integration. In such + * cases it may be desirable for the user to discover the reserved nickname before attempting + * to enter the room. + * + * @return the reserved room nickname or null if none. + */ + public String getReservedNickname() { + try { + DiscoverInfo result = + ServiceDiscoveryManager.getInstanceFor(connection).discoverInfo( + room, + "x-roomuser-item"); + // Look for the Identity whose category is "client" and return its name + for (Iterator identities = result.getIdentities(); identities.hasNext();) { + DiscoverInfo.Identity identity = (DiscoverInfo.Identity) identities.next(); + if ("client".equals(identity.getCategory())) { + return identity.getName(); + } + } + // If no Identity was found then the user does not have a reserved room nickname + return null; + } + catch (XMPPException e) { + e.printStackTrace(); + return null; + } + } + /** * Returns the nickname that was used to join the room, or null if not * currently joined. @@ -1086,7 +1129,7 @@ public class MultiUserChat { invitationPacketListener = new PacketListener() { public void processPacket(Packet packet) { // Get the MUCUser extension - MUCUser mucUser = + MUCUser mucUser = (MUCUser) packet.getExtension("x", "http://jabber.org/protocol/muc#user"); // Check if the MUCUser extension includes an invitation if (mucUser.getInvite() != null) {