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: [EMAIL PROTECTED]
Mailing List:    http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/

Reply via email to