ASF Bugzilla – Attachment 22613 Details for
Bug 45844
[PATCH] Addtional diagnostics for SlideShowRecordDumper
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Additional options for SlideShowRecordDumper
diff.txt (text/plain), 14.28 KB, created by
Don Boulia
on 2008-09-19 08:04:10 UTC
(
hide
)
Description:
Additional options for SlideShowRecordDumper
Filename:
MIME Type:
Creator:
Don Boulia
Created:
2008-09-19 08:04:10 UTC
Size:
14.28 KB
patch
obsolete
>Index: src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java >=================================================================== >--- src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java (revision 697080) >+++ src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java (working copy) >@@ -35,6 +35,8 @@ > private short reservedField; > private LinkedList textPropList; > private int maskSpecial = 0; >+ >+ public int getSpecialMask() { return maskSpecial; } > > /** Fetch the number of characters this styling applies to */ > public int getCharactersCovered() { return charactersCovered; } >@@ -202,4 +204,4 @@ > public void setReservedField(short val){ > reservedField = val; > } >-} >\ No newline at end of file >+} >Index: src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java >=================================================================== >--- src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java (revision 697080) >+++ src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java (working copy) >@@ -20,8 +20,20 @@ > import java.io.ByteArrayOutputStream; > import java.io.IOException; > >+import java.util.Iterator; >+ > import org.apache.poi.hslf.HSLFSlideShow; > import org.apache.poi.hslf.record.Record; >+import org.apache.poi.util.HexDump; >+import org.apache.poi.ddf.DefaultEscherRecordFactory; >+import org.apache.poi.ddf.EscherRecord; >+import org.apache.poi.ddf.EscherContainerRecord; >+import org.apache.poi.ddf.EscherTextboxRecord; >+import org.apache.poi.hslf.record.EscherTextboxWrapper; >+import org.apache.poi.hslf.record.TextCharsAtom; >+import org.apache.poi.hslf.record.TextBytesAtom; >+import org.apache.poi.hslf.record.StyleTextPropAtom; >+import org.apache.poi.hslf.record.Record; > > /** > * This class provides a way to view the contents of a powerpoint file. >@@ -31,6 +43,8 @@ > * @author Nick Burch > */ > public final class SlideShowRecordDumper { >+ private boolean optVerbose; >+ private boolean optEscher; > private HSLFSlideShow doc; > > /** >@@ -39,17 +53,44 @@ > */ > public static void main(String args[]) throws IOException > { >- if(args.length == 0) { >- System.err.println("Useage: SlideShowRecordDumper <filename>"); >+ String filename = ""; >+ boolean verbose = false; >+ boolean escher = false; >+ >+ int ndx=0; >+ for (; ndx<args.length; ndx++) { >+ if (!args[ndx].substring(0,1).equals("-")) >+ break; >+ >+ if (args[ndx].equals("-escher")) { >+ escher = true; >+ } else if (args[ndx].equals("-verbose")) { >+ verbose = true; >+ } else { >+ printUsage(); >+ return; >+ } >+ } >+ >+ // parsed any options, expect exactly one remaining arg (filename) >+ if (ndx != args.length-1) { >+ printUsage(); > return; > } >+ >+ filename = args[ndx]; > >- String filename = args[0]; >+ SlideShowRecordDumper foo = new SlideShowRecordDumper(filename, verbose, escher); > >- SlideShowRecordDumper foo = new SlideShowRecordDumper(filename); >- > foo.printDump(); > } >+ >+ public static void printUsage() { >+ System.err.println("Usage: SlideShowRecordDumper [-escher] [-verbose] <filename>"); >+ System.err.println("Valid Options:"); >+ System.err.println("-escher\t\t: dump contents of escher records"); >+ System.err.println("-verbose\t: dump binary contents of each record"); >+ } > > > /** >@@ -59,8 +100,10 @@ > * @param fileName The name of the file to read. > * @throws IOException if there is a problem while parsing the document. > */ >- public SlideShowRecordDumper(String fileName) throws IOException >+ public SlideShowRecordDumper(String fileName, boolean verbose, boolean escher) throws IOException > { >+ optVerbose = verbose; >+ optEscher = escher; > doc = new HSLFSlideShow(fileName); > } > >@@ -95,13 +138,97 @@ > } > > public int getDiskLen(Record r) throws IOException { >+ if (r == null) return 0; >+ > ByteArrayOutputStream baos = new ByteArrayOutputStream(); > r.writeOut(baos); > byte[] b = baos.toByteArray(); > return b.length; > } > >+ public String getPrintableRecordContents(Record r) throws IOException { >+ if (r==null) return "<<null>>"; >+ >+ ByteArrayOutputStream baos = new ByteArrayOutputStream(); >+ r.writeOut(baos); >+ byte[] b = baos.toByteArray(); >+ return HexDump.dump(b, 0, 0); >+ } >+ >+ public String printEscherRecord( EscherRecord er ) { >+ String nl = System.getProperty( "line.separator" ); >+ StringBuffer buf = new StringBuffer(); > >+ if (er instanceof EscherContainerRecord) { >+ buf.append(printEscherContainerRecord( (EscherContainerRecord)er )); >+ } else if (er instanceof EscherTextboxRecord) { >+ buf.append("EscherTextboxRecord:" + nl); >+ >+ EscherTextboxWrapper etw = new EscherTextboxWrapper((EscherTextboxRecord)er); >+ Record children[] = etw.getChildRecords(); >+ for (int j=0; j<children.length; j++) { >+ if (children[j] instanceof StyleTextPropAtom) { >+ >+ // need preceding Text[Chars|Bytes]Atom to initialize the data structure >+ if (j > 0 && (children[j-1] instanceof TextCharsAtom || >+ children[j-1] instanceof TextBytesAtom)) { >+ >+ int size = (children[j-1] instanceof TextCharsAtom) ? >+ ((TextCharsAtom)children[j-1]).getText().length() : >+ ((TextBytesAtom)children[j-1]).getText().length(); >+ >+ StyleTextPropAtom tsp = (StyleTextPropAtom)children[j]; >+ tsp.setParentTextSize(size); >+ >+ } else { >+ buf.append("Error! Couldn't find preceding TextAtom for style\n"); >+ } >+ >+ buf.append(children[j].toString() + nl ); >+ } else { >+ buf.append(children[j].toString() + nl ); >+ } >+ } >+ } else { >+ buf.append( er.toString() ); >+ } >+ return buf.toString(); >+ } >+ >+ public String printEscherContainerRecord( EscherContainerRecord ecr ) { >+ String indent = ""; >+ >+ String nl = System.getProperty( "line.separator" ); >+ >+ StringBuffer children = new StringBuffer(); >+ if ( ecr.getChildRecords().size() > 0 ) >+ { >+ children.append( " children: " + nl ); >+ >+ int count = 0; >+ for ( Iterator iterator = ecr.getChildRecords().iterator(); iterator.hasNext(); ) >+ { >+ String newIndent = " "; >+ >+ EscherRecord record = (EscherRecord) iterator.next(); >+ children.append(newIndent + "Child " + count + ":" + nl); >+ >+ children.append( printEscherRecord(record) ); >+ >+ count++; >+ } >+ } >+ >+ return >+ indent + ecr.getClass().getName() + " (" + ecr.getRecordName() + "):" + nl + >+ indent + " isContainer: " + ecr.isContainerRecord() + nl + >+ indent + " options: 0x" + HexDump.toHex( ecr.getOptions() ) + nl + >+ indent + " recordId: 0x" + HexDump.toHex( ecr.getRecordId() ) + nl + >+ indent + " numchildren: " + ecr.getChildRecords().size() + nl + >+ indent + children.toString(); >+ } >+ >+ > public void walkTree(int depth, int pos, Record[] records) throws IOException { > int indent = depth; > String ind = ""; >@@ -109,10 +236,15 @@ > > for(int i=0; i<records.length; i++) { > Record r = records[i]; >+ if (r == null) { >+ System.out.println(ind + "At position " + pos + " (" + makeHex(pos,6) + "):"); >+ System.out.println(ind + "Warning! Null record found."); >+ continue; >+ } > > // Figure out how big it is > int len = getDiskLen(r); >- >+ > // Grab the type as hex > String hexType = makeHex((int)r.getRecordType(),4); > String rHexType = reverseHex(hexType); >@@ -132,6 +264,25 @@ > System.out.println(ind + " Record is of type " + cname); > System.out.println(ind + " Type is " + r.getRecordType() + " (" + hexType + " -> " + rHexType + " )"); > System.out.println(ind + " Len is " + (len-8) + " (" + makeHex((len-8),8) + "), on disk len is " + len ); >+ >+ // print additional information for drawings and atoms >+ if (optEscher && cname.equals("PPDrawing")) { >+ DefaultEscherRecordFactory factory = new DefaultEscherRecordFactory(); >+ >+ ByteArrayOutputStream baos = new ByteArrayOutputStream(); >+ r.writeOut(baos); >+ byte[] b = baos.toByteArray(); >+ >+ EscherRecord er = factory.createRecord(b, 0); >+ er.fillFields(b, 0, factory); >+ >+ System.out.println( printEscherRecord( er ) ); >+ >+ } else if(optVerbose && r.getChildRecords() == null) { >+ String recData = getPrintableRecordContents(r); >+ System.out.println(ind + recData ); >+ } >+ > System.out.println(); > > // If it has children, show them >Index: src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java >=================================================================== >--- src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java (revision 697080) >+++ src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java (working copy) >@@ -19,6 +19,7 @@ > > package org.apache.poi.hslf.record; > >+import org.apache.poi.util.HexDump; > import org.apache.poi.util.LittleEndian; > import org.apache.poi.util.StringUtil; > import java.io.IOException; >@@ -101,4 +102,15 @@ > // Write out our text > out.write(_text); > } >+ >+ /** >+ * dump debug info; use getText() to return a string >+ * representation of the atom >+ */ >+ public String toString() { >+ StringBuffer out = new StringBuffer(); >+ out.append( "TextBytesAtom:\n"); >+ out.append( HexDump.dump(_text, 0, 0) ); >+ return out.toString(); >+ } > } >Index: src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java >=================================================================== >--- src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java (revision 697080) >+++ src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java (working copy) >@@ -32,6 +32,7 @@ > import org.apache.poi.hslf.model.textproperties.TextPropCollection; > import org.apache.poi.util.LittleEndian; > import org.apache.poi.util.POILogger; >+import org.apache.poi.util.HexDump; > > /** > * A StyleTextPropAtom (type 4001). Holds basic character properties >@@ -417,26 +418,63 @@ > */ > public String toString(){ > StringBuffer out = new StringBuffer(); >- out.append("Paragraph properties\n"); >- for (Iterator it1 = getParagraphStyles().iterator(); it1.hasNext();) { >- TextPropCollection pr = (TextPropCollection)it1.next(); >- out.append(" chars covered: " + pr.getCharactersCovered() + "\n"); >- for (Iterator it2 = pr.getTextPropList().iterator(); it2.hasNext(); ) { >- TextProp p = (TextProp)it2.next(); >- out.append(" " + p.getName() + " = " + p.getValue() + "\n"); >- } >+ >+ out.append("StyleTextPropAtom:\n"); >+ if (!initialised) { >+ out.append("Uninitialised, dumping Raw Style Data\n"); >+ } else { >+ >+ out.append("Paragraph properties\n"); >+ >+ for (Iterator it1 = getParagraphStyles().iterator(); it1.hasNext();) { >+ TextPropCollection pr = (TextPropCollection)it1.next(); >+ out.append(" chars covered: " + pr.getCharactersCovered()); >+ out.append(" special mask flags: 0x" + HexDump.toHex(pr.getSpecialMask()) + "\n"); >+ for (Iterator it2 = pr.getTextPropList().iterator(); it2.hasNext(); ) { >+ TextProp p = (TextProp)it2.next(); >+ out.append(" " + p.getName() + " = " + p.getValue() ); >+ out.append(" (0x" + HexDump.toHex(p.getValue()) + ")\n"); >+ } >+ >+ out.append(" para bytes that would be written: \n"); >+ >+ try { >+ ByteArrayOutputStream baos = new ByteArrayOutputStream(); >+ pr.writeOut(baos); >+ byte[] b = baos.toByteArray(); >+ out.append(HexDump.dump(b, 0, 0)); >+ } catch (Exception e ) { >+ e.printStackTrace(); >+ } >+ } >+ >+ out.append("Character properties\n"); >+ for (Iterator it1 = getCharacterStyles().iterator(); it1.hasNext();) { >+ TextPropCollection pr = (TextPropCollection)it1.next(); >+ out.append(" chars covered: " + pr.getCharactersCovered() ); >+ out.append(" special mask flags: 0x" + HexDump.toHex(pr.getSpecialMask()) + "\n"); >+ for (Iterator it2 = pr.getTextPropList().iterator(); it2.hasNext(); ) { >+ TextProp p = (TextProp)it2.next(); >+ out.append(" " + p.getName() + " = " + p.getValue() ); >+ out.append(" (0x" + HexDump.toHex(p.getValue()) + ")\n"); >+ } >+ >+ out.append(" char bytes that would be written: \n"); >+ >+ try { >+ ByteArrayOutputStream baos = new ByteArrayOutputStream(); >+ pr.writeOut(baos); >+ byte[] b = baos.toByteArray(); >+ out.append(HexDump.dump(b, 0, 0)); >+ } catch (Exception e ) { >+ e.printStackTrace(); >+ } >+ } > } >+ >+ out.append(" original byte stream \n"); >+ out.append( HexDump.dump(rawContents, 0, 0) ); > >- out.append("Character properties\n"); >- for (Iterator it1 = getCharacterStyles().iterator(); it1.hasNext();) { >- TextPropCollection pr = (TextPropCollection)it1.next(); >- out.append(" chars covered: " + pr.getCharactersCovered() + "\n"); >- for (Iterator it2 = pr.getTextPropList().iterator(); it2.hasNext(); ) { >- TextProp p = (TextProp)it2.next(); >- out.append(" " + p.getName() + " = " + p.getValue() + "\n"); >- } >- } >- > return out.toString(); > } > } >Index: src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java >=================================================================== >--- src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java (revision 697080) >+++ src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java (working copy) >@@ -19,6 +19,7 @@ > > package org.apache.poi.hslf.record; > >+import org.apache.poi.util.HexDump; > import org.apache.poi.util.LittleEndian; > import org.apache.poi.util.StringUtil; > import java.io.IOException; >@@ -97,4 +98,15 @@ > // Write out our text > out.write(_text); > } >+ >+ /** >+ * dump debug info; use getText() to return a string >+ * representation of the atom >+ */ >+ public String toString() { >+ StringBuffer out = new StringBuffer(); >+ out.append( "TextCharsAtom:\n"); >+ out.append( HexDump.dump(_text, 0, 0) ); >+ return out.toString(); >+ } > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 45844
: 22613