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.header;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.Host;
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.HostPort;
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.NameValue;
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.NameValueList;
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.javax.sip.stack.HopImpl;
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.InvalidArgumentException;
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.address.Hop;
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.ViaHeader;
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException;
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Via SIPHeader (these are strung together in a ViaList).
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see ViaList
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.17 $ $Date: 2009/10/18 13:46:33 $
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan   <br/>
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class Via
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    extends ParametersHeader
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    implements javax.sip.header.ViaHeader, ViaHeaderExt {
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Comment for <code>serialVersionUID</code>
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static final long serialVersionUID = 5281728373401351378L;
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** The branch parameter is included by every forking proxy.
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String BRANCH = ParameterNames.BRANCH;
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** The "received" parameter is added only for receiver-added Via Fields.
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String RECEIVED = ParameterNames.RECEIVED;
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** The "maddr" paramter is designating the multicast address.
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String MADDR = ParameterNames.MADDR;
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** The "TTL" parameter is designating the time-to-live value.
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String TTL = ParameterNames.TTL;
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** The RPORT parameter.
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final String RPORT = ParameterNames.RPORT;
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** sentProtocol field.
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected Protocol sentProtocol;
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** sentBy field.
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected HostPort sentBy;
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * comment field
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * JvB note: RFC3261 does not allow a comment to appear in Via headers, and this
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * is not accessible through the API. Suggest removal
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected String comment;
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
99558dbba05016c7c51306ec93ba9c6a7f21818d71Chung-yih Wang    private boolean rPortFlag = false;
100558dbba05016c7c51306ec93ba9c6a7f21818d71Chung-yih Wang
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Default constructor
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Via() {
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        super(NAME);
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentProtocol = new Protocol();
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean equals(Object other) {
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (other==this) return true;
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (other instanceof ViaHeader) {
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            final ViaHeader o = (ViaHeader) other;
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return getProtocol().equalsIgnoreCase( o.getProtocol() )
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                && getTransport().equalsIgnoreCase( o.getTransport() )
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                && getHost().equalsIgnoreCase( o.getHost() )
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                && getPort() == o.getPort()
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                && equalParameters( o );
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return false;
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the Protocol Version
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return String
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getProtocolVersion() {
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentProtocol == null)
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return null;
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        else
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return sentProtocol.getProtocolVersion();
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Accessor for the sentProtocol field.
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return Protocol field
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Protocol getSentProtocol() {
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sentProtocol;
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Accessor for the sentBy field
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@return SentBy field
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public HostPort getSentBy() {
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sentBy;
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Get the host, port and transport as a Hop. This is
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * useful for the stack to avoid duplication of code.
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Hop getHop() {
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        HopImpl hop = new HopImpl(sentBy.getHost().getHostname(),
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                sentBy.getPort(),sentProtocol.getTransport());
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return hop;
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Accessor for the parameters field
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return parameters field
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public NameValueList getViaParms() {
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return parameters;
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Accessor for the comment field.
172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return comment field.
173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @deprecated RFC 2543 support feature.
174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getComment() {
176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return comment;
177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** port of the Via Header.
182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return true if Port exists.
183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean hasPort() {
185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return (getSentBy()).hasPort();
186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** comment of the Via Header.
189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return false if comment does not exist and true otherwise.
191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean hasComment() {
193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return comment != null;
194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** remove the port.
197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void removePort() {
199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentBy.removePort();
200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** remove the comment field.
203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void removeComment() {
205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        comment = null;
206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** set the Protocol Version
209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param protocolVersion String to set
210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setProtocolVersion(String protocolVersion) {
212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentProtocol == null)
213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sentProtocol = new Protocol();
214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentProtocol.setProtocolVersion(protocolVersion);
215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** set the Host of the Via Header
218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         * @param host String to set
219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         */
220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setHost(Host host) {
221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentBy == null) {
222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sentBy = new HostPort();
223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentBy.setHost(host);
225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the sentProtocol member
229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param s Protocol to set.
230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setSentProtocol(Protocol s) {
232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentProtocol = s;
233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the sentBy member
237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param s HostPort to set.
238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setSentBy(HostPort s) {
240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentBy = s;
241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the comment member
245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param c String to set.
246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @deprecated This is an RFC 2543 feature.
247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setComment(String c) {
249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        comment = c;
250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Encode the body of this header (the stuff that follows headerName).
253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * A.K.A headerValue.
254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected String encodeBody() {
256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return encodeBody(new StringBuffer()).toString();
257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected StringBuffer encodeBody(StringBuffer buffer) {
260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentProtocol.encode(buffer);
261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        buffer.append(SP);
262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentBy.encode(buffer);
263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!parameters.isEmpty()) {
264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            buffer.append(SEMICOLON);
265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            parameters.encode(buffer);
266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (comment != null) {
268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            buffer.append(SP).append(LPAREN).append(comment).append(RPAREN);
269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
270558dbba05016c7c51306ec93ba9c6a7f21818d71Chung-yih Wang        if (rPortFlag) buffer.append(";rport");
271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return buffer;
272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the host part of this ViaHeader to the newly supplied <code>host</code>
276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * parameter.
277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException which signals that an error has been reached
279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * unexpectedly while parsing the host value.
280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setHost(String host) throws ParseException {
282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentBy == null)
283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sentBy = new HostPort();
284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        try {
285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Host h = new Host(host);
286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sentBy.setHost(h);
287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } catch (Exception e) {
288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException(" host parameter is null");
289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    * Returns the host part of this ViaHeader.
294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    *
295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    * @return  the string value of the host
296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getHost() {
298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentBy == null)
299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return null;
300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        else {
301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Host host = sentBy.getHost();
302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (host == null)
303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return null;
304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            else
305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return host.getHostname();
306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the port part of this ViaHeader to the newly supplied <code>port</code>
311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * parameter.
312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param port - the Integer.valueOf value of the port of this ViaHeader
314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setPort(int port) throws InvalidArgumentException {
316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if ( port!=-1 && (port<1 || port>65535)) {
318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new InvalidArgumentException( "Port value out of range -1, [1..65535]" );
319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentBy == null)
322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sentBy = new HostPort();
323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentBy.setPort(port);
324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the RPort flag parameter
328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setRPort(){
330558dbba05016c7c51306ec93ba9c6a7f21818d71Chung-yih Wang        rPortFlag = true;
331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Returns the port part of this ViaHeader.
335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the integer value of the port
337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getPort() {
339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentBy == null)
340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return -1;
341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sentBy.getPort();
342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    * Return the rport parameter.
347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    *
348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    *@return the rport parameter or -1.
349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    */
350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang       public int getRPort() {
351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         String strRport = getParameter(ParameterNames.RPORT);
352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         if (strRport != null && ! strRport.equals(""))
353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return Integer.valueOf(strRport).intValue();
354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         else
355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return -1;
356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         }
357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Returns the value of the transport parameter.
361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the string value of the transport paramter of the ViaHeader
363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getTransport() {
365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentProtocol == null)
366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return null;
367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sentProtocol.getTransport();
368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Sets the value of the transport. This parameter specifies
372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * which transport protocol to use for sending requests and responses to
373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * this entity. The following values are defined: "udp", "tcp", "sctp",
374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * "tls", but other values may be used also.
375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param transport - new value for the transport parameter
377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException which signals that an error has been reached
378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * unexpectedly while parsing the transport value.
379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setTransport(String transport) throws ParseException {
381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (transport == null)
382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException(
383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "JAIN-SIP Exception, "
384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    + "Via, setTransport(), the transport parameter is null.");
385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentProtocol == null)
386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sentProtocol = new Protocol();
387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentProtocol.setTransport(transport);
388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Returns the value of the protocol used.
392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the string value of the protocol paramter of the ViaHeader
394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getProtocol() {
396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentProtocol == null)
397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return null;
398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return sentProtocol.getProtocol();// JvB: Return name ~and~ version
399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Sets the value of the protocol parameter. This parameter specifies
403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * which protocol is used, for example "SIP/2.0".
404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param protocol - new value for the protocol parameter
406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException which signals that an error has been reached
407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * unexpectedly while parsing the protocol value.
408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setProtocol(String protocol) throws ParseException {
410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (protocol == null)
411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException(
412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "JAIN-SIP Exception, "
413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    + "Via, setProtocol(), the protocol parameter is null.");
414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (sentProtocol == null)
416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            sentProtocol = new Protocol();
417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        sentProtocol.setProtocol(protocol);
419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Returns the value of the ttl parameter, or -1 if this is not set.
423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the integer value of the <code>ttl</code> parameter
425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getTTL() {
427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        int ttl = getParameterAsInt(ParameterNames.TTL);
428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return ttl;
429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Sets the value of the ttl parameter. The ttl parameter specifies the
433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * time-to-live value when packets are sent using UDP multicast.
434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param ttl - new value of the ttl parameter
436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws InvalidArgumentException if supplied value is less than zero or
437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * greater than 255, excluding -1 the default not set value.
438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setTTL(int ttl) throws InvalidArgumentException {
440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (ttl < 0 && ttl != -1)
441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new InvalidArgumentException(
442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "JAIN-SIP Exception"
443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    + ", Via, setTTL(), the ttl parameter is < 0");
444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        setParameter(new NameValue(ParameterNames.TTL, Integer.valueOf(ttl)));
445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Returns the value of the <code>maddr</code> parameter, or null if this
449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * is not set.
450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the string value of the maddr parameter
452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getMAddr() {
454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return getParameter(ParameterNames.MADDR);
455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Sets the value of the <code>maddr</code> parameter of this ViaHeader. The
459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * maddr parameter indicates the server address to be contacted for this
460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * user, overriding any address derived from the host field.
461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param  mAddr new value of the <code>maddr</code> parameter
463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException which signals that an error has been reached
464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * unexpectedly while parsing the mAddr value.
465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setMAddr(String mAddr) throws ParseException {
467600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (mAddr == null)
468600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException(
469600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "JAIN-SIP Exception, "
470600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    + "Via, setMAddr(), the mAddr parameter is null.");
471600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
472600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Host host = new Host();
473600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        host.setAddress(mAddr);
474600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        NameValue nameValue = new NameValue(ParameterNames.MADDR, host);
475600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        setParameter(nameValue);
476600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
477600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
478600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
479600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
480600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Gets the received paramater of the ViaHeader. Returns null if received
481600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * does not exist.
482600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
483600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the string received value of ViaHeader
484600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
485600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getReceived() {
486600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return getParameter(ParameterNames.RECEIVED);
487600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
488600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
489600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
490600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Sets the received parameter of ViaHeader.
491600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
492600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param received - the newly supplied received parameter.
493600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException which signals that an error has been reached
494600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * unexpectedly while parsing the received value.
495600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
496600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setReceived(String received) throws ParseException {
497600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (received == null)
498600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException(
499600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "JAIN-SIP Exception, "
500600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    + "Via, setReceived(), the received parameter is null.");
501600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
502600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        setParameter(ParameterNames.RECEIVED, received);
503600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
504600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
505600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
506600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
507600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Gets the branch paramater of the ViaHeader. Returns null if branch
508600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * does not exist.
509600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
510600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the string branch value of ViaHeader
511600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
512600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getBranch() {
513600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return getParameter(ParameterNames.BRANCH);
514600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
515600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
516600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
517600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Sets the branch parameter of the ViaHeader to the newly supplied
518600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * branch value.
519600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
520600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param branch - the new string branch parmameter of the ViaHeader.
521600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @throws ParseException which signals that an error has been reached
522600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * unexpectedly while parsing the branch value.
523600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
524600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setBranch(String branch) throws ParseException {
525600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (branch == null || branch.length()==0)
526600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new NullPointerException(
527600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                "JAIN-SIP Exception, "
528600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    + "Via, setBranch(), the branch parameter is null or length 0.");
529600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
530600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        setParameter(ParameterNames.BRANCH, branch);
531600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
532600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
533600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Object clone() {
534600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Via retval = (Via) super.clone();
535600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this.sentProtocol != null)
536600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.sentProtocol = (Protocol) this.sentProtocol.clone();
537600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this.sentBy != null)
538600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.sentBy = (HostPort) this.sentBy.clone();
539600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if ( this.getRPort() != -1)
540600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.setParameter(RPORT,this.getRPort());
541600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return retval;
542600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
543600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
544600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /*
545600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * (non-Javadoc)
546600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @see gov.nist.javax.sip.header.ViaHeaderExt#getSentByField()
547600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
548600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getSentByField() {
549600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if(sentBy != null)
550600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return sentBy.encode();
551600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return null;
552600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
553600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /*
554600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * (non-Javadoc)
555600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @see gov.nist.javax.sip.header.ViaHeaderExt#getSentProtocolField()
556600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
557600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getSentProtocolField() {
558600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if(sentProtocol != null)
559600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return sentProtocol.encode();
560600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return null;
561600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
562600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
563600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
564