/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.client.async; import java.util.List; import freenet.client.ClientMetadata; import freenet.client.FetchException; import freenet.support.compress.Compressor; import freenet.client.InsertContext.CompatibilityMode; import freenet.crypt.HashResult; /** * Callback called when part of a get request completes - either with a * StreamGenerator full of data, or with an error. */ public interface GetCompletionCallback { public void onSuccess(StreamGenerator streamGenerator, ClientMetadata clientMetadata, List<? extends Compressor> decompressors, ClientGetState state, ClientContext context); public void onFailure(FetchException e, ClientGetState state, ClientContext context); /** Called when the ClientGetState knows that it knows about * all the blocks it will need to fetch. */ public void onBlockSetFinished(ClientGetState state, ClientContext context); /** Called when the ClientGetState handling the request yields control to another * ClientGetState. * @param oldState The old ClientGetState. * @param newState The new ClientGetState. * @param context The database handle. Must not be used by other threads. */ public void onTransition(ClientGetState oldState, ClientGetState newState, ClientContext context); /** Called when we know the size of the final data. Not the same as onExpectedTopSize(), * which is called for new metadata and gives more information. This might be called * much later on for older content. * @param size The expected size of the final data. * @param context Utility object containing helpers, mostly not persistent, such as the Ticker, temporary storage factories etc. */ public void onExpectedSize(long size, ClientContext context); /** * Called when we know the MIME type of the final data. Useful for e.g. determining whether it * is safe to handle etc, although the client can ask for the client layer to handle filtering. * @param metadata The MIME type, possibly including parameters, as a String. * E.g. "text/html; charset=ISO-8859-1". * @param context Utility object containing helpers, mostly not persistent, such as the Ticker, temporary storage factories etc. * @throws FetchException The callee can throw a FetchException to terminate the download e.g. * if they can't handle the MIME type. */ public void onExpectedMIME(ClientMetadata metadata, ClientContext context) throws FetchException; public void onFinalizedMetadata(); /** * Called when we know the size of the final file, and the number of blocks needed etc. For * recent metadata, this is known at the time of handling the top block. * @param size The final size of the data. * @param compressed The size of the data after compression / before decompression. * @param blocksReq The number of blocks needed to decode the file. * @param blocksTotal The total number of blocks available. * @param context Utility object containing helpers, mostly not persistent, such as the Ticker, temporary storage factories etc. */ public void onExpectedTopSize(long size, long compressed, int blocksReq, int blocksTotal, ClientContext context); /** * Called when we know the settings for the splitfile. * @param min The lowest CompatibilityMode that appears to be valid based on what we've fetched so far. * @param max The highest CompatibilityMode that appears to be valid based on what we've fetched so far. * @param customSplitfileKey The fixed byte[] encryption key used on insert. On anything recent, we generate a single key, randomly for an SSK, * or based on the content for a CHK, and use it for everything. This saves metadata space and improves security for SSKs. * @param compressed Whether the content is compressed. If false, the dontCompress option was used. * @param bottomLayer Whether this report originates at the bottom layer of the splitfile pyramid. I.e. the actual file, not the file containing * the metadata to fetch the file (this can recurse for several levels!) * @param definitiveAnyway Whether this report is definitive even though it's not from the bottom layer. This is true of recent splitfiles, * where we store all the data in the top key. * @param context Utility object containing helpers, mostly not persistent, such as the Ticker, temporary storage factories etc. */ public void onSplitfileCompatibilityMode(CompatibilityMode min, CompatibilityMode max, byte[] customSplitfileKey, boolean compressed, boolean bottomLayer, boolean definitiveAnyway, ClientContext context); /** * Called when we know the HashResult of the final file. This will be checked when we actually * fetch it, so is guaranteed to be correct. For recent metadata this is known at the top * layer/block. * @param hashes A set of hashes for the final file content. * @param context Utility object containing helpers, mostly not persistent, such as the Ticker, temporary storage factories etc. */ public void onHashes(HashResult[] hashes, ClientContext context); }