Author: toad
Date: 2006-03-13 22:22:36 +0000 (Mon, 13 Mar 2006)
New Revision: 8242
Added:
trunk/freenet/src/freenet/node/fcp/RedirectDirPutFile.java
Modified:
trunk/freenet/src/freenet/client/async/ManifestElement.java
trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java
trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
trunk/freenet/src/freenet/node/fcp/DirPutFile.java
Log:
532:
ClientPutComplexDir: UploadFrom=redirect.
Modified: trunk/freenet/src/freenet/client/async/ManifestElement.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ManifestElement.java 2006-03-13
20:56:40 UTC (rev 8241)
+++ trunk/freenet/src/freenet/client/async/ManifestElement.java 2006-03-13
22:22:36 UTC (rev 8242)
@@ -1,5 +1,6 @@
package freenet.client.async;
+import freenet.keys.FreenetURI;
import freenet.support.Bucket;
/**
@@ -19,11 +20,15 @@
/** Original size of the bucket. Can be set explicitly even if data ==
null. */
final long dataSize;
+ /** Redirect target */
+ final FreenetURI targetURI;
+
public ManifestElement(String name, Bucket data, String mimeOverride,
long size) {
this.name = name;
this.data = data;
this.mimeOverride = mimeOverride;
this.dataSize = size;
+ this.targetURI = null;
}
public ManifestElement(ManifestElement me, String fullName) {
@@ -31,8 +36,17 @@
this.data = me.data;
this.mimeOverride = me.mimeOverride;
this.dataSize = me.dataSize;
+ this.targetURI = me.targetURI;
}
+ public ManifestElement(String name, FreenetURI targetURI, String
mimeOverride) {
+ this.name = name;
+ this.data = null;
+ this.mimeOverride = mimeOverride;
+ this.dataSize = -1;
+ this.targetURI = targetURI;
+ }
+
public int hashCode() {
return name.hashCode();
}
@@ -65,4 +79,8 @@
public long getSize() {
return dataSize;
}
+
+ public FreenetURI getTargetURI() {
+ return targetURI;
+ }
}
Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-03-13 20:56:40 UTC (rev 8241)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-03-13 22:22:36 UTC (rev 8242)
@@ -31,11 +31,22 @@
InsertBlock block =
new InsertBlock(data, cm,
FreenetURI.EMPTY_CHK_URI);
this.origSFI =
- new SingleFileInserter(this, this, block,
false, ctx, false, getCHKOnly, false);
+ new SingleFileInserter(this, this, block,
false, ctx, false, getCHKOnly, true);
currentState = origSFI;
metadata = null;
}
+ protected PutHandler(String name, FreenetURI target,
ClientMetadata cm) {
+ super(SimpleManifestPutter.this.getPriorityClass(),
SimpleManifestPutter.this.chkScheduler, SimpleManifestPutter.this.sskScheduler,
SimpleManifestPutter.this.client);
+ this.name = name;
+ this.cm = cm;
+ Metadata m = new Metadata(Metadata.SIMPLE_REDIRECT,
target, cm);
+ cm = null;
+ metadata = m.writeToByteArray();
+ origSFI = null;
+ currentState = null;
+ }
+
private SingleFileInserter origSFI;
private ClientPutState currentState;
private ClientMetadata cm;
@@ -44,6 +55,7 @@
private boolean finished;
public void start() throws InserterException {
+ if(origSFI == null && metadata != null) return;
origSFI.start();
origSFI = null;
}
@@ -198,7 +210,6 @@
makePutHandlers((HashMap)o, subMap);
} else {
ManifestElement element = (ManifestElement) o;
- Bucket data = element.data;
String mimeType = element.mimeOverride;
if(mimeType == null)
mimeType =
DefaultMIMETypes.guessMIMEType(name);
@@ -208,15 +219,21 @@
else
cm = new ClientMetadata(mimeType);
PutHandler ph;
- try {
- ph = new PutHandler(name, data, cm,
getCHKOnly);
- } catch (InserterException e) {
- cancelAndFinish();
- throw e;
+ Bucket data = element.data;
+ if(element.targetURI != null) {
+ ph = new PutHandler(name,
element.targetURI, cm);
+ // Just a placeholder, don't actually
run it
+ } else {
+ try {
+ ph = new PutHandler(name, data,
cm, getCHKOnly);
+ } catch (InserterException e) {
+ cancelAndFinish();
+ throw e;
+ }
+ runningPutHandlers.add(ph);
+ putHandlersWaitingForMetadata.add(ph);
}
putHandlersByName.put(name, ph);
- runningPutHandlers.add(ph);
- putHandlersWaitingForMetadata.add(ph);
}
}
}
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-13 20:56:40 UTC (rev
8241)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-13 22:22:36 UTC (rev
8242)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 531;
+ private static final int buildNumber = 532;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 507;
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java
2006-03-13 20:56:40 UTC (rev 8241)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java
2006-03-13 22:22:36 UTC (rev 8242)
@@ -155,7 +155,7 @@
convertFilesByNameToManifestElements(h,
manifests);
} else {
DirPutFile f = (DirPutFile) val;
- ManifestElement e = new ManifestElement(name,
f.getData(), f.getMIMEType(), f.getData().size());
+ ManifestElement e = f.getElement();
manifestElements.put(name, e);
}
}
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2006-03-13
20:56:40 UTC (rev 8241)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2006-03-13
22:22:36 UTC (rev 8242)
@@ -1,26 +1,17 @@
package freenet.node.fcp;
-import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
-import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
-import freenet.client.FetchException;
-import freenet.client.FetchResult;
-import freenet.client.InserterContext;
import freenet.client.InserterException;
-import freenet.client.async.BaseClientPutter;
import freenet.client.async.ClientCallback;
-import freenet.client.async.ClientGetter;
import freenet.client.async.ClientRequester;
import freenet.client.async.ManifestElement;
import freenet.client.async.SimpleManifestPutter;
-import freenet.client.events.ClientEvent;
import freenet.client.events.ClientEventListener;
-import freenet.client.events.SimpleEventProducer;
import freenet.keys.FreenetURI;
import freenet.support.Bucket;
import freenet.support.HexUtil;
@@ -164,27 +155,33 @@
ManifestElement e = elements[i];
String name = e.getName();
String mimeOverride = e.getMimeTypeOverride();
- Bucket data = e.getData();
SimpleFieldSet subset = new SimpleFieldSet(true);
subset.put("Name", name);
if(mimeOverride != null)
subset.put("Metadata.ContentType",
mimeOverride);
- // What to do with the bucket?
- // It is either a persistent encrypted bucket or a file
bucket ...
- subset.put("DataLength", Long.toString(e.getSize()));
- if(data instanceof FileBucket) {
- subset.put("UploadFrom", "disk");
- subset.put("Filename",
((FileBucket)data).getFile().getPath());
- } else if(finished) {
- subset.put("UploadFrom", "direct");
- } else if(data instanceof
PaddedEphemerallyEncryptedBucket) {
- subset.put("UploadFrom", "direct");
- // the bucket is a persistent encrypted temp
bucket
- PaddedEphemerallyEncryptedBucket bucket =
(PaddedEphemerallyEncryptedBucket) data;
- subset.put("TempBucket.DecryptKey",
HexUtil.bytesToHex(bucket.getKey()));
- subset.put("TempBucket.Filename",
((FileBucket)(bucket.getUnderlying())).getName());
+ FreenetURI target = e.getTargetURI();
+ if(target != null) {
+ subset.put("UploadFrom", "redirect");
+ subset.put("TargetURI", target.toString());
} else {
- throw new IllegalStateException("Don't know
what to do with bucket: "+data);
+ Bucket data = e.getData();
+ // What to do with the bucket?
+ // It is either a persistent encrypted bucket
or a file bucket ...
+ subset.put("DataLength",
Long.toString(e.getSize()));
+ if(data instanceof FileBucket) {
+ subset.put("UploadFrom", "disk");
+ subset.put("Filename",
((FileBucket)data).getFile().getPath());
+ } else if(finished) {
+ subset.put("UploadFrom", "direct");
+ } else if(data instanceof
PaddedEphemerallyEncryptedBucket) {
+ subset.put("UploadFrom", "direct");
+ // the bucket is a persistent encrypted
temp bucket
+ PaddedEphemerallyEncryptedBucket bucket
= (PaddedEphemerallyEncryptedBucket) data;
+ subset.put("TempBucket.DecryptKey",
HexUtil.bytesToHex(bucket.getKey()));
+ subset.put("TempBucket.Filename",
((FileBucket)(bucket.getUnderlying())).getName());
+ } else {
+ throw new IllegalStateException("Don't
know what to do with bucket: "+data);
+ }
}
files.put(num, subset);
}
Modified: trunk/freenet/src/freenet/node/fcp/DirPutFile.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/DirPutFile.java 2006-03-13 20:56:40 UTC
(rev 8241)
+++ trunk/freenet/src/freenet/node/fcp/DirPutFile.java 2006-03-13 22:22:36 UTC
(rev 8242)
@@ -2,6 +2,7 @@
import freenet.client.ClientMetadata;
import freenet.client.DefaultMIMETypes;
+import freenet.client.async.ManifestElement;
import freenet.support.Bucket;
import freenet.support.BucketFactory;
import freenet.support.SimpleFieldSet;
@@ -13,7 +14,7 @@
abstract class DirPutFile {
final String name;
- final ClientMetadata meta;
+ ClientMetadata meta;
public DirPutFile(SimpleFieldSet subset, String identifier) throws
MessageInvalidException {
this.name = subset.get("Name");
@@ -41,6 +42,8 @@
return new DirectDirPutFile(subset, identifier, bf);
} else if(type.equalsIgnoreCase("disk")) {
return new DiskDirPutFile(subset, identifier);
+ } else if(type.equalsIgnoreCase("redirect")) {
+ return new RedirectDirPutFile(subset, identifier);
} else {
throw new
MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "Unsupported or
unknown UploadFrom: "+type, identifier);
}
@@ -56,4 +59,8 @@
public abstract Bucket getData();
+ public ManifestElement getElement() {
+ return new ManifestElement(name, getData(), getMIMEType(),
getData().size());
+ }
+
}
Added: trunk/freenet/src/freenet/node/fcp/RedirectDirPutFile.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/RedirectDirPutFile.java 2006-03-13
20:56:40 UTC (rev 8241)
+++ trunk/freenet/src/freenet/node/fcp/RedirectDirPutFile.java 2006-03-13
22:22:36 UTC (rev 8242)
@@ -0,0 +1,39 @@
+package freenet.node.fcp;
+
+import java.net.MalformedURLException;
+
+import freenet.client.ClientMetadata;
+import freenet.client.Metadata;
+import freenet.client.async.ManifestElement;
+import freenet.keys.FreenetURI;
+import freenet.support.Bucket;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
+import freenet.support.SimpleReadOnlyArrayBucket;
+
+public class RedirectDirPutFile extends DirPutFile {
+
+ final FreenetURI targetURI;
+
+ public RedirectDirPutFile(SimpleFieldSet subset, String identifier)
throws MessageInvalidException {
+ super(subset, identifier);
+ String target = subset.get("TargetURI");
+ if(target == null)
+ throw new
MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "TargetURI missing
but UploadFrom=redirect", identifier);
+ try {
+ targetURI = new FreenetURI(target);
+ } catch (MalformedURLException e) {
+ throw new
MessageInvalidException(ProtocolErrorMessage.INVALID_FIELD, "Invalid TargetURI:
"+e, identifier);
+ }
+ Logger.minor(this, "targetURI = "+targetURI);
+ super.meta = new ClientMetadata();
+ }
+
+ public Bucket getData() {
+ return null;
+ }
+
+ public ManifestElement getElement() {
+ return new ManifestElement(name, targetURI, getMIMEType());
+ }
+}