001    /****************************************************************
002     * Licensed to the Apache Software Foundation (ASF) under one   *
003     * or more contributor license agreements.  See the NOTICE file *
004     * distributed with this work for additional information        *
005     * regarding copyright ownership.  The ASF licenses this file   *
006     * to you under the Apache License, Version 2.0 (the            *
007     * "License"); you may not use this file except in compliance   *
008     * with the License.  You may obtain a copy of the License at   *
009     *                                                              *
010     *   http://www.apache.org/licenses/LICENSE-2.0                 *
011     *                                                              *
012     * Unless required by applicable law or agreed to in writing,   *
013     * software distributed under the License is distributed on an  *
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
015     * KIND, either express or implied.  See the License for the    *
016     * specific language governing permissions and limitations      *
017     * under the License.                                           *
018     ****************************************************************/
019    
020    
021    package org.apache.james.mime4j.io;
022    
023    import java.io.FilterInputStream;
024    import java.io.InputStream;
025    import java.io.IOException;
026    
027    public class PositionInputStream extends FilterInputStream {
028    
029        protected long position = 0;
030        private long markedPosition = 0;
031    
032        public PositionInputStream(InputStream inputStream) {
033            super(inputStream);
034        }
035    
036        public long getPosition() {
037            return position;
038        }
039    
040        @Override
041        public int available() throws IOException {
042            return in.available();
043        }
044    
045        @Override
046        public int read() throws IOException {
047            int b = in.read();
048            if (b != -1)
049                position++;
050            return b;
051        }
052    
053        @Override
054        public void close() throws IOException {
055            in.close();
056        }
057    
058        @Override
059        public void reset() throws IOException {
060            in.reset();
061            position = markedPosition;
062        }
063    
064        @Override
065        public boolean markSupported() {
066            return in.markSupported();
067        }
068    
069        @Override
070        public void mark(int readlimit) {
071            in.mark(readlimit);
072            markedPosition = position;
073        }
074    
075        @Override
076        public long skip(long n) throws IOException {
077            final long c = in.skip(n);
078            if (c > 0) 
079                position += c;
080            return c;
081        }
082    
083        @Override
084        public int read(byte b[], int off, int len) throws IOException {
085            final int c = in.read(b, off, len);
086            if (c > 0) 
087                position += c;
088            return c;
089        }
090    
091    }