]> source.dussan.org Git - poi.git/commitdiff
Some PersistPtrHolders seem to reference records stored after them. Add a second...
authorNick Burch <nick@apache.org>
Tue, 13 Jun 2006 14:54:52 +0000 (14:54 +0000)
committerNick Burch <nick@apache.org>
Tue, 13 Jun 2006 14:54:52 +0000 (14:54 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@413911 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java

index 966ebe7fd45fb872ae4830f93b031dcd50cfb9fa..ddf9c7520e1c33281a1c21e70ed6c39cbce77976 100644 (file)
@@ -248,25 +248,42 @@ public class HSLFSlideShow extends POIDocument
        // As we go along, update, and hand over, to any Position Dependent
        //  records we happen across
        Hashtable oldToNewPositions = new Hashtable();
-
-       // Write ourselves out
+       
+       // First pass - figure out where all the position dependent
+       //   records are going to end up, in the new scheme
+       // (Annoyingly, some powerpoing files have PersistPtrHolders
+       //  that reference slides after the PersistPtrHolder)
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        for(int i=0; i<_records.length; i++) {
-               // For now, we're only handling PositionDependentRecord's that
-               //  happen at the top level.
-               // In future, we'll need the handle them everywhere, but that's
-               //  a bit trickier
                if(_records[i] instanceof PositionDependentRecord) {
                        PositionDependentRecord pdr = (PositionDependentRecord)_records[i];
                        int oldPos = pdr.getLastOnDiskOffset();
                        int newPos = baos.size();
                        pdr.setLastOnDiskOffset(newPos);
-                       //System.out.println(i + "  " + oldPos + " " + newPos);
                        oldToNewPositions.put(new Integer(oldPos),new Integer(newPos));
+                       //System.out.println(oldPos + " -> " + newPos);
+               }
+               
+               // Dummy write out, so the position winds on properly
+               _records[i].writeOut(baos);
+       }
+
+       // No go back through, actually writing ourselves out
+       baos.reset();
+       for(int i=0; i<_records.length; i++) {
+               // For now, we're only handling PositionDependentRecord's that
+               //  happen at the top level.
+               // In future, we'll need the handle them everywhere, but that's
+               //  a bit trickier
+               if(_records[i] instanceof PositionDependentRecord) {
+                       // We've already figured out their new location, and
+                       //  told them that
+                       // Tell them of the positions of the other records though
+                       PositionDependentRecord pdr = (PositionDependentRecord)_records[i];
                        pdr.updateOtherRecordReferences(oldToNewPositions);
                }
 
-               // Finally, write out
+               // Whatever happens, write out that record tree
                _records[i].writeOut(baos);
        }
        // Update our cached copy of the bytes that make up the PPT stream
index bdf6251c2988648183fb0a5e3fad02fac2aab280..418e4ed53916dd1e35fc2a49dbd18af28e1e7fe6 100644 (file)
@@ -192,7 +192,9 @@ public class PersistPtrHolder extends PositionDependentRecordAtom
                        Integer newPos = (Integer)oldToNewReferencesLookup.get(oldPos);
 
                        if(newPos == null) {
-                               throw new RuntimeException("Couldn't find the new location of the \"slide\" that used to be at " + oldPos);
+                               System.err.println("Couldn't find the new location of the \"slide\" with id " + id + " that used to be at " + oldPos);
+                               System.err.println("Not updating the position of it, you probably won't be able to find it any more (if you ever could!)");
+                               newPos = oldPos;
                        }
 
                        // Write out the new location