/** * $RCSfile$ * $Revision$ * $Date$ * * Copyright 2003-2007 Jive Software. * * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.smack.packet; import org.jivesoftware.smack.util.StringUtils; /** * Represents XMPP presence packets. Every presence packet has a type, which is one of * the following values: *
* * A number of attributes are optional: *
*
* Presence packets are used for two purposes. First, to notify the server of our
* the clients current presence status. Second, they are used to subscribe and
* unsubscribe users from the roster.
*
* @see RosterPacket
* @author Matt Tucker
*/
public class Presence extends Packet {
private Type type = Type.available;
private String status = null;
private int priority = Integer.MIN_VALUE;
private Mode mode = null;
private String language;
/**
* Creates a new presence update. Status, priority, and mode are left un-set.
*
* @param type the type.
*/
public Presence(Type type) {
setType(type);
}
/**
* Creates a new presence update with a specified status, priority, and mode.
*
* @param type the type.
* @param status a text message describing the presence update.
* @param priority the priority of this presence update.
* @param mode the mode type for this presence update.
*/
public Presence(Type type, String status, int priority, Mode mode) {
setType(type);
setStatus(status);
setPriority(priority);
setMode(mode);
}
/**
* Returns true if the {@link Type presence type} is available (online) and
* false if the user is unavailable (offline), or if this is a presence packet
* involved in a subscription operation. This is a convenience method
* equivalent to getType() == Presence.Type.available. Note that even
* when the user is available, their presence mode may be {@link Mode#away away},
* {@link Mode#xa extended away} or {@link Mode#dnd do not disturb}. Use
* {@link #isAway()} to determine if the user is away.
*
* @return true if the presence type is available.
*/
public boolean isAvailable() {
return type == Type.available;
}
/**
* Returns true if the presence type is {@link Type#available available} and the presence
* mode is {@link Mode#away away}, {@link Mode#xa extended away}, or
* {@link Mode#dnd do not disturb}. False will be returned when the type or mode
* is any other value, including when the presence type is unavailable (offline).
* This is a convenience method equivalent to
* type == Type.available && (mode == Mode.away || mode == Mode.xa || mode == Mode.dnd).
*
* @return true if the presence type is available and the presence mode is away, xa, or dnd.
*/
public boolean isAway() {
return type == Type.available && (mode == Mode.away || mode == Mode.xa || mode == Mode.dnd);
}
/**
* Returns the type of this presence packet.
*
* @return the type of the presence packet.
*/
public Type getType() {
return type;
}
/**
* Sets the type of the presence packet.
*
* @param type the type of the presence packet.
*/
public void setType(Type type) {
if(type == null) {
throw new NullPointerException("Type cannot be null");
}
this.type = type;
}
/**
* Returns the status message of the presence update, or null if there
* is not a status. The status is free-form text describing a user's presence
* (i.e., "gone to lunch").
*
* @return the status message.
*/
public String getStatus() {
return status;
}
/**
* Sets the status message of the presence update. The status is free-form text
* describing a user's presence (i.e., "gone to lunch").
*
* @param status the status message.
*/
public void setStatus(String status) {
this.status = status;
}
/**
* Returns the priority of the presence, or Integer.MIN_VALUE if no priority has been set.
*
* @return the priority.
*/
public int getPriority() {
return priority;
}
/**
* Sets the priority of the presence. The valid range is -128 through 128.
*
* @param priority the priority of the presence.
* @throws IllegalArgumentException if the priority is outside the valid range.
*/
public void setPriority(int priority) {
if (priority < -128 || priority > 128) {
throw new IllegalArgumentException("Priority value " + priority +
" is not valid. Valid range is -128 through 128.");
}
this.priority = priority;
}
/**
* Returns the mode of the presence update, or null if the mode is not set.
* A null presence mode value is interpreted to be the same thing as
* {@link Presence.Mode#available}.
*
* @return the mode.
*/
public Mode getMode() {
return mode;
}
/**
* Sets the mode of the presence update. A null presence mode value is interpreted
* to be the same thing as {@link Presence.Mode#available}.
*
* @param mode the mode.
*/
public void setMode(Mode mode) {
this.mode = mode;
}
/**
* Returns the xml:lang of this Presence, or null if one has not been set.
*
* @return the xml:lang of this Presence, or null if one has not been set.
* @since 3.0.2
*/
private String getLanguage() {
return language;
}
/**
* Sets the xml:lang of this Presence.
*
* @param language the xml:lang of this Presence.
* @since 3.0.2
*/
public void setLanguage(String language) {
this.language = language;
}
public String toXML() {
StringBuilder buf = new StringBuilder();
buf.append("