aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/documentation/content/xdocs/status.xml1
-rwxr-xr-xsrc/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java3
-rwxr-xr-xsrc/testcases/org/apache/poi/hssf/record/TestDrawingRecord.java71
3 files changed, 75 insertions, 0 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml
index 5e88f2b5b8..e935ae62c6 100644
--- a/src/documentation/content/xdocs/status.xml
+++ b/src/documentation/content/xdocs/status.xml
@@ -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>
diff --git a/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java b/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java
index 285a49094d..19f2ca45c9 100755
--- a/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java
+++ b/src/java/org/apache/poi/hssf/record/RecordFactoryInputStream.java
@@ -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
index 0000000000..a920a09df6
--- /dev/null
+++ b/src/testcases/org/apache/poi/hssf/record/TestDrawingRecord.java
@@ -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