Author: toad
Date: 2006-03-11 18:46:41 +0000 (Sat, 11 Mar 2006)
New Revision: 8232
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/DirectDirPutFile.java
trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
Log:
527:
Persistence for ClientPutDir - store works, restore not coded yet.
Persistent temp buckets always encrypted.
Numbers start at 0 on ClientPutComplexDir.
Modified: trunk/freenet/src/freenet/client/async/ManifestElement.java
===================================================================
--- trunk/freenet/src/freenet/client/async/ManifestElement.java 2006-03-11
17:57:47 UTC (rev 8231)
+++ trunk/freenet/src/freenet/client/async/ManifestElement.java 2006-03-11
18:46:41 UTC (rev 8232)
@@ -22,6 +22,12 @@
this.mimeOverride = mimeOverride;
}
+ public ManifestElement(ManifestElement me, String fullName) {
+ this.name = fullName;
+ this.data = me.data;
+ this.mimeOverride = me.mimeOverride;
+ }
+
public int hashCode() {
return name.hashCode();
}
@@ -37,4 +43,16 @@
public void freeData() {
data.free();
}
+
+ public String getName() {
+ return name;
+ }
+
+ public String getMimeTypeOverride() {
+ return mimeOverride;
+ }
+
+ public Bucket getData() {
+ return data;
+ }
}
Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-03-11 17:57:47 UTC (rev 8231)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
2006-03-11 18:46:41 UTC (rev 8232)
@@ -4,6 +4,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.Vector;
import freenet.client.ClientMetadata;
import freenet.client.DefaultMIMETypes;
@@ -386,4 +387,30 @@
return manifestEntries;
}
+ /**
+ * Convert a hierarchy of HashMap's of ManifestEntries into a series of
+ * ManifestElement's, each of which has a full path.
+ */
+ public static ManifestElement[] flatten(HashMap manifestElements) {
+ Vector v = new Vector();
+ flatten(manifestElements, v, "");
+ return (ManifestElement[]) v.toArray(new
ManifestElement[v.size()]);
+ }
+
+ public static void flatten(HashMap manifestElements, Vector v, String
prefix) {
+ Iterator i = manifestElements.keySet().iterator();
+ while(i.hasNext()) {
+ String name = (String) i.next();
+ String fullName = prefix.length() == 0 ? name :
prefix+"/"+name;
+ Object o = manifestElements.get(name);
+ if(o instanceof HashMap) {
+ flatten((HashMap)o, v, fullName);
+ } else if(o instanceof ManifestElement) {
+ ManifestElement me = (ManifestElement) o;
+ v.add(new ManifestElement(me, fullName));
+ } else
+ throw new
IllegalStateException(String.valueOf(o));
+ }
+ }
+
}
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-03-11 17:57:47 UTC (rev
8231)
+++ trunk/freenet/src/freenet/node/Version.java 2006-03-11 18:46:41 UTC (rev
8232)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 526;
+ private static final int buildNumber = 527;
/** 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 17:57:47 UTC (rev 8231)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutComplexDirMessage.java
2006-03-11 18:46:41 UTC (rev 8232)
@@ -16,22 +16,22 @@
/**
* ClientPutComplexDir
* < ... standard ClientPutDir headers ... >
- * Files.1.Name=hello.txt
- * Files.1.UploadFrom=direct
- * Files.1.Metadata.ContentType=text/plain
- * Files.1.DataLength=6
+ * Files.0.Name=hello.txt
+ * Files.0.UploadFrom=direct
+ * Files.0.Metadata.ContentType=text/plain
+ * Files.0.DataLength=6
* ( upload the 6 bytes following this message as hello.txt, type plain text)
- * Files.2.Name=something.pdf
- * Files.2.UploadFrom=disk
- * Files.2.Filename=something.pdf
+ * Files.1.Name=something.pdf
+ * Files.1.UploadFrom=disk
+ * Files.1.Filename=something.pdf
* ( upload something.pdf, guess the mime type from the filename )
- * Files.3.Name=toad.jpeg
- * Files.3.UploadFrom=redirect
- * Files.3.TargetURI=CHK at ...,...,...
- * Files.3.Metadata.ContentType=image/jpeg
+ * Files.2.Name=toad.jpeg
+ * Files.2.UploadFrom=redirect
+ * Files.2.TargetURI=CHK at ...,...,...
+ * Files.2.Metadata.ContentType=image/jpeg
* ( not yet supported, but would be really useful! FIXME ! )
* (note that the Files.x must always be a decimal integer. We use these for
sort
- * order for UploadFrom=direct. they must be sequential and start at 1).
+ * order for UploadFrom=direct. they must be sequential and start at 0).
* ...
* End
* <data from above direct uploads, ***in alphabetical order***>
@@ -56,7 +56,7 @@
SimpleFieldSet files = fs.subset("Files");
if(files == null)
throw new
MessageInvalidException(ProtocolErrorMessage.MISSING_FIELD, "Missing Files
section", identifier);
- for(int i=1;;i++) {
+ for(int i=0;;i++) {
String name = Integer.toString(i);
SimpleFieldSet subset = files.subset(name);
if(subset == null) break;
Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2006-03-11
17:57:47 UTC (rev 8231)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java 2006-03-11
18:46:41 UTC (rev 8232)
@@ -19,7 +19,11 @@
import freenet.client.events.ClientEventListener;
import freenet.client.events.SimpleEventProducer;
import freenet.keys.FreenetURI;
+import freenet.support.Bucket;
+import freenet.support.HexUtil;
+import freenet.support.PaddedEphemerallyEncryptedBucket;
import freenet.support.SimpleFieldSet;
+import freenet.support.io.FileBucket;
public class ClientPutDir extends ClientPutBase implements
ClientEventListener, ClientCallback {
@@ -83,7 +87,40 @@
}
public SimpleFieldSet getFieldSet() {
- throw new UnsupportedOperationException();
+ SimpleFieldSet fs = super.getFieldSet();
+ // Translate manifestElements directly into a fieldset
+ 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);
+ 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);
+ 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) {
+ // 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);
+ }
+ files.put(num, subset);
+ }
+ fs.put("Files", files);
+ return fs;
}
protected FCPMessage persistentTagMessage() {
Modified: trunk/freenet/src/freenet/node/fcp/DirectDirPutFile.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/DirectDirPutFile.java 2006-03-11
17:57:47 UTC (rev 8231)
+++ trunk/freenet/src/freenet/node/fcp/DirectDirPutFile.java 2006-03-11
18:46:41 UTC (rev 8232)
@@ -8,6 +8,7 @@
import freenet.support.BucketFactory;
import freenet.support.BucketTools;
import freenet.support.SimpleFieldSet;
+import freenet.support.io.PersistentTempBucketFactory;
/**
* Specialized DirPutFile for direct uploads.
Modified: trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
2006-03-11 17:57:47 UTC (rev 8231)
+++ trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
2006-03-11 18:46:41 UTC (rev 8232)
@@ -90,10 +90,15 @@
}
}
- public Bucket makeBucket(long size) throws IOException {
+ public Bucket makeRawBucket(long size) throws IOException {
return new FileBucket(fg.makeRandomFilename(), false, false,
false, true);
}
+ public Bucket makeBucket(long size) throws IOException {
+ Bucket b = makeRawBucket(size);
+ return new PaddedEphemerallyEncryptedBucket(b, 1024, rand,
false);
+ }
+
public Bucket makeEncryptedBucket() throws IOException {
Bucket b = makeBucket(-1);
return new PaddedEphemerallyEncryptedBucket(b, 1024, rand,
false);