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