}
public String toString() {
- String extraData = HexDump.toHex(_remainingData, 32);
+ String extraData = _remainingData == null ? null : HexDump.toHex(_remainingData, 32);
return getClass().getName() + ":" + '\n' +
" RecordId: 0x" + HexDump.toHex( RECORD_ID ) + '\n' +
" Options: 0x" + HexDump.toHex( getOptions() ) + '\n' +
" BlipTypeWin32: " + field_1_blipTypeWin32 + '\n' +
" BlipTypeMacOS: " + field_2_blipTypeMacOS + '\n' +
- " SUID: " + HexDump.toHex(field_3_uid) + '\n' +
+ " SUID: " + (field_3_uid == null ? "" : HexDump.toHex(field_3_uid)) + '\n' +
" Tag: " + field_4_tag + '\n' +
" Size: " + field_5_size + '\n' +
" Ref: " + field_6_ref + '\n' +
public String toString() {
StringBuffer field_5_string = new StringBuffer();
- for (int i = 0; i < field_5_fileIdClusters.length; i++) {
+ if(field_5_fileIdClusters != null) for (int i = 0; i < field_5_fileIdClusters.length; i++) {
field_5_string.append(" DrawingGroupId").append(i+1).append(": ");
field_5_string.append(field_5_fileIdClusters[i].field_1_drawingGroupId);
field_5_string.append('\n');
* Number of id clusters + 1
*/
public int getNumIdClusters() {
- return field_5_fileIdClusters.length + 1;
+ return (field_5_fileIdClusters == null ? 0 : (field_5_fileIdClusters.length + 1));
}
public int getNumShapesSaved() {
private byte field_7_fFilter;
private byte[] raw_pictureData;
+ private byte[] remainingData;
public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {
int bytesAfterHeader = readHeader( data, offset );
int pos = offset + HEADER_SIZE;
-
field_1_UID = new byte[16];
System.arraycopy( data, pos, field_1_UID, 0, 16 ); pos += 16;
raw_pictureData = new byte[field_5_cbSave];
System.arraycopy( data, pos, raw_pictureData, 0, field_5_cbSave );
+ pos += field_5_cbSave;
// 0 means DEFLATE compression
// 0xFE means no compression
field_pictureData = raw_pictureData;
}
+ int remaining = bytesAfterHeader - pos + offset + HEADER_SIZE;
+ if(remaining > 0) {
+ remainingData = new byte[remaining];
+ System.arraycopy( data, pos, remainingData, 0, remaining );
+ }
return bytesAfterHeader + HEADER_SIZE;
}
data[pos] = field_6_fCompression; pos++;
data[pos] = field_7_fFilter; pos++;
- System.arraycopy( raw_pictureData, 0, data, pos, raw_pictureData.length );
+ System.arraycopy( raw_pictureData, 0, data, pos, raw_pictureData.length ); pos += raw_pictureData.length;
+ if(remainingData != null) {
+ System.arraycopy( remainingData, 0, data, pos, remainingData.length ); pos += remainingData.length;
+ }
listener.afterRecordSerialize(offset + getRecordSize(), getRecordId(), getRecordSize(), this);
return getRecordSize();
public int getRecordSize() {
int size = 8 + 50 + raw_pictureData.length;
+ if(remainingData != null) size += remainingData.length;
if((getOptions() ^ getSignature()) == 0x10){
size += field_2_UID.length;
}
field_6_fCompression = compressed ? 0 : (byte)0xFE;
}
+ public byte[] getRemainingData() {
+ return remainingData;
+ }
+
// filtering is always 254 according to available docs, so no point giving it a setter method.
public String toString() {
- String extraData = HexDump.toHex(field_pictureData, 32);
+ String extraData = "";//HexDump.toHex(field_pictureData, 32);
return getClass().getName() + ":" + '\n' +
" RecordId: 0x" + HexDump.toHex( getRecordId() ) + '\n' +
" Options: 0x" + HexDump.toHex( getOptions() ) + '\n' +
" Compressed Size: " + HexDump.toHex( field_5_cbSave ) + '\n' +
" Compression: " + HexDump.toHex( field_6_fCompression ) + '\n' +
" Filter: " + HexDump.toHex( field_7_fFilter ) + '\n' +
- " Extra Data:" + '\n' + extraData;
+ " Extra Data:" + '\n' + extraData +
+ (remainingData == null ? null : ("\n" +
+ " Remaining Data: " + HexDump.toHex(remainingData, 32)));
}
/**
return data;
}
+ /**
+ * The test data was created from pl031405.xls attached to Bugzilla #47143
+ */
+ public void test47143() {
+ byte[] data = read(new File(cwd, "47143.dat"));
+ EscherBSERecord bse = new EscherBSERecord();
+ bse.fillFields(data, 0, new DefaultEscherRecordFactory());
+ bse.toString(); //assert that toString() works
+ assertTrue(bse.getBlipRecord() instanceof EscherMetafileBlip);
+
+ EscherMetafileBlip blip = (EscherMetafileBlip)bse.getBlipRecord();
+ blip.toString(); //assert that toString() works
+ byte[] remaining = blip.getRemainingData();
+ assertNotNull(remaining);
+
+ byte[] ser = bse.serialize(); //serialize and assert against the source data
+ assertTrue(Arrays.equals(data, ser));
+ }
}