#61243 - Refactor and unify toString/toXml in DDF
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1800452 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cbb15b1efa
commit
a09a3398cc
@ -22,7 +22,6 @@ import java.util.Comparator;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -175,53 +174,20 @@ public abstract class AbstractEscherOptRecord extends EscherRecord
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the string representation of this record.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
protected Object[][] getAttributeMap() {
|
||||||
{
|
List<Object> attrList = new ArrayList<Object>(properties.size()*2+2);
|
||||||
String nl = System.getProperty( "line.separator" );
|
attrList.add("properties");
|
||||||
|
attrList.add(properties.size());
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
for ( EscherProperty property : properties ) {
|
||||||
stringBuilder.append( getClass().getName() );
|
attrList.add(property.getName());
|
||||||
stringBuilder.append( ":" );
|
attrList.add(property);
|
||||||
stringBuilder.append( nl );
|
|
||||||
stringBuilder.append( " isContainer: " );
|
|
||||||
stringBuilder.append( isContainerRecord() );
|
|
||||||
stringBuilder.append( nl );
|
|
||||||
stringBuilder.append( " version: 0x" );
|
|
||||||
stringBuilder.append( HexDump.toHex( getVersion() ) );
|
|
||||||
stringBuilder.append( nl );
|
|
||||||
stringBuilder.append( " instance: 0x" );
|
|
||||||
stringBuilder.append( HexDump.toHex( getInstance() ) );
|
|
||||||
stringBuilder.append( nl );
|
|
||||||
stringBuilder.append( " recordId: 0x" );
|
|
||||||
stringBuilder.append( HexDump.toHex( getRecordId() ) );
|
|
||||||
stringBuilder.append( nl );
|
|
||||||
stringBuilder.append( " numchildren: " );
|
|
||||||
stringBuilder.append( getChildRecords().size() );
|
|
||||||
stringBuilder.append( nl );
|
|
||||||
stringBuilder.append( " properties:" );
|
|
||||||
stringBuilder.append( nl );
|
|
||||||
|
|
||||||
for ( EscherProperty property : properties )
|
|
||||||
{
|
|
||||||
stringBuilder.append(" ").append(property).append(nl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return stringBuilder.toString();
|
return new Object[][]{
|
||||||
}
|
{ "isContainer", isContainerRecord() },
|
||||||
|
{ "numchildren", getChildRecords().size() },
|
||||||
@Override
|
attrList.toArray()
|
||||||
public String toXml(String tab) {
|
};
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(),
|
|
||||||
HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())));
|
|
||||||
for (EscherProperty property: getEscherProperties()){
|
|
||||||
builder.append(property.toXml(tab+"\t"));
|
|
||||||
}
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,6 +121,11 @@ public final class EscherArrayProperty extends EscherComplexProperty implements
|
|||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder results = new StringBuilder();
|
StringBuilder results = new StringBuilder();
|
||||||
|
results.append("propNum: ").append(getPropertyNumber());
|
||||||
|
results.append(", propName: ").append(EscherProperties.getPropertyName( getPropertyNumber() ));
|
||||||
|
results.append(", complex: ").append(isComplex());
|
||||||
|
results.append(", blipId: ").append(isBlipId());
|
||||||
|
results.append(", data: \n");
|
||||||
results.append(" {EscherArrayProperty:" + '\n');
|
results.append(" {EscherArrayProperty:" + '\n');
|
||||||
results.append(" Num Elements: ").append(getNumberOfElementsInArray()).append('\n');
|
results.append(" Num Elements: ").append(getNumberOfElementsInArray()).append('\n');
|
||||||
results.append(" Num Elements In Memory: ").append(getNumberOfElementsInMemory()).append('\n');
|
results.append(" Num Elements In Memory: ").append(getNumberOfElementsInMemory()).append('\n');
|
||||||
@ -130,11 +135,7 @@ public final class EscherArrayProperty extends EscherComplexProperty implements
|
|||||||
}
|
}
|
||||||
results.append("}" + '\n');
|
results.append("}" + '\n');
|
||||||
|
|
||||||
return "propNum: " + getPropertyNumber()
|
return results.toString();
|
||||||
+ ", propName: " + EscherProperties.getPropertyName( getPropertyNumber() )
|
|
||||||
+ ", complex: " + isComplex()
|
|
||||||
+ ", blipId: " + isBlipId()
|
|
||||||
+ ", data: " + '\n' + results;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -146,7 +147,7 @@ public final class EscherArrayProperty extends EscherComplexProperty implements
|
|||||||
for (int i = 0; i < getNumberOfElementsInArray(); i++) {
|
for (int i = 0; i < getNumberOfElementsInArray(); i++) {
|
||||||
builder.append("\t").append(tab).append("<Element>").append(HexDump.toHex(getElement(i))).append("</Element>\n");
|
builder.append("\t").append(tab).append("<Element>").append(HexDump.toHex(getElement(i))).append("</Element>\n");
|
||||||
}
|
}
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,7 +221,9 @@ public final class EscherArrayProperty extends EscherComplexProperty implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] next() {
|
public byte[] next() {
|
||||||
if (!hasNext()) throw new NoSuchElementException();
|
if (!hasNext()) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
return getElement(idx++);
|
return getElement(idx++);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,11 +17,10 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The BSE record is related closely to the <code>EscherBlipRecord</code> and stores
|
* The BSE record is related closely to the {@code EscherBlipRecord} and stores
|
||||||
* extra information about the blip. A blip record is actually stored inside
|
* extra information about the blip. A blip record is actually stored inside
|
||||||
* the BSE record even though the BSE record isn't actually a container record.
|
* the BSE record even though the BSE record isn't actually a container record.
|
||||||
*
|
*
|
||||||
@ -55,6 +54,10 @@ public final class EscherBSERecord extends EscherRecord {
|
|||||||
|
|
||||||
private byte[] _remainingData = new byte[0];
|
private byte[] _remainingData = new byte[0];
|
||||||
|
|
||||||
|
public EscherBSERecord() {
|
||||||
|
setRecordId(RECORD_ID);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {
|
public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {
|
||||||
int bytesRemaining = readHeader( data, offset );
|
int bytesRemaining = readHeader( data, offset );
|
||||||
@ -103,8 +106,7 @@ public final class EscherBSERecord extends EscherRecord {
|
|||||||
|
|
||||||
data[offset + 8] = field_1_blipTypeWin32;
|
data[offset + 8] = field_1_blipTypeWin32;
|
||||||
data[offset + 9] = field_2_blipTypeMacOS;
|
data[offset + 9] = field_2_blipTypeMacOS;
|
||||||
for ( int i = 0; i < 16; i++ )
|
System.arraycopy(field_3_uid, 0, data, offset + 10, 16);
|
||||||
data[offset + 10 + i] = field_3_uid[i];
|
|
||||||
LittleEndian.putShort( data, offset + 26, field_4_tag );
|
LittleEndian.putShort( data, offset + 26, field_4_tag );
|
||||||
LittleEndian.putInt( data, offset + 28, field_5_size );
|
LittleEndian.putInt( data, offset + 28, field_5_size );
|
||||||
LittleEndian.putInt( data, offset + 32, field_6_ref );
|
LittleEndian.putInt( data, offset + 32, field_6_ref );
|
||||||
@ -114,8 +116,7 @@ public final class EscherBSERecord extends EscherRecord {
|
|||||||
data[offset + 42] = field_10_unused2;
|
data[offset + 42] = field_10_unused2;
|
||||||
data[offset + 43] = field_11_unused3;
|
data[offset + 43] = field_11_unused3;
|
||||||
int bytesWritten = 0;
|
int bytesWritten = 0;
|
||||||
if (field_12_blipRecord != null)
|
if (field_12_blipRecord != null) {
|
||||||
{
|
|
||||||
bytesWritten = field_12_blipRecord.serialize( offset + 44, data, new NullEscherSerializationListener() );
|
bytesWritten = field_12_blipRecord.serialize( offset + 44, data, new NullEscherSerializationListener() );
|
||||||
}
|
}
|
||||||
System.arraycopy( _remainingData, 0, data, offset + 44 + bytesWritten, _remainingData.length );
|
System.arraycopy( _remainingData, 0, data, offset + 44 + bytesWritten, _remainingData.length );
|
||||||
@ -350,52 +351,7 @@ public final class EscherBSERecord extends EscherRecord {
|
|||||||
* @param remainingData the remaining bytes
|
* @param remainingData the remaining bytes
|
||||||
*/
|
*/
|
||||||
public void setRemainingData(byte[] remainingData) {
|
public void setRemainingData(byte[] remainingData) {
|
||||||
if (remainingData == null) {
|
_remainingData = (remainingData == null) ? new byte[0] : remainingData.clone();
|
||||||
_remainingData = new byte[0];
|
|
||||||
} else {
|
|
||||||
_remainingData = remainingData.clone();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
String extraData = _remainingData == null ? null : HexDump.toHex(_remainingData, 32);
|
|
||||||
return getClass().getName() + ":" + '\n' +
|
|
||||||
" RecordId: 0x" + HexDump.toHex( RECORD_ID ) + '\n' +
|
|
||||||
" Version: 0x" + HexDump.toHex( getVersion() ) + '\n' +
|
|
||||||
" Instance: 0x" + HexDump.toHex( getInstance() ) + '\n' +
|
|
||||||
" BlipTypeWin32: " + field_1_blipTypeWin32 + '\n' +
|
|
||||||
" BlipTypeMacOS: " + field_2_blipTypeMacOS + '\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' +
|
|
||||||
" Offset: " + field_7_offset + '\n' +
|
|
||||||
" Usage: " + field_8_usage + '\n' +
|
|
||||||
" Name: " + field_9_name + '\n' +
|
|
||||||
" Unused2: " + field_10_unused2 + '\n' +
|
|
||||||
" Unused3: " + field_11_unused3 + '\n' +
|
|
||||||
" blipRecord: " + field_12_blipRecord + '\n' +
|
|
||||||
" Extra Data:" + '\n' + extraData;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<BlipTypeWin32>").append(field_1_blipTypeWin32).append("</BlipTypeWin32>\n")
|
|
||||||
.append(tab).append("\t").append("<BlipTypeMacOS>").append(field_2_blipTypeMacOS).append("</BlipTypeMacOS>\n")
|
|
||||||
.append(tab).append("\t").append("<SUID>").append(field_3_uid == null ? "" : HexDump.toHex(field_3_uid)).append("</SUID>\n")
|
|
||||||
.append(tab).append("\t").append("<Tag>").append(field_4_tag).append("</Tag>\n")
|
|
||||||
.append(tab).append("\t").append("<Size>").append(field_5_size).append("</Size>\n")
|
|
||||||
.append(tab).append("\t").append("<Ref>").append(field_6_ref).append("</Ref>\n")
|
|
||||||
.append(tab).append("\t").append("<Offset>").append(field_7_offset).append("</Offset>\n")
|
|
||||||
.append(tab).append("\t").append("<Usage>").append(field_8_usage).append("</Usage>\n")
|
|
||||||
.append(tab).append("\t").append("<Name>").append(field_9_name).append("</Name>\n")
|
|
||||||
.append(tab).append("\t").append("<Unused2>").append(field_10_unused2).append("</Unused2>\n")
|
|
||||||
.append(tab).append("\t").append("<Unused3>").append(field_11_unused3).append("</Unused3>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -421,4 +377,23 @@ public final class EscherBSERecord extends EscherRecord {
|
|||||||
}
|
}
|
||||||
return " Client";
|
return " Client";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "BlipTypeWin32", field_1_blipTypeWin32 },
|
||||||
|
{ "BlipTypeMacOS", field_2_blipTypeMacOS },
|
||||||
|
{ "SUID", field_3_uid },
|
||||||
|
{ "Tag", field_4_tag },
|
||||||
|
{ "Size", field_5_size },
|
||||||
|
{ "Ref", field_6_ref },
|
||||||
|
{ "Offset", field_7_offset },
|
||||||
|
{ "Usage", field_8_usage },
|
||||||
|
{ "Name", field_9_name },
|
||||||
|
{ "Unused2", field_10_unused2 },
|
||||||
|
{ "Unused3", field_11_unused3 },
|
||||||
|
{ "Blip Record", field_12_blipRecord },
|
||||||
|
{ "Extra Data", _remainingData }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
public class EscherBitmapBlip extends EscherBlipRecord {
|
public class EscherBitmapBlip extends EscherBlipRecord {
|
||||||
@ -110,29 +109,10 @@ public class EscherBitmapBlip extends EscherBlipRecord {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
protected Object[][] getAttributeMap() {
|
||||||
String nl = System.getProperty( "line.separator" );
|
return new Object[][] {
|
||||||
|
{ "Marker", field_2_marker },
|
||||||
String extraData = HexDump.dump(getPicturedata(), 0, 0);
|
{ "Extra Data", getPicturedata() }
|
||||||
|
};
|
||||||
return getClass().getName() + ":" + nl +
|
|
||||||
" RecordId: 0x" + HexDump.toHex( getRecordId() ) + nl +
|
|
||||||
" Version: 0x" + HexDump.toHex( getVersion() ) + nl +
|
|
||||||
" Instance: 0x" + HexDump.toHex( getInstance() ) + nl +
|
|
||||||
" UID: 0x" + HexDump.toHex( field_1_UID ) + nl +
|
|
||||||
" Marker: 0x" + HexDump.toHex( field_2_marker ) + nl +
|
|
||||||
" Extra Data:" + nl + extraData;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
String extraData = HexDump.dump(getPicturedata(), 0, 0);
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<UID>0x").append(HexDump.toHex(field_1_UID)).append("</UID>\n")
|
|
||||||
.append(tab).append("\t").append("<Marker>0x").append(HexDump.toHex(field_2_marker)).append("</Marker>\n")
|
|
||||||
.append(tab).append("\t").append("<ExtraData>").append(extraData).append("</ExtraData>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
|
|
||||||
public class EscherBlipRecord extends EscherRecord {
|
public class EscherBlipRecord extends EscherRecord {
|
||||||
public static final short RECORD_ID_START = (short) 0xF018;
|
public static final short RECORD_ID_START = (short) 0xF018;
|
||||||
@ -100,22 +99,9 @@ public class EscherBlipRecord extends EscherRecord {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
protected Object[][] getAttributeMap() {
|
||||||
String extraData = HexDump.toHex(field_pictureData, 32);
|
return new Object[][] {
|
||||||
return getClass().getName() + ":" + '\n' +
|
{ "Extra Data", getPicturedata() }
|
||||||
" RecordId: 0x" + HexDump.toHex( getRecordId() ) + '\n' +
|
};
|
||||||
" Version: 0x" + HexDump.toHex( getVersion() ) + '\n' +
|
|
||||||
" Instance: 0x" + HexDump.toHex( getInstance() ) + '\n' +
|
|
||||||
" Extra Data:" + '\n' + extraData;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
String extraData = HexDump.toHex(field_pictureData, 32);
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<ExtraData>").append(extraData).append("</ExtraData>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,7 @@ public class EscherBoolProperty
|
|||||||
*
|
*
|
||||||
* @deprecated use !isTrue() instead, planed to be removed in POI 3.17
|
* @deprecated use !isTrue() instead, planed to be removed in POI 3.17
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public boolean isFalse()
|
public boolean isFalse()
|
||||||
{
|
{
|
||||||
return !isTrue();
|
return !isTrue();
|
||||||
@ -77,7 +78,7 @@ public class EscherBoolProperty
|
|||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId()))
|
builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId()))
|
||||||
.append("\" name=\"").append(getName()).append("\" simpleValue=\"").append(getPropertyValue()).append("\" blipId=\"")
|
.append("\" name=\"").append(getName()).append("\" simpleValue=\"").append(getPropertyValue()).append("\" blipId=\"")
|
||||||
.append(isBlipId()).append("\" value=\"").append(isTrue()).append("\"").append("/>\n");
|
.append(isBlipId()).append("\" value=\"").append(isTrue()).append("\"").append("/>");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -96,37 +95,6 @@ public class EscherChildAnchorRecord
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The string representation of this record
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
String nl = System.getProperty("line.separator");
|
|
||||||
|
|
||||||
return getClass().getName() + ":" + nl +
|
|
||||||
" RecordId: 0x" + HexDump.toHex(RECORD_ID) + nl +
|
|
||||||
" Version: 0x" + HexDump.toHex(getVersion()) + nl +
|
|
||||||
" Instance: 0x" + HexDump.toHex(getInstance()) + nl +
|
|
||||||
" X1: " + field_1_dx1 + nl +
|
|
||||||
" Y1: " + field_2_dy1 + nl +
|
|
||||||
" X2: " + field_3_dx2 + nl +
|
|
||||||
" Y2: " + field_4_dy2 + nl ;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<X1>").append(field_1_dx1).append("</X1>\n")
|
|
||||||
.append(tab).append("\t").append("<Y1>").append(field_2_dy1).append("</Y1>\n")
|
|
||||||
.append(tab).append("\t").append("<X2>").append(field_3_dx2).append("</X2>\n")
|
|
||||||
.append(tab).append("\t").append("<Y2>").append(field_4_dy2).append("</Y2>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves offset within the parent coordinate space for the top left point.
|
* Retrieves offset within the parent coordinate space for the top left point.
|
||||||
*
|
*
|
||||||
@ -207,4 +175,13 @@ public class EscherChildAnchorRecord
|
|||||||
this.field_4_dy2 = field_4_dy2;
|
this.field_4_dy2 = field_4_dy2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "X1", field_1_dx1 },
|
||||||
|
{ "Y1", field_2_dy1 },
|
||||||
|
{ "X2", field_3_dx2 },
|
||||||
|
{ "Y2", field_4_dy2 }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -94,7 +93,9 @@ public class EscherClientAnchorRecord
|
|||||||
{
|
{
|
||||||
listener.beforeRecordSerialize( offset, getRecordId(), this );
|
listener.beforeRecordSerialize( offset, getRecordId(), this );
|
||||||
|
|
||||||
if (remainingData == null) remainingData = new byte[0];
|
if (remainingData == null) {
|
||||||
|
remainingData = new byte[0];
|
||||||
|
}
|
||||||
LittleEndian.putShort( data, offset, getOptions() );
|
LittleEndian.putShort( data, offset, getOptions() );
|
||||||
LittleEndian.putShort( data, offset + 2, getRecordId() );
|
LittleEndian.putShort( data, offset + 2, getRecordId() );
|
||||||
int remainingBytes = remainingData.length + (shortRecord ? 8 : 18);
|
int remainingBytes = remainingData.length + (shortRecord ? 8 : 18);
|
||||||
@ -133,53 +134,9 @@ public class EscherClientAnchorRecord
|
|||||||
return "ClientAnchor";
|
return "ClientAnchor";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the string representation for this record.
|
|
||||||
*
|
|
||||||
* @return A string
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
String nl = System.getProperty("line.separator");
|
|
||||||
String extraData = HexDump.dump(this.remainingData, 0, 0);
|
|
||||||
return getClass().getName() + ":" + nl +
|
|
||||||
" RecordId: 0x" + HexDump.toHex(RECORD_ID) + nl +
|
|
||||||
" Version: 0x" + HexDump.toHex(getVersion()) + nl +
|
|
||||||
" Instance: 0x" + HexDump.toHex(getInstance()) + nl +
|
|
||||||
" Flag: " + field_1_flag + nl +
|
|
||||||
" Col1: " + field_2_col1 + nl +
|
|
||||||
" DX1: " + field_3_dx1 + nl +
|
|
||||||
" Row1: " + field_4_row1 + nl +
|
|
||||||
" DY1: " + field_5_dy1 + nl +
|
|
||||||
" Col2: " + field_6_col2 + nl +
|
|
||||||
" DX2: " + field_7_dx2 + nl +
|
|
||||||
" Row2: " + field_8_row2 + nl +
|
|
||||||
" DY2: " + field_9_dy2 + nl +
|
|
||||||
" Extra Data:" + nl + extraData;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
String extraData = HexDump.dump(this.remainingData, 0, 0).trim();
|
|
||||||
return tab + formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())) +
|
|
||||||
tab + "\t" + "<Flag>" + field_1_flag + "</Flag>\n" +
|
|
||||||
tab + "\t" + "<Col1>" + field_2_col1 + "</Col1>\n" +
|
|
||||||
tab + "\t" + "<DX1>" + field_3_dx1 + "</DX1>\n" +
|
|
||||||
tab + "\t" + "<Row1>" + field_4_row1 + "</Row1>\n" +
|
|
||||||
tab + "\t" + "<DY1>" + field_5_dy1 + "</DY1>\n" +
|
|
||||||
tab + "\t" + "<Col2>" + field_6_col2 + "</Col2>\n" +
|
|
||||||
tab + "\t" + "<DX2>" + field_7_dx2 + "</DX2>\n" +
|
|
||||||
tab + "\t" + "<Row2>" + field_8_row2 + "</Row2>\n" +
|
|
||||||
tab + "\t" + "<DY2>" + field_9_dy2 + "</DY2>\n" +
|
|
||||||
tab + "\t" + "<ExtraData>" + extraData + "</ExtraData>\n" +
|
|
||||||
tab + "</" + getClass().getSimpleName() + ">\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
|
* 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
|
||||||
*
|
*
|
||||||
* @return the move/size flag
|
* @return the move/size flag
|
||||||
*/
|
*/
|
||||||
public short getFlag()
|
public short getFlag()
|
||||||
@ -189,7 +146,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
|
* 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
|
||||||
*
|
*
|
||||||
* @param field_1_flag the move/size flag
|
* @param field_1_flag the move/size flag
|
||||||
*/
|
*/
|
||||||
public void setFlag( short field_1_flag )
|
public void setFlag( short field_1_flag )
|
||||||
@ -199,7 +156,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The column number for the top-left position. 0 based.
|
* The column number for the top-left position. 0 based.
|
||||||
*
|
*
|
||||||
* @return the column number of the top-left corner
|
* @return the column number of the top-left corner
|
||||||
*/
|
*/
|
||||||
public short getCol1()
|
public short getCol1()
|
||||||
@ -209,7 +166,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The column number for the top-left position. 0 based.
|
* The column number for the top-left position. 0 based.
|
||||||
*
|
*
|
||||||
* @param field_2_col1 the column number of the top-left corner
|
* @param field_2_col1 the column number of the top-left corner
|
||||||
*/
|
*/
|
||||||
public void setCol1( short field_2_col1 )
|
public void setCol1( short field_2_col1 )
|
||||||
@ -219,7 +176,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The x offset within the top-left cell. Range is from 0 to 1023.
|
* The x offset within the top-left cell. Range is from 0 to 1023.
|
||||||
*
|
*
|
||||||
* @return the x offset of the top-left corner
|
* @return the x offset of the top-left corner
|
||||||
*/
|
*/
|
||||||
public short getDx1()
|
public short getDx1()
|
||||||
@ -229,7 +186,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The x offset within the top-left cell. Range is from 0 to 1023.
|
* The x offset within the top-left cell. Range is from 0 to 1023.
|
||||||
*
|
*
|
||||||
* @param field_3_dx1 the x offset of the top-left corner
|
* @param field_3_dx1 the x offset of the top-left corner
|
||||||
*/
|
*/
|
||||||
public void setDx1( short field_3_dx1 )
|
public void setDx1( short field_3_dx1 )
|
||||||
@ -239,7 +196,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The row number for the top-left corner of the shape.
|
* The row number for the top-left corner of the shape.
|
||||||
*
|
*
|
||||||
* @return the row number of the top-left corner
|
* @return the row number of the top-left corner
|
||||||
*/
|
*/
|
||||||
public short getRow1()
|
public short getRow1()
|
||||||
@ -249,7 +206,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The row number of the top-left corner of the shape.
|
* The row number of the top-left corner of the shape.
|
||||||
*
|
*
|
||||||
* @param field_4_row1 the row number of the top-left corner
|
* @param field_4_row1 the row number of the top-left corner
|
||||||
*/
|
*/
|
||||||
public void setRow1( short field_4_row1 )
|
public void setRow1( short field_4_row1 )
|
||||||
@ -259,7 +216,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The y offset within the top-left corner of the current shape.
|
* The y offset within the top-left corner of the current shape.
|
||||||
*
|
*
|
||||||
* @return the y offset of the top-left corner
|
* @return the y offset of the top-left corner
|
||||||
*/
|
*/
|
||||||
public short getDy1()
|
public short getDy1()
|
||||||
@ -269,7 +226,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The y offset within the top-left corner of the current shape.
|
* The y offset within the top-left corner of the current shape.
|
||||||
*
|
*
|
||||||
* @param field_5_dy1 the y offset of the top-left corner
|
* @param field_5_dy1 the y offset of the top-left corner
|
||||||
*/
|
*/
|
||||||
public void setDy1( short field_5_dy1 )
|
public void setDy1( short field_5_dy1 )
|
||||||
@ -280,7 +237,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The column of the bottom right corner of this shape.
|
* The column of the bottom right corner of this shape.
|
||||||
*
|
*
|
||||||
* @return the column of the bottom right corner
|
* @return the column of the bottom right corner
|
||||||
*/
|
*/
|
||||||
public short getCol2()
|
public short getCol2()
|
||||||
@ -290,7 +247,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The column of the bottom right corner of this shape.
|
* The column of the bottom right corner of this shape.
|
||||||
*
|
*
|
||||||
* @param field_6_col2 the column of the bottom right corner
|
* @param field_6_col2 the column of the bottom right corner
|
||||||
*/
|
*/
|
||||||
public void setCol2( short field_6_col2 )
|
public void setCol2( short field_6_col2 )
|
||||||
@ -301,7 +258,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The x offset withing the cell for the bottom-right corner of this shape.
|
* The x offset withing the cell for the bottom-right corner of this shape.
|
||||||
*
|
*
|
||||||
* @return the x offset of the bottom-right corner
|
* @return the x offset of the bottom-right corner
|
||||||
*/
|
*/
|
||||||
public short getDx2()
|
public short getDx2()
|
||||||
@ -311,7 +268,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The x offset withing the cell for the bottom-right corner of this shape.
|
* The x offset withing the cell for the bottom-right corner of this shape.
|
||||||
*
|
*
|
||||||
* @param field_7_dx2 the x offset of the bottom-right corner
|
* @param field_7_dx2 the x offset of the bottom-right corner
|
||||||
*/
|
*/
|
||||||
public void setDx2( short field_7_dx2 )
|
public void setDx2( short field_7_dx2 )
|
||||||
@ -322,7 +279,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The row number for the bottom-right corner of the current shape.
|
* The row number for the bottom-right corner of the current shape.
|
||||||
*
|
*
|
||||||
* @return the row number for the bottom-right corner
|
* @return the row number for the bottom-right corner
|
||||||
*/
|
*/
|
||||||
public short getRow2()
|
public short getRow2()
|
||||||
@ -332,7 +289,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The row number for the bottom-right corner of the current shape.
|
* The row number for the bottom-right corner of the current shape.
|
||||||
*
|
*
|
||||||
* @param field_8_row2 the row number for the bottom-right corner
|
* @param field_8_row2 the row number for the bottom-right corner
|
||||||
*/
|
*/
|
||||||
public void setRow2( short field_8_row2 )
|
public void setRow2( short field_8_row2 )
|
||||||
@ -343,7 +300,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The y offset withing the cell for the bottom-right corner of this shape.
|
* The y offset withing the cell for the bottom-right corner of this shape.
|
||||||
*
|
*
|
||||||
* @return the y offset of the bottom-right corner
|
* @return the y offset of the bottom-right corner
|
||||||
*/
|
*/
|
||||||
public short getDy2()
|
public short getDy2()
|
||||||
@ -353,7 +310,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The y offset withing the cell for the bottom-right corner of this shape.
|
* The y offset withing the cell for the bottom-right corner of this shape.
|
||||||
*
|
*
|
||||||
* @param field_9_dy2 the y offset of the bottom-right corner
|
* @param field_9_dy2 the y offset of the bottom-right corner
|
||||||
*/
|
*/
|
||||||
public void setDy2( short field_9_dy2 )
|
public void setDy2( short field_9_dy2 )
|
||||||
@ -364,7 +321,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Any remaining data in the record
|
* Any remaining data in the record
|
||||||
*
|
*
|
||||||
* @return the remaining bytes
|
* @return the remaining bytes
|
||||||
*/
|
*/
|
||||||
public byte[] getRemainingData()
|
public byte[] getRemainingData()
|
||||||
@ -374,7 +331,7 @@ public class EscherClientAnchorRecord
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Any remaining data in the record
|
* Any remaining data in the record
|
||||||
*
|
*
|
||||||
* @param remainingData the remaining bytes
|
* @param remainingData the remaining bytes
|
||||||
*/
|
*/
|
||||||
public void setRemainingData( byte[] remainingData ) {
|
public void setRemainingData( byte[] remainingData ) {
|
||||||
@ -384,4 +341,20 @@ public class EscherClientAnchorRecord
|
|||||||
this.remainingData = remainingData.clone();
|
this.remainingData = remainingData.clone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "Flag", field_1_flag },
|
||||||
|
{ "Col1", field_2_col1 },
|
||||||
|
{ "DX1", field_3_dx1 },
|
||||||
|
{ "Row1", field_4_row1 },
|
||||||
|
{ "DY1", field_5_dy1 },
|
||||||
|
{ "Col2", field_6_col2 },
|
||||||
|
{ "DX2", field_7_dx2 },
|
||||||
|
{ "Row2", field_8_row2 },
|
||||||
|
{ "DY2", field_9_dy2 },
|
||||||
|
{ "Extra Data", remainingData }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,7 +45,9 @@ public class EscherClientDataRecord
|
|||||||
public int serialize(int offset, byte[] data, EscherSerializationListener listener) {
|
public int serialize(int offset, byte[] data, EscherSerializationListener listener) {
|
||||||
listener.beforeRecordSerialize( offset, getRecordId(), this );
|
listener.beforeRecordSerialize( offset, getRecordId(), this );
|
||||||
|
|
||||||
if (remainingData == null) remainingData = new byte[0];
|
if (remainingData == null) {
|
||||||
|
remainingData = new byte[0];
|
||||||
|
}
|
||||||
LittleEndian.putShort( data, offset, getOptions() );
|
LittleEndian.putShort( data, offset, getOptions() );
|
||||||
LittleEndian.putShort( data, offset + 2, getRecordId() );
|
LittleEndian.putShort( data, offset + 2, getRecordId() );
|
||||||
LittleEndian.putInt( data, offset + 4, remainingData.length );
|
LittleEndian.putInt( data, offset + 4, remainingData.length );
|
||||||
@ -73,34 +74,6 @@ public class EscherClientDataRecord
|
|||||||
return "ClientData";
|
return "ClientData";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the string representation of this record.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
String nl = System.getProperty("line.separator");
|
|
||||||
String extraData = HexDump.dump(getRemainingData(), 0, 0);
|
|
||||||
return getClass().getName() + ":" + nl +
|
|
||||||
" RecordId: 0x" + HexDump.toHex(RECORD_ID) + nl +
|
|
||||||
" Version: 0x" + HexDump.toHex(getVersion()) + nl +
|
|
||||||
" Instance: 0x" + HexDump.toHex(getInstance()) + nl +
|
|
||||||
" Extra Data:" + nl +
|
|
||||||
extraData;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
String extraData = HexDump.dump(getRemainingData(), 0, 0).trim();
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()),
|
|
||||||
HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<ExtraData>").append(extraData).append("</ExtraData>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Any data recording this record.
|
* Any data recording this record.
|
||||||
*
|
*
|
||||||
@ -121,4 +94,11 @@ public class EscherClientDataRecord
|
|||||||
? new byte[0]
|
? new byte[0]
|
||||||
: remainingData.clone();
|
: remainingData.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "Extra Data", getRemainingData() }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -230,10 +230,14 @@ public class EscherColorRef {
|
|||||||
* @return {@link SysIndexSource} if {@link #hasSysIndexFlag()} is {@code true}, otherwise null
|
* @return {@link SysIndexSource} if {@link #hasSysIndexFlag()} is {@code true}, otherwise null
|
||||||
*/
|
*/
|
||||||
public SysIndexSource getSysIndexSource() {
|
public SysIndexSource getSysIndexSource() {
|
||||||
if (!hasSysIndexFlag()) return null;
|
if (!hasSysIndexFlag()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
int val = FLAG_RED.getValue(colorRef);
|
int val = FLAG_RED.getValue(colorRef);
|
||||||
for (SysIndexSource sis : SysIndexSource.values()) {
|
for (SysIndexSource sis : SysIndexSource.values()) {
|
||||||
if (sis.value == val) return sis;
|
if (sis.value == val) {
|
||||||
|
return sis;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -243,11 +247,17 @@ public class EscherColorRef {
|
|||||||
* @return {@link SysIndexProcedure} if {@link #hasSysIndexFlag()} is {@code true}, otherwise null
|
* @return {@link SysIndexProcedure} if {@link #hasSysIndexFlag()} is {@code true}, otherwise null
|
||||||
*/
|
*/
|
||||||
public SysIndexProcedure getSysIndexProcedure() {
|
public SysIndexProcedure getSysIndexProcedure() {
|
||||||
if (!hasSysIndexFlag()) return null;
|
if (!hasSysIndexFlag()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
int val = FLAG_GREEN.getValue(colorRef);
|
int val = FLAG_GREEN.getValue(colorRef);
|
||||||
for (SysIndexProcedure sip : SysIndexProcedure.values()) {
|
for (SysIndexProcedure sip : SysIndexProcedure.values()) {
|
||||||
if (sip == SysIndexProcedure.INVERT_AFTER || sip == SysIndexProcedure.INVERT_HIGHBIT_AFTER) continue;
|
if (sip == SysIndexProcedure.INVERT_AFTER || sip == SysIndexProcedure.INVERT_HIGHBIT_AFTER) {
|
||||||
if (sip.mask.isSet(val)) return sip;
|
continue;
|
||||||
|
}
|
||||||
|
if (sip.mask.isSet(val)) {
|
||||||
|
return sip;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -257,10 +267,16 @@ public class EscherColorRef {
|
|||||||
* 2 for {@link SysIndexProcedure#INVERT_HIGHBIT_AFTER}
|
* 2 for {@link SysIndexProcedure#INVERT_HIGHBIT_AFTER}
|
||||||
*/
|
*/
|
||||||
public int getSysIndexInvert() {
|
public int getSysIndexInvert() {
|
||||||
if (!hasSysIndexFlag()) return 0;
|
if (!hasSysIndexFlag()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int val = FLAG_GREEN.getValue(colorRef);
|
int val = FLAG_GREEN.getValue(colorRef);
|
||||||
if ((SysIndexProcedure.INVERT_AFTER.mask.isSet(val))) return 1;
|
if ((SysIndexProcedure.INVERT_AFTER.mask.isSet(val))) {
|
||||||
if ((SysIndexProcedure.INVERT_HIGHBIT_AFTER.mask.isSet(val))) return 2;
|
return 1;
|
||||||
|
}
|
||||||
|
if ((SysIndexProcedure.INVERT_HIGHBIT_AFTER.mask.isSet(val))) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,7 +286,9 @@ public class EscherColorRef {
|
|||||||
* @see org.apache.poi.hslf.record.ColorSchemeAtom#getColor(int)
|
* @see org.apache.poi.hslf.record.ColorSchemeAtom#getColor(int)
|
||||||
*/
|
*/
|
||||||
public int getSchemeIndex() {
|
public int getSchemeIndex() {
|
||||||
if (!hasSchemeIndexFlag()) return -1;
|
if (!hasSchemeIndexFlag()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return FLAG_RED.getValue(colorRef);
|
return FLAG_RED.getValue(colorRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,7 +153,7 @@ public class EscherComplexProperty extends EscherProperty {
|
|||||||
return tab + "<" + getClass().getSimpleName() + " id=\"0x" + HexDump.toHex(getId()) +
|
return tab + "<" + getClass().getSimpleName() + " id=\"0x" + HexDump.toHex(getId()) +
|
||||||
"\" name=\"" + getName() + "\" blipId=\"" +
|
"\" name=\"" + getName() + "\" blipId=\"" +
|
||||||
isBlipId() + "\">\n" +
|
isBlipId() + "\">\n" +
|
||||||
tab + "</" + getClass().getSimpleName() + ">\n";
|
tab + "</" + getClass().getSimpleName() + ">";
|
||||||
//builder.append("\t").append(tab).append(dataStr);
|
//builder.append("\t").append(tab).append(dataStr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,9 +126,9 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Do any of our (top level) children have the given recordId?
|
* Do any of our (top level) children have the given recordId?
|
||||||
*
|
*
|
||||||
* @param recordId the recordId of the child
|
* @param recordId the recordId of the child
|
||||||
*
|
*
|
||||||
* @return true, if any child has the given recordId
|
* @return true, if any child has the given recordId
|
||||||
*/
|
*/
|
||||||
public boolean hasChildOfType(short recordId) {
|
public boolean hasChildOfType(short recordId) {
|
||||||
@ -162,7 +162,7 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl
|
|||||||
public Iterator<EscherRecord> getChildIterator() {
|
public Iterator<EscherRecord> getChildIterator() {
|
||||||
return iterator();
|
return iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return an iterator over the child records
|
* @return an iterator over the child records
|
||||||
*/
|
*/
|
||||||
@ -198,7 +198,7 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl
|
|||||||
/**
|
/**
|
||||||
* Returns all of our children which are also
|
* Returns all of our children which are also
|
||||||
* EscherContainers (may be 0, 1, or vary rarely 2 or 3)
|
* EscherContainers (may be 0, 1, or vary rarely 2 or 3)
|
||||||
*
|
*
|
||||||
* @return EscherContainer children
|
* @return EscherContainer children
|
||||||
*/
|
*/
|
||||||
public List<EscherContainerRecord> getChildContainers() {
|
public List<EscherContainerRecord> getChildContainers() {
|
||||||
@ -266,48 +266,6 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl
|
|||||||
_childRecords.add(idx, record);
|
_childRecords.add(idx, record);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
String nl = System.getProperty( "line.separator" );
|
|
||||||
|
|
||||||
StringBuffer children = new StringBuffer();
|
|
||||||
if ( _childRecords.size() > 0 )
|
|
||||||
{
|
|
||||||
children.append( " children: " + nl );
|
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
for ( EscherRecord record : this ) {
|
|
||||||
children.append( " Child " + count + ":" + nl );
|
|
||||||
String childResult = String.valueOf( record );
|
|
||||||
childResult = childResult.replaceAll( "\n", "\n " );
|
|
||||||
children.append( " " );
|
|
||||||
children.append( childResult );
|
|
||||||
children.append( nl );
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return getClass().getName() + " (" + getRecordName() + "):" + nl
|
|
||||||
+ " isContainer: " + isContainerRecord() + nl
|
|
||||||
+ " version: 0x" + HexDump.toHex( getVersion() ) + nl
|
|
||||||
+ " instance: 0x" + HexDump.toHex( getInstance() ) + nl
|
|
||||||
+ " recordId: 0x" + HexDump.toHex( getRecordId() ) + nl
|
|
||||||
+ " numchildren: " + _childRecords.size() + nl
|
|
||||||
+ children;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getRecordName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())));
|
|
||||||
for ( EscherRecord record : this ) {
|
|
||||||
builder.append(record.toXml(tab+"\t"));
|
|
||||||
}
|
|
||||||
builder.append(tab).append("</").append(getRecordName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T extends EscherRecord> T getChildById( short recordId ) {
|
public <T extends EscherRecord> T getChildById( short recordId ) {
|
||||||
for ( EscherRecord childRecord : this ) {
|
for ( EscherRecord childRecord : this ) {
|
||||||
if ( childRecord.getRecordId() == recordId ) {
|
if ( childRecord.getRecordId() == recordId ) {
|
||||||
@ -335,4 +293,21 @@ public final class EscherContainerRecord extends EscherRecord implements Iterabl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
List<Object> chList = new ArrayList<Object>(_childRecords.size()*2+2);
|
||||||
|
chList.add("children");
|
||||||
|
chList.add(_childRecords.size());
|
||||||
|
int count = 0;
|
||||||
|
for ( EscherRecord record : this ) {
|
||||||
|
chList.add("Child "+count);
|
||||||
|
chList.add(record);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return new Object[][] {
|
||||||
|
{ "isContainer", isContainerRecord() },
|
||||||
|
chList.toArray()
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -85,29 +84,6 @@ public class EscherDgRecord
|
|||||||
return "Dg";
|
return "Dg";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the string representation of this record.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return getClass().getName() + ":" + '\n' +
|
|
||||||
" RecordId: 0x" + HexDump.toHex(RECORD_ID) + '\n' +
|
|
||||||
" Version: 0x" + HexDump.toHex(getVersion()) + '\n' +
|
|
||||||
" Instance: 0x" + HexDump.toHex(getInstance()) + '\n' +
|
|
||||||
" NumShapes: " + field_1_numShapes + '\n' +
|
|
||||||
" LastMSOSPID: " + field_2_lastMSOSPID + '\n';
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<NumShapes>").append(field_1_numShapes).append("</NumShapes>\n")
|
|
||||||
.append(tab).append("\t").append("<LastMSOSPID>").append(field_2_lastMSOSPID).append("</LastMSOSPID>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The number of shapes in this drawing group.
|
* The number of shapes in this drawing group.
|
||||||
*
|
*
|
||||||
@ -166,4 +142,12 @@ public class EscherDgRecord
|
|||||||
{
|
{
|
||||||
this.field_1_numShapes++;
|
this.field_1_numShapes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "NumShapes", field_1_numShapes },
|
||||||
|
{ "LastMSOSPID", field_2_lastMSOSPID }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,12 +17,15 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.RecordFormatException;
|
import org.apache.poi.util.RecordFormatException;
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This record defines the drawing groups used for a particular sheet.
|
* This record defines the drawing groups used for a particular sheet.
|
||||||
*/
|
*/
|
||||||
@ -82,8 +85,9 @@ public final class EscherDggRecord extends EscherRecord {
|
|||||||
size += 8;
|
size += 8;
|
||||||
}
|
}
|
||||||
bytesRemaining -= size;
|
bytesRemaining -= size;
|
||||||
if (bytesRemaining != 0)
|
if (bytesRemaining != 0) {
|
||||||
throw new RecordFormatException("Expecting no remaining data but got " + bytesRemaining + " byte(s).");
|
throw new RecordFormatException("Expecting no remaining data but got " + bytesRemaining + " byte(s).");
|
||||||
|
}
|
||||||
return 8 + size + bytesRemaining;
|
return 8 + size + bytesRemaining;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,42 +129,6 @@ public final class EscherDggRecord extends EscherRecord {
|
|||||||
return "Dgg";
|
return "Dgg";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
|
|
||||||
StringBuilder field_5_string = new StringBuilder();
|
|
||||||
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');
|
|
||||||
field_5_string.append(" NumShapeIdsUsed").append(i+1).append(": ");
|
|
||||||
field_5_string.append(field_5_fileIdClusters[i].field_2_numShapeIdsUsed);
|
|
||||||
field_5_string.append('\n');
|
|
||||||
}
|
|
||||||
return getClass().getName() + ":" + '\n' +
|
|
||||||
" RecordId: 0x" + HexDump.toHex(RECORD_ID) + '\n' +
|
|
||||||
" Version: 0x" + HexDump.toHex(getVersion()) + '\n' +
|
|
||||||
" Instance: 0x" + HexDump.toHex(getInstance()) + '\n' +
|
|
||||||
" ShapeIdMax: " + field_1_shapeIdMax + '\n' +
|
|
||||||
" NumIdClusters: " + getNumIdClusters() + '\n' +
|
|
||||||
" NumShapesSaved: " + field_3_numShapesSaved + '\n' +
|
|
||||||
" DrawingsSaved: " + field_4_drawingsSaved + '\n' +
|
|
||||||
"" + field_5_string;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<ShapeIdMax>").append(field_1_shapeIdMax).append("</ShapeIdMax>\n")
|
|
||||||
.append(tab).append("\t").append("<NumIdClusters>").append(getNumIdClusters()).append("</NumIdClusters>\n")
|
|
||||||
.append(tab).append("\t").append("<NumShapesSaved>").append(field_3_numShapesSaved).append("</NumShapesSaved>\n")
|
|
||||||
.append(tab).append("\t").append("<DrawingsSaved>").append(field_4_drawingsSaved).append("</DrawingsSaved>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the next available shape id
|
* Gets the next available shape id
|
||||||
*
|
*
|
||||||
@ -280,7 +248,9 @@ public final class EscherDggRecord extends EscherRecord {
|
|||||||
public void addCluster( int dgId, int numShapedUsed, boolean sort ) {
|
public void addCluster( int dgId, int numShapedUsed, boolean sort ) {
|
||||||
List<FileIdCluster> clusters = new ArrayList<FileIdCluster>(Arrays.asList(field_5_fileIdClusters));
|
List<FileIdCluster> clusters = new ArrayList<FileIdCluster>(Arrays.asList(field_5_fileIdClusters));
|
||||||
clusters.add(new FileIdCluster(dgId, numShapedUsed));
|
clusters.add(new FileIdCluster(dgId, numShapedUsed));
|
||||||
if(sort) Collections.sort(clusters, MY_COMP );
|
if(sort) {
|
||||||
|
Collections.sort(clusters, MY_COMP );
|
||||||
|
}
|
||||||
maxDgId = Math.min(maxDgId, dgId);
|
maxDgId = Math.min(maxDgId, dgId);
|
||||||
field_5_fileIdClusters = clusters.toArray( new FileIdCluster[clusters.size()] );
|
field_5_fileIdClusters = clusters.toArray( new FileIdCluster[clusters.size()] );
|
||||||
}
|
}
|
||||||
@ -297,4 +267,25 @@ public final class EscherDggRecord extends EscherRecord {
|
|||||||
return +1;
|
return +1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
List<Object> fldIds = new ArrayList<Object>();
|
||||||
|
fldIds.add("FileId Clusters");
|
||||||
|
fldIds.add(field_5_fileIdClusters.length);
|
||||||
|
if(field_5_fileIdClusters != null) {
|
||||||
|
for (FileIdCluster fic : field_5_fileIdClusters) {
|
||||||
|
fldIds.add("Group"+fic.field_1_drawingGroupId);
|
||||||
|
fldIds.add(fic.field_2_numShapeIdsUsed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Object[][] {
|
||||||
|
{ "ShapeIdMax", field_1_shapeIdMax },
|
||||||
|
{ "NumIdClusters", getNumIdClusters() },
|
||||||
|
{ "NumShapesSaved", field_3_numShapesSaved },
|
||||||
|
{ "DrawingsSaved", field_4_drawingsSaved },
|
||||||
|
fldIds.toArray()
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,16 +17,16 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.HexRead;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.zip.InflaterInputStream;
|
import java.util.zip.InflaterInputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.util.HexDump;
|
||||||
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to dump the contents of escher records to a PrintStream.
|
* Used to dump the contents of escher records to a PrintStream.
|
||||||
*/
|
*/
|
||||||
@ -185,12 +185,13 @@ public final class EscherDump {
|
|||||||
recordName = "MsofbtUDefProp";
|
recordName = "MsofbtUDefProp";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if ( recordId >= (short) 0xF018 && recordId <= (short) 0xF117 )
|
if ( recordId >= (short) 0xF018 && recordId <= (short) 0xF117 ) {
|
||||||
recordName = "MsofbtBLIP";
|
recordName = "MsofbtBLIP";
|
||||||
else if ( ( options & (short) 0x000F ) == (short) 0x000F )
|
} else if ( ( options & (short) 0x000F ) == (short) 0x000F ) {
|
||||||
recordName = "UNKNOWN container";
|
recordName = "UNKNOWN container";
|
||||||
else
|
} else {
|
||||||
recordName = "UNKNOWN ID";
|
recordName = "UNKNOWN ID";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder stringBuf = new StringBuilder();
|
StringBuilder stringBuf = new StringBuilder();
|
||||||
@ -308,8 +309,9 @@ public final class EscherDump {
|
|||||||
out.print( " " + propertyId );
|
out.print( " " + propertyId );
|
||||||
if ( ( n16 & (short) 0x8000 ) == 0 )
|
if ( ( n16 & (short) 0x8000 ) == 0 )
|
||||||
{
|
{
|
||||||
if ( ( n16 & (short) 0x4000 ) != 0 )
|
if ( ( n16 & (short) 0x4000 ) != 0 ) {
|
||||||
out.print( ", fBlipID" );
|
out.print( ", fBlipID" );
|
||||||
|
}
|
||||||
out.print( ") " );
|
out.print( ") " );
|
||||||
|
|
||||||
out.print( HexDump.toHex( n32 ) );
|
out.print( HexDump.toHex( n32 ) );
|
||||||
@ -386,8 +388,9 @@ public final class EscherDump {
|
|||||||
|
|
||||||
byte[] buf = new byte[nDumpSize];
|
byte[] buf = new byte[nDumpSize];
|
||||||
int read = in.read( buf );
|
int read = in.read( buf );
|
||||||
while ( read != -1 && read < nDumpSize )
|
while ( read != -1 && read < nDumpSize ) {
|
||||||
read += in.read( buf, read, buf.length );
|
read += in.read( buf, read, buf.length );
|
||||||
|
}
|
||||||
ByteArrayInputStream bin = new ByteArrayInputStream( buf );
|
ByteArrayInputStream bin = new ByteArrayInputStream( buf );
|
||||||
|
|
||||||
InputStream in1 = new InflaterInputStream( bin );
|
InputStream in1 = new InflaterInputStream( bin );
|
||||||
@ -402,10 +405,11 @@ public final class EscherDump {
|
|||||||
boolean isContainer = ( options & (short) 0x000F ) == (short) 0x000F;
|
boolean isContainer = ( options & (short) 0x000F ) == (short) 0x000F;
|
||||||
if ( isContainer && remainingBytes >= 0 )
|
if ( isContainer && remainingBytes >= 0 )
|
||||||
{ // Container
|
{ // Container
|
||||||
if ( recordBytesRemaining <= (int) remainingBytes )
|
if ( recordBytesRemaining <= (int) remainingBytes ) {
|
||||||
out.println( " completed within" );
|
out.println( " completed within" );
|
||||||
else
|
} else {
|
||||||
out.println( " continued elsewhere" );
|
out.println( " continued elsewhere" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if ( remainingBytes >= 0 )
|
else if ( remainingBytes >= 0 )
|
||||||
// -> 0x0000 ... 0x0FFF
|
// -> 0x0000 ... 0x0FFF
|
||||||
@ -417,9 +421,9 @@ public final class EscherDump {
|
|||||||
HexDump.dump( in, out, 0, nDumpSize );
|
HexDump.dump( in, out, 0, nDumpSize );
|
||||||
remainingBytes -= nDumpSize;
|
remainingBytes -= nDumpSize;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
out.println( " >> OVERRUN <<" );
|
out.println( " >> OVERRUN <<" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,19 +17,18 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
|
||||||
import org.apache.poi.util.POILogFactory;
|
|
||||||
import org.apache.poi.util.POILogger;
|
|
||||||
import org.apache.poi.hssf.usermodel.HSSFPictureData;
|
|
||||||
|
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.zip.InflaterInputStream;
|
|
||||||
import java.util.zip.DeflaterOutputStream;
|
import java.util.zip.DeflaterOutputStream;
|
||||||
|
import java.util.zip.InflaterInputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFPictureData;
|
||||||
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
public final class EscherMetafileBlip extends EscherBlipRecord {
|
public final class EscherMetafileBlip extends EscherBlipRecord {
|
||||||
private static final POILogger log = POILogFactory.getLogger(EscherMetafileBlip.class);
|
private static final POILogger log = POILogFactory.getLogger(EscherMetafileBlip.class);
|
||||||
@ -159,7 +158,9 @@ public final class EscherMetafileBlip extends EscherBlipRecord {
|
|||||||
@Override
|
@Override
|
||||||
public int getRecordSize() {
|
public int getRecordSize() {
|
||||||
int size = 8 + 50 + raw_pictureData.length;
|
int size = 8 + 50 + raw_pictureData.length;
|
||||||
if(remainingData != null) size += remainingData.length;
|
if(remainingData != null) {
|
||||||
|
size += remainingData.length;
|
||||||
|
}
|
||||||
if((getOptions() ^ getSignature()) == 0x10){
|
if((getOptions() ^ getSignature()) == 0x10){
|
||||||
size += field_2_UID.length;
|
size += field_2_UID.length;
|
||||||
}
|
}
|
||||||
@ -309,6 +310,26 @@ public final class EscherMetafileBlip extends EscherBlipRecord {
|
|||||||
field_6_fCompression = compressed ? 0 : (byte)0xFE;
|
field_6_fCompression = compressed ? 0 : (byte)0xFE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the filter byte - this is usually 0xFE
|
||||||
|
*
|
||||||
|
* @return the filter byte
|
||||||
|
*/
|
||||||
|
public byte getFilter() {
|
||||||
|
return field_7_fFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the filter byte - this is usually 0xFE
|
||||||
|
*
|
||||||
|
* @param filter the filter byte
|
||||||
|
*/
|
||||||
|
public void setFilter(byte filter) {
|
||||||
|
field_7_fFilter = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns any remaining bytes
|
* Returns any remaining bytes
|
||||||
*
|
*
|
||||||
@ -317,48 +338,7 @@ public final class EscherMetafileBlip extends EscherBlipRecord {
|
|||||||
public byte[] getRemainingData() {
|
public byte[] getRemainingData() {
|
||||||
return remainingData;
|
return remainingData;
|
||||||
}
|
}
|
||||||
|
|
||||||
// filtering is always 254 according to available docs, so no point giving it a setter method.
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
String extraData = "";//HexDump.toHex(field_pictureData, 32);
|
|
||||||
return getClass().getName() + ":" + '\n' +
|
|
||||||
" RecordId: 0x" + HexDump.toHex( getRecordId() ) + '\n' +
|
|
||||||
" Version: 0x" + HexDump.toHex( getVersion() ) + '\n' +
|
|
||||||
" Instance: 0x" + HexDump.toHex( getInstance() ) + '\n' +
|
|
||||||
" UID: 0x" + HexDump.toHex( field_1_UID ) + '\n' +
|
|
||||||
(field_2_UID == null ? "" : (" UID2: 0x" + HexDump.toHex( field_2_UID ) + '\n')) +
|
|
||||||
" Uncompressed Size: " + HexDump.toHex( field_2_cb ) + '\n' +
|
|
||||||
" Bounds: " + getBounds() + '\n' +
|
|
||||||
" Size in EMU: " + getSizeEMU() + '\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 +
|
|
||||||
(remainingData == null ? null : ("\n" +
|
|
||||||
" Remaining Data: " + HexDump.toHex(remainingData, 32)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
String extraData = "";
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<UID>0x").append(HexDump.toHex( field_1_UID ) + '\n' +
|
|
||||||
(field_2_UID == null ? "" : (" UID2: 0x" + HexDump.toHex( field_2_UID ) + '\n'))).append("</UID>\n")
|
|
||||||
.append(tab).append("\t").append("<UncompressedSize>0x").append(HexDump.toHex( field_2_cb )).append("</UncompressedSize>\n")
|
|
||||||
.append(tab).append("\t").append("<Bounds>").append(getBounds()).append("</Bounds>\n")
|
|
||||||
.append(tab).append("\t").append("<SizeInEMU>").append(getSizeEMU()).append("</SizeInEMU>\n")
|
|
||||||
.append(tab).append("\t").append("<CompressedSize>0x").append(HexDump.toHex( field_5_cbSave )).append("</CompressedSize>\n")
|
|
||||||
.append(tab).append("\t").append("<Compression>0x").append(HexDump.toHex( field_6_fCompression )).append("</Compression>\n")
|
|
||||||
.append(tab).append("\t").append("<Filter>0x").append(HexDump.toHex( field_7_fFilter )).append("</Filter>\n")
|
|
||||||
.append(tab).append("\t").append("<ExtraData>").append(extraData).append("</ExtraData>\n")
|
|
||||||
.append(tab).append("\t").append("<RemainingData>0x").append(HexDump.toHex(remainingData, 32)).append("</RemainingData>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the blip signature
|
* Return the blip signature
|
||||||
*
|
*
|
||||||
@ -399,12 +379,19 @@ public final class EscherMetafileBlip extends EscherBlipRecord {
|
|||||||
setCompressed(true);
|
setCompressed(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Sets the filter byte - usually this is 0xFE
|
protected Object[][] getAttributeMap() {
|
||||||
*
|
return new Object[][]{
|
||||||
* @param filter the filter byte
|
// record, version, instance are directly fetched
|
||||||
*/
|
{ "UID", field_1_UID, "UID2", field_2_UID },
|
||||||
public void setFilter(byte filter) {
|
{ "Uncompressed Size", field_2_cb },
|
||||||
field_7_fFilter = filter;
|
{ "Bounds", getBounds().toString() },
|
||||||
|
{ "Size in EMU", getSizeEMU().toString() },
|
||||||
|
{ "Compressed Size", field_5_cbSave },
|
||||||
|
{ "Compression", field_6_fCompression },
|
||||||
|
{ "Filter", field_7_fFilter },
|
||||||
|
{ "Extra Data", "" },
|
||||||
|
{ "Remaining Data", remainingData }
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,9 +65,10 @@ public class EscherOptRecord extends AbstractEscherOptRecord
|
|||||||
@Override
|
@Override
|
||||||
public void setVersion( short value )
|
public void setVersion( short value )
|
||||||
{
|
{
|
||||||
if ( value != 0x3 )
|
if ( value != 0x3 ) {
|
||||||
throw new IllegalArgumentException( RECORD_DESCRIPTION
|
throw new IllegalArgumentException( RECORD_DESCRIPTION
|
||||||
+ " can have only '0x3' version" );
|
+ " can have only '0x3' version" );
|
||||||
|
}
|
||||||
|
|
||||||
super.setVersion( value );
|
super.setVersion( value );
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
|
||||||
import org.apache.poi.util.POILogFactory;
|
|
||||||
import org.apache.poi.util.POILogger;
|
|
||||||
|
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
@ -29,6 +24,10 @@ import java.io.ByteArrayOutputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.zip.InflaterInputStream;
|
import java.util.zip.InflaterInputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
public final class EscherPictBlip extends EscherBlipRecord {
|
public final class EscherPictBlip extends EscherBlipRecord {
|
||||||
private static final POILogger log = POILogFactory.getLogger(EscherPictBlip.class);
|
private static final POILogger log = POILogFactory.getLogger(EscherPictBlip.class);
|
||||||
|
|
||||||
@ -260,39 +259,35 @@ public final class EscherPictBlip extends EscherBlipRecord {
|
|||||||
field_6_fCompression = compressed ? 0 : (byte)0xFE;
|
field_6_fCompression = compressed ? 0 : (byte)0xFE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// filtering is always 254 according to available docs, so no point giving it a setter method.
|
/**
|
||||||
|
* Gets the filter byte - this is usually 0xFE
|
||||||
@Override
|
*
|
||||||
public String toString() {
|
* @return the filter byte
|
||||||
String extraData = HexDump.toHex(getPicturedata(), 32);
|
*/
|
||||||
return getClass().getName() + ":" + '\n' +
|
public byte getFilter() {
|
||||||
" RecordId: 0x" + HexDump.toHex( getRecordId() ) + '\n' +
|
return field_7_fFilter;
|
||||||
" Version: 0x" + HexDump.toHex( getVersion() ) + '\n' +
|
}
|
||||||
" Instance: 0x" + HexDump.toHex( getInstance() ) + '\n' +
|
|
||||||
" UID: 0x" + HexDump.toHex( field_1_UID ) + '\n' +
|
/**
|
||||||
" Uncompressed Size: " + HexDump.toHex( field_2_cb ) + '\n' +
|
* Sets the filter byte - this is usually 0xFE
|
||||||
" Bounds: " + getBounds() + '\n' +
|
*
|
||||||
" Size in EMU: " + getSizeEMU() + '\n' +
|
* @param filter the filter byte
|
||||||
" Compressed Size: " + HexDump.toHex( field_5_cbSave ) + '\n' +
|
*/
|
||||||
" Compression: " + HexDump.toHex( field_6_fCompression ) + '\n' +
|
public void setFilter(byte filter) {
|
||||||
" Filter: " + HexDump.toHex( field_7_fFilter ) + '\n' +
|
field_7_fFilter = filter;
|
||||||
" Extra Data:" + '\n' + extraData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toXml(String tab) {
|
protected Object[][] getAttributeMap() {
|
||||||
String extraData = "";
|
return new Object[][]{
|
||||||
StringBuilder builder = new StringBuilder();
|
{ "UID", field_1_UID },
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
{ "Uncompressed Size", field_2_cb },
|
||||||
.append(tab).append("\t").append("<UID>0x").append(HexDump.toHex( field_1_UID )).append("</UID>\n")
|
{ "Bounds", getBounds().toString() },
|
||||||
.append(tab).append("\t").append("<UncompressedSize>0x").append(HexDump.toHex( field_2_cb )).append("</UncompressedSize>\n")
|
{ "Size in EMU", getSizeEMU().toString() },
|
||||||
.append(tab).append("\t").append("<Bounds>").append(getBounds()).append("</Bounds>\n")
|
{ "Compressed Size", field_5_cbSave },
|
||||||
.append(tab).append("\t").append("<SizeInEMU>").append(getSizeEMU()).append("</SizeInEMU>\n")
|
{ "Compression", field_6_fCompression },
|
||||||
.append(tab).append("\t").append("<CompressedSize>0x").append(HexDump.toHex( field_5_cbSave )).append("</CompressedSize>\n")
|
{ "Filter", field_7_fFilter },
|
||||||
.append(tab).append("\t").append("<Compression>0x").append(HexDump.toHex( field_6_fCompression )).append("</Compression>\n")
|
{ "Extra Data", getPicturedata() },
|
||||||
.append(tab).append("\t").append("<Filter>0x").append(HexDump.toHex( field_7_fFilter )).append("</Filter>\n")
|
};
|
||||||
.append(tab).append("\t").append("<ExtraData>").append(extraData).append("</ExtraData>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,4 +107,8 @@ public abstract class EscherProperty {
|
|||||||
* @return the length of the part
|
* @return the length of the part
|
||||||
*/
|
*/
|
||||||
abstract public int serializeComplexPart( byte[] data, int pos );
|
abstract public int serializeComplexPart( byte[] data, int pos );
|
||||||
}
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
abstract public String toString();
|
||||||
|
}
|
@ -68,7 +68,7 @@ public class EscherRGBProperty
|
|||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId()))
|
builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId()))
|
||||||
.append("\" name=\"").append(getName()).append("\" blipId=\"")
|
.append("\" name=\"").append(getName()).append("\" blipId=\"")
|
||||||
.append(isBlipId()).append("\" value=\"0x").append(HexDump.toHex(getRgbColor())).append("\"/>\n");
|
.append(isBlipId()).append("\" value=\"0x").append(HexDump.toHex(getRgbColor())).append("\"/>");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,11 +48,11 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Delegates to fillFields(byte[], int, EscherRecordFactory)
|
* Delegates to fillFields(byte[], int, EscherRecordFactory)
|
||||||
*
|
*
|
||||||
* @param data they bytes to serialize from
|
* @param data they bytes to serialize from
|
||||||
* @param f the escher record factory
|
* @param f the escher record factory
|
||||||
* @return The number of bytes written.
|
* @return The number of bytes written.
|
||||||
*
|
*
|
||||||
* @see #fillFields(byte[], int, org.apache.poi.ddf.EscherRecordFactory)
|
* @see #fillFields(byte[], int, org.apache.poi.ddf.EscherRecordFactory)
|
||||||
*/
|
*/
|
||||||
protected int fillFields( byte[] data, EscherRecordFactory f )
|
protected int fillFields( byte[] data, EscherRecordFactory f )
|
||||||
@ -100,7 +100,7 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine whether this is a container record by inspecting the option field.
|
* Determine whether this is a container record by inspecting the option field.
|
||||||
*
|
*
|
||||||
* @return true is this is a container field.
|
* @return true is this is a container field.
|
||||||
*/
|
*/
|
||||||
public boolean isContainerRecord() {
|
public boolean isContainerRecord() {
|
||||||
@ -110,7 +110,7 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
/**
|
/**
|
||||||
* Note that <code>options</code> is an internal field.
|
* Note that <code>options</code> is an internal field.
|
||||||
* Use {@link #setInstance(short)} ()} and {@link #setVersion(short)} ()} to set the actual fields.
|
* Use {@link #setInstance(short)} ()} and {@link #setVersion(short)} ()} to set the actual fields.
|
||||||
*
|
*
|
||||||
* @return The options field for this record. All records have one.
|
* @return The options field for this record. All records have one.
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
@ -122,10 +122,10 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
/**
|
/**
|
||||||
* Set the options this this record. Container records should have the
|
* Set the options this this record. Container records should have the
|
||||||
* last nibble set to 0xF.<p>
|
* last nibble set to 0xF.<p>
|
||||||
*
|
*
|
||||||
* Note that {@code options} is an internal field.
|
* Note that {@code options} is an internal field.
|
||||||
* Use {@link #getInstance()} and {@link #getVersion()} to access actual fields.
|
* Use {@link #getInstance()} and {@link #getVersion()} to access actual fields.
|
||||||
*
|
*
|
||||||
* @param options the record options
|
* @param options the record options
|
||||||
*/
|
*/
|
||||||
@Internal
|
@Internal
|
||||||
@ -198,7 +198,7 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the record id for this record.
|
* Sets the record id for this record.
|
||||||
*
|
*
|
||||||
* @param recordId the record id
|
* @param recordId the record id
|
||||||
*/
|
*/
|
||||||
public void setRecordId( short recordId ) {
|
public void setRecordId( short recordId ) {
|
||||||
@ -226,9 +226,9 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Escher records may need to be clonable in the future.
|
* Escher records may need to be clonable in the future.
|
||||||
*
|
*
|
||||||
* @return the cloned object
|
* @return the cloned object
|
||||||
*
|
*
|
||||||
* @throws CloneNotSupportedException if the subclass hasn't implemented {@link Cloneable}
|
* @throws CloneNotSupportedException if the subclass hasn't implemented {@link Cloneable}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -238,7 +238,7 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the indexed child record.
|
* Returns the indexed child record.
|
||||||
*
|
*
|
||||||
* @param index the index of the child within the child records
|
* @param index the index of the child within the child records
|
||||||
* @return the indexed child record
|
* @return the indexed child record
|
||||||
*/
|
*/
|
||||||
@ -255,20 +255,22 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
*/
|
*/
|
||||||
public void display(PrintWriter w, int indent)
|
public void display(PrintWriter w, int indent)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < indent * 4; i++) w.print(' ');
|
for (int i = 0; i < indent * 4; i++) {
|
||||||
|
w.print(' ');
|
||||||
|
}
|
||||||
w.println(getRecordName());
|
w.println(getRecordName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subclasses should return the short name for this escher record.
|
* Subclasses should return the short name for this escher record.
|
||||||
*
|
*
|
||||||
* @return the short name for this escher record
|
* @return the short name for this escher record
|
||||||
*/
|
*/
|
||||||
public abstract String getRecordName();
|
public abstract String getRecordName();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the instance part of the option record.
|
* Returns the instance part of the option record.
|
||||||
*
|
*
|
||||||
* @return The instance part of the record
|
* @return The instance part of the record
|
||||||
*/
|
*/
|
||||||
public short getInstance()
|
public short getInstance()
|
||||||
@ -278,7 +280,7 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the instance part of record
|
* Sets the instance part of record
|
||||||
*
|
*
|
||||||
* @param value instance part value
|
* @param value instance part value
|
||||||
*/
|
*/
|
||||||
public void setInstance( short value )
|
public void setInstance( short value )
|
||||||
@ -288,7 +290,7 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the version part of the option record.
|
* Returns the version part of the option record.
|
||||||
*
|
*
|
||||||
* @return The version part of the option record
|
* @return The version part of the option record
|
||||||
*/
|
*/
|
||||||
public short getVersion()
|
public short getVersion()
|
||||||
@ -298,7 +300,7 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the version part of record
|
* Sets the version part of record
|
||||||
*
|
*
|
||||||
* @param value version part value
|
* @param value version part value
|
||||||
*/
|
*/
|
||||||
public void setVersion( short value )
|
public void setVersion( short value )
|
||||||
@ -306,23 +308,196 @@ public abstract class EscherRecord implements Cloneable {
|
|||||||
_options = fVersion.setShortValue( _options, value );
|
_options = fVersion.setShortValue( _options, value );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param tab - each children must be a right of his parent
|
|
||||||
* @return xml representation of this record
|
|
||||||
*/
|
|
||||||
public String toXml(String tab){
|
|
||||||
return tab + "<" + getClass().getSimpleName() + ">\n" +
|
|
||||||
tab + "\t" + "<RecordId>0x" + HexDump.toHex(_recordId) + "</RecordId>\n" +
|
|
||||||
tab + "\t" + "<Options>" + _options + "</Options>\n" +
|
|
||||||
tab + "</" + getClass().getSimpleName() + ">\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String formatXmlRecordHeader(String className, String recordId, String version, String instance){
|
|
||||||
return "<" + className + " recordId=\"0x" + recordId + "\" version=\"0x" +
|
|
||||||
version + "\" instance=\"0x" + instance + "\" size=\"" + getRecordSize() + "\">\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toXml(){
|
public String toXml(){
|
||||||
return toXml("");
|
return toXml("");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* @param tab - each children must be indented right relative to its parent
|
||||||
|
* @return xml representation of this record
|
||||||
|
*/
|
||||||
|
public final String toXml(String tab){
|
||||||
|
final String nl = System.getProperty( "line.separator" );
|
||||||
|
String clsNm = getClass().getSimpleName();
|
||||||
|
StringBuilder sb = new StringBuilder(1000);
|
||||||
|
sb.append(tab).append("<").append(clsNm)
|
||||||
|
.append(" recordId=\"0x").append(HexDump.toHex(getRecordId()))
|
||||||
|
.append("\" version=\"0x").append(HexDump.toHex(getVersion()))
|
||||||
|
.append("\" instance=\"0x").append(HexDump.toHex(getInstance()))
|
||||||
|
.append("\" options=\"0x").append(HexDump.toHex(getOptions()))
|
||||||
|
.append("\" recordSize=\"").append(getRecordSize());
|
||||||
|
Object[][] attrList = getAttributeMap();
|
||||||
|
if (attrList == null || attrList.length == 0) {
|
||||||
|
sb.append("\" />").append(nl);
|
||||||
|
} else {
|
||||||
|
sb.append("\">").append(nl);
|
||||||
|
String childTab = tab+" ";
|
||||||
|
for (Object[] attrs : attrList) {
|
||||||
|
String tagName = capitalizeAndTrim((String)attrs[0]);
|
||||||
|
boolean hasValue = false;
|
||||||
|
boolean lastChildComplex = false;
|
||||||
|
for (int i=0; i<attrs.length; i+=2) {
|
||||||
|
Object value = attrs[i+1];
|
||||||
|
if (value == null) {
|
||||||
|
// ignore null values
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!hasValue) {
|
||||||
|
// only add tagname, when there was a value
|
||||||
|
sb.append(childTab).append("<").append(tagName).append(">");
|
||||||
|
}
|
||||||
|
// add names for optional attributes
|
||||||
|
String optName = capitalizeAndTrim((String)attrs[i+0]);
|
||||||
|
if (i>0) {
|
||||||
|
sb.append(nl).append(childTab).append(" <").append(optName).append(">");
|
||||||
|
}
|
||||||
|
lastChildComplex = appendValue(sb, value, true, childTab);
|
||||||
|
if (i>0) {
|
||||||
|
sb.append(nl).append(childTab).append(" </").append(optName).append(">");
|
||||||
|
}
|
||||||
|
hasValue = true;
|
||||||
|
}
|
||||||
|
if (hasValue) {
|
||||||
|
if (lastChildComplex) {
|
||||||
|
sb.append(nl).append(childTab);
|
||||||
|
}
|
||||||
|
sb.append("</").append(tagName).append(">").append(nl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.append(tab).append("</").append(clsNm).append(">");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final String toString() {
|
||||||
|
final String nl = System.getProperty( "line.separator" );
|
||||||
|
StringBuilder sb = new StringBuilder(1000);
|
||||||
|
sb.append(getClass().getName()).append(" (").append(getRecordName()).append("):").append(nl)
|
||||||
|
.append(" RecordId: 0x").append(HexDump.toHex( getRecordId() )).append(nl)
|
||||||
|
.append(" Version: 0x").append(HexDump.toHex( getVersion() )).append(nl)
|
||||||
|
.append(" Instance: 0x").append(HexDump.toHex( getInstance() )).append(nl)
|
||||||
|
.append(" Options: 0x").append(HexDump.toHex( getOptions() )).append(nl)
|
||||||
|
.append(" Record Size: ").append( getRecordSize() );
|
||||||
|
|
||||||
|
Object[][] attrList = getAttributeMap();
|
||||||
|
if (attrList != null && attrList.length > 0) {
|
||||||
|
String childTab = " ";
|
||||||
|
for (Object[] attrs : attrList) {
|
||||||
|
for (int i=0; i<attrs.length; i+=2) {
|
||||||
|
Object value = attrs[i+1];
|
||||||
|
if (value == null) {
|
||||||
|
// ignore null values
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String name = (String)attrs[i+0];
|
||||||
|
sb.append(nl).append(childTab).append(name).append(": ");
|
||||||
|
appendValue(sb, value, false, childTab);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true, if value was a complex record, false otherwise
|
||||||
|
*/
|
||||||
|
private static boolean appendValue(StringBuilder sb, Object value, boolean toXML, String childTab) {
|
||||||
|
final String nl = System.getProperty( "line.separator" );
|
||||||
|
boolean isComplex = false;
|
||||||
|
if (value instanceof String) {
|
||||||
|
if (toXML) {
|
||||||
|
escapeXML((String)value, sb);
|
||||||
|
} else {
|
||||||
|
sb.append((String)value);
|
||||||
|
}
|
||||||
|
} else if (value instanceof Byte) {
|
||||||
|
sb.append("0x").append(HexDump.toHex((Byte)value));
|
||||||
|
} else if (value instanceof Short) {
|
||||||
|
sb.append("0x").append(HexDump.toHex((Short)value));
|
||||||
|
} else if (value instanceof Integer) {
|
||||||
|
sb.append("0x").append(HexDump.toHex((Integer)value));
|
||||||
|
} else if (value instanceof byte[]) {
|
||||||
|
sb.append(nl).append(HexDump.toHex((byte[])value, 32).replaceAll("(?m)^",childTab+" "));
|
||||||
|
} else if (value instanceof Boolean) {
|
||||||
|
sb.append(((Boolean)value).booleanValue());
|
||||||
|
} else if (value instanceof EscherRecord) {
|
||||||
|
EscherRecord er = (EscherRecord)value;
|
||||||
|
if (toXML) {
|
||||||
|
sb.append(nl).append(er.toXml(childTab+" "));
|
||||||
|
} else {
|
||||||
|
sb.append(er.toString().replaceAll("(?m)^",childTab));
|
||||||
|
}
|
||||||
|
isComplex = true;
|
||||||
|
} else if (value instanceof EscherProperty) {
|
||||||
|
EscherProperty ep = (EscherProperty)value;
|
||||||
|
if (toXML) {
|
||||||
|
sb.append(nl).append(ep.toXml(childTab+" "));
|
||||||
|
} else {
|
||||||
|
sb.append(ep.toString().replaceAll("(?m)^",childTab));
|
||||||
|
}
|
||||||
|
isComplex = true;
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("unknown attribute type "+value.getClass().getSimpleName());
|
||||||
|
}
|
||||||
|
return isComplex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For the purpose of providing toString() and toXml() a subclass can either override those methods
|
||||||
|
* or provide a Object[][] array in the form {@code { { "Attribute Name (Header)", value, "optional attribute", value }, ... } }.<p>
|
||||||
|
*
|
||||||
|
* Null values won't be printed.<p>
|
||||||
|
*
|
||||||
|
* The attributes record, version, instance, options must not be returned.
|
||||||
|
*
|
||||||
|
* @return the attribute map
|
||||||
|
*
|
||||||
|
* @since POI 3.17-beta2
|
||||||
|
*/
|
||||||
|
@Internal
|
||||||
|
protected abstract Object[][] getAttributeMap();
|
||||||
|
|
||||||
|
private static String capitalizeAndTrim(final String str) {
|
||||||
|
if (str == null || str.length() == 0) {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder(str.length());
|
||||||
|
boolean capitalizeNext = true;
|
||||||
|
for (char ch : str.toCharArray()) {
|
||||||
|
if (!Character.isLetterOrDigit(ch)) {
|
||||||
|
capitalizeNext = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (capitalizeNext) {
|
||||||
|
if (!Character.isLetter(ch)) {
|
||||||
|
sb.append('_');
|
||||||
|
} else {
|
||||||
|
ch = Character.toTitleCase(ch);
|
||||||
|
}
|
||||||
|
capitalizeNext = false;
|
||||||
|
}
|
||||||
|
sb.append(ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void escapeXML(String s, StringBuilder out) {
|
||||||
|
if (s == null || s.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (char c : s.toCharArray()) {
|
||||||
|
if (c > 127 || c == '"' || c == '<' || c == '>' || c == '&') {
|
||||||
|
out.append("&#");
|
||||||
|
out.append((int) c);
|
||||||
|
out.append(';');
|
||||||
|
} else {
|
||||||
|
out.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple property is of fixed length and as a property number in addition
|
* A simple property is of fixed length and as a property number in addition
|
||||||
@ -93,13 +93,21 @@ public class EscherSimpleProperty extends EscherProperty
|
|||||||
@Override
|
@Override
|
||||||
public boolean equals( Object o )
|
public boolean equals( Object o )
|
||||||
{
|
{
|
||||||
if ( this == o ) return true;
|
if ( this == o ) {
|
||||||
if ( !( o instanceof EscherSimpleProperty ) ) return false;
|
return true;
|
||||||
|
}
|
||||||
|
if ( !( o instanceof EscherSimpleProperty ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
final EscherSimpleProperty escherSimpleProperty = (EscherSimpleProperty) o;
|
final EscherSimpleProperty escherSimpleProperty = (EscherSimpleProperty) o;
|
||||||
|
|
||||||
if ( propertyValue != escherSimpleProperty.propertyValue ) return false;
|
if ( propertyValue != escherSimpleProperty.propertyValue ) {
|
||||||
if ( getId() != escherSimpleProperty.getId() ) return false;
|
return false;
|
||||||
|
}
|
||||||
|
if ( getId() != escherSimpleProperty.getId() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -134,7 +142,7 @@ public class EscherSimpleProperty extends EscherProperty
|
|||||||
builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId()))
|
builder.append(tab).append("<").append(getClass().getSimpleName()).append(" id=\"0x").append(HexDump.toHex(getId()))
|
||||||
.append("\" name=\"").append(getName()).append("\" blipId=\"")
|
.append("\" name=\"").append(getName()).append("\" blipId=\"")
|
||||||
.append(isBlipId()).append("\" complex=\"").append(isComplex()).append("\" value=\"").append("0x")
|
.append(isBlipId()).append("\" complex=\"").append(isComplex()).append("\" value=\"").append("0x")
|
||||||
.append(HexDump.toHex(propertyValue)).append("\"/>\n");
|
.append(HexDump.toHex(propertyValue)).append("\"/>");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,35 +101,6 @@ public class EscherSpRecord
|
|||||||
return "Sp";
|
return "Sp";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the string representing this shape.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString()
|
|
||||||
{
|
|
||||||
String nl = System.getProperty("line.separator");
|
|
||||||
|
|
||||||
return getClass().getName() + ":" + nl +
|
|
||||||
" RecordId: 0x" + HexDump.toHex(RECORD_ID) + nl +
|
|
||||||
" Version: 0x" + HexDump.toHex(getVersion()) + nl +
|
|
||||||
" ShapeType: 0x" + HexDump.toHex(getShapeType()) + nl +
|
|
||||||
" ShapeId: " + field_1_shapeId + nl +
|
|
||||||
" Flags: " + decodeFlags(field_2_flags) + " (0x" + HexDump.toHex(field_2_flags) + ")" + nl;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<ShapeType>0x").append(HexDump.toHex(getShapeType())).append("</ShapeType>\n")
|
|
||||||
.append(tab).append("\t").append("<ShapeId>").append(field_1_shapeId).append("</ShapeId>\n")
|
|
||||||
.append(tab).append("\t").append("<Flags>").append(decodeFlags(field_2_flags) + " (0x" + HexDump.toHex(field_2_flags) + ")").append("</Flags>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the shape flags into a more descriptive name.
|
* Converts the shape flags into a more descriptive name.
|
||||||
*/
|
*/
|
||||||
@ -242,4 +213,13 @@ public class EscherSpRecord
|
|||||||
{
|
{
|
||||||
setInstance( value );
|
setInstance( value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "ShapeType", getShapeType() },
|
||||||
|
{ "ShapeId", field_1_shapeId },
|
||||||
|
{ "Flags", decodeFlags(field_2_flags)+" (0x"+HexDump.toHex(field_2_flags)+")" }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.RecordFormatException;
|
import org.apache.poi.util.RecordFormatException;
|
||||||
|
|
||||||
@ -46,7 +45,9 @@ public class EscherSpgrRecord
|
|||||||
field_3_rectX2 = LittleEndian.getInt( data, pos + size );size+=4;
|
field_3_rectX2 = LittleEndian.getInt( data, pos + size );size+=4;
|
||||||
field_4_rectY2 = LittleEndian.getInt( data, pos + size );size+=4;
|
field_4_rectY2 = LittleEndian.getInt( data, pos + size );size+=4;
|
||||||
bytesRemaining -= size;
|
bytesRemaining -= size;
|
||||||
if (bytesRemaining != 0) throw new RecordFormatException("Expected no remaining bytes but got " + bytesRemaining);
|
if (bytesRemaining != 0) {
|
||||||
|
throw new RecordFormatException("Expected no remaining bytes but got " + bytesRemaining);
|
||||||
|
}
|
||||||
// remainingData = new byte[bytesRemaining];
|
// remainingData = new byte[bytesRemaining];
|
||||||
// System.arraycopy( data, pos + size, remainingData, 0, bytesRemaining );
|
// System.arraycopy( data, pos + size, remainingData, 0, bytesRemaining );
|
||||||
return 8 + size + bytesRemaining;
|
return 8 + size + bytesRemaining;
|
||||||
@ -86,33 +87,6 @@ public class EscherSpgrRecord
|
|||||||
return "Spgr";
|
return "Spgr";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the string representation of this record.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return getClass().getName() + ":" + '\n' +
|
|
||||||
" RecordId: 0x" + HexDump.toHex(RECORD_ID) + '\n' +
|
|
||||||
" Version: 0x" + HexDump.toHex(getVersion()) + '\n' +
|
|
||||||
" Instance: 0x" + HexDump.toHex(getInstance()) + '\n' +
|
|
||||||
" RectX: " + field_1_rectX1 + '\n' +
|
|
||||||
" RectY: " + field_2_rectY1 + '\n' +
|
|
||||||
" RectWidth: " + field_3_rectX2 + '\n' +
|
|
||||||
" RectHeight: " + field_4_rectY2 + '\n';
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<RectX>").append(field_1_rectX1).append("</RectX>\n")
|
|
||||||
.append(tab).append("\t").append("<RectY>").append(field_2_rectY1).append("</RectY>\n")
|
|
||||||
.append(tab).append("\t").append("<RectWidth>").append(field_3_rectX2).append("</RectWidth>\n")
|
|
||||||
.append(tab).append("\t").append("<RectHeight>").append(field_4_rectY2).append("</RectHeight>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The starting top-left coordinate of child records.
|
* The starting top-left coordinate of child records.
|
||||||
*
|
*
|
||||||
@ -191,4 +165,14 @@ public class EscherSpgrRecord
|
|||||||
public void setRectY2(int rectY2) {
|
public void setRectY2(int rectY2) {
|
||||||
this.field_4_rectY2 = rectY2;
|
this.field_4_rectY2 = rectY2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "RectX", field_1_rectX1 },
|
||||||
|
{ "RectY", field_2_rectY1 },
|
||||||
|
{ "RectWidth", field_3_rectX2 },
|
||||||
|
{ "RectHeight", field_4_rectY2 }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.RecordFormatException;
|
import org.apache.poi.util.RecordFormatException;
|
||||||
|
|
||||||
@ -46,8 +45,9 @@ public class EscherSplitMenuColorsRecord
|
|||||||
field_3_color3 = LittleEndian.getInt( data, pos + size );size+=4;
|
field_3_color3 = LittleEndian.getInt( data, pos + size );size+=4;
|
||||||
field_4_color4 = LittleEndian.getInt( data, pos + size );size+=4;
|
field_4_color4 = LittleEndian.getInt( data, pos + size );size+=4;
|
||||||
bytesRemaining -= size;
|
bytesRemaining -= size;
|
||||||
if (bytesRemaining != 0)
|
if (bytesRemaining != 0) {
|
||||||
throw new RecordFormatException("Expecting no remaining data but got " + bytesRemaining + " byte(s).");
|
throw new RecordFormatException("Expecting no remaining data but got " + bytesRemaining + " byte(s).");
|
||||||
|
}
|
||||||
return 8 + size + bytesRemaining;
|
return 8 + size + bytesRemaining;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,34 +85,6 @@ public class EscherSplitMenuColorsRecord
|
|||||||
return "SplitMenuColors";
|
return "SplitMenuColors";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return a string representation of this record.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return getClass().getName() + ":" + '\n' +
|
|
||||||
" RecordId: 0x" + HexDump.toHex(RECORD_ID) + '\n' +
|
|
||||||
" Version: 0x" + HexDump.toHex(getVersion()) + '\n' +
|
|
||||||
" Instance: 0x" + HexDump.toHex(getInstance()) + '\n' +
|
|
||||||
" Color1: 0x" + HexDump.toHex(field_1_color1) + '\n' +
|
|
||||||
" Color2: 0x" + HexDump.toHex(field_2_color2) + '\n' +
|
|
||||||
" Color3: 0x" + HexDump.toHex(field_3_color3) + '\n' +
|
|
||||||
" Color4: 0x" + HexDump.toHex(field_4_color4) + '\n' +
|
|
||||||
"";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<Color1>0x").append(HexDump.toHex(field_1_color1)).append("</Color1>\n")
|
|
||||||
.append(tab).append("\t").append("<Color2>0x").append(HexDump.toHex(field_2_color2)).append("</Color2>\n")
|
|
||||||
.append(tab).append("\t").append("<Color3>0x").append(HexDump.toHex(field_3_color3)).append("</Color3>\n")
|
|
||||||
.append(tab).append("\t").append("<Color4>0x").append(HexDump.toHex(field_4_color4)).append("</Color4>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the fill color
|
* Gets the fill color
|
||||||
*
|
*
|
||||||
@ -184,4 +156,14 @@ public class EscherSplitMenuColorsRecord
|
|||||||
public void setColor4( int field_4_color4 ) {
|
public void setColor4( int field_4_color4 ) {
|
||||||
this.field_4_color4 = field_4_color4;
|
this.field_4_color4 = field_4_color4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "Color1", field_1_color1 },
|
||||||
|
{ "Color2", field_2_color2 },
|
||||||
|
{ "Color3", field_3_color3 },
|
||||||
|
{ "Color4", field_4_color4 }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,9 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.RecordFormatException;
|
import org.apache.poi.util.RecordFormatException;
|
||||||
|
|
||||||
@ -65,8 +67,9 @@ public final class EscherTextboxRecord extends EscherRecord implements Cloneable
|
|||||||
|
|
||||||
listener.afterRecordSerialize( pos, getRecordId(), pos - offset, this );
|
listener.afterRecordSerialize( pos, getRecordId(), pos - offset, this );
|
||||||
int size = pos - offset;
|
int size = pos - offset;
|
||||||
if (size != getRecordSize())
|
if (size != getRecordSize()) {
|
||||||
throw new RecordFormatException(size + " bytes written but getRecordSize() reports " + getRecordSize());
|
throw new RecordFormatException(size + " bytes written but getRecordSize() reports " + getRecordSize());
|
||||||
|
}
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,54 +133,20 @@ public final class EscherTextboxRecord extends EscherRecord implements Cloneable
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
protected Object[][] getAttributeMap() {
|
||||||
{
|
int numCh = getChildRecords().size();
|
||||||
String nl = System.getProperty( "line.separator" );
|
List<Object> chLst = new ArrayList<Object>(numCh*2+2);
|
||||||
|
chLst.add("children");
|
||||||
String theDumpHex = "";
|
chLst.add(numCh);
|
||||||
try
|
for (EscherRecord er : getChildRecords()) {
|
||||||
{
|
chLst.add(er.getRecordName());
|
||||||
if (thedata.length != 0)
|
chLst.add(er);
|
||||||
{
|
|
||||||
theDumpHex = " Extra Data:" + nl;
|
|
||||||
theDumpHex += HexDump.dump(thedata, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch ( Exception e )
|
|
||||||
{
|
return new Object[][] {
|
||||||
theDumpHex = "Error!!";
|
{ "isContainer", isContainerRecord() },
|
||||||
}
|
chLst.toArray(),
|
||||||
|
{ "Extra Data", thedata }
|
||||||
return getClass().getName() + ":" + nl +
|
};
|
||||||
" isContainer: " + isContainerRecord() + nl +
|
|
||||||
" version: 0x" + HexDump.toHex( getVersion() ) + nl +
|
|
||||||
" instance: 0x" + HexDump.toHex( getInstance() ) + nl +
|
|
||||||
" recordId: 0x" + HexDump.toHex( getRecordId() ) + nl +
|
|
||||||
" numchildren: " + getChildRecords().size() + nl +
|
|
||||||
theDumpHex;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
String theDumpHex = "";
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (thedata.length != 0)
|
|
||||||
{
|
|
||||||
theDumpHex += HexDump.dump(thedata, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( Exception e )
|
|
||||||
{
|
|
||||||
theDumpHex = "Error!!";
|
|
||||||
}
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<ExtraData>").append(theDumpHex).append("</ExtraData>\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
@ -130,48 +129,25 @@ public final class UnknownEscherRecord extends EscherRecord implements Cloneable
|
|||||||
return "Unknown 0x" + HexDump.toHex(getRecordId());
|
return "Unknown 0x" + HexDump.toHex(getRecordId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
StringBuffer children = new StringBuffer();
|
|
||||||
if (getChildRecords().size() > 0) {
|
|
||||||
children.append( " children: " + '\n' );
|
|
||||||
for (EscherRecord record : _childRecords) {
|
|
||||||
children.append(record);
|
|
||||||
children.append( '\n' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String theDumpHex = HexDump.toHex(thedata, 32);
|
|
||||||
|
|
||||||
return getClass().getName() + ":" + '\n' +
|
|
||||||
" isContainer: " + isContainerRecord() + '\n' +
|
|
||||||
" version: 0x" + HexDump.toHex( getVersion() ) + '\n' +
|
|
||||||
" instance: 0x" + HexDump.toHex( getInstance() ) + '\n' +
|
|
||||||
" recordId: 0x" + HexDump.toHex( getRecordId() ) + '\n' +
|
|
||||||
" numchildren: " + getChildRecords().size() + '\n' +
|
|
||||||
theDumpHex +
|
|
||||||
children;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toXml(String tab) {
|
|
||||||
String theDumpHex = HexDump.toHex(thedata, 32);
|
|
||||||
StringBuilder builder = new StringBuilder();
|
|
||||||
builder.append(tab).append(formatXmlRecordHeader(getClass().getSimpleName(), HexDump.toHex(getRecordId()), HexDump.toHex(getVersion()), HexDump.toHex(getInstance())))
|
|
||||||
.append(tab).append("\t").append("<IsContainer>").append(isContainerRecord()).append("</IsContainer>\n")
|
|
||||||
.append(tab).append("\t").append("<Numchildren>").append(HexDump.toHex(_childRecords.size())).append("</Numchildren>\n");
|
|
||||||
for ( Iterator<EscherRecord> iterator = _childRecords.iterator(); iterator
|
|
||||||
.hasNext(); )
|
|
||||||
{
|
|
||||||
EscherRecord record = iterator.next();
|
|
||||||
builder.append(record.toXml(tab+"\t"));
|
|
||||||
}
|
|
||||||
builder.append(theDumpHex).append("\n");
|
|
||||||
builder.append(tab).append("</").append(getClass().getSimpleName()).append(">\n");
|
|
||||||
return builder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addChildRecord(EscherRecord childRecord) {
|
public void addChildRecord(EscherRecord childRecord) {
|
||||||
getChildRecords().add( childRecord );
|
getChildRecords().add( childRecord );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
int numCh = getChildRecords().size();
|
||||||
|
List<Object> chLst = new ArrayList<Object>(numCh*2+2);
|
||||||
|
chLst.add("children");
|
||||||
|
chLst.add(numCh);
|
||||||
|
for (EscherRecord er : _childRecords) {
|
||||||
|
chLst.add(er.getRecordName());
|
||||||
|
chLst.add(er);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Object[][] {
|
||||||
|
{ "isContainer", isContainerRecord() },
|
||||||
|
chLst.toArray(),
|
||||||
|
{ "Extra Data", thedata }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,10 @@
|
|||||||
|
|
||||||
package org.apache.poi.hslf.record;
|
package org.apache.poi.hslf.record;
|
||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.EscherRecord;
|
||||||
import org.apache.poi.util.*;
|
import org.apache.poi.ddf.EscherRecordFactory;
|
||||||
|
import org.apache.poi.ddf.EscherSerializationListener;
|
||||||
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An atom record that specifies whether a shape is a placeholder shape.
|
* An atom record that specifies whether a shape is a placeholder shape.
|
||||||
@ -33,9 +35,10 @@ public class EscherPlaceholder extends EscherRecord {
|
|||||||
private byte placementId = 0;
|
private byte placementId = 0;
|
||||||
private byte size = 0;
|
private byte size = 0;
|
||||||
private short unused = 0;
|
private short unused = 0;
|
||||||
|
|
||||||
public EscherPlaceholder() {}
|
public EscherPlaceholder() {}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {
|
public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {
|
||||||
int bytesRemaining = readHeader( data, offset );
|
int bytesRemaining = readHeader( data, offset );
|
||||||
|
|
||||||
@ -43,14 +46,15 @@ public class EscherPlaceholder extends EscherRecord {
|
|||||||
placementId = data[offset+12];
|
placementId = data[offset+12];
|
||||||
size = data[offset+13];
|
size = data[offset+13];
|
||||||
unused = LittleEndian.getShort(data, offset+14);
|
unused = LittleEndian.getShort(data, offset+14);
|
||||||
|
|
||||||
assert(bytesRemaining + 8 == 16);
|
assert(bytesRemaining + 8 == 16);
|
||||||
return bytesRemaining + 8;
|
return bytesRemaining + 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int serialize(int offset, byte[] data, EscherSerializationListener listener) {
|
public int serialize(int offset, byte[] data, EscherSerializationListener listener) {
|
||||||
listener.beforeRecordSerialize( offset, getRecordId(), this );
|
listener.beforeRecordSerialize( offset, getRecordId(), this );
|
||||||
|
|
||||||
LittleEndian.putShort(data, offset, getOptions());
|
LittleEndian.putShort(data, offset, getOptions());
|
||||||
LittleEndian.putShort(data, offset+2, getRecordId());
|
LittleEndian.putShort(data, offset+2, getRecordId());
|
||||||
LittleEndian.putInt(data, offset+4, 8);
|
LittleEndian.putInt(data, offset+4, 8);
|
||||||
@ -58,18 +62,28 @@ public class EscherPlaceholder extends EscherRecord {
|
|||||||
LittleEndian.putByte(data, offset+12, placementId);
|
LittleEndian.putByte(data, offset+12, placementId);
|
||||||
LittleEndian.putByte(data, offset+13, size);
|
LittleEndian.putByte(data, offset+13, size);
|
||||||
LittleEndian.putShort(data, offset+14, unused);
|
LittleEndian.putShort(data, offset+14, unused);
|
||||||
|
|
||||||
listener.afterRecordSerialize( offset+getRecordSize(), getRecordId(), getRecordSize(), this );
|
listener.afterRecordSerialize( offset+getRecordSize(), getRecordId(), getRecordSize(), this );
|
||||||
return getRecordSize();
|
return getRecordSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int getRecordSize() {
|
public int getRecordSize() {
|
||||||
return 8 + 8;
|
return 8 + 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String getRecordName() {
|
public String getRecordName() {
|
||||||
return "ClientTextboxPlaceholder";
|
return "ClientTextboxPlaceholder";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ "position", position },
|
||||||
|
{ "placementId", placementId },
|
||||||
|
{ "placehoder size", size },
|
||||||
|
{ "unused", unused }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,18 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.poifs.storage.RawDataUtil;
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public final class TestEscherBSERecord extends TestCase {
|
public final class TestEscherBSERecord {
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String data = "01 00 00 00 24 00 00 00 05 05 01 02 03 04 " +
|
String data = "01 00 00 00 24 00 00 00 05 05 01 02 03 04 " +
|
||||||
" 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 00 00 00 " +
|
" 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 00 00 00 " +
|
||||||
@ -43,17 +50,16 @@ public final class TestEscherBSERecord extends TestCase {
|
|||||||
assertEquals( 0, r.getRemainingData().length );
|
assertEquals( 0, r.getRemainingData().length );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testSerialize() {
|
@Test
|
||||||
|
public void testSerialize() throws IOException {
|
||||||
EscherBSERecord r = createRecord();
|
EscherBSERecord r = createRecord();
|
||||||
|
String exp64 = "H4sIAAAAAAAAAGNkYP+gwsDAwMrKyMTMwsrGzsHJxc3Dy8fPwMgAAkxAzAzEICkAgs9OoSwAAAA=";
|
||||||
|
byte[] expected = RawDataUtil.decompress(exp64);
|
||||||
|
|
||||||
byte[] data = new byte[8 + 36];
|
byte[] data = new byte[8 + 36];
|
||||||
int bytesWritten = r.serialize( 0, data, new NullEscherSerializationListener() );
|
int bytesWritten = r.serialize( 0, data, new NullEscherSerializationListener() );
|
||||||
assertEquals( 44, bytesWritten );
|
assertEquals(data.length, bytesWritten);
|
||||||
assertEquals( "[01, 00, 00, 00, 24, 00, 00, 00, 05, 05, 01, 02, 03, 04, " +
|
assertArrayEquals(expected, data);
|
||||||
"05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 00, 01, 00, 00, 00, " +
|
|
||||||
"00, 00, 02, 00, 00, 00, 03, 00, 00, 00, 04, 05, 06, 07]",
|
|
||||||
HexDump.toHex(data));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private EscherBSERecord createRecord() {
|
private EscherBSERecord createRecord() {
|
||||||
@ -74,26 +80,31 @@ public final class TestEscherBSERecord extends TestCase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
|
String nl = System.getProperty("line.separator");
|
||||||
EscherBSERecord record = createRecord();
|
EscherBSERecord record = createRecord();
|
||||||
String expected = "org.apache.poi.ddf.EscherBSERecord:" + '\n' +
|
String expected =
|
||||||
" RecordId: 0xF007" + '\n' +
|
"org.apache.poi.ddf.EscherBSERecord (BSE):" + nl +
|
||||||
" Version: 0x0001" + '\n' +
|
" RecordId: 0xF007" + nl +
|
||||||
" Instance: 0x0000" + '\n' +
|
" Version: 0x0001" + nl +
|
||||||
" BlipTypeWin32: 5" + '\n' +
|
" Instance: 0x0000" + nl +
|
||||||
" BlipTypeMacOS: 5" + '\n' +
|
" Options: 0x0001" + nl +
|
||||||
" SUID: [01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 00]" + '\n' +
|
" Record Size: 44" + nl +
|
||||||
" Tag: 1" + '\n' +
|
" BlipTypeWin32: 0x05" + nl +
|
||||||
" Size: 0" + '\n' +
|
" BlipTypeMacOS: 0x05" + nl +
|
||||||
" Ref: 2" + '\n' +
|
" SUID: " + nl +
|
||||||
" Offset: 3" + '\n' +
|
" 00: 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 00" + nl +
|
||||||
" Usage: 4" + '\n' +
|
" Tag: 0x0001" + nl +
|
||||||
" Name: 5" + '\n' +
|
" Size: 0x00000000" + nl +
|
||||||
" Unused2: 6" + '\n' +
|
" Ref: 0x00000002" + nl +
|
||||||
" Unused3: 7" + '\n' +
|
" Offset: 0x00000003" + nl +
|
||||||
" blipRecord: null" + '\n' +
|
" Usage: 0x04" + nl +
|
||||||
" Extra Data:" + '\n' +
|
" Name: 0x05" + nl +
|
||||||
": 0";
|
" Unused2: 0x06" + nl +
|
||||||
|
" Unused3: 0x07" + nl +
|
||||||
|
" Extra Data: " + nl +
|
||||||
|
" : 0";
|
||||||
String actual = record.toString();
|
String actual = record.toString();
|
||||||
assertEquals( expected, actual );
|
assertEquals( expected, actual );
|
||||||
}
|
}
|
||||||
|
@ -18,24 +18,21 @@
|
|||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
import java.io.File;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import java.io.FileInputStream;
|
import static org.junit.Assert.assertTrue;
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
import org.apache.poi.POIDataSamples;
|
import org.apache.poi.POIDataSamples;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test read/serialize of escher blip records
|
* Test read/serialize of escher blip records
|
||||||
*
|
*/
|
||||||
* @author Yegor Kozlov
|
public final class TestEscherBlipRecord {
|
||||||
*/
|
|
||||||
public final class TestEscherBlipRecord extends TestCase {
|
|
||||||
private static final POIDataSamples _samples = POIDataSamples.getDDFInstance();
|
private static final POIDataSamples _samples = POIDataSamples.getDDFInstance();
|
||||||
|
|
||||||
//test reading/serializing of a PNG blip
|
//test reading/serializing of a PNG blip
|
||||||
|
@Test
|
||||||
public void testReadPNG() {
|
public void testReadPNG() {
|
||||||
//provided in bug-44886
|
//provided in bug-44886
|
||||||
byte[] data = _samples.readFile("Container.dat");
|
byte[] data = _samples.readFile("Container.dat");
|
||||||
@ -81,6 +78,7 @@ public final class TestEscherBlipRecord extends TestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//test reading/serializing of a PICT metafile
|
//test reading/serializing of a PICT metafile
|
||||||
|
@Test
|
||||||
public void testReadPICT() {
|
public void testReadPICT() {
|
||||||
//provided in bug-44886
|
//provided in bug-44886
|
||||||
byte[] data = _samples.readFile("Container.dat");
|
byte[] data = _samples.readFile("Container.dat");
|
||||||
@ -133,6 +131,7 @@ public final class TestEscherBlipRecord extends TestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//integral test: check that the read-write-read round trip is consistent
|
//integral test: check that the read-write-read round trip is consistent
|
||||||
|
@Test
|
||||||
public void testContainer() {
|
public void testContainer() {
|
||||||
byte[] data = _samples.readFile("Container.dat");
|
byte[] data = _samples.readFile("Container.dat");
|
||||||
|
|
||||||
@ -143,21 +142,10 @@ public final class TestEscherBlipRecord extends TestCase {
|
|||||||
assertArrayEquals(data, ser);
|
assertArrayEquals(data, ser);
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] read(File file) {
|
|
||||||
byte[] data = new byte[(int)file.length()];
|
|
||||||
try {
|
|
||||||
FileInputStream is = new FileInputStream(file);
|
|
||||||
is.read(data);
|
|
||||||
is.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The test data was created from pl031405.xls attached to Bugzilla #47143
|
* The test data was created from pl031405.xls attached to Bugzilla #47143
|
||||||
*/
|
*/
|
||||||
|
@Test
|
||||||
public void test47143() {
|
public void test47143() {
|
||||||
byte[] data = _samples.readFile("47143.dat");
|
byte[] data = _samples.readFile("47143.dat");
|
||||||
EscherBSERecord bse = new EscherBSERecord();
|
EscherBSERecord bse = new EscherBSERecord();
|
||||||
|
@ -17,9 +17,12 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
public final class TestEscherBoolProperty extends TestCase {
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public final class TestEscherBoolProperty {
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
EscherBoolProperty p = new EscherBoolProperty((short)1, 1);
|
EscherBoolProperty p = new EscherBoolProperty((short)1, 1);
|
||||||
assertEquals("propNum: 1, RAW: 0x0001, propName: unknown, complex: false, blipId: false, value: 1 (0x00000001)", p.toString());
|
assertEquals("propNum: 1, RAW: 0x0001, propName: unknown, complex: false, blipId: false, value: 1 (0x00000001)", p.toString());
|
||||||
|
@ -17,17 +17,20 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public final class TestEscherChildAnchorRecord extends TestCase {
|
public final class TestEscherChildAnchorRecord {
|
||||||
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
EscherChildAnchorRecord r = createRecord();
|
EscherChildAnchorRecord r = createRecord();
|
||||||
|
|
||||||
byte[] data = new byte[8 + 16];
|
byte[] data = new byte[8 + 16];
|
||||||
int bytesWritten = r.serialize( 0, data, new NullEscherSerializationListener() );
|
int bytesWritten = r.serialize( 0, data, new NullEscherSerializationListener() );
|
||||||
assertEquals( 24, bytesWritten );
|
assertEquals( data.length, bytesWritten );
|
||||||
assertEquals( "[01, 00, " +
|
assertEquals( "[01, 00, " +
|
||||||
"0F, F0, " +
|
"0F, F0, " +
|
||||||
"10, 00, 00, 00, " +
|
"10, 00, 00, 00, " +
|
||||||
@ -37,6 +40,7 @@ public final class TestEscherChildAnchorRecord extends TestCase {
|
|||||||
"04, 00, 00, 00]", HexDump.toHex( data ) );
|
"04, 00, 00, 00]", HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String hexData = "01 00 " +
|
String hexData = "01 00 " +
|
||||||
"0F F0 " +
|
"0F F0 " +
|
||||||
@ -58,17 +62,21 @@ public final class TestEscherChildAnchorRecord extends TestCase {
|
|||||||
assertEquals( (short) 0x0001, r.getOptions() );
|
assertEquals( (short) 0x0001, r.getOptions() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString(){
|
public void testToString(){
|
||||||
String nl = System.getProperty( "line.separator" );
|
String nl = System.getProperty( "line.separator" );
|
||||||
|
|
||||||
String expected = "org.apache.poi.ddf.EscherChildAnchorRecord:" + nl +
|
String expected =
|
||||||
" RecordId: 0xF00F" + nl +
|
"org.apache.poi.ddf.EscherChildAnchorRecord (ChildAnchor):" + nl +
|
||||||
" Version: 0x0001" + nl +
|
" RecordId: 0xF00F" + nl +
|
||||||
" Instance: 0x0000" + nl +
|
" Version: 0x0001" + nl +
|
||||||
" X1: 1" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" Y1: 2" + nl +
|
" Options: 0x0001" + nl +
|
||||||
" X2: 3" + nl +
|
" Record Size: 24" + nl +
|
||||||
" Y2: 4" + nl;
|
" X1: 0x00000001" + nl +
|
||||||
|
" Y1: 0x00000002" + nl +
|
||||||
|
" X2: 0x00000003" + nl +
|
||||||
|
" Y2: 0x00000004";
|
||||||
assertEquals( expected, createRecord().toString() );
|
assertEquals( expected, createRecord().toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class TestEscherClientAnchorRecord extends TestCase
|
public class TestEscherClientAnchorRecord {
|
||||||
{
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
EscherClientAnchorRecord r = createRecord();
|
EscherClientAnchorRecord r = createRecord();
|
||||||
|
|
||||||
@ -38,6 +40,7 @@ public class TestEscherClientAnchorRecord extends TestCase
|
|||||||
"FF, DD]", HexDump.toHex( data ) );
|
"FF, DD]", HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String hexData = "01 00 " +
|
String hexData = "01 00 " +
|
||||||
"10 F0 " +
|
"10 F0 " +
|
||||||
@ -65,24 +68,27 @@ public class TestEscherClientAnchorRecord extends TestCase
|
|||||||
assertEquals( (byte) 0xDD, r.getRemainingData()[1] );
|
assertEquals( (byte) 0xDD, r.getRemainingData()[1] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
String nl = System.getProperty("line.separator");
|
String nl = System.getProperty("line.separator");
|
||||||
|
String expected =
|
||||||
String expected = "org.apache.poi.ddf.EscherClientAnchorRecord:" + nl +
|
"org.apache.poi.ddf.EscherClientAnchorRecord (ClientAnchor):" + nl +
|
||||||
" RecordId: 0xF010" + nl +
|
" RecordId: 0xF010" + nl +
|
||||||
" Version: 0x0001" + nl +
|
" Version: 0x0001" + nl +
|
||||||
" Instance: 0x0000" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" Flag: 77" + nl +
|
" Options: 0x0001" + nl +
|
||||||
" Col1: 55" + nl +
|
" Record Size: 28" + nl +
|
||||||
" DX1: 33" + nl +
|
" Flag: 0x004D" + nl +
|
||||||
" Row1: 88" + nl +
|
" Col1: 0x0037" + nl +
|
||||||
" DY1: 11" + nl +
|
" DX1: 0x0021" + nl +
|
||||||
" Col2: 44" + nl +
|
" Row1: 0x0058" + nl +
|
||||||
" DX2: 22" + nl +
|
" DY1: 0x000B" + nl +
|
||||||
" Row2: 99" + nl +
|
" Col2: 0x002C" + nl +
|
||||||
" DY2: 66" + nl +
|
" DX2: 0x0016" + nl +
|
||||||
" Extra Data:" + nl +
|
" Row2: 0x0063" + nl +
|
||||||
"00000000 FF DD .." + nl;
|
" DY2: 0x0042" + nl +
|
||||||
|
" Extra Data: " + nl +
|
||||||
|
" 0: FF, DD";
|
||||||
assertEquals( expected, createRecord().toString() );
|
assertEquals( expected, createRecord().toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class TestEscherClientDataRecord extends TestCase
|
public class TestEscherClientDataRecord {
|
||||||
{
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
EscherClientDataRecord r = createRecord();
|
EscherClientDataRecord r = createRecord();
|
||||||
|
|
||||||
@ -35,6 +37,7 @@ public class TestEscherClientDataRecord extends TestCase
|
|||||||
HexDump.toHex( data ) );
|
HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String hexData = "02 00 " +
|
String hexData = "02 00 " +
|
||||||
"11 F0 " +
|
"11 F0 " +
|
||||||
@ -48,15 +51,19 @@ public class TestEscherClientDataRecord extends TestCase
|
|||||||
assertEquals( "[]", HexDump.toHex(r.getRemainingData()) );
|
assertEquals( "[]", HexDump.toHex(r.getRemainingData()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
String nl = System.getProperty("line.separator");
|
String nl = System.getProperty("line.separator");
|
||||||
|
|
||||||
String expected = "org.apache.poi.ddf.EscherClientDataRecord:" + nl +
|
String expected =
|
||||||
" RecordId: 0xF011" + nl +
|
"org.apache.poi.ddf.EscherClientDataRecord (ClientData):" + nl +
|
||||||
" Version: 0x0002" + nl +
|
" RecordId: 0xF011" + nl +
|
||||||
" Instance: 0x0000" + nl +
|
" Version: 0x0002" + nl +
|
||||||
" Extra Data:" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
"No Data" + nl ;
|
" Options: 0x0002" + nl +
|
||||||
|
" Record Size: 8" + nl +
|
||||||
|
" Extra Data: " + nl +
|
||||||
|
" : 0";
|
||||||
assertEquals( expected, createRecord().toString() );
|
assertEquals( expected, createRecord().toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,19 +17,24 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
import org.apache.poi.POIDataSamples;
|
import org.apache.poi.POIDataSamples;
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link EscherContainerRecord}
|
* Tests for {@link EscherContainerRecord}
|
||||||
*/
|
*/
|
||||||
public final class TestEscherContainerRecord extends TestCase {
|
public final class TestEscherContainerRecord {
|
||||||
private static final POIDataSamples _samples = POIDataSamples.getDDFInstance();
|
private static final POIDataSamples _samples = POIDataSamples.getDDFInstance();
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
EscherRecordFactory f = new DefaultEscherRecordFactory();
|
EscherRecordFactory f = new DefaultEscherRecordFactory();
|
||||||
byte[] data = HexRead.readFromString("0F 02 11 F1 00 00 00 00");
|
byte[] data = HexRead.readFromString("0F 02 11 F1 00 00 00 00");
|
||||||
@ -49,6 +54,7 @@ public final class TestEscherContainerRecord extends TestCase {
|
|||||||
assertEquals((short) 0xF222, c.getRecordId());
|
assertEquals((short) 0xF222, c.getRecordId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
UnknownEscherRecord r = new UnknownEscherRecord();
|
UnknownEscherRecord r = new UnknownEscherRecord();
|
||||||
r.setOptions((short) 0x123F);
|
r.setOptions((short) 0x123F);
|
||||||
@ -69,72 +75,79 @@ public final class TestEscherContainerRecord extends TestCase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
EscherContainerRecord r = new EscherContainerRecord();
|
EscherContainerRecord r = new EscherContainerRecord();
|
||||||
r.setRecordId(EscherContainerRecord.SP_CONTAINER);
|
r.setRecordId(EscherContainerRecord.SP_CONTAINER);
|
||||||
r.setOptions((short) 0x000F);
|
r.setOptions((short) 0x000F);
|
||||||
String nl = System.getProperty("line.separator");
|
String nl = System.getProperty("line.separator");
|
||||||
assertEquals("org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl +
|
String expected =
|
||||||
" isContainer: true" + nl +
|
"org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl +
|
||||||
" version: 0x000F" + nl +
|
" RecordId: 0xF004" + nl +
|
||||||
" instance: 0x0000" + nl +
|
" Version: 0x000F" + nl +
|
||||||
" recordId: 0xF004" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" numchildren: 0" + nl
|
" Options: 0x000F" + nl +
|
||||||
, r.toString());
|
" Record Size: 8" + nl +
|
||||||
|
" isContainer: true" + nl +
|
||||||
|
" children: 0x00000000";
|
||||||
|
assertEquals(expected, r.toString());
|
||||||
|
|
||||||
EscherOptRecord r2 = new EscherOptRecord();
|
EscherOptRecord r2 = new EscherOptRecord();
|
||||||
// don't try to shoot in foot, please -- vlsergey
|
// don't try to shoot in foot, please -- vlsergey
|
||||||
// r2.setOptions((short) 0x9876);
|
// r2.setOptions((short) 0x9876);
|
||||||
r2.setRecordId(EscherOptRecord.RECORD_ID);
|
r2.setRecordId(EscherOptRecord.RECORD_ID);
|
||||||
|
|
||||||
String expected;
|
|
||||||
r.addChildRecord(r2);
|
r.addChildRecord(r2);
|
||||||
expected = "org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl +
|
expected =
|
||||||
" isContainer: true" + nl +
|
"org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl +
|
||||||
" version: 0x000F" + nl +
|
" RecordId: 0xF004" + nl +
|
||||||
" instance: 0x0000" + nl +
|
" Version: 0x000F" + nl +
|
||||||
" recordId: 0xF004" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" numchildren: 1" + nl +
|
" Options: 0x000F" + nl +
|
||||||
" children: " + nl +
|
" Record Size: 16" + nl +
|
||||||
" Child 0:" + nl +
|
" isContainer: true" + nl +
|
||||||
" org.apache.poi.ddf.EscherOptRecord:" + nl +
|
" children: 0x00000001" + nl +
|
||||||
" isContainer: false" + nl +
|
" Child 0: org.apache.poi.ddf.EscherOptRecord (Opt):" + nl +
|
||||||
" version: 0x0003" + nl +
|
" RecordId: 0xF00B" + nl +
|
||||||
" instance: 0x0000" + nl +
|
" Version: 0x0003" + nl +
|
||||||
" recordId: 0xF00B" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" numchildren: 0" + nl +
|
" Options: 0x0003" + nl +
|
||||||
" properties:" + nl +
|
" Record Size: 8" + nl +
|
||||||
" " + nl;
|
" isContainer: false" + nl +
|
||||||
assertEquals(expected, r.toString());
|
" numchildren: 0x00000000" + nl +
|
||||||
|
" properties: 0x00000000";
|
||||||
|
assertEquals(expected, r.toString());
|
||||||
|
|
||||||
r.addChildRecord(r2);
|
r.addChildRecord(r2);
|
||||||
expected = "org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl +
|
expected =
|
||||||
" isContainer: true" + nl +
|
"org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl +
|
||||||
" version: 0x000F" + nl +
|
" RecordId: 0xF004" + nl +
|
||||||
" instance: 0x0000" + nl +
|
" Version: 0x000F" + nl +
|
||||||
" recordId: 0xF004" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" numchildren: 2" + nl +
|
" Options: 0x000F" + nl +
|
||||||
" children: " + nl +
|
" Record Size: 24" + nl +
|
||||||
" Child 0:" + nl +
|
" isContainer: true" + nl +
|
||||||
" org.apache.poi.ddf.EscherOptRecord:" + nl +
|
" children: 0x00000002" + nl +
|
||||||
" isContainer: false" + nl +
|
" Child 0: org.apache.poi.ddf.EscherOptRecord (Opt):" + nl +
|
||||||
" version: 0x0003" + nl +
|
" RecordId: 0xF00B" + nl +
|
||||||
" instance: 0x0000" + nl +
|
" Version: 0x0003" + nl +
|
||||||
" recordId: 0xF00B" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" numchildren: 0" + nl +
|
" Options: 0x0003" + nl +
|
||||||
" properties:" + nl +
|
" Record Size: 8" + nl +
|
||||||
" " + nl +
|
" isContainer: false" + nl +
|
||||||
" Child 1:" + nl +
|
" numchildren: 0x00000000" + nl +
|
||||||
" org.apache.poi.ddf.EscherOptRecord:" + nl +
|
" properties: 0x00000000" + nl +
|
||||||
" isContainer: false" + nl +
|
" Child 1: org.apache.poi.ddf.EscherOptRecord (Opt):" + nl +
|
||||||
" version: 0x0003" + nl +
|
" RecordId: 0xF00B" + nl +
|
||||||
" instance: 0x0000" + nl +
|
" Version: 0x0003" + nl +
|
||||||
" recordId: 0xF00B" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" numchildren: 0" + nl +
|
" Options: 0x0003" + nl +
|
||||||
" properties:" + nl +
|
" Record Size: 8" + nl +
|
||||||
" " + nl;
|
" isContainer: false" + nl +
|
||||||
|
" numchildren: 0x00000000" + nl +
|
||||||
|
" properties: 0x00000000";
|
||||||
assertEquals(expected, r.toString());
|
assertEquals(expected, r.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class DummyEscherRecord extends EscherRecord {
|
private static final class DummyEscherRecord extends EscherRecord {
|
||||||
public DummyEscherRecord() { }
|
public DummyEscherRecord() { }
|
||||||
@ -146,8 +159,11 @@ public final class TestEscherContainerRecord extends TestCase {
|
|||||||
public int getRecordSize() { return 10; }
|
public int getRecordSize() { return 10; }
|
||||||
@Override
|
@Override
|
||||||
public String getRecordName() { return ""; }
|
public String getRecordName() { return ""; }
|
||||||
|
@Override
|
||||||
|
protected Object[][] getAttributeMap() { return null; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testGetRecordSize() {
|
public void testGetRecordSize() {
|
||||||
EscherContainerRecord r = new EscherContainerRecord();
|
EscherContainerRecord r = new EscherContainerRecord();
|
||||||
r.addChildRecord(new DummyEscherRecord());
|
r.addChildRecord(new DummyEscherRecord());
|
||||||
@ -158,6 +174,7 @@ public final class TestEscherContainerRecord extends TestCase {
|
|||||||
* We were having problems with reading too much data on an UnknownEscherRecord,
|
* We were having problems with reading too much data on an UnknownEscherRecord,
|
||||||
* but hopefully we now read the correct size.
|
* but hopefully we now read the correct size.
|
||||||
*/
|
*/
|
||||||
|
@Test
|
||||||
public void testBug44857() throws Exception {
|
public void testBug44857() throws Exception {
|
||||||
byte[] data = _samples.readFile("Container.dat");
|
byte[] data = _samples.readFile("Container.dat");
|
||||||
|
|
||||||
@ -169,6 +186,7 @@ public final class TestEscherContainerRecord extends TestCase {
|
|||||||
/**
|
/**
|
||||||
* Ensure {@link EscherContainerRecord} doesn't spill its guts everywhere
|
* Ensure {@link EscherContainerRecord} doesn't spill its guts everywhere
|
||||||
*/
|
*/
|
||||||
|
@Test
|
||||||
public void testChildren() {
|
public void testChildren() {
|
||||||
EscherContainerRecord ecr = new EscherContainerRecord();
|
EscherContainerRecord ecr = new EscherContainerRecord();
|
||||||
List<EscherRecord> children0 = ecr.getChildRecords();
|
List<EscherRecord> children0 = ecr.getChildRecords();
|
||||||
|
@ -17,11 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public final class TestEscherDgRecord extends TestCase {
|
public final class TestEscherDgRecord {
|
||||||
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
EscherDgRecord r = createRecord();
|
EscherDgRecord r = createRecord();
|
||||||
|
|
||||||
@ -36,6 +39,7 @@ public final class TestEscherDgRecord extends TestCase {
|
|||||||
HexDump.toHex( data ) );
|
HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String hexData = "10 00 " +
|
String hexData = "10 00 " +
|
||||||
"08 F0 " +
|
"08 F0 " +
|
||||||
@ -51,13 +55,18 @@ public final class TestEscherDgRecord extends TestCase {
|
|||||||
assertEquals( 1025, r.getLastMSOSPID() );
|
assertEquals( 1025, r.getLastMSOSPID() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
String expected = "org.apache.poi.ddf.EscherDgRecord:" + '\n' +
|
String nl = System.getProperty("line.separator");
|
||||||
" RecordId: 0xF008" + '\n' +
|
String expected =
|
||||||
" Version: 0x0000" + '\n' +
|
"org.apache.poi.ddf.EscherDgRecord (Dg):" + nl +
|
||||||
" Instance: 0x0001" + '\n' +
|
" RecordId: 0xF008" + nl +
|
||||||
" NumShapes: 2" + '\n' +
|
" Version: 0x0000" + nl +
|
||||||
" LastMSOSPID: 1025" + '\n';
|
" Instance: 0x0001" + nl +
|
||||||
|
" Options: 0x0010" + nl +
|
||||||
|
" Record Size: 16" + nl +
|
||||||
|
" NumShapes: 0x00000002" + nl +
|
||||||
|
" LastMSOSPID: 0x00000401";
|
||||||
assertEquals( expected, createRecord().toString() );
|
assertEquals( expected, createRecord().toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,11 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public final class TestEscherDggRecord extends TestCase {
|
public final class TestEscherDggRecord {
|
||||||
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
EscherDggRecord r = createRecord();
|
EscherDggRecord r = createRecord();
|
||||||
|
|
||||||
@ -39,6 +42,7 @@ public final class TestEscherDggRecord extends TestCase {
|
|||||||
HexDump.toHex( data ) );
|
HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String hexData = "00 00 " +
|
String hexData = "00 00 " +
|
||||||
"06 F0 " +
|
"06 F0 " +
|
||||||
@ -62,17 +66,22 @@ public final class TestEscherDggRecord extends TestCase {
|
|||||||
assertEquals( 0x02, r.getFileIdClusters()[0].getNumShapeIdsUsed());
|
assertEquals( 0x02, r.getFileIdClusters()[0].getNumShapeIdsUsed());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
String expected = "org.apache.poi.ddf.EscherDggRecord:" + '\n' +
|
String nl = System.getProperty("line.separator");
|
||||||
" RecordId: 0xF006" + '\n' +
|
String expected =
|
||||||
" Version: 0x0000" + '\n' +
|
"org.apache.poi.ddf.EscherDggRecord (Dgg):" + nl +
|
||||||
" Instance: 0x0000" + '\n' +
|
" RecordId: 0xF006" + nl +
|
||||||
" ShapeIdMax: 1026" + '\n' +
|
" Version: 0x0000" + nl +
|
||||||
" NumIdClusters: 2" + '\n' +
|
" Instance: 0x0000" + nl +
|
||||||
" NumShapesSaved: 2" + '\n' +
|
" Options: 0x0000" + nl +
|
||||||
" DrawingsSaved: 1" + '\n' +
|
" Record Size: 32" + nl +
|
||||||
" DrawingGroupId1: 1" + '\n' +
|
" ShapeIdMax: 0x00000402" + nl +
|
||||||
" NumShapeIdsUsed1: 2" + '\n';
|
" NumIdClusters: 0x00000002" + nl +
|
||||||
|
" NumShapesSaved: 0x00000002" + nl +
|
||||||
|
" DrawingsSaved: 0x00000001" + nl +
|
||||||
|
" FileId Clusters: 0x00000001" + nl +
|
||||||
|
" Group1: 0x00000002";
|
||||||
assertEquals( expected, createRecord().toString() );
|
assertEquals( expected, createRecord().toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,6 +99,7 @@ public final class TestEscherDggRecord extends TestCase {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testGetRecordSize() {
|
public void testGetRecordSize() {
|
||||||
EscherDggRecord r = new EscherDggRecord();
|
EscherDggRecord r = new EscherDggRecord();
|
||||||
r.setFileIdClusters(new EscherDggRecord.FileIdCluster[] { new EscherDggRecord.FileIdCluster(0,0) } );
|
r.setFileIdClusters(new EscherDggRecord.FileIdCluster[] { new EscherDggRecord.FileIdCluster(0,0) } );
|
||||||
|
@ -18,13 +18,18 @@
|
|||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.poifs.storage.RawDataUtil;
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public final class TestEscherOptRecord extends TestCase {
|
public final class TestEscherOptRecord {
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
checkFillFieldsSimple();
|
checkFillFieldsSimple();
|
||||||
checkFillFieldsComplex();
|
checkFillFieldsComplex();
|
||||||
@ -74,6 +79,7 @@ public final class TestEscherOptRecord extends TestCase {
|
|||||||
assertEquals( prop3, r.getEscherProperty( 2 ) );
|
assertEquals( prop3, r.getEscherProperty( 2 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
checkSerializeSimple();
|
checkSerializeSimple();
|
||||||
checkSerializeComplex();
|
checkSerializeComplex();
|
||||||
@ -130,6 +136,7 @@ public final class TestEscherOptRecord extends TestCase {
|
|||||||
assertEquals( 26, bytesWritten );
|
assertEquals( 26, bytesWritten );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
String nl = System.getProperty("line.separator");
|
String nl = System.getProperty("line.separator");
|
||||||
EscherOptRecord r = new EscherOptRecord();
|
EscherOptRecord r = new EscherOptRecord();
|
||||||
@ -138,21 +145,25 @@ public final class TestEscherOptRecord extends TestCase {
|
|||||||
r.setRecordId(EscherOptRecord.RECORD_ID);
|
r.setRecordId(EscherOptRecord.RECORD_ID);
|
||||||
EscherProperty prop1 = new EscherBoolProperty((short)1, 1);
|
EscherProperty prop1 = new EscherBoolProperty((short)1, 1);
|
||||||
r.addEscherProperty(prop1);
|
r.addEscherProperty(prop1);
|
||||||
String expected = "org.apache.poi.ddf.EscherOptRecord:" + nl +
|
String expected =
|
||||||
" isContainer: false" + nl +
|
"org.apache.poi.ddf.EscherOptRecord (Opt):" + nl +
|
||||||
" version: 0x0003" + nl +
|
" RecordId: 0xF00B" + nl +
|
||||||
" instance: 0x0001" + nl +
|
" Version: 0x0003" + nl +
|
||||||
" recordId: 0x" + HexDump.toHex(EscherOptRecord.RECORD_ID) + nl +
|
" Instance: 0x0001" + nl +
|
||||||
" numchildren: 0" + nl +
|
" Options: 0x0013" + nl +
|
||||||
" properties:" + nl +
|
" Record Size: 14" + nl +
|
||||||
" propNum: 1, RAW: 0x0001, propName: unknown, complex: false, blipId: false, value: 1 (0x00000001)" + nl;
|
" isContainer: false" + nl +
|
||||||
|
" numchildren: 0x00000000" + nl +
|
||||||
|
" properties: 0x00000001" + nl +
|
||||||
|
" unknown: propNum: 1, RAW: 0x0001, propName: unknown, complex: false, blipId: false, value: 1 (0x00000001)";
|
||||||
assertEquals( expected, r.toString());
|
assertEquals( expected, r.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test serialisation of a particually complex example
|
* Test serialization of a particularly complex example
|
||||||
* This test is currently broken!
|
* This test is currently broken!
|
||||||
*/
|
*/
|
||||||
|
@Test
|
||||||
public void testComplexSerialise() {
|
public void testComplexSerialise() {
|
||||||
byte[] data = {
|
byte[] data = {
|
||||||
0x53, 0x01, 0x0B, 0xF0-256, 0x9C-256, 0x01, 0x00, 0x00,
|
0x53, 0x01, 0x0B, 0xF0-256, 0x9C-256, 0x01, 0x00, 0x00,
|
||||||
@ -233,15 +244,13 @@ public final class TestEscherOptRecord extends TestCase {
|
|||||||
assertEquals(data.length, filled);
|
assertEquals(data.length, filled);
|
||||||
assertEquals(data.length, r.getRecordSize());
|
assertEquals(data.length, r.getRecordSize());
|
||||||
|
|
||||||
// Serialise it
|
// Serialize it
|
||||||
byte[] dest = new byte[data.length];
|
byte[] dest = new byte[data.length];
|
||||||
int written = r.serialize(0, dest);
|
int written = r.serialize(0, dest);
|
||||||
|
|
||||||
// Check it serialised it back to the same data
|
// Check it serialised it back to the same data
|
||||||
assertEquals(data.length, written);
|
assertEquals(data.length, written);
|
||||||
for(int i=0; i<data.length; i++) {
|
assertArrayEquals(data, dest);
|
||||||
assertEquals(data[i], dest[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -254,43 +263,20 @@ public final class TestEscherOptRecord extends TestCase {
|
|||||||
*
|
*
|
||||||
* See Bug 41946 for details.
|
* See Bug 41946 for details.
|
||||||
*/
|
*/
|
||||||
public void test41946() {
|
@Test
|
||||||
String dataStr1 =
|
public void test41946() throws IOException {
|
||||||
"03 08 0B F0 00 03 00 00 81 00 30 65 01 00 82 00 98 B2 00 00 83 00 30 65 01 " +
|
String data64 =
|
||||||
"00 84 00 98 B2 00 00 85 00 00 00 00 00 87 00 01 00 00 00 88 00 00 00 00 00 " +
|
"H4sIAAAAAAAAAB3SuW5TQRjF8TPfOOZCHMeARAluEKIzSEgUSCQsLaLgDYCehgIJCe8L+xIgQB6"+
|
||||||
"89 00 00 00 00 00 BF 00 00 00 0F 00 0C 01 F4 00 00 10 0D 01 00 00 00 20 0E " +
|
"AEvEAOI6zOwlhX54BpBRIiGqY+Vvy7x6d+3k8nmufje/ISzVVrjrVNftWapCb5JbSqyMX7ZJ72I"+
|
||||||
"01 00 00 00 20 80 01 00 00 00 00 81 01 04 00 00 08 82 01 00 00 01 00 83 01 " +
|
"/vSRXcH6k0kW6Wi1hNquZyUlaP2amRmqxJbjHTnmbNQbLLfA9v4x28i/fwPj7Ah/gIH+MTnMGn+"+
|
||||||
"00 00 00 08 84 01 00 00 01 00 85 01 00 00 00 20 86 41 00 00 00 00 87 C1 00 " +
|
"Ayfs/4s+QW+xFc45+KPnuq7gg5q3sUqG7DDBRdC0JB9LjK5xG6XWW2FZhXXcB1H7sRhaSMto02a"+
|
||||||
"00 00 00 88 01 00 00 00 00 89 01 00 00 00 00 8A 01 00 00 00 00 8B 01 00 00 " +
|
"LXzPp745iwaXV1FKUc7iJTMbjUbyqSnnLH37mJ28LOVxF5MZ7ubuHvI4FmgmyEWctPSQSuS9eDr"+
|
||||||
"00 00 8C 01 00 00 00 00 8D 01 00 00 00 00 8E 01 00 00 00 00 8F 01 00 00 00 " +
|
"qVSXXmK/bWMwNmzsmNelbtvMvrza5Y3/jAl320zcXn+88/QAX7Ep0SF7EJVzGFVzFNVy3yvV4Mr"+
|
||||||
"00 90 01 00 00 00 00 91 01 00 00 00 00 92 01 00 00 00 00 93 01 00 00 00 00 " +
|
"a9b782rPL7V9i0qUs9bZmq8WSiIWzHyRvhgx2P8x+tfEH6ZBeH0mdW+GKlI9JXuzYTz9DenArhO"+
|
||||||
"94 01 00 00 00 00 95 01 00 00 00 00 96 01 00 00 00 00 97 C1 00 00 00 00 98 " +
|
"/0P+p/0wQ7okHI+Hfe0f33U6YxPM2d9upzzN985nae55dM/tknTommTO+T/V9IPpAgDAAA=";
|
||||||
"01 00 00 00 00 99 01 00 00 00 00 9A 01 00 00 00 00 9B 01 00 00 00 00 9C 01 " +
|
|
||||||
"03 00 00 40 BF 01 0C 00 1E 00 C0 01 01 00 00 08 C1 01 00 00 01 00 C2 01 FF " +
|
|
||||||
"FF FF 00 C3 01 00 00 00 20 C4 01 00 00 00 00 C5 41 00 00 00 00 C6 C1 00 00 " +
|
|
||||||
"00 00 C7 01 00 00 00 00 C8 01 00 00 00 00 C9 01 00 00 00 00 CA 01 00 00 00 " +
|
|
||||||
"00 CB 01 35 25 00 00 CC 01 00 00 08 00 CD 01 00 00 00 00 CE 01 00 00 00 00 " +
|
|
||||||
"CF C1 00 00 00 00 D7 01 02 00 00 00 FF 01 06 00 0E 00 00 02 00 00 00 00 01 " +
|
|
||||||
"02 02 00 00 08 02 02 CB CB CB 00 03 02 00 00 00 20 04 02 00 00 01 00 05 02 " +
|
|
||||||
"38 63 00 00 06 02 38 63 00 00 07 02 00 00 00 00 08 02 00 00 00 00 09 02 00 " +
|
|
||||||
"00 01 00 0A 02 00 00 00 00 0B 02 00 00 00 00 0C 02 00 00 01 00 0D 02 00 00 " +
|
|
||||||
"00 00 0E 02 00 00 00 00 0F 02 00 01 00 00 10 02 00 00 00 00 11 02 00 00 00 " +
|
|
||||||
"00 3F 02 00 00 03 00 80 02 00 00 00 00 81 02 00 00 01 00 82 02 05 00 00 00 " +
|
|
||||||
"83 02 9C 31 00 00 84 02 00 00 00 00 85 02 F0 F9 06 00 86 02 00 00 00 00 87 " +
|
|
||||||
"02 F7 00 00 10 88 02 00 00 00 20 BF 02 01 00 0F 00 C0 02 00 00 00 00 C1 02 " +
|
|
||||||
"00 00 00 00 C2 02 64 00 00 00 C3 02 00 00 00 00 C4 02 00 00 00 00 C5 02 00 " +
|
|
||||||
"00 00 00 C6 02 00 00 00 00 C7 02 00 00 00 00 C8 02 00 00 00 00 C9 02 00 00 " +
|
|
||||||
"00 00 CA 02 30 75 00 00 CB 02 D0 12 13 00 CC 02 30 ED EC FF CD 02 40 54 89 " +
|
|
||||||
"00 CE 02 00 80 00 00 CF 02 00 80 FF FF D0 02 00 00 79 FF D1 02 32 00 00 00 " +
|
|
||||||
"D2 02 20 4E 00 00 D3 02 50 C3 00 00 D4 02 00 00 00 00 D5 02 10 27 00 00 D6 " +
|
|
||||||
"02 70 94 00 00 D7 02 B0 3C FF FF D8 02 00 00 00 00 D9 02 10 27 00 00 DA 02 " +
|
|
||||||
"70 94 00 00 FF 02 16 00 1F 00 04 03 01 00 00 00 41 03 A8 29 01 00 42 03 00 " +
|
|
||||||
"00 00 00 43 03 03 00 00 00 44 03 7C BE 01 00 45 03 00 00 00 00 7F 03 00 00 " +
|
|
||||||
"0F 00 84 03 7C BE 01 00 85 03 00 00 00 00 86 03 7C BE 01 00 87 03 00 00 00 " +
|
|
||||||
"00";
|
|
||||||
|
|
||||||
EscherOptRecord r = new EscherOptRecord();
|
EscherOptRecord r = new EscherOptRecord();
|
||||||
byte[] data = HexRead.readFromString( dataStr1 );
|
byte[] data = RawDataUtil.decompress(data64);
|
||||||
r.fillFields( data, 0, new DefaultEscherRecordFactory() );
|
r.fillFields( data, 0, new DefaultEscherRecordFactory() );
|
||||||
assertEquals( (short) 0xF00B, r.getRecordId() );
|
assertEquals( (short) 0xF00B, r.getRecordId() );
|
||||||
|
|
||||||
@ -306,6 +292,7 @@ public final class TestEscherOptRecord extends TestCase {
|
|||||||
* Test that EscherOptRecord can properly read/write array properties
|
* Test that EscherOptRecord can properly read/write array properties
|
||||||
* with empty complex part.
|
* with empty complex part.
|
||||||
*/
|
*/
|
||||||
|
@Test
|
||||||
public void testEmptyArrayProperty() {
|
public void testEmptyArrayProperty() {
|
||||||
EscherOptRecord r = new EscherOptRecord();
|
EscherOptRecord r = new EscherOptRecord();
|
||||||
EscherArrayProperty p = new EscherArrayProperty((short)(EscherProperties.FILL__SHADECOLORS + 0x8000), new byte[0] );
|
EscherArrayProperty p = new EscherArrayProperty((short)(EscherProperties.FILL__SHADECOLORS + 0x8000), new byte[0] );
|
||||||
|
@ -17,18 +17,19 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
||||||
/**
|
public class TestEscherProperty {
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public class TestEscherProperty extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* assure that EscherProperty.getName() returns correct name for complex properties
|
* assure that EscherProperty.getName() returns correct name for complex properties
|
||||||
* See Bugzilla 50401
|
* See Bugzilla 50401
|
||||||
*/
|
*/
|
||||||
|
@Test
|
||||||
public void testPropertyNames() throws Exception {
|
public void testPropertyNames() throws Exception {
|
||||||
EscherProperty p1 = new EscherSimpleProperty( EscherProperties.GROUPSHAPE__SHAPENAME, 0);
|
EscherProperty p1 = new EscherSimpleProperty( EscherProperties.GROUPSHAPE__SHAPENAME, 0);
|
||||||
assertEquals("groupshape.shapename", p1.getName());
|
assertEquals("groupshape.shapename", p1.getName());
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class TestEscherSpRecord extends TestCase
|
public class TestEscherSpRecord {
|
||||||
{
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
EscherSpRecord r = createRecord();
|
EscherSpRecord r = createRecord();
|
||||||
|
|
||||||
@ -37,6 +39,7 @@ public class TestEscherSpRecord extends TestCase
|
|||||||
HexDump.toHex( data ) );
|
HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String hexData = "02 00 " +
|
String hexData = "02 00 " +
|
||||||
"0A F0 " +
|
"0A F0 " +
|
||||||
@ -52,15 +55,20 @@ public class TestEscherSpRecord extends TestCase
|
|||||||
assertEquals( 0x05, r.getFlags() );
|
assertEquals( 0x05, r.getFlags() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
String nl = System.getProperty("line.separator");
|
String nl = System.getProperty("line.separator");
|
||||||
|
|
||||||
String expected = "org.apache.poi.ddf.EscherSpRecord:" + nl +
|
String expected =
|
||||||
" RecordId: 0xF00A" + nl +
|
"org.apache.poi.ddf.EscherSpRecord (Sp):" + nl +
|
||||||
" Version: 0x0002" + nl +
|
" RecordId: 0xF00A" + nl +
|
||||||
" ShapeType: 0x0000" + nl +
|
" Version: 0x0002" + nl +
|
||||||
" ShapeId: 1024" + nl +
|
" Instance: 0x0000" + nl +
|
||||||
" Flags: GROUP|PATRIARCH (0x00000005)" + nl;
|
" Options: 0x0002" + nl +
|
||||||
|
" Record Size: 16" + nl +
|
||||||
|
" ShapeType: 0x0000" + nl +
|
||||||
|
" ShapeId: 0x00000400" + nl +
|
||||||
|
" Flags: GROUP|PATRIARCH (0x00000005)";
|
||||||
assertEquals( expected, createRecord().toString() );
|
assertEquals( expected, createRecord().toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,11 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public final class TestEscherSpgrRecord extends TestCase {
|
public final class TestEscherSpgrRecord {
|
||||||
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
EscherSpgrRecord r = createRecord();
|
EscherSpgrRecord r = createRecord();
|
||||||
|
|
||||||
@ -38,6 +41,7 @@ public final class TestEscherSpgrRecord extends TestCase {
|
|||||||
HexDump.toHex( data ) );
|
HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String hexData = "10 00 " +
|
String hexData = "10 00 " +
|
||||||
"09 F0 " +
|
"09 F0 " +
|
||||||
@ -57,16 +61,20 @@ public final class TestEscherSpgrRecord extends TestCase {
|
|||||||
assertEquals( 4, r.getRectY2() );
|
assertEquals( 4, r.getRectY2() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
|
String nl = System.getProperty("line.separator");
|
||||||
String expected = "org.apache.poi.ddf.EscherSpgrRecord:" + '\n' +
|
String expected =
|
||||||
" RecordId: 0xF009" + '\n' +
|
"org.apache.poi.ddf.EscherSpgrRecord (Spgr):" + nl +
|
||||||
" Version: 0x0000" + '\n' +
|
" RecordId: 0xF009" + nl +
|
||||||
" Instance: 0x0001" + '\n' +
|
" Version: 0x0000" + nl +
|
||||||
" RectX: 1" + '\n' +
|
" Instance: 0x0001" + nl +
|
||||||
" RectY: 2" + '\n' +
|
" Options: 0x0010" + nl +
|
||||||
" RectWidth: 3" + '\n' +
|
" Record Size: 24" + nl +
|
||||||
" RectHeight: 4" + '\n';
|
" RectX: 0x00000001" + nl +
|
||||||
|
" RectY: 0x00000002" + nl +
|
||||||
|
" RectWidth: 0x00000003" + nl +
|
||||||
|
" RectHeight: 0x00000004";
|
||||||
assertEquals( expected, createRecord().toString() );
|
assertEquals( expected, createRecord().toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,11 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.HexRead;
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public final class TestEscherSplitMenuColorsRecord extends TestCase {
|
public final class TestEscherSplitMenuColorsRecord {
|
||||||
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
EscherSplitMenuColorsRecord r = createRecord();
|
EscherSplitMenuColorsRecord r = createRecord();
|
||||||
|
|
||||||
@ -38,6 +41,7 @@ public final class TestEscherSplitMenuColorsRecord extends TestCase {
|
|||||||
HexDump.toHex( data ) );
|
HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String hexData = "40 00 " +
|
String hexData = "40 00 " +
|
||||||
"1E F1 " +
|
"1E F1 " +
|
||||||
@ -57,16 +61,20 @@ public final class TestEscherSplitMenuColorsRecord extends TestCase {
|
|||||||
assertEquals( 0x01, r.getColor4() );
|
assertEquals( 0x01, r.getColor4() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
String expected = "org.apache.poi.ddf.EscherSplitMenuColorsRecord:" + '\n' +
|
String nl = System.getProperty("line.separator");
|
||||||
" RecordId: 0xF11E" + '\n' +
|
String expected =
|
||||||
" Version: 0x0000" + '\n' +
|
"org.apache.poi.ddf.EscherSplitMenuColorsRecord (SplitMenuColors):" + nl +
|
||||||
" Instance: 0x0004" + '\n' +
|
" RecordId: 0xF11E" + nl +
|
||||||
" Color1: 0x00000402" + '\n' +
|
" Version: 0x0000" + nl +
|
||||||
" Color2: 0x00000002" + '\n' +
|
" Instance: 0x0004" + nl +
|
||||||
" Color3: 0x00000002" + '\n' +
|
" Options: 0x0040" + nl +
|
||||||
" Color4: 0x00000001" + '\n' +
|
" Record Size: 24" + nl +
|
||||||
"";
|
" Color1: 0x00000402" + nl +
|
||||||
|
" Color2: 0x00000002" + nl +
|
||||||
|
" Color3: 0x00000002" + nl +
|
||||||
|
" Color4: 0x00000001";
|
||||||
assertEquals( expected, createRecord().toString() );
|
assertEquals( expected, createRecord().toString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,11 +17,16 @@
|
|||||||
|
|
||||||
package org.apache.poi.ddf;
|
package org.apache.poi.ddf;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import static org.junit.Assert.assertEquals;
|
||||||
import org.apache.poi.util.HexRead;
|
import static org.junit.Assert.assertFalse;
|
||||||
import org.apache.poi.util.HexDump;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
public final class TestUnknownEscherRecord extends TestCase {
|
import org.apache.poi.util.HexDump;
|
||||||
|
import org.apache.poi.util.HexRead;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public final class TestUnknownEscherRecord {
|
||||||
|
@Test
|
||||||
public void testFillFields() {
|
public void testFillFields() {
|
||||||
String testData =
|
String testData =
|
||||||
"0F 02 " + // options
|
"0F 02 " + // options
|
||||||
@ -117,6 +122,7 @@ public final class TestUnknownEscherRecord extends TestCase {
|
|||||||
assertEquals( (short) 0xFFFF, r.getChild( 0 ).getRecordId() );
|
assertEquals( (short) 0xFFFF, r.getChild( 0 ).getRecordId() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testSerialize() {
|
public void testSerialize() {
|
||||||
UnknownEscherRecord r = new UnknownEscherRecord();
|
UnknownEscherRecord r = new UnknownEscherRecord();
|
||||||
r.setOptions( (short) 0x1234 );
|
r.setOptions( (short) 0x1234 );
|
||||||
@ -137,20 +143,27 @@ public final class TestUnknownEscherRecord extends TestCase {
|
|||||||
assertEquals( "[3F, 12, 12, F1, 08, 00, 00, 00, 99, 99, 01, FF, 00, 00, 00, 00]", HexDump.toHex( data ) );
|
assertEquals( "[3F, 12, 12, F1, 08, 00, 00, 00, 99, 99, 01, FF, 00, 00, 00, 00]", HexDump.toHex( data ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testToString() {
|
public void testToString() {
|
||||||
UnknownEscherRecord r = new UnknownEscherRecord();
|
UnknownEscherRecord r = new UnknownEscherRecord();
|
||||||
r.setOptions( (short) 0x1234 );
|
r.setOptions( (short) 0x1234 );
|
||||||
r.setRecordId( (short) 0xF112 );
|
r.setRecordId( (short) 0xF112 );
|
||||||
byte[] data = new byte[8];
|
byte[] data = new byte[8];
|
||||||
r.serialize( 0, data, new NullEscherSerializationListener() );
|
r.serialize( 0, data, new NullEscherSerializationListener() );
|
||||||
|
String nl = System.getProperty("line.separator");
|
||||||
assertEquals( "org.apache.poi.ddf.UnknownEscherRecord:" + '\n' +
|
String expected =
|
||||||
" isContainer: false" + '\n' +
|
"org.apache.poi.ddf.UnknownEscherRecord (Unknown 0xF112):" + nl +
|
||||||
" version: 0x0004" + '\n' +
|
" RecordId: 0xF112" + nl +
|
||||||
" instance: 0x0123" + '\n' +
|
" Version: 0x0004" + nl +
|
||||||
" recordId: 0xF112" + '\n' +
|
" Instance: 0x0123" + nl +
|
||||||
" numchildren: 0" + '\n' +
|
" Options: 0x1234" + nl +
|
||||||
": 0"
|
" Record Size: 8" + nl +
|
||||||
, r.toString() );
|
" isContainer: false" + nl +
|
||||||
|
" children: 0x00000000" + nl +
|
||||||
|
" Extra Data: " + nl +
|
||||||
|
" : 0";
|
||||||
|
|
||||||
|
|
||||||
|
assertEquals(expected, r.toString() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user