/** * Copyright 2006 by Know-Center, Graz, Austria * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a * joint initiative of the Federal Chancellery Austria and Graz University of * Technology. * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by * the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * http://www.osor.eu/eupl/ * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * * This product combines work with different licenses. See the "NOTICE" text * file for details on the various modules and licenses. * The "NOTICE" text file is part of the distribution. Any derivative works * that you distribute must include a readable copy of the "NOTICE" text file. */ package at.gv.egiz.pdfas.impl.input; import java.io.IOException; import java.io.InputStream; /** * An input stream that has a delimited length. * * @author wprinz */ public class DelimitedInputStream extends InputStream { /** * The underlying InputStream. */ protected InputStream is = null; /** * The number of bytes that can be read from the stream. */ protected int bytes_to_read = -1; /** * Constructs the DelimitedInputStream from which a maximum of length bytes * can be read. */ public DelimitedInputStream(InputStream is, int length) { this.is = is; this.bytes_to_read = length; } /** * @see java.io.InputStream#read() */ public int read() throws IOException { if (this.bytes_to_read <= 0) { return -1; } int read = this.is.read(); if (read > 0) { this.bytes_to_read--; } return read; } /** * @see java.io.InputStream#read(byte[], int, int) */ public int read(byte[] b, int off, int len) throws IOException { int btr = Math.min(len, this.bytes_to_read); int read = this.is.read(b, off, btr); if (read > 0) { this.bytes_to_read -= read; } return read; } /** * @see java.io.InputStream#read(byte[]) */ public int read(byte[] b) throws IOException { return read(b, 0, b.length); } /** * @see java.io.InputStream#skip(long) */ public long skip(long n) throws IOException { long bts = Math.min(n, this.bytes_to_read); long skipped = this.is.skip(bts); if (skipped > 0) { this.bytes_to_read -= skipped; } return skipped; } /** * @see java.io.InputStream#close() */ public void close() throws IOException { this.is.close(); } /** * @see java.io.InputStream#available() */ public int available() throws IOException { int avail = this.is.available(); return Math.min(this.bytes_to_read, avail); } }