/* * File : ProgressInputStream.java * Created : 04-jul-2002 13:48 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public class ProgressInputStream extends FilterInputStream{ private int nread; private int size; private boolean started; private List<ProgressInputStreamListener> listeners; private String name; public ProgressInputStream(InputStream in, int expectedLength, String name){ super(in); this.listeners = new ArrayList<ProgressInputStreamListener>(); this.name=name; started=false; nread=0; size=expectedLength; if(size<=0){ try { size = in.available(); } catch(IOException ioe){ size = 0; } } } public void addProgressInputStreamListener(ProgressInputStreamListener isl){ if(!listeners.contains(isl)){ listeners.add(isl); } } private void start(){ if(!started){ notifyListeners(MAX, size); notifyListeners(VALUE, 0); notifyListeners(START, 0); started=true; } } @Override public int read() throws IOException { if(!started) start(); int c = in.read(); if (c >= 0) notifyListeners(VALUE, size); return c; } @Override public int read(byte b[]) throws IOException { if(!started) start(); int nr = in.read(b); if (nr > 0) notifyListeners(VALUE, nread += nr); return nr; } @Override public int read(byte b[], int off, int len) throws IOException{ if(!started) start(); int nr = in.read(b, off, len); if (nr > 0) notifyListeners(VALUE, nread += nr); return nr; } @Override public long skip(long n) throws IOException { if(!started) start(); long nr = in.skip(n); if (nr > 0) notifyListeners(VALUE, nread += nr); return nr; } @Override public void close() throws IOException { if(!started) start(); in.close(); notifyListeners(END, 0); } @Override public synchronized void reset() throws IOException { if(!started) start(); in.reset(); nread = size - in.available(); notifyListeners(VALUE, nread); } protected static final int MAX=0, VALUE=1, START=2, END=3; private void notifyListeners(int action, int value){ for (ProgressInputStreamListener isl : listeners) { switch(action){ case MAX: isl.setProgressMax(value); break; case VALUE: isl.setProgressValue(value); break; case START: isl.startProgress(name); break; case END: isl.endProgress(); break; default: break; } } } public interface ProgressInputStreamListener { void setProgressMax(int max); void setProgressValue(int value); void startProgress(String strName); void endProgress(); } }