]> source.dussan.org Git - poi.git/commitdiff
Fix bug #50939 - ChartEndObjectRecord is supposed to have 6 bytes at the end, but...
authorNick Burch <nick@apache.org>
Fri, 18 Mar 2011 14:30:47 +0000 (14:30 +0000)
committerNick Burch <nick@apache.org>
Fri, 18 Mar 2011 14:30:47 +0000 (14:30 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1082936 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/record/chart/ChartEndObjectRecord.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
test-data/spreadsheet/50939.xls [new file with mode: 0644]

index 6aa916b383379e901660e4121a70e8a166a4bfe8..5410a7fab4c8fefc6913a18dcb97cd933bed8d45 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta2" date="2011-??-??">
+           <action dev="poi-developers" type="fix">50939 - ChartEndObjectRecord is supposed to have 6 bytes at the end, but handle it not</action>
            <action dev="poi-developers" type="add">HMEF - New component which supports TNEF (Transport Neutral Encoding Format), aka winmail.dat</action>
            <action dev="poi-developers" type="fix">50313 - support for getting HWPFDocument fields</action>
            <action dev="poi-developers" type="fix">50912 - fixed setting named styles to HSSFCells</action>
index 14524496004f056392799e95fa43702ead3ee8bb..3e9a86af28729b7cc8ce1588f7524f897138c95e 100644 (file)
@@ -33,15 +33,23 @@ public final class ChartEndObjectRecord extends StandardRecord {
        private short rt;
        private short grbitFrt;
        private short iObjectKind;
-       private byte[] unused;
+       private byte[] reserved;
 
        public ChartEndObjectRecord(RecordInputStream in) {
                rt = in.readShort();
                grbitFrt = in.readShort();
                iObjectKind = in.readShort();
 
-               unused = new byte[6];
-               in.readFully(unused);
+               // The spec says that there should be 6 bytes at the
+               //  end, which must be there and must be zero
+               // However, sometimes Excel forgets them...
+               reserved = new byte[6];
+               if(in.available() == 0) {
+                  // They've gone missing...
+               } else {
+                  // Read the reserved bytes 
+                  in.readFully(reserved);
+               }
        }
 
        @Override
@@ -60,7 +68,7 @@ public final class ChartEndObjectRecord extends StandardRecord {
                out.writeShort(grbitFrt);
                out.writeShort(iObjectKind);
                // 6 bytes unused
-               out.write(unused);
+               out.write(reserved);
        }
 
        @Override
@@ -71,7 +79,7 @@ public final class ChartEndObjectRecord extends StandardRecord {
                buffer.append("    .rt         =").append(HexDump.shortToHex(rt)).append('\n');
                buffer.append("    .grbitFrt   =").append(HexDump.shortToHex(grbitFrt)).append('\n');
                buffer.append("    .iObjectKind=").append(HexDump.shortToHex(iObjectKind)).append('\n');
-               buffer.append("    .unused     =").append(HexDump.toHex(unused)).append('\n');
+               buffer.append("    .reserved   =").append(HexDump.toHex(reserved)).append('\n');
                buffer.append("[/ENDOBJECT]\n");
                return buffer.toString();
        }
index 08566a2e9b9971255b5af8eeb64cb077979c22e5..e27ce841aba57eba666e445ee0ba00cff0781767 100644 (file)
@@ -2028,4 +2028,12 @@ if(1==2) {
         writeOutAndReadBack(wb2);
     }
 
+    /**
+     * The spec says that ChartEndObjectRecord has 6 reserved
+     *  bytes on the end, but we sometimes find files without... 
+     */
+    public void test50939() throws Exception {
+       HSSFWorkbook wb = openSample("50939.xls");
+       assertEquals(2, wb.getNumberOfSheets());
+    }
 }
diff --git a/test-data/spreadsheet/50939.xls b/test-data/spreadsheet/50939.xls
new file mode 100644 (file)
index 0000000..bcc2068
Binary files /dev/null and b/test-data/spreadsheet/50939.xls differ