| /************************************************************** |
| * |
| * 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; |
| } |
| } |