package freenet.clients.http; /** An fproxy fetch which is stalled waiting for either the data or a progress screen. */ public class FProxyFetchWaiter { public FProxyFetchWaiter(FProxyFetchInProgress progress2) { this.progress = progress2; if(progress.finished()) finished = true; hasWaited = progress.hasWaited(); } final FProxyFetchInProgress progress; private boolean hasWaited; private boolean finished; private boolean awoken; public FProxyFetchResult getResult() { return getResult(false); } public FProxyFetchResult getResult(boolean waitForever) { boolean waited; synchronized(this) { if(waitForever) { // FIXME findbugs thinks this will never exit. It should given wakeUp(). while(!finished) { try { wait(); hasWaited = true; } catch (InterruptedException e) { // Ignore } } } else { /* Wait for 5 seconds or until something happens. The * most common something other than finishing is a callback * because the request has finished checking the datastore * and has been sent to the network, in which case we want * to show the progress bar. */ if(!(finished || hasWaited || awoken)) { awoken = false; try { wait(5000); } catch (InterruptedException e) { // Not likely } hasWaited = true; } } waited = hasWaited; } progress.setHasWaited(); return progress.innerGetResult(waited); } /** Returns the result, without waiting*/ public FProxyFetchResult getResultFast(){ return progress.innerGetResult(false); } public FProxyFetchInProgress getProgress() { return progress; } public void close() { progress.close(this); } public synchronized void wakeUp(boolean fin) { if(fin) this.finished = true; else this.awoken = true; notifyAll(); } public boolean hasWaited() { return hasWaited; } }