1 /*
2 * Conditions Of Use
3 *
4 * This software was developed by employees of the National Institute of
5 * Standards and Technology (NIST), an agency of the Federal Government.
6 * Pursuant to title 15 Untied States Code Section 105, works of NIST
7 * employees are not subject to copyright protection in the United States
8 * and are considered to be in the public domain.  As a result, a formal
9 * license is not needed to use the software.
10 *
11 * This software is provided by NIST as a service and is expressly
12 * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13 * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15 * AND DATA ACCURACY.  NIST does not warrant or make any representations
16 * regarding the use of the software or the results thereof, including but
17 * not limited to the correctness, accuracy, reliability or usefulness of
18 * the software.
19 *
20 * Permission to use this software is contingent upon your acceptance
21 * of the terms of this agreement
22 *
23 * .
24 *
25 */
26 /******************************************************************************
27  * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).      *
28  ******************************************************************************/
29 package gov.nist.javax.sip.header;
30 
31 import gov.nist.javax.sip.message.SIPRequest;
32 
33 import javax.sip.InvalidArgumentException;
34 import javax.sip.header.CSeqHeader;
35 import java.text.ParseException;
36 
37 /**
38  *  CSeq SIP Header.
39  *
40  * @author M. Ranganathan    <br/>
41  * @version 1.2 $Revision: 1.10 $ $Date: 2009/10/18 13:46:33 $
42  * @since 1.1
43  *
44  */
45 
46 public class CSeq extends SIPHeader implements javax.sip.header.CSeqHeader {
47 
48     /**
49      * Comment for <code>serialVersionUID</code>
50      */
51     private static final long serialVersionUID = -5405798080040422910L;
52 
53     /**
54      * seqno field
55      */
56     protected Long seqno;
57 
58     /**
59      * method field
60      */
61     protected String method;
62 
63     /**
64      * Constructor.
65      */
CSeq()66     public CSeq() {
67         super(CSEQ);
68     }
69 
70     /**
71      * Constructor given the sequence number and method.
72      *
73      * @param seqno is the sequence number to assign.
74      * @param method is the method string.
75      */
CSeq(long seqno, String method)76     public CSeq(long seqno, String method) {
77         this();
78         this.seqno = Long.valueOf(seqno);
79         this.method = SIPRequest.getCannonicalName(method);
80     }
81 
82     /**
83      * Compare two cseq headers for equality.
84      * @param other Object to compare against.
85      * @return true if the two cseq headers are equals, false
86      * otherwise.
87      */
equals(Object other)88     public boolean equals(Object other) {
89 
90         if (other instanceof CSeqHeader) {
91             final CSeqHeader o = (CSeqHeader) other;
92             return this.getSeqNumber() == o.getSeqNumber()
93                 && this.getMethod().equals( o.getMethod() );
94         }
95         return false;
96     }
97 
98     /**
99      * Return canonical encoded header.
100      * @return String with canonical encoded header.
101      */
encode()102     public String encode() {
103         return headerName + COLON + SP + encodeBody() + NEWLINE;
104     }
105 
106     /**
107      * Return canonical header content. (encoded header except headerName:)
108      *
109      * @return encoded string.
110      */
encodeBody()111     public String encodeBody() {
112         return encodeBody(new StringBuffer()).toString();
113     }
114 
encodeBody(StringBuffer buffer)115     protected StringBuffer encodeBody(StringBuffer buffer) {
116         return buffer.append(seqno).append(SP).append(method.toUpperCase());
117     }
118 
119     /**
120      * Get the method.
121      * @return String the method.
122      */
getMethod()123     public String getMethod() {
124         return method;
125     }
126 
127     /*
128      * (non-Javadoc)
129      * @see javax.sip.header.CSeqHeader#setSequenceNumber(long)
130      */
setSeqNumber(long sequenceNumber)131     public void setSeqNumber(long sequenceNumber)
132         throws InvalidArgumentException {
133         if (sequenceNumber < 0 )
134             throw new InvalidArgumentException(
135                 "JAIN-SIP Exception, CSeq, setSequenceNumber(), "
136                     + "the sequence number parameter is < 0 : " + sequenceNumber);
137         else if ( sequenceNumber >  ((long)1)<<32 - 1)
138             throw new InvalidArgumentException(
139                     "JAIN-SIP Exception, CSeq, setSequenceNumber(), "
140                         + "the sequence number parameter is too large : " + sequenceNumber);
141 
142         seqno = Long.valueOf(sequenceNumber);
143     }
144 
145     /**
146      * For backwards compatibility
147      */
setSequenceNumber(int sequenceNumber)148     public void setSequenceNumber(int sequenceNumber) throws InvalidArgumentException {
149         this.setSeqNumber( (long) sequenceNumber );
150     }
151 
152     /*
153      * (non-Javadoc)
154      * @see javax.sip.header.CSeqHeader#setMethod(java.lang.String)
155      */
setMethod(String meth)156     public void setMethod(String meth) throws ParseException {
157         if (meth == null)
158             throw new NullPointerException(
159                 "JAIN-SIP Exception, CSeq"
160                     + ", setMethod(), the meth parameter is null");
161         this.method = SIPRequest.getCannonicalName(meth);
162     }
163 
164     /*
165      * (non-Javadoc)
166      * @see javax.sip.header.CSeqHeader#getSequenceNumber()
167      */
getSequenceNumber()168     public int getSequenceNumber() {
169         if (this.seqno == null)
170             return 0;
171         else
172             return this.seqno.intValue();
173     }
174 
175 
176 
177 
getSeqNumber()178     public long getSeqNumber() {
179         return this.seqno.longValue();
180     }
181 
182 
183 }
184 
185