]> source.dussan.org Git - poi.git/commitdiff
Base class for "old version" exceptions, and new HSLF detection + use of old versions...
authorNick Burch <nick@apache.org>
Sat, 16 May 2009 20:51:29 +0000 (20:51 +0000)
committerNick Burch <nick@apache.org>
Sat, 16 May 2009 20:51:29 +0000 (20:51 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@775526 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/OldFileFormatException.java [new file with mode: 0644]
src/java/org/apache/poi/hssf/OldExcelFormatException.java
src/scratchpad/src/org/apache/poi/hslf/exceptions/OldPowerPointFormatException.java [new file with mode: 0644]
src/scratchpad/src/org/apache/poi/hslf/record/CurrentUserAtom.java
src/scratchpad/testcases/org/apache/poi/hslf/data/PPT95.ppt [new file with mode: 0644]
src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java

index c378bc5a42337abde82935faafba225e4e3e3e1b..0b0d34ea70b736d3de58a987b781d045e133d968 100644 (file)
@@ -37,6 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.5-beta6" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="add">41711 - Base class for "old version" exceptions, and new HSLF detection + use of old versions exception</action>
            <action dev="POI-DEVELOPERS" type="fix">47179 - Fix string encoding issues with HSMF chunks on non-windows platforms</action>
            <action dev="POI-DEVELOPERS" type="add">47183 - Attachment support for HSMF</action>
            <action dev="POI-DEVELOPERS" type="fix">47154 - Handle the cell format @ as the same as General</action>
index 1a00c9ee03a189466d489b0bb3b0e0f7a4686fe3..380b622ce3cc24625089f15e7b4c6d728f4453dd 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.5-beta6" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="add">41711 - Base class for "old version" exceptions, and new HSLF detection + use of old versions exception</action>
            <action dev="POI-DEVELOPERS" type="fix">47179 - Fix string encoding issues with HSMF chunks on non-windows platforms</action>
            <action dev="POI-DEVELOPERS" type="add">47183 - Attachment support for HSMF</action>
            <action dev="POI-DEVELOPERS" type="fix">47154 - Handle the cell format @ as the same as General</action>
diff --git a/src/java/org/apache/poi/OldFileFormatException.java b/src/java/org/apache/poi/OldFileFormatException.java
new file mode 100644 (file)
index 0000000..abcdc97
--- /dev/null
@@ -0,0 +1,27 @@
+/* ====================================================================
+   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;
+
+/**
+ * Base class of all the exceptions that POI throws in the event
+ * that it's given a file that's older than currently supported.
+ */
+public abstract class OldFileFormatException extends IllegalArgumentException {
+       public OldFileFormatException(String s) {
+               super(s);
+       }
+}
\ No newline at end of file
index 5b8e5e4c4168c1a0c9fffd06c1aa34749d0912db..e42e613d84eff31fb0872c2bf02eeeea3d87ca16 100644 (file)
@@ -16,7 +16,9 @@
 ==================================================================== */
 package org.apache.poi.hssf;
 
-public class OldExcelFormatException extends IllegalArgumentException {
+import org.apache.poi.OldFileFormatException;
+
+public class OldExcelFormatException extends OldFileFormatException {
        public OldExcelFormatException(String s) {
                super(s);
        }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/exceptions/OldPowerPointFormatException.java b/src/scratchpad/src/org/apache/poi/hslf/exceptions/OldPowerPointFormatException.java
new file mode 100644 (file)
index 0000000..fbb2f6d
--- /dev/null
@@ -0,0 +1,30 @@
+
+/* ====================================================================
+   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.hslf.exceptions;
+
+import org.apache.poi.OldFileFormatException;
+
+/**
+ * This exception is thrown when we try to open a PowerPoint file, and
+ *  it's too old for us.
+ */
+public class OldPowerPointFormatException extends OldFileFormatException {
+       public OldPowerPointFormatException(String s) {
+               super(s);
+       }
+}
index fb669b38ead748710de7a5b14eafc2e0d6541d6e..1c7ad9f7ff28f1ceea92ae8edf004588b711f0cf 100644 (file)
@@ -26,6 +26,7 @@ import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.StringUtil;
 import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
 import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException;
+import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;
 
 
 /**
@@ -110,18 +111,31 @@ public class CurrentUserAtom
                // Decide how big it is
                DocumentEntry docProps =
                        (DocumentEntry)dir.getEntry("Current User");
+               
+               // If it's clearly junk, bail out
+               if(docProps.getSize() > 131072) {
+                       throw new CorruptPowerPointFileException("The Current User stream is implausably long. It's normally 28-200 bytes long, but was " + docProps.getSize() + " bytes");
+               }
+               
+               // Grab the contents
                _contents = new byte[docProps.getSize()];
+               InputStream in = dir.createDocumentInputStream("Current User");
+               in.read(_contents);
 
-               // Check it's big enough - if it's not at least 28 bytes long, then
-               //  the record is corrupt
+               // See how long it is. If it's under 28 bytes long, we can't
+               //  read it
                if(_contents.length < 28) {
+                       if(_contents.length >= 4) {
+                               // PPT95 has 4 byte size, then data
+                               int size = LittleEndian.getInt(_contents);
+                               System.err.println(size);
+                               if(size + 4 == _contents.length) {
+                                       throw new OldPowerPointFormatException("Based on the Current User stream, you seem to have supplied a PowerPoint95 file, which isn't supported");
+                               }
+                       }
                        throw new CorruptPowerPointFileException("The Current User stream must be at least 28 bytes long, but was only " + _contents.length);
                }
 
-               // Grab the contents
-               InputStream in = dir.createDocumentInputStream("Current User");
-               in.read(_contents);
-
                // Set everything up
                init();
        }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/PPT95.ppt b/src/scratchpad/testcases/org/apache/poi/hslf/data/PPT95.ppt
new file mode 100644 (file)
index 0000000..3f338d4
Binary files /dev/null and b/src/scratchpad/testcases/org/apache/poi/hslf/data/PPT95.ppt differ
index be22db0d54e8a62ba88630976e66182c596bc733..1fe9ada7fc328bc9134f09f9978c1b2039100361 100644 (file)
@@ -43,6 +43,8 @@ public class TestSheet extends TestCase{
         File[] files = home.listFiles();\r
         for (int i = 0; i < files.length; i++) {\r
             if(!files[i].getName().endsWith(".ppt")) continue;\r
+            if(files[i].getName().endsWith("PPT95.ppt")) continue;\r
+            \r
             try {\r
                 FileInputStream is = new FileInputStream(files[i]);\r
                 HSLFSlideShow hslf = new HSLFSlideShow(is);\r
index 6947ff9cfd7a30d666662e26d93c4111c73c4fd8..820a5390a5760f9d37229392d06eefd179d48795 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.poi.hslf.usermodel;
 \r
 import junit.framework.TestCase;\r
 import org.apache.poi.hslf.HSLFSlideShow;\r
+import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;\r
 import org.apache.poi.hslf.model.*;\r
 import org.apache.poi.hslf.model.Shape;\r
 \r
@@ -380,4 +381,23 @@ public class TestBugs extends TestCase {
         assertEquals(1, run.length);\r
         assertEquals("Fundera, planera och involvera.", run[0].getText());\r
     }\r
+    \r
+    /**\r
+     * PowerPoint 95 files should throw a more helpful exception\r
+     * @throws Exception\r
+     */\r
+    public void test41711() throws Exception {\r
+       // New file is fine\r
+        FileInputStream is = new FileInputStream(new File(cwd, "SampleShow.ppt"));\r
+        SlideShow ppt = new SlideShow(is);\r
+        \r
+        // PowerPoint 95 gives an old format exception\r
+        is = new FileInputStream(new File(cwd, "PPT95.ppt"));\r
+        try {\r
+               new SlideShow(is);\r
+               fail("OldPowerPointFormatException should've been thrown");\r
+        } catch(OldPowerPointFormatException e) {\r
+               // Good\r
+        }\r
+    }\r
 }\r