Author: toad
Date: 2006-03-11 22:24:48 +0000 (Sat, 11 Mar 2006)
New Revision: 8234
Added:
trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
Modified:
trunk/freenet/src/freenet/client/async/ManifestElement.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/ClientPutDiskDirMessage.java
trunk/freenet/src/freenet/node/fcp/FCPConnectionOutputHandler.java
Log:
529:
ClientPut*Dir now works, including Persistence=forever and
ListPersistentRequests.
(Incompatible with stored persistent putdir's from previous version.)
Modified: trunk/freenet/src/freenet/client/async/ManifestElement.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ManifestElement.java 2006-03-11
20:29:37 UTC (rev 8233)
+++ trunk/freenet/src/freenet/client/async/ManifestElement.java 2006-03-11
22:24:48 UTC (rev 8234)
@@ -10,22 +10,27 @@
/** Filename */
final String name;
- /** Data to be inserted */
+ /** Data to be inserted. Can be null, if the insert has completed. */
final Bucket data;
/** MIME type override. null => use default for filename */
final String mimeOverride;
- public ManifestElement(String name, Bucket data, String mimeOverride) {
+ /** Original size of the bucket. Can be set explicitly even if data ==
null. */
+ final long dataSize;
+
+ public ManifestElement(String name, Bucket data, String mimeOverride,
long size) {
this.name = name;
this.data = data;
this.mimeOverride = mimeOverride;
+ this.dataSize = size;
}
public ManifestElement(ManifestElement me, String fullName) {
this.name = fullName;
this.data = me.data;
this.mimeOverride = me.mimeOverride;
+ this.dataSize = me.dataSize;
}
public int hashCode() {
@@ -41,7 +46,8 @@
}
public void freeData() {
- data.free();
+ if(data != null)
+ data.free();
}
public String getName() {
@@ -55,4 +61,8 @@
public Bucket getData() {
return data;
}
+
+ public long getSize() {
+ return dataSize;
+ }
}
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-11 20:29:37 UTC (rev
8233)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-11 22:24:48 UTC (rev
8234)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 528;
+ private static final int buildNumber = 529;
/** 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-11 20:29:37 UTC (rev 8233)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java
2006-03-11 22:24:48 UTC (rev 8234)
@@ -155,7 +155,7 @@
convertFilesByNameToManifestElements(h,
manifests);
} else {
DirPutFile f = (DirPutFile) val;
- ManifestElement e = new ManifestElement(name,
f.getData(), f.getMIMEType());
+ ManifestElement e = new ManifestElement(name,
f.getData(), f.getMIMEType(), f.getData().size());
manifestElements.put(name, e);
}
}
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2006-03-11
20:29:37 UTC (rev 8233)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2006-03-11
22:24:48 UTC (rev 8234)
@@ -73,14 +73,18 @@
String uploadFrom = subset.get("UploadFrom");
Bucket data;
Logger.minor(this, "Parsing "+i);
+ long sz = Long.parseLong(subset.get("DataLength"));
if(uploadFrom == null ||
uploadFrom.equalsIgnoreCase("direct")) {
- // Direct (persistent temp bucket)
- byte[] key =
HexUtil.hexToBytes(subset.get("TempBucket.DecryptKey"));
- String fnam = subset.get("TempBucket.Filename");
- long sz =
Long.parseLong(subset.get("TempBucket.Size"));
- data =
client.server.node.persistentTempBucketFactory.registerEncryptedBucket(fnam,
key, sz);
- if(data.size() != sz)
- throw new
PersistenceParseException("Size of bucket is wrong: "+data.size()+" should be
"+sz);
+ if(!finished) {
+ // Direct (persistent temp bucket)
+ byte[] key =
HexUtil.hexToBytes(subset.get("TempBucket.DecryptKey"));
+ String fnam =
subset.get("TempBucket.Filename");
+ data =
client.server.node.persistentTempBucketFactory.registerEncryptedBucket(fnam,
key, sz);
+ if(data.size() != sz)
+ throw new
PersistenceParseException("Size of bucket is wrong: "+data.size()+" should be
"+sz);
+ } else {
+ data = null;
+ }
} else {
// Disk
String f = subset.get("Filename");
@@ -93,14 +97,15 @@
}
data = new FileBucket(ff, true, false, false,
false);
}
- ManifestElement me = new ManifestElement(name, data,
contentTypeOverride);
+ ManifestElement me = new ManifestElement(name, data,
contentTypeOverride, sz);
v.add(me);
}
manifestElements = SimpleManifestPutter.unflatten(v);
- SimpleManifestPutter p;
+ SimpleManifestPutter p = null;
try {
- p = new SimpleManifestPutter(this,
client.node.chkPutScheduler, client.node.sskPutScheduler,
- manifestElements, priorityClass, uri,
defaultName, ctx, getCHKOnly, client);
+ if(!finished)
+ p = new SimpleManifestPutter(this,
client.node.chkPutScheduler, client.node.sskPutScheduler,
+ manifestElements,
priorityClass, uri, defaultName, ctx, getCHKOnly, client);
} catch (InserterException e) {
onFailure(e, null);
p = null;
@@ -166,16 +171,18 @@
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());
- subset.put("TempBucket.Size",
Long.toString(bucket.size()));
} else {
throw new IllegalStateException("Don't know
what to do with bucket: "+data);
}
@@ -186,7 +193,8 @@
}
protected FCPMessage persistentTagMessage() {
- throw new UnsupportedOperationException();
+ return new PersistentPutDir(identifier, uri, verbosity,
priorityClass,
+ persistenceType, global, defaultName,
manifestElements);
}
protected String getTypeName() {
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDiskDirMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDiskDirMessage.java
2006-03-11 20:29:37 UTC (rev 8233)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDiskDirMessage.java
2006-03-11 22:24:48 UTC (rev 8234)
@@ -74,7 +74,7 @@
FileBucket bucket = new FileBucket(f, true,
false, false, false);
- ret.put(f.getName(), new
ManifestElement(f.getName(), bucket, null));
+ ret.put(f.getName(), new
ManifestElement(f.getName(), bucket, null, f.length()));
} else if(filelist[i].isDirectory()) {
HashMap subdir = makeBucketsByName(new
File(thisdir, filelist[i].getName()));
ret.put(filelist[i].getName(), subdir);
Modified: trunk/freenet/src/freenet/node/fcp/FCPConnectionOutputHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPConnectionOutputHandler.java
2006-03-11 20:29:37 UTC (rev 8233)
+++ trunk/freenet/src/freenet/node/fcp/FCPConnectionOutputHandler.java
2006-03-11 22:24:48 UTC (rev 8234)
@@ -25,7 +25,7 @@
} catch (IOException e) {
Logger.minor(this, "Caught "+e, e);
} catch (Throwable t) {
- Logger.minor(this, "Caught "+t, t);
+ Logger.error(this, "Caught "+t, t);
}
handler.close();
handler.closedOutput();
Added: trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java 2006-03-11
20:29:37 UTC (rev 8233)
+++ trunk/freenet/src/freenet/node/fcp/PersistentPutDir.java 2006-03-11
22:24:48 UTC (rev 8234)
@@ -0,0 +1,92 @@
+package freenet.node.fcp;
+
+import java.util.HashMap;
+
+import freenet.client.async.ManifestElement;
+import freenet.client.async.SimpleManifestPutter;
+import freenet.keys.FreenetURI;
+import freenet.node.Node;
+import freenet.support.Bucket;
+import freenet.support.PaddedEphemerallyEncryptedBucket;
+import freenet.support.SimpleFieldSet;
+import freenet.support.io.FileBucket;
+
+public class PersistentPutDir extends FCPMessage {
+
+ static final String name = "PersistentPutDir";
+
+ final String identifier;
+ final FreenetURI uri;
+ final int verbosity;
+ final short priorityClass;
+ final short persistenceType;
+ final boolean global;
+ private final HashMap manifestElements;
+ final String defaultName;
+
+ public PersistentPutDir(String identifier, FreenetURI uri, int
verbosity,
+ short priorityClass, short persistenceType, boolean
global,
+ String defaultName, HashMap manifestElements) {
+ this.identifier = identifier;
+ this.uri = uri;
+ this.verbosity = verbosity;
+ this.priorityClass = priorityClass;
+ this.persistenceType = persistenceType;
+ this.global = global;
+ this.defaultName = defaultName;
+ this.manifestElements = manifestElements;
+ }
+
+ public SimpleFieldSet getFieldSet() {
+ SimpleFieldSet fs = new SimpleFieldSet(true);
+ fs.put("Identifier", identifier);
+ fs.put("URI", uri.toString(false));
+ fs.put("Verbosity", Integer.toString(verbosity));
+ fs.put("PriorityClass", Short.toString(priorityClass));
+ fs.put("Persistence",
ClientRequest.persistenceTypeString(persistenceType));
+ fs.put("PriorityClass", Short.toString(priorityClass));
+ fs.put("Global", Boolean.toString(global));
+ SimpleFieldSet files = new SimpleFieldSet(true);
+ // Flatten the hierarchy, it can be reconstructed on restarting.
+ // Storing it directly would be a PITA.
+ ManifestElement[] elements =
SimpleManifestPutter.flatten(manifestElements);
+ fs.put("DefaultName", defaultName);
+ for(int i=0;i<elements.length;i++) {
+ String num = Integer.toString(i);
+ 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);
+ subset.put("DataLength", Long.toString(e.getSize()));
+ 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 ...
+ if(data instanceof FileBucket) {
+ subset.put("UploadFrom", "disk");
+ subset.put("Filename",
((FileBucket)data).getFile().getPath());
+ } else if(data instanceof
PaddedEphemerallyEncryptedBucket || data == null) {
+ subset.put("UploadFrom", "direct");
+ } else {
+ throw new IllegalStateException("Don't know
what to do with bucket: "+data);
+ }
+ files.put(num, subset);
+ }
+ fs.put("Files", files);
+ return fs;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void run(FCPConnectionHandler handler, Node node)
+ throws MessageInvalidException {
+ throw new
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, "PersistentPut
goes from server to client not the other way around", identifier);
+ }
+
+
+
+}