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