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
This commit is contained in:
Nick Burch 2013-06-26 17:03:26 +00:00
parent a9e1c0e320
commit b37e3c6df2
2 changed files with 32 additions and 4 deletions

View 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 {

View File

@ -146,13 +146,38 @@ public abstract class PropertiesChunk extends Chunk {
// Turn the Type and ID into helper objects
MAPIType type = Types.getById(typeID);
MAPIProperty prop = MAPIProperty.get(id);
if (prop.usualType != type) {
// Oh dear, something has gone wrong...
logger.log(POILogger.WARN, "Type mismatch, expected ", type, " but got ", prop.usualType);
// 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) {
// 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
// This might be the actual data, or just a pointer
// to another chunk which holds the data itself