package freenet.clients.fcp;
import java.io.File;
import java.util.Date;
import freenet.client.FetchException;
import freenet.client.FetchException.FetchExceptionMode;
import freenet.client.InsertContext;
import freenet.client.InsertContext.CompatibilityMode;
import freenet.clients.fcp.ClientRequest.Persistence;
import freenet.keys.FreenetURI;
import freenet.support.Logger;
import freenet.support.api.Bucket;
/** Cached status of a download of a file i.e. a ClientGet */
public class DownloadRequestStatus extends RequestStatus {
private FetchExceptionMode failureCode;
private String failureReasonShort;
private String failureReasonLong;
// These can be guesses
private String mimeType;
private long dataSize;
// Null = to temp space
private final File destFilename;
private CompatibilityMode[] detectedCompatModes;
private byte[] detectedSplitfileKey;
private FreenetURI uri;
boolean filterData;
Bucket dataShadow;
public final boolean overriddenDataType;
private boolean detectedDontCompress;
synchronized void setFinished(boolean success, long dataSize, String mimeType,
FetchExceptionMode failureCode, String failureReasonLong, String failureReasonShort, Bucket dataShadow, boolean filtered) {
setFinished(success);
if(mimeType == null && (failureCode == FetchExceptionMode.CONTENT_VALIDATION_UNKNOWN_MIME || failureCode == FetchExceptionMode.CONTENT_VALIDATION_BAD_MIME)) {
Logger.error(this, "MIME type is null but failure code is "+FetchException.getMessage(failureCode)+" for "+getIdentifier()+" : "+uri, new Exception("error"));
}
this.dataSize = dataSize;
this.mimeType = mimeType;
this.failureCode = failureCode;
this.failureReasonLong = failureReasonLong;
this.failureReasonShort = failureReasonShort;
this.dataShadow = dataShadow;
this.filterData = filtered;
}
DownloadRequestStatus(String identifier, Persistence persistence, boolean started, boolean finished,
boolean success, int total, int min, int fetched, Date latestSuccess, int fatal,
int failed, Date latestFailure, boolean totalFinalized, short prio,
// all above these passed to parent
FetchExceptionMode failureCode, String mime, long size, File dest,
CompatibilityMode[] compat, byte[] splitfileKey, FreenetURI uri, String failureReasonShort, String failureReasonLong, boolean overriddenDataType, Bucket dataShadow, boolean filterData, boolean dontCompress) {
super(identifier, persistence, started, finished, success, total, min, fetched,
latestSuccess, fatal, failed, latestFailure, totalFinalized, prio);
if(mime == null && (failureCode == FetchExceptionMode.CONTENT_VALIDATION_UNKNOWN_MIME || failureCode == FetchExceptionMode.CONTENT_VALIDATION_BAD_MIME)) {
Logger.error(this, "MIME type is null but failure code is "+FetchException.getMessage(failureCode)+" for "+identifier+" : "+uri, new Exception("error"));
}
this.overriddenDataType = overriddenDataType;
this.failureCode = failureCode;
this.mimeType = mime;
this.dataSize = size;
this.destFilename = dest;
this.detectedCompatModes = compat;
this.detectedSplitfileKey = splitfileKey;
this.uri = uri;
this.failureReasonShort = failureReasonShort;
this.failureReasonLong = failureReasonLong;
this.dataShadow = dataShadow;
this.filterData = filterData;
this.detectedDontCompress = dontCompress;
}
public final boolean toTempSpace() {
return destFilename == null;
}
public FetchExceptionMode getFailureCode() {
return failureCode;
}
public String getMIMEType() {
return mimeType;
}
@Override
public long getDataSize() {
return dataSize;
}
public File getDestFilename() {
return destFilename;
}
public CompatibilityMode[] getCompatibilityMode() {
return detectedCompatModes;
}
public byte[] getOverriddenSplitfileCryptoKey() {
return detectedSplitfileKey;
}
@Override
public FreenetURI getURI() {
return uri;
}
@Override
public String getFailureReason(boolean longDescription) {
if(longDescription)
return failureReasonLong;
else
return failureReasonShort;
}
synchronized void updateDetectedCompatModes(
InsertContext.CompatibilityMode[] compatModes, boolean dontCompress) {
this.detectedCompatModes = compatModes;
this.detectedDontCompress = dontCompress;
}
synchronized void updateDetectedSplitfileKey(byte[] splitfileKey) {
this.detectedSplitfileKey = splitfileKey;
}
synchronized void updateExpectedMIME(String foundDataMimeType) {
this.mimeType = foundDataMimeType;
}
synchronized void updateExpectedDataLength(long dataLength) {
this.dataSize = dataLength;
}
public synchronized Bucket getDataShadow() {
return dataShadow;
}
synchronized void redirect(FreenetURI redirect) {
this.uri = redirect;
}
public synchronized boolean detectedDontCompress() {
return detectedDontCompress;
}
@Override
public String getPreferredFilename() {
if(destFilename != null)
return destFilename.getName();
if(uri != null &&
(uri.hasMetaStrings() || uri.getDocName() != null))
return uri.getPreferredFilename();
return null;
}
}