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.javax.sip.message.SIPRequest; 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.InvalidArgumentException; 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.header.CSeqHeader; 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.text.ParseException; 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * CSeq SIP Header. 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 $Revision: 1.10 $ $Date: 2009/10/18 13:46:33 $ 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since 1.1 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class CSeq extends SIPHeader implements javax.sip.header.CSeqHeader { 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Comment for <code>serialVersionUID</code> 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private static final long serialVersionUID = -5405798080040422910L; 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * seqno field 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected Long seqno; 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * method field 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected String method; 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Constructor. 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public CSeq() { 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang super(CSEQ); 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Constructor given the sequence number and method. 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param seqno is the sequence number to assign. 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param method is the method string. 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public CSeq(long seqno, String method) { 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this(); 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.seqno = Long.valueOf(seqno); 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.method = SIPRequest.getCannonicalName(method); 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Compare two cseq headers for equality. 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param other Object to compare against. 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return true if the two cseq headers are equals, false 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * otherwise. 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean equals(Object other) { 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (other instanceof CSeqHeader) { 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang final CSeqHeader o = (CSeqHeader) other; 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.getSeqNumber() == o.getSeqNumber() 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang && this.getMethod().equals( o.getMethod() ); 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Return canonical encoded header. 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return String with canonical encoded header. 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String encode() { 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return headerName + COLON + SP + encodeBody() + NEWLINE; 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Return canonical header content. (encoded header except headerName:) 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return encoded string. 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String encodeBody() { 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return encodeBody(new StringBuffer()).toString(); 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected StringBuffer encodeBody(StringBuffer buffer) { 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer.append(seqno).append(SP).append(method.toUpperCase()); 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the method. 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return String the method. 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getMethod() { 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return method; 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see javax.sip.header.CSeqHeader#setSequenceNumber(long) 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setSeqNumber(long sequenceNumber) 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throws InvalidArgumentException { 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sequenceNumber < 0 ) 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new InvalidArgumentException( 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "JAIN-SIP Exception, CSeq, setSequenceNumber(), " 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "the sequence number parameter is < 0 : " + sequenceNumber); 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else if ( sequenceNumber > ((long)1)<<32 - 1) 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new InvalidArgumentException( 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "JAIN-SIP Exception, CSeq, setSequenceNumber(), " 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + "the sequence number parameter is too large : " + sequenceNumber); 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang seqno = Long.valueOf(sequenceNumber); 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * For backwards compatibility 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setSequenceNumber(int sequenceNumber) throws InvalidArgumentException { 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.setSeqNumber( (long) sequenceNumber ); 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see javax.sip.header.CSeqHeader#setMethod(java.lang.String) 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setMethod(String meth) throws ParseException { 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (meth == null) 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang throw new NullPointerException( 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang "JAIN-SIP Exception, CSeq" 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang + ", setMethod(), the meth parameter is null"); 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.method = SIPRequest.getCannonicalName(meth); 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see javax.sip.header.CSeqHeader#getSequenceNumber() 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int getSequenceNumber() { 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.seqno == null) 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return 0; 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.seqno.intValue(); 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public long getSeqNumber() { 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.seqno.longValue(); 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 185