]> source.dussan.org Git - poi.git/commitdiff
Hopefully finish fixing bug #49139 - track down another subtle hard coding of 512...
authorNick Burch <nick@apache.org>
Wed, 5 May 2010 15:10:17 +0000 (15:10 +0000)
committerNick Burch <nick@apache.org>
Wed, 5 May 2010 15:10:17 +0000 (15:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@941334 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/poifs/common/POIFSBigBlockSize.java
src/java/org/apache/poi/poifs/dev/POIFSHeaderDumper.java
src/java/org/apache/poi/poifs/storage/DocumentBlock.java
src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSFileSystem.java

index 1d561f809789b03ce309e16dbdbfb44a31ef8858..d9eb624850d003f1be48768f5f71bb2a9440a5c5 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-SNAPSHOT" date="2010-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">49139 - Properly support 4k big block size in POIFS</action>
            <action dev="POI-DEVELOPERS" type="fix">48936 - Avoid writing malformed CDATA blocks in sharedStrings.xml</action>
            <action dev="POI-DEVELOPERS" type="add">49026 - Added implementation for TEXT()  </action>
            <action dev="POI-DEVELOPERS" type="add">49025 - Added implementation for TRUNC()  </action>
index 19b345d716cd620176ac14f27179c305d8ad91b8..1e8b1b113acf747cc344f45ebe2a8d72f0b2f0bc 100644 (file)
@@ -38,6 +38,12 @@ public final class POIFSBigBlockSize
       return bigBlockSize;
    }
    
+   /**
+    * Returns the value that gets written into the 
+    *  header.
+    * Is the power of two that corresponds to the
+    *  size of the block, eg 512 => 9
+    */
    public short getHeaderValue() {
       return headerValue;
    }
index 1967daec432bbc7f83f644ccb8bebb1f02ff903d..75f69caebfee6ed243f871e5e010b4a3ca907fad 100644 (file)
@@ -149,6 +149,8 @@ public class POIFSHeaderDumper {
             bnS = "DI Fat Block";
          } else if(bn == POIFSConstants.FAT_SECTOR_BLOCK) {
             bnS = "Normal Fat Block";
+         } else if(bn == POIFSConstants.UNUSED_BLOCK) {
+            bnS = "Block Not Used (Free)";
          }
          
          System.out.println("  Block  # " + i + " -> " + bnS);
index 3f84fa6e6100949bf6dacff24a658d042b220519..a7c5686257909a3785a22e06bca7ea1290893a8f 100644 (file)
@@ -32,10 +32,6 @@ import org.apache.poi.util.IOUtils;
  * @author Marc Johnson (mjohnson at apache dot org)
  */
 public final class DocumentBlock extends BigBlock {
-    private static final int BLOCK_SHIFT = 9;
-    private static final int BLOCK_SIZE = 1 << BLOCK_SHIFT;
-    private static final int BLOCK_MASK = BLOCK_SIZE-1;
-
     private static final byte _default_value = ( byte ) 0xFF;
     private byte[]            _data;
     private int               _bytes_read;
@@ -165,6 +161,17 @@ public final class DocumentBlock extends BigBlock {
     }
 
     public static DataInputBlock getDataInputBlock(DocumentBlock[] blocks, int offset) {
+        if(blocks == null || blocks.length == 0) {
+           return null;
+        }
+        
+        // Key things about the size of the block
+        POIFSBigBlockSize bigBlockSize = blocks[0].bigBlockSize;
+        int BLOCK_SHIFT = bigBlockSize.getHeaderValue();
+        int BLOCK_SIZE = bigBlockSize.getBigBlockSize();
+        int BLOCK_MASK = BLOCK_SIZE - 1;
+
+        // Now do the offset lookup
         int firstBlockIndex = offset >> BLOCK_SHIFT;
         int firstBlockOffset= offset & BLOCK_MASK;
         return new DataInputBlock(blocks[firstBlockIndex]._data, firstBlockOffset);
index 1b370124f60100d47c283be377eb305993176017..5ebc1689412869b5fd5248189f4f4801bf39fc64 100644 (file)
@@ -177,9 +177,8 @@ public final class TestPOIFSFileSystem extends TestCase {
        /**
         * Most OLE2 files use 512byte blocks. However, a small number
         *  use 4k blocks. Check that we can open these.
-        * DISABLED until we fix the bug with DocumentBlocks on 4k sizes
         */
-       public void DISABLEDtest4KBlocks() throws Exception {
+       public void test4KBlocks() throws Exception {
       POIDataSamples _samples = POIDataSamples.getPOIFSInstance();
           InputStream inp = _samples.openResourceAsStream("BlockSize4096.zvi");
           
@@ -219,7 +218,8 @@ public final class TestPOIFSFileSystem extends TestCase {
              if(entry instanceof DirectoryEntry) {
                 checkAllDirectoryContents((DirectoryEntry)entry);
              } else {
-                DocumentInputStream dis = new DocumentInputStream((DocumentNode) entry);
+                DocumentNode doc = (DocumentNode) entry;
+                DocumentInputStream dis = new DocumentInputStream(doc);
                 int numBytes = dis.available();
                 byte[] data = new byte [numBytes];
             dis.read(data);