git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@722401 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_5_BETA5
@@ -37,6 +37,7 @@ | |||
<!-- Don't forget to update status.xml too! --> | |||
<release version="3.5-beta5" date="2008-??-??"> | |||
<action dev="POI-DEVELOPERS" type="fix">44914 - Fixed warning message "WARN. Unread n bytes of record 0xNN"</action> | |||
<action dev="POI-DEVELOPERS" type="add">46156 - Improved number to text conversion to be closer to that of Excel</action> | |||
<action dev="POI-DEVELOPERS" type="fix">46312 - Fixed ValueRecordsAggregate to handle removal of new empty row</action> | |||
<action dev="POI-DEVELOPERS" type="add">46269 - Improved error message when attempting to read BIFF2 file</action> |
@@ -34,6 +34,7 @@ | |||
<!-- Don't forget to update changes.xml too! --> | |||
<changes> | |||
<release version="3.5-beta5" date="2008-??-??"> | |||
<action dev="POI-DEVELOPERS" type="fix">44914 - Fixed warning message "WARN. Unread n bytes of record 0xNN"</action> | |||
<action dev="POI-DEVELOPERS" type="add">46156 - Improved number to text conversion to be closer to that of Excel</action> | |||
<action dev="POI-DEVELOPERS" type="fix">46312 - Fixed ValueRecordsAggregate to handle removal of new empty row</action> | |||
<action dev="POI-DEVELOPERS" type="add">46269 - Improved error message when attempting to read BIFF2 file</action> |
@@ -31,6 +31,7 @@ import java.util.ArrayList; | |||
import java.util.List; | |||
import org.apache.poi.hssf.record.*; | |||
import org.apache.poi.hssf.record.RecordInputStream.LeftoverDataException; | |||
import org.apache.poi.hssf.record.chart.*; | |||
import org.apache.poi.hssf.record.pivottable.*; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
@@ -63,7 +64,19 @@ public final class BiffViewer { | |||
List<Record> temp = new ArrayList<Record>(); | |||
RecordInputStream recStream = new RecordInputStream(is); | |||
while (recStream.hasNextRecord()) { | |||
while (true) { | |||
boolean hasNext; | |||
try { | |||
hasNext = recStream.hasNextRecord(); | |||
} catch (LeftoverDataException e) { | |||
e.printStackTrace(); | |||
System.err.println("Discarding " + recStream.remaining() + " bytes and continuing"); | |||
recStream.readRemainder(); | |||
hasNext = recStream.hasNextRecord(); | |||
} | |||
if (!hasNext) { | |||
break; | |||
} | |||
recStream.nextRecord(); | |||
if (recStream.getSid() == 0) { | |||
continue; |
@@ -20,6 +20,7 @@ package org.apache.poi.hssf.record; | |||
import java.io.ByteArrayOutputStream; | |||
import java.io.InputStream; | |||
import org.apache.poi.hssf.dev.BiffViewer; | |||
import org.apache.poi.util.LittleEndian; | |||
import org.apache.poi.util.LittleEndianInput; | |||
import org.apache.poi.util.LittleEndianInputStream; | |||
@@ -40,6 +41,17 @@ public final class RecordInputStream extends InputStream implements LittleEndian | |||
*/ | |||
private static final int DATA_LEN_NEEDS_TO_BE_READ = -1; | |||
private static final byte[] EMPTY_BYTE_ARRAY = { }; | |||
/** | |||
* For use in {@link BiffViewer} which may construct {@link Record}s that don't completely | |||
* read all available data. This exception should never be thrown otherwise. | |||
*/ | |||
public static final class LeftoverDataException extends RuntimeException { | |||
public LeftoverDataException(int sid, int remainingByteCount) { | |||
super("Initialisation of record 0x" + Integer.toHexString(sid).toUpperCase() | |||
+ " left " + remainingByteCount + " bytes remaining still to be read."); | |||
} | |||
} | |||
/** {@link LittleEndianInput} facet of the wrapped {@link InputStream} */ | |||
private final LittleEndianInput _le; | |||
@@ -102,17 +114,14 @@ public final class RecordInputStream extends InputStream implements LittleEndian | |||
} | |||
/** | |||
* Note - this method is expected to be called only when completed reading the current BIFF record. | |||
* Calling this before reaching the end of the current record will cause all remaining data to be | |||
* discarded | |||
* Note - this method is expected to be called only when completed reading the current BIFF | |||
* record. | |||
* @throws LeftoverDataException if this method is called before reaching the end of the | |||
* current record. | |||
*/ | |||
public boolean hasNextRecord() { | |||
public boolean hasNextRecord() throws LeftoverDataException { | |||
if (_currentDataLength != -1 && _currentDataLength != _currentDataOffset) { | |||
System.out.println("WARN. Unread "+remaining()+" bytes of record 0x"+Integer.toHexString(_currentSid)); | |||
// discard unread data | |||
while (_currentDataOffset < _currentDataLength) { | |||
readByte(); | |||
} | |||
throw new LeftoverDataException(_currentSid, remaining()); | |||
} | |||
if (_currentDataLength != DATA_LEN_NEEDS_TO_BE_READ) { | |||
_nextSid = readNextSid(); |