FileDocCategorySizeDatePackage
SdpFactory.javaAPI DocphoneME MR2 API (J2ME)22371Wed May 02 18:00:42 BST 2007gov.nist.javax.sdp

SdpFactory.java

/*
 * Portions Copyright  2000-2007 Sun Microsystems, Inc. All Rights
 * Reserved.  Use is subject to license terms.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
package gov.nist.javax.sdp;

import gov.nist.javax.sdp.fields.*;
import gov.nist.javax.sdp.parser.*;
import java.util.*;
import gov.nist.core.*;

/**
 * The SdpFactory enables applications to encode and decode SDP messages.
 * The SdpFactory can be used to construct a SessionDescription 
 * object programmatically. 
 * The SdpFactory can also be used to construct a 
 * SessionDescription based on the
 * contents of a String.
 * Please refer to IETF RFC 2327 for a description of SDP.
 *
 * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
 *
 * @version 1.0
 *
 */
public class SdpFactory extends Object {
    /** Session description. */
    protected static Vector sessionDescriptionsList;
 
    /** Creates new SdpFactory */
    public SdpFactory() {
	sessionDescriptionsList = new Vector();
    }
 
    /**
     * Obtains an instance of an SdpFactory.
     * <p>
     * This static method returns a factory instance.
     * <p>
     * Once an application has obtained a reference to an SdpFactory it can use
     * the factory to
     * configure and obtain parser instances and to create SDP objects.
     * @throws SdpException if a factory can not be accessed
     * @return a factory instance
     */ 
    public static SdpFactory getInstance()
	throws SdpException {
	return new SdpFactory();
    }
 
    /**
     * Creates a new, empty SessionDescription. The session is set as follows:
     * <pre>
     * v=0
     *
     * o=this.createOrigin ("user",
     * InetAddress.getLocalHost().toString());
     *
     * s=-
     *
     * t=0 0
     * </pre>
     * @throws SdpException  if there is a problem
     * constructing the SessionDescription.
     * @return a new, empty SessionDescription.
     */ 
    public SessionDescriptionImpl createSessionDescription()
	throws SdpException {
	SessionDescriptionImpl 
	    sessionDescriptionImpl = new SessionDescriptionImpl();
 
	ProtoVersionField ProtoVersionField = new ProtoVersionField();
	ProtoVersionField.setVersion(0);
	sessionDescriptionImpl.setVersion(ProtoVersionField);
 
	OriginField originImpl = null;
	originImpl = (OriginField)this.createOrigin("user",
						    "127.0.0.1");
	sessionDescriptionImpl.setOrigin(originImpl);
 
	SessionNameField sessionNameImpl = new SessionNameField();
	sessionNameImpl.setValue("-");
	sessionDescriptionImpl.setSessionName(sessionNameImpl);
 
	TimeDescriptionImpl timeDescriptionImpl = new TimeDescriptionImpl();
	TimeField timeImpl = new TimeField();
	timeImpl.setZero();
	timeDescriptionImpl.setTime(timeImpl);
	Vector times = new Vector();
	times.addElement(timeDescriptionImpl);
	sessionDescriptionImpl.setTimeDescriptions(times);
 
	sessionDescriptionsList.addElement(sessionDescriptionImpl);
	return sessionDescriptionImpl;
    }
 
    /**
     * Creates a SessionDescription populated with the information
     * contained within the string parameter.
     * <p>
     * Note: unknown field types should not cause exceptions.
     * @param s s - the sdp message that is to be parsed.
     * @throws SdpParseException  if there is a
     * problem parsing the String.
     * @return a populated SessionDescription object.
     */ 
    public SessionDescriptionImpl createSessionDescription(String s)
	throws SdpParseException {
	try {
 
	    SDPAnnounceParser sdpParser = new SDPAnnounceParser(s);
	    return sdpParser.parse();
	} catch (ParseException e) {
	    e.printStackTrace();
	    throw new SdpParseException(0, 0, "Could not parse message");
	}
    }
 
    /**
     * Returns Bandwidth object with the specified values.
     * @param modifier  the bandwidth type
     * @param value the bandwidth value measured in kilobits per second
     * @return bandwidth
     */ 
    public BandwidthField createBandwidth(String modifier,
					  int value) {
	BandwidthField bandWidthImpl = new BandwidthField();
	try {
 
	    bandWidthImpl.setType(modifier);
	    bandWidthImpl.setValue(value);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	}
	return bandWidthImpl;
    }
 
    /**
     * Returns Attribute object with the specified values.
     * @param name the name of the attribute
     * @param value the value of the attribute
     * @return the Attribute
     */ 
    public AttributeField createAttribute(String name,
					  String value) {
	AttributeField attributeImpl = new AttributeField();
	try {
 
	    attributeImpl.setName(name);
	    attributeImpl.setValue(value);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	}
	return attributeImpl;
    }
 
    /**
     * Returns Info object with the specified value.
     * @param value the string containing the description.
     * @return Info
     */ 
    public InformationField createInfo(String value) {
	InformationField infoImpl = new InformationField();
	try {
 
	    infoImpl.setValue(value);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	}
	return infoImpl;
    }
 
    /**
     * Returns Phone object with the specified value.
     * @param value the string containing the description.
     * @return Phone
     */ 
    public PhoneField createPhone(String value) {
	PhoneField phoneImpl = new PhoneField();
	try {
 
	    phoneImpl.setValue(value);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	}
	return phoneImpl;
    }
 
    /**
     * Returns EMail object with the specified value.
     * @param value the string containing the description.
     * @return EMail
     */ 
    public EmailField createEMail(String value) {
	EmailField emailImpl = new EmailField();
	try {
 
	    emailImpl.setValue(value);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	}
	return emailImpl;
    }
 
    /**
     * Returns URI object with the specified value.
     * @param value the URL containing the description.
     * @throws SdpException
     * @return URI
     */ 
    public URIField createURI(String value)
	throws SdpException {
	URIField uriImpl = new URIField();
	uriImpl.setURI(value);
	return uriImpl;
 
    }
 
    /**
     * Returns SessionName object with the specified name.
     * @param name the string containing the name of the session.
     * @return SessionName
     */ 
    public SessionNameField createSessionName(String name) {
	SessionNameField sessionNameImpl = new SessionNameField();
	try {
 
	    sessionNameImpl.setValue(name);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	}
	return sessionNameImpl;
    }
 
    /**
     * Returns Key object with the specified value.
     * @param method the string containing the method type.
     * @param key the key to set
     * @return Key
     */ 
    public KeyField createKey(String method,
			      String key) {
	KeyField keyImpl = new KeyField();
	try {
 
	    keyImpl.setMethod(method);
	    keyImpl.setKey(key);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	    return null;
	}
	return keyImpl;
    }
 
    /**
     * Returns Version object with the specified values.
     * @param value the version number.
     * @return Version
     */ 
    public ProtoVersionField createVersion(int value) {
	ProtoVersionField protoVersionField = new ProtoVersionField();
	try {
 
	    protoVersionField.setVersion(value);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	    return null;
	}
	return protoVersionField;
    }
 
    /**
     * Returns Media object with the specified properties.
     * @param media the media type, eg "audio"
     * @param port port number on which to receive media
     * @param numPorts number of ports used for this media stream
     * @param transport transport type, eg "RTP/AVP"
     * @param staticRtpAvpTypes vector to set
     * @throws SdpException
     * @return Media
     */ 
    public MediaField createMedia(String media,
				  int port,
				  int numPorts,
				  String transport,
				  Vector staticRtpAvpTypes)
	throws SdpException {
	MediaField mediaImpl = new MediaField();
	mediaImpl.setMediaType(media);
	mediaImpl.setMediaPort(port);
	mediaImpl.setPortCount(numPorts);
	mediaImpl.setProtocol(transport);
	mediaImpl.setMediaFormats(staticRtpAvpTypes);
	return mediaImpl;
    }
 
    /**
     * Returns Origin object with the specified properties.
     * @param userName the user name.
     * @param address the IP4 encoded address.
     * @throws SdpException if the parameters are null
     * @return Origin
     */ 
    public OriginField createOrigin(String userName,
				    String address)
	throws SdpException {
	OriginField originImpl = new OriginField();
	originImpl.setUsername(userName);
	originImpl.setAddress(address);
	// need revisit - originImpl.setNetworkType(SDPKeywords.IN);
	originImpl.setAddressType(SDPKeywords.IPV4);
	return originImpl;
    }
 
    /**
     * Returns Origin object with the specified properties.
     * @param userName String containing the user that created the
     * string.
     * @param sessionId long containing the session identifier.
     * @param sessionVersion long containing the session version.
     * @param networkType String network type for the origin (usually
     * "IN").
     * @param addrType String address type (usually "IP4").
     * @param address String IP address usually the address of the
     * host.
     * @throws SdpException if the parameters are null
     * @return Origin object with the specified properties.
     */ 
    public OriginField createOrigin(String userName,
				    long sessionId,
				    long sessionVersion,
				    String networkType,
				    String addrType,
				    String address)
	throws SdpException {
	OriginField originImpl = new OriginField();
	originImpl.setUsername(userName);
	originImpl.setAddress(address);
	originImpl.setSessionId(sessionId);
	originImpl.setSessionVersion(sessionVersion);
	originImpl.setAddressType(addrType);
	originImpl.setNetworkType(networkType);
	return originImpl; 
    }
 
    /**
     * Returns MediaDescription object with the specified properties.
     * The returned object will respond to
     * Media.getMediaFormats(boolean) with a Vector of media formats.
     * @param media media -
     * @param port port number on which to receive media
     * @param numPorts number of ports used for this media stream
     * @param transport transport type, eg "RTP/AVP"
     * @param staticRtpAvpTypes list of static RTP/AVP media payload
     * types which should be specified by the
     * returned MediaDescription throws IllegalArgumentException if passed
     * an invalid RTP/AVP payload type
     * @throws IllegalArgumentException
     * @throws SdpException
     * @return MediaDescription
     */ 
    public MediaDescriptionImpl createMediaDescription(String media,
						       int port,
						       int numPorts,
						       String transport,
						       int[] staticRtpAvpTypes)
	throws IllegalArgumentException,
	       SdpException {
	MediaDescriptionImpl 
	    mediaDescriptionImpl = new MediaDescriptionImpl();
	MediaField mediaImpl = new MediaField();
	mediaImpl.setMediaType(media);
	mediaImpl.setMediaPort(port);
	mediaImpl.setPortCount(numPorts);
	mediaImpl.setProtocol(transport);
	mediaDescriptionImpl.setMedia(mediaImpl);
	return mediaDescriptionImpl; 
    }
 
    /**
     * Returns MediaDescription object with the specified properties.
     * The returned object will respond to
     * Media.getMediaFormats(boolean) with a Vector of String objects
     * specified by the 'formats argument.
     * @param media the media type, eg "audio"
     * @param port port number on which to receive media
     * @param numPorts number of ports used for this media stream
     * @param transport transport type, eg "RTP/AVP"
     * @param formats list of formats which should be specified by the
     * returned MediaDescription
     * @return MediaDescription
     */ 
    public MediaDescriptionImpl createMediaDescription(String media,
						       int port,
						       int numPorts,
						       String transport,
						       String[] formats) {
	MediaDescriptionImpl mediaDescriptionImpl = new MediaDescriptionImpl();
	try {
 
	    MediaField mediaImpl = new MediaField();
	    mediaImpl.setMediaType(media);
	    mediaImpl.setMediaPort(port);
	    mediaImpl.setPortCount(numPorts);
	    mediaImpl.setProtocol(transport);
 
	    Vector formatsV = new Vector(formats.length);
	    for (int i = 0; i < formats.length; i++)
		formatsV.addElement(formats[i]);
	    mediaImpl.setMediaFormats(formatsV);
	    mediaDescriptionImpl.setMedia(mediaImpl);
	} catch (SdpException s) {
	    s.printStackTrace();
	}
	return mediaDescriptionImpl; 
    }
 
    /**
     * Returns TimeDescription object with the specified properties.
     * @param t the Time that the time description applies to. Returns
     * TimeDescription object with the specified properties.
     * @throws SdpException
     * @return TimeDescription
     */ 
    public TimeDescriptionImpl createTimeDescription(TimeField t)
	throws SdpException {
	TimeDescriptionImpl timeDescriptionImpl = new TimeDescriptionImpl();
	timeDescriptionImpl.setTime(t);
	return timeDescriptionImpl; 
    }
 
    /**
     * Returns TimeDescription unbounded (i.e. "t=0 0");
     * @throws SdpException
     * @return TimeDescription unbounded (i.e. "t=0 0");
     */ 
    public TimeDescriptionImpl createTimeDescription()
	throws SdpException {
	TimeDescriptionImpl timeDescriptionImpl = new TimeDescriptionImpl();
	TimeField timeImpl = new TimeField();
	timeImpl.setZero();
	timeDescriptionImpl.setTime(timeImpl);
	return timeDescriptionImpl; 
    }
 
    /**
     * Returns TimeDescription object with the specified properties.
     * @param start start time.
     * @param stop stop time.
     * @throws SdpException if the parameters are null
     * @return TimeDescription
     */ 
    public TimeDescriptionImpl createTimeDescription(Date start,
						     Date stop)
	throws SdpException {
	TimeDescriptionImpl timeDescriptionImpl = new TimeDescriptionImpl();
	TimeField timeImpl = new TimeField();
	timeImpl.setStart(start);
	timeImpl.setStop(stop);
	timeDescriptionImpl.setTime(timeImpl);
	return timeDescriptionImpl; 
    }
    /**
     * Returns a String containing the computed form for a
     * multi-connection address. 
     * @param addr connection address
     * @param ttl time to live (TTL) for multicast
     * addresses
     * @param numAddrs number of addresses used by the
     * connection 
     * @return  computed form for a multi-connection address.
     */
    public String formatMulticastAddress(String addr,
					 int ttl,
					 int numAddrs) {
	String res = addr + "/" + ttl + "/"+numAddrs; 
	return res;
    }
 
    /**
     * Returns a Connection object with the specified properties a
     * @param netType network type, eg "IN" for "Internet"
     * @param addrType address type, eg "IP4" for IPv4 type addresses
     * @param addr connection address
     * @param ttl time to live (TTL) for multicast addresses
     * @param numAddrs number of addresses used by the connection
     * @return Connection
     */ 
    public ConnectionField createConnection(String netType,
					    String addrType,
					    String addr,
					    int ttl,
					    int numAddrs)throws SdpException {
	ConnectionField connectionImpl = new ConnectionField(); 
 
	connectionImpl.setNetworkType(netType);
	connectionImpl.setAddressType(addrType);
	connectionImpl.setAddress(addr);
 
	return connectionImpl;
    }
 
    /**
     * Returns a Connection object with the specified properties and no
     * TTL and a default number of addresses (1).
     * @param netType network type, eg "IN" for "Internet"
     * @param addrType address type, eg "IP4" for IPv4 type addresses
     * @param addr connection address
     * @throws SdpException if the parameters are null
     * @return Connection
     */ 
    public ConnectionField createConnection(String netType,
					    String addrType,
					    String addr)
	throws SdpException {
	ConnectionField connectionImpl = new ConnectionField();
 
	connectionImpl.setNetworkType(netType);
	connectionImpl.setAddressType(addrType);
	connectionImpl.setAddress(addr);
 
	return connectionImpl;
    }
 
    /**
     * Returns a Connection object with the specified properties and a
     * network and address type of "IN" and "IP4" respectively.
     * @param addr connection address
     * @param ttl time to live (TTL) for multicast addresses
     * @param numAddrs number of addresses used by the connection
     * @return Connection
     */ 
    public ConnectionField createConnection(String addr,
					    int ttl,
					    int numAddrs) throws SdpException {
	ConnectionField connectionImpl = new ConnectionField(); 
 
	connectionImpl.setAddress(addr);
 
	return connectionImpl;
    }
 
    /**
     * Returns a Connection object with the specified address. This is
     * equivalent to
     *
     * createConnection("IN", "IP4", addr);
     *
     * @param addr connection address
     * @throws SdpException if the parameter is null
     * @return Connection
     */ 
    public ConnectionField createConnection(String addr)
	throws SdpException {
 
	return createConnection("IN", " IPV4", addr);
 
    }
 
    /**
     * Returns a Time specification with the specified start and stop
     * times.
     * @param start start time
     * @param stop stop time
     * @throws SdpException if the parameters are null
     * @return a Time specification with the specified start and stop
     * times.
     */ 
    public TimeField createTime(Date start,
				Date stop)
	throws SdpException {
	TimeField timeImpl = new TimeField();
	timeImpl.setStart(start);
	timeImpl.setStop(stop);
	return timeImpl;
    }
 
    /**
     * Returns an unbounded Time specification (i.e., "t=0 0").
     * @throws SdpException
     * @return an unbounded Time specification (i.e., "t=0 0").
     */ 
    public TimeField createTime()
	throws SdpException {
	TimeField timeImpl = new TimeField();
	timeImpl.setZero();
	return timeImpl;
    }
 
    /**
     * Returns a RepeatTime object with the specified interval,
     * duration, and time offsets.
     * @param repeatInterval the "repeat interval" in seconds
     * @param activeDuration the "active duration" in seconds
     * @param offsets the list of offsets relative to the start time of
     * the Time object with which the returned RepeatTime will be
     * associated
     * @return RepeatTime
     */ 
    public RepeatField createRepeatTime(int repeatInterval,
					int activeDuration,
					int[] offsets) {
	RepeatField repeatTimeField = new RepeatField();
	try {
 
	    repeatTimeField.setRepeatInterval(repeatInterval);
	    repeatTimeField.setActiveDuration(activeDuration);
	    repeatTimeField.setOffsetArray(offsets);
 
	}
	catch (SdpException s) {
	    s.printStackTrace();
	} 
	return repeatTimeField;
    }
 
    /**
     * Constructs a timezone adjustment record.
     * @param d the Date at which the adjustment is going to take
     * place.
     * @param offset the adjustment in number of seconds relative to
     * the start time of the SessionDescription with which this
     * object is associated.
     * @return TimeZoneAdjustment
     */ 
    public ZoneField createTimeZoneAdjustment(Date d,
					      int offset) {
	ZoneField timeZoneAdjustmentImpl = new ZoneField();
	try {
 
	    Hashtable map = new Hashtable();
	    map.put(d, new Integer(offset));
	    timeZoneAdjustmentImpl.setZoneAdjustments(map);
	}
	catch (SdpException s) {
	    s.printStackTrace();
	} 
	return timeZoneAdjustmentImpl;
    }
 
 
    /**
     * Returns a collection of Strings containing session description.
     * @param source String containing session descriptions.
     * @return a collection of Strings containing session descriptions.
     */ 
    public static Vector findSessions(String source) {
	return sessionDescriptionsList;
    }
 
    /**
     * Converts a NTP to regular date value. 
     * @param ntpTime long to set
     * @return Returns a Date object for a given NTP date value.
     */ 
    public static Date getDateFromNtp(long ntpTime) {
	return new Date((ntpTime - SdpConstants.NTP_CONST) * 1000);
    }
 
    /**
     * Returns a long containing the NTP value for a given Java Date.
     * @param d Date to set
     * @return long
     */ 
    public static long getNtpTime(Date d) throws SdpParseException {
	if (d == null)
	    return -1;
	return ((d.getTime()/1000) + SdpConstants.NTP_CONST);
    }
    /*
    public static void main(String[] args) 
	throws SdpParseException, SdpException {
	String sdpFields = "v=0\r\n"+
	    "o=phone 1057165447541 1057165447541 IN IP4 123.4.566.156\r\n"+
	    "s=-\r\n" +
	    "c=IN IP4 123.4.566.156\r\n"+
	    "t=0 0\r\n" +
	    "m=data 3011 tcp OSA\r\n";

	SdpFactory sdpFactory = new SdpFactory();
	SessionDescriptionImpl sessionDescription = 
	    sdpFactory.createSessionDescription(sdpFields);
 
	System.out.println("sessionDescription = " + sessionDescription);
	Vector mediaDescriptions = 
	    sessionDescription.getMediaDescriptions(false);
	for (int i = 0; i < mediaDescriptions.size(); i++) {
	    MediaDescriptionImpl m = (MediaDescriptionImpl) 
		mediaDescriptions.elementAt(i);
	    System.out.println("m = " + m.toString());
	    MediaField media = m.getMedia();
	    Vector formats = media.getMediaFormats(false);
	    System.out.println("formats = " + formats);
	}
    }
    */
 
}