process:
try
{
byte[] sidbytes = new byte[ 2 ];
int bytesread = in.read(sidbytes);
Record rec = null;
while (bytesread > 0)
{
sid = LittleEndian.getShort(sidbytes);
//
// for some reasons we have to make the workbook to be at least 4096 bytes
// but if we have such workbook we fill the end of it with zeros (many zeros)
//
// it is not good:
// if the length( all zero records ) % 4 = 1
// e.g.: any zero record would be readed as 4 bytes at once ( 2 - id and 2 - size ).
// And the last 1 byte will be readed WRONG ( the id must be 2 bytes )
//
// So we should better to check if the sid is zero and not to read more data
// The zero sid shows us that rest of the stream data is a fake to make workbook
// certain size
//
if ( sid == 0 )
break;
if ((rec != null) && (sid != ContinueRecord.sid))
{
userCode = req.processRecord(rec);
if (userCode != 0) break process;
}
if (sid != ContinueRecord.sid)
{
short size = LittleEndian.readShort(in);
byte[] data = new byte[ size ];
if (data.length > 0)
{
in.read(data);
}
//System.out.println("creating "+sid);
Record[] recs = RecordFactory.createRecord(sid, size,
data);
if (recs.length > 1)
{ // we know that the multiple
for (int k = 0; k < (recs.length - 1); k++)
{ // record situations do not
userCode = req.processRecord(
recs[ k ]); // contain continue records
if (userCode != 0) break process;
}
}
rec = recs[ recs.length - 1 ]; // regardless we'll process
// the last record as though
// it might be continued
// if there is only one
// records, it will go here too.
}
else
{ // we do have a continue record
short size = LittleEndian.readShort(in);
byte[] data = new byte[ size ];
if (data.length > 0)
{
in.read(data);
}
rec.processContinueRecord(data);
}
bytesread = in.read(sidbytes); // read next record sid
}
if (rec != null)
{