// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.io;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.IOException;
import java.io.OutputStream;
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
/**
* An {@link OutputStream} which reports progress to the {@link ProgressMonitor}.
*
* @since 9185
*/
public class ProgressOutputStream extends OutputStream {
private final StreamProgressUpdater updater;
private final OutputStream out;
private final boolean finishOnClose;
/**
* Constructs a new {@code ProgressOutputStream}.
*
* @param out the stream to monitor
* @param size the total size which will be sent
* @param progressMonitor the monitor to report to
* @param finishOnClose whether to call {@link ProgressMonitor#finishTask} when this stream is closed
* @since 10302
*/
public ProgressOutputStream(OutputStream out, long size, ProgressMonitor progressMonitor, boolean finishOnClose) {
this.updater = new StreamProgressUpdater(size,
progressMonitor != null ? progressMonitor : NullProgressMonitor.INSTANCE, tr("Uploading data ..."));
this.out = out;
this.finishOnClose = finishOnClose;
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
updater.advanceTicker(len);
}
@Override
public void write(int b) throws IOException {
out.write(b);
updater.advanceTicker(1);
}
@Override
public void close() throws IOException {
try {
out.close();
} finally {
if (finishOnClose) {
updater.finishTask();
}
}
}
}