|
|
|
|
|
|
|
|
limitations under the License. |
|
|
limitations under the License. |
|
|
==================================================================== */ |
|
|
==================================================================== */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package org.apache.poi.hssf.record; |
|
|
package org.apache.poi.hssf.record; |
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
import java.util.ArrayList; |
|
|
|
|
|
|
|
|
import org.apache.poi.ddf.EscherRecordFactory; |
|
|
import org.apache.poi.ddf.EscherRecordFactory; |
|
|
import org.apache.poi.ddf.NullEscherSerializationListener; |
|
|
import org.apache.poi.ddf.NullEscherSerializationListener; |
|
|
import org.apache.poi.util.LittleEndian; |
|
|
import org.apache.poi.util.LittleEndian; |
|
|
|
|
|
import org.apache.poi.hssf.util.LazilyConcatenatedByteArray; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* The escher container record is used to hold escher records. It is abstract and |
|
|
* The escher container record is used to hold escher records. It is abstract and |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private List<EscherRecord> escherRecords; |
|
|
private List<EscherRecord> escherRecords; |
|
|
private byte[] rawData; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private LazilyConcatenatedByteArray rawDataContainer = new LazilyConcatenatedByteArray(); |
|
|
|
|
|
|
|
|
public AbstractEscherHolderRecord() |
|
|
public AbstractEscherHolderRecord() |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
escherRecords = new ArrayList<EscherRecord>(); |
|
|
escherRecords = new ArrayList<EscherRecord>(); |
|
|
if (! DESERIALISE ) |
|
|
if (! DESERIALISE ) |
|
|
{ |
|
|
{ |
|
|
rawData = in.readRemainder(); |
|
|
|
|
|
|
|
|
rawDataContainer.concatenate(in.readRemainder()); |
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
protected void convertRawBytesToEscherRecords() { |
|
|
protected void convertRawBytesToEscherRecords() { |
|
|
|
|
|
byte[] rawData = getRawData(); |
|
|
convertToEscherRecords(0, rawData.length, rawData); |
|
|
convertToEscherRecords(0, rawData.length, rawData); |
|
|
} |
|
|
} |
|
|
private void convertToEscherRecords( int offset, int size, byte[] data ) |
|
|
private void convertToEscherRecords( int offset, int size, byte[] data ) |
|
|
|
|
|
|
|
|
{ |
|
|
{ |
|
|
LittleEndian.putShort( data, 0 + offset, getSid() ); |
|
|
LittleEndian.putShort( data, 0 + offset, getSid() ); |
|
|
LittleEndian.putShort( data, 2 + offset, (short) ( getRecordSize() - 4 ) ); |
|
|
LittleEndian.putShort( data, 2 + offset, (short) ( getRecordSize() - 4 ) ); |
|
|
|
|
|
byte[] rawData = getRawData(); |
|
|
if ( escherRecords.size() == 0 && rawData != null ) |
|
|
if ( escherRecords.size() == 0 && rawData != null ) |
|
|
{ |
|
|
{ |
|
|
LittleEndian.putShort(data, 0 + offset, getSid()); |
|
|
LittleEndian.putShort(data, 0 + offset, getSid()); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public int getRecordSize() { |
|
|
public int getRecordSize() { |
|
|
|
|
|
byte[] rawData = getRawData(); |
|
|
if (escherRecords.size() == 0 && rawData != null) { |
|
|
if (escherRecords.size() == 0 && rawData != null) { |
|
|
|
|
|
// XXX: It should be possible to derive this without concatenating the array, too. |
|
|
return rawData.length; |
|
|
return rawData.length; |
|
|
} |
|
|
} |
|
|
int size = 0; |
|
|
int size = 0; |
|
|
|
|
|
|
|
|
*/ |
|
|
*/ |
|
|
public void join( AbstractEscherHolderRecord record ) |
|
|
public void join( AbstractEscherHolderRecord record ) |
|
|
{ |
|
|
{ |
|
|
int length = this.rawData.length + record.getRawData().length; |
|
|
|
|
|
byte[] data = new byte[length]; |
|
|
|
|
|
System.arraycopy( rawData, 0, data, 0, rawData.length ); |
|
|
|
|
|
System.arraycopy( record.getRawData(), 0, data, rawData.length, record.getRawData().length ); |
|
|
|
|
|
rawData = data; |
|
|
|
|
|
|
|
|
rawDataContainer.concatenate(record.getRawData()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public void processContinueRecord( byte[] record ) |
|
|
public void processContinueRecord( byte[] record ) |
|
|
{ |
|
|
{ |
|
|
int length = this.rawData.length + record.length; |
|
|
|
|
|
byte[] data = new byte[length]; |
|
|
|
|
|
System.arraycopy( rawData, 0, data, 0, rawData.length ); |
|
|
|
|
|
System.arraycopy( record, 0, data, rawData.length, record.length ); |
|
|
|
|
|
rawData = data; |
|
|
|
|
|
|
|
|
rawDataContainer.concatenate(record); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public byte[] getRawData() |
|
|
public byte[] getRawData() |
|
|
{ |
|
|
{ |
|
|
return rawData; |
|
|
|
|
|
|
|
|
return rawDataContainer.toArray(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public void setRawData( byte[] rawData ) |
|
|
public void setRawData( byte[] rawData ) |
|
|
{ |
|
|
{ |
|
|
this.rawData = rawData; |
|
|
|
|
|
|
|
|
rawDataContainer.clear(); |
|
|
|
|
|
rawDataContainer.concatenate(rawData); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
|
|
|
|
|
|
*/ |
|
|
*/ |
|
|
public void decode() |
|
|
public void decode() |
|
|
{ |
|
|
{ |
|
|
|
|
|
byte[] rawData = getRawData(); |
|
|
convertToEscherRecords(0, rawData.length, rawData ); |
|
|
convertToEscherRecords(0, rawData.length, rawData ); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |