/* * Copyright (C) 2005 Luca Veltri - University of Parma - Italy * * This file is part of MjSip (http://www.mjsip.org) * * MjSip is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MjSip 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 for more details. * * You should have received a copy of the GNU General Public License * along with MjSip; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author(s): * Luca Veltri (luca.veltri@unipr.it) */ package org.zoolu.sdp; import java.util.Vector; //PersonalJava //import java.util.HashSet; //import java.util.Iterator; /** Class SessionDescriptor handles SIP message bodys formatted according to * the Session Description Protocol (SDP). * <p> A session description consists of a session-level description * (details that apply to the whole session and all media streams) and * zero or more media-level descriptions (details that apply onto * to a single media stream). * <p> The session-level part starts with a * `v=' line and continues to the first media-level section. The media * description starts with an `m=' line and continues to the next media * description or end of the whole session description. In general, * session-level values are the default for all media unless overridden * by an equivalent media-level value. * <p> In the current implementation, the session-level description consists * of the v, o, s, c, and t SDP fields (lines). */ public class SessionDescriptor { /** Version filed. */ SdpField v; /** Origin filed. */ OriginField o; /** Session-name filed. */ SessionNameField s; /** Connection filed. */ ConnectionField c; /** Time filed. */ TimeField t; /** Vector of session attributes (as Vector of SdpFields). */ Vector<AttributeField> av; /** Vector of MediaDescriptors. */ Vector<MediaDescriptor> media; /*private void init(String owner, String session, String connection, String time) { v=new SdpField('v',"0"); o=new SdpField('o',owner); s=new SdpField('s',session); c=new SdpField('c',connection); t=new SdpField('t',time); media=new HashSet(); }*/ /** Inits the SessionDescriptor. */ private void init(OriginField origin, SessionNameField session, ConnectionField connection, TimeField time) { v=new SdpField('v',"0"); o=origin; s=session; c=connection; t=time; av=new Vector<AttributeField>(); media=new Vector<MediaDescriptor>(); } /** Creates a new SessionDescriptor. * @param sd the SessionDescriptor clone */ public SessionDescriptor(SessionDescriptor sd) { init(new OriginField(sd.o),new SessionNameField(sd.s),new ConnectionField(sd.c),new TimeField(sd.t)); for (int i=0; i<sd.media.size(); i++) media.addElement(new MediaDescriptor((MediaDescriptor)sd.media.elementAt(i))); } /** Creates a new SessionDescriptor specifing o, s, c, and t fields. * @param origin the OriginField * @param session the SessionNameField * @param connection the ConnectionField * @param time the TimeField */ public SessionDescriptor(OriginField origin, SessionNameField session, ConnectionField connection, TimeField time) { init(origin,session,connection,time); } /** Creates a new SessionDescriptor specifing o, s, c, and t fields. * @param origin the origin value * @param session the session value * @param connection the connection value * @param time the time value */ public SessionDescriptor(String origin, String session, String connection, String time) { init(new OriginField(origin),new SessionNameField(session),new ConnectionField(connection),new TimeField(time)); } /** Creates a new SessionDescriptor. * <p> with: * <br>o=<i>owner</i> * <br>s=Session SIP/SDP * <br>c=IP4 <i>address</i> * <br>t=0 0 * <p> if <i>address</i>==null, '127.0.0.1' is used * <br>if <i>owner</i>==null, 'user@'<i>address</i> is used * @param owner the owner * @param address the IPv4 address */ public SessionDescriptor(String owner, String address) { if (address==null) address="127.0.0.1"; if (owner==null) owner="user@"+address; init(new OriginField(owner,"0","0",address),new SessionNameField("Session SIP/SDP"),new ConnectionField("IP4",address),new TimeField()); } /** Creates a default SessionDescriptor. * <p> o=user@127.0.0.1 * s=Session SIP/SDP * c=127.0.0.1 * t=0 0 */ public SessionDescriptor() { String address="127.0.0.1"; String owner="user@"+address; init(new OriginField(owner,"0","0",address),new SessionNameField("Session SIP/SDP"),new ConnectionField("IP4",address),new TimeField()); } /** Creates a new SessionDescriptor from String <i>sdp</i> * @param sdp the entire SDP */ public SessionDescriptor(String sdp) { SdpParser par=new SdpParser(sdp); // parse mandatory fields v=par.parseSdpField('v'); if (v==null) v=new SdpField('v',"0"); o=par.parseOriginField(); if (o==null) o=new OriginField("unknown"); s=par.parseSessionNameField(); if (s==null) s=new SessionNameField(); c=par.parseConnectionField(); if (c==null) c=new ConnectionField("IP4","0.0.0.0"); t=par.parseTimeField(); if (t==null) t=new TimeField(); while (par.hasMore() && (!par.startsWith("a=") && !par.startsWith("m="))) { // skip unknown lines.. par.goToNextLine(); } // parse session attributes av=new Vector<AttributeField>(); while (par.hasMore() && par.startsWith("a=")) { AttributeField attribute=par.parseAttributeField(); av.addElement(attribute); } // parse media descriptors media=new Vector<MediaDescriptor>(); MediaDescriptor md; while ((md=par.parseMediaDescriptor())!=null) { addMediaDescriptor(md); } } /** Sets the origin 'o' field. * @param origin the OriginField * @return this SessionDescriptor */ public SessionDescriptor setOrigin(OriginField origin) { o=origin; return this; } /** Gets the origin 'o' field */ public OriginField getOrigin() { //System.out.println("DEBUG: inside SessionDescriptor.getOwner(): sdp=\n"+toString()); return o; } /** Sets the session-name 's' field. * @param session the SessionNameField * @return this SessionDescriptor */ public SessionDescriptor setSessionName(SessionNameField session) { s=session; return this; } /** Gets the session-name 's' field */ public SessionNameField getSessionName() { return s; } /** Sets the connection-information 'c' field. * @param connection the ConnectionField * @return this SessionDescriptor */ public SessionDescriptor setConnection(ConnectionField connection) { c=connection; return this; } /** Gets the connection-information 'c' field */ public ConnectionField getConnection() { return c; } /** Sets the time 't' field. * @param time the TimeField * @return this SessionDescriptor */ public SessionDescriptor setTime(TimeField time) { t=time; return this; } /** Gets the time 't' field */ public TimeField getTime() { return t; } /** Adds a new attribute for a particular media * @param media the MediaField * @param attribute an AttributeField * @return this SessionDescriptor */ public SessionDescriptor addMedia(MediaField media, AttributeField attribute) { //printlog("DEBUG: media: "+media,5); //printlog("DEBUG: attribute: "+attribute,5); addMediaDescriptor(new MediaDescriptor(media,null,attribute)); return this; } /** Adds a new media. * @param media the MediaField * @param attributes Vector of AttributeField * @return this SessionDescriptor */ public SessionDescriptor addMedia(MediaField media, Vector attributes) { //printlog("DEBUG: media: "+media,5); //printlog("DEBUG: attribute: "+attributes,5); addMediaDescriptor(new MediaDescriptor(media,null,attributes)); return this; } /** Adds a new MediaDescriptor * @param media_desc a MediaDescriptor * @return this SessionDescriptor */ public SessionDescriptor addMediaDescriptor(MediaDescriptor media_desc) { //printlog("DEBUG: media desc: "+media_desc,5); media.addElement(media_desc); return this; } /** Adds a Vector of MediaDescriptors * @param media_descs Vector if MediaDescriptor * @return this SessionDescriptor */ public SessionDescriptor addMediaDescriptors(Vector<MediaDescriptor> media_descs) { //media.addAll(media_descs); // not supported by J2ME.. for (int i=0; i<media_descs.size(); i++) media.addElement(media_descs.elementAt(i)); return this; } /** Gets all MediaDescriptors */ public Vector getMediaDescriptors() { return media; } /** Removes all MediaDescriptors */ public SessionDescriptor removeMediaDescriptor(String media_type) { for (int i=media.size()-1; i>=0; i--) if (((MediaDescriptor)media.elementAt(i)).getMedia().getMedia().equals(media_type)) media.removeElementAt(i); return this; } /** Removes all MediaDescriptors */ public SessionDescriptor removeMediaDescriptors() { //media.clear(); // not supported by J2ME.. media.setSize(0); return this; } /** Gets the first MediaDescriptor of a particular media. * @param media_type the media type * @return the MediaDescriptor */ public MediaDescriptor getMediaDescriptor(String media_type) { for (int i=0; i<media.size(); i++) { MediaDescriptor md=(MediaDescriptor)media.elementAt(i); if (md.getMedia().getMedia().equals(media_type)) return md; } return null; } /** Adds a Vector of session attributes. * @param attribute_fields Vector of AttributeFields * @return this SessionDescriptor */ public SessionDescriptor addAttributes(Vector attribute_fields) { for (int i=0; i<attribute_fields.size(); i++) addAttribute((AttributeField)attribute_fields.elementAt(i)); return this; } /** Adds a new attribute * @param attribute the new AttributeField * @return this MediaDescriptor */ public SessionDescriptor addAttribute(AttributeField attribute) { av.addElement(new AttributeField(attribute)); return this; } /** Removes all session attributes. */ public SessionDescriptor removeAttributes() { av.setSize(0); return this; } /** Gets a Vector of attribute values. * @return a Vector of AttributeField */ public Vector<AttributeField> getAttributes() { Vector<AttributeField> _v=new Vector<AttributeField>(av.size()); for (int i=0; i<av.size(); i++) _v.addElement(av.elementAt(i)); return _v; } /** Whether it has a particular attribute * @param a_name the attribute name * @return true if found, otherwise returns null */ public boolean hasAttribute(String attribute_name) { for (int i=0; i<av.size(); i++) { if (((AttributeField)av.elementAt(i)).getAttributeName().equals(attribute_name)) return true; } return false; } /** Gets the first AttributeField of a particular attribute name. * @param attribute_name the attribute name * @return the AttributeField, or null if not found */ public AttributeField getAttribute(String attribute_name) { for (int i=0; i<media.size(); i++) { AttributeField af=(AttributeField)av.elementAt(i); if (af.getAttributeName().equals(attribute_name)) return af; } return null; } /** Gets a Vector of attribute values of a particular attribute name. * @param a_name the attribute name * @return a Vector of AttributeField */ public Vector<AttributeField> getAttributes(String attribute_name) { Vector<AttributeField> _v=new Vector<AttributeField>(av.size()); for (int i=0; i<av.size(); i++) { AttributeField a=(AttributeField)av.elementAt(i); if (a.getAttributeName().equals(attribute_name)) _v.addElement(a); } return _v; } /** Gets a String rapresentation */ @Override public String toString() { //String str=v.toString()+o.toString()+s.toString(); StringBuffer sb=new StringBuffer(); if (v!=null) sb.append(v.toString()); if (o!=null) sb.append(o.toString()); if (s!=null) sb.append(s.toString()); if (c!=null) sb.append(c.toString()); if (t!=null) sb.append(t.toString()); for (int i=0; i<av.size(); i++) sb.append(((AttributeField)av.elementAt(i)).toString()); for (int i=0; i<media.size(); i++) sb.append(((MediaDescriptor)media.elementAt(i)).toString()); return sb.toString(); } }