/*
* 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.sip.address;
import org.zoolu.sip.provider.SipParser;
import org.zoolu.tools.Parser;
import java.util.Vector;
/**
<P> Class <i>SipURL</i> implements SIP URLs.
<P> A SIP URL is a string of the form of:
<BR><BLOCKQUOTE><PRE>   sip:[user@]hostname[:port][;parameters] </PRE></BLOCKQUOTE>
<P> If <i>port</i> number is ommitted, -1 is returned
*/
public class SipURL {
protected String url;
protected static final String transport_param="transport";
protected static final String maddr_param="maddr";
protected static final String ttl_param="ttl";
protected static final String lr_param="lr";
/** Creates a new SipURL based on a hostname or on a sip url as sip:[user@]hostname[:port][;param1=value1].. */
public SipURL(String sipurl) {
if (sipurl.startsWith("sip:")) url=new String(sipurl);
else url="sip:"+sipurl;
}
/** Creates a new SipURL */
public SipURL(String username, String hostname) {
init(username,hostname,-1);
}
/** Creates a new SipURL */
public SipURL(String hostname, int portnumber) {
init(null, hostname, portnumber);
}
/** Creates a new SipURL */
public SipURL(String username, String hostname, int portnumber) {
init(username,hostname,portnumber);
}
/** Inits the SipURL */
private void init(String username, String hostname, int portnumber) {
StringBuffer sb = new StringBuffer("sip:");
if (username != null) sb.append(username).append('@');
sb.append(hostname);
if (portnumber > 0) sb.append(":" + portnumber);
url = sb.toString();
}
/** Creates and returns a copy of the URL */
public Object clone() {
return new SipURL(url);
}
/** Indicates whether some other Object is "equal to" this URL */
public boolean equals(Object obj) {
SipURL newurl = (SipURL)obj;
return url.toString().equals(newurl.toString());
}
/** Gets user name of SipURL (Returns null if user name does not exist) */
public String getUserName() {
int begin = 4; // skip "sip:"
int end = url.indexOf('@',begin);
if (end < 0) return null;
else return url.substring(begin,end);
}
/** Gets host of SipURL */
public String getHost() {
char[] host_terminators={':',';','?'};
Parser par = new Parser(url);
int begin = par.indexOf('@'); // skip "sip:user@"
if (begin < 0) begin = 4; // skip "sip:"
else begin++; // skip "@"
par.setPos(begin);
int end = par.indexOf(host_terminators);
if (end < 0) return url.substring(begin);
else return url.substring(begin,end);
}
/** Gets port of SipURL; returns -1 if port is not specidfied */
public int getPort() {
char[] port_terminators={';','?'};
Parser par = new Parser(url,4); // skip "sip:"
int begin = par.indexOf(':');
if (begin < 0) return -1;
else {
begin++;
par.setPos(begin);
int end = par.indexOf(port_terminators);
if (end < 0) return Integer.parseInt(url.substring(begin));
else return Integer.parseInt(url.substring(begin,end));
}
}
/** Gets boolean value to indicate if SipURL has user name */
public boolean hasUserName() {
return getUserName() != null;
}
/** Gets boolean value to indicate if SipURL has port */
public boolean hasPort() {
return getPort() >= 0;
}
/** Whether two SipURLs are equals */
public boolean equals(SipURL sip_url) {
return (url == sip_url.url);
}
/** Gets string representation of URL */
public String toString() {
return url;
}
/** Gets the value of specified parameter.
* @return null if parameter does not exist. */
public String getParameter(String name) {
SipParser par = new SipParser(url);
return ((SipParser)par.goTo(';').skipChar()).getParameter(name);
}
/** Gets a String Vector of parameter names.
* @return null if no parameter is present */
public Vector getParameters() {
SipParser par = new SipParser(url);
return ((SipParser)par.goTo(';').skipChar()).getParameters();
}
/** Whether there is the specified parameter */
public boolean hasParameter(String name) {
SipParser par = new SipParser(url);
return ((SipParser)par.goTo(';').skipChar()).hasParameter(name);
}
/** Whether there are any parameters */
public boolean hasParameters() {
if (url != null && url.indexOf(';') >= 0) return true;
else return false;
}
/** Adds a new parameter without a value */
public void addParameter(String name) {
url = url + ";" + name;
}
/** Adds a new parameter with value */
public void addParameter(String name, String value) {
if (value != null) url = url + ";" + name + "=" + value;
else url = url + ";" + name;
}
/** Removes all parameters (if any) */
public void removeParameters() {
int index = url.indexOf(';');
if (index >= 0) url = url.substring(0,index);
}
/** Removes specified parameter (if present) */
public void removeParameter(String name) {
int index = url.indexOf(';');
if (index < 0) return;
Parser par = new Parser(url,index);
while (par.hasMore()) {
int begin_param = par.getPos();
par.skipChar();
if (par.getWord(SipParser.param_separators).equals(name)) {
String top = url.substring(0,begin_param);
par.goToSkippingQuoted(';');
String bottom = "";
if (par.hasMore()) bottom = url.substring(par.getPos());
url = top.concat(bottom);
return;
}
par.goTo(';');
}
}
/** Gets the value of transport parameter.
* @return null if no transport parameter is present. */
public String getTransport() {
return getParameter(transport_param);
}
/** Whether transport parameter is present */
public boolean hasTransport() {
return hasParameter(transport_param);
}
/** Adds transport parameter */
public void addTransport(String proto) {
addParameter(transport_param,proto.toLowerCase());
}
/** Gets the value of maddr parameter.
* @return null if no maddr parameter is present. */
public String getMaddr() {
return getParameter(maddr_param);
}
/** Whether maddr parameter is present */
public boolean hasMaddr() {
return hasParameter(maddr_param);
}
/** Adds maddr parameter */
public void addMaddr(String maddr) {
addParameter(maddr_param,maddr);
}
/** Gets the value of ttl parameter.
* @return 1 if no ttl parameter is present. */
public int getTtl() {
try {
return Integer.parseInt(getParameter(ttl_param));
} catch (Exception e) {
return 1;
}
}
/** Whether ttl parameter is present */
public boolean hasTtl() {
return hasParameter(ttl_param);
}
/** Adds ttl parameter */
public void addTtl(int ttl) {
addParameter(ttl_param,Integer.toString(ttl));
}
/** Whether lr (loose-route) parameter is present */
public boolean hasLr() {
return hasParameter(lr_param);
}
/** Adds lr parameter */
public void addLr() {
addParameter(lr_param);
}
}