mirror of https://github.com/apache/poi.git
Hopefully finish fixing bug #49139 - track down another subtle hard coding of 512, and switch to using the big block size variable
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@941334 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e0ae7b1177
commit
423194bd27
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.7-SNAPSHOT" date="2010-??-??">
|
<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="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">49026 - Added implementation for TEXT() </action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">49025 - Added implementation for TRUNC() </action>
|
<action dev="POI-DEVELOPERS" type="add">49025 - Added implementation for TRUNC() </action>
|
||||||
|
|
|
@ -38,6 +38,12 @@ public final class POIFSBigBlockSize
|
||||||
return bigBlockSize;
|
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() {
|
public short getHeaderValue() {
|
||||||
return headerValue;
|
return headerValue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,6 +149,8 @@ public class POIFSHeaderDumper {
|
||||||
bnS = "DI Fat Block";
|
bnS = "DI Fat Block";
|
||||||
} else if(bn == POIFSConstants.FAT_SECTOR_BLOCK) {
|
} else if(bn == POIFSConstants.FAT_SECTOR_BLOCK) {
|
||||||
bnS = "Normal Fat Block";
|
bnS = "Normal Fat Block";
|
||||||
|
} else if(bn == POIFSConstants.UNUSED_BLOCK) {
|
||||||
|
bnS = "Block Not Used (Free)";
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println(" Block # " + i + " -> " + bnS);
|
System.out.println(" Block # " + i + " -> " + bnS);
|
||||||
|
|
|
@ -32,10 +32,6 @@ import org.apache.poi.util.IOUtils;
|
||||||
* @author Marc Johnson (mjohnson at apache dot org)
|
* @author Marc Johnson (mjohnson at apache dot org)
|
||||||
*/
|
*/
|
||||||
public final class DocumentBlock extends BigBlock {
|
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 static final byte _default_value = ( byte ) 0xFF;
|
||||||
private byte[] _data;
|
private byte[] _data;
|
||||||
private int _bytes_read;
|
private int _bytes_read;
|
||||||
|
@ -165,6 +161,17 @@ public final class DocumentBlock extends BigBlock {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DataInputBlock getDataInputBlock(DocumentBlock[] blocks, int offset) {
|
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 firstBlockIndex = offset >> BLOCK_SHIFT;
|
||||||
int firstBlockOffset= offset & BLOCK_MASK;
|
int firstBlockOffset= offset & BLOCK_MASK;
|
||||||
return new DataInputBlock(blocks[firstBlockIndex]._data, firstBlockOffset);
|
return new DataInputBlock(blocks[firstBlockIndex]._data, firstBlockOffset);
|
||||||
|
|
|
@ -177,9 +177,8 @@ public final class TestPOIFSFileSystem extends TestCase {
|
||||||
/**
|
/**
|
||||||
* Most OLE2 files use 512byte blocks. However, a small number
|
* Most OLE2 files use 512byte blocks. However, a small number
|
||||||
* use 4k blocks. Check that we can open these.
|
* 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();
|
POIDataSamples _samples = POIDataSamples.getPOIFSInstance();
|
||||||
InputStream inp = _samples.openResourceAsStream("BlockSize4096.zvi");
|
InputStream inp = _samples.openResourceAsStream("BlockSize4096.zvi");
|
||||||
|
|
||||||
|
@ -219,7 +218,8 @@ public final class TestPOIFSFileSystem extends TestCase {
|
||||||
if(entry instanceof DirectoryEntry) {
|
if(entry instanceof DirectoryEntry) {
|
||||||
checkAllDirectoryContents((DirectoryEntry)entry);
|
checkAllDirectoryContents((DirectoryEntry)entry);
|
||||||
} else {
|
} else {
|
||||||
DocumentInputStream dis = new DocumentInputStream((DocumentNode) entry);
|
DocumentNode doc = (DocumentNode) entry;
|
||||||
|
DocumentInputStream dis = new DocumentInputStream(doc);
|
||||||
int numBytes = dis.available();
|
int numBytes = dis.available();
|
||||||
byte[] data = new byte [numBytes];
|
byte[] data = new byte [numBytes];
|
||||||
dis.read(data);
|
dis.read(data);
|
||||||
|
|
Loading…
Reference in New Issue