org.apache.poi.hssf.record.cont
Class ContinuableRecordInput

java.lang.Object
  extended by org.apache.poi.hssf.record.cont.ContinuableRecordInput
All Implemented Interfaces:
LittleEndianInput

public class ContinuableRecordInput
extends java.lang.Object
implements LittleEndianInput

A decorated RecordInputStream that can read primitive data types (short, int, long, etc.) spanned across a ContinueRecord boundary.

Most records construct themselves from RecordInputStream. This class assumes that a ContinueRecord record break always occurs at the type boundary, however, it is not always so.

Two attachments to Bugzilla 50779 demonstrate that a CONTINUE break can appear right in between two bytes of a unicode character or between two bytes of a short. The problematic portion of the data is in a Asian Phonetic Settings Block (ExtRst) of a UnicodeString.

RecordInputStream greedily requests the bytes to be read and stumbles on such files with a "Not enough data (1) to read requested (2) bytes" exception. The ContinuableRecordInput class circumvents this "type boundary" rule and reads data byte-by-byte rolling over CONTINUE if necessary.

YK: For now (March 2011) this class is only used to read

See Also:
blocks of a UnicodeString.


Constructor Summary
ContinuableRecordInput(RecordInputStream in)
           
 
Method Summary
 int available()
           
 byte readByte()
           
 double readDouble()
           
 void readFully(byte[] buf)
           
 void readFully(byte[] buf, int off, int len)
           
 int readInt()
           
 long readLong()
           
 void readPlain(byte[] buf, int off, int len)
          Usually acts the same as LittleEndianInput.readFully(byte[], int, int), but for an encrypted stream the raw (unencrypted) data is filled
 short readShort()
           
 int readUByte()
           
 int readUShort()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ContinuableRecordInput

public ContinuableRecordInput(RecordInputStream in)
Method Detail

available

public int available()
Specified by:
available in interface LittleEndianInput

readByte

public byte readByte()
Specified by:
readByte in interface LittleEndianInput

readUByte

public int readUByte()
Specified by:
readUByte in interface LittleEndianInput

readShort

public short readShort()
Specified by:
readShort in interface LittleEndianInput

readUShort

public int readUShort()
Specified by:
readUShort in interface LittleEndianInput

readInt

public int readInt()
Specified by:
readInt in interface LittleEndianInput

readLong

public long readLong()
Specified by:
readLong in interface LittleEndianInput

readDouble

public double readDouble()
Specified by:
readDouble in interface LittleEndianInput

readFully

public void readFully(byte[] buf)
Specified by:
readFully in interface LittleEndianInput

readFully

public void readFully(byte[] buf,
                      int off,
                      int len)
Specified by:
readFully in interface LittleEndianInput

readPlain

public void readPlain(byte[] buf,
                      int off,
                      int len)
Description copied from interface: LittleEndianInput
Usually acts the same as LittleEndianInput.readFully(byte[], int, int), but for an encrypted stream the raw (unencrypted) data is filled

Specified by:
readPlain in interface LittleEndianInput
Parameters:
buf - the byte array to receive the bytes
off - the start offset into the byte array
len - the amount of bytes to fill