Author: toad
Date: 2008-02-02 23:05:43 +0000 (Sat, 02 Feb 2008)
New Revision: 17484

Modified:
   trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
   trunk/freenet/src/freenet/client/async/OfferedKeysList.java
Log:
Wire in OfferedKeysList.onFound().

Modified: trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-02-02 23:00:04 UTC (rev 17483)
+++ trunk/freenet/src/freenet/client/async/ClientRequestScheduler.java  
2008-02-02 23:05:43 UTC (rev 17484)
@@ -572,6 +572,11 @@
        }

        public void tripPendingKey(final KeyBlock block) {
+               if(offeredKeys != null) {
+                       for(int i=0;i<offeredKeys.length;i++) {
+                               offeredKeys[i].onFoundKey(block.getKey());
+                       }
+               }
                final Key key = block.getKey();
                final SendableGet[] gets;
                Object o;

Modified: trunk/freenet/src/freenet/client/async/OfferedKeysList.java
===================================================================
--- trunk/freenet/src/freenet/client/async/OfferedKeysList.java 2008-02-02 
23:00:04 UTC (rev 17483)
+++ trunk/freenet/src/freenet/client/async/OfferedKeysList.java 2008-02-02 
23:05:43 UTC (rev 17484)
@@ -3,11 +3,13 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.client.async;

+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Vector;

 import freenet.crypt.RandomSource;
 import freenet.keys.ClientKey;
+import freenet.keys.Key;
 import freenet.node.LowLevelGetException;
 import freenet.node.NodeClientCore;
 import freenet.node.RequestScheduler;
@@ -30,6 +32,7 @@
  */
 public class OfferedKeysList extends SendableRequest {

+       private final HashMap clientKeysByKey;
        private final HashSet keys;
        // FIXME is there any way to avoid the O(n) shuffling penalty here?
        private final Vector keysList;
@@ -41,15 +44,18 @@
        OfferedKeysList(NodeClientCore core, RandomSource random, short 
priorityClass) {
                this.keys = new HashSet();
                this.keysList = new Vector();
+               clientKeysByKey = new HashMap();
                this.random = random;
                this.priorityClass = priorityClass;
                this.core = core;
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
        }

-       /** Called when a key is found. */
-       public synchronized void onFoundKey(ClientKey key) {
+       /** Called when a key is found */
+       public synchronized void onFoundKey(Key key) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               ClientKey ck = (ClientKey) clientKeysByKey.remove(key);
+               if(ck == null) return;
                if(logMINOR) Logger.minor(this, "Found "+key+" , removing it");
                keys.remove(key);
                keysList.remove(key);
@@ -61,6 +67,7 @@
                if(logMINOR) Logger.minor(this, "No offers for "+key+" , 
removing it");
                keys.remove(key);
                keysList.remove(key);
+               clientKeysByKey.remove(key.getNodeKey());
        }

        public synchronized boolean isEmpty() {
@@ -75,9 +82,10 @@
        public Object chooseKey() {
                // Pick a random key
                if(keysList.isEmpty()) return null;
-               Object o = keysList.remove(random.nextInt(keysList.size()));
-               keys.remove(o);
-               return o;
+               ClientKey ck = (ClientKey) 
keysList.remove(random.nextInt(keysList.size()));
+               keys.remove(ck);
+               clientKeysByKey.remove(ck.getNodeKey());
+               return ck;
        }

        public Object getClient() {


Reply via email to