/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.impl.protocol.jabber.extensions;
import net.java.sip.communicator.service.protocol.*;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smack.provider.*;
import org.jivesoftware.smack.util.*;
import org.xmlpull.v1.*;
import java.util.*;
/**
* A <tt>PacketExtension</tt> that represents a <tt>ConferenceDescription</tt>
* object in XML.
*
* @author Boris Grozev
*/
public class ConferenceDescriptionPacketExtension
extends AbstractPacketExtension
{
/**
* The namespace for the XML element.
*/
public static final String NAMESPACE = "http://jitsi.org/protocol/condesc";
/**
* The name of the "conference" XML element.
*/
public static final String ELEMENT_NAME = "conference";
/**
* The name of the "transport" element.
*/
public static final String TRANSPORT_ELEM_NAME = "transport";
/**
* The name of the "uri" attribute.
*/
public static final String URI_ATTR_NAME = "uri";
/**
* The name of the "password" attribute.
*/
public static final String PASSWORD_ATTR_NAME = "auth";
/**
* The name of the "callid" attribute.
*/
public static final String CALLID_ATTR_NAME = "callid";
/**
* The name of the "callid" element.
*/
public static final String CALLID_ELEM_NAME = "callid";
/**
* The name of the "available" attribute.
*/
public static final String AVAILABLE_ATTR_NAME = "available";
/**
* The name of the conference name attribute.
*/
public static final String CONFERENCE_NAME_ATTR_NAME = "conference_name";
/**
* Creates a new instance without any attributes or children.
*/
public ConferenceDescriptionPacketExtension()
{
this(null, null, null);
}
/**
* Creates a new instance and sets the "uri" attribute.
*
* @param uri the value to use for the "uri" attribute.
*/
public ConferenceDescriptionPacketExtension(String uri)
{
this(uri, null, null);
}
/**
* Creates a new instance and sets the "uri" and "callid" attributes.
*
* @param uri the value to use for the "uri" attribute.
* @param callId the value to use for the "callid" attribute.
*/
public ConferenceDescriptionPacketExtension(String uri, String callId)
{
this(uri, callId, null);
}
/**
* Creates a new instance and sets the "uri", "callid" and "password"
* attributes.
*
* @param uri the value to use for the "uri" attribute.
* @param callId the value to use for the "callid" attribute.
* @param password the value to use for the "auth" attribute.
*/
public ConferenceDescriptionPacketExtension(
String uri, String callId, String password)
{
super(NAMESPACE, ELEMENT_NAME);
if(uri != null)
setUri(uri);
if(callId != null)
setCallId(callId);
if(password != null)
setAuth(password);
}
/**
* Creates a new instance which represents <tt>ca</tt>.
* @param cd the <tt>ConferenceDescription</tt> which to represent in the
* new instance.
*/
public ConferenceDescriptionPacketExtension(ConferenceDescription cd)
{
this(cd.getUri(), cd.getCallId(), cd.getPassword());
setAvailable(cd.isAvailable());
if(cd.getDisplayName() != null)
setName(cd.getDisplayName());
Set<String> transports = cd.getSupportedTransports();
for(String transport : transports)
{
addChildExtension(new TransportPacketExtension(transport));
}
}
/**
* Gets the value of the "uri" attribute.
* @return the value of the "uri" attribute.
*/
public String getUri()
{
return getAttributeAsString(URI_ATTR_NAME);
}
/**
* Gets the value of the "callid" attribute.
* @return the value of the "callid" attribute.
*/
public String getCallId()
{
return getAttributeAsString(CALLID_ATTR_NAME);
}
/**
* Gets the value of the "password" attribute.
* @return the value of the "password" attribute.
*/
public String getPassword()
{
return getAttributeAsString(PASSWORD_ATTR_NAME);
}
/**
* Sets the value of the "uri" attribute.
* @param uri the value to set
*/
public void setUri(String uri)
{
setAttribute(URI_ATTR_NAME, StringUtils.escapeForXML(uri));
}
/**
* Sets the value of the "callid" attribute.
* @param callId the value to set
*/
public void setCallId(String callId)
{
setAttribute(CALLID_ATTR_NAME, callId);
}
/**
* Sets the value of the "password" attribute.
* @param password the value to set
*/
public void setAuth(String password)
{
setAttribute(PASSWORD_ATTR_NAME, password);
}
/**
* Sets the value of the "available" attribute.
* @param available the value to set
*/
public void setAvailable(boolean available)
{
setAttribute(AVAILABLE_ATTR_NAME, available);
}
/**
* Sets the value of the "available" attribute.
* @param available the value to set
*/
public void setName(String name)
{
setAttribute(CONFERENCE_NAME_ATTR_NAME, StringUtils.escapeForXML(name));
}
/**
* Gets the value of the "available" attribute.
*/
public boolean isAvailable()
{
return Boolean.parseBoolean(getAttributeAsString(AVAILABLE_ATTR_NAME));
}
/**
* Adds a "transport" child element with the given value.
*
* @param transport the transport to add.
*/
public void addTransport(String transport)
{
addChildExtension(new TransportPacketExtension(transport));
}
/**
* Creates a <tt>ConferenceDescription</tt> corresponding to this
* <tt>ConferenceDescriptionPacketExtension</tt>
* @return a <tt>ConferenceDescription</tt> corresponding to this
* <tt>ConferenceDescriptionPacketExtension</tt>
*/
public ConferenceDescription toConferenceDescription()
{
ConferenceDescription conferenceDescription
= new ConferenceDescription(getUri(), getCallId(), getPassword());
conferenceDescription.setAvailable(isAvailable());
conferenceDescription.setDisplayName(getName());
for (TransportPacketExtension t
: getChildExtensionsOfType(TransportPacketExtension.class))
{
conferenceDescription.addTransport(t.getNamespace());
}
return conferenceDescription;
}
/**
* Returns the value of the <tt>CONFERENCE_NAME_ATTR_NAME</tt> attribute.
* @return the name of the conference.
*/
private String getName()
{
return getAttributeAsString(CONFERENCE_NAME_ATTR_NAME);
}
/**
* A <tt>PacketExtension</tt> that represents a "transport" child element.
*/
public static class TransportPacketExtension
extends AbstractPacketExtension
{
/**
* Creates a new instance and sets the XML namespace to
* <tt>transport</tt>
*
* @param namespace the XML namespace of the "transport" element.
*/
public TransportPacketExtension(String namespace)
{
super(namespace, TRANSPORT_ELEM_NAME);
}
}
/**
* Parses elements with the <tt>NAMESPACE</tt> namespace.
*/
public static class Provider
implements PacketExtensionProvider
{
/**
* Creates a <tt>ConferenceDescriptionPacketExtension</tt> by parsing
* an XML document.
* @param parser the parser to use.
* @return the created <tt>ConferenceDescriptionPacketExtension</tt>.
* @throws Exception
*/
@Override
public PacketExtension parseExtension(XmlPullParser parser)
throws Exception
{
ConferenceDescriptionPacketExtension packetExtension
= new ConferenceDescriptionPacketExtension();
//first, set all attributes
int attrCount = parser.getAttributeCount();
for (int i = 0; i < attrCount; i++)
{
packetExtension.setAttribute(
parser.getAttributeName(i),
parser.getAttributeValue(i));
}
//now parse the sub elements
boolean done = false;
String elementName;
TransportPacketExtension transportExt = null;
while (!done)
{
switch (parser.next())
{
case XmlPullParser.START_TAG:
{
elementName = parser.getName();
if (TRANSPORT_ELEM_NAME.equals(elementName))
{
String transportNs = parser.getNamespace();
if (transportNs != null)
{
transportExt
= new TransportPacketExtension(transportNs);
}
}
break;
}
case XmlPullParser.END_TAG:
{
elementName = parser.getName();
if (ELEMENT_NAME.equals(elementName))
{
done = true;
}
else if (TRANSPORT_ELEM_NAME.equals(elementName))
{
if (transportExt != null)
{
packetExtension.addChildExtension(transportExt);
}
}
break;
}
}
}
return packetExtension;
}
}
}