} else if (r instanceof UserEditAtom) { uea = (UserEditAtom)r; deaSlideId = uea.getEncryptSessionPersistIdRef(); uea.setEncryptSessionPersistIdRef(-1); } else if (r instanceof PersistPtrHolder) { ptr = (PersistPtrHolder)r; uea.setMaxPersistWritten(maxSlideId);
UserEditAtom usr = (UserEditAtom) Record.buildRecordAtOffset(docstream, usrOffset); lst.add(Integer.valueOf(usrOffset)); int psrOffset = usr.getPersistPointersOffset(); usrOffset = usr.getLastUserEditAtomOffset();
/** * Write the contents of the record back, so it can be written * to disk */ @Override public void writeOut(OutputStream out) throws IOException { // Header out.write(_header); // Write out the values writeLittleEndian(lastViewedSlideID,out); writeLittleEndian(pptVersion,out); writeLittleEndian(lastUserEditAtomOffset,out); writeLittleEndian(persistPointersOffset,out); writeLittleEndian(docPersistRef,out); writeLittleEndian(maxPersistWritten,out); writeLittleEndian(lastViewType,out); writeLittleEndian(unused,out); if (encryptSessionPersistIdRef != -1) { // optional field writeLittleEndian(encryptSessionPersistIdRef,out); } } }
private int addPersistentObject(PositionDependentRecord slideRecord) { slideRecord.setLastOnDiskOffset(HSLFSlideShowImpl.UNSET_OFFSET); _hslfSlideShow.appendRootLevelRecord((Record)slideRecord); // For position dependent records, hold where they were and now are // As we go along, update, and hand over, to any Position Dependent // records we happen across Map<RecordTypes,PositionDependentRecord> interestingRecords = new HashMap<>(); try { _hslfSlideShow.updateAndWriteDependantRecords(null,interestingRecords); } catch (IOException e) { throw new HSLFException(e); } PersistPtrHolder ptr = (PersistPtrHolder)interestingRecords.get(RecordTypes.PersistPtrIncrementalBlock); UserEditAtom usr = (UserEditAtom)interestingRecords.get(RecordTypes.UserEditAtom); // persist ID is UserEditAtom.maxPersistWritten + 1 int psrId = usr.getMaxPersistWritten() + 1; // Last view is now of the slide usr.setLastViewType((short) UserEditAtom.LAST_VIEW_SLIDE_VIEW); // increment the number of persistent objects usr.setMaxPersistWritten(psrId); // Add the new slide into the last PersistPtr // (Also need to tell it where it is) int slideOffset = slideRecord.getLastOnDiskOffset(); slideRecord.setLastOnDiskOffset(slideOffset); ptr.addSlideLookup(psrId, slideOffset); logger.log(POILogger.INFO, "New slide/object ended up at " + slideOffset); return psrId; }
UserEditAtom uea = (UserEditAtom)r; System.out.println("Found UserEditAtom at " + pos + " (" + Integer.toHexString(pos) + ")"); System.out.println(" lastUserEditAtomOffset = " + uea.getLastUserEditAtomOffset() ); System.out.println(" persistPointersOffset = " + uea.getPersistPointersOffset() ); System.out.println(" docPersistRef = " + uea.getDocPersistRef() ); System.out.println(" maxPersistWritten = " + uea.getMaxPersistWritten() );
UserEditAtom uea = ((UserEditAtom)records[ueaIdx]); dea.setLastOnDiskOffset(ptr.getLastOnDiskOffset()-1); int nextSlideId = uea.getMaxPersistWritten()+1; ptr.addSlideLookup(nextSlideId, ptr.getLastOnDiskOffset()-1); uea.setEncryptSessionPersistIdRef(nextSlideId); uea.setMaxPersistWritten(nextSlideId);
recordMap.put(usrOffset, usr); int psrOffset = usr.getPersistPointersOffset(); PersistPtrHolder ptr = (PersistPtrHolder) Record.buildRecordAtOffset(docstream, psrOffset); recordMap.put(psrOffset, ptr); usrOffset = usr.getLastUserEditAtomOffset(); if (ver_inst == 0 && type == 4085 && (len == 0x1C || len == 0x20)) { logger.log(POILogger.WARN, "Repairing invalid user edit atom"); usr.setLastUserEditAtomOffset(usrOffset); } else { throw new CorruptPowerPointFileException("Powerpoint document contains invalid user edit atom");
if (uea == null || pph == null || uea.getPersistPointersOffset() != pph.getLastOnDiskOffset()) { throw new EncryptedDocumentException("UserEditAtom and PersistPtrHolder must exist and their offset need to match."); recordMap.put(uea.getLastOnDiskOffset(), uea); uea.setLastUserEditAtomOffset(0); pph.clear(); for (Map.Entry<Integer,Integer> me : slideLocations.entrySet()) {
if (uea.getEncryptSessionPersistIdRef() != -1) { userEditAtomWithEncryption = uea; break; Record r = recordMap.get(userEditAtomWithEncryption.getPersistPointersOffset()); assert(r instanceof PersistPtrHolder); PersistPtrHolder ptr = (PersistPtrHolder)r; Integer encOffset = ptr.getSlideLocationsLookup().get(userEditAtomWithEncryption.getEncryptSessionPersistIdRef()); if (encOffset == null) {
uea.getPersistPointersOffset() ); if(! (r2 instanceof PersistPtrHolder)) { return null; }
if (newLastUserEditAtomPos == null || usr.getLastOnDiskOffset() != newLastUserEditAtomPos) { throw new HSLFException("Couldn't find the new location of the last UserEditAtom that used to be at " + oldLastUserEditAtomPos); currentUser.setCurrentEditOffset(usr.getLastOnDiskOffset());
int psrId = usr.getMaxPersistWritten() + 1; exOleObjStg.setPersistId(psrId); usr.setLastViewType((short) UserEditAtom.LAST_VIEW_SLIDE_VIEW); usr.setMaxPersistWritten(psrId); // increment the number of persit objects
UserEditAtom uea = (UserEditAtom)r; System.out.println("Found UserEditAtom at " + pos + " (" + Integer.toHexString(pos) + ")"); System.out.println(" lastUserEditAtomOffset = " + uea.getLastUserEditAtomOffset() ); System.out.println(" persistPointersOffset = " + uea.getPersistPointersOffset() ); System.out.println(" docPersistRef = " + uea.getDocPersistRef() ); System.out.println(" maxPersistWritten = " + uea.getMaxPersistWritten() );
int psrId = usr.getMaxPersistWritten() + 1; sp.setRefID(psrId); slideRecord.setSheetId(psrId); usr.setLastViewType((short) UserEditAtom.LAST_VIEW_SLIDE_VIEW); usr.setMaxPersistWritten(psrId); // increment the number of persit
/** * Write the contents of the record back, so it can be written * to disk */ public void writeOut(OutputStream out) throws IOException { // Header out.write(_header); // Write out the values writeLittleEndian(lastViewedSlideID,out); writeLittleEndian(pptVersion,out); writeLittleEndian(lastUserEditAtomOffset,out); writeLittleEndian(persistPointersOffset,out); writeLittleEndian(docPersistRef,out); writeLittleEndian(maxPersistWritten,out); writeLittleEndian(lastViewType,out); // Reserved fields out.write(reserved); } }