From 92764ff10d3059218b67fd5a15cb7c37db30bcd7 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 6 Jul 2015 21:15:57 +0000 Subject: [PATCH] Helper method to report the number of blocks used in a BAT git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1689504 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/poifs/storage/BATBlock.java | 17 +++++- .../poi/poifs/storage/TestBATBlock.java | 54 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/poi/poifs/storage/BATBlock.java b/src/java/org/apache/poi/poifs/storage/BATBlock.java index 8712e65f6f..53099644ac 100644 --- a/src/java/org/apache/poi/poifs/storage/BATBlock.java +++ b/src/java/org/apache/poi/poifs/storage/BATBlock.java @@ -30,8 +30,6 @@ import org.apache.poi.util.LittleEndian; /** * A block of block allocation table entries. BATBlocks are created * only through a static factory method: createBATBlocks. - * - * @author Marc Johnson (mjohnson at apache dot org) */ public final class BATBlock extends BigBlock { /** @@ -301,6 +299,21 @@ public final class BATBlock extends BigBlock { public boolean hasFreeSectors() { return _has_free_sectors; } + /** + * How many sectors in this block are taken? + * Note that calling {@link #hasFreeSectors()} is much quicker + */ + public int getUsedSectors(boolean isAnXBAT) { + int usedSectors = 0; + int toCheck = _values.length; + if (isAnXBAT) toCheck--; // Last is a chain location + for(int k=0; k= _values.length) { diff --git a/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java b/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java index 3fc77b839c..11c7070e93 100644 --- a/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java +++ b/src/testcases/org/apache/poi/poifs/storage/TestBATBlock.java @@ -26,6 +26,7 @@ import java.util.List; import junit.framework.TestCase; +import org.apache.poi.poifs.common.POIFSBigBlockSize; import org.apache.poi.poifs.common.POIFSConstants; /** @@ -283,6 +284,59 @@ public final class TestBATBlock extends TestCase { ); } + public void testUsedSectors() throws Exception { + POIFSBigBlockSize b512 = POIFSConstants.SMALLER_BIG_BLOCK_SIZE_DETAILS; + POIFSBigBlockSize b4096 = POIFSConstants.LARGER_BIG_BLOCK_SIZE_DETAILS; + + // Try first with 512 block sizes, which can hold 128 entries + BATBlock block512 = BATBlock.createEmptyBATBlock(b512, false); + assertEquals(true, block512.hasFreeSectors()); + assertEquals(0, block512.getUsedSectors(false)); + + // Allocate a few + block512.setValueAt(0, 42); + block512.setValueAt(10, 42); + block512.setValueAt(20, 42); + assertEquals(true, block512.hasFreeSectors()); + assertEquals(3, block512.getUsedSectors(false)); + + // Allocate all + for (int i=0; i blocks = new ArrayList(); -- 2.39.5