Developer helper program to try to help match Slide IDs between SlidePersistAtoms and Slides
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@389234 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b07df66836
commit
f2acaed7d3
164
src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java
Normal file
164
src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java
Normal file
@ -0,0 +1,164 @@
|
||||
|
||||
/* ====================================================================
|
||||
Copyright 2002-2004 Apache Software Foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
==================================================================== */
|
||||
|
||||
|
||||
|
||||
package org.apache.poi.hslf.dev;
|
||||
|
||||
import org.apache.poi.hslf.*;
|
||||
import org.apache.poi.hslf.record.*;
|
||||
import org.apache.poi.hslf.usermodel.SlideShow;
|
||||
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Hashtable;
|
||||
|
||||
/**
|
||||
* Gets all the different things that have Slide IDs (of sorts)
|
||||
* in them, and displays them, so you can try to guess what they
|
||||
* all mean
|
||||
*/
|
||||
public class SlideIdListing {
|
||||
private static byte[] fileContents;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if(args.length < 1) {
|
||||
System.err.println("Need to give a filename");
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
|
||||
// Create the slideshow object, for normal working with
|
||||
HSLFSlideShow hss = new HSLFSlideShow(args[0]);
|
||||
SlideShow ss = new SlideShow(hss);
|
||||
|
||||
// Grab the base contents
|
||||
fileContents = hss.getUnderlyingBytes();
|
||||
Record[] records = hss.getRecords();
|
||||
Record[] latestRecords = ss.getMostRecentCoreRecords();
|
||||
|
||||
// Grab any records that interest us
|
||||
Document document = null;
|
||||
for(int i=0; i<latestRecords.length; i++) {
|
||||
if(latestRecords[i] instanceof Document) {
|
||||
document = (Document)latestRecords[i];
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("");
|
||||
|
||||
|
||||
// Look for SlidePersistAtoms, and report what they have to
|
||||
// say about possible slide IDs
|
||||
SlideListWithText[] slwts = document.getSlideListWithTexts();
|
||||
for(int i=0; i<slwts.length; i++) {
|
||||
Record[] cr = slwts[i].getChildRecords();
|
||||
for(int j=0; j<cr.length; j++) {
|
||||
if(cr[j] instanceof SlidePersistAtom) {
|
||||
SlidePersistAtom spa = (SlidePersistAtom)cr[j];
|
||||
System.out.println("SlidePersistAtom knows about slide:");
|
||||
System.out.println("\t" + spa.getRefID());
|
||||
System.out.println("\t" + spa.getSlideIdentifier());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("");
|
||||
|
||||
// Look for latest core records that are slides or notes
|
||||
for(int i=0; i<latestRecords.length; i++) {
|
||||
if(latestRecords[i] instanceof Slide) {
|
||||
Slide s = (Slide)latestRecords[i];
|
||||
SlideAtom sa = s.getSlideAtom();
|
||||
System.out.println("Found the latest version of a slide record:");
|
||||
System.out.println("\tCore ID is " + s.getSheetId());
|
||||
System.out.println("\t(Core Records count is " + i + ")");
|
||||
System.out.println("\tDisk Position is " + s.getLastOnDiskOffset());
|
||||
System.out.println("\tMaster ID is " + sa.getMasterID());
|
||||
System.out.println("\tNotes ID is " + sa.getNotesID());
|
||||
}
|
||||
}
|
||||
System.out.println("");
|
||||
for(int i=0; i<latestRecords.length; i++) {
|
||||
if(latestRecords[i] instanceof Notes) {
|
||||
Notes n = (Notes)latestRecords[i];
|
||||
NotesAtom na = n.getNotesAtom();
|
||||
System.out.println("Found the latest version of a notes record:");
|
||||
System.out.println("\tCore ID is " + n.getSheetId());
|
||||
System.out.println("\t(Core Records count is " + i + ")");
|
||||
System.out.println("\tDisk Position is " + n.getLastOnDiskOffset());
|
||||
System.out.println("\tMatching slide is " + na.getSlideID());
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("");
|
||||
|
||||
// Find any persist ones first
|
||||
int pos = 0;
|
||||
for(int i=0; i<records.length; i++) {
|
||||
Record r = records[i];
|
||||
|
||||
if(r.getRecordType() == 6001l) {
|
||||
// PersistPtrFullBlock
|
||||
System.out.println("Found PersistPtrFullBlock at " + pos + " (" + Integer.toHexString(pos) + ")");
|
||||
}
|
||||
if(r.getRecordType() == 6002l) {
|
||||
// PersistPtrIncrementalBlock
|
||||
System.out.println("Found PersistPtrIncrementalBlock at " + pos + " (" + Integer.toHexString(pos) + ")");
|
||||
PersistPtrHolder pph = (PersistPtrHolder)r;
|
||||
|
||||
// Check the sheet offsets
|
||||
int[] sheetIDs = pph.getKnownSlideIDs();
|
||||
Hashtable sheetOffsets = pph.getSlideLocationsLookup();
|
||||
for(int j=0; j<sheetIDs.length; j++) {
|
||||
Integer id = new Integer(sheetIDs[j]);
|
||||
Integer offset = (Integer)sheetOffsets.get(id);
|
||||
|
||||
System.out.println(" Knows about sheet " + id);
|
||||
System.out.println(" That sheet lives at " + offset);
|
||||
|
||||
Record atPos = findRecordAtPos(offset.intValue());
|
||||
System.out.println(" The record at that pos is of type " + atPos.getRecordType());
|
||||
System.out.println(" The record at that pos has class " + atPos.getClass().getName());
|
||||
|
||||
if(! (atPos instanceof PositionDependentRecord)) {
|
||||
System.out.println(" ** The record class isn't position aware! **");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Increase the position by the on disk size
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
r.writeOut(baos);
|
||||
pos += baos.size();
|
||||
}
|
||||
|
||||
System.out.println("");
|
||||
}
|
||||
|
||||
|
||||
// Finds the record at a given position
|
||||
public static Record findRecordAtPos(int pos) {
|
||||
long type = LittleEndian.getUShort(fileContents, pos+2);
|
||||
long rlen = LittleEndian.getUInt(fileContents, pos+4);
|
||||
|
||||
Record r = Record.createRecordForType(type,fileContents,pos,(int)rlen+8);
|
||||
|
||||
return r;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user