package com.limegroup.gnutella.archive; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; class UploadMonitorInputStream extends FilterInputStream { /* not sure if this class should really have references * to the contribution and the uploadEvent. this design * sort of screams out for another layer of indirection * but at least this class is only package visible */ private final AbstractContribution _uploadState; UploadMonitorInputStream(InputStream in, AbstractContribution uploadEvent) { super(in); _uploadState = uploadEvent; } public int read() throws InterruptedIOException, IOException { int result = super.read(); if (result != -1) { _uploadState.fileProgressedDelta( 1 ); } return result; } public int read(byte[] b) throws InterruptedIOException, IOException { int result = super.read(b); if (result != -1) { _uploadState.fileProgressedDelta( result ); } return result; } public int read(byte[] b, int off, int len) throws InterruptedIOException, IOException { int result = super.read(b, off, len); if (result != -1) { _uploadState.fileProgressedDelta( off + result ); } return result; } public long skip(long n) throws IOException { long result = super.skip( n ); _uploadState.fileProgressedDelta( result ); return result; } private long _markedPosition = 0; public void mark(int readlimit) { super.mark( readlimit ); _markedPosition = _uploadState.getFileBytesSent(); } public void reset() throws IOException { super.reset(); _uploadState.fileProgressed( _markedPosition ); } }