/* * 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 net.java.sip.communicator.impl.protocol.jabber.extensions.*; /** * The Jingle "content" element contains the entire description of the session * being initiated. Among other things it contains details such as transport, * or (in the case of RTP) payload type list. * * @author Emil Ivov */ public class ContentPacketExtension extends AbstractPacketExtension { /** * The name of the "content" element. */ public static final String ELEMENT_NAME = "content"; /** * The name of the "creator" argument. */ public static final String CREATOR_ATTR_NAME = "creator"; /** * The name of the "disposition" argument. */ public static final String DISPOSITION_ATTR_NAME = "disposition"; /** * The name of the "name" argument. */ public static final String NAME_ATTR_NAME = "name"; /** * The name of the "senders" argument. */ public static final String SENDERS_ATTR_NAME = "senders"; /** * The values we currently support for the creator field. */ public static enum CreatorEnum { /** * Indicates that content type was originally generated by the session * initiator */ initiator, /** * Indicates that content type was originally generated by the session * addressee */ responder }; /** * The values we currently support for the <tt>senders</tt> field. */ public static enum SendersEnum { /** * Indicates that only the initiator will be generating content */ initiator, /** * Indicates that no one in this session will be generating content */ none, /** * Indicates that only the responder will be generating content */ responder, /** * Indicates that both parties in this session will be generating * content */ both }; /** * Creates a new <tt>ContentPacketExtension</tt>. */ public ContentPacketExtension() { super(null, ELEMENT_NAME); } /** * Creates a new <tt>ContentPacketExtension</tt>. instance with only required * parameters. * * @param creator indicates which party originally generated the content * type * @param disposition indicates how the content definition is to be * interpreted by the recipient * @param name the content type according to the creator * @param senders the parties in the session will be generating content. */ public ContentPacketExtension(CreatorEnum creator, String disposition, String name, SendersEnum senders) { super(null, ELEMENT_NAME); super.setAttribute(CREATOR_ATTR_NAME, creator); super.setAttribute(DISPOSITION_ATTR_NAME, disposition); super.setAttribute(NAME_ATTR_NAME, name); super.setAttribute(SENDERS_ATTR_NAME, senders); } /** * Creates a new <tt>ContentPacketExtension</tt> instance with the specified * parameters. * * @param creator indicates which party originally generated the content * type * interpreted by the recipient * @param name the content type according to the creator */ public ContentPacketExtension(CreatorEnum creator, String name) { super(null, ELEMENT_NAME); super.setAttribute(CREATOR_ATTR_NAME, creator); super.setAttribute(NAME_ATTR_NAME, name); } /** * Returns the value of the creator argument. The creator argument indicates * which party originally generated the content type and is used to prevent * race conditions regarding modifications; the defined values are * "initiator" and "responder" (where the default is "initiator"). The value * of the 'creator' attribute for a given content type MUST always match * the party that originally generated the content type, even for Jingle * actions that are sent by the other party in relation to that content * type (e.g., subsequent content-modify or transport-info messages). The * combination of the 'creator' attribute and the 'name' attribute is * unique among both parties to a Jingle session. * * @return the value of this content's creator argument. */ public CreatorEnum getCreator() { return CreatorEnum.valueOf(getAttributeAsString(CREATOR_ATTR_NAME)); } /** * Sets the value of the creator argument. The creator argument indicates * which party originally generated the content type and is used to prevent * race conditions regarding modifications; the defined values are * "initiator" and "responder" (where the default is "initiator"). The value * of the 'creator' attribute for a given content type MUST always match * the party that originally generated the content type, even for Jingle * actions that are sent by the other party in relation to that content * type (e.g., subsequent content-modify or transport-info messages). The * combination of the 'creator' attribute and the 'name' attribute is * unique among both parties to a Jingle session. * * @param creator the value of this content's creator argument. */ public void setCreator(CreatorEnum creator) { setAttribute(CREATOR_ATTR_NAME, creator); } /** * Returns the value of the disposition argument if it exists or * <tt>null</tt> if it doesn't. The disposition argument indicates how the * content definition is to be interpreted by the recipient. The meaning of * this attribute matches the <tt>"Content-Disposition"</tt> header as * defined in RFC 2183 and applied to SIP by RFC 3261. The value of this * attribute SHOULD be one of the values registered in the IANA Mail * Content Disposition Values and Parameters Registry. The default value of * this attribute is "session". * * @return the value of this content's disposition argument. */ public String getDisposition() { return getAttributeAsString(DISPOSITION_ATTR_NAME); } /** * Sets the value of the disposition argument if it exists or * <tt>null</tt> if it doesn't. The disposition argument indicates how the * content definition is to be interpreted by the recipient. The meaning of * this attribute matches the <tt>"Content-Disposition"</tt> header as * defined in RFC 2183 and applied to SIP by RFC 3261. The value of this * attribute SHOULD be one of the values registered in the IANA Mail * Content Disposition Values and Parameters Registry. The default value of * this attribute is "session". * * @param disposition the value of this content's disposition argument. */ public void setDisposition(String disposition) { setAttribute(DISPOSITION_ATTR_NAME, disposition); } /** * Returns the value of the name argument if it exists or * <tt>null</tt> if it doesn't. The name argument is a unique identifier * for the content type according to the creator, which MAY have meaning to * a human user in order to differentiate this content type from other * content types (e.g., two content types containing video media could * differentiate between "room-pan" and "slides"). If there are two content * types with the same value for the 'name' attribute, they shall understood * as alternative definitions for the same purpose (e.g., a legacy method * and a standards-based method for establishing a voice call), typically * to smooth the transition from an older technology to Jingle. * * @return the value of this content's <tt>name</tt> argument. */ public String getName() { return getAttributeAsString(NAME_ATTR_NAME); } /** * Sets the value of the name argument if it exists or * <tt>null</tt> if it doesn't. The name argument is a unique identifier * for the content type according to the creator, which MAY have meaning to * a human user in order to differentiate this content type from other * content types (e.g., two content types containing video media could * differentiate between "room-pan" and "slides"). If there are two content * types with the same value for the 'name' attribute, they shall understood * as alternative definitions for the same purpose (e.g., a legacy method * and a standards-based method for establishing a voice call), typically * to smooth the transition from an older technology to Jingle. * * @param name the value of this content's <tt>name</tt> argument. */ public void setName(String name) { setAttribute(NAME_ATTR_NAME, name); } /** * Returns the value of the senders argument which indicates the parties * that will be generating content in this session; the allowable values * are defined in the <tt>SendersEnum</tt>. * * @return a {@link SendersEnum} instance indicating the the parties that * will be generating content in this session. */ public SendersEnum getSenders() { Object attributeVal = getAttribute(SENDERS_ATTR_NAME); return attributeVal == null ? null : SendersEnum.valueOf( attributeVal.toString() ); } /** * Sets the value of the senders argument which indicates the parties * that will be generating content in this session; the allowable values * are defined in the <tt>SendersEnum</tt>. * * @param senders a {@link SendersEnum} instance indicating the the parties * that will be generating content in this session. */ public void setSenders(SendersEnum senders) { if (senders == null) senders = SendersEnum.both; setAttribute(SENDERS_ATTR_NAME, senders.toString()); } }