]> source.dussan.org Git - poi.git/commitdiff
Make the fixed sized properties parser more flexible in the face of slightly duff...
authorNick Burch <nick@apache.org>
Wed, 26 Jun 2013 17:03:26 +0000 (17:03 +0000)
committerNick Burch <nick@apache.org>
Wed, 26 Jun 2013 17:03:26 +0000 (17:03 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1497006 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java
src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertiesChunk.java

index 97bd364d3d962a1abe92acc252aac2b14e72b42a..dba19bc864154144e83c261b62c1e2b841e6b178 100644 (file)
@@ -364,6 +364,9 @@ public class MAPIMessage extends POIDocument {
     *  tries to use these to guess the correct encoding for
     *  your file.
     * Bug #49441 has more on why this is needed
+    * 
+    * TODO Try to also use PR_MESSAGE_CODEPAGE and PR_INTERNET_CPID
+    * Would need to refactor some of the codepage support in HPSF first
     */
    public void guess7BitEncoding() {
       try {
index 2e6c508bbc0903f2b345a9b636de88601045389a..18a5ae7303f6899e9901a2037e74ca11741ca0f0 100644 (file)
@@ -146,11 +146,36 @@ public abstract class PropertiesChunk extends Chunk {
             // Turn the Type and ID into helper objects
             MAPIType type = Types.getById(typeID);
             MAPIProperty prop = MAPIProperty.get(id);
+            
+            // Wrap properties we don't know about as custom ones
+            if (prop == MAPIProperty.UNKNOWN) {
+                prop = MAPIProperty.createCustom(id, type, "Unknown " + id);
+            }
+            if (type == null) {
+                logger.log(POILogger.WARN, "Invalid type found, expected ", prop.usualType, 
+                        " but got ", typeID, " for property ", prop);
+                going = false;
+                break;
+            }
+            
+            // Sanity check the property's type against the value's type
             if (prop.usualType != type) {
-               // Oh dear, something has gone wrong...
-               logger.log(POILogger.WARN, "Type mismatch, expected ", type, " but got ", prop.usualType);
-               going = false;
-               break;
+                // Is it an allowed substitution?
+                if (type == Types.ASCII_STRING && prop.usualType == Types.UNICODE_STRING ||
+                    type == Types.UNICODE_STRING && prop.usualType == Types.ASCII_STRING) {
+                    // It's fine to go with the specified instead of the normal
+                } else if (prop.usualType == Types.UNKNOWN) {
+                    // We don't know what this property normally is, but it has come
+                    // through with a valid type, so use that
+                    logger.log(POILogger.INFO, "Property definition for ", prop, 
+                            " is missing a type definition, found a value with type ", type);
+                } else {
+                   // Oh dear, something has gone wrong...
+                   logger.log(POILogger.WARN, "Type mismatch, expected ", prop.usualType, 
+                              " but got ", type, " for property ", prop);
+                   going = false;
+                   break;
+                }
             }
             
             // Work out how long the "data" is