1
54
55 package org.apache.poi.hssf.record;
56
57 import org.apache.poi.util.LittleEndianConsts;
58 import org.apache.poi.util.LittleEndian;
59
60
66 class RecordProcessor
67 {
68 private byte[] data;
69 private int recordOffset;
70 private int available;
71 private SSTRecordHeader sstRecordHeader;
72
73 public RecordProcessor( byte[] data, int available, int numStrings, int numUniqueStrings )
74 {
75 this.data = data;
76 this.available = available;
77 this.sstRecordHeader = new SSTRecordHeader(numStrings, numUniqueStrings);
78 }
79
80 public int getAvailable()
81 {
82 return available;
83 }
84
85 public void writeRecordHeader( int offset, int totalWritten, int recordLength, boolean first_record )
86 {
87 if ( first_record )
88 {
89 available -= 8;
90 recordOffset = sstRecordHeader.writeSSTHeader( data, recordOffset + offset + totalWritten, recordLength );
91 }
92 else
93 {
94 recordOffset = writeContinueHeader( data, recordOffset + offset + totalWritten, recordLength );
95 }
96 }
97
98 public byte[] writeStringRemainder( boolean lastStringCompleted, byte[] stringreminant, int offset, int totalWritten )
99 {
100 if ( !lastStringCompleted )
101 {
102
103 System.arraycopy( stringreminant, 0, data, recordOffset + offset + totalWritten, stringreminant.length );
104 adjustPointers( stringreminant.length );
105 }
106 else
107 {
108
109 System.arraycopy( stringreminant, 0, data, recordOffset + offset + totalWritten, available );
110 byte[] leftover = new byte[( stringreminant.length - available ) + LittleEndianConsts.BYTE_SIZE];
111
112 System.arraycopy( stringreminant, available, leftover, LittleEndianConsts.BYTE_SIZE, stringreminant.length - available );
113 leftover[0] = stringreminant[0];
114 stringreminant = leftover;
115 adjustPointers( available );
116 }
117 return stringreminant;
118 }
119
120 public void writeWholeString( UnicodeString unistr, int offset, int totalWritten )
121 {
122 unistr.serialize( recordOffset + offset + totalWritten, data );
123 int rsize = unistr.getRecordSize();
124 adjustPointers( rsize );
125 }
126
127 public byte[] writePartString( UnicodeString unistr, int offset, int totalWritten )
128 {
129 byte[] stringReminant;
130 byte[] ucs = unistr.serialize();
131
132 System.arraycopy( ucs, 0, data, recordOffset + offset + totalWritten, available );
133 stringReminant = new byte[( ucs.length - available ) + LittleEndianConsts.BYTE_SIZE];
134 System.arraycopy( ucs, available, stringReminant, LittleEndianConsts.BYTE_SIZE, ucs.length - available );
135 stringReminant[0] = ucs[LittleEndianConsts.SHORT_SIZE];
136 available = 0;
137 return stringReminant;
138 }
139
140
141 private int writeContinueHeader( final byte[] data, final int pos,
142 final int recsize )
143 {
144 int offset = pos;
145
146 LittleEndian.putShort( data, offset, ContinueRecord.sid );
147 offset += LittleEndianConsts.SHORT_SIZE;
148 LittleEndian.putShort( data, offset, (short) ( recsize ) );
149 offset += LittleEndianConsts.SHORT_SIZE;
150 return offset - pos;
151 }
152
153
154 private void adjustPointers( int amount )
155 {
156 recordOffset += amount;
157 available -= amount;
158 }
159 }
160
161