Author: toad
Date: 2007-02-22 02:55:03 +0000 (Thu, 22 Feb 2007)
New Revision: 11900

Modified:
   trunk/freenet/src/freenet/client/Metadata.java
   trunk/freenet/src/freenet/client/async/SingleFileInserter.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
   trunk/freenet/src/freenet/client/async/SplitFileInserter.java
Log:
Specify the decompressedLength in splitfile metadata.
Note that this will change the CHK generated for a given file.
However old files remain fetchable.

Modified: trunk/freenet/src/freenet/client/Metadata.java
===================================================================
--- trunk/freenet/src/freenet/client/Metadata.java      2007-02-22 02:40:27 UTC 
(rev 11899)
+++ trunk/freenet/src/freenet/client/Metadata.java      2007-02-22 02:55:03 UTC 
(rev 11900)
@@ -545,7 +545,7 @@
        }

        public Metadata(short algo, ClientCHK[] dataURIs, ClientCHK[] 
checkURIs, int segmentSize, int checkSegmentSize, 
-                       ClientMetadata cm, long dataLength, short 
compressionAlgo, boolean isMetadata, boolean insertAsArchiveManifest) {
+                       ClientMetadata cm, long dataLength, short 
compressionAlgo, long decompressedLength, boolean isMetadata, boolean 
insertAsArchiveManifest) {
                if(isMetadata)
                        documentType = MULTI_LEVEL_METADATA;
                else {
@@ -562,6 +562,7 @@
                splitfileDataKeys = dataURIs;
                splitfileCheckKeys = checkURIs;
                clientMetadata = cm;
+               this.decompressedLength = decompressedLength;
                if(cm != null)
                        setMIMEType(cm.getMIMEType());
                else

Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2007-02-22 02:40:27 UTC (rev 11899)
+++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2007-02-22 02:55:03 UTC (rev 11900)
@@ -262,13 +262,13 @@
                // insert it. Then when the splitinserter has finished, and the
                // metadata insert has finished too, tell the master callback.
                if(reportMetadataOnly) {
-                       SplitFileInserter sfi = new SplitFileInserter(parent, 
cb, data, bestCodec, block.clientMetadata, ctx, getCHKOnly, metadata, token, 
insertAsArchiveManifest, false);
+                       SplitFileInserter sfi = new SplitFileInserter(parent, 
cb, data, bestCodec, origSize, block.clientMetadata, ctx, getCHKOnly, metadata, 
token, insertAsArchiveManifest, false);
                        cb.onTransition(this, sfi);
                        sfi.start();
                        if(earlyEncode) sfi.forceEncode();
                } else {
                        SplitHandler sh = new SplitHandler();
-                       SplitFileInserter sfi = new SplitFileInserter(parent, 
sh, data, bestCodec, block.clientMetadata, ctx, getCHKOnly, metadata, token, 
insertAsArchiveManifest, false);
+                       SplitFileInserter sfi = new SplitFileInserter(parent, 
sh, data, bestCodec, origSize, block.clientMetadata, ctx, getCHKOnly, metadata, 
token, insertAsArchiveManifest, false);
                        sh.sfi = sfi;
                        cb.onTransition(this, sh);
                        sfi.start();

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcher.java        
2007-02-22 02:40:27 UTC (rev 11899)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcher.java        
2007-02-22 02:55:03 UTC (rev 11900)
@@ -89,8 +89,9 @@
                        finalLength = overrideLength;
                }

-               if(overrideLength > 0 && newCtx.maxOutputLength > 0 && 
overrideLength > newCtx.maxOutputLength)
-                       throw new FetchException(FetchException.TOO_BIG, 
overrideLength, true, clientMetadata.getMIMEType());
+               long eventualLength = Math.max(overrideLength, 
metadata.uncompressedDataLength());
+               if(eventualLength > 0 && newCtx.maxOutputLength > 0 && 
eventualLength > newCtx.maxOutputLength)
+                       throw new FetchException(FetchException.TOO_BIG, 
eventualLength, true, clientMetadata.getMIMEType());

                if(splitfileType == Metadata.SPLITFILE_NONREDUNDANT) {
                        // Don't need to do much - just fetch everything and 
piece it together.

Modified: trunk/freenet/src/freenet/client/async/SplitFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileInserter.java       
2007-02-22 02:40:27 UTC (rev 11899)
+++ trunk/freenet/src/freenet/client/async/SplitFileInserter.java       
2007-02-22 02:55:03 UTC (rev 11900)
@@ -14,7 +14,6 @@
 import freenet.client.Metadata;
 import freenet.keys.CHKBlock;
 import freenet.keys.ClientCHK;
-import freenet.keys.FreenetURI;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
 import freenet.support.api.Bucket;
@@ -44,6 +43,7 @@
        public final Object token;
        final boolean insertAsArchiveManifest;
        private boolean forceEncode;
+       private final long decompressedLength;

        public SimpleFieldSet getProgressFieldset() {
                SimpleFieldSet fs = new SimpleFieldSet(false);
@@ -51,6 +51,7 @@
                // only save details of the request
                fs.putSingle("Type", "SplitFileInserter");
                fs.put("DataLength", dataLength);
+               fs.put("DecompressedLength", decompressedLength);
                fs.put("CompressionCodec", compressionCodec);
                fs.put("SplitfileCodec", splitfileAlgorithm);
                fs.put("Finished", finished);
@@ -65,7 +66,7 @@
                return fs;
        }

-       public SplitFileInserter(BaseClientPutter put, PutCompletionCallback 
cb, Bucket data, Compressor bestCodec, ClientMetadata clientMetadata, 
InserterContext ctx, boolean getCHKOnly, boolean isMetadata, Object token, 
boolean insertAsArchiveManifest, boolean freeData) throws InserterException {
+       public SplitFileInserter(BaseClientPutter put, PutCompletionCallback 
cb, Bucket data, Compressor bestCodec, long decompressedLength, ClientMetadata 
clientMetadata, InserterContext ctx, boolean getCHKOnly, boolean isMetadata, 
Object token, boolean insertAsArchiveManifest, boolean freeData) throws 
InserterException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                this.parent = put;
                this.insertAsArchiveManifest = insertAsArchiveManifest;
@@ -76,6 +77,7 @@
                this.getCHKOnly = getCHKOnly;
                this.cb = cb;
                this.ctx = ctx;
+               this.decompressedLength = decompressedLength;
                Bucket[] dataBuckets;
                try {
                        dataBuckets = BucketTools.split(data, 
CHKBlock.DATA_LENGTH, ctx.persistentBucketFactory);
@@ -121,6 +123,16 @@
                } catch (NumberFormatException e) {
                        throw new ResumeException("Corrupt DataLength: "+e+" : 
"+length);
                }
+               length = fs.get("DecompressedLength");
+               long dl = 0; // back compat
+               if(length != null) {
+                       try {
+                               dl = Long.parseLong(length);
+                       } catch (NumberFormatException e) {
+                               dl = -1;
+                       }
+               }
+               decompressedLength = dl;
                String tmp = fs.get("SegmentSize");
                if(length == null) throw new ResumeException("No SegmentSize");
                try {
@@ -281,7 +293,7 @@

                        if(!missingURIs) {
                                // Create Metadata
-                               m = new Metadata(splitfileAlgorithm, dataURIs, 
checkURIs, segmentSize, checkSegmentSize, cm, dataLength, compressionCodec, 
isMetadata, insertAsArchiveManifest);
+                               m = new Metadata(splitfileAlgorithm, dataURIs, 
checkURIs, segmentSize, checkSegmentSize, cm, dataLength, compressionCodec, 
decompressedLength, isMetadata, insertAsArchiveManifest);
                        }
                        haveSentMetadata = true;
                }


Reply via email to