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);


Reply via email to