package freenet.client.async; import java.io.File; import java.io.FileDescriptor; import freenet.client.ClientMetadata; /** If a request will return the downloaded data to a file (not a temporary file), and if the data * doesn't need decompressing or filtering, and if we are doing the final stage of the download, we * can create a file in the same directory and use it for temporary storage, then when the download * completes call onSuccess(), which will check the hashes and then rename the file. * * This saves us a lot of copying, disk I/O and (peak) disk space. * * The ClientGetState calling the callback must only use this interface if it is the final fetch. * @author toad */ public interface FileGetCompletionCallback extends GetCompletionCallback { /** Get the final location of the downloaded data. If this returns non-null, the caller may * create a temporary file in the same directory and use it for e.g. storing the downloaded * splitfile blocks. When complete, the caller should truncate the file to the correct length, * and then call onSuccess(). * @return The final target File, or null if the download isn't to a (non-temporary) file, * the target file can't be used for temporary storage etc. The returned file must be absolute. */ public File getCompletionFile(); /** Call when the download has completed and the tempFile contains the downloaded data, but * may be too long. The callback must truncate the file, check the hashes on the file and * complete the request. * @param tempFile A file in the same directory as the completion file, containing the * downloaded data. * @param length The length of the downloaded data. * @param metadata The MIME type of the downloaded data. * @param state The calling ClientGetState. * @param context Contains run-time support structures such as executors, temporary storage * factories etc. Not static because we want to be able to run multiple nodes in one VM for * tests etc. */ public void onSuccess(File tempFile, long length, ClientMetadata metadata, ClientGetState state, ClientContext context); }