package freenet.client.async; import freenet.keys.Key; import freenet.keys.KeyBlock; import freenet.keys.NodeSSK; import freenet.node.LowLevelGetException; import freenet.node.SendableGet; import freenet.support.Logger; public class SingleKeyListener implements KeyListener { private final Key key; private final BaseSingleFileFetcher fetcher; private boolean done; private short prio; private final boolean persistent; public SingleKeyListener(Key key, BaseSingleFileFetcher fetcher, short prio, boolean persistent) { this.key = key; this.fetcher = fetcher; this.prio = prio; this.persistent = persistent; } @Override public long countKeys() { if(done) return 0; else return 1; } @Override public short definitelyWantKey(Key key, byte[] saltedKey, ClientContext context) { if(!key.equals(this.key)) return -1; else return prio; } @Override public HasKeyListener getHasKeyListener() { return fetcher; } @Override public short getPriorityClass() { return prio; } @Override public SendableGet[] getRequestsForKey(Key key, byte[] saltedKey, ClientContext context) { if(!key.equals(this.key)) return null; return new SendableGet[] { fetcher }; } @Override public boolean handleBlock(Key key, byte[] saltedKey, KeyBlock found, ClientContext context) { if(!key.equals(this.key)) return false; try { fetcher.onGotKey(key, found, context); } catch (Throwable t) { Logger.error(this, "Failed: "+t, t); fetcher.onFailure(new LowLevelGetException(LowLevelGetException.INTERNAL_ERROR), null, context); } synchronized(this) { done = true; } return true; } @Override public boolean persistent() { return persistent; } @Override public boolean probablyWantKey(Key key, byte[] saltedKey) { if(done) return false; return key.equals(this.key); } @Override public synchronized void onRemove() { done = true; } @Override public boolean isEmpty() { return done; } @Override public boolean isSSK() { return key instanceof NodeSSK; } }