package freenet.client.async; import java.io.IOException; import java.util.Random; import freenet.node.KeysFetchingLocally; public class SplitFileFetcherSegmentBlockChooser extends CooldownBlockChooser { public SplitFileFetcherSegmentBlockChooser(int blocks, Random random, int maxRetries, int cooldownTries, long cooldownTime, SplitFileFetcherSegmentStorage segment, KeysFetchingLocally keysFetching, int ignoreLastBlock) { super(blocks, random, maxRetries, cooldownTries, cooldownTime); this.segment = segment; this.keysFetching = keysFetching; this.ignoreLastBlock = ignoreLastBlock; } private final SplitFileFetcherSegmentStorage segment; private final KeysFetchingLocally keysFetching; private final int ignoreLastBlock; @Override protected boolean checkValid(int chosen) { if(!super.checkValid(chosen)) return false; if(chosen == ignoreLastBlock) return false; try { SplitFileSegmentKeys keys = segment.getSegmentKeys(); if(keysFetching.hasKey(keys.getNodeKey(chosen, null, false), segment.parent.fetcher.getSendableGet())) return false; return true; } catch (final IOException e) { segment.parent.jobRunner.queueNormalOrDrop(new PersistentJob() { @Override public boolean run(ClientContext context) { segment.parent.failOnDiskError(e); return true; } }); return false; } } }