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