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