@Override public void onBlockSetFinished(ClientGetState state, ClientContext context) { if(wasFetchingFinalData) { rcb.onBlockSetFinished(SingleFileFetcher.this, context); } }
@Override public void onExpectedMIME(ClientMetadata metadata, ClientContext context) throws FetchException { cb.onExpectedMIME(metadata, context); }
@Override public void onExpectedSize(long size, ClientContext context) { rcb.onExpectedSize(size, context); }
rcb.onExpectedTopSize(metadata.topSize, metadata.topCompressedSize, metadata.topBlocksRequired, metadata.topBlocksTotal, context); topCompatibilityMode = metadata.getTopCompatibilityCode(); topDontCompress = metadata.getTopDontCompress(); rcb.onHashes(hashes, context); clientMetadata.mergeNoOverwrite(metadata.getClientMetadata()); String mime = clientMetadata.getMIMEType(); if(mime != null) rcb.onExpectedMIME(clientMetadata, context); if(metaStrings.isEmpty() && isFinal && clientMetadata.getMIMETypeNoParams() != null && ctx.allowedMIMETypes != null && !ctx.allowedMIMETypes.contains(clientMetadata.getMIMETypeNoParams())) { rcb.onExpectedMIME(clientMetadata, context); if(logMINOR) Logger.minor(this, "MIME type is "+clientMetadata); this.deleteFetchContext = false; if((redirectedKey instanceof ClientCHK) && !((ClientCHK)redirectedKey).isMetadata()) { rcb.onBlockSetFinished(this, context); byte [] redirectedCryptoKey = ((ClientCHK)redirectedKey).getCryptoKey(); if (key instanceof ClientCHK && !Arrays.equals( rcb.onSplitfileCompatibilityMode( metadata.getMinCompatMode(), metadata.getMaxCompatMode(), } else { if(clientMetadata != null && !clientMetadata.isTrivial()) rcb.onExpectedMIME(clientMetadata, context);
@Override public void onCancelled(ClientContext context) { cb.onFailure(new FetchException(FetchExceptionMode.CANCELLED, (String)null), null, context); }
@Override public void onFoundEdition(long l, USK newUSK, ClientContext context, boolean metadata, short codec, byte[] data, boolean newKnownGood, boolean newSlotToo) { if(l < usk.suggestedEdition && datastoreOnly) l = usk.suggestedEdition; ClientSSK key = usk.getSSK(l); try { if(l == usk.suggestedEdition) { SingleFileFetcher sf = new SingleFileFetcher(parent, cb, null, key, metaStrings, key.getURI().addMetaStrings(metaStrings), 0, ctx, false, realTimeFlag, actx, null, null, maxRetries, recursionLevel+1, dontTellClientGet, token, false, true, false, (short)0, context, false); if(tag != null) { cb.onTransition(tag, sf, context); } sf.schedule(context); } else { cb.onFailure(new FetchException(FetchExceptionMode.PERMANENT_REDIRECT, newUSK.getURI().addMetaStrings(metaStrings)), null, context); } } catch (FetchException e) { cb.onFailure(e, null, context); } }
@Override public void onResume(int succeededBlocks, int failedBlocks, ClientMetadata meta, long finalSize) { for(int i=0;i<succeededBlocks-1;i++) parent.completedBlock(true, context); if(succeededBlocks > 0) parent.completedBlock(false, context); for(int i=0;i<failedBlocks-1;i++) parent.failedBlock(true, context); if(failedBlocks > 0) parent.failedBlock(false, context); parent.blockSetFinalized(context); try { cb.onExpectedMIME(meta, context); } catch (FetchException e) { fail(e); return; } cb.onExpectedSize(finalSize, context); }
cb.onExpectedSize(eventualLength, context); if(metadata.uncompressedDataLength() > 0) cb.onFinalizedMetadata(); if(eventualLength > 0 && fetchContext.maxOutputLength > 0 && eventualLength > fetchContext.maxOutputLength) throw new FetchException(FetchExceptionMode.TOO_BIG, eventualLength, true, clientMetadata.getMIMEType());
@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 onSplitfileCompatibilityMode(CompatibilityMode min, CompatibilityMode max, byte[] splitfileKey, boolean dontCompress, boolean bottomLayer, boolean definitiveAnyway, ClientContext context) { // Pass through definitiveAnyway as the top block may include the details. // Hence we can get them straight away rather than waiting for the bottom layer. rcb.onSplitfileCompatibilityMode(min, max, splitfileKey, dontCompress, false, definitiveAnyway, context); }
@Override public void onExpectedTopSize(long size, long compressed, int blocksReq, int blocksTotal, ClientContext context) { cb.onExpectedTopSize(size, compressed, blocksReq, blocksTotal, context); }
@Override public void onFinalizedMetadata() { cb.onFinalizedMetadata(); }
@Override public void onHashes(HashResult[] hashes, ClientContext context) { cb.onHashes(hashes, context); }
@Override public void cancel(ClientContext context) { super.cancel(context); rcb.onFailure(new FetchException(FetchExceptionMode.CANCELLED), this, context); }
@Override public boolean run(ClientContext context) { rcb.onSuccess(new SingleFileStreamGenerator(result.asBucket(), persistent), result.getMetadata(), decompressors, SingleFileFetcher.this, context); return true; }
@Override public void onSplitfileCompatibilityMode(CompatibilityMode min, CompatibilityMode max, byte[] splitfileKey, boolean dontCompress, boolean bottomLayer, boolean definitiveAnyway, ClientContext context) { // This is fetching an archive, which may or may not contain the file we are looking for (it includes metadata). // So we are definitely not the bottom layer nor definitive. rcb.onSplitfileCompatibilityMode(min, max, splitfileKey, dontCompress, false, false, 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); }
cb.onSuccess(storage.streamGenerator(), storage.clientMetadata, storage.decompressors, this, context); storage.finishedFetcher();
@Override public void onSplitfileCompatibilityMode(CompatibilityMode min, CompatibilityMode max, byte[] customSplitfileKey, boolean compressed, boolean bottomLayer, boolean definitiveAnyway) { cb.onSplitfileCompatibilityMode(min, max, customSplitfileKey, compressed, bottomLayer, definitiveAnyway, context); }
@Override public void onExpectedSize(long size, ClientContext context) { rcb.onExpectedSize(size, context); }