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


Reply via email to