]> source.dussan.org Git - poi.git/commitdiff
Developer helper program to try to help match Slide IDs between SlidePersistAtoms...
authorNick Burch <nick@apache.org>
Mon, 27 Mar 2006 19:42:13 +0000 (19:42 +0000)
committerNick Burch <nick@apache.org>
Mon, 27 Mar 2006 19:42:13 +0000 (19:42 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@389234 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java [new file with mode: 0644]

diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java
new file mode 100644 (file)
index 0000000..0412f32
--- /dev/null
@@ -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;
+       }
+}