/*
* 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.jingle;
import java.util.*;
import net.java.sip.communicator.impl.protocol.jabber.extensions.*;
import org.jivesoftware.smack.packet.*;
/**
* Represents the content <tt>description</tt> elements described in XEP-0167.
*
* @author Emil Ivov
*/
public class RtpDescriptionPacketExtension
extends AbstractPacketExtension
{
/**
* The name space for RTP description elements.
*/
public static final String NAMESPACE = "urn:xmpp:jingle:apps:rtp:1";
/**
* The name of the "description" element.
*/
public static final String ELEMENT_NAME = "description";
/**
* The name of the <tt>media</tt> description argument.
*/
public static final String MEDIA_ATTR_NAME = "media";
/**
* The name of the <tt>ssrc</tt> description argument.
*/
public static final String SSRC_ATTR_NAME = "ssrc";
/**
* The list of payload types that this description element contains.
*/
private final List<PayloadTypePacketExtension> payloadTypes
= new ArrayList<PayloadTypePacketExtension>();
/**
* An optional encryption element that contains encryption parameters for
* this session.
*/
private EncryptionPacketExtension encryption;
/**
* An optional bandwidth element that specifies the allowable or preferred
* bandwidth for use by this application type.
*/
private BandwidthPacketExtension bandwidth;
/**
* A <tt>List</tt> of the optional <tt>extmap</tt> elements that allow
* negotiating RTP extension headers as per RFC 5282.
*/
private List<RTPHdrExtPacketExtension> extmapList
= new ArrayList<RTPHdrExtPacketExtension>();
/**
* The combined list of all child elements that this extension contains.
*/
private List<PacketExtension> children;
/**
* Creates a new <tt>RtpDescriptionPacketExtension</tt>.
*/
public RtpDescriptionPacketExtension()
{
super(NAMESPACE, ELEMENT_NAME);
}
/**
* Create a new <tt>RtpDescriptionPacketExtension</tt> with a different
* namespace.
*
* @param namespace namespace to use
*/
public RtpDescriptionPacketExtension(String namespace)
{
super(namespace, ELEMENT_NAME);
}
/**
* Specifies the media type for the stream that this description element
* represents, such as "audio" or "video".
*
* @param media the media type for the stream that this element represents
* such as "audio" or "video".
*/
public void setMedia(String media)
{
super.setAttribute(MEDIA_ATTR_NAME, media);
}
/**
* Returns the media type for the stream that this description element
* represents, such as "audio" or "video".
*
* @return the media type for the stream that this description element
* represents, such as "audio" or "video".
*/
public String getMedia()
{
return getAttributeAsString(MEDIA_ATTR_NAME);
}
/**
* Sets the synchronization source ID (SSRC as per RFC 3550) that the stream
* represented by this description element will be using.
*
* @param ssrc the SSRC ID that the RTP stream represented here will be
* using.
*/
public void setSsrc(String ssrc)
{
super.setAttribute(SSRC_ATTR_NAME, ssrc);
}
/**
* Returns the synchronization source ID (SSRC as per RFC 3550) that the
* stream represented by this description element will be using.
*
* @return the synchronization source ID (SSRC as per RFC 3550) that the
* stream represented by this description element will be using.
*/
public String getSsrc()
{
return getAttributeAsString(SSRC_ATTR_NAME);
}
/**
* Adds a new payload type to this description element.
*
* @param payloadType the new payload to add.
*/
public void addPayloadType(PayloadTypePacketExtension payloadType)
{
this.payloadTypes.add(payloadType);
}
/**
* Returns a <b>reference</b> to the list of payload types that we have
* registered with this description so far.
*
* @return a <b>reference</b> to the list of payload types that we have
* registered with this description so far.
*/
public List<PayloadTypePacketExtension> getPayloadTypes()
{
return payloadTypes;
}
/**
* Returns all child elements that we currently have in this packet.
*
* @return the {@link List} of child elements currently registered with
* this packet.
*/
@Override
public List<? extends PacketExtension> getChildExtensions()
{
if(children == null)
children = new ArrayList<PacketExtension>();
else
children.clear();
//payload types
children.addAll(payloadTypes);
//encryption element
if (encryption != null)
children.add(encryption);
//bandwidth element
if (bandwidth != null)
children.add(bandwidth);
//extmap elements
if (extmapList != null)
children.addAll(extmapList);
children.addAll(super.getChildExtensions());
return children;
}
/**
* Casts <tt>childExtension</tt> to one of the extensions allowed here and
* sets the corresponding field.
*
* @param childExtension the extension we'd like to add here.
*/
@Override
public void addChildExtension(PacketExtension childExtension)
{
if(childExtension instanceof PayloadTypePacketExtension)
this.addPayloadType((PayloadTypePacketExtension)childExtension);
else if (childExtension instanceof EncryptionPacketExtension)
this.setEncryption((EncryptionPacketExtension)childExtension);
else if (childExtension instanceof BandwidthPacketExtension)
this.setBandwidth((BandwidthPacketExtension)childExtension);
else if (childExtension instanceof RTPHdrExtPacketExtension)
this.addExtmap((RTPHdrExtPacketExtension)childExtension);
else
super.addChildExtension(childExtension);
}
/**
* Sets the optional encryption element that contains encryption parameters
* for this session.
*
* @param encryption the encryption {@link PacketExtension} we'd like to add
* to this packet.
*/
public void setEncryption(EncryptionPacketExtension encryption)
{
this.encryption = encryption;
}
/**
* Returns the optional encryption element that contains encryption
* parameters for this session.
*
* @return the encryption {@link PacketExtension} added to this packet or
* <tt>null</tt> if none has been set yet.
*/
public EncryptionPacketExtension getEncryption()
{
return encryption;
}
/**
* Sets an optional bandwidth element that specifies the allowable or
* preferred bandwidth for use by this application type.
*
* @param bandwidth the max/preferred bandwidth indication that we'd like
* to add to this packet.
*/
public void setBandwidth(BandwidthPacketExtension bandwidth)
{
this.bandwidth = bandwidth;
}
/**
* Returns an optional bandwidth element that specifies the allowable or
* preferred bandwidth for use by this application type.
*
* @return the max/preferred bandwidth set for this session or <tt>null</tt>
* if none has been set yet.
*/
public BandwidthPacketExtension getBandwidth()
{
return bandwidth;
}
/**
* Adds an optional <tt>extmap</tt> element that allows negotiation RTP
* extension headers as per RFC 5282.
*
* @param extmap an optional <tt>extmap</tt> element that allows negotiation
* RTP extension headers as per RFC 5282.
*/
public void addExtmap(RTPHdrExtPacketExtension extmap)
{
this.extmapList.add(extmap);
}
/**
* Returns a <tt>List</tt> of the optional <tt>extmap</tt> elements that
* allow negotiating RTP extension headers as per RFC 5282.
*
* @return a <tt>List</tt> of the optional <tt>extmap</tt> elements that
* allow negotiating RTP extension headers as per RFC 5282.
*/
public List<RTPHdrExtPacketExtension> getExtmapList()
{
return extmapList;
}
}