/*
* 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 org.zoolu.sdp.*;
import org.zoolu.tools.Parser;
import com.sesca.misc.Logger;
import java.util.Vector;
/** Class SdpParser extends class Parser for parsing of SDP strings.
*/
class SdpParser extends Parser
{
/** Creates a SdpParser based on String <i>s</i> */
public SdpParser(String s)
{
super(s);
Logger.paranoia("SdpParser.SdpParser: s="+s);
}
/** Creates a SdpParser based on String <i>s</i> and starting from position <i>i</i> */
public SdpParser(String s, int i)
{ super(s,i);
}
/** Returns the SdpField at the current position.
* The SDP value terminates with the end of the String or with the first CR or LF char.
* <p> Returns null if no SdpField is recognized. */
/*public SdpField parseSdpField()
{ Parser par=new Parser(str,index);
while (par.length()>1 && par.charAt(1)!='=') par.goToNextLine();
if (!par.hasMore()) return null;
char type=par.getChar();
par.skipChar();
String value=par.skipChar().getLine();
if (value==null) return null;
index=par.getPos();
// for DEBUG
return new SdpField(type,value);
}*/
/** Returns the first SdpField.
* The SDP value terminates with the end of the String or with the first CR or LF char.
* @return the first SdpField, or null if no SdpField is recognized. */
public SdpField parseSdpField()
{ int begin=index;
while (begin>=0 && begin<str.length()-1 && str.charAt(begin+1)!='=') begin=str.indexOf("\n",begin);
if (begin<0) return null;
char type=str.charAt(begin);
begin+=2;
int end=str.length();
int CR=str.indexOf('\r',begin);
if (CR>0 && CR<end) end=CR;
int LF=str.indexOf('\n',begin);
if (LF>0 && LF<end) end=LF;
String value=str.substring(begin,end).trim();
if (value==null) return null;
setPos(end);
goToNextLine();
// for DEBUG
return new SdpField(type,value);
}
/** Returns the first SdpField of type <i>type</i>.
* The SDP value terminates with the end of the String or with the first CR or LF char.
* @return the first SdpField, or null if no <i>type</i> SdpField is found. */
public SdpField parseSdpField(char type)
{ int begin=0;
if (!str.startsWith(type+"=",index))
{ begin=str.indexOf("\n"+type+"=",index);
//if (begin<0) begin=str.indexOf("\r"+type+"=",index);
if (begin<0)
{ // return null if no type SdpField has been found
return null;
}
index=begin+1;
}
return parseSdpField();
}
/** Returns the first OriginField.
* @return the first OriginField, or null if no OriginField is found. */
public OriginField parseOriginField()
{ SdpField sf=parseSdpField('o');
if (sf!=null) return new OriginField(sf); else return null;
}
/** Returns the first MediaField.
* @return the first MediaField, or null if no MediaField is found. */
public MediaField parseMediaField()
{ SdpField sf=parseSdpField('m');
if (sf!=null) return new MediaField(sf); else return null;
}
/** Returns the first ConnectionField.
* @return the first ConnectionField, or null if no ConnectionField is found. */
public ConnectionField parseConnectionField()
{ SdpField sf=parseSdpField('c');
if (sf!=null) return new ConnectionField(sf); else return null;
}
/** Returns the first SessionNameField.
* @return the first SessionNameField, or null if no SessionNameField is found. */
public SessionNameField parseSessionNameField()
{ SdpField sf=parseSdpField('s');
if (sf!=null) return new SessionNameField(sf); else return null;
}
/** Returns the first TimeField.
* @return the first TimeField, or null if no TimeField is found. */
public TimeField parseTimeField()
{ SdpField sf=parseSdpField('t');
if (sf!=null) return new TimeField(sf); else return null;
}
/** Returns the first AttributeField.
* @return the first AttributeField, or null if no AttributeField is found. */
public AttributeField parseAttributeField()
{ SdpField sf=parseSdpField('a');
if (sf!=null) return new AttributeField(sf); else return null;
}
/** Returns the first MediaDescriptor.
* @return the first MediaDescriptor, or null if no MediaDescriptor is found. */
public MediaDescriptor parseMediaDescriptor()
{ MediaField m=parseMediaField();
if (m==null) return null;
int begin=index;
int end=str.indexOf("\nm",begin);
if (end<0) end=str.length(); else end++;
index=end;
SdpParser par=new SdpParser(str.substring(begin,end));
ConnectionField c=par.parseConnectionField();
Vector av=new Vector();
AttributeField a=par.parseAttributeField();
while (a!=null)
{ av.addElement(a);
a=par.parseAttributeField();
}
return new MediaDescriptor(m,c,av);
}
}