]> source.dussan.org Git - poi.git/commitdiff
To better match OPOIFS, pad to the end of a block with 0xFF/-1
authorNick Burch <nick@apache.org>
Wed, 1 Jul 2015 00:43:33 +0000 (00:43 +0000)
committerNick Burch <nick@apache.org>
Wed, 1 Jul 2015 00:43:33 +0000 (00:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1688543 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/poifs/filesystem/NPOIFSDocument.java
src/testcases/org/apache/poi/poifs/filesystem/TestNPOIFSMiniStore.java

index bdc35cee712bd67ebf474888ee54863ef6485430..c94e427b92c0d0dc984d7cedada97b0877551b31 100644 (file)
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -143,6 +144,15 @@ public final class NPOIFSDocument implements POIFSViewable {
            os.write(buf, 0, readBytes);
        }
        
+       // Pad to the end of the block with -1s
+       int usedInBlock = length % _block_size;
+       if (usedInBlock != 0 && usedInBlock != _block_size) {
+           int toBlockEnd = _block_size - usedInBlock;
+           byte[] padding = new byte[toBlockEnd];
+           Arrays.fill(padding, (byte)0xFF);
+           os.write(padding);
+       }
+       
        // Tidy and return the length
        os.close();
        return length;
index 44e066a6f7b3036f231beaa7b5f5c7e07479faa7..4f102084d73f1af0e0dafa40a208a05bbce0e75b 100644 (file)
@@ -431,6 +431,7 @@ public final class TestNPOIFSMiniStore extends POITestCase {
        assertEquals(POIFSConstants.END_OF_CHAIN,     fs.getNextBlock(3)); // Mini
        assertEquals(POIFSConstants.UNUSED_BLOCK,     fs.getNextBlock(4));
        
+       // First 2 Mini blocks will be used
        assertEquals(2, ministore.getFreeBlock());
        
        // Add one more mini-stream, and check
@@ -442,6 +443,7 @@ public final class TestNPOIFSMiniStore extends POITestCase {
        assertEquals(POIFSConstants.END_OF_CHAIN,     fs.getNextBlock(3)); // Mini
        assertEquals(POIFSConstants.UNUSED_BLOCK,     fs.getNextBlock(4));
        
+       // One more mini-block will be used
        assertEquals(3, ministore.getFreeBlock());
        
        // Check the contents too