1d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/* 2d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Copyright (C) 2015 The Android Open Source Project 3d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 4d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * you may not use this file except in compliance with the License. 6d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * You may obtain a copy of the License at 7d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 8d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 10d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * See the License for the specific language governing permissions and 14d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * limitations under the License. 15d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 16d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpackage com.android.voicemail.impl.mail; 17d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 18d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport java.io.IOException; 19d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport java.io.InputStream; 20d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 21d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/** 22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * A filtering InputStream that stops allowing reads after the given length has been read. This is 23d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * used to allow a client to read directly from an underlying protocol stream without reading past 24d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * where the protocol handler intended the client to read. 25d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpublic class FixedLengthInputStream extends InputStream { 27183cb71663320f16149d83eeebaff7795a4b55f2linyuh private final InputStream in; 28183cb71663320f16149d83eeebaff7795a4b55f2linyuh private final int length; 29183cb71663320f16149d83eeebaff7795a4b55f2linyuh private int count; 30d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 31d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public FixedLengthInputStream(InputStream in, int length) { 32183cb71663320f16149d83eeebaff7795a4b55f2linyuh this.in = in; 33183cb71663320f16149d83eeebaff7795a4b55f2linyuh this.length = length; 34d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 35d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 36d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 37d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public int available() throws IOException { 38183cb71663320f16149d83eeebaff7795a4b55f2linyuh return length - count; 39d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 40d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 41d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 42d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public int read() throws IOException { 43183cb71663320f16149d83eeebaff7795a4b55f2linyuh if (count < length) { 44183cb71663320f16149d83eeebaff7795a4b55f2linyuh count++; 45183cb71663320f16149d83eeebaff7795a4b55f2linyuh return in.read(); 46d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } else { 47d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return -1; 48d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 49d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 50d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 51d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 52d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public int read(byte[] b, int offset, int length) throws IOException { 53183cb71663320f16149d83eeebaff7795a4b55f2linyuh if (count < this.length) { 54183cb71663320f16149d83eeebaff7795a4b55f2linyuh int d = in.read(b, offset, Math.min(this.length - count, length)); 55d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (d == -1) { 56d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return -1; 57d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } else { 58183cb71663320f16149d83eeebaff7795a4b55f2linyuh count += d; 59d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return d; 60d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 61d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } else { 62d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return -1; 63d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 64d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 65d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 66d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 67d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public int read(byte[] b) throws IOException { 68d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return read(b, 0, b.length); 69d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 70d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 71d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public int getLength() { 72183cb71663320f16149d83eeebaff7795a4b55f2linyuh return length; 73d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 74d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 75d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 76d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public String toString() { 77183cb71663320f16149d83eeebaff7795a4b55f2linyuh return String.format("FixedLengthInputStream(in=%s, length=%d)", in.toString(), length); 78d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 79d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian} 80