mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-19 05:02:04 +01:00
292 lines
9.7 KiB
Java
292 lines
9.7 KiB
Java
|
/**
|
||
|
* $RCSfile$
|
||
|
* $Revision$
|
||
|
* $Date$
|
||
|
*
|
||
|
* Copyright (C) 2002-2003 Jive Software. All rights reserved.
|
||
|
* ====================================================================
|
||
|
* The Jive Software License (based on Apache Software License, Version 1.1)
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions
|
||
|
* are met:
|
||
|
*
|
||
|
* 1. Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
*
|
||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer in
|
||
|
* the documentation and/or other materials provided with the
|
||
|
* distribution.
|
||
|
*
|
||
|
* 3. The end-user documentation included with the redistribution,
|
||
|
* if any, must include the following acknowledgment:
|
||
|
* "This product includes software developed by
|
||
|
* Jive Software (http://www.jivesoftware.com)."
|
||
|
* Alternately, this acknowledgment may appear in the software itself,
|
||
|
* if and wherever such third-party acknowledgments normally appear.
|
||
|
*
|
||
|
* 4. The names "Smack" and "Jive Software" must not be used to
|
||
|
* endorse or promote products derived from this software without
|
||
|
* prior written permission. For written permission, please
|
||
|
* contact webmaster@jivesoftware.com.
|
||
|
*
|
||
|
* 5. Products derived from this software may not be called "Smack",
|
||
|
* nor may "Smack" appear in their name, without prior written
|
||
|
* permission of Jive Software.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
|
* DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR
|
||
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||
|
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
|
* SUCH DAMAGE.
|
||
|
* ====================================================================
|
||
|
*/
|
||
|
|
||
|
package org.jivesoftware.smackx.packet;
|
||
|
|
||
|
import java.util.*;
|
||
|
|
||
|
import org.jivesoftware.smack.packet.IQ;
|
||
|
|
||
|
/**
|
||
|
* A DiscoverInfo IQ packet, which is used by XMPP clients to request and receive information
|
||
|
* to/from other XMPP entities.<p>
|
||
|
*
|
||
|
* The received information may contain one or more identities of the requested XMPP entity, and
|
||
|
* a list of supported features by the requested XMPP entity.
|
||
|
*
|
||
|
* @author Gaston Dombiak
|
||
|
*/
|
||
|
public class DiscoverInfo extends IQ {
|
||
|
|
||
|
private List features = new ArrayList();
|
||
|
private List identities = new ArrayList();
|
||
|
private String node;
|
||
|
|
||
|
/**
|
||
|
* Adds a new feature to the discovered information.
|
||
|
*
|
||
|
* @param feature the discovered feature
|
||
|
*/
|
||
|
public void addFeature(String feature) {
|
||
|
addFeature(new DiscoverInfo.Feature(feature));
|
||
|
}
|
||
|
|
||
|
private void addFeature(Feature feature) {
|
||
|
synchronized (features) {
|
||
|
features.add(feature);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the discovered features of an XMPP entity.
|
||
|
*
|
||
|
* @return an Iterator on the discovered features of an XMPP entity
|
||
|
*/
|
||
|
Iterator getFeatures() {
|
||
|
synchronized (features) {
|
||
|
return Collections.unmodifiableList(new ArrayList(features)).iterator();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new identity of the requested entity to the discovered information.
|
||
|
*
|
||
|
* @param identity the discovered entity's identity
|
||
|
*/
|
||
|
public void addIdentity(Identity identity) {
|
||
|
synchronized (identities) {
|
||
|
identities.add(identity);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the discovered identities of an XMPP entity.
|
||
|
*
|
||
|
* @return an Iterator on the discoveted identities
|
||
|
*/
|
||
|
public Iterator getIdentities() {
|
||
|
synchronized (identities) {
|
||
|
return Collections.unmodifiableList(new ArrayList(identities)).iterator();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the node attribute that supplements the 'jid' attribute. A node is merely
|
||
|
* something that is associated with a JID and for which the JID can provide information.<p>
|
||
|
*
|
||
|
* Node attributes SHOULD be used only when trying to provide or query information which
|
||
|
* is not directly addressable.
|
||
|
*
|
||
|
* @return the node attribute that supplements the 'jid' attribute
|
||
|
*/
|
||
|
public String getNode() {
|
||
|
return node;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the node attribute that supplements the 'jid' attribute. A node is merely
|
||
|
* something that is associated with a JID and for which the JID can provide information.<p>
|
||
|
*
|
||
|
* Node attributes SHOULD be used only when trying to provide or query information which
|
||
|
* is not directly addressable.
|
||
|
*
|
||
|
* @param node the node attribute that supplements the 'jid' attribute
|
||
|
*/
|
||
|
public void setNode(String node) {
|
||
|
this.node = node;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if the specified feature is part of the discovered information.
|
||
|
*
|
||
|
* @param feature the feature to check
|
||
|
* @return true if the requestes feature has been discovered
|
||
|
*/
|
||
|
public boolean containsFeature(String feature) {
|
||
|
for (Iterator it = getFeatures(); it.hasNext();) {
|
||
|
if (feature.equals(((DiscoverInfo.Feature) it.next()).getVar()))
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public String getChildElementXML() {
|
||
|
StringBuffer buf = new StringBuffer();
|
||
|
buf.append("<query xmlns=\"http://jabber.org/protocol/disco#info\">");
|
||
|
synchronized (identities) {
|
||
|
for (int i = 0; i < identities.size(); i++) {
|
||
|
Identity identity = (Identity) identities.get(i);
|
||
|
buf.append(identity.toXML());
|
||
|
}
|
||
|
}
|
||
|
synchronized (features) {
|
||
|
for (int i = 0; i < features.size(); i++) {
|
||
|
Feature feature = (Feature) features.get(i);
|
||
|
buf.append(feature.toXML());
|
||
|
}
|
||
|
}
|
||
|
buf.append("</query>");
|
||
|
return buf.toString();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Represents the identity of a given XMPP entity. An entity may have many identities but all
|
||
|
* the identities SHOULD have the same name.<p>
|
||
|
*
|
||
|
* Refer to <a href="http://www.jabber.org/registrar/disco-categories.html">Jabber::Registrar</a>
|
||
|
* in order to get the official registry of values for the <i>category</i> and <i>type</i>
|
||
|
* attributes.
|
||
|
*
|
||
|
*/
|
||
|
public static class Identity {
|
||
|
|
||
|
private String category;
|
||
|
private String name;
|
||
|
private String type;
|
||
|
|
||
|
/**
|
||
|
* Creates a new identity for an XMPP entity.
|
||
|
*
|
||
|
* @param category the entity's category.
|
||
|
* @param name the entity's name.
|
||
|
*/
|
||
|
public Identity(String category, String name) {
|
||
|
this.category = category;
|
||
|
this.name = name;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the entity's category. To get the official registry of values for the
|
||
|
* 'category' attribute refer to <a href="http://www.jabber.org/registrar/disco-categories.html">Jabber::Registrar</a>
|
||
|
*
|
||
|
* @return the entity's category.
|
||
|
*/
|
||
|
public String getCategory() {
|
||
|
return category;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the identity's name.
|
||
|
*
|
||
|
* @return the identity's name.
|
||
|
*/
|
||
|
public String getName() {
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the entity's type. To get the official registry of values for the
|
||
|
* 'type' attribute refer to <a href="http://www.jabber.org/registrar/disco-categories.html">Jabber::Registrar</a>
|
||
|
*
|
||
|
* @return the entity's type.
|
||
|
*/
|
||
|
public String getType() {
|
||
|
return type;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the entity's type. To get the official registry of values for the
|
||
|
* 'type' attribute refer to <a href="http://www.jabber.org/registrar/disco-categories.html">Jabber::Registrar</a>
|
||
|
*
|
||
|
* @param name the identity's type.
|
||
|
*/
|
||
|
public void setType(String type) {
|
||
|
this.type = type;
|
||
|
}
|
||
|
|
||
|
public String toXML() {
|
||
|
StringBuffer buf = new StringBuffer();
|
||
|
buf.append("<identity category=\"").append(category).append("\"");
|
||
|
buf.append(" name=\"").append(name).append("\"");
|
||
|
if (type != null) {
|
||
|
buf.append(" type=\"").append(type).append("\"");
|
||
|
}
|
||
|
buf.append("/>");
|
||
|
return buf.toString();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Represents the features offered by the item. This information helps requestors determine
|
||
|
* what actions are possible with regard to this item (registration, search, join, etc.)
|
||
|
* as well as specific feature types of interest, if any (e.g., for the purpose of feature
|
||
|
* negotiation).
|
||
|
*/
|
||
|
public static class Feature {
|
||
|
|
||
|
private String variable;
|
||
|
|
||
|
/**
|
||
|
* Creates a new feature offered by an XMPP entity or item.
|
||
|
*
|
||
|
* @param variable the feature's variable.
|
||
|
*/
|
||
|
public Feature(String variable) {
|
||
|
this.variable = variable;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the feature's variable.
|
||
|
*
|
||
|
* @return the feature's variable.
|
||
|
*/
|
||
|
public String getVar() {
|
||
|
return variable;
|
||
|
}
|
||
|
|
||
|
public String toXML() {
|
||
|
StringBuffer buf = new StringBuffer();
|
||
|
buf.append("<feature var=\"").append(variable).append("\"/>");
|
||
|
return buf.toString();
|
||
|
}
|
||
|
}
|
||
|
}
|