1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software.
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.muc;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.Form;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.FormField;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.DiscoverInfo;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Iterator;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Represents the room information that was discovered using Service Discovery. It's possible to
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * obtain information about a room before joining the room but only for rooms that are public (i.e.
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * rooms that may be discovered).
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class RoomInfo {
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * JID of the room. The node of the JID is commonly used as the ID of the room or name.
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String room;
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Description of the room.
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String description = "";
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Last known subject of the room.
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String subject = "";
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Current number of occupants in the room.
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private int occupantsCount = -1;
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * A room is considered members-only if an invitation is required in order to enter the room.
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Any user that is not a member of the room won't be able to join the room unless the user
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * decides to register with the room (thus becoming a member).
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private boolean membersOnly;
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Moderated rooms enable only participants to speak. Users that join the room and aren't
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * participants can't speak (they are just visitors).
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private boolean moderated;
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Every presence packet can include the JID of every occupant unless the owner deactives this
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * configuration.
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private boolean nonanonymous;
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Indicates if users must supply a password to join the room.
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private boolean passwordProtected;
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Persistent rooms are saved to the database to make sure that rooms configurations can be
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * restored in case the server goes down.
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private boolean persistent;
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    RoomInfo(DiscoverInfo info) {
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        super();
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.room = info.getFrom();
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Get the information based on the discovered features
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.membersOnly = info.containsFeature("muc_membersonly");
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.moderated = info.containsFeature("muc_moderated");
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.nonanonymous = info.containsFeature("muc_nonanonymous");
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.passwordProtected = info.containsFeature("muc_passwordprotected");
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.persistent = info.containsFeature("muc_persistent");
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Get the information based on the discovered extended information
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        Form form = Form.getFormFrom(info);
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (form != null) {
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            FormField descField = form.getField("muc#roominfo_description");
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.description = ( descField == null || !(descField.getValues().hasNext()) )? "" : descField.getValues().next();
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            FormField subjField = form.getField("muc#roominfo_subject");
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.subject = ( subjField == null || !(subjField.getValues().hasNext()) ) ? "" : subjField.getValues().next();
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            FormField occCountField = form.getField("muc#roominfo_occupants");
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.occupantsCount = occCountField == null ? -1 : Integer.parseInt(occCountField.getValues()
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    .next());
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the JID of the room whose information was discovered.
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the JID of the room whose information was discovered.
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getRoom() {
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return room;
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the discovered description of the room.
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the discovered description of the room.
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getDescription() {
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return description;
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the discovered subject of the room. The subject may be empty if the room does not
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * have a subject.
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the discovered subject of the room.
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getSubject() {
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return subject;
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the discovered number of occupants that are currently in the room. If this
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * information was not discovered (i.e. the server didn't send it) then a value of -1 will be
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * returned.
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the number of occupants that are currently in the room or -1 if that information was
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * not provided by the server.
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public int getOccupantsCount() {
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return occupantsCount;
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns true if the room has restricted the access so that only members may enter the room.
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return true if the room has restricted the access so that only members may enter the room.
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isMembersOnly() {
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return membersOnly;
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns true if the room enabled only participants to speak. Occupants with a role of
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * visitor won't be able to speak in the room.
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return true if the room enabled only participants to speak.
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isModerated() {
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return moderated;
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns true if presence packets will include the JID of every occupant.
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return true if presence packets will include the JID of every occupant.
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isNonanonymous() {
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return nonanonymous;
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns true if users musy provide a valid password in order to join the room.
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return true if users musy provide a valid password in order to join the room.
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isPasswordProtected() {
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return passwordProtected;
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns true if the room will persist after the last occupant have left the room.
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return true if the room will persist after the last occupant have left the room.
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public boolean isPersistent() {
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return persistent;
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
191