/* 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.io.Serializable; import java.util.List; import freenet.client.ClientMetadata; import freenet.client.FetchException; import freenet.client.FetchException.FetchExceptionMode; import freenet.client.InsertContext.CompatibilityMode; import freenet.crypt.HashResult; import freenet.keys.FreenetURI; import freenet.keys.USK; import freenet.support.compress.Compressor; /** * Passes everything through, except that is updates the lastKnownGood on the USKManager, * and has some code to handle new URIs. * @author toad * */ public class USKProxyCompletionCallback implements GetCompletionCallback, Serializable { private static final long serialVersionUID = 1L; final USK usk; final GetCompletionCallback cb; final boolean persistent; public USKProxyCompletionCallback(USK usk, GetCompletionCallback cb, boolean persistent) { this.usk = usk; this.cb = cb; this.persistent = persistent; } @Override public void onSuccess(StreamGenerator streamGenerator, ClientMetadata clientMetadata, List<? extends Compressor> decompressors, ClientGetState state, ClientContext context) { context.uskManager.updateKnownGood(usk, usk.suggestedEdition, context); cb.onSuccess(streamGenerator, clientMetadata, decompressors, state, context); } @Override public void onFailure(FetchException e, ClientGetState state, ClientContext context) { switch(e.mode) { case NOT_ENOUGH_PATH_COMPONENTS: case PERMANENT_REDIRECT: context.uskManager.updateKnownGood(usk, usk.suggestedEdition, context); } FreenetURI uri = e.newURI; if(uri != null) { // FIXME what are we doing here anyway? Document! uri = usk.turnMySSKIntoUSK(uri); e = new FetchException(e, uri); } cb.onFailure(e, state, context); } @Override public void onBlockSetFinished(ClientGetState state, ClientContext context) { cb.onBlockSetFinished(state, context); } @Override public void onTransition(ClientGetState oldState, ClientGetState newState, ClientContext context) { // Ignore } @Override public void onExpectedMIME(ClientMetadata metadata, ClientContext context) throws FetchException { cb.onExpectedMIME(metadata, context); } @Override public void onExpectedSize(long size, ClientContext context) { cb.onExpectedSize(size, context); } @Override public void onFinalizedMetadata() { cb.onFinalizedMetadata(); } @Override public void onExpectedTopSize(long size, long compressed, int blocksReq, int blocksTotal, ClientContext context) { cb.onExpectedTopSize(size, compressed, blocksReq, blocksTotal, context); } @Override public void onSplitfileCompatibilityMode(CompatibilityMode min, CompatibilityMode max, byte[] splitfileKey, boolean dontCompress, boolean bottomLayer, boolean definitiveAnyway, ClientContext context) { cb.onSplitfileCompatibilityMode(min, max, splitfileKey, dontCompress, bottomLayer, definitiveAnyway, context); } @Override public void onHashes(HashResult[] hashes, ClientContext context) { cb.onHashes(hashes, context); } }