001: /* ====================================================================
002: Licensed to the Apache Software Foundation (ASF) under one or more
003: contributor license agreements. See the NOTICE file distributed with
004: this work for additional information regarding copyright ownership.
005: The ASF licenses this file to You under the Apache License, Version 2.0
006: (the "License"); you may not use this file except in compliance with
007: the License. You may obtain a copy of the License at
008:
009: http://www.apache.org/licenses/LICENSE-2.0
010:
011: Unless required by applicable law or agreed to in writing, software
012: distributed under the License is distributed on an "AS IS" BASIS,
013: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: See the License for the specific language governing permissions and
015: limitations under the License.
016: ==================================================================== */
017:
018: package org.apache.poi.hslf.dev;
019:
020: import org.apache.poi.hslf.*;
021: import org.apache.poi.hslf.record.*;
022:
023: import org.apache.poi.poifs.filesystem.POIFSFileSystem;
024: import org.apache.poi.poifs.filesystem.POIFSDocument;
025: import org.apache.poi.poifs.filesystem.DocumentEntry;
026: import org.apache.poi.poifs.filesystem.DocumentInputStream;
027: import org.apache.poi.util.LittleEndian;
028:
029: import java.io.*;
030: import java.util.Hashtable;
031:
032: /**
033: * Uses record level code to locate UserEditAtom records, and other
034: * persistence related atoms. Tries to match them together, to help
035: * illuminate quite what all the offsets mean
036: */
037: public class UserEditAndPersistListing {
038: private static byte[] fileContents;
039:
040: public static void main(String[] args) throws Exception {
041: if (args.length < 1) {
042: System.err.println("Need to give a filename");
043: System.exit(1);
044: }
045:
046: // Create the slideshow object, for normal working with
047: HSLFSlideShow ss = new HSLFSlideShow(args[0]);
048: fileContents = ss.getUnderlyingBytes();
049: System.out.println("");
050:
051: // Find any persist ones first
052: Record[] records = ss.getRecords();
053: int pos = 0;
054: for (int i = 0; i < records.length; i++) {
055: Record r = records[i];
056:
057: if (r.getRecordType() == 6001l) {
058: // PersistPtrFullBlock
059: System.out.println("Found PersistPtrFullBlock at "
060: + pos + " (" + Integer.toHexString(pos) + ")");
061: }
062: if (r.getRecordType() == 6002l) {
063: // PersistPtrIncrementalBlock
064: System.out
065: .println("Found PersistPtrIncrementalBlock at "
066: + pos + " (" + Integer.toHexString(pos)
067: + ")");
068: PersistPtrHolder pph = (PersistPtrHolder) r;
069:
070: // Check the sheet offsets
071: int[] sheetIDs = pph.getKnownSlideIDs();
072: Hashtable sheetOffsets = pph.getSlideLocationsLookup();
073: for (int j = 0; j < sheetIDs.length; j++) {
074: Integer id = new Integer(sheetIDs[j]);
075: Integer offset = (Integer) sheetOffsets.get(id);
076:
077: System.out.println(" Knows about sheet " + id);
078: System.out.println(" That sheet lives at "
079: + offset);
080:
081: Record atPos = findRecordAtPos(offset.intValue());
082: System.out
083: .println(" The record at that pos is of type "
084: + atPos.getRecordType());
085: System.out
086: .println(" The record at that pos has class "
087: + atPos.getClass().getName());
088:
089: if (!(atPos instanceof PositionDependentRecord)) {
090: System.out
091: .println(" ** The record class isn't position aware! **");
092: }
093: }
094: }
095:
096: // Increase the position by the on disk size
097: ByteArrayOutputStream baos = new ByteArrayOutputStream();
098: r.writeOut(baos);
099: pos += baos.size();
100: }
101:
102: System.out.println("");
103:
104: pos = 0;
105: // Now look for UserEditAtoms
106: for (int i = 0; i < records.length; i++) {
107: Record r = records[i];
108:
109: if (r instanceof UserEditAtom) {
110: UserEditAtom uea = (UserEditAtom) r;
111: System.out.println("Found UserEditAtom at " + pos
112: + " (" + Integer.toHexString(pos) + ")");
113: System.out.println(" lastUserEditAtomOffset = "
114: + uea.getLastUserEditAtomOffset());
115: System.out.println(" persistPointersOffset = "
116: + uea.getPersistPointersOffset());
117: System.out.println(" docPersistRef = "
118: + uea.getDocPersistRef());
119: System.out.println(" maxPersistWritten = "
120: + uea.getMaxPersistWritten());
121: }
122:
123: // Increase the position by the on disk size
124: ByteArrayOutputStream baos = new ByteArrayOutputStream();
125: r.writeOut(baos);
126: pos += baos.size();
127: }
128:
129: System.out.println("");
130:
131: // Query the CurrentUserAtom
132: CurrentUserAtom cua = ss.getCurrentUserAtom();
133: System.out.println("Checking Current User Atom");
134: System.out.println(" Thinks the CurrentEditOffset is "
135: + cua.getCurrentEditOffset());
136:
137: System.out.println("");
138: }
139:
140: // Finds the record at a given position
141: public static Record findRecordAtPos(int pos) {
142: long type = LittleEndian.getUShort(fileContents, pos + 2);
143: long rlen = LittleEndian.getUInt(fileContents, pos + 4);
144:
145: Record r = Record.createRecordForType(type, fileContents, pos,
146: (int) rlen + 8);
147:
148: return r;
149: }
150: }
|