]> source.dussan.org Git - poi.git/commitdiff
Improved handling of byte level position sensitive records
authorNick Burch <nick@apache.org>
Thu, 9 Jun 2005 15:13:20 +0000 (15:13 +0000)
committerNick Burch <nick@apache.org>
Thu, 9 Jun 2005 15:13:20 +0000 (15:13 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353711 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java
src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java

index 8902823373e2ccd41f9cb5aacee1cc0b2159d881..ce83000d99a470ad65cd9bbc1c47f0bd82917ffe 100644 (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;
        }
 
index 5fff3fa03b0b19133683fc383618c1903131fe98..72b26de5203130f3c4e87bbde3a600b84dee9f1b 100644 (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;
+       }
 }