/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.api.gui.task;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.util.Objects;
import org.weasis.core.api.gui.util.GuiExecutor;
import org.weasis.core.api.media.data.Series;
import org.weasis.core.api.media.data.SeriesImporter;
import org.weasis.core.api.media.data.TagW;
import org.weasis.core.api.media.data.Thumbnail;
public class SeriesProgressMonitor extends FilterInputStream {
private static final String INTERUPTION_LABEL = "progress";//$NON-NLS-1$
protected final Series<?> series;
protected int nread = 0;
protected int size = 0;
public SeriesProgressMonitor(final Series<?> series, InputStream in) {
super(in);
this.series = Objects.requireNonNull(series);
try {
size = in.available();
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
protected boolean isLoadingSeriesCanceled() {
SeriesImporter loader = series.getSeriesLoader();
return loader == null || loader.isStopped();
}
protected void updateSeriesProgression(double addSize) {
series.setFileSize(series.getFileSize() + addSize);
GuiExecutor.instance().execute(() -> {
Thumbnail thumb = (Thumbnail) series.getTagValue(TagW.Thumbnail);
if (thumb != null) {
thumb.repaint();
}
});
}
@Override
public int read() throws IOException {
if (isLoadingSeriesCanceled()) {
InterruptedIOException exc = new InterruptedIOException(INTERUPTION_LABEL);
exc.bytesTransferred = nread;
series.setFileSize(series.getFileSize() - nread);
nread = 0;
throw exc;
}
int c = in.read();
if (c >= 0) {
nread++;
updateSeriesProgression(1.0);
}
return c;
}
@Override
public int read(byte[] b) throws IOException {
if (isLoadingSeriesCanceled()) {
InterruptedIOException exc = new InterruptedIOException(INTERUPTION_LABEL);
exc.bytesTransferred = nread;
series.setFileSize(series.getFileSize() - nread);
nread = 0;
throw exc;
}
int nr = in.read(b);
if (nr > 0) {
nread += nr;
updateSeriesProgression(nr);
}
return nr;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
if (isLoadingSeriesCanceled()) {
InterruptedIOException exc = new InterruptedIOException(INTERUPTION_LABEL);
exc.bytesTransferred = nread;
series.setFileSize(series.getFileSize() - nread);
nread = 0;
throw exc;
}
int nr = in.read(b, off, len);
if (nr > 0) {
nread += nr;
updateSeriesProgression(nr);
}
return nr;
}
@Override
public long skip(long n) throws IOException {
long nr = in.skip(n);
if (nr > 0) {
nread += nr;
updateSeriesProgression(nr);
}
return nr;
}
@Override
public synchronized void reset() throws IOException {
in.reset();
nread = size - in.available();
updateSeriesProgression(nread);
}
}