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


Reply via email to