001    package org.apache.commons.ssl.asn1;
002    
003    import java.io.EOFException;
004    import java.io.IOException;
005    import java.io.InputStream;
006    
007    class 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    }