// 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.InputStream; import java.net.URLConnection; import java.util.Optional; import org.openstreetmap.josm.gui.progress.NullProgressMonitor; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.tools.CheckParameterUtil; /** * Read from an other reader and increment an progress counter while on the way. * @author Imi */ public class ProgressInputStream extends InputStream { private final StreamProgressUpdater updater; private final InputStream in; /** * Constructs a new {@code ProgressInputStream}. * * @param in the stream to monitor. Must not be null * @param size the total size which will be sent * @param progressMonitor the monitor to report to * @since 9172 */ public ProgressInputStream(InputStream in, long size, ProgressMonitor progressMonitor) { CheckParameterUtil.ensureParameterNotNull(in, "in"); this.updater = new StreamProgressUpdater(size, Optional.ofNullable(progressMonitor).orElse(NullProgressMonitor.INSTANCE), tr("Downloading data...")); this.in = in; } /** * Constructs a new {@code ProgressInputStream}. * * Will call {@link URLConnection#getInputStream()} to obtain the stream to monitor. * * @param con the connection to monitor * @param progressMonitor the monitor to report to * @throws OsmTransferException if any I/O error occurs */ public ProgressInputStream(URLConnection con, ProgressMonitor progressMonitor) throws OsmTransferException { if (progressMonitor == null) { progressMonitor = NullProgressMonitor.INSTANCE; } progressMonitor.beginTask(tr("Contacting OSM Server..."), 1); progressMonitor.indeterminateSubTask(null); try { this.in = con.getInputStream(); this.updater = new StreamProgressUpdater(con.getContentLength(), progressMonitor, tr("Downloading data...")); } catch (IOException e) { progressMonitor.finishTask(); if (con.getHeaderField("Error") != null) throw new OsmTransferException(tr(con.getHeaderField("Error")), e); throw new OsmTransferException(e); } } @Override public void close() throws IOException { try { in.close(); } finally { updater.finishTask(); } } @Override public int read(byte[] b, int off, int len) throws IOException { int read = in.read(b, off, len); if (read != -1) { updater.advanceTicker(read); } else { updater.finishTask(); } return read; } @Override public int read() throws IOException { int read = in.read(); if (read != -1) { updater.advanceTicker(1); } else { updater.finishTask(); } return read; } }