Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactoring and cleanup work in prep for looking more deeply into SST…
… handling. git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/branches/REL_1_5_BRANCH@352650 13f79535-47bb-0310-9956-ffa450edef68
- Loading branch information
Glen Stampoultzis
committed
May 27, 2002
1 parent
13948e2
commit 9a47a0c
Showing
6 changed files
with
706 additions
and
646 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
142 changes: 142 additions & 0 deletions
142
src/java/org/apache/poi/hssf/record/RecordProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
package org.apache.poi.hssf.record; | ||
|
||
import org.apache.poi.util.LittleEndianConsts; | ||
import org.apache.poi.util.LittleEndian; | ||
|
||
class RecordProcessor | ||
{ | ||
private byte[] data; | ||
private int recordOffset; | ||
private int available; | ||
private SSTRecordHeader sstRecordHeader; | ||
|
||
public RecordProcessor( byte[] data, int available, int numStrings, int numUniqueStrings ) | ||
{ | ||
this.data = data; | ||
this.available = available; | ||
this.sstRecordHeader = new SSTRecordHeader(numStrings, numUniqueStrings); | ||
} | ||
|
||
public int getAvailable() | ||
{ | ||
return available; | ||
} | ||
|
||
public void writeRecordHeader( int offset, int totalWritten, int recordLength, boolean first_record ) | ||
{ | ||
if ( first_record ) | ||
{ | ||
available -= 8; | ||
recordOffset = sstRecordHeader.writeSSTHeader( data, recordOffset + offset + totalWritten, recordLength ); | ||
} | ||
else | ||
{ | ||
recordOffset = writeContinueHeader( data, recordOffset + offset + totalWritten, recordLength ); | ||
} | ||
} | ||
|
||
public byte[] writeStringRemainder( boolean lastStringCompleted, byte[] stringreminant, int offset, int totalWritten ) | ||
{ | ||
if ( !lastStringCompleted ) | ||
{ | ||
// write reminant -- it'll all fit neatly | ||
System.arraycopy( stringreminant, 0, data, recordOffset + offset + totalWritten, stringreminant.length ); | ||
adjustPointers( stringreminant.length ); | ||
} | ||
else | ||
{ | ||
// write as much of the remnant as possible | ||
System.arraycopy( stringreminant, 0, data, recordOffset + offset + totalWritten, available ); | ||
byte[] leftover = new byte[( stringreminant.length - available ) + LittleEndianConsts.BYTE_SIZE]; | ||
|
||
System.arraycopy( stringreminant, available, leftover, LittleEndianConsts.BYTE_SIZE, stringreminant.length - available ); | ||
leftover[0] = stringreminant[0]; | ||
stringreminant = leftover; | ||
adjustPointers( available ); // Consume all available remaining space | ||
} | ||
return stringreminant; | ||
} | ||
|
||
public void writeWholeString( UnicodeString unistr, int offset, int totalWritten ) | ||
{ | ||
unistr.serialize( recordOffset + offset + totalWritten, data ); | ||
int rsize = unistr.getRecordSize(); | ||
adjustPointers( rsize ); | ||
} | ||
|
||
public byte[] writePartString( UnicodeString unistr, int offset, int totalWritten ) | ||
{ | ||
byte[] stringReminant; | ||
byte[] ucs = unistr.serialize(); | ||
|
||
System.arraycopy( ucs, 0, data, recordOffset + offset + totalWritten, available ); | ||
stringReminant = new byte[( ucs.length - available ) + LittleEndianConsts.BYTE_SIZE]; | ||
System.arraycopy( ucs, available, stringReminant, LittleEndianConsts.BYTE_SIZE, ucs.length - available ); | ||
stringReminant[0] = ucs[LittleEndianConsts.SHORT_SIZE]; | ||
available = 0; | ||
return stringReminant; | ||
} | ||
|
||
|
||
private int writeContinueHeader( final byte[] data, final int pos, | ||
final int recsize ) | ||
{ | ||
int offset = pos; | ||
|
||
LittleEndian.putShort( data, offset, ContinueRecord.sid ); | ||
offset += LittleEndianConsts.SHORT_SIZE; | ||
LittleEndian.putShort( data, offset, (short) ( recsize ) ); | ||
offset += LittleEndianConsts.SHORT_SIZE; | ||
return offset - pos; | ||
} | ||
|
||
|
||
private void adjustPointers( int amount ) | ||
{ | ||
recordOffset += amount; | ||
available -= amount; | ||
} | ||
} | ||
|
||
class SSTRecordHeader | ||
{ | ||
int numStrings; | ||
int numUniqueStrings; | ||
|
||
/** | ||
* | ||
*/ | ||
public SSTRecordHeader( int numStrings, int numUniqueStrings ) | ||
{ | ||
this.numStrings = numStrings; | ||
this.numUniqueStrings = numUniqueStrings; | ||
} | ||
|
||
/** | ||
* Writes out the SST record. This consists of the sid, the record size, the number of | ||
* strings and the number of unique strings. | ||
* | ||
* @param data The data buffer to write the header to. | ||
* @param bufferIndex The index into the data buffer where the header should be written. | ||
* @param recSize The number of records written. | ||
* | ||
* @return The bufer of bytes modified. | ||
*/ | ||
public int writeSSTHeader( byte[] data, int bufferIndex, int recSize ) | ||
{ | ||
int offset = bufferIndex; | ||
|
||
LittleEndian.putShort( data, offset, SSTRecord.sid ); | ||
offset += LittleEndianConsts.SHORT_SIZE; | ||
LittleEndian.putShort( data, offset, (short) ( recSize ) ); | ||
offset += LittleEndianConsts.SHORT_SIZE; | ||
// LittleEndian.putInt( data, offset, getNumStrings() ); | ||
LittleEndian.putInt( data, offset, numStrings ); | ||
offset += LittleEndianConsts.INT_SIZE; | ||
// LittleEndian.putInt( data, offset, getNumUniqueStrings() ); | ||
LittleEndian.putInt( data, offset, numUniqueStrings ); | ||
offset += LittleEndianConsts.INT_SIZE; | ||
return offset - bufferIndex; | ||
} | ||
|
||
} |
Oops, something went wrong.