]> source.dussan.org Git - poi.git/commitdiff
Bug 55732 - PPT can't open, fails with "Couldn't instantiate .... StyleTextProp9Atom...
authorAndreas Beeker <kiwiwings@apache.org>
Wed, 19 Feb 2014 23:45:07 +0000 (23:45 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Wed, 19 Feb 2014 23:45:07 +0000 (23:45 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1569984 13f79535-47bb-0310-9956-ffa450edef68

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

index 17c9107e436c615e9768c0fe8d4cbc34aa92be7a..9f8aec7f487e7ea12c51feb6093aa7d63f46e528 100644 (file)
@@ -27,11 +27,9 @@ import org.apache.poi.util.LittleEndian;
 
 /**
  * The atom record that specifies additional text formatting.
- *
- * @author Alex Nikiforov [mailto:anikif@gmail.com]
  */
 public final class StyleTextProp9Atom extends RecordAtom {
-       private final TextPFException9[] autoNumberSchemes;
+    private final TextPFException9[] autoNumberSchemes;
     /** Record header. */
     private byte[] header;
     /** Record data. */
@@ -50,7 +48,7 @@ public final class StyleTextProp9Atom extends RecordAtom {
      */
     protected StyleTextProp9Atom(byte[] source, int start, int len) {
         // Get the header.
-       final List<TextPFException9> schemes = new LinkedList<TextPFException9>();
+        final List<TextPFException9> schemes = new LinkedList<TextPFException9>();
         header = new byte[8];
         System.arraycopy(source,start, header,0,8);
         this.version  = LittleEndian.getShort(header, 0);
@@ -61,42 +59,51 @@ public final class StyleTextProp9Atom extends RecordAtom {
         data = new byte[len-8];
         System.arraycopy(source, start+8, data, 0, len-8);
         for (int i = 0; i < data.length; ) {
-               final TextPFException9 item = new TextPFException9(data, i);
-               schemes.add(item);
-               i += item.getRecordLength();
-               //int textCfException9 = LittleEndian.getInt(data, i );
-               //TODO analyze textCfException when have some test data
-               i += 4;
-               int textSiException = LittleEndian.getInt(data, i );
-               i +=  + 4;//TextCFException9 + SIException
-               if (0 != (textSiException & 0x40)) { 
-                       i += 2; //skip fBidi 
-               }
-               if (i >= data.length) {
-                       break;
-               }
+            final TextPFException9 item = new TextPFException9(data, i);
+            schemes.add(item);
+            i += item.getRecordLength();
+            
+            if (i >= data.length) {
+                break;
+            }
+            int textCfException9 = LittleEndian.getInt(data, i );
+            i += 4;
+            //TODO analyze textCfException when have some test data
+            
+            if (i >= data.length) {
+                break;
+            }
+            int textSiException = LittleEndian.getInt(data, i );
+            i += 4;//TextCFException9 + SIException
+            
+            if (0 != (textSiException & 0x40)) { 
+                i += 2; //skip fBidi 
+            }
+            if (i >= data.length) {
+                break;
+            }
         }
         this.autoNumberSchemes = (TextPFException9[]) schemes.toArray(new TextPFException9[schemes.size()]);
     }
 
-       /**
+    /**
      * Gets the record type.
      * @return the record type.
      */
     public long getRecordType() { return this.recordId; }
 
     public short getVersion() {
-               return version;
-       }
+        return version;
+    }
 
-       public int getLength() {
-               return length;
-       }
-       public TextPFException9[] getAutoNumberTypes() {
-               return this.autoNumberSchemes;
-       }
+    public int getLength() {
+        return length;
+    }
+    public TextPFException9[] getAutoNumberTypes() {
+        return this.autoNumberSchemes;
+    }
 
-       /**
+    /**
      * Write the contents of the record back, so it can be written
      * to disk
      *
@@ -133,4 +140,4 @@ public final class StyleTextProp9Atom extends RecordAtom {
         // Update the size (header bytes 5-8)
         LittleEndian.putInt(header, 4, data.length);
     }
-}
+}
\ No newline at end of file
index b5683a1eab0dd458b88701a41a7fd3a352b6f23f..50b21a007d003430cd914e3fb55795716b128e5e 100644 (file)
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.File;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Date;
@@ -38,6 +39,7 @@ import org.apache.poi.hslf.HSLFTestDataSamples;
 import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;
 import org.apache.poi.hslf.model.Background;
 import org.apache.poi.hslf.model.Fill;
+import org.apache.poi.hslf.model.HeadersFooters;
 import org.apache.poi.hslf.model.MasterSheet;
 import org.apache.poi.hslf.model.Notes;
 import org.apache.poi.hslf.model.Picture;
@@ -484,4 +486,20 @@ public final class TestBugs {
         }
     }
 
+    @Test
+    public void bug55732() throws Exception {
+        File file = _slTests.getFile("bug55732.ppt");
+        
+        HSLFSlideShow ss = new HSLFSlideShow(file.getAbsolutePath());
+        SlideShow _show = new SlideShow(ss);
+        Slide[] _slides = _show.getSlides();
+
+        /* Iterate over slides and extract text */
+        for( Slide slide : _slides ) {
+            HeadersFooters hf = slide.getHeadersFooters();
+            boolean visible = hf.isHeaderVisible(); // exception happens here
+        }
+        assertTrue("No Exceptions while reading headers", true);
+    }
+    
 }
diff --git a/test-data/slideshow/bug55732.ppt b/test-data/slideshow/bug55732.ppt
new file mode 100644 (file)
index 0000000..c0f84ac
Binary files /dev/null and b/test-data/slideshow/bug55732.ppt differ