mirror of https://github.com/apache/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
This commit is contained in:
parent
db05dbdbba
commit
aba3abf1b6
|
@ -248,25 +248,42 @@ public class HSLFSlideShow extends POIDocument
|
||||||
// As we go along, update, and hand over, to any Position Dependent
|
// As we go along, update, and hand over, to any Position Dependent
|
||||||
// records we happen across
|
// records we happen across
|
||||||
Hashtable oldToNewPositions = new Hashtable();
|
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();
|
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(int i=0; i<_records.length; i++) {
|
||||||
// For now, we're only handling PositionDependentRecord's that
|
// For now, we're only handling PositionDependentRecord's that
|
||||||
// happen at the top level.
|
// happen at the top level.
|
||||||
// In future, we'll need the handle them everywhere, but that's
|
// In future, we'll need the handle them everywhere, but that's
|
||||||
// a bit trickier
|
// a bit trickier
|
||||||
if(_records[i] instanceof PositionDependentRecord) {
|
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];
|
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);
|
pdr.updateOtherRecordReferences(oldToNewPositions);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally, write out
|
// Whatever happens, write out that record tree
|
||||||
_records[i].writeOut(baos);
|
_records[i].writeOut(baos);
|
||||||
}
|
}
|
||||||
// Update our cached copy of the bytes that make up the PPT stream
|
// Update our cached copy of the bytes that make up the PPT stream
|
||||||
|
|
|
@ -192,7 +192,9 @@ public class PersistPtrHolder extends PositionDependentRecordAtom
|
||||||
Integer newPos = (Integer)oldToNewReferencesLookup.get(oldPos);
|
Integer newPos = (Integer)oldToNewReferencesLookup.get(oldPos);
|
||||||
|
|
||||||
if(newPos == null) {
|
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
|
// Write out the new location
|
||||||
|
|
Loading…
Reference in New Issue