103928aee4356845252ac6b662d5c72c29903813eJake Slack// 203928aee4356845252ac6b662d5c72c29903813eJake Slack// ======================================================================== 303928aee4356845252ac6b662d5c72c29903813eJake Slack// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. 403928aee4356845252ac6b662d5c72c29903813eJake Slack// ------------------------------------------------------------------------ 503928aee4356845252ac6b662d5c72c29903813eJake Slack// All rights reserved. This program and the accompanying materials 603928aee4356845252ac6b662d5c72c29903813eJake Slack// are made available under the terms of the Eclipse Public License v1.0 703928aee4356845252ac6b662d5c72c29903813eJake Slack// and Apache License v2.0 which accompanies this distribution. 803928aee4356845252ac6b662d5c72c29903813eJake Slack// 903928aee4356845252ac6b662d5c72c29903813eJake Slack// The Eclipse Public License is available at 1003928aee4356845252ac6b662d5c72c29903813eJake Slack// http://www.eclipse.org/legal/epl-v10.html 1103928aee4356845252ac6b662d5c72c29903813eJake Slack// 1203928aee4356845252ac6b662d5c72c29903813eJake Slack// The Apache License v2.0 is available at 1303928aee4356845252ac6b662d5c72c29903813eJake Slack// http://www.opensource.org/licenses/apache2.0.php 1403928aee4356845252ac6b662d5c72c29903813eJake Slack// 1503928aee4356845252ac6b662d5c72c29903813eJake Slack// You may elect to redistribute this code under either of these licenses. 1603928aee4356845252ac6b662d5c72c29903813eJake Slack// ======================================================================== 1703928aee4356845252ac6b662d5c72c29903813eJake Slack// 1803928aee4356845252ac6b662d5c72c29903813eJake Slack 1903928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.io; 2003928aee4356845252ac6b662d5c72c29903813eJake Slack 2103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.IOException; 2203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.InputStream; 2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.OutputStream; 2403928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.nio.charset.Charset; 2503928aee4356845252ac6b662d5c72c29903813eJake Slack 2603928aee4356845252ac6b662d5c72c29903813eJake Slack 2703928aee4356845252ac6b662d5c72c29903813eJake Slack/** 2803928aee4356845252ac6b662d5c72c29903813eJake Slack * Byte Buffer interface. 2903928aee4356845252ac6b662d5c72c29903813eJake Slack * 3003928aee4356845252ac6b662d5c72c29903813eJake Slack * This is a byte buffer that is designed to work like a FIFO for bytes. Puts and Gets operate on different 3103928aee4356845252ac6b662d5c72c29903813eJake Slack * pointers into the buffer and the valid _content of the buffer is always between the getIndex and the putIndex. 3203928aee4356845252ac6b662d5c72c29903813eJake Slack * 3303928aee4356845252ac6b662d5c72c29903813eJake Slack * This buffer interface is designed to be similar, but not dependent on the java.nio buffers, which may 3403928aee4356845252ac6b662d5c72c29903813eJake Slack * be used to back an implementation of this Buffer. The main difference is that NIO buffer after a put have 3503928aee4356845252ac6b662d5c72c29903813eJake Slack * their valid _content before the position and a flip is required to access that data. 3603928aee4356845252ac6b662d5c72c29903813eJake Slack * 3703928aee4356845252ac6b662d5c72c29903813eJake Slack * For this buffer it is always true that: 3803928aee4356845252ac6b662d5c72c29903813eJake Slack * markValue <= getIndex <= putIndex <= capacity 3903928aee4356845252ac6b662d5c72c29903813eJake Slack * 4003928aee4356845252ac6b662d5c72c29903813eJake Slack * 4103928aee4356845252ac6b662d5c72c29903813eJake Slack * @version 1.0 4203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 4303928aee4356845252ac6b662d5c72c29903813eJake Slackpublic interface Buffer extends Cloneable 4403928aee4356845252ac6b662d5c72c29903813eJake Slack{ 4503928aee4356845252ac6b662d5c72c29903813eJake Slack public final static int 4603928aee4356845252ac6b662d5c72c29903813eJake Slack IMMUTABLE=0, // neither indexes or contexts can be changed 4703928aee4356845252ac6b662d5c72c29903813eJake Slack READONLY=1, // indexes may be changed, but not content 4803928aee4356845252ac6b662d5c72c29903813eJake Slack READWRITE=2; // anything can be changed 4903928aee4356845252ac6b662d5c72c29903813eJake Slack public final boolean VOLATILE=true; // The buffer may change outside of current scope. 5003928aee4356845252ac6b662d5c72c29903813eJake Slack public final boolean NON_VOLATILE=false; 5103928aee4356845252ac6b662d5c72c29903813eJake Slack 5203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 5303928aee4356845252ac6b662d5c72c29903813eJake Slack * Get the underlying array, if one exists. 5403928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>byte[]</code> backing this buffer or null if none exists. 5503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 5603928aee4356845252ac6b662d5c72c29903813eJake Slack byte[] array(); 5703928aee4356845252ac6b662d5c72c29903813eJake Slack 5803928aee4356845252ac6b662d5c72c29903813eJake Slack /** 5903928aee4356845252ac6b662d5c72c29903813eJake Slack * 6003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>byte[]</code> value of the bytes from the getIndex to the putIndex. 6103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 6203928aee4356845252ac6b662d5c72c29903813eJake Slack byte[] asArray(); 6303928aee4356845252ac6b662d5c72c29903813eJake Slack 6403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 6503928aee4356845252ac6b662d5c72c29903813eJake Slack * Get the underlying buffer. If this buffer wraps a backing buffer. 6603928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The root backing buffer or this if there is no backing buffer; 6703928aee4356845252ac6b662d5c72c29903813eJake Slack */ 6803928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer buffer(); 6903928aee4356845252ac6b662d5c72c29903813eJake Slack 7003928aee4356845252ac6b662d5c72c29903813eJake Slack /** 7103928aee4356845252ac6b662d5c72c29903813eJake Slack * 7203928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a non volatile version of this <code>Buffer</code> value 7303928aee4356845252ac6b662d5c72c29903813eJake Slack */ 7403928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer asNonVolatileBuffer(); 7503928aee4356845252ac6b662d5c72c29903813eJake Slack 7603928aee4356845252ac6b662d5c72c29903813eJake Slack /** 7703928aee4356845252ac6b662d5c72c29903813eJake Slack * 7803928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a readonly version of this <code>Buffer</code>. 7903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 8003928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer asReadOnlyBuffer(); 8103928aee4356845252ac6b662d5c72c29903813eJake Slack 8203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 8303928aee4356845252ac6b662d5c72c29903813eJake Slack * 8403928aee4356845252ac6b662d5c72c29903813eJake Slack * @return an immutable version of this <code>Buffer</code>. 8503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 8603928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer asImmutableBuffer(); 8703928aee4356845252ac6b662d5c72c29903813eJake Slack 8803928aee4356845252ac6b662d5c72c29903813eJake Slack /** 8903928aee4356845252ac6b662d5c72c29903813eJake Slack * 9003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return an immutable version of this <code>Buffer</code>. 9103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 9203928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer asMutableBuffer(); 9303928aee4356845252ac6b662d5c72c29903813eJake Slack 9403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 9503928aee4356845252ac6b662d5c72c29903813eJake Slack * 9603928aee4356845252ac6b662d5c72c29903813eJake Slack * The capacity of the buffer. This is the maximum putIndex that may be set. 9703928aee4356845252ac6b662d5c72c29903813eJake Slack * @return an <code>int</code> value 9803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 9903928aee4356845252ac6b662d5c72c29903813eJake Slack int capacity(); 10003928aee4356845252ac6b662d5c72c29903813eJake Slack 10103928aee4356845252ac6b662d5c72c29903813eJake Slack /** 10203928aee4356845252ac6b662d5c72c29903813eJake Slack * the space remaining in the buffer. 10303928aee4356845252ac6b662d5c72c29903813eJake Slack * @return capacity - putIndex 10403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 10503928aee4356845252ac6b662d5c72c29903813eJake Slack int space(); 10603928aee4356845252ac6b662d5c72c29903813eJake Slack 10703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 10803928aee4356845252ac6b662d5c72c29903813eJake Slack * Clear the buffer. getIndex=0, putIndex=0. 10903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 11003928aee4356845252ac6b662d5c72c29903813eJake Slack void clear(); 11103928aee4356845252ac6b662d5c72c29903813eJake Slack 11203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 11303928aee4356845252ac6b662d5c72c29903813eJake Slack * Compact the buffer by discarding bytes before the postion (or mark if set). 11403928aee4356845252ac6b662d5c72c29903813eJake Slack * Bytes from the getIndex (or mark) to the putIndex are moved to the beginning of 11503928aee4356845252ac6b662d5c72c29903813eJake Slack * the buffer and the values adjusted accordingly. 11603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 11703928aee4356845252ac6b662d5c72c29903813eJake Slack void compact(); 11803928aee4356845252ac6b662d5c72c29903813eJake Slack 11903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 12003928aee4356845252ac6b662d5c72c29903813eJake Slack * Get the byte at the current getIndex and increment it. 12103928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The <code>byte</code> value from the current getIndex. 12203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 12303928aee4356845252ac6b662d5c72c29903813eJake Slack byte get(); 12403928aee4356845252ac6b662d5c72c29903813eJake Slack 12503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 12603928aee4356845252ac6b662d5c72c29903813eJake Slack * Get bytes from the current postion and put them into the passed byte array. 12703928aee4356845252ac6b662d5c72c29903813eJake Slack * The getIndex is incremented by the number of bytes copied into the array. 12803928aee4356845252ac6b662d5c72c29903813eJake Slack * @param b The byte array to fill. 12903928aee4356845252ac6b662d5c72c29903813eJake Slack * @param offset Offset in the array. 13003928aee4356845252ac6b662d5c72c29903813eJake Slack * @param length The max number of bytes to read. 13103928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The number of bytes actually read. 13203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 13303928aee4356845252ac6b662d5c72c29903813eJake Slack int get(byte[] b, int offset, int length); 13403928aee4356845252ac6b662d5c72c29903813eJake Slack 13503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 13603928aee4356845252ac6b662d5c72c29903813eJake Slack * 13703928aee4356845252ac6b662d5c72c29903813eJake Slack * @param length an <code>int</code> value 13803928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>Buffer</code> value 13903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 14003928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer get(int length); 14103928aee4356845252ac6b662d5c72c29903813eJake Slack 14203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 14303928aee4356845252ac6b662d5c72c29903813eJake Slack * The index within the buffer that will next be read or written. 14403928aee4356845252ac6b662d5c72c29903813eJake Slack * @return an <code>int</code> value >=0 <= putIndex() 14503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 14603928aee4356845252ac6b662d5c72c29903813eJake Slack int getIndex(); 14703928aee4356845252ac6b662d5c72c29903813eJake Slack 14803928aee4356845252ac6b662d5c72c29903813eJake Slack /** 14903928aee4356845252ac6b662d5c72c29903813eJake Slack * @return true of putIndex > getIndex 15003928aee4356845252ac6b662d5c72c29903813eJake Slack */ 15103928aee4356845252ac6b662d5c72c29903813eJake Slack boolean hasContent(); 15203928aee4356845252ac6b662d5c72c29903813eJake Slack 15303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 15403928aee4356845252ac6b662d5c72c29903813eJake Slack * 15503928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>boolean</code> value true if case sensitive comparison on this buffer 15603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 15703928aee4356845252ac6b662d5c72c29903813eJake Slack boolean equalsIgnoreCase(Buffer buffer); 15803928aee4356845252ac6b662d5c72c29903813eJake Slack 15903928aee4356845252ac6b662d5c72c29903813eJake Slack 16003928aee4356845252ac6b662d5c72c29903813eJake Slack /** 16103928aee4356845252ac6b662d5c72c29903813eJake Slack * 16203928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>boolean</code> value true if the buffer is immutable and that neither 16303928aee4356845252ac6b662d5c72c29903813eJake Slack * the buffer contents nor the indexes may be changed. 16403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 16503928aee4356845252ac6b662d5c72c29903813eJake Slack boolean isImmutable(); 16603928aee4356845252ac6b662d5c72c29903813eJake Slack 16703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 16803928aee4356845252ac6b662d5c72c29903813eJake Slack * 16903928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>boolean</code> value true if the buffer is readonly. The buffer indexes may 17003928aee4356845252ac6b662d5c72c29903813eJake Slack * be modified, but the buffer contents may not. For example a View onto an immutable Buffer will be 17103928aee4356845252ac6b662d5c72c29903813eJake Slack * read only. 17203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 17303928aee4356845252ac6b662d5c72c29903813eJake Slack boolean isReadOnly(); 17403928aee4356845252ac6b662d5c72c29903813eJake Slack 17503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 17603928aee4356845252ac6b662d5c72c29903813eJake Slack * 17703928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>boolean</code> value true if the buffer contents may change 17803928aee4356845252ac6b662d5c72c29903813eJake Slack * via alternate paths than this buffer. If the contents of this buffer are to be used outside of the 17903928aee4356845252ac6b662d5c72c29903813eJake Slack * current context, then a copy must be made. 18003928aee4356845252ac6b662d5c72c29903813eJake Slack */ 18103928aee4356845252ac6b662d5c72c29903813eJake Slack boolean isVolatile(); 18203928aee4356845252ac6b662d5c72c29903813eJake Slack 18303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 18403928aee4356845252ac6b662d5c72c29903813eJake Slack * The number of bytes from the getIndex to the putIndex 18503928aee4356845252ac6b662d5c72c29903813eJake Slack * @return an <code>int</code> == putIndex()-getIndex() 18603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 18703928aee4356845252ac6b662d5c72c29903813eJake Slack int length(); 18803928aee4356845252ac6b662d5c72c29903813eJake Slack 18903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 19003928aee4356845252ac6b662d5c72c29903813eJake Slack * Set the mark to the current getIndex. 19103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 19203928aee4356845252ac6b662d5c72c29903813eJake Slack void mark(); 19303928aee4356845252ac6b662d5c72c29903813eJake Slack 19403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 19503928aee4356845252ac6b662d5c72c29903813eJake Slack * Set the mark relative to the current getIndex 19603928aee4356845252ac6b662d5c72c29903813eJake Slack * @param offset an <code>int</code> value to add to the current getIndex to obtain the mark value. 19703928aee4356845252ac6b662d5c72c29903813eJake Slack */ 19803928aee4356845252ac6b662d5c72c29903813eJake Slack void mark(int offset); 19903928aee4356845252ac6b662d5c72c29903813eJake Slack 20003928aee4356845252ac6b662d5c72c29903813eJake Slack /** 20103928aee4356845252ac6b662d5c72c29903813eJake Slack * The current index of the mark. 20203928aee4356845252ac6b662d5c72c29903813eJake Slack * @return an <code>int</code> index in the buffer or -1 if the mark is not set. 20303928aee4356845252ac6b662d5c72c29903813eJake Slack */ 20403928aee4356845252ac6b662d5c72c29903813eJake Slack int markIndex(); 20503928aee4356845252ac6b662d5c72c29903813eJake Slack 20603928aee4356845252ac6b662d5c72c29903813eJake Slack /** 20703928aee4356845252ac6b662d5c72c29903813eJake Slack * Get the byte at the current getIndex without incrementing the getIndex. 20803928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The <code>byte</code> value from the current getIndex. 20903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 21003928aee4356845252ac6b662d5c72c29903813eJake Slack byte peek(); 21103928aee4356845252ac6b662d5c72c29903813eJake Slack 21203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 21303928aee4356845252ac6b662d5c72c29903813eJake Slack * Get the byte at a specific index in the buffer. 21403928aee4356845252ac6b662d5c72c29903813eJake Slack * @param index an <code>int</code> value 21503928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>byte</code> value 21603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 21703928aee4356845252ac6b662d5c72c29903813eJake Slack byte peek(int index); 21803928aee4356845252ac6b662d5c72c29903813eJake Slack 21903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 22003928aee4356845252ac6b662d5c72c29903813eJake Slack * 22103928aee4356845252ac6b662d5c72c29903813eJake Slack * @param index an <code>int</code> value 22203928aee4356845252ac6b662d5c72c29903813eJake Slack * @param length an <code>int</code> value 22303928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The <code>Buffer</code> value from the requested getIndex. 22403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 22503928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer peek(int index, int length); 22603928aee4356845252ac6b662d5c72c29903813eJake Slack 22703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 22803928aee4356845252ac6b662d5c72c29903813eJake Slack * 22903928aee4356845252ac6b662d5c72c29903813eJake Slack * @param index an <code>int</code> value 23003928aee4356845252ac6b662d5c72c29903813eJake Slack * @param b The byte array to peek into 23103928aee4356845252ac6b662d5c72c29903813eJake Slack * @param offset The offset into the array to start peeking 23203928aee4356845252ac6b662d5c72c29903813eJake Slack * @param length an <code>int</code> value 23303928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The number of bytes actually peeked 23403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 23503928aee4356845252ac6b662d5c72c29903813eJake Slack int peek(int index, byte[] b, int offset, int length); 23603928aee4356845252ac6b662d5c72c29903813eJake Slack 23703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 23803928aee4356845252ac6b662d5c72c29903813eJake Slack * Put the contents of the buffer at the specific index. 23903928aee4356845252ac6b662d5c72c29903813eJake Slack * @param index an <code>int</code> value 24003928aee4356845252ac6b662d5c72c29903813eJake Slack * @param src a <code>Buffer</code>. If the source buffer is not modified 24103928aee4356845252ac6b662d5c72c29903813eJake Slack 24203928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The number of bytes actually poked 24303928aee4356845252ac6b662d5c72c29903813eJake Slack */ 24403928aee4356845252ac6b662d5c72c29903813eJake Slack int poke(int index, Buffer src); 24503928aee4356845252ac6b662d5c72c29903813eJake Slack 24603928aee4356845252ac6b662d5c72c29903813eJake Slack /** 24703928aee4356845252ac6b662d5c72c29903813eJake Slack * Put a specific byte to a specific getIndex. 24803928aee4356845252ac6b662d5c72c29903813eJake Slack * @param index an <code>int</code> value 24903928aee4356845252ac6b662d5c72c29903813eJake Slack * @param b a <code>byte</code> value 25003928aee4356845252ac6b662d5c72c29903813eJake Slack */ 25103928aee4356845252ac6b662d5c72c29903813eJake Slack void poke(int index, byte b); 25203928aee4356845252ac6b662d5c72c29903813eJake Slack 25303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 25403928aee4356845252ac6b662d5c72c29903813eJake Slack * Put a specific byte to a specific getIndex. 25503928aee4356845252ac6b662d5c72c29903813eJake Slack * @param index an <code>int</code> value 25603928aee4356845252ac6b662d5c72c29903813eJake Slack * @param b a <code>byte array</code> value 25703928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The number of bytes actually poked 25803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 25903928aee4356845252ac6b662d5c72c29903813eJake Slack int poke(int index, byte b[], int offset, int length); 26003928aee4356845252ac6b662d5c72c29903813eJake Slack 26103928aee4356845252ac6b662d5c72c29903813eJake Slack /** 26203928aee4356845252ac6b662d5c72c29903813eJake Slack * Write the bytes from the source buffer to the current getIndex. 26303928aee4356845252ac6b662d5c72c29903813eJake Slack * @param src The source <code>Buffer</code> it is not modified. 26403928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The number of bytes actually poked 26503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 26603928aee4356845252ac6b662d5c72c29903813eJake Slack int put(Buffer src); 26703928aee4356845252ac6b662d5c72c29903813eJake Slack 26803928aee4356845252ac6b662d5c72c29903813eJake Slack /** 26903928aee4356845252ac6b662d5c72c29903813eJake Slack * Put a byte to the current getIndex and increment the getIndex. 27003928aee4356845252ac6b662d5c72c29903813eJake Slack * @param b a <code>byte</code> value 27103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 27203928aee4356845252ac6b662d5c72c29903813eJake Slack void put(byte b); 27303928aee4356845252ac6b662d5c72c29903813eJake Slack 27403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 27503928aee4356845252ac6b662d5c72c29903813eJake Slack * Put a byte to the current getIndex and increment the getIndex. 27603928aee4356845252ac6b662d5c72c29903813eJake Slack * @param b a <code>byte</code> value 27703928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The number of bytes actually poked 27803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 27903928aee4356845252ac6b662d5c72c29903813eJake Slack int put(byte[] b,int offset, int length); 28003928aee4356845252ac6b662d5c72c29903813eJake Slack 28103928aee4356845252ac6b662d5c72c29903813eJake Slack /** 28203928aee4356845252ac6b662d5c72c29903813eJake Slack * Put a byte to the current getIndex and increment the getIndex. 28303928aee4356845252ac6b662d5c72c29903813eJake Slack * @param b a <code>byte</code> value 28403928aee4356845252ac6b662d5c72c29903813eJake Slack * @return The number of bytes actually poked 28503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 28603928aee4356845252ac6b662d5c72c29903813eJake Slack int put(byte[] b); 28703928aee4356845252ac6b662d5c72c29903813eJake Slack 28803928aee4356845252ac6b662d5c72c29903813eJake Slack /** 28903928aee4356845252ac6b662d5c72c29903813eJake Slack * The index of the first element that should not be read. 29003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return an <code>int</code> value >= getIndex() 29103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 29203928aee4356845252ac6b662d5c72c29903813eJake Slack int putIndex(); 29303928aee4356845252ac6b662d5c72c29903813eJake Slack 29403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 29503928aee4356845252ac6b662d5c72c29903813eJake Slack * Reset the current getIndex to the mark 29603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 29703928aee4356845252ac6b662d5c72c29903813eJake Slack void reset(); 29803928aee4356845252ac6b662d5c72c29903813eJake Slack 29903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 30003928aee4356845252ac6b662d5c72c29903813eJake Slack * Set the buffers start getIndex. 30103928aee4356845252ac6b662d5c72c29903813eJake Slack * @param newStart an <code>int</code> value 30203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 30303928aee4356845252ac6b662d5c72c29903813eJake Slack void setGetIndex(int newStart); 30403928aee4356845252ac6b662d5c72c29903813eJake Slack 30503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 30603928aee4356845252ac6b662d5c72c29903813eJake Slack * Set a specific value for the mark. 30703928aee4356845252ac6b662d5c72c29903813eJake Slack * @param newMark an <code>int</code> value 30803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 30903928aee4356845252ac6b662d5c72c29903813eJake Slack void setMarkIndex(int newMark); 31003928aee4356845252ac6b662d5c72c29903813eJake Slack 31103928aee4356845252ac6b662d5c72c29903813eJake Slack /** 31203928aee4356845252ac6b662d5c72c29903813eJake Slack * 31303928aee4356845252ac6b662d5c72c29903813eJake Slack * @param newLimit an <code>int</code> value 31403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 31503928aee4356845252ac6b662d5c72c29903813eJake Slack void setPutIndex(int newLimit); 31603928aee4356845252ac6b662d5c72c29903813eJake Slack 31703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 31803928aee4356845252ac6b662d5c72c29903813eJake Slack * Skip _content. The getIndex is updated by min(remaining(), n) 31903928aee4356845252ac6b662d5c72c29903813eJake Slack * @param n The number of bytes to skip 32003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return the number of bytes skipped. 32103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 32203928aee4356845252ac6b662d5c72c29903813eJake Slack int skip(int n); 32303928aee4356845252ac6b662d5c72c29903813eJake Slack 32403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 32503928aee4356845252ac6b662d5c72c29903813eJake Slack * 32603928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a volitile <code>Buffer</code> from the postion to the putIndex. 32703928aee4356845252ac6b662d5c72c29903813eJake Slack */ 32803928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer slice(); 32903928aee4356845252ac6b662d5c72c29903813eJake Slack 33003928aee4356845252ac6b662d5c72c29903813eJake Slack /** 33103928aee4356845252ac6b662d5c72c29903813eJake Slack * 33203928aee4356845252ac6b662d5c72c29903813eJake Slack * 33303928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a volitile <code>Buffer</code> value from the mark to the putIndex 33403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 33503928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer sliceFromMark(); 33603928aee4356845252ac6b662d5c72c29903813eJake Slack 33703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 33803928aee4356845252ac6b662d5c72c29903813eJake Slack * 33903928aee4356845252ac6b662d5c72c29903813eJake Slack * 34003928aee4356845252ac6b662d5c72c29903813eJake Slack * @param length an <code>int</code> value 34103928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a valitile <code>Buffer</code> value from the mark of the length requested. 34203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 34303928aee4356845252ac6b662d5c72c29903813eJake Slack Buffer sliceFromMark(int length); 34403928aee4356845252ac6b662d5c72c29903813eJake Slack 34503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 34603928aee4356845252ac6b662d5c72c29903813eJake Slack * 34703928aee4356845252ac6b662d5c72c29903813eJake Slack * @return a <code>String</code> value describing the state and contents of the buffer. 34803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 34903928aee4356845252ac6b662d5c72c29903813eJake Slack String toDetailString(); 35003928aee4356845252ac6b662d5c72c29903813eJake Slack 35103928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 35203928aee4356845252ac6b662d5c72c29903813eJake Slack /** Write the buffer's contents to the output stream 35303928aee4356845252ac6b662d5c72c29903813eJake Slack * @param out 35403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 35503928aee4356845252ac6b662d5c72c29903813eJake Slack void writeTo(OutputStream out) throws IOException; 35603928aee4356845252ac6b662d5c72c29903813eJake Slack 35703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 35803928aee4356845252ac6b662d5c72c29903813eJake Slack /** Read the buffer's contents from the input stream 35903928aee4356845252ac6b662d5c72c29903813eJake Slack * @param in input stream 36003928aee4356845252ac6b662d5c72c29903813eJake Slack * @param max maximum number of bytes that may be read 36103928aee4356845252ac6b662d5c72c29903813eJake Slack * @return actual number of bytes read or -1 for EOF 36203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 36303928aee4356845252ac6b662d5c72c29903813eJake Slack int readFrom(InputStream in, int max) throws IOException; 36403928aee4356845252ac6b662d5c72c29903813eJake Slack 36503928aee4356845252ac6b662d5c72c29903813eJake Slack 36603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 36703928aee4356845252ac6b662d5c72c29903813eJake Slack String toString(String charset); 36803928aee4356845252ac6b662d5c72c29903813eJake Slack 36903928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 37003928aee4356845252ac6b662d5c72c29903813eJake Slack String toString(Charset charset); 37103928aee4356845252ac6b662d5c72c29903813eJake Slack 37203928aee4356845252ac6b662d5c72c29903813eJake Slack /* 37303928aee4356845252ac6b662d5c72c29903813eJake Slack * Buffers implementing this interface should be compared with case insensitive equals 37403928aee4356845252ac6b662d5c72c29903813eJake Slack * 37503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 37603928aee4356845252ac6b662d5c72c29903813eJake Slack public interface CaseInsensitve 37703928aee4356845252ac6b662d5c72c29903813eJake Slack {} 37803928aee4356845252ac6b662d5c72c29903813eJake Slack 37903928aee4356845252ac6b662d5c72c29903813eJake Slack 38003928aee4356845252ac6b662d5c72c29903813eJake Slack} 381