Author: toad
Date: 2006-11-10 18:25:53 +0000 (Fri, 10 Nov 2006)
New Revision: 10857

Modified:
   trunk/freenet/src/freenet/client/ArchiveStoreContext.java
   trunk/freenet/src/freenet/client/RealArchiveStoreItem.java
   trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
   trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
Log:
Fix several bugs related to archives and splitfile fetches.
Including the Null: data block 0 bug and the infinite recursion in fetchArchive 
bug.

Modified: trunk/freenet/src/freenet/client/ArchiveStoreContext.java
===================================================================
--- trunk/freenet/src/freenet/client/ArchiveStoreContext.java   2006-11-10 
17:27:12 UTC (rev 10856)
+++ trunk/freenet/src/freenet/client/ArchiveStoreContext.java   2006-11-10 
18:25:53 UTC (rev 10857)
@@ -128,4 +128,11 @@
                return archiveType;
        }

+       public FreenetURI getKey() {
+               return key;
+       }
+
+       public void extractToCache(Bucket bucket, ArchiveContext actx) throws 
ArchiveFailureException, ArchiveRestartException {
+               manager.extractToCache(key, archiveType, bucket, actx, this);
+       }
 }

Modified: trunk/freenet/src/freenet/client/RealArchiveStoreItem.java
===================================================================
--- trunk/freenet/src/freenet/client/RealArchiveStoreItem.java  2006-11-10 
17:27:12 UTC (rev 10856)
+++ trunk/freenet/src/freenet/client/RealArchiveStoreItem.java  2006-11-10 
18:25:53 UTC (rev 10857)
@@ -14,10 +14,10 @@
 class RealArchiveStoreItem extends ArchiveStoreItem {

        private final ArchiveManager manager;
-       boolean finalized;
-       File myFilename;
-       PaddedEphemerallyEncryptedBucket bucket;
-       FileBucket underBucket;
+       private boolean finalized;
+       private final File myFilename;
+       private final PaddedEphemerallyEncryptedBucket bucket;
+       private final FileBucket underBucket;

        /**
         * Create an ArchiveStoreElement from a TempStoreElement.

Modified: trunk/freenet/src/freenet/client/async/SingleFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2006-11-10 17:27:12 UTC (rev 10856)
+++ trunk/freenet/src/freenet/client/async/SingleFileFetcher.java       
2006-11-10 18:25:53 UTC (rev 10857)
@@ -300,7 +300,7 @@
                                        onSuccess(new 
FetchResult(this.clientMetadata, out));
                                        return;
                                } else {
-                                       if(logMINOR) Logger.minor(this, 
"Fetching archive");
+                                       if(logMINOR) Logger.minor(this, 
"Fetching archive (thisKey="+thisKey+")");
                                        // Metadata cannot contain pointers to 
files which don't exist.
                                        // We enforce this in ArchiveHandler.
                                        // Therefore, the archive needs to be 
fetched.
@@ -402,7 +402,7 @@
                                if((len > ctx.maxOutputLength) ||
                                                (len > ctx.maxTempLength)) {

-                                       onFailure(new 
FetchException(FetchException.TOO_BIG, len, isFinal && decompressors.isEmpty(), 
clientMetadata.getMIMEType()));
+                                       onFailure(new 
FetchException(FetchException.TOO_BIG, len, isFinal && decompressors.size() <= 
(metadata.isCompressed() ? 1 : 0), clientMetadata.getMIMEType()));
                                        return;
                                }

@@ -459,7 +459,7 @@

                public void onSuccess(FetchResult result, ClientGetState state) 
{
                        try {
-                               ctx.archiveManager.extractToCache(thisKey, 
ah.getArchiveType(), result.asBucket(), actx, ah);
+                               ah.extractToCache(result.asBucket(), actx);
                        } catch (ArchiveFailureException e) {
                                SingleFileFetcher.this.onFailure(new 
FetchException(e));
                        } catch (ArchiveRestartException e) {

Modified: trunk/freenet/src/freenet/client/async/SplitFileFetcher.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SplitFileFetcher.java        
2006-11-10 17:27:12 UTC (rev 10856)
+++ trunk/freenet/src/freenet/client/async/SplitFileFetcher.java        
2006-11-10 18:25:53 UTC (rev 10857)
@@ -81,9 +81,9 @@
                splitfileDataBlocks = metadata.getSplitfileDataKeys();
                splitfileCheckBlocks = metadata.getSplitfileCheckKeys();
                for(int i=0;i<splitfileDataBlocks.length;i++)
-                       if(splitfileDataBlocks[i] == null) throw new 
NullPointerException("Null: data block "+i);
+                       if(splitfileDataBlocks[i] == null) throw new 
NullPointerException("Null: data block "+i+" of "+splitfileDataBlocks.length);
                for(int i=0;i<splitfileCheckBlocks.length;i++)
-                       if(splitfileCheckBlocks[i] == null) throw new 
NullPointerException("Null: check block "+i);
+                       if(splitfileCheckBlocks[i] == null) throw new 
NullPointerException("Null: check block "+i+" of "+splitfileCheckBlocks.length);
                long finalLength = splitfileDataBlocks.length * 
CHKBlock.DATA_LENGTH;
                if(finalLength > overrideLength) {
                        if(finalLength - overrideLength > CHKBlock.DATA_LENGTH)
@@ -116,7 +116,15 @@
                        Logger.minor(this, "Algorithm: "+splitfileType+", 
blocks per segment: "+blocksPerSegment+", check blocks per segment: 
"+checkBlocksPerSegment+", segments: "+segmentCount);
                segments = new SplitFileFetcherSegment[segmentCount]; // 
initially null on all entries
                if(segmentCount == 1) {
-                       segments[0] = new 
SplitFileFetcherSegment(splitfileType, splitfileDataBlocks, 
splitfileCheckBlocks, this, archiveContext, fetchContext, maxTempLength, 
splitUseLengths, recursionLevel);
+                       // splitfile* will be overwritten, this is bad
+                       // so copy them
+                       FreenetURI[] newSplitfileDataBlocks = new 
FreenetURI[splitfileDataBlocks.length];
+                       FreenetURI[] newSplitfileCheckBlocks = new 
FreenetURI[splitfileCheckBlocks.length];
+                       System.arraycopy(splitfileDataBlocks, 0, 
newSplitfileDataBlocks, 0, splitfileDataBlocks.length);
+                       if(splitfileCheckBlocks.length > 0)
+                               System.arraycopy(splitfileCheckBlocks, 0, 
newSplitfileCheckBlocks, 0, splitfileCheckBlocks.length);
+                       segments[0] = new 
SplitFileFetcherSegment(splitfileType, newSplitfileDataBlocks, 
newSplitfileCheckBlocks, 
+                                       this, archiveContext, fetchContext, 
maxTempLength, splitUseLengths, recursionLevel);
                } else {
                        int dataBlocksPtr = 0;
                        int checkBlocksPtr = 0;
@@ -240,6 +248,8 @@
                        cb.onSuccess(new FetchResult(clientMetadata, data), 
this);
                } catch (FetchException e) {
                        cb.onFailure(e, this);
+               } catch (Throwable t) {
+                       cb.onFailure(new 
FetchException(FetchException.INTERNAL_ERROR, t), this);
                }
        }



Reply via email to