Home | History | Annotate | Download | only in util
      1 /****************************************************************
      2  * Licensed to the Apache Software Foundation (ASF) under one   *
      3  * or more contributor license agreements.  See the NOTICE file *
      4  * distributed with this work for additional information        *
      5  * regarding copyright ownership.  The ASF licenses this file   *
      6  * to you under the Apache License, Version 2.0 (the            *
      7  * "License"); you may not use this file except in compliance   *
      8  * with the License.  You may obtain a copy of the License at   *
      9  *                                                              *
     10  *   http://www.apache.org/licenses/LICENSE-2.0                 *
     11  *                                                              *
     12  * Unless required by applicable law or agreed to in writing,   *
     13  * software distributed under the License is distributed on an  *
     14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
     15  * KIND, either express or implied.  See the License for the    *
     16  * specific language governing permissions and limitations      *
     17  * under the License.                                           *
     18  ****************************************************************/
     19 
     20 
     21 package org.apache.james.mime4j.util;
     22 
     23 import java.io.InputStream;
     24 import java.io.IOException;
     25 
     26 public class PositionInputStream extends InputStream {
     27 
     28     private final InputStream inputStream;
     29     protected long position = 0;
     30     private long markedPosition = 0;
     31 
     32     public PositionInputStream(InputStream inputStream) {
     33         this.inputStream = inputStream;
     34     }
     35 
     36     public long getPosition() {
     37         return position;
     38     }
     39 
     40     public int available() throws IOException {
     41         return inputStream.available();
     42     }
     43 
     44     public int read() throws IOException {
     45         int b = inputStream.read();
     46         if (b != -1)
     47             position++;
     48         return b;
     49     }
     50 
     51     public void close() throws IOException {
     52         inputStream.close();
     53     }
     54 
     55     public void reset() throws IOException {
     56         inputStream.reset();
     57         position = markedPosition;
     58     }
     59 
     60     public boolean markSupported() {
     61         return inputStream.markSupported();
     62     }
     63 
     64     public void mark(int readlimit) {
     65         inputStream.mark(readlimit);
     66         markedPosition = position;
     67     }
     68 
     69     public long skip(long n) throws IOException {
     70         final long c = inputStream.skip(n);
     71         position += c;
     72         return c;
     73     }
     74 
     75     public int read(byte b[]) throws IOException {
     76         final int c = inputStream.read(b);
     77         position += c;
     78         return c;
     79     }
     80 
     81     public int read(byte b[], int off, int len) throws IOException {
     82         final int c = inputStream.read(b, off, len);
     83         position += c;
     84         return c;
     85     }
     86 
     87 }
     88