package freenet.clients.http;
import freenet.client.FetchException;
import freenet.support.api.Bucket;
/** The result of fproxy waiting for a fetch: It can either be the final data, or it
* can be the progress of the fetch so far. This is a snapshot, so should be
* consistent but could be out of date: if the snapshot says it is in progress,
* it might actually be finished. Note that close() must be called when fproxy
* has finished with the data (and is the only method that actually calls back
* to the freenet.clients.http.FProxyFetchInProgress ).
* @author Matthew Toseland <toad@amphibian.dyndns.org> (0xE43DA450)
*/
public class FProxyFetchResult {
/** If we have fetched the data, we know this. If we haven't, we might know it. */
public final String mimeType;
/** If we have fetched the data, we know this. If we haven't, we might know it. */
public final long size;
/** If we have fetched the data */
final Bucket data;
/** If we have not fetched the data */
/** Creation time */
public final long timeStarted;
/** Gone to network? */
public final boolean goneToNetwork;
/** Total blocks */
public final int totalBlocks;
/** Required blocks */
public final int requiredBlocks;
/** Fetched blocks */
public final int fetchedBlocks;
/** Failed blocks */
public final int failedBlocks;
/** Fatally failed blocks */
public final int fatallyFailedBlocks;
/** Finalized blocks? */
public final boolean finalizedBlocks;
/** Number of times this has been used */
private int fetchedCount;
/** Failed */
public final FetchException failed;
final FProxyFetchInProgress progress;
final boolean hasWaited;
public final long eta;
/** At the time of creating the snapshot, has it finished? */
private final boolean finished;
/** Constructor when we are returning the data */
FProxyFetchResult(FProxyFetchInProgress parent, Bucket data, String mimeType, long timeStarted, boolean goneToNetwork, long eta, boolean hasWaited) {
assert(data != null);
this.data = data;
this.mimeType = mimeType;
this.size = data.size();
this.timeStarted = timeStarted;
this.goneToNetwork = goneToNetwork;
totalBlocks = requiredBlocks = fetchedBlocks = failedBlocks = fatallyFailedBlocks = 0;
finalizedBlocks = true;
failed = null;
this.progress = parent;
this.eta = eta;
this.hasWaited = hasWaited;
finished = true;
}
/** Constructor when we are not returning the data, because it is still running or it failed */
FProxyFetchResult(FProxyFetchInProgress parent, String mimeType, long size, long timeStarted, boolean goneToNetwork, int totalBlocks, int requiredBlocks, int fetchedBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedBlocks, FetchException failed, long eta, boolean hasWaited) {
this.data = null;
this.mimeType = mimeType;
this.size = size;
this.timeStarted = timeStarted;
this.goneToNetwork = goneToNetwork;
this.totalBlocks = totalBlocks;
this.requiredBlocks = requiredBlocks;
this.fetchedBlocks = fetchedBlocks;
this.failedBlocks = failedBlocks;
this.fatallyFailedBlocks = fatallyFailedBlocks;
this.finalizedBlocks = finalizedBlocks;
this.failed = failed;
this.progress = parent;
this.eta = eta;
this.hasWaited = hasWaited;
finished = (failed != null);
}
/** Must be called when fproxy has finished with the data */
public void close() {
progress.close(this);
}
public boolean hasData() {
return data != null;
}
public Bucket getData() {
return data;
}
public boolean hasWaited() {
return hasWaited;
}
public boolean isFinished(){
return finished;
}
public void setFetchCount(int fetched) {
this.fetchedCount = fetched;
}
public int getFetchCount() {
return fetchedCount;
}
}