76 lines
2.0 KiB
Java
76 lines
2.0 KiB
Java
package jxl.write.biff;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import jxl.biff.IntegerHelper;
|
|
import jxl.biff.StringHelper;
|
|
import jxl.biff.Type;
|
|
import jxl.biff.WritableRecordData;
|
|
|
|
class SSTRecord extends WritableRecordData {
|
|
private int numReferences;
|
|
|
|
private int numStrings;
|
|
|
|
private ArrayList strings;
|
|
|
|
private ArrayList stringLengths;
|
|
|
|
private byte[] data;
|
|
|
|
private int byteCount;
|
|
|
|
private static int maxBytes = 8216;
|
|
|
|
public SSTRecord(int numRefs, int s) {
|
|
super(Type.SST);
|
|
this.numReferences = numRefs;
|
|
this.numStrings = s;
|
|
this.byteCount = 0;
|
|
this.strings = new ArrayList(50);
|
|
this.stringLengths = new ArrayList(50);
|
|
}
|
|
|
|
public int add(String s) {
|
|
int bytes = s.length() * 2 + 3;
|
|
if (this.byteCount >= maxBytes - 5)
|
|
return (s.length() > 0) ? s.length() : -1;
|
|
this.stringLengths.add(new Integer(s.length()));
|
|
if (bytes + this.byteCount < maxBytes) {
|
|
this.strings.add(s);
|
|
this.byteCount += bytes;
|
|
return 0;
|
|
}
|
|
int bytesLeft = maxBytes - 3 - this.byteCount;
|
|
int charsAvailable = (bytesLeft % 2 == 0) ? (bytesLeft / 2) : ((bytesLeft - 1) / 2);
|
|
this.strings.add(s.substring(0, charsAvailable));
|
|
this.byteCount += charsAvailable * 2 + 3;
|
|
return s.length() - charsAvailable;
|
|
}
|
|
|
|
public int getOffset() {
|
|
return this.byteCount + 8;
|
|
}
|
|
|
|
public byte[] getData() {
|
|
this.data = new byte[this.byteCount + 8];
|
|
IntegerHelper.getFourBytes(this.numReferences, this.data, 0);
|
|
IntegerHelper.getFourBytes(this.numStrings, this.data, 4);
|
|
int pos = 8;
|
|
int count = 0;
|
|
Iterator i = this.strings.iterator();
|
|
String s = null;
|
|
int length = 0;
|
|
while (i.hasNext()) {
|
|
s = i.next();
|
|
length = ((Integer)this.stringLengths.get(count)).intValue();
|
|
IntegerHelper.getTwoBytes(length, this.data, pos);
|
|
this.data[pos + 2] = 1;
|
|
StringHelper.getUnicodeBytes(s, this.data, pos + 3);
|
|
pos += s.length() * 2 + 3;
|
|
count++;
|
|
}
|
|
return this.data;
|
|
}
|
|
}
|