Author: toad
Date: 2006-03-24 16:35:55 +0000 (Fri, 24 Mar 2006)
New Revision: 8297

Added:
   trunk/freenet/src/freenet/client/async/USKCallback.java
Modified:
   trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/USKFetcher.java
   trunk/freenet/src/freenet/client/async/USKFetcherCallback.java
   trunk/freenet/src/freenet/client/async/USKManager.java
   trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
   trunk/freenet/src/freenet/node/Version.java
Log:
560:
USK subscription.
Also NOT_ENOUGH_METASTRINGS handling in fproxy.

Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2006-03-24 15:50:24 UTC (rev 8296)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2006-03-24 16:35:55 UTC (rev 8297)
@@ -535,9 +535,9 @@
                                                        metaStrings, ctx, actx, 
maxRetries, recursionLevel, dontTellClientGet,
                                                        token, false, 
returnBucket);
                                sf.schedule();
-                               // Background fetch
-                               USKFetcher fetcher =
-                                       ctx.uskManager.getFetcher(usk, ctx, 
parent);
+//                             // Background fetch
+//                             USKFetcher fetcher =
+//                                     ctx.uskManager.getFetcher(usk, ctx, 
parent);
                                return sf;
                        } else {
                                cb.onFailure(new 
FetchException(FetchException.PERMANENT_REDIRECT, 
usk.copy(edition).getURI().addMetaStrings(metaStrings)), null);
@@ -584,7 +584,7 @@
                        this.returnBucket = returnBucket;
                }

-               public void onFoundEdition(long l) {
+               public void onFoundEdition(long l, USK usk) {
                        ClientSSK key = usk.getSSK(l);
                        try {
                                if(l == Math.abs(usk.suggestedEdition)) {

Added: trunk/freenet/src/freenet/client/async/USKCallback.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKCallback.java     2006-03-24 
15:50:24 UTC (rev 8296)
+++ trunk/freenet/src/freenet/client/async/USKCallback.java     2006-03-24 
16:35:55 UTC (rev 8297)
@@ -0,0 +1,16 @@
+package freenet.client.async;
+
+import freenet.keys.USK;
+
+/**
+ * USK callback interface. Used for subscriptions to the USKManager,
+ * and extended for USKFetcher callers.
+ */
+public interface USKCallback {
+
+       /** Found the latest edition.
+        * @param l The edition number.
+        * @param key The key. */
+       void onFoundEdition(long l, USK key);
+       
+}

Modified: trunk/freenet/src/freenet/client/async/USKFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcher.java      2006-03-24 
15:50:24 UTC (rev 8296)
+++ trunk/freenet/src/freenet/client/async/USKFetcher.java      2006-03-24 
16:35:55 UTC (rev 8297)
@@ -4,13 +4,9 @@
 import java.util.LinkedList;
 import java.util.Vector;

-import freenet.client.ArchiveContext;
-import freenet.client.ClientMetadata;
-import freenet.client.FetchException;
 import freenet.client.FetcherContext;
 import freenet.keys.FreenetURI;
 import freenet.keys.USK;
-import freenet.support.Bucket;
 import freenet.support.Logger;

 /**
@@ -188,7 +184,7 @@
                        cb = (USKFetcherCallback[]) callbacks.toArray(new 
USKFetcherCallback[callbacks.size()]);
                }
                for(int i=0;i<cb.length;i++)
-                       cb[i].onFoundEdition(ed);
+                       cb[i].onFoundEdition(ed, origUSK.copy(ed));
        }

        void onSuccess(USKAttempt att, boolean dontUpdate) {

Modified: trunk/freenet/src/freenet/client/async/USKFetcherCallback.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKFetcherCallback.java      
2006-03-24 15:50:24 UTC (rev 8296)
+++ trunk/freenet/src/freenet/client/async/USKFetcherCallback.java      
2006-03-24 16:35:55 UTC (rev 8297)
@@ -5,11 +5,8 @@
  * USKManager.getFetcher, then register yourself on it as a listener, then you
  * must implement these callback methods.
  */
-public interface USKFetcherCallback {
+public interface USKFetcherCallback extends USKCallback {

-       /** Found the latest edition */
-       void onFoundEdition(long l);
-       
        /** Failed to find any edition at all (later than or equal to the 
specified hint) */
        void onFailure();


Modified: trunk/freenet/src/freenet/client/async/USKManager.java
===================================================================
--- trunk/freenet/src/freenet/client/async/USKManager.java      2006-03-24 
15:50:24 UTC (rev 8296)
+++ trunk/freenet/src/freenet/client/async/USKManager.java      2006-03-24 
16:35:55 UTC (rev 8297)
@@ -1,14 +1,9 @@
 package freenet.client.async;

 import java.util.HashMap;
-import java.util.LinkedList;

-import freenet.client.ArchiveContext;
-import freenet.client.ClientMetadata;
 import freenet.client.FetcherContext;
-import freenet.keys.ClientSSK;
 import freenet.keys.USK;
-import freenet.support.Bucket;
 import freenet.support.Logger;

 /**
@@ -20,6 +15,9 @@
        /** Latest version by blanked-edition-number USK */
        final HashMap latestVersionByClearUSK;

+       /** Subscribers by clear USK */
+       final HashMap subscribersByClearUSK;
+       
        /** USKFetcher's by USK. USK includes suggested edition number, so 
there is one
         * USKFetcher for each {USK, edition number}. */
        final HashMap fetchersByUSK;
@@ -29,6 +27,7 @@

        public USKManager() {
                latestVersionByClearUSK = new HashMap();
+               subscribersByClearUSK = new HashMap();
                fetchersByUSK = new HashMap();
                checkersByUSK = new HashMap();
        }
@@ -61,15 +60,39 @@
                fetchersByUSK.remove(u);
        }

-       synchronized void update(USK origUSK, long number) {
+       void update(USK origUSK, long number) {
                Logger.minor(this, "Updating "+origUSK.getURI()+" : "+number);
                USK clear = origUSK.clearCopy();
-               Long l = (Long) latestVersionByClearUSK.get(clear);
-               Logger.minor(this, "Old value: "+l);
-               if(!(l != null && l.longValue() > number)) {
-                       l = new Long(number);
-                       latestVersionByClearUSK.put(clear, l);
-                       Logger.minor(this, "Put "+number);
+               USKCallback[] callbacks;
+               synchronized(this) {
+                       Long l = (Long) latestVersionByClearUSK.get(clear);
+                       Logger.minor(this, "Old value: "+l);
+                       if(!(l != null && l.longValue() > number)) {
+                               l = new Long(number);
+                               latestVersionByClearUSK.put(clear, l);
+                               Logger.minor(this, "Put "+number);
+                       } else return;
+                       callbacks = (USKCallback[]) 
subscribersByClearUSK.get(clear);
                }
+               if(callbacks != null) {
+                       USK usk = origUSK.copy(number);
+                       for(int i=0;i<callbacks.length;i++)
+                               callbacks[i].onFoundEdition(number, usk);
+               }
        }
+       
+       /**
+        * Subscribe to a given USK. Callback will be notified when it is
+        * updated. Note that this does not imply that the USK will be
+        * checked on a regular basis!
+        */
+       public synchronized void subscribe(USK origUSK, USKCallback cb) {
+               USK clear = origUSK.clearCopy();
+               USKCallback[] callbacks = (USKCallback[]) 
subscribersByClearUSK.get(clear);
+               if(callbacks == null)
+                       callbacks = new USKCallback[1];
+               else
+                       callbacks = new USKCallback[callbacks.length+1];
+               callbacks[callbacks.length-1] = cb;
+       }
 }

Modified: trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FproxyToadlet.java   2006-03-24 
15:50:24 UTC (rev 8296)
+++ trunk/freenet/src/freenet/clients/http/FproxyToadlet.java   2006-03-24 
16:35:55 UTC (rev 8297)
@@ -28,6 +28,7 @@
 import freenet.support.HexUtil;
 import freenet.support.Logger;
 import freenet.support.MultiValueTable;
+import freenet.support.URLEncoder;

 public class FproxyToadlet extends Toadlet {

@@ -161,7 +162,9 @@
                } catch (FetchException e) {
                        String msg = e.getMessage();
                        String extra = "";
-                       if(e.newURI != null) {
+                       if(e.mode == FetchException.NOT_ENOUGH_METASTRINGS) {
+                               this.writePermanentRedirect(ctx, "Not enough 
meta-strings", "/" + URLEncoder.encode(key.toString(false)) + "/");
+                       } else if(e.newURI != null) {
                                this.writePermanentRedirect(ctx, msg, 
"/"+e.newURI.toString());
                        } else {
                                if(e.errorCodes != null)

Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-24 15:50:24 UTC (rev 
8296)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-24 16:35:55 UTC (rev 
8297)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 559;
+       private static final int buildNumber = 560;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 507;


Reply via email to