14ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira/**************************************************************** 24ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Licensed to the Apache Software Foundation (ASF) under one * 34ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * or more contributor license agreements. See the NOTICE file * 44ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * distributed with this work for additional information * 54ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * regarding copyright ownership. The ASF licenses this file * 64ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * to you under the Apache License, Version 2.0 (the * 74ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * "License"); you may not use this file except in compliance * 84ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * with the License. You may obtain a copy of the License at * 94ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * * 104ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 * 114ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * * 124ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * Unless required by applicable law or agreed to in writing, * 134ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * software distributed under the License is distributed on an * 144ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * 154ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * KIND, either express or implied. See the License for the * 164ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * specific language governing permissions and limitations * 174ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira * under the License. * 184ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira ****************************************************************/ 194ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 204ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 214ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereirapackage org.apache.james.mime4j.util; 224ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 234ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.InputStream; 244ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereiraimport java.io.IOException; 254ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 264ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereirapublic class PositionInputStream extends InputStream { 274ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 284ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira private final InputStream inputStream; 294ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira protected long position = 0; 304ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira private long markedPosition = 0; 314ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 324ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public PositionInputStream(InputStream inputStream) { 334ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira this.inputStream = inputStream; 344ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 354ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 364ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public long getPosition() { 374ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return position; 384ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 394ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 404ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public int available() throws IOException { 414ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return inputStream.available(); 424ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 434ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 444ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public int read() throws IOException { 454ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira int b = inputStream.read(); 464ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira if (b != -1) 474ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira position++; 484ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return b; 494ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 504ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 514ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public void close() throws IOException { 524ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira inputStream.close(); 534ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 544ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 554ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public void reset() throws IOException { 564ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira inputStream.reset(); 574ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira position = markedPosition; 584ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 594ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 604ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public boolean markSupported() { 614ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return inputStream.markSupported(); 624ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 634ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 644ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public void mark(int readlimit) { 654ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira inputStream.mark(readlimit); 664ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira markedPosition = position; 674ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 684ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 694ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public long skip(long n) throws IOException { 704ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira final long c = inputStream.skip(n); 714ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira position += c; 724ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return c; 734ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 744ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 754ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public int read(byte b[]) throws IOException { 764ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira final int c = inputStream.read(b); 774ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira position += c; 784ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return c; 794ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 804ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 814ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira public int read(byte b[], int off, int len) throws IOException { 824ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira final int c = inputStream.read(b, off, len); 834ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira position += c; 844ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira return c; 854ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira } 864ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira 874ebb916ddca5f59d4f854f104fca0de6e0dda706Mindy Pereira} 88