/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



// imports
import com.sun.star.io.BufferSizeExceededException;
import com.sun.star.io.NotConnectedException;
import com.sun.star.io.XInputStream;
import com.sun.star.io.XSeekable;

/**
 * XInputStream interface implementation.
 */
public class MyInputStream implements XSeekable, XInputStream {

    /**
     * Member properties
     */
    private int offset = 0;
	private int read = offset;
	private byte[] bigbuffer;

    /**
     * Constructor
     */
	public MyInputStream() {
	}

	    // XSeekable. Makes it possible to seek to a certain position within a stream.

    /**
     *   Returns the length of the stream.
     *
     *@return  long  The length of the storage medium on which the stream works.
     */
    public synchronized long getLength()
        throws com.sun.star.io.IOException,com.sun.star.uno.RuntimeException {
		if ( bigbuffer != null ) {
			return bigbuffer.length - offset;
		} else {
            return 0;
		}
	}

    /**
     *   Returns the current offset of the stream.
     *
     *@return  long  The current offset in this stream.
     */
	public synchronized long getPosition()
        throws com.sun.star.io.IOException,com.sun.star.uno.RuntimeException {
		return read - offset ;
	}

    /**
     *  Changes the seek pointer to a new location relative to the beginning of the stream.
     *
     *@param  long
     */
	public synchronized void seek(long p0)
        throws IllegalArgumentException, com.sun.star.io.IOException,
            com.sun.star.uno.RuntimeException {
		if( bigbuffer != null ) {
            p0 +=offset;
            read = ( int ) p0;
            if( read < offset || read > bigbuffer.length )
			    throw new IllegalArgumentException();
        }
    }

	    // XInputStream. This is the basic interface to read data from a stream.

    /**
     *   States how many bytes can be read or skipped without blocking.
     *
     *@return  int  If not available, then returned 0
     */
    public synchronized int available()
        throws NotConnectedException, com.sun.star.io.IOException,
            com.sun.star.uno.RuntimeException {
		if( bigbuffer != null )
			return ( bigbuffer.length - read );
		else
			return 0;
	}

	/**
     *   Closes the stream. .
     */
    public void closeInput()
	    throws NotConnectedException,com.sun.star.io.IOException,
        com.sun.star.uno.RuntimeException {
		read = -1;
    }

    /**
     *   Reads the specified number of bytes in the given sequence.
     *
     *@param    byte[][]
     *@param    int
     *@return   int
     */
	public synchronized int readBytes(byte[][] p0, int p1)
		throws NotConnectedException, BufferSizeExceededException,
            com.sun.star.io.IOException, com.sun.star.uno.RuntimeException {
		if( bigbuffer != null ) {
			if( read == -1 )
      		    return 0;
            int i = 0;
            int available;
            if ( p1 > bigbuffer.length - read )
                available = bigbuffer.length - read;
            else
                available = p1;

			p0[0] = new byte[p1];
			while( available != 0 ) {
			    p0[0][i++] = bigbuffer[read++];
				--available;
			}
			return i;
        } else {
			p0[0] = new byte[0];
			return 0;
		}
    }

	/**
     *  Reads the available number of bytes at maximum  nMaxBytesToRead .
     *  This method blocks the thread until at least one byte is available.
     *
     *@param    byte[][]
     *@param    int
     *@return   int
     */
    public synchronized int readSomeBytes(byte[][] p0, int p1)
		    throws 	NotConnectedException,
        		    BufferSizeExceededException,
		            com.sun.star.io.IOException,
		            com.sun.star.uno.RuntimeException {
		    return readBytes( p0,p1 );
	}

    /**
     *  Skips the next nBytesToSkip bytes (must be positive).
     *  It is up to the implementation whether this method is blocking the thread or not.
     *
     *@param    int
     */
    public synchronized void skipBytes(int p0)
        throws 	NotConnectedException, BufferSizeExceededException,
		    com.sun.star.io.IOException, com.sun.star.uno.RuntimeException {
        read += p0;
	    if( read > bigbuffer.length )
    	    read = bigbuffer.length;

	    if( read < offset )
		    read = offset;
    }
}
