1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Conditions Of Use 3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software was developed by employees of the National Institute of 5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Standards and Technology (NIST), an agency of the Federal Government. 6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Pursuant to title 15 Untied States Code Section 105, works of NIST 7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* employees are not subject to copyright protection in the United States 8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* and are considered to be in the public domain. As a result, a formal 9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* license is not needed to use the software. 10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software is provided by NIST as a service and is expressly 12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED 13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF 14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT 15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* AND DATA ACCURACY. NIST does not warrant or make any representations 16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* regarding the use of the software or the results thereof, including but 17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* not limited to the correctness, accuracy, reliability or usefulness of 18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* the software. 19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Permission to use this software is contingent upon your acceptance 21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* of the terms of this agreement 22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* . 24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* 25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/ 26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/******************************************************************************* 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Product of NIST/ITL Advanced Networking Technologies Division (ANTD). * 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*******************************************************************************/ 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.address; 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *Bug fix contributions 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *Daniel J. Martinez Manzano <dani@dif.um.es> 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *Stefan Marx. 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *pmusgrave@newheights.com (Additions for gruu and outbound drafts) 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *Jeroen van Bemmel ( additions for SCTP transport ) 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.*; 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.*; 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException; 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.PeerUnavailableException; 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.SipFactory; 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.address.SipURI; 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.Header; 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.HeaderFactory; 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Implementation of the SipURI interface. 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.22 $ $Date: 2009/11/15 19:50:45 $ 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class SipUri extends GenericURI implements javax.sip.address.SipURI , SipURIExt{ 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private static final long serialVersionUID = 7749781076218987044L; 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Authority for the uri. 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected Authority authority; 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** uriParms list 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected NameValueList uriParms; 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** qheaders list 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected NameValueList qheaders; 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** telephoneSubscriber field 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected TelephoneNumber telephoneSubscriber; 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public SipUri() { 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.scheme = SIP; 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.uriParms = new NameValueList(); 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.qheaders = new NameValueList(); 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.qheaders.setSeparator("&"); 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Constructor given the scheme. 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The scheme must be either Sip or Sips 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setScheme(String scheme) { 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (scheme.compareToIgnoreCase(SIP) != 0 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang && scheme.compareToIgnoreCase(SIPS) != 0) 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new IllegalArgumentException("bad scheme " + scheme); 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.scheme = scheme.toLowerCase(); 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Get the scheme. 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getScheme() { 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return scheme; 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * clear all URI Parameters. 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since v1.0 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void clearUriParms() { 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms = new NameValueList(); 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *Clear the password from the user part if it exists. 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void clearPassword() { 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.authority != null) { 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang UserInfo userInfo = authority.getUserInfo(); 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (userInfo != null) 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang userInfo.clearPassword(); 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Get the authority. 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Authority getAuthority() { 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.authority; 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Clear all Qheaders. 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void clearQheaders() { 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang qheaders = new NameValueList(); 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Compare two URIs and return true if they are equal. 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param that the object to compare to. 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return true if the object is equal to this object. 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * JvB: Updated to define equality in terms of API methods, according to the rules 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * in RFC3261 section 19.1.4 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Jean Deruelle: Updated to define equality of API methods, according to the rules 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * in RFC3261 section 19.1.4 convert potential ie : 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * %HEX HEX encoding parts of the URI before comparing them 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * transport param added in comparison 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * header equality enforced in comparison 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang @SuppressWarnings("unchecked") 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang @Override 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean equals(Object that) { 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Shortcut for same object 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (that==this) return true; 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (that instanceof SipURI) { 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang final SipURI a = this; 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang final SipURI b = (SipURI) that; 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // A SIP and SIPS URI are never equivalent 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( a.isSecure() ^ b.isSecure() ) return false; 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // For two URIs to be equal, the user, password, host, and port 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // components must match; comparison of userinfo is case-sensitive 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getUser()==null ^ b.getUser()==null) return false; 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getUserPassword()==null ^ b.getUserPassword()==null) return false; 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getUser()!=null && !RFC2396UrlDecoder.decode(a.getUser()).equals(RFC2396UrlDecoder.decode(b.getUser()))) return false; 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getUserPassword()!=null && !RFC2396UrlDecoder.decode(a.getUserPassword()).equals(RFC2396UrlDecoder.decode(b.getUserPassword()))) return false; 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getHost() == null ^ b.getHost() == null) return false; 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getHost() != null && !a.getHost().equalsIgnoreCase(b.getHost())) return false; 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getPort() != b.getPort()) return false; 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // URI parameters 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang for (Iterator i = a.getParameterNames(); i.hasNext();) { 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String pname = (String) i.next(); 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String p1 = a.getParameter(pname); 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String p2 = b.getParameter(pname); 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // those present in both must match (case-insensitive) 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (p1!=null && p2!=null && !RFC2396UrlDecoder.decode(p1).equalsIgnoreCase(RFC2396UrlDecoder.decode(p2))) return false; 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // transport, user, ttl or method must match when present in either 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getTransportParam()==null ^ b.getTransportParam()==null) return false; 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getUserParam()==null ^ b.getUserParam()==null) return false; 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getTTLParam()==-1 ^ b.getTTLParam()==-1) return false; 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getMethodParam()==null ^ b.getMethodParam()==null) return false; 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (a.getMAddrParam()==null ^ b.getMAddrParam()==null) return false; 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Headers: must match according to their definition. 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if(a.getHeaderNames().hasNext() && !b.getHeaderNames().hasNext()) return false; 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if(!a.getHeaderNames().hasNext() && b.getHeaderNames().hasNext()) return false; 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if(a.getHeaderNames().hasNext() && b.getHeaderNames().hasNext()) { 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang HeaderFactory headerFactory = null; 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang headerFactory = SipFactory.getInstance().createHeaderFactory(); 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (PeerUnavailableException e) { 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Debug.logError("Cannot get the header factory to parse the header of the sip uris to compare", e); 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang for (Iterator i = a.getHeaderNames(); i.hasNext();) { 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String hname = (String) i.next(); 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String h1 = a.getHeader(hname); 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String h2 = b.getHeader(hname); 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if(h1 == null && h2 != null) return false; 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if(h2 == null && h1 != null) return false; 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // The following check should not be needed but we add it for findbugs. 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if(h1 == null && h2 == null) continue; 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Header header1 = headerFactory.createHeader(hname, RFC2396UrlDecoder.decode(h1)); 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Header header2 = headerFactory.createHeader(hname, RFC2396UrlDecoder.decode(h2)); 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // those present in both must match according to the equals method of the corresponding header 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!header1.equals(header2)) return false; 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (ParseException e) { 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Debug.logError("Cannot parse one of the header of the sip uris to compare " + a + " " + b, e); 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Finally, we can conclude that they are indeed equal 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return true; 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Construct a URL from the parsed structure. 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return String 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String encode() { 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return encode(new StringBuffer()).toString(); 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public StringBuffer encode(StringBuffer buffer) { 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(scheme).append(COLON); 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (authority != null) 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang authority.encode(buffer); 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!uriParms.isEmpty()) { 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(SEMICOLON); 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.encode(buffer); 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!qheaders.isEmpty()) { 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(QUESTION); 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang qheaders.encode(buffer); 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Return a string representation. 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *@return the String representation of this URI. 259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String toString() { 262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.encode(); 263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * getUser@host 267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return user@host portion of the uri (null if none exists). 268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Peter Musgrave - handle null user 270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getUserAtHost() { 272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String user = ""; 273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (authority.getUserInfo() != null) 274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang user = authority.getUserInfo().getUser(); 275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String host = authority.getHost().encode(); 277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang StringBuffer s = null; 278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (user.equals("")) { 279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang s = new StringBuffer(); 280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang s = new StringBuffer(user).append(AT); 282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return s.append(host).toString(); 284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * getUser@host 288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return user@host portion of the uri (null if none exists). 289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getUserAtHostPort() { 291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String user = ""; 292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (authority.getUserInfo() != null) 293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang user = authority.getUserInfo().getUser(); 294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String host = authority.getHost().encode(); 296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang int port = authority.getPort(); 297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // If port not set assign the default. 298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang StringBuffer s = null; 299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (user.equals("")) { 300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang s = new StringBuffer(); 301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang s = new StringBuffer(user).append(AT); 303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (port != -1) { 305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return s.append(host).append(COLON).append(port).toString(); 306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else 307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return s.append(host).toString(); 308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * get the parameter (do a name lookup) and return null if none exists. 313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param parmname Name of the parameter to get. 314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return Parameter of the given name (null if none exists). 315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Object getParm(String parmname) { 317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Object obj = uriParms.getValue(parmname); 318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return obj; 319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the method parameter. 323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return Method parameter. 324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getMethod() { 326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return (String) getParm(METHOD); 327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Accessor for URI parameters 331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return A name-value list containing the parameters. 332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValueList getParameters() { 334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return uriParms; 335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Remove the URI parameters. 338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeParameters() { 341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.uriParms = new NameValueList(); 342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Accessor forSIPObjects 346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return Get the query headers (that appear after the ? in 347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the URL) 348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValueList getQheaders() { 350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return qheaders; 351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the urse parameter. 355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return User parameter (user= phone or user=ip). 356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getUserType() { 358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return (String) uriParms.getValue(USER); 359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the password of the user. 363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return User password when it embedded as part of the uri 364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * ( a very bad idea). 365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getUserPassword() { 367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (authority == null) 368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return authority.getPassword(); 370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Set the user password. 373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *@param password - password to set. 374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setUserPassword(String password) { 376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.authority == null) 377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.authority = new Authority(); 378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang authority.setPassword(password); 379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns the stucture corresponding to the telephone number 383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided that the user is a telephone subscriber. 384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return TelephoneNumber part of the url (only makes sense 385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * when user = phone is specified) 386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public TelephoneNumber getTelephoneSubscriber() { 388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (telephoneSubscriber == null) { 389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang telephoneSubscriber = new TelephoneNumber(); 391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return telephoneSubscriber; 393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the host and port of the server. 397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return get the host:port part of the url parsed into a 398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * structure. 399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public HostPort getHostPort() { 401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (authority == null || authority.getHost() == null ) 403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else { 405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return authority.getHostPort(); 406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Get the port from the authority field. 410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *@return the port from the authority field. 412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int getPort() { 414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang HostPort hp = this.getHostPort(); 415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (hp == null) 416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return -1; 417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return hp.getPort(); 418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Get the host protion of the URI. 421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the host portion of the url. 422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getHost() { 424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( authority == null) return null; 425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else if (authority.getHost() == null ) return null; 426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else return authority.getHost().encode(); 427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * returns true if the user is a telephone subscriber. 431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * If the host is an Internet telephony 432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * gateway, a telephone-subscriber field MAY be used instead 433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of a user field. The telephone-subscriber field uses the 434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * notation of RFC 2806 [19]. Any characters of the un-escaped 435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * "telephone-subscriber" that are not either in the set 436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * "unreserved" or "user-unreserved" MUST be escaped. The set 437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of characters not reserved in the RFC 2806 description of 438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * telephone-subscriber contains a number of characters in 439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * various syntax elements that need to be escaped when used 440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * in SIP URLs, for example quotation marks (%22), hash (%23), 441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * colon (%3a), at-sign (%40) and the "unwise" characters, 442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * i.e., punctuation of %5b and above. 443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The telephone number is a special case of a user name and 445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * cannot be distinguished by a BNF. Thus, a URL parameter, 446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * user, is added to distinguish telephone numbers from user 447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * names. 448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The user parameter value "phone" indicates that the user 450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * part contains a telephone number. Even without this 451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * parameter, recipients of SIP URLs MAY interpret the pre-@ 452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * part as a telephone number if local restrictions on the 453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return true if the user is a telephone subscriber. 454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean isUserTelephoneSubscriber() { 456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String usrtype = (String) uriParms.getValue(USER); 457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (usrtype == null) 458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return usrtype.equalsIgnoreCase(PHONE); 460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *remove the ttl value from the parameter list if it exists. 464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeTTL() { 466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (uriParms != null) 467600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.delete(TTL); 468600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 469600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 470600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 471600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *Remove the maddr param if it exists. 472600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 473600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeMAddr() { 474600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (uriParms != null) 475600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.delete(MADDR); 476600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 477600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 478600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 479600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *Delete the transport string. 480600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 481600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeTransport() { 482600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (uriParms != null) 483600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.delete(TRANSPORT); 484600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 485600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 486600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Remove a header given its name (provided it exists). 487600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name name of the header to remove. 488600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 489600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeHeader(String name) { 490600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (qheaders != null) 491600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang qheaders.delete(name); 492600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 493600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 494600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Remove all headers. 495600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 496600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeHeaders() { 497600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang qheaders = new NameValueList(); 498600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 499600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 500600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 501600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the user type. 502600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 503600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeUserType() { 504600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (uriParms != null) 505600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.delete(USER); 506600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 507600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 508600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 509600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *remove the port setting. 510600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 511600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removePort() { 512600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang authority.removePort(); 513600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 514600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 515600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 516600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * remove the Method. 517600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 518600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeMethod() { 519600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (uriParms != null) 520600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.delete(METHOD); 521600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 522600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 523600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Sets the user of SipURI. The identifier of a particular resource at 524600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the host being addressed. The user and the user password including the 525600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * "at" sign make up the user-info. 526600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 527600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param uname The new String value of the user. 528600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @throws ParseException which signals that an error has been reached 529600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * unexpectedly while parsing the user value. 530600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 531600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setUser(String uname) { 532600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.authority == null) { 533600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.authority = new Authority(); 534600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 535600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 536600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.authority.setUser(uname); 537600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 538600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 539600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Remove the user. 540600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 541600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeUser() { 542600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.authority.removeUserInfo(); 543600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 544600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 545600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Set the default parameters for this URI. 546600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Do nothing if the parameter is already set to some value. 547600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Otherwise set it to the given value. 548600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name Name of the parameter to set. 549600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param value value of the parameter to set. 550600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 551600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setDefaultParm(String name, Object value) { 552600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (uriParms.getValue(name) == null) { 553600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv = new NameValue(name, value); 554600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.set(nv); 555600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 556600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 557600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 558600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Set the authority member 559600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param authority Authority to set. 560600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 561600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setAuthority(Authority authority) { 562600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.authority = authority; 563600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 564600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 565600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Set the host for this URI. 566600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param h host to set. 567600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 568600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setHost(Host h) { 569600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.authority == null) 570600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.authority = new Authority(); 571600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.authority.setHost(h); 572600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 573600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 574600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Set the uriParms member 575600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param parms URI parameters to set. 576600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 577600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setUriParms(NameValueList parms) { 578600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms = parms; 579600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 580600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 581600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 582600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set a given URI parameter. Note - parameter must be properly 583600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * encoded before the function is called. 584600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name Name of the parameter to set. 585600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param value value of the parameter to set. 586600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 587600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setUriParm(String name, Object value) { 588600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv = new NameValue(name, value); 589600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.set(nv); 590600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 591600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 592600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Set the qheaders member 593600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param parms query headers to set. 594600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 595600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setQheaders(NameValueList parms) { 596600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang qheaders = parms; 597600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 598600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 599600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 600600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the MADDR parameter . 601600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param mAddr Host Name to set 602600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 603600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setMAddr(String mAddr) { 604600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nameValue = uriParms.getNameValue(MADDR); 605600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Host host = new Host(); 606600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang host.setAddress(mAddr); 607600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (nameValue != null) 608600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang nameValue.setValueAsObject(host); 609600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else { 610600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang nameValue = new NameValue(MADDR, host); 611600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.set(nameValue); 612600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 613600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 614600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 615600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Sets the value of the user parameter. The user URI parameter exists to 616600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * distinguish telephone numbers from user names that happen to look like 617600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * telephone numbers. This is equivalent to setParameter("user", user). 618600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 619600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param usertype New value String value of the method parameter 620600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 621600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setUserParam(String usertype) { 622600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.set(USER, usertype); 623600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 624600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 625600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 626600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the Method 627600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param method method parameter 628600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 629600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setMethod(String method) { 630600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.set(METHOD, method); 631600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 632600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 633600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 634600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Sets ISDN subaddress of SipURL 635600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param isdnSubAddress ISDN subaddress 636600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 637600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setIsdnSubAddress(String isdnSubAddress) { 638600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (telephoneSubscriber == null) 639600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang telephoneSubscriber = new TelephoneNumber(); 640600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang telephoneSubscriber.setIsdnSubaddress(isdnSubAddress); 641600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 642600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 643600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 644600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the telephone subscriber field. 645600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param tel Telephone subscriber field to set. 646600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 647600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setTelephoneSubscriber(TelephoneNumber tel) { 648600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang telephoneSubscriber = tel; 649600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 650600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 651600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** set the port to a given value. 652600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param p Port to set. 653600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 654600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setPort(int p) { 655600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (authority == null) 656600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang authority = new Authority(); 657600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang authority.setPort(p); 658600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 659600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 660600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 661600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Boolean to check if a parameter of a given name exists. 662600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name Name of the parameter to check on. 663600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return a boolean indicating whether the parameter exists. 664600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 665600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean hasParameter(String name) { 666600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 667600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return uriParms.getValue(name) != null; 668600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 669600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 670600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 671600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the query header when provided as a name-value pair. 672600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param nameValue qeuery header provided as a name,value pair. 673600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 674600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setQHeader(NameValue nameValue) { 675600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.qheaders.set(nameValue); 676600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 677600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 678600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Set the parameter as given. 679600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *@param nameValue - parameter to set. 680600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 681600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setUriParameter(NameValue nameValue) { 682600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.uriParms.set(nameValue); 683600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 684600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 685600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Return true if the transport parameter is defined. 686600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return true if transport appears as a parameter and false otherwise. 687600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 688600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean hasTransport() { 689600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return hasParameter(TRANSPORT); 690600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 691600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 692600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 693600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Remove a parameter given its name 694600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name -- name of the parameter to remove. 695600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 696600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void removeParameter(String name) { 697600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.delete(name); 698600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 699600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 700600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Set the hostPort field of the imbedded authority field. 701600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *@param hostPort is the hostPort to set. 702600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 703600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setHostPort(HostPort hostPort) { 704600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.authority == null) { 705600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.authority = new Authority(); 706600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 707600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang authority.setHostPort(hostPort); 708600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 709600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 710600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** clone this. 711600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 712600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Object clone() { 713600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang SipUri retval = (SipUri) super.clone(); 714600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.authority != null) 715600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.authority = (Authority) this.authority.clone(); 716600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.uriParms != null) 717600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.uriParms = (NameValueList) this.uriParms.clone(); 718600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.qheaders != null) 719600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.qheaders = (NameValueList) this.qheaders.clone(); 720600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.telephoneSubscriber != null) 721600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.telephoneSubscriber = (TelephoneNumber) this.telephoneSubscriber.clone(); 722600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return retval; 723600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 724600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 725600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 726600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns the value of the named header, or null if it is not set. 727600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * SIP/SIPS URIs may specify headers. As an example, the URI 728600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * sip:joe@jcp.org?priority=urgent has a header "priority" whose 729600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * value is "urgent". 730600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 731600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name name of header to retrieve 732600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the value of specified header 733600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 734600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getHeader(String name) { 735600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.qheaders.getValue(name) != null 736600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ? this.qheaders.getValue(name).toString() 737600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang : null; 738600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 739600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 740600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 741600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 742600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns an Iterator over the names (Strings) of all headers present 743600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * in this SipURI. 744600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 745600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return an Iterator over all the header names 746600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 747600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Iterator<String> getHeaderNames() { 748600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.qheaders.getNames(); 749600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 750600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 751600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 752600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Returns the value of the <code>lr</code> parameter, or null if this 753600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is not set. This is equivalent to getParameter("lr"). 754600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 755600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the value of the <code>lr</code> parameter 756600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 757600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getLrParam() { 758600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang boolean haslr = this.hasParameter(LR); 759600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return haslr ? "true" : null; 760600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 761600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 762600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Returns the value of the <code>maddr</code> parameter, or null if this 763600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is not set. This is equivalent to getParameter("maddr"). 764600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 765600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the value of the <code>maddr</code> parameter 766600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 767600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getMAddrParam() { 768600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue maddr = uriParms.getNameValue(MADDR); 769600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (maddr == null) 770600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 771600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String host = (String) maddr.getValueAsObject(); 772600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return host; 773600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 774600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 775600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 776600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns the value of the <code>method</code> parameter, or null if this 777600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is not set. This is equivalent to getParameter("method"). 778600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 779600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the value of the <code>method</code> parameter 780600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 781600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getMethodParam() { 782600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.getParameter(METHOD); 783600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 784600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 785600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 786600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns the value of the named parameter, or null if it is not set. A 787600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * zero-length String indicates flag parameter. 788600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 789600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name name of parameter to retrieve 790600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the value of specified parameter 791600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 792600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getParameter(String name) { 793600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Object val = uriParms.getValue(name); 794600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (val == null) 795600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 796600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (val instanceof GenericObject) 797600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return ((GenericObject) val).encode(); 798600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 799600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return val.toString(); 800600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 801600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 802600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 803600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns an Iterator over the names (Strings) of all parameters present 804600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 805600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * in this ParametersHeader. 806600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 807600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 808600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 809600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return an Iterator over all the parameter names 810600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 811600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 812600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Iterator<String> getParameterNames() { 813600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.uriParms.getNames(); 814600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 815600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 816600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Returns the value of the "ttl" parameter, or -1 if this is not set. 817600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This method is equivalent to getParameter("ttl"). 818600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 819600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the value of the <code>ttl</code> parameter 820600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 821600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int getTTLParam() { 822600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Integer ttl = (Integer) uriParms.getValue("ttl"); 823600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (ttl != null) 824600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return ttl.intValue(); 825600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 826600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return -1; 827600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 828600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 829600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Returns the value of the "transport" parameter, or null if this is not 830600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * set. This is equivalent to getParameter("transport"). 831600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 832600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the transport paramter of the SipURI 833600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 834600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getTransportParam() { 835600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (uriParms != null) { 836600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return (String) uriParms.getValue(TRANSPORT); 837600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else 838600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 839600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 840600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 841600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Returns the value of the <code>userParam</code>, 842600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *or null if this is not set. 843600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <p> 844600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This is equivalent to getParameter("user"). 845600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 846600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the value of the <code>userParam</code> of the SipURI 847600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 848600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getUser() { 849600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return authority.getUser(); 850600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 851600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 852600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Returns true if this SipURI is secure i.e. if this SipURI represents a 853600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * sips URI. A sip URI returns false. 854600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 855600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return <code>true</code> if this SipURI represents a sips URI, and 856600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * <code>false</code> if it represents a sip URI. 857600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 858600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean isSecure() { 859600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.getScheme().equalsIgnoreCase(SIPS); 860600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 861600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 862600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** This method determines if this is a URI with a scheme of "sip" or "sips". 863600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 864600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return true if the scheme is "sip" or "sips", false otherwise. 865600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 866600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean isSipURI() { 867600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return true; 868600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 869600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 870600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Sets the value of the specified header fields to be included in a 871600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * request constructed from the URI. If the header already had a value it 872600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * will be overwritten. 873600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 874600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name - a String specifying the header name 875600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param value - a String specifying the header value 876600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 877600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setHeader(String name, String value) { 878600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv = new NameValue(name, value); 879600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang qheaders.set(nv); 880600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 881600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 882600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 883600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 884600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the host portion of the SipURI 885600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 886600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param host host to set. 887600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 888600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setHost(String host) throws ParseException { 889600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Host h = new Host(host); 890600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.setHost(h); 891600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 892600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 893600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Sets the value of the <code>lr</code> parameter of this SipURI. The lr 894600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * parameter, when present, indicates that the element responsible for 895600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * this resource implements the routing mechanisms specified in RFC 3261. 896600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This parameter will be used in the URIs proxies place in the 897600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Record-Route header field values, and may appear in the URIs in a 898600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * pre-existing route set. 899600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 900600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setLrParam() { 901600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.uriParms.set("lr",null); // JvB: fixed to not add duplicates 902600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 903600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 904600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 905600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Sets the value of the <code>maddr</code> parameter of this SipURI. The 906600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * maddr parameter indicates the server address to be contacted for this 907600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * user, overriding any address derived from the host field. This is 908600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * equivalent to setParameter("maddr", maddr). 909600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 910600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param maddr New value of the <code>maddr</code> parameter 911600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 912600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setMAddrParam(String maddr) throws ParseException { 913600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (maddr == null) 914600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new NullPointerException("bad maddr"); 915600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang setParameter("maddr", maddr); 916600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 917600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 918600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Sets the value of the <code>method</code> parameter. This specifies 919600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * which SIP method to use in requests directed at this URI. This is 920600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * equivalent to setParameter("method", method). 921600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 922600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param method - new value String value of the method parameter 923600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 924600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setMethodParam(String method) throws ParseException { 925600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang setParameter("method", method); 926600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 927600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 928600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 929600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Sets the value of the specified parameter. If the parameter already had 930600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 931600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * a value it will be overwritten. A zero-length String indicates flag 932600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 933600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * parameter. 934600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 935600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 936600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 937600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param name - a String specifying the parameter name 938600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 939600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param value - a String specifying the parameter value 940600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 941600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @throws ParseException which signals that an error has been reached 942600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 943600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * unexpectedly while parsing the parameter name or value. 944600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 945600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 946600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setParameter(String name, String value) throws ParseException { 947600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (name.equalsIgnoreCase("ttl")) { 948600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang try { 949600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Integer.parseInt(value); 950600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } catch (NumberFormatException ex) { 951600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new ParseException("bad parameter " + value, 0); 952600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 953600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 954600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.set(name,value); 955600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 956600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 957600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Sets the scheme of this URI to sip or sips depending on whether the 958600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * argument is true or false. The default value is false. 959600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 960600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param secure - the boolean value indicating if the SipURI is secure. 961600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 962600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setSecure(boolean secure) { 963600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (secure) 964600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.scheme = SIPS; 965600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 966600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.scheme = SIP; 967600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 968600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 969600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Sets the value of the <code>ttl</code> parameter. The ttl parameter 970600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * specifies the time-to-live value when packets are sent using UDP 971600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * multicast. This is equivalent to setParameter("ttl", ttl). 972600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 973600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param ttl - new value of the <code>ttl</code> parameter 974600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 975600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setTTLParam(int ttl) { 976600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (ttl <= 0) 977600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new IllegalArgumentException("Bad ttl value"); 978600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (uriParms != null) { 979600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv = new NameValue("ttl", Integer.valueOf(ttl)); 980600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.set(nv); 981600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 982600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 983600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 984600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Sets the value of the "transport" parameter. This parameter specifies 985600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * which transport protocol to use for sending requests and responses to 986600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * this entity. The following values are defined: "udp", "tcp", "sctp", 987600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * "tls", but other values may be used also. This method is equivalent to 988600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * setParameter("transport", transport). Transport parameter constants 989600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * are defined in the {@link javax.sip.ListeningPoint}. 990600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 991600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param transport - new value for the "transport" parameter 992600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see javax.sip.ListeningPoint 993600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 994600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setTransportParam(String transport) throws ParseException { 995600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (transport == null) 996600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new NullPointerException("null arg"); 997600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (transport.compareToIgnoreCase("UDP") == 0 998600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang || transport.compareToIgnoreCase("TLS") == 0 999600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang || transport.compareToIgnoreCase("TCP") == 0 1000600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang || transport.compareToIgnoreCase("SCTP") == 0) { 1001600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv = new NameValue(TRANSPORT, transport.toLowerCase()); 1002600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang uriParms.set(nv); 1003600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else 1004600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new ParseException("bad transport " + transport, 0); 1005600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 1006600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1007600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Returns the user part of this SipURI, or null if it is not set. 1008600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 1009600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the user part of this SipURI 1010600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 1011600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getUserParam() { 1012600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return getParameter("user"); 1013600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1014600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 1015600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1016600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** Returns whether the the <code>lr</code> parameter is set. This is 1017600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * equivalent to hasParameter("lr"). This interface has no getLrParam as 1018600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * RFC3261 does not specify any values for the "lr" paramater. 1019600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 1020600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return true if the "lr" parameter is set, false otherwise. 1021600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 1022600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean hasLrParam() { 1023600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return uriParms.getNameValue("lr") != null; 1024600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 1025600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1026600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1027600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 1028600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns whether the <code>gr</code> parameter is set. 1029600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 1030600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Not part on the interface since gruu is not part of the base RFC3261. 1031600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 1032600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean hasGrParam() { 1033600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return uriParms.getNameValue(GRUU) != null; 1034600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 1035600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1036600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 1037600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Sets the <code>gr</code> parameter. 1038600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 1039600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Not part on the interface since gruu is not part of the base RFC3261. 1040600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 1041600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setGrParam(String value) { 1042600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.uriParms.set(GRUU, value); // JvB: fixed to not add duplicates 1043600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 1044600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1045600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 1046600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Sets the <code>gr</code> parameter. 1047600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 1048600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Not part on the interface since gruu is not part of the base RFC3261. 1049600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 1050600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getGrParam() { 1051600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return (String) this.uriParms.getValue(GRUU); // JvB: fixed to not add duplicates 1052600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 1053600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1054600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 1055600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *remove the +sip-instance value from the parameter list if it exists. 1056600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 1057600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 1058600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 1059