]> source.dussan.org Git - poi.git/commitdiff
Bug 56240 - Handle PP97_DUALSTORAGE streams
authorAndreas Beeker <kiwiwings@apache.org>
Tue, 30 Dec 2014 02:20:57 +0000 (02:20 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Tue, 30 Dec 2014 02:20:57 +0000 (02:20 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1648466 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
test-data/slideshow/bug56240.ppt [new file with mode: 0644]

index 3c63317c62fc4e7966f50cc34a5038383353f18d..55c3f6f876f5d06f822bfadc4e62daa4dc9b9063 100644 (file)
@@ -173,9 +173,8 @@ public final class HSLFSlideShow extends POIDocument {
         * @param dir the POIFS directory to read from
         * @throws IOException if there is a problem while parsing the document.
         */
-       public HSLFSlideShow(DirectoryNode dir) throws IOException
-       {
-               super(dir);
+       public HSLFSlideShow(DirectoryNode dir) throws IOException {
+               super(handleDualStorage(dir));
 
                // First up, grab the "Current User" stream
                // We need this before we can detect Encrypted Documents
@@ -192,7 +191,13 @@ public final class HSLFSlideShow extends POIDocument {
                readOtherStreams();
        }
        
-       
+       private static DirectoryNode handleDualStorage(DirectoryNode dir) throws IOException {
+           // when there's a dual storage entry, use it, as the outer document can't be read quite probably ...
+           String dualName = "PP97_DUALSTORAGE";
+           if (!dir.hasEntry(dualName)) return dir;
+           dir = (DirectoryNode)dir.getEntry(dualName);
+           return dir;
+       }
        
        /**
         * Constructs a new, empty, Powerpoint document.
index 6e7663d269737251980e8b6dd40ea5c653f56828..d3a759c9bf9e5721c8d466c6efbecf1d4fb8da9c 100644 (file)
@@ -610,4 +610,19 @@ public final class TestBugs {
             inputStream.close();
         }
     }
+    
+    @Test
+    public void bug56240() throws Exception {
+        InputStream inputStream = new FileInputStream(_slTests.getFile("bug56240.ppt"));
+        try {
+            SlideShow slideShow = new SlideShow(inputStream);
+            int slideCnt = slideShow.getSlides().length;
+            assertEquals(105, slideCnt);
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            slideShow.write(bos);
+            bos.close();
+        } finally {
+            inputStream.close();
+        }
+    }
 }
diff --git a/test-data/slideshow/bug56240.ppt b/test-data/slideshow/bug56240.ppt
new file mode 100644 (file)
index 0000000..908f2cc
Binary files /dev/null and b/test-data/slideshow/bug56240.ppt differ