/*
* File Name : MgcpMessageParser.java
*
* The JAIN MGCP API implementaion.
*
* The source code contained in this file is in in the public domain.
* It can be used in any project or product without prior permission,
* license or royalty payments. There is NO WARRANTY OF ANY KIND,
* EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION,
* THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
* AND DATA ACCURACY. We do not warrant or make any representations
* regarding the use of the software or the results thereof, including
* but not limited to the correctness, accuracy, reliability or
* usefulness of the software.
*/
package org.mobicents.mgcp.stack.parser;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.StringReader;
import java.text.ParseException;
import org.apache.log4j.Logger;
/**
* Provides processing of the MGCP message.
*
* @author Oleg Kulikov
* @author Pavel Mitrenko
*/
public class MgcpMessageParser {
private MgcpContentHandler contentHandler;
private static final Logger logger = Logger.getLogger(MgcpMessageParser.class);
/** Creates a new instance of MgcpMessageParser */
public MgcpMessageParser(MgcpContentHandler contentHandler) {
if (contentHandler == null) {
throw new IllegalArgumentException("Content handler cannot be null");
}
this.contentHandler = contentHandler;
}
public void parse(String message) throws IOException, ParseException {
StringReader stringReader = new StringReader(message);
BufferedReader reader = new BufferedReader(stringReader);
String header = reader.readLine();
// if (logger.isDebugEnabled()) {
// logger.debug("Read header: " + header);
// }
contentHandler.header(header);
boolean sdpPresent = false;
String line = null;
while ((line = reader.readLine()) != null) {
line = line.trim();
// if (logger.isDebugEnabled()) {
// logger.debug("Read line: " + line);
// }
sdpPresent = line.length() == 0;
if (sdpPresent) break;
int pos = line.indexOf(':');
if (pos < 0) {
logger.warn("Unrecognized parameter: " + line);
continue;
}
String parmName = line.substring(0, pos).trim();
String parmValue = line.substring(pos + 1).trim();
contentHandler.param(parmName, parmValue);
}
boolean hasMore = false;
String ss = null;
try {
ss = reader.readLine();
} catch (IOException e) {
}
hasMore = ss != null;
if (sdpPresent || hasMore) {
String sdp = ss + "\n";
while ((line = reader.readLine()) != null) {
sdp = sdp + line.trim() + "\r\n";
}
if (logger.isDebugEnabled()) {
logger.debug("Read session description: " + sdp);
}
contentHandler.sessionDescription(sdp);
}
}
}