From: Nick Burch Date: Wed, 26 Jun 2013 17:03:26 +0000 (+0000) Subject: Make the fixed sized properties parser more flexible in the face of slightly duff... X-Git-Tag: REL_3_10_BETA2~58 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=daea88523a2583f16d727f102721ba8e4b211852;p=poi.git Make the fixed sized properties parser more flexible in the face of slightly duff data git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1497006 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java b/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java index 97bd364d3d..dba19bc864 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java @@ -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 { diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertiesChunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertiesChunk.java index 2e6c508bbc..18a5ae7303 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertiesChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertiesChunk.java @@ -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