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;