196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/* 296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * you may not use this file except in compliance with the License. 696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * You may obtain a copy of the License at 796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * 1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and 1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License. 1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage com.android.email; 1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException; 2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStream; 2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/** 2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * A filtering InputStream that allows single byte "peeks" without consuming the byte. The 2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * client of this stream can call peek() to see the next available byte in the stream 2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * and a subsequent read will still return the peeked byte. 2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */ 2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class PeekableInputStream extends InputStream { 28b3f7dd0169a35221184b9327c8ce337b09dc6d1fMakoto Onuki private final InputStream mIn; 2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private boolean mPeeked; 3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project private int mPeekedByte; 3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public PeekableInputStream(InputStream in) { 3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project this.mIn = in; 3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project @Override 3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public int read() throws IOException { 3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (!mPeeked) { 3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return mIn.read(); 4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else { 4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project mPeeked = false; 4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return mPeekedByte; 4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public int peek() throws IOException { 4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (!mPeeked) { 4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project mPeekedByte = read(); 4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project mPeeked = true; 5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return mPeekedByte; 5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project @Override 5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public int read(byte[] b, int offset, int length) throws IOException { 5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (!mPeeked) { 5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return mIn.read(b, offset, length); 5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else { 5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project b[0] = (byte)mPeekedByte; 6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project mPeeked = false; 6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project int r = mIn.read(b, offset + 1, length - 1); 6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project if (r == -1) { 6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return 1; 6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } else { 6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return r + 1; 6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project @Override 7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public int read(byte[] b) throws IOException { 7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return read(b, 0, b.length); 7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project 75165e8bfe7a46564ea98bb16cb059102ba356a1b5Makoto Onuki @Override 7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project public String toString() { 7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project return String.format("PeekableInputStream(in=%s, peeked=%b, peekedByte=%d)", 7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project mIn.toString(), mPeeked, mPeekedByte); 7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project } 8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project} 81