You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by ni...@apache.org on 2006/06/13 18:59:35 UTC
svn commit: r413933 - in /jakarta/poi/trunk/src:
java/org/apache/poi/ddf/EscherArrayProperty.java
testcases/org/apache/poi/ddf/TestEscherOptRecord.java
Author: nick
Date: Tue Jun 13 09:59:34 2006
New Revision: 413933
URL: http://svn.apache.org/viewvc?rev=413933&view=rev
Log:
Fix for bug 39800 - if the Array size in the simple block doesn't inclde the size of the header, make a note of this, and do the same when we write back out
Modified:
jakarta/poi/trunk/src/java/org/apache/poi/ddf/EscherArrayProperty.java
jakarta/poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherOptRecord.java
Modified: jakarta/poi/trunk/src/java/org/apache/poi/ddf/EscherArrayProperty.java
URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/java/org/apache/poi/ddf/EscherArrayProperty.java?rev=413933&r1=413932&r2=413933&view=diff
==============================================================================
--- jakarta/poi/trunk/src/java/org/apache/poi/ddf/EscherArrayProperty.java (original)
+++ jakarta/poi/trunk/src/java/org/apache/poi/ddf/EscherArrayProperty.java Tue Jun 13 09:59:34 2006
@@ -32,7 +32,17 @@
public class EscherArrayProperty
extends EscherComplexProperty
{
+ /**
+ * The size of the header that goes at the
+ * start of the array, before the data
+ */
private static final int FIXED_SIZE = 3 * 2;
+ /**
+ * Normally, the size recorded in the simple data (for the complex
+ * data) includes the size of the header.
+ * There are a few cases when it doesn't though...
+ */
+ private boolean sizeIncludesHeaderSize = true;
public EscherArrayProperty( short id, byte[] complexData )
{
@@ -158,10 +168,30 @@
short sizeOfElements = LittleEndian.getShort(data, offset + 4);
int arraySize = getActualSizeOfElements(sizeOfElements) * numElements;
- if (arraySize == complexData.length)
- complexData = new byte[arraySize + 6]; // Calculation missing the header for some reason
+ if (arraySize == complexData.length) {
+ // The stored data size in the simple block excludes the header size
+ complexData = new byte[arraySize + 6];
+ sizeIncludesHeaderSize = false;
+ }
System.arraycopy(data, offset, complexData, 0, complexData.length );
return complexData.length;
+ }
+
+ /**
+ * Serializes the simple part of this property. ie the first 6 bytes.
+ *
+ * Needs special code to handle the case when the size doesn't
+ * include the size of the header block
+ */
+ public int serializeSimplePart( byte[] data, int pos )
+ {
+ LittleEndian.putShort(data, pos, getId());
+ int recordSize = complexData.length;
+ if(!sizeIncludesHeaderSize) {
+ recordSize -= 6;
+ }
+ LittleEndian.putInt(data, pos + 2, recordSize);
+ return 6;
}
/**
Modified: jakarta/poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherOptRecord.java
URL: http://svn.apache.org/viewvc/jakarta/poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherOptRecord.java?rev=413933&r1=413932&r2=413933&view=diff
==============================================================================
--- jakarta/poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherOptRecord.java (original)
+++ jakarta/poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherOptRecord.java Tue Jun 13 09:59:34 2006
@@ -158,26 +158,39 @@
* Test serialisation of a particually complex example
* This test is currently broken!
*/
- public void BROKENtestComplexSerialise() throws Exception {
+ public void testComplexSerialise() throws Exception {
byte[] data = new byte[] {
- 0x53, 0x01, 0x0B, 0xF0-256, 0x9C-256, 0x01, 0x00, 0x00, 0x42, 0x01,
- 0x49, 0x00, 0x00, 0x00, 0x43, 0x01, 0x85-256, 0x00, 0x00,
- 0x00, 0x44, 0x01, 0x04, 0x00, 0x00, 0x00,
- 0x45, 0xC1-256, 0x88-256, 0x00, 0x00, 0x00, 0x46, 0xC1-256,
- 0x90-256, 0x00, 0x00, 0x00, 0x7F, 0x01, 0x01, 0x00,
- 0x01, 0x00, 0x80-256, 0x01, 0x00, 0x00, 0x00, 0x00, 0x81-256,
- 0x01, 0x02, 0x00, 0x00, 0x08, 0xBF-256, 0x01,
- 0x10, 0x00, 0x10, 0x00, 0xC0-256, 0x01, 0x01, 0x00, 0x00, 0x08,
+ 0x53, 0x01, 0x0B, 0xF0-256, 0x9C-256, 0x01, 0x00, 0x00,
+ // Simple data follows
+ 0x42, 0x01, 0x49, 0x00, 0x00, 0x00, // SP @ 8
+ 0x43, 0x01, 0x85-256, 0x00, 0x00, 0x00, // SP @ 14
+ 0x44, 0x01, 0x04, 0x00, 0x00, 0x00, // SP @ 20
+ 0x45, 0xC1-256, 0x88-256, 0x00, 0x00, 0x00, // SP @ 26
+ 0x46, 0xC1-256, 0x90-256, 0x00, 0x00, 0x00, // SP @ 32
+ 0x7F, 0x01, 0x01, 0x00, 0x01, 0x00,
+ 0x80-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x81-256, 0x01, 0x02, 0x00, 0x00, 0x08,
+ 0xBF-256, 0x01, 0x10, 0x00, 0x10, 0x00,
+ 0xC0-256, 0x01, 0x01, 0x00, 0x00, 0x08, // SP 10
0xC1-256, 0x01, 0x00, 0x00, 0x01, 0x00,
- 0xC4-256, 0x01, 0x00, 0x00, 0x00, 0x00, 0xCB-256, 0x01, 0x38,
- 0x63, 0x00, 0x00, 0xCD-256, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0xCE-256, 0x01, 0x00, 0x00, 0x00, 0x00, 0xD0-256,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0xD1-256, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0xD7-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xC4-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xCB-256, 0x01, 0x38, 0x63, 0x00, 0x00,
+ 0xCD-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xCE-256, 0x01, 0x00, 0x00, 0x00, 0x00, // SP 15
+ 0xD0-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xD1-256, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xD7-256, 0x01, 0x00, 0x00, 0x00, 0x00,
0xFF-256, 0x01, 0x18, 0x00, 0x18, 0x00,
- 0x01, 0x02, 0x02, 0x00, 0x00, 0x08, 0x3F, 0x02, 0x00, 0x00,
- 0x02, 0x00, 0x22, 0x00, 0x22, 0x00,
- 0xF0-256, 0xFF-256, 0x18, 0x00, 0x28, 0x00, 0x04, 0x00, 0x34,
+ 0x01, 0x02, 0x02, 0x00, 0x00, 0x08,
+ 0x3F, 0x02, 0x00, 0x00, 0x02, 0x00, // SP 21
+
+ // Complex data follows
+
+ // Complex data for Array #325
+ // Array header
+ 0x22, 0x00, 0x22, 0x00, 0xF0-256, 0xFF-256,
+ // Array data
+ 0x18, 0x00, 0x28, 0x00, 0x04, 0x00, 0x34,
0x00, 0x04, 0x00, 0x28, 0x00, 0x04, 0x00,
0x1C, 0x00, 0x04, 0x00, 0x10, 0x00, 0x04, 0x00, 0x04, 0x00, 0x10,
0x00, 0x00, 0x00, 0x1C, 0x00,
@@ -193,8 +206,11 @@
0x00, 0x30, 0x00, 0x08, 0x00,
0x3C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x08, 0x00, 0x54, 0x00, 0x00,
0x00, 0x48, 0x00, 0x00, 0x00,
- 0x3C, 0x00, 0x00, 0x00, 0x30, 0x00, 0x04, 0x00, 0x24, 0x00, 0x45,
- 0x00, 0x48, 0x00, 0x02, 0x00,
+ 0x3C, 0x00, 0x00, 0x00, 0x30, 0x00, 0x04, 0x00, 0x24, 0x00,
+ // Complex data for Array #326
+ // Array header
+ 0x45, 0x00, 0x48, 0x00, 0x02, 0x00,
+ // Array data
0x00, 0x40, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256,
0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00, 0x00, 0xB0-256, 0x01, 0x00,
@@ -216,9 +232,10 @@
// Create the record
EscherOptRecord r = new EscherOptRecord();
- r.fillFields( data, new DefaultEscherRecordFactory() );
+ int filled = r.fillFields( data, new DefaultEscherRecordFactory() );
// Check it's the right length
+ assertEquals(data.length, filled);
assertEquals(data.length, r.getRecordSize());
// Serialise it
@@ -228,7 +245,6 @@
// Check it serialised it back to the same data
assertEquals(data.length, written);
for(int i=0; i<data.length; i++) {
- System.err.println(i);
assertEquals(data[i], dest[i]);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: poi-dev-unsubscribe@jakarta.apache.org
Mailing List: http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/