]> source.dussan.org Git - poi.git/commitdiff
Try to work with files that don't have a master SlideListWithText, but go straight...
authorNick Burch <nick@apache.org>
Thu, 14 Dec 2006 11:50:54 +0000 (11:50 +0000)
committerNick Burch <nick@apache.org>
Thu, 14 Dec 2006 11:50:54 +0000 (11:50 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@487182 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java

index 0e91cc7ebf74ac2352e3390b1cf8210654f13032..6068d7f65d14df989ba7829cb481489d416434a9 100644 (file)
@@ -304,23 +304,59 @@ public class SlideShow
        //  we have to go and find their matching records
        // We always use the latest versions of these records, and use the
        //  SlideAtom/NotesAtom to match them with the StyleAtomSet 
+       //
+       // Some crazy documents don't have a master SlideListWithText, their
+       //  first one is the slide containing one, which makes things fun...
 
        SlideListWithText masterSLWT = _documentRecord.getMasterSlideListWithText();
        SlideListWithText slidesSLWT = _documentRecord.getSlideSlideListWithText();
        SlideListWithText notesSLWT  = _documentRecord.getNotesSlideListWithText();
        
-    //find master slides
+    // Find master slides
+       // Need to ensure they're really master slides, and we're not dealing
+       //  with a crazy document that doesn't have any master slides
     SlideAtomsSet[] masterSets = new SlideAtomsSet[0];
     org.apache.poi.hslf.record.MainMaster[] masterRecords = null;
     if (masterSLWT != null){
-
         masterSets = masterSLWT.getSlideAtomsSets();
-        masterRecords = new org.apache.poi.hslf.record.MainMaster[masterSets.length];
-        for(int i=0; i<masterRecords.length; i++) {
-            masterRecords[i] = (org.apache.poi.hslf.record.MainMaster)getCoreRecordForSAS(masterSets[i]);
-        }
+
+               // Are they Slides, Master Slides, or some broken mix?
+               int slideCount = 0;
+               int masterCount = 0;
+               for(int i=0; i<masterSets.length; i++) {
+                       Record r = getCoreRecordForSAS(masterSets[i]);
+                       if(r instanceof org.apache.poi.hslf.record.Slide) {
+                               slideCount++;
+                       } else if(r instanceof org.apache.poi.hslf.record.MainMaster) {
+                               masterCount++;
+                       } else {
+                               throw new CorruptPowerPointFileException("The PowerPoint file had a broken first SlideListWithTexts. This should only contain either MainMasters, or Slides, but it contained a record of type " + r.getRecordType());
+                       }
+               }
+
+               if(slideCount > 0 && masterCount == 0) {
+                       // Actually the Slide SlideListWithTexts
+                       notesSLWT = slidesSLWT;
+                       slidesSLWT = masterSLWT;
+                       masterSLWT = null;
+               } else if(masterCount >= 0 && slideCount == 0) {
+                       // Is a normal, proper Masters SlideListWithTexts
+                       masterRecords = new org.apache.poi.hslf.record.MainMaster[masterSets.length];
+
+                       // Grab the Main Master records
+                       for(int i=0; i<masterRecords.length; i++) {
+                               masterRecords[i] = (org.apache.poi.hslf.record.MainMaster)getCoreRecordForSAS(masterSets[i]);
+                       }
+               } else {
+                       // Contains both Slides and Main Masters, is corrupt
+                               throw new CorruptPowerPointFileException("The PowerPoint file had a broken first SlideListWithTexts. This should only contain either MainMasters, or Slides, but it contained a mix of both (" + slideCount + " slides and " + masterCount + " masters)");
+               }
     }
 
+
+       // Having sorted out the masters, that leaves the notes and slides
+
+
        // Start by finding the notes records to go with the entries in
        //  notesSLWT
        org.apache.poi.hslf.record.Notes[] notesRecords;