Author: nick
Date: Thu Dec 14 03:49:56 2006
New Revision: 487181

URL: http://svn.apache.org/viewvc?view=rev&rev=487181
Log:
If we have a picture of type 0, don't even bother trying to create a 
PictureData object for it

Added:
    
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/PictureTypeZero.ppt
   (with props)
Modified:
    jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
    
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java

Modified: 
jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java?view=diff&rev=487181&r1=487180&r2=487181
==============================================================================
--- jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java 
(original)
+++ jakarta/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java 
Thu Dec 14 03:49:56 2006
@@ -255,30 +255,36 @@
         List p = new ArrayList();
         int pos = 0;
 
-        while (pos < pictstream.length) {
+               // An empty picture record (length 0) will take up 8 bytes
+        while (pos <= (pictstream.length-8)) {
             int offset = pos;
 
-            //image signature
+            // Image signature
             int signature = LittleEndian.getUShort(pictstream, pos);
             pos += LittleEndian.SHORT_SIZE;
-            //image type + 0xF018
+            // Image type + 0xF018
             int type = LittleEndian.getUShort(pictstream, pos);
             pos += LittleEndian.SHORT_SIZE;
-            //image size
+            // Image size (excluding the 8 byte header)
             int imgsize = LittleEndian.getInt(pictstream, pos);
             pos += LittleEndian.INT_SIZE;
-
             byte[] imgdata = new byte[imgsize];
             System.arraycopy(pictstream, pos, imgdata, 0, imgdata.length);
 
-            try {
-               PictureData pict = PictureData.create(type - 0xF018);
-               pict.setRawData(imgdata);
-               pict.setOffset(offset);
-               p.add(pict);
-            } catch(IllegalArgumentException e) {
-               System.err.println("Problem reading picture: " + e + "\nYou 
document will probably become corrupted if you save it!");
-            }
+                       // If they type (including the bonus 0xF018) is 0, skip 
it
+                       if(type == 0) {
+                               System.err.println("Problem reading picture: 
Invalid image type 0, on picture with length" + imgsize + ".\nYou document will 
probably become corrupted if you save it!");
+                       } else {
+                               // Build the PictureData object from the data
+                               try {
+                                       PictureData pict = 
PictureData.create(type - 0xF018);
+                                       pict.setRawData(imgdata);
+                                       pict.setOffset(offset);
+                                       p.add(pict);
+                               } catch(IllegalArgumentException e) {
+                                       System.err.println("Problem reading 
picture: " + e + "\nYou document will probably become corrupted if you save 
it!");
+                               }
+                       }
             
             pos += imgsize;
         }

Added: 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/PictureTypeZero.ppt
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/PictureTypeZero.ppt?view=auto&rev=487181
==============================================================================
Binary file - no diff available.

Propchange: 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/data/PictureTypeZero.ppt
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
URL: 
http://svn.apache.org/viewvc/jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java?view=diff&rev=487181&r1=487180&r2=487181
==============================================================================
--- 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
 (original)
+++ 
jakarta/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
 Thu Dec 14 03:49:56 2006
@@ -373,5 +373,22 @@
 
     }
 
+       /**
+        * Test that on a party corrupt powerpoint document, which has 
+        *  crazy pictures of type 0, we do our best.
+        */
+       public void testZeroPictureType() throws Exception {
+               HSLFSlideShow hslf = new HSLFSlideShow(new File(cwd, 
"PictureTypeZero.ppt").getPath());
 
+               // Should still have 2 real pictures
+               assertEquals(2, hslf.getPictures().length);
+               // Both are real pictures, both WMF
+               assertEquals(Picture.WMF, hslf.getPictures()[0].getType());
+               assertEquals(Picture.WMF, hslf.getPictures()[1].getType());
+
+               // TODO: DISABLED: Pending bug #41176
+
+               // Now test what happens when we use the SlideShow interface
+               //SlideShow ppt = new SlideShow(hslf);
+       }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
Mailing List:    http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/

Reply via email to