package freenet.client.async; import freenet.keys.Key; import freenet.keys.KeyBlock; import freenet.node.SendableGet; /** * Transient object created on startup for persistent requests (or at creation * time for non-persistent requests), to monitor the stream of successfully * fetched keys. If a key appears interesting, we schedule a job on the database * thread to double-check and process the data if we still want it. * @author Matthew Toseland <toad@amphibian.dyndns.org> (0xE43DA450) * * saltedKey is the routing key from the key, salted globally (concat a global * salt value and then SHA) in order to save some cycles. Implementations that * use two internal bloom filters may need to have an additional local salt, as * in SplitFileFetcherKeyListener. */ public interface KeyListener { /** * Fast guess at whether we want a key or not. Usually implemented by a * bloom filter. * LOCKING: Should avoid external locking if possible. Will be called * within the CRSBase lock. * @return True if we probably want the key. False if we definitely don't * want it. */ public boolean probablyWantKey(Key key, byte[] saltedKey); /** * Do we want the key? This is called by the ULPR code, because fetching the * key will involve significant work. tripPendingKey() on the other hand * will go straight to handleBlock(). * @return -1 if we don't want the key, otherwise the priority of the request * interested in the key. */ public short definitelyWantKey(Key key, byte[] saltedKey, ClientContext context); /** * Find the requests related to a specific key, used in retrying after cooldown. * Caller should call probablyWantKey() first. */ public SendableGet[] getRequestsForKey(Key key, byte[] saltedKey, ClientContext context); /** * Handle the found data, if we really want it. */ public boolean handleBlock(Key key, byte[] saltedKey, KeyBlock found, ClientContext context); /** * Is this related to a persistent request? */ boolean persistent(); /** * Priority of the associated request. * LOCKING: Should avoid external locking if possible. Will be called * within the CRSBase lock. */ short getPriorityClass(); public long countKeys(); /** * @return The parent HasKeyListener. This does mean it will be pinned in * RAM, but it can be deactivated so it's not a big deal. * LOCKING: Should avoid external locking if possible. Will be called * within the CRSBase lock. */ public HasKeyListener getHasKeyListener(); /** * Deactivate the request once it has been removed. */ public void onRemove(); /** * Has the request finished? If every key has been found, or enough keys have * been found, return true so that the caller can remove it from the list. */ public boolean isEmpty(); public boolean isSSK(); }