package bndtools.utils;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.core.runtime.IProgressMonitor;
public class ProgressReportingInputStream extends InputStream {
private final InputStream stream;
private final IProgressMonitor monitor;
/**
* Wrap an existing input stream with a progress-reporting input stream. Subsequently reading data from the wrapped
* stream will cause progress to be shown on the supplied progress monitor. NB: It is the caller's responsibility to
* call the {@code beginTask()} method of the progress monitor BEFORE any of the stream methods (e.g.
* {@code #read()} etc) are accessed.
*
* @param stream
* @param monitor
*/
public ProgressReportingInputStream(InputStream stream, IProgressMonitor monitor) {
this.stream = stream;
this.monitor = monitor;
}
@Override
public int read() throws IOException {
int result = stream.read();
if (result > 0)
monitor.worked(1);
return result;
}
@Override
public int read(byte[] b) throws IOException {
int result = stream.read(b);
if (result > 0)
monitor.worked(result);
return result;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
int result = stream.read(b, off, len);
if (result > 0)
monitor.worked(result);
return result;
}
@Override
public long skip(long n) throws IOException {
long result = stream.skip(n);
if (result > 0)
monitor.worked((int) result);
return result;
}
@Override
public int available() throws IOException {
return stream.available();
}
@Override
public void close() throws IOException {
stream.close();
monitor.done();
}
@Override
public synchronized void mark(int readlimit) {
stream.mark(readlimit);
}
@Override
public synchronized void reset() throws IOException {
stream.reset();
}
@Override
public boolean markSupported() {
return stream.markSupported();
}
}