53 lines
1.6 KiB
Java
53 lines
1.6 KiB
Java
package jxl.biff;
|
|
|
|
import common.Logger;
|
|
import jxl.read.biff.Record;
|
|
|
|
public abstract class WritableRecordData extends RecordData implements ByteData {
|
|
private static Logger logger = Logger.getLogger(WritableRecordData.class);
|
|
|
|
protected static final int maxRecordLength = 8228;
|
|
|
|
protected WritableRecordData(Type t) {
|
|
super(t);
|
|
}
|
|
|
|
protected WritableRecordData(Record t) {
|
|
super(t);
|
|
}
|
|
|
|
public final byte[] getBytes() {
|
|
byte[] data = getData();
|
|
int dataLength = data.length;
|
|
if (data.length > 8224) {
|
|
dataLength = 8224;
|
|
data = handleContinueRecords(data);
|
|
}
|
|
byte[] bytes = new byte[data.length + 4];
|
|
System.arraycopy(data, 0, bytes, 4, data.length);
|
|
IntegerHelper.getTwoBytes(getCode(), bytes, 0);
|
|
IntegerHelper.getTwoBytes(dataLength, bytes, 2);
|
|
return bytes;
|
|
}
|
|
|
|
private byte[] handleContinueRecords(byte[] data) {
|
|
int continuedData = data.length - 8224;
|
|
int numContinueRecords = continuedData / 8224 + 1;
|
|
byte[] newdata = new byte[data.length + numContinueRecords * 4];
|
|
System.arraycopy(data, 0, newdata, 0, 8224);
|
|
int oldarraypos = 8224;
|
|
int newarraypos = 8224;
|
|
for (int i = 0; i < numContinueRecords; i++) {
|
|
int length = Math.min(data.length - oldarraypos, 8224);
|
|
IntegerHelper.getTwoBytes(Type.CONTINUE.value, newdata, newarraypos);
|
|
IntegerHelper.getTwoBytes(length, newdata, newarraypos + 2);
|
|
System.arraycopy(data, oldarraypos, newdata, newarraypos + 4, length);
|
|
oldarraypos += length;
|
|
newarraypos += length + 4;
|
|
}
|
|
return newdata;
|
|
}
|
|
|
|
protected abstract byte[] getData();
|
|
}
|