pier 01/07/19 17:01:19 Modified: catalina/src/share/org/apache/catalina/connector/warp WarpPacket.java Log: New WARP implementation from Jakarta-Tomcat-Connectors Revision Changes Path 1.6 +171 -53 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/warp/WarpPacket.java Index: WarpPacket.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/warp/WarpPacket.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- WarpPacket.java 2001/01/24 23:10:49 1.5 +++ WarpPacket.java 2001/07/20 00:01:19 1.6 @@ -2,7 +2,7 @@ * * * The Apache Software License, Version 1.1 * * * - * Copyright (c) 1999, 2000 The Apache Software Foundation. * + * Copyright (c) 1999-2001 The Apache Software Foundation. * * All rights reserved. * * * * ========================================================================= * @@ -56,70 +56,188 @@ * ========================================================================= */ package org.apache.catalina.connector.warp; -/** - * - * - * @author <a href="mailto:[EMAIL PROTECTED]">Pier Fumagalli</a> - * @author Copyright © 1999, 2000 <a href="http://www.apache.org">The - * Apache Software Foundation. - * @version CVS $Id: WarpPacket.java,v 1.5 2001/01/24 23:10:49 pier Exp $ - */ -public class WarpPacket { - - /** The default size. */ - private static final int defaultsize=4096; - - /** The current buffer. */ - private byte buf[]; +import java.io.UnsupportedEncodingException; - /** The current position in the buffer. */ - private int pos; +public class WarpPacket { + /** This packet's data buffer */ + protected byte buffer[]=null; + /** Number of bytes stored in the buffer */ + protected int size=0; + + /* Pointer to the last byte read in the buffer */ + private int pointer=0; + /* Type of this packet */ + private int type=-1; + /* Maximum value for a 16 bit unsigned value (0x0ffff +1) */ + private static final int MAX_LENGTH=65536; + + /** + * Construct a new WarpPacket instance. + */ public WarpPacket() { super(); - this.buf=new byte[defaultsize]; + this.buffer=new byte[MAX_LENGTH]; this.reset(); } + /** + * Reset this packet. + */ public void reset() { - this.pos=0; - if (this.buf.length>(defaultsize<<1)) this.buf=new byte[defaultsize]; - } - - public void writeShort(int k) { - // Check if we have room - if ((this.pos+2)<this.buf.length) { - byte newbuf[]=new byte[this.buf.length+defaultsize]; - System.arraycopy(this.buf,0,newbuf,0,this.pos); - this.buf=newbuf; + this.pointer=0; + this.size=0; + this.type=Constants.TYPE_INVALID; + } + + /** + * Set this packet type. + * + * @param type The type of this packet. + */ + public void setType(int type) { + this.type=type; + } + + /** + * Return the type of this packet. + * + * @return The type of this packet. + */ + public int getType() { + return(this.type); + } + + /** + * Write an unsigned short value (16 bit) in the packet buffer. + * + * @param value The unsigned short value to write. + * @exception IllegalArgumentException If the value is negative or greater + * than 65535. + * @exception ArrayIndexOutOfBoundsException If the packet buffer cannot + * contain the new value. + */ + public void writeUnsignedShort(int value) { + if (value<0) + throw new IllegalArgumentException("Negative unsigned short"); + if (value>65535) + throw new IllegalArgumentException("Unsigned short is too big"); + + if ((this.size+2)>=MAX_LENGTH) + throw new ArrayIndexOutOfBoundsException("Too much data"); + + this.buffer[this.size++]=(byte) ((value>>8)&0x0ff); + this.buffer[this.size++]=(byte) ((value>>0)&0x0ff); + } + + /** + * Write a signed integer value (32 bit) in the packet buffer. + * + * @param value The signed integer value to write. + * @exception ArrayIndexOutOfBoundsException If the packet buffer cannot + * contain the new value. + */ + public void writeInteger(int value) { + if ((this.size+4)>=MAX_LENGTH) + throw new ArrayIndexOutOfBoundsException("Too much data"); + + this.buffer[this.size++]=(byte) ((value>>24)&0x0ff); + this.buffer[this.size++]=(byte) ((value>>16)&0x0ff); + this.buffer[this.size++]=(byte) ((value>>8)&0x0ff); + this.buffer[this.size++]=(byte) ((value>>0)&0x0ff); + } + + /** + * Write a string into the packet buffer. + * + * @param string The string to write into the packet buffer. + * @exception ArrayIndexOutOfBoundsException If the packet buffer cannot + * contain the new value. + * @exception RuntimeException If the platform doesn't support UTF-8 + * encoding. + */ + public void writeString(String string) { + try { + byte temp[]=string.getBytes("UTF-8"); + if ((this.size+temp.length+2)>MAX_LENGTH) + throw new ArrayIndexOutOfBoundsException("Too much data"); + + this.writeUnsignedShort(temp.length); + System.arraycopy(temp,0,this.buffer,this.size,temp.length); + this.size+=temp.length; + } catch (UnsupportedEncodingException s) { + throw new RuntimeException("Unsupported encoding UTF-8"); } - // Store the number - this.buf[this.pos++]=(byte)((k>>8)&0x0ff); - this.buf[this.pos++]=(byte)(k&0x0ff); } - public void writeString(String s) { - // Retrieve the string bytes - byte k[]=s.getBytes(); - // Write the string length - this.writeShort(k.length); - // Check if we have room - if ((this.pos+k.length)<this.buf.length) { - byte newbuf[]=new byte[this.buf.length+k.length+defaultsize]; - System.arraycopy(this.buf,0,newbuf,0,this.pos); - this.buf=newbuf; + /** + * Read an unsigned short value (16 bit) from the packet buffer. + * + * @return The unsigned short value as an integer. + * @exception ArrayIndexOutOfBoundsException If no data is left in the + * packet buffer to be read. + */ + public int readUnsignedShort() { + if ((this.pointer+2)>this.size) + throw new ArrayIndexOutOfBoundsException("No data available"); + + int k=(this.buffer[this.pointer++])&0xff; + k=(k<<8)+((this.buffer[this.pointer++])&0xff); + + return(k); + } + + /** + * Read a signed integer value (32 bit) from the packet buffer. + * + * @return The signed integer value. + * @exception ArrayIndexOutOfBoundsException If no data is left in the + * packet buffer to be read. + */ + public int readInteger() { + if ((this.pointer+4)>this.size) + throw new ArrayIndexOutOfBoundsException("No data available"); + + int k=(this.buffer[this.pointer++])&0xff; + k=(k<<8)+((this.buffer[this.pointer++])&0xff); + k=(k<<8)+((this.buffer[this.pointer++])&0xff); + k=(k<<8)+((this.buffer[this.pointer++])&0xff); + + return(k); + } + + /** + * Read a string from the packet buffer. + * + * @return The string red from the packet buffer. + * @exception ArrayIndexOutOfBoundsException If no data is left in the + * packet buffer to be read. + */ + public String readString() { + int length=this.readUnsignedShort(); + try { + String ret=new String(this.buffer,this.pointer,length,"UTF-8"); + this.pointer+=length; + return(ret); + } catch (UnsupportedEncodingException s) { + throw new RuntimeException("Unsupported encoding UTF-8"); } - // Store the string - System.arraycopy(k,0,this.buf,this.pos,k.length); - this.pos+=k.length; } - - public byte[] getBuffer() { - return(this.buf); - } - - public int getLength() { - return(this.pos); + + public String dump() { + StringBuffer buf=new StringBuffer("DATA="); + for (int x=0; x<this.size; x++) { + if ((this.buffer[x]>32)&&(this.buffer[x]<127)) { + buf.append((char)this.buffer[x]); + } else { + buf.append("0x"); + String digit=Integer.toHexString((int)this.buffer[x]); + if (digit.length()<2) buf.append('0'); + if (digit.length()>2) digit=digit.substring(digit.length()-2); + buf.append(digit); + } + buf.append(" "); + } + return(buf.toString()); } - }