Author: mariusvolkhart
Date: Tue Mar  9 19:26:31 2021
New Revision: 1887393

URL: http://svn.apache.org/viewvc?rev=1887393&view=rev
Log:
Additional debug logging for unknown records in HSLF

Recently, while debugging app behavior on HSLF documents, I had to dig into the 
OOXML that Microsoft PowerPoint places into files saved in PPT format. Having 
information in the logs about when records were not parsed by POI was very 
helpful. The hex identifier was critical in being able to quickly search the 
[MS-PPT] spec for what type of record it was, and the integer identifier was 
helpful in quickly finding the Record type in RecordTypes.java.

Modified:
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Record.java

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Record.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Record.java?rev=1887393&r1=1887392&r2=1887393&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Record.java 
(original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/Record.java Tue Mar 
 9 19:26:31 2021
@@ -25,6 +25,7 @@ import java.util.List;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.message.StringFormattedMessage;
 import org.apache.poi.common.usermodel.GenericRecord;
 import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
 import org.apache.poi.hslf.exceptions.HSLFException;
@@ -169,13 +170,17 @@ public abstract class Record implements
                // A spot of reflection gets us the (byte[],int,int) constructor
                // From there, we instanciate the class
                // Any special record handling occurs once we have the class
-               RecordConstructor c = 
RecordTypes.forTypeID((short)type).recordConstructor;
+               RecordTypes recordType = RecordTypes.forTypeID((short) type);
+               RecordConstructor c = recordType.recordConstructor;
                if (c == null) {
                        // How odd. RecordTypes normally substitutes in
                        //  a default handler class if it has heard of the 
record
                        //  type but there's no support for it. Explicitly 
request
                        //  that now
+                       LOG.atDebug().log(() -> new 
StringFormattedMessage("Known but unhandled record type %d (0x%04x) at offset 
%d", type, type, start));
                        c = 
RecordTypes.UnknownRecordPlaceholder.recordConstructor;
+               } else if (recordType == RecordTypes.UnknownRecordPlaceholder) {
+                       LOG.atDebug().log(() -> new 
StringFormattedMessage("Unknown placeholder type %d (0x%04x) at offset %d", 
type, type, start));
                }
 
                final Record toReturn;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to