Improved handling of byte level position sensitive records

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353711 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2005-06-09 15:13:20 +00:00
parent db67860378
commit 093ffa8bd4
2 changed files with 44 additions and 1 deletions

View File

@ -47,7 +47,7 @@ public class SlideShowRecordDumper
public static void main(String args[]) throws IOException
{
if(args.length == 0) {
System.err.println("Useage: SlideShowDumper <filename>");
System.err.println("Useage: SlideShowRecordDumper <filename>");
return;
}

View File

@ -22,7 +22,14 @@ package org.apache.poi.hslf.dev;
import org.apache.poi.hslf.*;
import org.apache.poi.hslf.record.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.poifs.filesystem.POIFSDocument;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.DocumentInputStream;
import org.apache.poi.util.LittleEndian;
import java.io.*;
import java.util.Hashtable;
/**
* Uses record level code to locate UserEditAtom records, and other
@ -30,13 +37,18 @@ import java.io.*;
* illuminate quite what all the offsets mean
*/
public class UserEditAndPersistListing {
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 ss = new HSLFSlideShow(args[0]);
fileContents = ss.getUnderlyingBytes();
System.out.println("");
// Find any persist ones first
@ -52,6 +64,26 @@ public class UserEditAndPersistListing {
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
@ -92,4 +124,15 @@ public class UserEditAndPersistListing {
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;
}
}