in poi/src/main/java/org/apache/poi/hpsf/VariantSupport.java [275:419]
public static int write(final OutputStream out, final long type,
final Object value, final int codepage)
throws IOException, WritingNotSupportedException {
int length = -1;
switch ((int) type) {
case Variant.VT_BOOL: {
if (value instanceof Boolean) {
int bb = ((Boolean)value) ? 0xff : 0x00;
out.write(bb);
out.write(bb);
length = 2;
}
break;
}
case Variant.VT_LPSTR:
if (value instanceof String) {
CodePageString codePageString = new CodePageString();
codePageString.setJavaValue( (String)value, codepage );
length = codePageString.write( out );
}
break;
case Variant.VT_LPWSTR:
if (value instanceof String) {
UnicodeString uniString = new UnicodeString();
uniString.setJavaValue((String)value);
length = uniString.write(out);
}
break;
case Variant.VT_CF:
if (value instanceof byte[]) {
final byte[] cf = (byte[]) value;
out.write(cf);
length = cf.length;
}
break;
case Variant.VT_EMPTY:
LittleEndian.putUInt(Variant.VT_EMPTY, out);
length = LittleEndianConsts.INT_SIZE;
break;
case Variant.VT_I2:
if (value instanceof Number) {
LittleEndian.putShort( out, ((Number)value).shortValue() );
length = LittleEndianConsts.SHORT_SIZE;
}
break;
case Variant.VT_UI2:
if (value instanceof Number) {
LittleEndian.putUShort( ((Number)value).intValue(), out );
length = LittleEndianConsts.SHORT_SIZE;
}
break;
case Variant.VT_I4:
if (value instanceof Number) {
LittleEndian.putInt( ((Number)value).intValue(), out);
length = LittleEndianConsts.INT_SIZE;
}
break;
case Variant.VT_UI4:
if (value instanceof Number) {
LittleEndian.putUInt( ((Number)value).longValue(), out);
length = LittleEndianConsts.INT_SIZE;
}
break;
case Variant.VT_I8:
if (value instanceof Number) {
LittleEndian.putLong( ((Number)value).longValue(), out);
length = LittleEndianConsts.LONG_SIZE;
}
break;
case Variant.VT_UI8: {
if (value instanceof Number) {
BigInteger bi = (value instanceof BigInteger) ? (BigInteger)value : BigInteger.valueOf(((Number)value).longValue());
if (bi.bitLength() > 64) {
throw new WritingNotSupportedException(type, value);
}
byte[] biBytesBE = bi.toByteArray(), biBytesLE = new byte[LittleEndianConsts.LONG_SIZE];
int i=biBytesBE.length;
for (byte b : biBytesBE) {
if (i<=LittleEndianConsts.LONG_SIZE) {
biBytesLE[i-1] = b;
}
i--;
}
out.write(biBytesLE);
length = LittleEndianConsts.LONG_SIZE;
}
break;
}
case Variant.VT_R4: {
if (value instanceof Number) {
int floatBits = Float.floatToIntBits(((Number)value).floatValue());
LittleEndian.putInt(floatBits, out);
length = LittleEndianConsts.INT_SIZE;
}
break;
}
case Variant.VT_R8:
if (value instanceof Number) {
LittleEndian.putDouble( ((Number)value).doubleValue(), out);
length = LittleEndianConsts.DOUBLE_SIZE;
}
break;
case Variant.VT_FILETIME:
Filetime filetimeValue = (value instanceof Date) ? new Filetime((Date)value) : new Filetime();
length = filetimeValue.write( out );
break;
default:
break;
}
/* The variant type is not supported yet. However, if the value
* is a byte array we can write it nevertheless. */
if (length == -1) {
if (value instanceof byte[]) {
final byte[] b = (byte[]) value;
out.write(b);
length = b.length;
writeUnsupportedTypeMessage(new WritingNotSupportedException(type, value));
} else {
throw new WritingNotSupportedException(type, value);
}
}
/* pad values to 4-bytes */
int padding = (4-(length & 0x3)) & 0x3;
out.write(paddingBytes, 0, padding);
return length + padding;
}