    001package org.apache.commons.ssl.asn1;
    002
    003import java.io.EOFException;
    004import java.io.IOException;
    005import java.io.InputStream;
    006
    007class DefiniteLengthInputStream
    008    extends LimitedInputStream {
    009    private int _length;
    010
    011    DefiniteLengthInputStream(
    012        InputStream in,
    013        int length) {
    014        super(in);
    015
    016        if (length < 0) {
    017            throw new IllegalArgumentException("negative lengths not allowed");
    018        }
    019
    020        this._length = length;
    021    }
    022
    023    public int read()
    024        throws IOException {
    025        if (_length > 0) {
    026            int b = _in.read();
    027
    028            if (b < 0) {
    029                throw new EOFException();
    030            }
    031
    032            --_length;
    033            return b;
    034        }
    035
    036        setParentEofDetect(true);
    037
    038        return -1;
    039    }
    040
    041    public int read(byte[] buf, int off, int len)
    042        throws IOException {
    043        if (_length > 0) {
    044            int toRead = Math.min(len, _length);
    045            int numRead = _in.read(buf, off, toRead);
    046
    047            if (numRead < 0)
    048                throw new EOFException();
    049
    050            _length -= numRead;
    051            return numRead;
    052        }
    053
    054        setParentEofDetect(true);
    055
    056        return -1;
    057    }
    058
    059    byte[] toByteArray()
    060        throws IOException {
    061        byte[] bytes = new byte[_length];
    062
    063        if (_length > 0) {
    064            int pos = 0;
    065            do {
    066                int read = _in.read(bytes, pos, _length - pos);
    067
    068                if (read < 0) {
    069                    throw new EOFException();
    070                }
    071
    072                pos += read;
    073            }
    074            while (pos < _length);
    075
    076            _length = 0;
    077        }
    078
    079        setParentEofDetect(true);
    080
    081        return bytes;
    082    }
    083}