]> source.dussan.org Git - poi.git/commitdiff
Fixed RecordFactoryInputStream to properly read continued DrawingRecords
authorYegor Kozlov <yegor@apache.org>
Sat, 25 Jul 2009 10:22:04 +0000 (10:22 +0000)
committerYegor Kozlov <yegor@apache.org>
Sat, 25 Jul 2009 10:22:04 +0000 (10:22 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@797737 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java
src/testcases/org/apache/poi/hssf/record/TestDrawingRecord.java [new file with mode: 0755]

index 5e88f2b5b8272083ae9aeaff59ba471e047b15b3..e935ae62c6a36781b43e2b05c3626925c3f76f45 100644 (file)
@@ -33,6 +33,7 @@
 
     <changes>
         <release version="3.5-beta7" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">47548 - Fixed RecordFactoryInputStream to properly read continued DrawingRecords</action>
            <action dev="POI-DEVELOPERS" type="fix">46419 - Fixed compatibility issue with OpenOffice 3.0</action>
            <action dev="POI-DEVELOPERS" type="fix">47559 - Fixed compatibility issue with Excel 2008 Mac sp2</action>
            <action dev="POI-DEVELOPERS" type="fix">47540 - Fix for saving custom and extended OOXML properties</action>
index 285a49094d8ce42d9353f9b029c408736bf6296c..19f2ca45c92e20abf9278df21aa0e7345cdb4c28 100755 (executable)
@@ -197,6 +197,9 @@ public class RecordFactoryInputStream {
                 } else if (lastRecord instanceof DrawingGroupRecord) {
                     ((DrawingGroupRecord) lastRecord).processContinueRecord(contRec.getData());
                     return null;
+                } else if (lastRecord instanceof DrawingRecord) {
+                    ((DrawingRecord) lastRecord).processContinueRecord(contRec.getData());
+                    return null;
                 } else if (lastRecord instanceof UnknownRecord) {
                     //Gracefully handle records that we don't know about,
                     //that happen to be continued
diff --git a/src/testcases/org/apache/poi/hssf/record/TestDrawingRecord.java b/src/testcases/org/apache/poi/hssf/record/TestDrawingRecord.java
new file mode 100755 (executable)
index 0000000..a920a09
--- /dev/null
@@ -0,0 +1,71 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record;
+
+import junit.framework.TestCase;
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherSpRecord;
+import org.apache.poi.util.HexDump;
+import org.apache.poi.util.HexRead;
+import org.apache.poi.util.LittleEndianOutput;
+import org.apache.poi.util.LittleEndianOutputStream;
+import org.apache.poi.hssf.HSSFTestDataSamples;
+
+import java.io.*;
+import java.util.List;
+import java.util.Arrays;
+
+public final class TestDrawingRecord extends TestCase {
+
+    /**
+     * Check that RecordFactoryInputStream properly handles continued DrawingRecords
+     * See Bugzilla #47548
+     */
+    public void testReadContinued() throws IOException {
+
+        //simulate a continues drawing record
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        //main part
+        DrawingRecord dg = new DrawingRecord();
+        byte[] data1 = new byte[8224];
+        Arrays.fill(data1, (byte)1);
+        dg.setData(data1);
+        out.write(dg.serialize());
+
+        //continued part
+        byte[] data2 = new byte[4048];
+        Arrays.fill(data2, (byte)2);
+        ContinueRecord cn = new ContinueRecord(data2);
+        out.write(cn.serialize());
+
+        List<Record> rec = RecordFactory.createRecords(new ByteArrayInputStream(out.toByteArray()));
+        assertEquals(1, rec.size());
+        assertTrue(rec.get(0) instanceof DrawingRecord);
+
+        //DrawingRecord.getData() should return concatenated data1 and data2
+        byte[] tmp = new byte[data1.length + data2.length];
+        System.arraycopy(data1, 0, tmp, 0, data1.length);
+        System.arraycopy(data2, 0, tmp, data1.length, data2.length);
+
+        DrawingRecord dg2 = (DrawingRecord)rec.get(0);
+        assertEquals(data1.length + data2.length, dg2.getData().length);
+        assertTrue(Arrays.equals(tmp, dg2.getData()));
+
+    }
+
+}
\ No newline at end of file