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
This commit is contained in:
Nick Burch 2006-06-13 14:54:52 +00:00
parent f96f6cad16
commit 01f4fd56fe
2 changed files with 28 additions and 9 deletions

View 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++) {
if(_records[i] instanceof PositionDependentRecord) {
PositionDependentRecord pdr = (PositionDependentRecord)_records[i];
int oldPos = pdr.getLastOnDiskOffset();
int newPos = baos.size();
pdr.setLastOnDiskOffset(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];
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));
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

View 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