From: Nick Burch Date: Tue, 13 Jun 2006 14:54:52 +0000 (+0000) Subject: Some PersistPtrHolders seem to reference records stored after them. Add a second... X-Git-Tag: REL_3_0_ALPHA3~95 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=aba3abf1b6dd181a2a644cd2f6f3cd56cd8bfff4;p=poi.git Some PersistPtrHolders seem to reference records stored after them. Add a second pass to cope with these cases git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@413911 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java index 966ebe7fd4..ddf9c7520e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java @@ -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 diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java b/src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java index bdf6251c29..418e4ed539 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/PersistPtrHolder.java @@ -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