diff options
author | Andreas Beeker <kiwiwings@apache.org> | 2016-12-10 23:35:12 +0000 |
---|---|---|
committer | Andreas Beeker <kiwiwings@apache.org> | 2016-12-10 23:35:12 +0000 |
commit | 7041692dae9f24379770e0c475e66f8a0193a234 (patch) | |
tree | aca87162fa35e51e88bae6b122b9920aadaf0f63 /src/scratchpad | |
parent | ba95cb6fdb3705944cbe6acfb4cbf319f7f8f0ec (diff) | |
download | poi-7041692dae9f24379770e0c475e66f8a0193a234.tar.gz poi-7041692dae9f24379770e0c475e66f8a0193a234.zip |
reindent code - prepare for cleanups
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1773544 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/scratchpad')
18 files changed, 2630 insertions, 2630 deletions
diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java index 51adf8f747..dc6ea58b8e 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java @@ -34,134 +34,132 @@ import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; /** - * Collection of convenience chunks for standard parts of the MSG file attachment. + * Collection of convenience chunks for standard parts of the MSG file + * attachment. */ public class AttachmentChunks implements ChunkGroup { - private static POILogger logger = POILogFactory.getLogger(AttachmentChunks.class); - public static final String PREFIX = "__attach_version1.0_#"; - - public ByteChunk attachData; - public StringChunk attachExtension; - public StringChunk attachFileName; - public StringChunk attachLongFileName; - public StringChunk attachMimeTag; - public DirectoryChunk attachmentDirectory; - - /** - * This is in WMF Format. You'll probably want to pass it - * to Apache Batik to turn it into a SVG that you can - * then display. - */ - public ByteChunk attachRenderingWMF; - - /** - * What the POIFS name of this attachment is. - */ - private String poifsName; - - /** Holds all the chunks that were found. */ - private List<Chunk> allChunks = new ArrayList<Chunk>(); - - - public AttachmentChunks(String poifsName) { - this.poifsName = poifsName; - } - - - /** - * Is this Attachment an embedded MAPI message? - */ - public boolean isEmbeddedMessage() { - return (attachmentDirectory != null); - } - /** - * Returns the embedded MAPI message, if the attachment - * is an embedded message, or null otherwise - */ - public MAPIMessage getEmbeddedMessage() throws IOException { - if (attachmentDirectory != null) { - return attachmentDirectory.getAsEmbededMessage(); - } - return null; - } - - /** - * Returns the embedded object, if the attachment is an - * object based embedding (image, document etc), or null - * if it's an embedded message - */ - public byte[] getEmbeddedAttachmentObject() { - if (attachData != null) { - return attachData.getValue(); - } - return null; - } - - public Chunk[] getAll() { - return allChunks.toArray(new Chunk[allChunks.size()]); - } - public Chunk[] getChunks() { - return getAll(); - } - - public String getPOIFSName() { - return poifsName; - } - - /** - * Called by the parser whenever a chunk is found. - */ - public void record(Chunk chunk) { - // TODO: add further members for other properties like: - // - ATTACH_ADDITIONAL_INFO - // - ATTACH_CONTENT_BASE - // - ATTACH_CONTENT_LOCATION - // - ATTACH_DISPOSITION - // - ATTACH_ENCODING - // - ATTACH_FLAGS - // - ATTACH_LONG_PATHNAME - // - ATTACH_SIZE - final int chunkId = chunk.getChunkId(); - if (chunkId == ATTACH_DATA.id) { - if(chunk instanceof ByteChunk) { - attachData = (ByteChunk)chunk; - } else if(chunk instanceof DirectoryChunk) { - attachmentDirectory = (DirectoryChunk)chunk; - } else { - logger.log(POILogger.ERROR, "Unexpected data chunk of type " + chunk); - } - } else if(chunkId == ATTACH_EXTENSION.id) { - attachExtension = (StringChunk)chunk; - } else if(chunkId == ATTACH_FILENAME.id) { - attachFileName = (StringChunk)chunk; - } else if(chunkId == ATTACH_LONG_FILENAME.id) { - attachLongFileName = (StringChunk)chunk; - } else if(chunkId == ATTACH_MIME_TAG.id) { - attachMimeTag = (StringChunk)chunk; - } else if(chunkId == ATTACH_RENDERING.id) { - attachRenderingWMF = (ByteChunk)chunk; - } - - // And add to the main list - allChunks.add(chunk); - } - - /** - * Used to flag that all the chunks of the attachment - * have now been located. - */ - public void chunksComplete() { - // Currently, we don't need to do anything special once - // all the chunks have been located - } - - - /** - * Orders by the attachment number. - */ - public static class AttachmentChunksSorter implements Comparator<AttachmentChunks>, Serializable { - public int compare(AttachmentChunks a, AttachmentChunks b) { - return a.poifsName.compareTo(b.poifsName); - } - } + private static POILogger logger = POILogFactory.getLogger(AttachmentChunks.class); + public static final String PREFIX = "__attach_version1.0_#"; + + public ByteChunk attachData; + public StringChunk attachExtension; + public StringChunk attachFileName; + public StringChunk attachLongFileName; + public StringChunk attachMimeTag; + public DirectoryChunk attachmentDirectory; + + /** + * This is in WMF Format. You'll probably want to pass it to Apache Batik to + * turn it into a SVG that you can then display. + */ + public ByteChunk attachRenderingWMF; + + /** + * What the POIFS name of this attachment is. + */ + private String poifsName; + + /** Holds all the chunks that were found. */ + private List<Chunk> allChunks = new ArrayList<Chunk>(); + + public AttachmentChunks(String poifsName) { + this.poifsName = poifsName; + } + + /** + * Is this Attachment an embedded MAPI message? + */ + public boolean isEmbeddedMessage() { + return (attachmentDirectory != null); + } + + /** + * Returns the embedded MAPI message, if the attachment is an embedded + * message, or null otherwise + */ + public MAPIMessage getEmbeddedMessage() throws IOException { + if (attachmentDirectory != null) { + return attachmentDirectory.getAsEmbededMessage(); + } + return null; + } + + /** + * Returns the embedded object, if the attachment is an object based + * embedding (image, document etc), or null if it's an embedded message + */ + public byte[] getEmbeddedAttachmentObject() { + if (attachData != null) { + return attachData.getValue(); + } + return null; + } + + public Chunk[] getAll() { + return allChunks.toArray(new Chunk[allChunks.size()]); + } + + public Chunk[] getChunks() { + return getAll(); + } + + public String getPOIFSName() { + return poifsName; + } + + /** + * Called by the parser whenever a chunk is found. + */ + public void record(Chunk chunk) { + // TODO: add further members for other properties like: + // - ATTACH_ADDITIONAL_INFO + // - ATTACH_CONTENT_BASE + // - ATTACH_CONTENT_LOCATION + // - ATTACH_DISPOSITION + // - ATTACH_ENCODING + // - ATTACH_FLAGS + // - ATTACH_LONG_PATHNAME + // - ATTACH_SIZE + final int chunkId = chunk.getChunkId(); + if (chunkId == ATTACH_DATA.id) { + if (chunk instanceof ByteChunk) { + attachData = (ByteChunk) chunk; + } else if (chunk instanceof DirectoryChunk) { + attachmentDirectory = (DirectoryChunk) chunk; + } else { + logger.log(POILogger.ERROR, "Unexpected data chunk of type " + chunk); + } + } else if (chunkId == ATTACH_EXTENSION.id) { + attachExtension = (StringChunk) chunk; + } else if (chunkId == ATTACH_FILENAME.id) { + attachFileName = (StringChunk) chunk; + } else if (chunkId == ATTACH_LONG_FILENAME.id) { + attachLongFileName = (StringChunk) chunk; + } else if (chunkId == ATTACH_MIME_TAG.id) { + attachMimeTag = (StringChunk) chunk; + } else if (chunkId == ATTACH_RENDERING.id) { + attachRenderingWMF = (ByteChunk) chunk; + } + + // And add to the main list + allChunks.add(chunk); + } + + /** + * Used to flag that all the chunks of the attachment have now been located. + */ + public void chunksComplete() { + // Currently, we don't need to do anything special once + // all the chunks have been located + } + + /** + * Orders by the attachment number. + */ + public static class AttachmentChunksSorter + implements Comparator<AttachmentChunks>, Serializable { + public int compare(AttachmentChunks a, AttachmentChunks b) { + return a.poifsName.compareTo(b.poifsName); + } + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ByteChunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ByteChunk.java index 25a525ab60..ef0bdaf9a2 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ByteChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ByteChunk.java @@ -24,89 +24,87 @@ import org.apache.poi.hsmf.datatypes.Types.MAPIType; import org.apache.poi.util.IOUtils; /** - * A Chunk that holds binary data, normally unparsed. - * Generally as we know how to make sense of the - * contents, we create a new Chunk class and add - * a special case in the parser for them. + * A Chunk that holds binary data, normally unparsed. Generally as we know how + * to make sense of the contents, we create a new Chunk class and add a special + * case in the parser for them. */ public class ByteChunk extends Chunk { - private byte[] value; - - /** - * Creates a Byte Chunk. - */ - public ByteChunk(String namePrefix, int chunkId, MAPIType type) { - super(namePrefix, chunkId, type); - } - /** - * Create a Byte Chunk, with the specified - * type. - */ - public ByteChunk(int chunkId, MAPIType type) { - super(chunkId, type); - } - - public void readValue(InputStream value) throws IOException { - this.value = IOUtils.toByteArray(value); - } - - public void writeValue(OutputStream out) throws IOException { - out.write(value); - } - - public byte[] getValue() { - return value; - } - public void setValue(byte[] value) { - this.value = value; - } - - /** - * Returns the data in a debug-friendly string format - */ - public String toString() { - return toDebugFriendlyString(value); - } - - /** - * Formats the byte array in a debug-friendly way, - * showing all of a short array, and the start of a - * longer one. - */ - protected static String toDebugFriendlyString(byte[] value) { - if (value == null) - return "(Null Byte Array)"; - - StringBuffer text = new StringBuffer(); - text.append("Bytes len=").append(value.length); - text.append(" ["); - - int limit = Math.min(value.length, 16); - if (value.length > 16) { - limit = 12; - } - for (int i=0; i<limit; i++) { - if (i > 0) - text.append(','); - text.append(value[i]); - } - if (value.length > 16) { - text.append(",...."); - } - text.append("]"); - return text.toString(); - } - - /** - * Returns the data, formatted as a string assuming it - * was a non-unicode string. - * If your data isn't in fact stored as basically - * ASCII, don't expect this to return much of any - * sense.... - * @return the data formatted as a string - */ - public String getAs7bitString() { - return StringChunk.parseAs7BitData(value); - } + private byte[] value; + + /** + * Creates a Byte Chunk. + */ + public ByteChunk(String namePrefix, int chunkId, MAPIType type) { + super(namePrefix, chunkId, type); + } + + /** + * Create a Byte Chunk, with the specified type. + */ + public ByteChunk(int chunkId, MAPIType type) { + super(chunkId, type); + } + + public void readValue(InputStream value) throws IOException { + this.value = IOUtils.toByteArray(value); + } + + public void writeValue(OutputStream out) throws IOException { + out.write(value); + } + + public byte[] getValue() { + return value; + } + + public void setValue(byte[] value) { + this.value = value; + } + + /** + * Returns the data in a debug-friendly string format + */ + public String toString() { + return toDebugFriendlyString(value); + } + + /** + * Formats the byte array in a debug-friendly way, showing all of a short + * array, and the start of a longer one. + */ + protected static String toDebugFriendlyString(byte[] value) { + if (value == null) + return "(Null Byte Array)"; + + StringBuffer text = new StringBuffer(); + text.append("Bytes len=").append(value.length); + text.append(" ["); + + int limit = Math.min(value.length, 16); + if (value.length > 16) { + limit = 12; + } + for (int i = 0; i < limit; i++) { + if (i > 0) + text.append(','); + text.append(value[i]); + } + if (value.length > 16) { + text.append(",...."); + } + text.append("]"); + return text.toString(); + } + + /** + * Returns the data, formatted as a string assuming it was a non-unicode + * string. If your data isn't in fact stored as basically ASCII, don't + * expect this to return much of any sense.... + * + * @return the data formatted as a string + */ + public String getAs7bitString() { + return StringChunk.parseAs7BitData(value); + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java index b6ef90d5a8..1be119b6ab 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunk.java @@ -25,55 +25,59 @@ import java.util.Locale; import org.apache.poi.hsmf.datatypes.Types.MAPIType; public abstract class Chunk { - public static final String DEFAULT_NAME_PREFIX = "__substg1.0_"; - - protected int chunkId; - protected MAPIType type; - protected String namePrefix; - - protected Chunk(String namePrefix, int chunkId, MAPIType type) { - this.namePrefix = namePrefix; - this.chunkId = chunkId; - this.type = type; - } - protected Chunk(int chunkId, MAPIType type) { - this(DEFAULT_NAME_PREFIX, chunkId, type); - } - - /** - * Gets the id of this chunk - */ - public int getChunkId() { - return this.chunkId; - } - - /** - * Gets the numeric type of this chunk. - */ - public MAPIType getType() { - return this.type; - } - - /** - * Creates a string to use to identify this chunk in the POI file system object. - */ - public String getEntryName() { - String type = this.type.asFileEnding(); - - String chunkId = Integer.toHexString(this.chunkId); - while(chunkId.length() < 4) chunkId = "0" + chunkId; - - return this.namePrefix + chunkId.toUpperCase(Locale.ROOT) - + type.toUpperCase(Locale.ROOT); - } - - /** - * Writes the value of this chunk back out again. - */ - public abstract void writeValue(OutputStream out) throws IOException; - - /** - * Reads the value of this chunk using an InputStream - */ - public abstract void readValue(InputStream value) throws IOException; + public static final String DEFAULT_NAME_PREFIX = "__substg1.0_"; + + protected int chunkId; + protected MAPIType type; + protected String namePrefix; + + protected Chunk(String namePrefix, int chunkId, MAPIType type) { + this.namePrefix = namePrefix; + this.chunkId = chunkId; + this.type = type; + } + + protected Chunk(int chunkId, MAPIType type) { + this(DEFAULT_NAME_PREFIX, chunkId, type); + } + + /** + * Gets the id of this chunk + */ + public int getChunkId() { + return this.chunkId; + } + + /** + * Gets the numeric type of this chunk. + */ + public MAPIType getType() { + return this.type; + } + + /** + * Creates a string to use to identify this chunk in the POI file system + * object. + */ + public String getEntryName() { + String type = this.type.asFileEnding(); + + String chunkId = Integer.toHexString(this.chunkId); + while (chunkId.length() < 4) + chunkId = "0" + chunkId; + + return this.namePrefix + + chunkId.toUpperCase(Locale.ROOT) + + type.toUpperCase(Locale.ROOT); + } + + /** + * Writes the value of this chunk back out again. + */ + public abstract void writeValue(OutputStream out) throws IOException; + + /** + * Reads the value of this chunk using an InputStream + */ + public abstract void readValue(InputStream value) throws IOException; } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkBasedPropertyValue.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkBasedPropertyValue.java index 36c723bdf7..323065592f 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkBasedPropertyValue.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkBasedPropertyValue.java @@ -17,28 +17,26 @@ package org.apache.poi.hsmf.datatypes; - /** - * A variable length {@link PropertyValue} that is - * backed by a {@link Chunk} + * A variable length {@link PropertyValue} that is backed by a {@link Chunk} * TODO Provide a way to link these up with the chunks */ public class ChunkBasedPropertyValue extends PropertyValue { - public ChunkBasedPropertyValue(MAPIProperty property, long flags, byte[] offsetData) { - super(property, flags, offsetData); - } + public ChunkBasedPropertyValue(MAPIProperty property, long flags, byte[] offsetData) { + super(property, flags, offsetData); + } + + @Override + public Chunk getValue() { + // TODO Decode the value into an offset + // TODO Look up the chunk based on that + return null; + } - @Override - public Chunk getValue() { - // TODO Decode the value into an offset - // TODO Look up the chunk based on that - return null; - } - - /** - * Stores the offset of the chunk as the property value - */ - public void setValue(Chunk chunk) { - // TODO - } + /** + * Stores the offset of the chunk as the property value + */ + public void setValue(Chunk chunk) { + // TODO + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkGroup.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkGroup.java index 0bd7dc0af1..273950b28c 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkGroup.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkGroup.java @@ -18,15 +18,13 @@ package org.apache.poi.hsmf.datatypes; /** - * A group of chunks, that are at the same point in the - * file structure. + * A group of chunks, that are at the same point in the file structure. */ public interface ChunkGroup { - /** - * Returns the chunks that make up the group. - * Should certainly contain all the interesting Chunks, - * but needn't always contain all of the Chunks. - */ + /** + * Returns the chunks that make up the group. Should certainly contain all + * the interesting Chunks, but needn't always contain all of the Chunks. + */ public Chunk[] getChunks(); /** diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkGroupWithProperties.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkGroupWithProperties.java index 3d99ea3453..e29d01b804 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkGroupWithProperties.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/ChunkGroupWithProperties.java @@ -21,18 +21,15 @@ import java.util.List; import java.util.Map; /** - * A group of chunks which is indexable by {@link MAPIProperty} - * entries. + * A group of chunks which is indexable by {@link MAPIProperty} entries. */ public interface ChunkGroupWithProperties extends ChunkGroup { - /** - * Returns all the Properties contained in the Chunk, along - * with their Values. - * Normally, each property will have one value, sometimes - * none, and rarely multiple (normally for Unknown etc). - * For fixed sized properties, the value can be fetched - * straight from the {@link PropertyValue}. For variable - * sized properties, you'll need to go via the chunk. - */ - public Map<MAPIProperty,List<PropertyValue>> getProperties(); + /** + * Returns all the Properties contained in the Chunk, along with their + * Values. Normally, each property will have one value, sometimes none, and + * rarely multiple (normally for Unknown etc). For fixed sized properties, + * the value can be fetched straight from the {@link PropertyValue}. For + * variable sized properties, you'll need to go via the chunk. + */ + public Map<MAPIProperty, List<PropertyValue>> getProperties(); } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java index 19165a013d..fa40797acb 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java @@ -26,169 +26,158 @@ import java.util.Map; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; - /** * Collection of convenience chunks for standard parts of the MSG file. * * Not all of these will be present in any given file. * * A partial list is available at: - * http://msdn.microsoft.com/en-us/library/ms526356%28v=exchg.10%29.aspx - * + * http://msdn.microsoft.com/en-us/library/ms526356%28v=exchg.10%29.aspx + * * TODO Deprecate the public Chunks in favour of Property Lookups */ public final class Chunks implements ChunkGroupWithProperties { - private static POILogger logger = POILogFactory.getLogger(Chunks.class); - - /** - * Holds all the chunks that were found, indexed by their MAPIProperty. - * Normally a property will have zero chunks (fixed sized) or one chunk - * (variable size), but in some cases (eg Unknown) you may get more. - */ - private Map<MAPIProperty,List<Chunk>> allChunks = new HashMap<MAPIProperty,List<Chunk>>(); - - /** Type of message that the MSG represents (ie. IPM.Note) */ - public StringChunk messageClass; - /** BODY Chunk, for plain/text messages */ - public StringChunk textBodyChunk; - /** BODY Html Chunk, for html messages */ - public StringChunk htmlBodyChunkString; - public ByteChunk htmlBodyChunkBinary; - /** BODY Rtf Chunk, for Rtf (Rich) messages */ - public ByteChunk rtfBodyChunk; - /** Subject link chunk, in plain/text */ - public StringChunk subjectChunk; - /** - * Value that is in the TO field (not actually the addresses as they are - * stored in recip directory nodes - */ - public StringChunk displayToChunk; - /** Value that is in the FROM field */ - public StringChunk displayFromChunk; - /** value that shows in the CC field */ - public StringChunk displayCCChunk; - /** Value that shows in the BCC field */ - public StringChunk displayBCCChunk; - /** Sort of like the subject line, but without the RE: and FWD: parts. */ - public StringChunk conversationTopic; - /** Type of server that the message originated from (SMTP, etc). */ - public StringChunk sentByServerType; - /** The email headers */ - public StringChunk messageHeaders; - /** TODO */ - public MessageSubmissionChunk submissionChunk; - /** TODO */ - public StringChunk emailFromChunk; - /** The message ID */ - public StringChunk messageId; - /** The message properties */ - private MessagePropertiesChunk messageProperties; - - public Map<MAPIProperty,List<PropertyValue>> getProperties() { - if (messageProperties != null) { - return messageProperties.getProperties(); - } - else return Collections.emptyMap(); - } - public Map<MAPIProperty, PropertyValue> getRawProperties() { - if (messageProperties != null) { - return messageProperties.getRawProperties(); - } - else return Collections.emptyMap(); - } - - public Map<MAPIProperty,List<Chunk>> getAll() { - return allChunks; - } - public Chunk[] getChunks() { - ArrayList<Chunk> chunks = new ArrayList<Chunk>(allChunks.size()); - for (List<Chunk> c : allChunks.values()) { - chunks.addAll(c); - } - return chunks.toArray(new Chunk[chunks.size()]); - } - - /** - * Called by the parser whenever a chunk is found. - */ - public void record(Chunk chunk) { - // Work out what MAPIProperty this corresponds to - MAPIProperty prop = MAPIProperty.get(chunk.getChunkId()); - - // Assign it for easy lookup, as best we can - if(prop == MAPIProperty.MESSAGE_CLASS) { - messageClass = (StringChunk)chunk; - } - else if(prop == MAPIProperty.INTERNET_MESSAGE_ID) { - messageId = (StringChunk)chunk; - } - else if(prop == MAPIProperty.MESSAGE_SUBMISSION_ID) { - // TODO - parse - submissionChunk = (MessageSubmissionChunk)chunk; - } - else if(prop == MAPIProperty.RECEIVED_BY_ADDRTYPE) { - sentByServerType = (StringChunk)chunk; - } - else if(prop == MAPIProperty.TRANSPORT_MESSAGE_HEADERS) { - messageHeaders = (StringChunk)chunk; - } - - else if(prop == MAPIProperty.CONVERSATION_TOPIC) { - conversationTopic = (StringChunk)chunk; - } - else if(prop == MAPIProperty.SUBJECT) { - subjectChunk = (StringChunk)chunk; - } - else if(prop == MAPIProperty.ORIGINAL_SUBJECT) { - // TODO - } - - else if(prop == MAPIProperty.DISPLAY_TO) { - displayToChunk = (StringChunk)chunk; - } - else if(prop == MAPIProperty.DISPLAY_CC) { - displayCCChunk = (StringChunk)chunk; - } - else if(prop == MAPIProperty.DISPLAY_BCC) { - displayBCCChunk = (StringChunk)chunk; - } - - else if(prop == MAPIProperty.SENDER_EMAIL_ADDRESS) { - emailFromChunk = (StringChunk)chunk; - } - else if(prop == MAPIProperty.SENDER_NAME) { - displayFromChunk = (StringChunk)chunk; - } - else if(prop == MAPIProperty.BODY) { - textBodyChunk = (StringChunk)chunk; - } - else if(prop == MAPIProperty.BODY_HTML) { - if(chunk instanceof StringChunk) { - htmlBodyChunkString = (StringChunk)chunk; - } - if(chunk instanceof ByteChunk) { - htmlBodyChunkBinary = (ByteChunk)chunk; - } - } - else if(prop == MAPIProperty.RTF_COMPRESSED) { - rtfBodyChunk = (ByteChunk)chunk; - } - else if(chunk instanceof MessagePropertiesChunk) { - messageProperties = (MessagePropertiesChunk) chunk; - } - - // And add to the main list - if (allChunks.get(prop) == null) { - allChunks.put(prop, new ArrayList<Chunk>()); - } - allChunks.get(prop).add(chunk); - } - - public void chunksComplete() { - if (messageProperties != null) { - messageProperties.matchVariableSizedPropertiesToChunks(); - } else { - logger.log(POILogger.WARN, "Message didn't contain a root list of properties!"); - } - } + private static POILogger logger = POILogFactory.getLogger(Chunks.class); + + /** + * Holds all the chunks that were found, indexed by their MAPIProperty. + * Normally a property will have zero chunks (fixed sized) or one chunk + * (variable size), but in some cases (eg Unknown) you may get more. + */ + private Map<MAPIProperty, List<Chunk>> allChunks = new HashMap<MAPIProperty, List<Chunk>>(); + + /** Type of message that the MSG represents (ie. IPM.Note) */ + public StringChunk messageClass; + /** BODY Chunk, for plain/text messages */ + public StringChunk textBodyChunk; + /** BODY Html Chunk, for html messages */ + public StringChunk htmlBodyChunkString; + public ByteChunk htmlBodyChunkBinary; + /** BODY Rtf Chunk, for Rtf (Rich) messages */ + public ByteChunk rtfBodyChunk; + /** Subject link chunk, in plain/text */ + public StringChunk subjectChunk; + /** + * Value that is in the TO field (not actually the addresses as they are + * stored in recip directory nodes + */ + public StringChunk displayToChunk; + /** Value that is in the FROM field */ + public StringChunk displayFromChunk; + /** value that shows in the CC field */ + public StringChunk displayCCChunk; + /** Value that shows in the BCC field */ + public StringChunk displayBCCChunk; + /** Sort of like the subject line, but without the RE: and FWD: parts. */ + public StringChunk conversationTopic; + /** Type of server that the message originated from (SMTP, etc). */ + public StringChunk sentByServerType; + /** The email headers */ + public StringChunk messageHeaders; + /** TODO */ + public MessageSubmissionChunk submissionChunk; + /** TODO */ + public StringChunk emailFromChunk; + /** The message ID */ + public StringChunk messageId; + /** The message properties */ + private MessagePropertiesChunk messageProperties; + + public Map<MAPIProperty, List<PropertyValue>> getProperties() { + if (messageProperties != null) { + return messageProperties.getProperties(); + } else + return Collections.emptyMap(); + } + + public Map<MAPIProperty, PropertyValue> getRawProperties() { + if (messageProperties != null) { + return messageProperties.getRawProperties(); + } else + return Collections.emptyMap(); + } + + public Map<MAPIProperty, List<Chunk>> getAll() { + return allChunks; + } + + public Chunk[] getChunks() { + ArrayList<Chunk> chunks = new ArrayList<Chunk>(allChunks.size()); + for (List<Chunk> c : allChunks.values()) { + chunks.addAll(c); + } + return chunks.toArray(new Chunk[chunks.size()]); + } + + /** + * Called by the parser whenever a chunk is found. + */ + public void record(Chunk chunk) { + // Work out what MAPIProperty this corresponds to + MAPIProperty prop = MAPIProperty.get(chunk.getChunkId()); + + // Assign it for easy lookup, as best we can + if (prop == MAPIProperty.MESSAGE_CLASS) { + messageClass = (StringChunk) chunk; + } else if (prop == MAPIProperty.INTERNET_MESSAGE_ID) { + messageId = (StringChunk) chunk; + } else if (prop == MAPIProperty.MESSAGE_SUBMISSION_ID) { + // TODO - parse + submissionChunk = (MessageSubmissionChunk) chunk; + } else if (prop == MAPIProperty.RECEIVED_BY_ADDRTYPE) { + sentByServerType = (StringChunk) chunk; + } else if (prop == MAPIProperty.TRANSPORT_MESSAGE_HEADERS) { + messageHeaders = (StringChunk) chunk; + } + + else if (prop == MAPIProperty.CONVERSATION_TOPIC) { + conversationTopic = (StringChunk) chunk; + } else if (prop == MAPIProperty.SUBJECT) { + subjectChunk = (StringChunk) chunk; + } else if (prop == MAPIProperty.ORIGINAL_SUBJECT) { + // TODO + } + + else if (prop == MAPIProperty.DISPLAY_TO) { + displayToChunk = (StringChunk) chunk; + } else if (prop == MAPIProperty.DISPLAY_CC) { + displayCCChunk = (StringChunk) chunk; + } else if (prop == MAPIProperty.DISPLAY_BCC) { + displayBCCChunk = (StringChunk) chunk; + } + + else if (prop == MAPIProperty.SENDER_EMAIL_ADDRESS) { + emailFromChunk = (StringChunk) chunk; + } else if (prop == MAPIProperty.SENDER_NAME) { + displayFromChunk = (StringChunk) chunk; + } else if (prop == MAPIProperty.BODY) { + textBodyChunk = (StringChunk) chunk; + } else if (prop == MAPIProperty.BODY_HTML) { + if (chunk instanceof StringChunk) { + htmlBodyChunkString = (StringChunk) chunk; + } + if (chunk instanceof ByteChunk) { + htmlBodyChunkBinary = (ByteChunk) chunk; + } + } else if (prop == MAPIProperty.RTF_COMPRESSED) { + rtfBodyChunk = (ByteChunk) chunk; + } else if (chunk instanceof MessagePropertiesChunk) { + messageProperties = (MessagePropertiesChunk) chunk; + } + + // And add to the main list + if (allChunks.get(prop) == null) { + allChunks.put(prop, new ArrayList<Chunk>()); + } + allChunks.get(prop).add(chunk); + } + + public void chunksComplete() { + if (messageProperties != null) { + messageProperties.matchVariableSizedPropertiesToChunks(); + } else { + logger.log(POILogger.WARN, + "Message didn't contain a root list of properties!"); + } + } }
\ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/DirectoryChunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/DirectoryChunk.java index 5365a63259..2be65a93d5 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/DirectoryChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/DirectoryChunk.java @@ -25,33 +25,28 @@ import org.apache.poi.hsmf.datatypes.Types.MAPIType; import org.apache.poi.poifs.filesystem.DirectoryNode; /** - * A Chunk that is just a placeholder in the - * MAPIMessage directory structure, which - * contains children. - * This is most commonly used with nested - * MAPIMessages + * A Chunk that is just a placeholder in the MAPIMessage directory structure, + * which contains children. This is most commonly used with nested MAPIMessages */ public class DirectoryChunk extends Chunk { private DirectoryNode dir; - + public DirectoryChunk(DirectoryNode dir, String namePrefix, int chunkId, MAPIType type) { super(namePrefix, chunkId, type); this.dir = dir; } - + /** - * Returns the directory entry for this chunk. - * You can then use standard POIFS methods to - * enumerate the entries in it. + * Returns the directory entry for this chunk. You can then use standard + * POIFS methods to enumerate the entries in it. */ public DirectoryNode getDirectory() { return dir; } - + /** - * Treats the directory as an embeded MAPIMessage - * (it normally is one), and returns a MAPIMessage - * object to process it with. + * Treats the directory as an embeded MAPIMessage (it normally is one), and + * returns a MAPIMessage object to process it with. */ public MAPIMessage getAsEmbededMessage() throws IOException { return new MAPIMessage(dir); diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MAPIProperty.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MAPIProperty.java index ae473983f0..d29e60b656 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MAPIProperty.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MAPIProperty.java @@ -36,1071 +36,1075 @@ import java.util.Map; import org.apache.poi.hsmf.datatypes.Types.MAPIType; /** - * Holds the list of MAPI Attributes, and allows lookup - * by friendly name, ID and MAPI Property Name. - * + * Holds the list of MAPI Attributes, and allows lookup by friendly name, ID and + * MAPI Property Name. + * * These are taken from the following MSDN resources: - * https://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefpropertyid(v=exchg.150).aspx - * http://msdn.microsoft.com/en-us/library/ms526356%28v=exchg.10%29.aspx + * https://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefpropertyid(v=exchg.150).aspx + * http://msdn.microsoft.com/en-us/library/ms526356%28v=exchg.10%29.aspx */ public class MAPIProperty { - private static Map<Integer, MAPIProperty> attributes = new HashMap<Integer, MAPIProperty>(); - - public static final MAPIProperty AB_DEFAULT_DIR = - new MAPIProperty(0x3d06, BINARY, "AbDefaultDir", "PR_AB_DEFAULT_DIR"); - public static final MAPIProperty AB_DEFAULT_PAB = - new MAPIProperty(0x3d07, BINARY, "AbDefaultPab", "PR_AB_DEFAULT_PAB"); - public static final MAPIProperty AB_PROVIDER_ID = - new MAPIProperty(0x3615, BINARY, "AbProviderId", "PR_AB_PROVIDER_ID"); - public static final MAPIProperty AB_PROVIDERS = - new MAPIProperty(0x3d01, BINARY, "AbProviders", "PR_AB_PROVIDERS"); - public static final MAPIProperty AB_SEARCH_PATH = - new MAPIProperty(0x3d05, Types.createCustom(4354), "AbSearchPath", "PR_AB_SEARCH_PATH"); - public static final MAPIProperty AB_SEARCH_PATH_UPDATE = - new MAPIProperty(0x3d11, BINARY, "AbSearchPathUpdate", "PR_AB_SEARCH_PATH_UPDATE"); - public static final MAPIProperty ACCESS = - new MAPIProperty(0xff4, LONG, "Access", "PR_ACCESS"); - public static final MAPIProperty ACCESS_LEVEL = - new MAPIProperty(0xff7, LONG, "AccessLevel", "PR_ACCESS_LEVEL"); - public static final MAPIProperty ACCOUNT = - new MAPIProperty(0x3a00, ASCII_STRING, "Account", "PR_ACCOUNT"); - public static final MAPIProperty ADDRTYPE = - new MAPIProperty(0x3002, ASCII_STRING, "Addrtype", "PR_ADDRTYPE"); - public static final MAPIProperty ALTERNATE_RECIPIENT = - new MAPIProperty(0x3a01, BINARY, "AlternateRecipient", "PR_ALTERNATE_RECIPIENT"); - public static final MAPIProperty ALTERNATE_RECIPIENT_ALLOWED = - new MAPIProperty(2, BOOLEAN, "AlternateRecipientAllowed", "PR_ALTERNATE_RECIPIENT_ALLOWED"); - public static final MAPIProperty ANR = - new MAPIProperty(0x360c, ASCII_STRING, "Anr", "PR_ANR"); - public static final MAPIProperty ASSISTANT = - new MAPIProperty(0x3a30, ASCII_STRING, "Assistant", "PR_ASSISTANT"); - public static final MAPIProperty ASSISTANT_TELEPHONE_NUMBER = - new MAPIProperty(0x3a2e, ASCII_STRING, "AssistantTelephoneNumber", "PR_ASSISTANT_TELEPHONE_NUMBER"); - public static final MAPIProperty ASSOC_CONTENT_COUNT = - new MAPIProperty(0x3617, LONG, "AssocContentCount", "PR_ASSOC_CONTENT_COUNT"); - public static final MAPIProperty ATTACH_ADDITIONAL_INFO = - new MAPIProperty(0x370f, BINARY, "AttachAdditionalInfo", "PR_ATTACH_ADDITIONAL_INFO"); - public static final MAPIProperty ATTACH_CONTENT_BASE = - new MAPIProperty(0x3711, Types.UNKNOWN, "AttachContentBase", "PR_ATTACH_CONTENT_BASE"); - public static final MAPIProperty ATTACH_CONTENT_ID = - new MAPIProperty(0x3712, Types.UNKNOWN, "AttachContentId", "PR_ATTACH_CONTENT_ID"); - public static final MAPIProperty ATTACH_CONTENT_LOCATION = - new MAPIProperty(0x3713, Types.UNKNOWN, "AttachContentLocation", "PR_ATTACH_CONTENT_LOCATION"); - public static final MAPIProperty ATTACH_DATA = - new MAPIProperty(0x3701, BINARY, "AttachData", "PR_ATTACH_DATA_OBJ"); - public static final MAPIProperty ATTACH_DISPOSITION = - new MAPIProperty(0x3716, Types.UNKNOWN, "AttachDisposition", "PR_ATTACH_DISPOSITION"); - public static final MAPIProperty ATTACH_ENCODING = - new MAPIProperty(0x3702, BINARY, "AttachEncoding", "PR_ATTACH_ENCODING"); - public static final MAPIProperty ATTACH_EXTENSION = - new MAPIProperty(0x3703, ASCII_STRING, "AttachExtension", "PR_ATTACH_EXTENSION"); - public static final MAPIProperty ATTACH_FILENAME = - new MAPIProperty(0x3704, ASCII_STRING, "AttachFilename", "PR_ATTACH_FILENAME"); - public static final MAPIProperty ATTACH_FLAGS = - new MAPIProperty(0x3714, Types.UNKNOWN, "AttachFlags", "PR_ATTACH_FLAGS"); - public static final MAPIProperty ATTACH_LONG_FILENAME = - new MAPIProperty(0x3707, ASCII_STRING, "AttachLongFilename", "PR_ATTACH_LONG_FILENAME"); - public static final MAPIProperty ATTACH_LONG_PATHNAME = - new MAPIProperty(0x370d, ASCII_STRING, "AttachLongPathname", "PR_ATTACH_LONG_PATHNAME"); - public static final MAPIProperty ATTACH_METHOD = - new MAPIProperty(0x3705, LONG, "AttachMethod", "PR_ATTACH_METHOD"); - public static final MAPIProperty ATTACH_MIME_SEQUENCE = - new MAPIProperty(0x3710, Types.UNKNOWN, "AttachMimeSequence", "PR_ATTACH_MIME_SEQUENCE"); - public static final MAPIProperty ATTACH_MIME_TAG = - new MAPIProperty(0x370e, ASCII_STRING, "AttachMimeTag", "PR_ATTACH_MIME_TAG"); - public static final MAPIProperty ATTACH_NETSCAPE_MAC_INFO = - new MAPIProperty(0x3715, Types.UNKNOWN, "AttachNetscapeMacInfo", "PR_ATTACH_NETSCAPE_MAC_INFO"); - public static final MAPIProperty ATTACH_NUM = - new MAPIProperty(0xe21, LONG, "AttachNum", "PR_ATTACH_NUM"); - public static final MAPIProperty ATTACH_PATHNAME = - new MAPIProperty(0x3708, ASCII_STRING, "AttachPathname", "PR_ATTACH_PATHNAME"); - public static final MAPIProperty ATTACH_RENDERING = - new MAPIProperty(0x3709, BINARY, "AttachRendering", "PR_ATTACH_RENDERING"); - public static final MAPIProperty ATTACH_SIZE = - new MAPIProperty(0xe20, LONG, "AttachSize", "PR_ATTACH_SIZE"); - public static final MAPIProperty ATTACH_TAG = - new MAPIProperty(0x370a, BINARY, "AttachTag", "PR_ATTACH_TAG"); - public static final MAPIProperty ATTACH_TRANSPORT_NAME = - new MAPIProperty(0x370c, ASCII_STRING, "AttachTransportName", "PR_ATTACH_TRANSPORT_NAME"); - public static final MAPIProperty ATTACHMENT_X400_PARAMETERS = - new MAPIProperty(0x3700, BINARY, "AttachmentX400Parameters", "PR_ATTACHMENT_X400_PARAMETERS"); - public static final MAPIProperty AUTHORIZING_USERS = - new MAPIProperty(3, BINARY, "AuthorizingUsers", "PR_AUTHORIZING_USERS"); - public static final MAPIProperty AUTO_FORWARD_COMMENT = - new MAPIProperty(4, ASCII_STRING, "AutoForwardComment", "PR_AUTO_FORWARD_COMMENT"); - public static final MAPIProperty AUTO_FORWARDED = - new MAPIProperty(5, BOOLEAN, "AutoForwarded", "PR_AUTO_FORWARDED"); - public static final MAPIProperty AUTO_RESPONSE_SUPPRESS = - new MAPIProperty(0x3fdf, Types.UNKNOWN, "AutoResponseSuppress", "PR_AUTO_RESPONSE_SUPPRESS"); - public static final MAPIProperty BIRTHDAY = - new MAPIProperty(0x3a42, TIME, "Birthday", "PR_BIRTHDAY"); - public static final MAPIProperty BODY = - new MAPIProperty(0x1000, ASCII_STRING, "Body", "PR_BODY"); - public static final MAPIProperty BODY_CONTENT_ID = - new MAPIProperty(0x1015, Types.UNKNOWN, "BodyContentId", "PR_BODY_CONTENT_ID"); - public static final MAPIProperty BODY_CONTENT_LOCATION = - new MAPIProperty(0x1014, Types.UNKNOWN, "BodyContentLocation", "PR_BODY_CONTENT_LOCATION"); - public static final MAPIProperty BODY_CRC = - new MAPIProperty(0xe1c, LONG, "BodyCrc", "PR_BODY_CRC"); - public static final MAPIProperty BODY_HTML = - new MAPIProperty(0x1013, Types.UNKNOWN, "BodyHtml", "data"); - public static final MAPIProperty BUSINESS_FAX_NUMBER = - new MAPIProperty(0x3a24, ASCII_STRING, "BusinessFaxNumber", "PR_BUSINESS_FAX_NUMBER"); - public static final MAPIProperty BUSINESS_HOME_PAGE = - new MAPIProperty(0x3a51, ASCII_STRING, "BusinessHomePage", "PR_BUSINESS_HOME_PAGE"); - public static final MAPIProperty CALLBACK_TELEPHONE_NUMBER = - new MAPIProperty(0x3a02, ASCII_STRING, "CallbackTelephoneNumber", "PR_CALLBACK_TELEPHONE_NUMBER"); - public static final MAPIProperty CAR_TELEPHONE_NUMBER = - new MAPIProperty(0x3a1e, ASCII_STRING, "CarTelephoneNumber", "PR_CAR_TELEPHONE_NUMBER"); - public static final MAPIProperty CHILDRENS_NAMES = - new MAPIProperty(0x3a58, Types.createCustom(4126), "ChildrensNames", "PR_CHILDRENS_NAMES"); - public static final MAPIProperty CLIENT_SUBMIT_TIME = - new MAPIProperty(0x39, TIME, "ClientSubmitTime", "PR_CLIENT_SUBMIT_TIME"); - public static final MAPIProperty COMMENT = - new MAPIProperty(0x3004, ASCII_STRING, "Comment", "PR_COMMENT"); - public static final MAPIProperty COMMON_VIEWS_ENTRY_ID = - new MAPIProperty(0x35e6, BINARY, "CommonViewsEntryId", "PR_COMMON_VIEWS_ENTRYID"); - public static final MAPIProperty COMPANY_MAIN_PHONE_NUMBER = - new MAPIProperty(0x3a57, ASCII_STRING, "CompanyMainPhoneNumber", "PR_COMPANY_MAIN_PHONE_NUMBER"); - public static final MAPIProperty COMPANY_NAME = - new MAPIProperty(0x3a16, ASCII_STRING, "CompanyName", "PR_COMPANY_NAME"); - public static final MAPIProperty COMPUTER_NETWORK_NAME = - new MAPIProperty(0x3a49, ASCII_STRING, "ComputerNetworkName", "PR_COMPUTER_NETWORK_NAME"); - public static final MAPIProperty CONTACT_ADDRTYPES = - new MAPIProperty(0x3a54, Types.createCustom(4126), "ContactAddrtypes", "PR_CONTACT_ADDRTYPES"); - public static final MAPIProperty CONTACT_DEFAULT_ADDRESS_INDEX = - new MAPIProperty(0x3a55, LONG, "ContactDefaultAddressIndex", "PR_CONTACT_DEFAULT_ADDRESS_INDEX"); - public static final MAPIProperty CONTACT_EMAIL_ADDRESSES = - new MAPIProperty(0x3a56, Types.createCustom(4126), "ContactEmailAddresses", "PR_CONTACT_EMAIL_ADDRESSES"); - public static final MAPIProperty CONTACT_ENTRY_IDS = - new MAPIProperty(0x3a53, Types.createCustom(4354), "ContactEntryIds", "PR_CONTACT_ENTRYIDS"); - public static final MAPIProperty CONTACT_VERSION = - new MAPIProperty(0x3a52, CLS_ID, "ContactVersion", "PR_CONTACT_VERSION"); - public static final MAPIProperty CONTAINER_CLASS = - new MAPIProperty(0x3613, ASCII_STRING, "ContainerClass", "PR_CONTAINER_CLASS"); - public static final MAPIProperty CONTAINER_CONTENTS = - new MAPIProperty(0x360f, DIRECTORY, "ContainerContents", "PR_CONTAINER_CONTENTS"); - public static final MAPIProperty CONTAINER_FLAGS = - new MAPIProperty(0x3600, LONG, "ContainerFlags", "PR_CONTAINER_FLAGS"); - public static final MAPIProperty CONTAINER_HIERARCHY = - new MAPIProperty(0x360e, DIRECTORY, "ContainerHierarchy", "PR_CONTAINER_HIERARCHY"); - public static final MAPIProperty CONTAINER_MODIFY_VERSION = - new MAPIProperty(0x3614, LONG_LONG, "ContainerModifyVersion", "PR_CONTAINER_MODIFY_VERSION"); - public static final MAPIProperty CONTENT_CONFIDENTIALITY_ALGORITHM_ID = - new MAPIProperty(6, BINARY, "ContentConfidentialityAlgorithmId", "PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID"); - public static final MAPIProperty CONTENT_CORRELATOR = - new MAPIProperty(7, BINARY, "ContentCorrelator", "PR_CONTENT_CORRELATOR"); - public static final MAPIProperty CONTENT_COUNT = - new MAPIProperty(0x3602, LONG, "ContentCount", "PR_CONTENT_COUNT"); - public static final MAPIProperty CONTENT_IDENTIFIER = - new MAPIProperty(8, ASCII_STRING, "ContentIdentifier", "PR_CONTENT_IDENTIFIER"); - public static final MAPIProperty CONTENT_INTEGRITY_CHECK = - new MAPIProperty(0xc00, BINARY, "ContentIntegrityCheck", "PR_CONTENT_INTEGRITY_CHECK"); - public static final MAPIProperty CONTENT_LENGTH = - new MAPIProperty(9, LONG, "ContentLength", "PR_CONTENT_LENGTH"); - public static final MAPIProperty CONTENT_RETURN_REQUESTED = - new MAPIProperty(10, BOOLEAN, "ContentReturnRequested", "PR_CONTENT_RETURN_REQUESTED"); - public static final MAPIProperty CONTENT_UNREAD = - new MAPIProperty(0x3603, LONG, "ContentUnread", "PR_CONTENT_UNREAD"); - public static final MAPIProperty CONTENTS_SORT_ORDER = - new MAPIProperty(0x360d, Types.createCustom(4099), "ContentsSortOrder", "PR_CONTENTS_SORT_ORDER"); - public static final MAPIProperty CONTROL_FLAGS = - new MAPIProperty(0x3f00, LONG, "ControlFlags", "PR_CONTROL_FLAGS"); - public static final MAPIProperty CONTROL_ID = - new MAPIProperty(0x3f07, BINARY, "ControlId", "PR_CONTROL_ID"); - public static final MAPIProperty CONTROL_STRUCTURE = - new MAPIProperty(0x3f01, BINARY, "ControlStructure", "PR_CONTROL_STRUCTURE"); - public static final MAPIProperty CONTROL_TYPE = - new MAPIProperty(0x3f02, LONG, "ControlType", "PR_CONTROL_TYPE"); - public static final MAPIProperty CONVERSATION_INDEX = - new MAPIProperty(0x71, BINARY, "ConversationIndex", "PR_CONVERSATION_INDEX"); - public static final MAPIProperty CONVERSATION_KEY = - new MAPIProperty(11, BINARY, "ConversationKey", "PR_CONVERSATION_KEY"); - public static final MAPIProperty CONVERSATION_TOPIC = - new MAPIProperty(0x70, ASCII_STRING, "ConversationTopic", "PR_CONVERSATION_TOPIC"); - public static final MAPIProperty CONVERSION_EITS = - new MAPIProperty(12, BINARY, "ConversionEits", "PR_CONVERSION_EITS"); - public static final MAPIProperty CONVERSION_PROHIBITED = - new MAPIProperty(0x3a03, BOOLEAN, "ConversionProhibited", "PR_CONVERSION_PROHIBITED"); - public static final MAPIProperty CONVERSION_WITH_LOSS_PROHIBITED = - new MAPIProperty(13, BOOLEAN, "ConversionWithLossProhibited", "PR_CONVERSION_WITH_LOSS_PROHIBITED"); - public static final MAPIProperty CONVERTED_EITS = - new MAPIProperty(14, BINARY, "ConvertedEits", "PR_CONVERTED_EITS"); - public static final MAPIProperty CORRELATE = - new MAPIProperty(0xe0c, BOOLEAN, "Correlate", "PR_CORRELATE"); - public static final MAPIProperty CORRELATE_MTSID = - new MAPIProperty(0xe0d, BINARY, "CorrelateMtsid", "PR_CORRELATE_MTSID"); - public static final MAPIProperty COUNTRY = - new MAPIProperty(0x3a26, ASCII_STRING, "Country", "PR_COUNTRY"); - public static final MAPIProperty CREATE_TEMPLATES = - new MAPIProperty(0x3604, DIRECTORY, "CreateTemplates", "PR_CREATE_TEMPLATES"); - public static final MAPIProperty CREATION_TIME = - new MAPIProperty(0x3007, TIME, "CreationTime", "PR_CREATION_TIME"); - public static final MAPIProperty CREATION_VERSION = - new MAPIProperty(0xe19, LONG_LONG, "CreationVersion", "PR_CREATION_VERSION"); - public static final MAPIProperty CURRENT_VERSION = - new MAPIProperty(0xe00, LONG_LONG, "CurrentVersion", "PR_CURRENT_VERSION"); - public static final MAPIProperty CUSTOMER_ID = - new MAPIProperty(0x3a4a, ASCII_STRING, "CustomerId", "PR_CUSTOMER_ID"); - public static final MAPIProperty DEF_CREATE_DL = - new MAPIProperty(0x3611, BINARY, "DefCreateDl", "PR_DEF_CREATE_DL"); - public static final MAPIProperty DEF_CREATE_MAILUSER = - new MAPIProperty(0x3612, BINARY, "DefCreateMailuser", "PR_DEF_CREATE_MAILUSER"); - public static final MAPIProperty DEFAULT_PROFILE = - new MAPIProperty(0x3d04, BOOLEAN, "DefaultProfile", "PR_DEFAULT_PROFILE"); - public static final MAPIProperty DEFAULT_STORE = - new MAPIProperty(0x3400, BOOLEAN, "DefaultStore", "PR_DEFAULT_STORE"); - public static final MAPIProperty DEFAULT_VIEW_ENTRY_ID = - new MAPIProperty(0x3616, BINARY, "DefaultViewEntryId", "PR_DEFAULT_VIEW_ENTRYID"); - public static final MAPIProperty DEFERRED_DELIVERY_TIME = - new MAPIProperty(15, TIME, "DeferredDeliveryTime", "PR_DEFERRED_DELIVERY_TIME"); - public static final MAPIProperty DELEGATION = - new MAPIProperty(0x7e, BINARY, "Delegation", "PR_DELEGATION"); - public static final MAPIProperty DELETE_AFTER_SUBMIT = - new MAPIProperty(0xe01, BOOLEAN, "DeleteAfterSubmit", "PR_DELETE_AFTER_SUBMIT"); - public static final MAPIProperty DELIVER_TIME = - new MAPIProperty(0x10, TIME, "DeliverTime", "PR_DELIVER_TIME"); - public static final MAPIProperty DELIVERY_POINT = - new MAPIProperty(0xc07, LONG, "DeliveryPoint", "PR_DELIVERY_POINT"); - public static final MAPIProperty DELTAX = - new MAPIProperty(0x3f03, LONG, "Deltax", "PR_DELTAX"); - public static final MAPIProperty DELTAY = - new MAPIProperty(0x3f04, LONG, "Deltay", "PR_DELTAY"); - public static final MAPIProperty DEPARTMENT_NAME = - new MAPIProperty(0x3a18, ASCII_STRING, "DepartmentName", "PR_DEPARTMENT_NAME"); - public static final MAPIProperty DEPTH = - new MAPIProperty(0x3005, LONG, "Depth", "PR_DEPTH"); - public static final MAPIProperty DETAILS_TABLE = - new MAPIProperty(0x3605, DIRECTORY, "DetailsTable", "PR_DETAILS_TABLE"); - public static final MAPIProperty DISC_VAL = - new MAPIProperty(0x4a, BOOLEAN, "DiscVal", "PR_DISC_VAL"); - public static final MAPIProperty DISCARD_REASON = - new MAPIProperty(0x11, LONG, "DiscardReason", "PR_DISCARD_REASON"); - public static final MAPIProperty DISCLOSE_RECIPIENTS = - new MAPIProperty(0x3a04, BOOLEAN, "DiscloseRecipients", "PR_DISCLOSE_RECIPIENTS"); - public static final MAPIProperty DISCLOSURE_OF_RECIPIENTS = - new MAPIProperty(0x12, BOOLEAN, "DisclosureOfRecipients", "PR_DISCLOSURE_OF_RECIPIENTS"); - public static final MAPIProperty DISCRETE_VALUES = - new MAPIProperty(0xe0e, BOOLEAN, "DiscreteValues", "PR_DISCRETE_VALUES"); - public static final MAPIProperty DISPLAY_BCC = - new MAPIProperty(0xe02, ASCII_STRING, "DisplayBcc", "PR_DISPLAY_BCC"); - public static final MAPIProperty DISPLAY_CC = - new MAPIProperty(0xe03, ASCII_STRING, "DisplayCc", "PR_DISPLAY_CC"); - public static final MAPIProperty DISPLAY_NAME = - new MAPIProperty(0x3001, ASCII_STRING, "DisplayName", "PR_DISPLAY_NAME"); - public static final MAPIProperty DISPLAY_NAME_PREFIX = - new MAPIProperty(0x3a45, ASCII_STRING, "DisplayNamePrefix", "PR_DISPLAY_NAME_PREFIX"); - public static final MAPIProperty DISPLAY_TO = - new MAPIProperty(0xe04, ASCII_STRING, "DisplayTo", "PR_DISPLAY_TO"); - public static final MAPIProperty DISPLAY_TYPE = - new MAPIProperty(0x3900, LONG, "DisplayType", "PR_DISPLAY_TYPE"); - public static final MAPIProperty DL_EXPANSION_HISTORY = - new MAPIProperty(0x13, BINARY, "DlExpansionHistory", "PR_DL_EXPANSION_HISTORY"); - public static final MAPIProperty DL_EXPANSION_PROHIBITED = - new MAPIProperty(20, BOOLEAN, "DlExpansionProhibited", "PR_DL_EXPANSION_PROHIBITED"); - public static final MAPIProperty EMAIL_ADDRESS = - new MAPIProperty(0x3003, ASCII_STRING, "EmailAddress", "PR_EMAIL_ADDRESS"); - public static final MAPIProperty END_DATE = - new MAPIProperty(0x61, TIME, "EndDate", "PR_END_DATE"); - public static final MAPIProperty ENTRY_ID = - new MAPIProperty(0xfff, BINARY, "EntryId", "PR_ENTRYID"); - public static final MAPIProperty EXPAND_BEGIN_TIME = - new MAPIProperty(0x3618, Types.UNKNOWN, "ExpandBeginTime", "PR_EXPAND_BEGIN_TIME"); - public static final MAPIProperty EXPAND_END_TIME = - new MAPIProperty(0x3619, Types.UNKNOWN, "ExpandEndTime", "PR_EXPAND_END_TIME"); - public static final MAPIProperty EXPANDED_BEGIN_TIME = - new MAPIProperty(0x361a, Types.UNKNOWN, "ExpandedBeginTime", "PR_EXPANDED_BEGIN_TIME"); - public static final MAPIProperty EXPANDED_END_TIME = - new MAPIProperty(0x361b, Types.UNKNOWN, "ExpandedEndTime", "PR_EXPANDED_END_TIME"); - public static final MAPIProperty EXPIRY_TIME = - new MAPIProperty(0x15, TIME, "ExpiryTime", "PR_EXPIRY_TIME"); - public static final MAPIProperty EXPLICIT_CONVERSION = - new MAPIProperty(0xc01, LONG, "ExplicitConversion", "PR_EXPLICIT_CONVERSION"); - public static final MAPIProperty FILTERING_HOOKS = - new MAPIProperty(0x3d08, BINARY, "FilteringHooks", "PR_FILTERING_HOOKS"); - public static final MAPIProperty FINDER_ENTRY_ID = - new MAPIProperty(0x35e7, BINARY, "FinderEntryId", "PR_FINDER_ENTRYID"); - public static final MAPIProperty FOLDER_ASSOCIATED_CONTENTS = - new MAPIProperty(0x3610, DIRECTORY, "FolderAssociatedContents", "PR_FOLDER_ASSOCIATED_CONTENTS"); - public static final MAPIProperty FOLDER_TYPE = - new MAPIProperty(0x3601, LONG, "FolderType", "PR_FOLDER_TYPE"); - public static final MAPIProperty FORM_CATEGORY = - new MAPIProperty(0x3304, ASCII_STRING, "FormCategory", "PR_FORM_CATEGORY"); - public static final MAPIProperty FORM_CATEGORY_SUB = - new MAPIProperty(0x3305, ASCII_STRING, "FormCategorySub", "PR_FORM_CATEGORY_SUB"); - public static final MAPIProperty FORM_CLSID = - new MAPIProperty(0x3302, CLS_ID, "FormClsid", "PR_FORM_ClsID"); - public static final MAPIProperty FORM_CONTACT_NAME = - new MAPIProperty(0x3303, ASCII_STRING, "FormContactName", "PR_FORM_CONTACT_NAME"); - public static final MAPIProperty FORM_DESIGNER_GUID = - new MAPIProperty(0x3309, CLS_ID, "FormDesignerGuid", "PR_FORM_DESIGNER_GUID"); - public static final MAPIProperty FORM_DESIGNER_NAME = - new MAPIProperty(0x3308, ASCII_STRING, "FormDesignerName", "PR_FORM_DESIGNER_NAME"); - public static final MAPIProperty FORM_HIDDEN = - new MAPIProperty(0x3307, BOOLEAN, "FormHidden", "PR_FORM_HIDDEN"); - public static final MAPIProperty FORM_HOST_MAP = - new MAPIProperty(0x3306, Types.createCustom(4099), "FormHostMap", "PR_FORM_HOST_MAP"); - public static final MAPIProperty FORM_MESSAGE_BEHAVIOR = - new MAPIProperty(0x330a, LONG, "FormMessageBehavior", "PR_FORM_MESSAGE_BEHAVIOR"); - public static final MAPIProperty FORM_VERSION = - new MAPIProperty(0x3301, ASCII_STRING, "FormVersion", "PR_FORM_VERSION"); - public static final MAPIProperty FTP_SITE = - new MAPIProperty(0x3a4c, ASCII_STRING, "FtpSite", "PR_FTP_SITE"); - public static final MAPIProperty GENDER = - new MAPIProperty(0x3a4d, SHORT, "Gender", "PR_GENDER"); - public static final MAPIProperty GENERATION = - new MAPIProperty(0x3a05, ASCII_STRING, "Generation", "PR_GENERATION"); - public static final MAPIProperty GIVEN_NAME = - new MAPIProperty(0x3a06, ASCII_STRING, "GivenName", "PR_GIVEN_NAME"); - public static final MAPIProperty GOVERNMENT_ID_NUMBER = - new MAPIProperty(0x3a07, ASCII_STRING, "GovernmentIdNumber", "PR_GOVERNMENT_ID_NUMBER"); - public static final MAPIProperty HASATTACH = - new MAPIProperty(0xe1b, BOOLEAN, "Hasattach", "PR_HASATTACH"); - public static final MAPIProperty HEADER_FOLDER_ENTRY_ID = - new MAPIProperty(0x3e0a, BINARY, "HeaderFolderEntryId", "PR_HEADER_FOLDER_ENTRYID"); - public static final MAPIProperty HOBBIES = - new MAPIProperty(0x3a43, ASCII_STRING, "Hobbies", "PR_HOBBIES"); - public static final MAPIProperty HOME2_TELEPHONE_NUMBER = - new MAPIProperty(0x3a2f, ASCII_STRING, "Home2TelephoneNumber", "PR_HOME2_TELEPHONE_NUMBER"); - public static final MAPIProperty HOME_ADDRESS_CITY = - new MAPIProperty(0x3a59, ASCII_STRING, "HomeAddressCity", "PR_HOME_ADDRESS_CITY"); - public static final MAPIProperty HOME_ADDRESS_COUNTRY = - new MAPIProperty(0x3a5a, ASCII_STRING, "HomeAddressCountry", "PR_HOME_ADDRESS_COUNTRY"); - public static final MAPIProperty HOME_ADDRESS_POST_OFFICE_BOX = - new MAPIProperty(0x3a5e, ASCII_STRING, "HomeAddressPostOfficeBox", "PR_HOME_ADDRESS_POST_OFFICE_BOX"); - public static final MAPIProperty HOME_ADDRESS_POSTAL_CODE = - new MAPIProperty(0x3a5b, ASCII_STRING, "HomeAddressPostalCode", "PR_HOME_ADDRESS_POSTAL_CODE"); - public static final MAPIProperty HOME_ADDRESS_STATE_OR_PROVINCE = - new MAPIProperty(0x3a5c, ASCII_STRING, "HomeAddressStateOrProvince", "PR_HOME_ADDRESS_STATE_OR_PROVINCE"); - public static final MAPIProperty HOME_ADDRESS_STREET = - new MAPIProperty(0x3a5d, ASCII_STRING, "HomeAddressStreet", "PR_HOME_ADDRESS_STREET"); - public static final MAPIProperty HOME_FAX_NUMBER = - new MAPIProperty(0x3a25, ASCII_STRING, "HomeFaxNumber", "PR_HOME_FAX_NUMBER"); - public static final MAPIProperty HOME_TELEPHONE_NUMBER = - new MAPIProperty(0x3a09, ASCII_STRING, "HomeTelephoneNumber", "PR_HOME_TELEPHONE_NUMBER"); - public static final MAPIProperty INET_MAIL_OVERRIDE_CHARSET = - new MAPIProperty(0x5903, Types.UNKNOWN, "INetMailOverrideCharset", "Charset"); - public static final MAPIProperty INET_MAIL_OVERRIDE_FORMAT = - new MAPIProperty(0x5902, Types.UNKNOWN, "INetMailOverrideFormat", "Format"); - public static final MAPIProperty ICON = - new MAPIProperty(0xffd, BINARY, "Icon", "PR_ICON"); - public static final MAPIProperty IDENTITY_DISPLAY = - new MAPIProperty(0x3e00, ASCII_STRING, "IdentityDisplay", "PR_IDENTITY_DISPLAY"); - public static final MAPIProperty IDENTITY_ENTRY_ID = - new MAPIProperty(0x3e01, BINARY, "IdentityEntryId", "PR_IDENTITY_ENTRYID"); - public static final MAPIProperty IDENTITY_SEARCH_KEY = - new MAPIProperty(0x3e05, BINARY, "IdentitySearchKey", "PR_IDENTITY_SEARCH_KEY"); - public static final MAPIProperty IMPLICIT_CONVERSION_PROHIBITED = - new MAPIProperty(0x16, BOOLEAN, "ImplicitConversionProhibited", "PR_IMPLICIT_CONVERSION_PROHIBITED"); - public static final MAPIProperty IMPORTANCE = - new MAPIProperty(0x17, LONG, "Importance", "PR_IMPORTANCE"); - public static final MAPIProperty IN_REPLY_TO_ID = - new MAPIProperty(0x1042, Types.UNKNOWN, "InReplyToId", "PR_IN_REPLY_TO_ID"); - public static final MAPIProperty INCOMPLETE_COPY = - new MAPIProperty(0x35, BOOLEAN, "IncompleteCopy", "PR_INCOMPLETE_COPY"); - public static final MAPIProperty INITIAL_DETAILS_PANE = - new MAPIProperty(0x3f08, LONG, "InitialDetailsPane", "PR_INITIAL_DETAILS_PANE"); - public static final MAPIProperty INITIALS = - new MAPIProperty(0x3a0a, ASCII_STRING, "Initials", "PR_INITIALS"); - public static final MAPIProperty INSTANCE_KEY = - new MAPIProperty(0xff6, BINARY, "InstanceKey", "PR_INSTANCE_KEY"); - public static final MAPIProperty INTERNET_APPROVED = - new MAPIProperty(0x1030, ASCII_STRING, "InternetApproved", "PR_INTERNET_APPROVED"); - public static final MAPIProperty INTERNET_ARTICLE_NUMBER = - new MAPIProperty(0xe23, LONG, "InternetArticleNumber", "PR_INTERNET_ARTICLE_NUMBER"); - public static final MAPIProperty INTERNET_CPID = - new MAPIProperty(0x3fde, Types.LONG, "InternetCPID", "PR_INTERNET_CPID"); - public static final MAPIProperty INTERNET_CONTROL = - new MAPIProperty(0x1031, ASCII_STRING, "InternetControl", "PR_INTERNET_CONTROL"); - public static final MAPIProperty INTERNET_DISTRIBUTION = - new MAPIProperty(0x1032, ASCII_STRING, "InternetDistribution", "PR_INTERNET_DISTRIBUTION"); - public static final MAPIProperty INTERNET_FOLLOWUP_TO = - new MAPIProperty(0x1033, ASCII_STRING, "InternetFollowupTo", "PR_INTERNET_FOLLOWUP_TO"); - public static final MAPIProperty INTERNET_LINES = - new MAPIProperty(0x1034, LONG, "InternetLines", "PR_INTERNET_LINES"); - public static final MAPIProperty INTERNET_MESSAGE_ID = - new MAPIProperty(0x1035, ASCII_STRING, "InternetMessageId", "PR_INTERNET_MESSAGE_ID"); - public static final MAPIProperty INTERNET_NEWSGROUPS = - new MAPIProperty(0x1036, ASCII_STRING, "InternetNewsgroups", "PR_INTERNET_NEWSGROUPS"); - public static final MAPIProperty INTERNET_NNTP_PATH = - new MAPIProperty(0x1038, ASCII_STRING, "InternetNntpPath", "PR_INTERNET_NNTP_PATH"); - public static final MAPIProperty INTERNET_ORGANIZATION = - new MAPIProperty(0x1037, ASCII_STRING, "InternetOrganization", "PR_INTERNET_ORGANIZATION"); - public static final MAPIProperty INTERNET_PRECEDENCE = - new MAPIProperty(0x1041, ASCII_STRING, "InternetPrecedence", "PR_INTERNET_PRECEDENCE"); - public static final MAPIProperty INTERNET_REFERENCES = - new MAPIProperty(0x1039, ASCII_STRING, "InternetReferences", "PR_INTERNET_REFERENCES"); - public static final MAPIProperty IPM_ID = - new MAPIProperty(0x18, BINARY, "IpmId", "PR_IPM_ID"); - public static final MAPIProperty IPM_OUTBOX_ENTRY_ID = - new MAPIProperty(0x35e2, BINARY, "IpmOutboxEntryId", "PR_IPM_OUTBOX_ENTRYID"); - public static final MAPIProperty IPM_OUTBOX_SEARCH_KEY = - new MAPIProperty(0x3411, BINARY, "IpmOutboxSearchKey", "PR_IPM_OUTBOX_SEARCH_KEY"); - public static final MAPIProperty IPM_RETURN_REQUESTED = - new MAPIProperty(0xc02, BOOLEAN, "IpmReturnRequested", "PR_IPM_RETURN_REQUESTED"); - public static final MAPIProperty IPM_SENTMAIL_ENTRY_ID = - new MAPIProperty(0x35e4, BINARY, "IpmSentmailEntryId", "PR_IPM_SENTMAIL_ENTRYID"); - public static final MAPIProperty IPM_SENTMAIL_SEARCH_KEY = - new MAPIProperty(0x3413, BINARY, "IpmSentmailSearchKey", "PR_IPM_SENTMAIL_SEARCH_KEY"); - public static final MAPIProperty IPM_SUBTREE_ENTRY_ID = - new MAPIProperty(0x35e0, BINARY, "IpmSubtreeEntryId", "PR_IPM_SUBTREE_ENTRYID"); - public static final MAPIProperty IPM_SUBTREE_SEARCH_KEY = - new MAPIProperty(0x3410, BINARY, "IpmSubtreeSearchKey", "PR_IPM_SUBTREE_SEARCH_KEY"); - public static final MAPIProperty IPM_WASTEBASKET_ENTRY_ID = - new MAPIProperty(0x35e3, BINARY, "IpmWastebasketEntryId", "PR_IPM_WASTEBASKET_ENTRYID"); - public static final MAPIProperty IPM_WASTEBASKET_SEARCH_KEY = - new MAPIProperty(0x3412, BINARY, "IpmWastebasketSearchKey", "PR_IPM_WASTEBASKET_SEARCH_KEY"); - public static final MAPIProperty ISDN_NUMBER = - new MAPIProperty(0x3a2d, ASCII_STRING, "IsdnNumber", "PR_ISDN_NUMBER"); - public static final MAPIProperty KEYWORD = - new MAPIProperty(0x3a0b, ASCII_STRING, "Keyword", "PR_KEYWORD"); - public static final MAPIProperty LANGUAGE = - new MAPIProperty(0x3a0c, ASCII_STRING, "Language", "PR_LANGUAGE"); - public static final MAPIProperty LANGUAGES = - new MAPIProperty(0x2f, ASCII_STRING, "Languages", "PR_LANGUAGES"); - public static final MAPIProperty LAST_MODIFICATION_TIME = - new MAPIProperty(0x3008, TIME, "LastModificationTime", "PR_LAST_MODIFICATION_TIME"); - public static final MAPIProperty LATEST_DELIVERY_TIME = - new MAPIProperty(0x19, TIME, "LatestDeliveryTime", "PR_LATEST_DELIVERY_TIME"); - public static final MAPIProperty LIST_HELP = - new MAPIProperty(0x1043, Types.UNKNOWN, "ListHelp", "PR_LIST_HELP"); - public static final MAPIProperty LIST_SUBSCRIBE = - new MAPIProperty(0x1044, Types.UNKNOWN, "ListSubscribe", "PR_LIST_SUBSCRIBE"); - public static final MAPIProperty LIST_UNSUBSCRIBE = - new MAPIProperty(0x1045, Types.UNKNOWN, "ListUnsubscribe", "PR_LIST_UNSUBSCRIBE"); - public static final MAPIProperty LOCALITY = - new MAPIProperty(0x3a27, ASCII_STRING, "Locality", "PR_LOCALITY"); - public static final MAPIProperty LOCALLY_DELIVERED = - new MAPIProperty(0x6745, Types.UNKNOWN, "LocallyDelivered", "ptagLocallyDelivered"); - public static final MAPIProperty LOCATION = - new MAPIProperty(0x3a0d, ASCII_STRING, "Location", "PR_LOCATION"); - public static final MAPIProperty LOCK_BRANCH_ID = - new MAPIProperty(0x3800, Types.UNKNOWN, "LockBranchId", "PR_LOCK_BRANCH_ID"); - public static final MAPIProperty LOCK_DEPTH = - new MAPIProperty(0x3808, Types.UNKNOWN, "LockDepth", "PR_LOCK_DEPTH"); - public static final MAPIProperty LOCK_ENLISTMENT_CONTEXT = - new MAPIProperty(0x3804, Types.UNKNOWN, "LockEnlistmentContext", "PR_LOCK_ENLISTMENT_CONTEXT"); - public static final MAPIProperty LOCK_EXPIRY_TIME = - new MAPIProperty(0x380a, Types.UNKNOWN, "LockExpiryTime", "PR_LOCK_EXPIRY_TIME"); - public static final MAPIProperty LOCK_PERSISTENT = - new MAPIProperty(0x3807, Types.UNKNOWN, "LockPersistent", "PR_LOCK_PERSISTENT"); - public static final MAPIProperty LOCK_RESOURCE_DID = - new MAPIProperty(0x3802, Types.UNKNOWN, "LockResourceDid", "PR_LOCK_RESOURCE_DID"); - public static final MAPIProperty LOCK_RESOURCE_FID = - new MAPIProperty(0x3801, Types.UNKNOWN, "LockResourceFid", "PR_LOCK_RESOURCE_FID"); - public static final MAPIProperty LOCK_RESOURCE_MID = - new MAPIProperty(0x3803, Types.UNKNOWN, "LockResourceMid", "PR_LOCK_RESOURCE_MID"); - public static final MAPIProperty LOCK_SCOPE = - new MAPIProperty(0x3806, Types.UNKNOWN, "LockScope", "PR_LOCK_SCOPE"); - public static final MAPIProperty LOCK_TIMEOUT = - new MAPIProperty(0x3809, Types.UNKNOWN, "LockTimeout", "PR_LOCK_TIMEOUT"); - public static final MAPIProperty LOCK_TYPE = - new MAPIProperty(0x3805, Types.UNKNOWN, "LockType", "PR_LOCK_TYPE"); - public static final MAPIProperty MAIL_PERMISSION = - new MAPIProperty(0x3a0e, BOOLEAN, "MailPermission", "PR_MAIL_PERMISSION"); - public static final MAPIProperty MANAGER_NAME = - new MAPIProperty(0x3a4e, ASCII_STRING, "ManagerName", "PR_MANAGER_NAME"); - public static final MAPIProperty MAPPING_SIGNATURE = - new MAPIProperty(0xff8, BINARY, "MappingSignature", "PR_MAPPING_SIGNATURE"); - public static final MAPIProperty MDB_PROVIDER = - new MAPIProperty(0x3414, BINARY, "MdbProvider", "PR_MDB_PROVIDER"); - public static final MAPIProperty MESSAGE_ATTACHMENTS = - new MAPIProperty(0xe13, DIRECTORY, "MessageAttachments", "PR_MESSAGE_ATTACHMENTS"); - public static final MAPIProperty MESSAGE_CC_ME = - new MAPIProperty(0x58, BOOLEAN, "MessageCcMe", "PR_MESSAGE_CC_ME"); - public static final MAPIProperty MESSAGE_CLASS = - new MAPIProperty(0x1a, ASCII_STRING, "MessageClass", "PR_MESSAGE_CLASS"); - public static final MAPIProperty MESSAGE_CODEPAGE = - new MAPIProperty(0x3ffd, Types.LONG, "MessageCodepage", "PR_MESSAGE_CODEPAGE"); - public static final MAPIProperty MESSAGE_DELIVERY_ID = - new MAPIProperty(0x1b, BINARY, "MessageDeliveryId", "PR_MESSAGE_DELIVERY_ID"); - public static final MAPIProperty MESSAGE_DELIVERY_TIME = - new MAPIProperty(0xe06, TIME, "MessageDeliveryTime", "PR_MESSAGE_DELIVERY_TIME"); - public static final MAPIProperty MESSAGE_DOWNLOAD_TIME = - new MAPIProperty(0xe18, LONG, "MessageDownloadTime", "PR_MESSAGE_DOWNLOAD_TIME"); - public static final MAPIProperty MESSAGE_FLAGS = - new MAPIProperty(0xe07, LONG, "MessageFlags", "PR_MESSAGE_FLAGS"); - public static final MAPIProperty MESSAGE_RECIP_ME = - new MAPIProperty(0x59, BOOLEAN, "MessageRecipMe", "PR_MESSAGE_RECIP_ME"); - public static final MAPIProperty MESSAGE_RECIPIENTS = - new MAPIProperty(0xe12, DIRECTORY, "MessageRecipients", "PR_MESSAGE_RECIPIENTS"); - public static final MAPIProperty MESSAGE_SECURITY_LABEL = - new MAPIProperty(30, BINARY, "MessageSecurityLabel", "PR_MESSAGE_SECURITY_LABEL"); - public static final MAPIProperty MESSAGE_SIZE = - new MAPIProperty(0xe08, LONG, "MessageSize", "PR_MESSAGE_SIZE"); - public static final MAPIProperty MESSAGE_SUBMISSION_ID = - new MAPIProperty(0x47, BINARY, "MessageSubmissionId", "PR_MESSAGE_SUBMISSION_ID"); - public static final MAPIProperty MESSAGE_TO_ME = - new MAPIProperty(0x57, BOOLEAN, "MessageToMe", "PR_MESSAGE_TO_ME"); - public static final MAPIProperty MESSAGE_TOKEN = - new MAPIProperty(0xc03, BINARY, "MessageToken", "PR_MESSAGE_TOKEN"); - public static final MAPIProperty MHS_COMMON_NAME = - new MAPIProperty(0x3a0f, ASCII_STRING, "MhsCommonName", "PR_MHS_COMMON_NAME"); - public static final MAPIProperty MIDDLE_NAME = - new MAPIProperty(0x3a44, ASCII_STRING, "MiddleName", "PR_MIDDLE_NAME"); - public static final MAPIProperty MINI_ICON = - new MAPIProperty(0xffc, BINARY, "MiniIcon", "PR_MINI_ICON"); - public static final MAPIProperty MOBILE_TELEPHONE_NUMBER = - new MAPIProperty(0x3a1c, ASCII_STRING, "MobileTelephoneNumber", "PR_MOBILE_TELEPHONE_NUMBER"); - public static final MAPIProperty MODIFY_VERSION = - new MAPIProperty(0xe1a, LONG_LONG, "ModifyVersion", "PR_MODIFY_VERSION"); - public static final MAPIProperty MSG_STATUS = - new MAPIProperty(0xe17, LONG, "MsgStatus", "PR_MSG_STATUS"); - public static final MAPIProperty NDR_DIAG_CODE = - new MAPIProperty(0xc05, LONG, "NdrDiagCode", "PR_NDR_DIAG_CODE"); - public static final MAPIProperty NDR_REASON_CODE = - new MAPIProperty(0xc04, LONG, "NdrReasonCode", "PR_NDR_REASON_CODE"); - public static final MAPIProperty NDR_STATUS_CODE = - new MAPIProperty(0xc20, Types.UNKNOWN, "NdrStatusCode", "PR_NDR_STATUS_CODE"); - public static final MAPIProperty NEWSGROUP_NAME = - new MAPIProperty(0xe24, ASCII_STRING, "NewsgroupName", "PR_NEWSGROUP_NAME"); - public static final MAPIProperty NICKNAME = - new MAPIProperty(0x3a4f, ASCII_STRING, "Nickname", "PR_NICKNAME"); - public static final MAPIProperty NNTP_XREF = - new MAPIProperty(0x1040, ASCII_STRING, "NntpXref", "PR_NNTP_XREF"); - public static final MAPIProperty NON_RECEIPT_NOTIFICATION_REQUESTED = - new MAPIProperty(0xc06, BOOLEAN, "NonReceiptNotificationRequested", "PR_NON_RECEIPT_NOTIFICATION_REQUESTED"); - public static final MAPIProperty NON_RECEIPT_REASON = - new MAPIProperty(0x3e, LONG, "NonReceiptReason", "PR_NON_RECEIPT_REASON"); - public static final MAPIProperty NORMALIZED_SUBJECT = - new MAPIProperty(0xe1d, ASCII_STRING, "NormalizedSubject", "PR_NORMALIZED_SUBJECT"); - public static final MAPIProperty NT_SECURITY_DESCRIPTOR = - new MAPIProperty(0xe27, Types.UNKNOWN, "NtSecurityDescriptor", "PR_NT_SECURITY_DESCRIPTOR"); - public static final MAPIProperty NULL = - new MAPIProperty(1, LONG, "Null", "PR_NULL"); - public static final MAPIProperty OBJECT_TYPE = - new MAPIProperty(0xffe, LONG, "ObjectType", "PR_Object_TYPE"); - public static final MAPIProperty OBSOLETED_IPMS = - new MAPIProperty(0x1f, BINARY, "ObsoletedIpms", "PR_OBSOLETED_IPMS"); - public static final MAPIProperty OFFICE2_TELEPHONE_NUMBER = - new MAPIProperty(0x3a1b, ASCII_STRING, "Office2TelephoneNumber", "PR_OFFICE2_TELEPHONE_NUMBER"); - public static final MAPIProperty OFFICE_LOCATION = - new MAPIProperty(0x3a19, ASCII_STRING, "OfficeLocation", "PR_OFFICE_LOCATION"); - public static final MAPIProperty OFFICE_TELEPHONE_NUMBER = - new MAPIProperty(0x3a08, ASCII_STRING, "OfficeTelephoneNumber", "PR_OFFICE_TELEPHONE_NUMBER"); - public static final MAPIProperty OOF_REPLY_TYPE = - new MAPIProperty(0x4080, Types.UNKNOWN, "OofReplyType", "PR_OOF_REPLY_TYPE"); - public static final MAPIProperty ORGANIZATIONAL_ID_NUMBER = - new MAPIProperty(0x3a10, ASCII_STRING, "OrganizationalIdNumber", "PR_ORGANIZATIONAL_ID_NUMBER"); - public static final MAPIProperty ORIG_ENTRY_ID = - new MAPIProperty(0x300f, Types.UNKNOWN, "OrigEntryId", "PR_ORIG_ENTRYID"); - public static final MAPIProperty ORIG_MESSAGE_CLASS = - new MAPIProperty(0x4b, ASCII_STRING, "OrigMessageClass", "PR_ORIG_MESSAGE_CLASS"); - public static final MAPIProperty ORIGIN_CHECK = - new MAPIProperty(0x27, BINARY, "OriginCheck", "PR_ORIGIN_CHECK"); - public static final MAPIProperty ORIGINAL_AUTHOR_ADDRTYPE = - new MAPIProperty(0x79, ASCII_STRING, "OriginalAuthorAddrtype", "PR_ORIGINAL_AUTHOR_ADDRTYPE"); - public static final MAPIProperty ORIGINAL_AUTHOR_EMAIL_ADDRESS = - new MAPIProperty(0x7a, ASCII_STRING, "OriginalAuthorEmailAddress", "PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS"); - public static final MAPIProperty ORIGINAL_AUTHOR_ENTRY_ID = - new MAPIProperty(0x4c, BINARY, "OriginalAuthorEntryId", "PR_ORIGINAL_AUTHOR_ENTRYID"); - public static final MAPIProperty ORIGINAL_AUTHOR_NAME = - new MAPIProperty(0x4d, ASCII_STRING, "OriginalAuthorName", "PR_ORIGINAL_AUTHOR_NAME"); - public static final MAPIProperty ORIGINAL_AUTHOR_SEARCH_KEY = - new MAPIProperty(0x56, BINARY, "OriginalAuthorSearchKey", "PR_ORIGINAL_AUTHOR_SEARCH_KEY"); - public static final MAPIProperty ORIGINAL_DELIVERY_TIME = - new MAPIProperty(0x55, TIME, "OriginalDeliveryTime", "PR_ORIGINAL_DELIVERY_TIME"); - public static final MAPIProperty ORIGINAL_DISPLAY_BCC = - new MAPIProperty(0x72, ASCII_STRING, "OriginalDisplayBcc", "PR_ORIGINAL_DISPLAY_BCC"); - public static final MAPIProperty ORIGINAL_DISPLAY_CC = - new MAPIProperty(0x73, ASCII_STRING, "OriginalDisplayCc", "PR_ORIGINAL_DISPLAY_CC"); - public static final MAPIProperty ORIGINAL_DISPLAY_NAME = - new MAPIProperty(0x3a13, ASCII_STRING, "OriginalDisplayName", "PR_ORIGINAL_DISPLAY_NAME"); - public static final MAPIProperty ORIGINAL_DISPLAY_TO = - new MAPIProperty(0x74, ASCII_STRING, "OriginalDisplayTo", "PR_ORIGINAL_DISPLAY_TO"); - public static final MAPIProperty ORIGINAL_EITS = - new MAPIProperty(0x21, BINARY, "OriginalEits", "PR_ORIGINAL_EITS"); - public static final MAPIProperty ORIGINAL_ENTRY_ID = - new MAPIProperty(0x3a12, BINARY, "OriginalEntryId", "PR_ORIGINAL_ENTRYID"); - public static final MAPIProperty ORIGINAL_SEARCH_KEY = - new MAPIProperty(0x3a14, BINARY, "OriginalSearchKey", "PR_ORIGINAL_SEARCH_KEY"); - public static final MAPIProperty ORIGINAL_SENDER_ADDRTYPE = - new MAPIProperty(0x66, ASCII_STRING, "OriginalSenderAddrtype", "PR_ORIGINAL_SENDER_ADDRTYPE"); - public static final MAPIProperty ORIGINAL_SENDER_EMAIL_ADDRESS = - new MAPIProperty(0x67, ASCII_STRING, "OriginalSenderEmailAddress", "PR_ORIGINAL_SENDER_EMAIL_ADDRESS"); - public static final MAPIProperty ORIGINAL_SENDER_ENTRY_ID = - new MAPIProperty(0x5b, BINARY, "OriginalSenderEntryId", "PR_ORIGINAL_SENDER_ENTRYID"); - public static final MAPIProperty ORIGINAL_SENDER_NAME = - new MAPIProperty(90, ASCII_STRING, "OriginalSenderName", "PR_ORIGINAL_SENDER_NAME"); - public static final MAPIProperty ORIGINAL_SENDER_SEARCH_KEY = - new MAPIProperty(0x5c, BINARY, "OriginalSenderSearchKey", "PR_ORIGINAL_SENDER_SEARCH_KEY"); - public static final MAPIProperty ORIGINAL_SENSITIVITY = - new MAPIProperty(0x2e, LONG, "OriginalSensitivity", "PR_ORIGINAL_SENSITIVITY"); - public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_ADDRTYPE = - new MAPIProperty(0x68, ASCII_STRING, "OriginalSentRepresentingAddrtype", "PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE"); - public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS = - new MAPIProperty(0x69, ASCII_STRING, "OriginalSentRepresentingEmailAddress", "PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS"); - public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_ENTRY_ID = - new MAPIProperty(0x5e, BINARY, "OriginalSentRepresentingEntryId", "PR_ORIGINAL_SENT_REPRESENTING_ENTRYID"); - public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_NAME = - new MAPIProperty(0x5d, ASCII_STRING, "OriginalSentRepresentingName", "PR_ORIGINAL_SENT_REPRESENTING_NAME"); - public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_SEARCH_KEY = - new MAPIProperty(0x5f, BINARY, "OriginalSentRepresentingSearchKey", "PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY"); - public static final MAPIProperty ORIGINAL_SUBJECT = - new MAPIProperty(0x49, ASCII_STRING, "OriginalSubject", "PR_ORIGINAL_SUBJECT"); - public static final MAPIProperty ORIGINAL_SUBMIT_TIME = - new MAPIProperty(0x4e, TIME, "OriginalSubmitTime", "PR_ORIGINAL_SUBMIT_TIME"); - public static final MAPIProperty ORIGINALLY_INTENDED_RECIP_ADDRTYPE = - new MAPIProperty(0x7b, ASCII_STRING, "OriginallyIntendedRecipAddrtype", "PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE"); - public static final MAPIProperty ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS = - new MAPIProperty(0x7c, ASCII_STRING, "OriginallyIntendedRecipEmailAddress", "PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS"); - public static final MAPIProperty ORIGINALLY_INTENDED_RECIP_ENTRY_ID = - new MAPIProperty(0x1012, BINARY, "OriginallyIntendedRecipEntryId", "PR_ORIGINALLY_INTENDED_RECIP_ENTRYID"); - public static final MAPIProperty ORIGINALLY_INTENDED_RECIPIENT_NAME = - new MAPIProperty(0x20, BINARY, "OriginallyIntendedRecipientName", "PR_ORIGINALLY_INTENDED_RECIPIENT_NAME"); - public static final MAPIProperty ORIGINATING_MTA_CERTIFICATE = - new MAPIProperty(0xe25, BINARY, "OriginatingMtaCertificate", "PR_ORIGINATING_MTA_CERTIFICATE"); - public static final MAPIProperty ORIGINATOR_AND_DL_EXPANSION_HISTORY = - new MAPIProperty(0x1002, BINARY, "OriginatorAndDlExpansionHistory", "PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY"); - public static final MAPIProperty ORIGINATOR_CERTIFICATE = - new MAPIProperty(0x22, BINARY, "OriginatorCertificate", "PR_ORIGINATOR_CERTIFICATE"); - public static final MAPIProperty ORIGINATOR_DELIVERY_REPORT_REQUESTED = - new MAPIProperty(0x23, BOOLEAN, "OriginatorDeliveryReportRequested", "PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED"); - public static final MAPIProperty ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED = - new MAPIProperty(0xc08, BOOLEAN, "OriginatorNonDeliveryReportRequested", "PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED"); - public static final MAPIProperty ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT = - new MAPIProperty(0xc09, BINARY, "OriginatorRequestedAlternateRecipient", "PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT"); - public static final MAPIProperty ORIGINATOR_RETURN_ADDRESS = - new MAPIProperty(0x24, BINARY, "OriginatorReturnAddress", "PR_ORIGINATOR_RETURN_ADDRESS"); - public static final MAPIProperty OTHER_ADDRESS_CITY = - new MAPIProperty(0x3a5f, ASCII_STRING, "OtherAddressCity", "PR_OTHER_ADDRESS_CITY"); - public static final MAPIProperty OTHER_ADDRESS_COUNTRY = - new MAPIProperty(0x3a60, ASCII_STRING, "OtherAddressCountry", "PR_OTHER_ADDRESS_COUNTRY"); - public static final MAPIProperty OTHER_ADDRESS_POST_OFFICE_BOX = - new MAPIProperty(0x3a64, ASCII_STRING, "OtherAddressPostOfficeBox", "PR_OTHER_ADDRESS_POST_OFFICE_BOX"); - public static final MAPIProperty OTHER_ADDRESS_POSTAL_CODE = - new MAPIProperty(0x3a61, ASCII_STRING, "OtherAddressPostalCode", "PR_OTHER_ADDRESS_POSTAL_CODE"); - public static final MAPIProperty OTHER_ADDRESS_STATE_OR_PROVINCE = - new MAPIProperty(0x3a62, ASCII_STRING, "OtherAddressStateOrProvince", "PR_OTHER_ADDRESS_STATE_OR_PROVINCE"); - public static final MAPIProperty OTHER_ADDRESS_STREET = - new MAPIProperty(0x3a63, ASCII_STRING, "OtherAddressStreet", "PR_OTHER_ADDRESS_STREET"); - public static final MAPIProperty OTHER_TELEPHONE_NUMBER = - new MAPIProperty(0x3a1f, ASCII_STRING, "OtherTelephoneNumber", "PR_OTHER_TELEPHONE_NUMBER"); - public static final MAPIProperty OWN_STORE_ENTRY_ID = - new MAPIProperty(0x3e06, BINARY, "OwnStoreEntryId", "PR_OWN_STORE_ENTRYID"); - public static final MAPIProperty OWNER_APPT_ID = - new MAPIProperty(0x62, LONG, "OwnerApptId", "PR_OWNER_APPT_ID"); - public static final MAPIProperty PAGER_TELEPHONE_NUMBER = - new MAPIProperty(0x3a21, ASCII_STRING, "PagerTelephoneNumber", "PR_PAGER_TELEPHONE_NUMBER"); - public static final MAPIProperty PARENT_DISPLAY = - new MAPIProperty(0xe05, ASCII_STRING, "ParentDisplay", "PR_PARENT_DISPLAY"); - public static final MAPIProperty PARENT_ENTRY_ID = - new MAPIProperty(0xe09, BINARY, "ParentEntryId", "PR_PARENT_ENTRYID"); - public static final MAPIProperty PARENT_KEY = - new MAPIProperty(0x25, BINARY, "ParentKey", "PR_PARENT_KEY"); - public static final MAPIProperty PERSONAL_HOME_PAGE = - new MAPIProperty(0x3a50, ASCII_STRING, "PersonalHomePage", "PR_PERSONAL_HOME_PAGE"); - public static final MAPIProperty PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY = - new MAPIProperty(0xc0a, BOOLEAN, "PhysicalDeliveryBureauFaxDelivery", "PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY"); - public static final MAPIProperty PHYSICAL_DELIVERY_MODE = - new MAPIProperty(0xc0b, LONG, "PhysicalDeliveryMode", "PR_PHYSICAL_DELIVERY_MODE"); - public static final MAPIProperty PHYSICAL_DELIVERY_REPORT_REQUEST = - new MAPIProperty(0xc0c, LONG, "PhysicalDeliveryReportRequest", "PR_PHYSICAL_DELIVERY_REPORT_REQUEST"); - public static final MAPIProperty PHYSICAL_FORWARDING_ADDRESS = - new MAPIProperty(0xc0d, BINARY, "PhysicalForwardingAddress", "PR_PHYSICAL_FORWARDING_ADDRESS"); - public static final MAPIProperty PHYSICAL_FORWARDING_ADDRESS_REQUESTED = - new MAPIProperty(0xc0e, BOOLEAN, "PhysicalForwardingAddressRequested", "PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED"); - public static final MAPIProperty PHYSICAL_FORWARDING_PROHIBITED = - new MAPIProperty(0xc0f, BOOLEAN, "PhysicalForwardingProhibited", "PR_PHYSICAL_FORWARDING_PROHIBITED"); - public static final MAPIProperty PHYSICAL_RENDITION_ATTRIBUTES = - new MAPIProperty(0xc10, BINARY, "PhysicalRenditionAttributes", "PR_PHYSICAL_RENDITION_ATTRIBUTES"); - public static final MAPIProperty POST_FOLDER_ENTRIES = - new MAPIProperty(0x103b, BINARY, "PostFolderEntries", "PR_POST_FOLDER_ENTRIES"); - public static final MAPIProperty POST_FOLDER_NAMES = - new MAPIProperty(0x103c, ASCII_STRING, "PostFolderNames", "PR_POST_FOLDER_NAMES"); - public static final MAPIProperty POST_OFFICE_BOX = - new MAPIProperty(0x3a2b, ASCII_STRING, "PostOfficeBox", "PR_POST_OFFICE_BOX"); - public static final MAPIProperty POST_REPLY_DENIED = - new MAPIProperty(0x103f, BINARY, "PostReplyDenied", "PR_POST_REPLY_DENIED"); - public static final MAPIProperty POST_REPLY_FOLDER_ENTRIES = - new MAPIProperty(0x103d, BINARY, "PostReplyFolderEntries", "PR_POST_REPLY_FOLDER_ENTRIES"); - public static final MAPIProperty POST_REPLY_FOLDER_NAMES = - new MAPIProperty(0x103e, ASCII_STRING, "PostReplyFolderNames", "PR_POST_REPLY_FOLDER_NAMES"); - public static final MAPIProperty POSTAL_ADDRESS = - new MAPIProperty(0x3a15, ASCII_STRING, "PostalAddress", "PR_POSTAL_ADDRESS"); - public static final MAPIProperty POSTAL_CODE = - new MAPIProperty(0x3a2a, ASCII_STRING, "PostalCode", "PR_POSTAL_CODE"); - public static final MAPIProperty PREPROCESS = - new MAPIProperty(0xe22, BOOLEAN, "Preprocess", "PR_PREPROCESS"); - public static final MAPIProperty PRIMARY_CAPABILITY = - new MAPIProperty(0x3904, BINARY, "PrimaryCapability", "PR_PRIMARY_CAPABILITY"); - public static final MAPIProperty PRIMARY_FAX_NUMBER = - new MAPIProperty(0x3a23, ASCII_STRING, "PrimaryFaxNumber", "PR_PRIMARY_FAX_NUMBER"); - public static final MAPIProperty PRIMARY_TELEPHONE_NUMBER = - new MAPIProperty(0x3a1a, ASCII_STRING, "PrimaryTelephoneNumber", "PR_PRIMARY_TELEPHONE_NUMBER"); - public static final MAPIProperty PRIORITY = - new MAPIProperty(0x26, LONG, "Priority", "PR_PRIORITY"); - public static final MAPIProperty PROFESSION = - new MAPIProperty(0x3a46, ASCII_STRING, "Profession", "PR_PROFESSION"); - public static final MAPIProperty PROFILE_NAME = - new MAPIProperty(0x3d12, ASCII_STRING, "ProfileName", "PR_PROFILE_NAME"); - public static final MAPIProperty PROOF_OF_DELIVERY = - new MAPIProperty(0xc11, BINARY, "ProofOfDelivery", "PR_PROOF_OF_DELIVERY"); - public static final MAPIProperty PROOF_OF_DELIVERY_REQUESTED = - new MAPIProperty(0xc12, BOOLEAN, "ProofOfDeliveryRequested", "PR_PROOF_OF_DELIVERY_REQUESTED"); - public static final MAPIProperty PROOF_OF_SUBMISSION = - new MAPIProperty(0xe26, BINARY, "ProofOfSubmission", "PR_PROOF_OF_SUBMISSION"); - public static final MAPIProperty PROOF_OF_SUBMISSION_REQUESTED = - new MAPIProperty(40, BOOLEAN, "ProofOfSubmissionRequested", "PR_PROOF_OF_SUBMISSION_REQUESTED"); - public static final MAPIProperty PROP_ID_SECURE_MAX = - new MAPIProperty(0x67ff, Types.UNKNOWN, "PropIdSecureMax", "PROP_ID_SECURE_MAX"); - public static final MAPIProperty PROP_ID_SECURE_MIN = - new MAPIProperty(0x67f0, Types.UNKNOWN, "PropIdSecureMin", "PROP_ID_SECURE_MIN"); - public static final MAPIProperty PROVIDER_DISPLAY = - new MAPIProperty(0x3006, ASCII_STRING, "ProviderDisplay", "PR_PROVIDER_DISPLAY"); - public static final MAPIProperty PROVIDER_DLL_NAME = - new MAPIProperty(0x300a, ASCII_STRING, "ProviderDllName", "PR_PROVIDER_DLL_NAME"); - public static final MAPIProperty PROVIDER_ORDINAL = - new MAPIProperty(0x300d, LONG, "ProviderOrdinal", "PR_PROVIDER_ORDINAL"); - public static final MAPIProperty PROVIDER_SUBMIT_TIME = - new MAPIProperty(0x48, TIME, "ProviderSubmitTime", "PR_PROVIDER_SUBMIT_TIME"); - public static final MAPIProperty PROVIDER_UID = - new MAPIProperty(0x300c, BINARY, "ProviderUid", "PR_PROVIDER_UID"); - public static final MAPIProperty PUID = - new MAPIProperty(0x300e, Types.UNKNOWN, "Puid", "PR_PUID"); - public static final MAPIProperty RADIO_TELEPHONE_NUMBER = - new MAPIProperty(0x3a1d, ASCII_STRING, "RadioTelephoneNumber", "PR_RADIO_TELEPHONE_NUMBER"); - public static final MAPIProperty RCVD_REPRESENTING_ADDRTYPE = - new MAPIProperty(0x77, ASCII_STRING, "RcvdRepresentingAddrtype", "PR_RCVD_REPRESENTING_ADDRTYPE"); - public static final MAPIProperty RCVD_REPRESENTING_EMAIL_ADDRESS = - new MAPIProperty(120, ASCII_STRING, "RcvdRepresentingEmailAddress", "PR_RCVD_REPRESENTING_EMAIL_ADDRESS"); - public static final MAPIProperty RCVD_REPRESENTING_ENTRY_ID = - new MAPIProperty(0x43, BINARY, "RcvdRepresentingEntryId", "PR_RCVD_REPRESENTING_ENTRYID"); - public static final MAPIProperty RCVD_REPRESENTING_NAME = - new MAPIProperty(0x44, ASCII_STRING, "RcvdRepresentingName", "PR_RCVD_REPRESENTING_NAME"); - public static final MAPIProperty RCVD_REPRESENTING_SEARCH_KEY = - new MAPIProperty(0x52, BINARY, "RcvdRepresentingSearchKey", "PR_RCVD_REPRESENTING_SEARCH_KEY"); - public static final MAPIProperty READ_RECEIPT_ENTRY_ID = - new MAPIProperty(70, BINARY, "ReadReceiptEntryId", "PR_READ_RECEIPT_ENTRYID"); - public static final MAPIProperty READ_RECEIPT_REQUESTED = - new MAPIProperty(0x29, BOOLEAN, "ReadReceiptRequested", "PR_READ_RECEIPT_REQUESTED"); - public static final MAPIProperty READ_RECEIPT_SEARCH_KEY = - new MAPIProperty(0x53, BINARY, "ReadReceiptSearchKey", "PR_READ_RECEIPT_SEARCH_KEY"); - public static final MAPIProperty RECEIPT_TIME = - new MAPIProperty(0x2a, TIME, "ReceiptTime", "PR_RECEIPT_TIME"); - public static final MAPIProperty RECEIVE_FOLDER_SETTINGS = - new MAPIProperty(0x3415, DIRECTORY, "ReceiveFolderSettings", "PR_RECEIVE_FOLDER_SETTINGS"); - public static final MAPIProperty RECEIVED_BY_ADDRTYPE = - new MAPIProperty(0x75, ASCII_STRING, "ReceivedByAddrtype", "PR_RECEIVED_BY_ADDRTYPE"); - public static final MAPIProperty RECEIVED_BY_EMAIL_ADDRESS = - new MAPIProperty(0x76, ASCII_STRING, "ReceivedByEmailAddress", "PR_RECEIVED_BY_EMAIL_ADDRESS"); - public static final MAPIProperty RECEIVED_BY_ENTRY_ID = - new MAPIProperty(0x3f, BINARY, "ReceivedByEntryId", "PR_RECEIVED_BY_ENTRYID"); - public static final MAPIProperty RECEIVED_BY_NAME = - new MAPIProperty(0x40, ASCII_STRING, "ReceivedByName", "PR_RECEIVED_BY_NAME"); - public static final MAPIProperty RECIPIENT_DISPLAY_NAME = - new MAPIProperty(0x5ff6, Types.UNICODE_STRING, "RecipientDisplayName", null); - public static final MAPIProperty RECIPIENT_ENTRY_ID = - new MAPIProperty(0x5ff7, Types.UNKNOWN, "RecipientEntryId", null); - public static final MAPIProperty RECIPIENT_FLAGS = - new MAPIProperty(0x5ffd, Types.UNKNOWN, "RecipientFlags", null); - public static final MAPIProperty RECEIVED_BY_SEARCH_KEY = - new MAPIProperty(0x51, BINARY, "ReceivedBySearchKey", "PR_RECEIVED_BY_SEARCH_KEY"); - public static final MAPIProperty RECIPIENT_CERTIFICATE = - new MAPIProperty(0xc13, BINARY, "RecipientCertificate", "PR_RECIPIENT_CERTIFICATE"); - public static final MAPIProperty RECIPIENT_NUMBER_FOR_ADVICE = - new MAPIProperty(0xc14, ASCII_STRING, "RecipientNumberForAdvice", "PR_RECIPIENT_NUMBER_FOR_ADVICE"); - public static final MAPIProperty RECIPIENT_REASSIGNMENT_PROHIBITED = - new MAPIProperty(0x2b, BOOLEAN, "RecipientReassignmentProhibited", "PR_RECIPIENT_REASSIGNMENT_PROHIBITED"); - public static final MAPIProperty RECIPIENT_STATUS = - new MAPIProperty(0xe15, LONG, "RecipientStatus", "PR_RECIPIENT_STATUS"); - public static final MAPIProperty RECIPIENT_TYPE = - new MAPIProperty(0xc15, LONG, "RecipientType", "PR_RECIPIENT_TYPE"); - public static final MAPIProperty RECORD_KEY = - new MAPIProperty(0xff9, BINARY, "RecordKey", "PR_RECORD_KEY"); - public static final MAPIProperty REDIRECTION_HISTORY = - new MAPIProperty(0x2c, BINARY, "RedirectionHistory", "PR_REDIRECTION_HISTORY"); - public static final MAPIProperty REFERRED_BY_NAME = - new MAPIProperty(0x3a47, ASCII_STRING, "ReferredByName", "PR_REFERRED_BY_NAME"); - public static final MAPIProperty REGISTERED_MAIL_TYPE = - new MAPIProperty(0xc16, LONG, "RegisteredMailType", "PR_REGISTERED_MAIL_TYPE"); - public static final MAPIProperty RELATED_IPMS = - new MAPIProperty(0x2d, BINARY, "RelatedIpms", "PR_RELATED_IPMS"); - public static final MAPIProperty REMOTE_PROGRESS = - new MAPIProperty(0x3e0b, LONG, "RemoteProgress", "PR_REMOTE_PROGRESS"); - public static final MAPIProperty REMOTE_PROGRESS_TEXT = - new MAPIProperty(0x3e0c, ASCII_STRING, "RemoteProgressText", "PR_REMOTE_PROGRESS_TEXT"); - public static final MAPIProperty REMOTE_VALIDATE_OK = - new MAPIProperty(0x3e0d, BOOLEAN, "RemoteValidateOk", "PR_REMOTE_VALIDATE_OK"); - public static final MAPIProperty RENDERING_POSITION = - new MAPIProperty(0x370b, LONG, "RenderingPosition", "PR_RENDERING_POSITION"); - public static final MAPIProperty REPLY_RECIPIENT_ENTRIES = - new MAPIProperty(0x4f, BINARY, "ReplyRecipientEntries", "PR_REPLY_RECIPIENT_ENTRIES"); - public static final MAPIProperty REPLY_RECIPIENT_NAMES = - new MAPIProperty(80, ASCII_STRING, "ReplyRecipientNames", "PR_REPLY_RECIPIENT_NAMES"); - public static final MAPIProperty REPLY_REQUESTED = - new MAPIProperty(0xc17, BOOLEAN, "ReplyRequested", "PR_REPLY_REQUESTED"); - public static final MAPIProperty REPLY_TIME = - new MAPIProperty(0x30, TIME, "ReplyTime", "PR_REPLY_TIME"); - public static final MAPIProperty REPORT_ENTRY_ID = - new MAPIProperty(0x45, BINARY, "ReportEntryId", "PR_REPORT_ENTRYID"); - public static final MAPIProperty REPORT_NAME = - new MAPIProperty(0x3a, ASCII_STRING, "ReportName", "PR_REPORT_NAME"); - public static final MAPIProperty REPORT_SEARCH_KEY = - new MAPIProperty(0x54, BINARY, "ReportSearchKey", "PR_REPORT_SEARCH_KEY"); - public static final MAPIProperty REPORT_TAG = - new MAPIProperty(0x31, BINARY, "ReportTag", "PR_REPORT_TAG"); - public static final MAPIProperty REPORT_TEXT = - new MAPIProperty(0x1001, ASCII_STRING, "ReportText", "PR_REPORT_TEXT"); - public static final MAPIProperty REPORT_TIME = - new MAPIProperty(50, TIME, "ReportTime", "PR_REPORT_TIME"); - public static final MAPIProperty REPORTING_DL_NAME = - new MAPIProperty(0x1003, BINARY, "ReportingDlName", "PR_REPORTING_DL_NAME"); - public static final MAPIProperty REPORTING_MTA_CERTIFICATE = - new MAPIProperty(0x1004, BINARY, "ReportingMtaCertificate", "PR_REPORTING_MTA_CERTIFICATE"); - public static final MAPIProperty REQUESTED_DELIVERY_METHOD = - new MAPIProperty(0xc18, LONG, "RequestedDeliveryMethod", "PR_REQUESTED_DELIVERY_METHOD"); - public static final MAPIProperty RESOURCE_FLAGS = - new MAPIProperty(0x3009, LONG, "ResourceFlags", "PR_RESOURCE_FLAGS"); - public static final MAPIProperty RESOURCE_METHODS = - new MAPIProperty(0x3e02, LONG, "ResourceMethods", "PR_RESOURCE_METHODS"); - public static final MAPIProperty RESOURCE_PATH = - new MAPIProperty(0x3e07, ASCII_STRING, "ResourcePath", "PR_RESOURCE_PATH"); - public static final MAPIProperty RESOURCE_TYPE = - new MAPIProperty(0x3e03, LONG, "ResourceType", "PR_RESOURCE_TYPE"); - public static final MAPIProperty RESPONSE_REQUESTED = - new MAPIProperty(0x63, BOOLEAN, "ResponseRequested", "PR_RESPONSE_REQUESTED"); - public static final MAPIProperty RESPONSIBILITY = - new MAPIProperty(0xe0f, BOOLEAN, "Responsibility", "PR_RESPONSIBILITY"); - public static final MAPIProperty RETURNED_IPM = - new MAPIProperty(0x33, BOOLEAN, "ReturnedIpm", "PR_RETURNED_IPM"); - public static final MAPIProperty ROW_TYPE = - new MAPIProperty(0xff5, LONG, "RowType", "PR_ROW_TYPE"); - public static final MAPIProperty ROWID = - new MAPIProperty(0x3000, LONG, "Rowid", "PR_ROWID"); - public static final MAPIProperty RTF_COMPRESSED = - new MAPIProperty(0x1009, BINARY, "RtfCompressed", "PR_RTF_COMPRESSED"); - public static final MAPIProperty RTF_IN_SYNC = - new MAPIProperty(0xe1f, BOOLEAN, "RtfInSync", "PR_RTF_IN_SYNC"); - public static final MAPIProperty RTF_SYNC_BODY_COUNT = - new MAPIProperty(0x1007, LONG, "RtfSyncBodyCount", "PR_RTF_SYNC_BODY_COUNT"); - public static final MAPIProperty RTF_SYNC_BODY_CRC = - new MAPIProperty(0x1006, LONG, "RtfSyncBodyCrc", "PR_RTF_SYNC_BODY_CRC"); - public static final MAPIProperty RTF_SYNC_BODY_TAG = - new MAPIProperty(0x1008, ASCII_STRING, "RtfSyncBodyTag", "PR_RTF_SYNC_BODY_TAG"); - public static final MAPIProperty RTF_SYNC_PREFIX_COUNT = - new MAPIProperty(0x1010, LONG, "RtfSyncPrefixCount", "PR_RTF_SYNC_PREFIX_COUNT"); - public static final MAPIProperty RTF_SYNC_TRAILING_COUNT = - new MAPIProperty(0x1011, LONG, "RtfSyncTrailingCount", "PR_RTF_SYNC_TRAILING_COUNT"); - public static final MAPIProperty SEARCH = - new MAPIProperty(0x3607, DIRECTORY, "Search", "PR_SEARCH"); - public static final MAPIProperty SEARCH_KEY = - new MAPIProperty(0x300b, BINARY, "SearchKey", "PR_SEARCH_KEY"); - public static final MAPIProperty SECURITY = - new MAPIProperty(0x34, LONG, "Security", "PR_SECURITY"); - public static final MAPIProperty SELECTABLE = - new MAPIProperty(0x3609, BOOLEAN, "Selectable", "PR_SELECTABLE"); - public static final MAPIProperty SEND_INTERNET_ENCODING = - new MAPIProperty(0x3a71, LONG, "SendInternetEncoding", "PR_SEND_INTERNET_ENCODING"); - public static final MAPIProperty SEND_RECALL_REPORT = - new MAPIProperty(0x6803, Types.UNKNOWN, "SendRecallReport", "messages"); - public static final MAPIProperty SEND_RICH_INFO = - new MAPIProperty(0x3a40, BOOLEAN, "SendRichInfo", "PR_SEND_RICH_INFO"); - public static final MAPIProperty SENDER_ADDRTYPE = - new MAPIProperty(0xc1e, ASCII_STRING, "SenderAddrtype", "PR_SENDER_ADDRTYPE"); - public static final MAPIProperty SENDER_EMAIL_ADDRESS = - new MAPIProperty(0xc1f, ASCII_STRING, "SenderEmailAddress", "PR_SENDER_EMAIL_ADDRESS"); - public static final MAPIProperty SENDER_ENTRY_ID = - new MAPIProperty(0xc19, BINARY, "SenderEntryId", "PR_SENDER_ENTRYID"); - public static final MAPIProperty SENDER_NAME = - new MAPIProperty(0xc1a, ASCII_STRING, "SenderName", "PR_SENDER_NAME"); - public static final MAPIProperty SENDER_SEARCH_KEY = - new MAPIProperty(0xc1d, BINARY, "SenderSearchKey", "PR_SENDER_SEARCH_KEY"); - public static final MAPIProperty SENSITIVITY = - new MAPIProperty(0x36, LONG, "Sensitivity", "PR_SENSITIVITY"); - public static final MAPIProperty SENT_REPRESENTING_ADDRTYPE = - new MAPIProperty(100, ASCII_STRING, "SentRepresentingAddrtype", "PR_SENT_REPRESENTING_ADDRTYPE"); - public static final MAPIProperty SENT_REPRESENTING_EMAIL_ADDRESS = - new MAPIProperty(0x65, ASCII_STRING, "SentRepresentingEmailAddress", "PR_SENT_REPRESENTING_EMAIL_ADDRESS"); - public static final MAPIProperty SENT_REPRESENTING_ENTRY_ID = - new MAPIProperty(0x41, BINARY, "SentRepresentingEntryId", "PR_SENT_REPRESENTING_ENTRYID"); - public static final MAPIProperty SENT_REPRESENTING_NAME = - new MAPIProperty(0x42, ASCII_STRING, "SentRepresentingName", "PR_SENT_REPRESENTING_NAME"); - public static final MAPIProperty SENT_REPRESENTING_SEARCH_KEY = - new MAPIProperty(0x3b, BINARY, "SentRepresentingSearchKey", "PR_SENT_REPRESENTING_SEARCH_KEY"); - public static final MAPIProperty SENTMAIL_ENTRY_ID = - new MAPIProperty(0xe0a, BINARY, "SentmailEntryId", "PR_SENTMAIL_ENTRYID"); - public static final MAPIProperty SERVICE_DELETE_FILES = - new MAPIProperty(0x3d10, Types.createCustom(4126), "ServiceDeleteFiles", "PR_SERVICE_DELETE_FILES"); - public static final MAPIProperty SERVICE_DLL_NAME = - new MAPIProperty(0x3d0a, ASCII_STRING, "ServiceDllName", "PR_SERVICE_DLL_NAME"); - public static final MAPIProperty SERVICE_ENTRY_NAME = - new MAPIProperty(0x3d0b, ASCII_STRING, "ServiceEntryName", "PR_SERVICE_ENTRY_NAME"); - public static final MAPIProperty SERVICE_EXTRA_UIDS = - new MAPIProperty(0x3d0d, BINARY, "ServiceExtraUids", "PR_SERVICE_EXTRA_UIDS"); - public static final MAPIProperty SERVICE_NAME = - new MAPIProperty(0x3d09, ASCII_STRING, "ServiceName", "PR_SERVICE_NAME"); - public static final MAPIProperty SERVICE_SUPPORT_FILES = - new MAPIProperty(0x3d0f, Types.createCustom(4126), "ServiceSupportFiles", "PR_SERVICE_SUPPORT_FILES"); - public static final MAPIProperty SERVICE_UID = - new MAPIProperty(0x3d0c, BINARY, "ServiceUid", "PR_SERVICE_UID"); - public static final MAPIProperty SERVICES = - new MAPIProperty(0x3d0e, BINARY, "Services", "PR_SERVICES"); - public static final MAPIProperty SEVEN_BIT_DISPLAY_NAME = - new MAPIProperty(0x39ff, ASCII_STRING, "SevenBitDisplayName", "PR_SEVEN_BIT_DISPLAY_NAME"); - public static final MAPIProperty SMTP_ADDRESS = - new MAPIProperty(0x39fe, Types.UNICODE_STRING, "SmtpAddress", "PR_SMTP_ADDRESS"); - public static final MAPIProperty SPOOLER_STATUS = - new MAPIProperty(0xe10, LONG, "SpoolerStatus", "PR_SPOOLER_STATUS"); - public static final MAPIProperty SPOUSE_NAME = - new MAPIProperty(0x3a48, ASCII_STRING, "SpouseName", "PR_SPOUSE_NAME"); - public static final MAPIProperty START_DATE = - new MAPIProperty(0x60, TIME, "StartDate", "PR_START_DATE"); - public static final MAPIProperty STATE_OR_PROVINCE = - new MAPIProperty(0x3a28, ASCII_STRING, "StateOrProvince", "PR_STATE_OR_PROVINCE"); - public static final MAPIProperty STATUS = - new MAPIProperty(0x360b, LONG, "Status", "PR_STATUS"); - public static final MAPIProperty STATUS_CODE = - new MAPIProperty(0x3e04, LONG, "StatusCode", "PR_STATUS_CODE"); - public static final MAPIProperty STATUS_STRING = - new MAPIProperty(0x3e08, ASCII_STRING, "StatusString", "PR_STATUS_STRING"); - public static final MAPIProperty STORE_ENTRY_ID = - new MAPIProperty(0xffb, BINARY, "StoreEntryId", "PR_STORE_ENTRYID"); - public static final MAPIProperty STORE_PROVIDERS = - new MAPIProperty(0x3d00, BINARY, "StoreProviders", "PR_STORE_PROVIDERS"); - public static final MAPIProperty STORE_RECORD_KEY = - new MAPIProperty(0xffa, BINARY, "StoreRecordKey", "PR_STORE_RECORD_KEY"); - public static final MAPIProperty STORE_STATE = - new MAPIProperty(0x340e, LONG, "StoreState", "PR_STORE_STATE"); - public static final MAPIProperty STORE_SUPPORT_MASK = - new MAPIProperty(0x340d, LONG, "StoreSupportMask", "PR_STORE_SUPPORT_MASK"); - public static final MAPIProperty STREET_ADDRESS = - new MAPIProperty(0x3a29, ASCII_STRING, "StreetAddress", "PR_STREET_ADDRESS"); - public static final MAPIProperty SUBFOLDERS = - new MAPIProperty(0x360a, BOOLEAN, "Subfolders", "PR_SUBFOLDERS"); - public static final MAPIProperty SUBJECT = - new MAPIProperty(0x37, ASCII_STRING, "Subject", "PR_SUBJECT"); - public static final MAPIProperty SUBJECT_IPM = - new MAPIProperty(0x38, BINARY, "SubjectIpm", "PR_SUBJECT_IPM"); - public static final MAPIProperty SUBJECT_PREFIX = - new MAPIProperty(0x3d, ASCII_STRING, "SubjectPrefix", "PR_SUBJECT_PREFIX"); - public static final MAPIProperty SUBMIT_FLAGS = - new MAPIProperty(0xe14, LONG, "SubmitFlags", "PR_SUBMIT_FLAGS"); - public static final MAPIProperty SUPERSEDES = - new MAPIProperty(0x103a, ASCII_STRING, "Supersedes", "PR_SUPERSEDES"); - public static final MAPIProperty SUPPLEMENTARY_INFO = - new MAPIProperty(0xc1b, ASCII_STRING, "SupplementaryInfo", "PR_SUPPLEMENTARY_INFO"); - public static final MAPIProperty SURNAME = - new MAPIProperty(0x3a11, ASCII_STRING, "Surname", "PR_SURNAME"); - public static final MAPIProperty TELEX_NUMBER = - new MAPIProperty(0x3a2c, ASCII_STRING, "TelexNumber", "PR_TELEX_NUMBER"); - public static final MAPIProperty TEMPLATEID = - new MAPIProperty(0x3902, BINARY, "Templateid", "PR_TEMPLATEID"); - public static final MAPIProperty TITLE = - new MAPIProperty(0x3a17, ASCII_STRING, "Title", "PR_TITLE"); - public static final MAPIProperty TNEF_CORRELATION_KEY = - new MAPIProperty(0x7f, BINARY, "TnefCorrelationKey", "PR_TNEF_CORRELATION_KEY"); - public static final MAPIProperty TRANSMITABLE_DISPLAY_NAME = - new MAPIProperty(0x3a20, ASCII_STRING, "TransmitableDisplayName", "PR_TRANSMITABLE_DISPLAY_NAME"); - public static final MAPIProperty TRANSPORT_KEY = - new MAPIProperty(0xe16, LONG, "TransportKey", "PR_TRANSPORT_KEY"); - public static final MAPIProperty TRANSPORT_MESSAGE_HEADERS = - new MAPIProperty(0x7d, ASCII_STRING, "TransportMessageHeaders", "PR_TRANSPORT_MESSAGE_HEADERS"); - public static final MAPIProperty TRANSPORT_PROVIDERS = - new MAPIProperty(0x3d02, BINARY, "TransportProviders", "PR_TRANSPORT_PROVIDERS"); - public static final MAPIProperty TRANSPORT_STATUS = - new MAPIProperty(0xe11, LONG, "TransportStatus", "PR_TRANSPORT_STATUS"); - public static final MAPIProperty TTYTDD_PHONE_NUMBER = - new MAPIProperty(0x3a4b, ASCII_STRING, "TtytddPhoneNumber", "PR_TTYTDD_PHONE_NUMBER"); - public static final MAPIProperty TYPE_OF_MTS_USER = - new MAPIProperty(0xc1c, LONG, "TypeOfMtsUser", "PR_TYPE_OF_MTS_USER"); - public static final MAPIProperty USER_CERTIFICATE = - new MAPIProperty(0x3a22, BINARY, "UserCertificate", "PR_USER_CERTIFICATE"); - public static final MAPIProperty USER_X509_CERTIFICATE = - new MAPIProperty(0x3a70, Types.createCustom(4354), "UserX509Certificate", "PR_USER_X509_CERTIFICATE"); - public static final MAPIProperty VALID_FOLDER_MASK = - new MAPIProperty(0x35df, LONG, "ValidFolderMask", "PR_VALID_FOLDER_MASK"); - public static final MAPIProperty VIEWS_ENTRY_ID = - new MAPIProperty(0x35e5, BINARY, "ViewsEntryId", "PR_VIEWS_ENTRYID"); - public static final MAPIProperty WEDDING_ANNIVERSARY = - new MAPIProperty(0x3a41, TIME, "WeddingAnniversary", "PR_WEDDING_ANNIVERSARY"); - public static final MAPIProperty X400_CONTENT_TYPE = - new MAPIProperty(60, BINARY, "X400ContentType", "PR_X400_CONTENT_TYPE"); - public static final MAPIProperty X400_DEFERRED_DELIVERY_CANCEL = - new MAPIProperty(0x3e09, BOOLEAN, "X400DeferredDeliveryCancel", "PR_X400_DEFERRED_DELIVERY_CANCEL"); - public static final MAPIProperty XPOS = - new MAPIProperty(0x3f05, LONG, "Xpos", "PR_XPOS"); - public static final MAPIProperty YPOS = - new MAPIProperty(0x3f06, LONG, "Ypos", "PR_YPOS"); - - public static final MAPIProperty UNKNOWN = - new MAPIProperty(-1, Types.UNKNOWN, "Unknown", null); - - // 0x8??? ones are outlook specific, and not standard MAPI - // TODO See http://msdn.microsoft.com/en-us/library/ee157150%28v=exchg.80%29 for some - // info on how we might decode them properly in the future - private static final int ID_FIRST_CUSTOM = 0x8000; - private static final int ID_LAST_CUSTOM = 0xFFFE; - - /* --------------------------------------------------------------------- */ - - public final int id; - public final MAPIType usualType; - public final String name; - public final String mapiProperty; - - private MAPIProperty(int id, MAPIType usualType, String name, String mapiProperty) { - this.id = id; - this.usualType = usualType; - this.name = name; - this.mapiProperty = mapiProperty; - - // If it isn't unknown or custom, store it for lookup - if(id == -1 || (id >= ID_FIRST_CUSTOM && id <= ID_LAST_CUSTOM) + private static Map<Integer, MAPIProperty> attributes = new HashMap<Integer, MAPIProperty>(); + + public static final MAPIProperty AB_DEFAULT_DIR = + new MAPIProperty(0x3d06, BINARY, "AbDefaultDir", "PR_AB_DEFAULT_DIR"); + public static final MAPIProperty AB_DEFAULT_PAB = + new MAPIProperty(0x3d07, BINARY, "AbDefaultPab", "PR_AB_DEFAULT_PAB"); + public static final MAPIProperty AB_PROVIDER_ID = + new MAPIProperty(0x3615, BINARY, "AbProviderId", "PR_AB_PROVIDER_ID"); + public static final MAPIProperty AB_PROVIDERS = + new MAPIProperty(0x3d01, BINARY, "AbProviders", "PR_AB_PROVIDERS"); + public static final MAPIProperty AB_SEARCH_PATH = + new MAPIProperty(0x3d05, Types.createCustom(4354), "AbSearchPath", "PR_AB_SEARCH_PATH"); + public static final MAPIProperty AB_SEARCH_PATH_UPDATE = + new MAPIProperty(0x3d11, BINARY, "AbSearchPathUpdate", "PR_AB_SEARCH_PATH_UPDATE"); + public static final MAPIProperty ACCESS = + new MAPIProperty(0xff4, LONG, "Access", "PR_ACCESS"); + public static final MAPIProperty ACCESS_LEVEL = + new MAPIProperty(0xff7, LONG, "AccessLevel", "PR_ACCESS_LEVEL"); + public static final MAPIProperty ACCOUNT = + new MAPIProperty(0x3a00, ASCII_STRING, "Account", "PR_ACCOUNT"); + public static final MAPIProperty ADDRTYPE = + new MAPIProperty(0x3002, ASCII_STRING, "Addrtype", "PR_ADDRTYPE"); + public static final MAPIProperty ALTERNATE_RECIPIENT = + new MAPIProperty(0x3a01, BINARY, "AlternateRecipient", "PR_ALTERNATE_RECIPIENT"); + public static final MAPIProperty ALTERNATE_RECIPIENT_ALLOWED = + new MAPIProperty(2, BOOLEAN, "AlternateRecipientAllowed", "PR_ALTERNATE_RECIPIENT_ALLOWED"); + public static final MAPIProperty ANR = + new MAPIProperty(0x360c, ASCII_STRING, "Anr", "PR_ANR"); + public static final MAPIProperty ASSISTANT = + new MAPIProperty(0x3a30, ASCII_STRING, "Assistant", "PR_ASSISTANT"); + public static final MAPIProperty ASSISTANT_TELEPHONE_NUMBER = + new MAPIProperty(0x3a2e, ASCII_STRING, "AssistantTelephoneNumber", "PR_ASSISTANT_TELEPHONE_NUMBER"); + public static final MAPIProperty ASSOC_CONTENT_COUNT = + new MAPIProperty(0x3617, LONG, "AssocContentCount", "PR_ASSOC_CONTENT_COUNT"); + public static final MAPIProperty ATTACH_ADDITIONAL_INFO = + new MAPIProperty(0x370f, BINARY, "AttachAdditionalInfo", "PR_ATTACH_ADDITIONAL_INFO"); + public static final MAPIProperty ATTACH_CONTENT_BASE = + new MAPIProperty(0x3711, Types.UNKNOWN, "AttachContentBase", "PR_ATTACH_CONTENT_BASE"); + public static final MAPIProperty ATTACH_CONTENT_ID = + new MAPIProperty(0x3712, Types.UNKNOWN, "AttachContentId", "PR_ATTACH_CONTENT_ID"); + public static final MAPIProperty ATTACH_CONTENT_LOCATION = + new MAPIProperty(0x3713, Types.UNKNOWN, "AttachContentLocation", "PR_ATTACH_CONTENT_LOCATION"); + public static final MAPIProperty ATTACH_DATA = + new MAPIProperty(0x3701, BINARY, "AttachData", "PR_ATTACH_DATA_OBJ"); + public static final MAPIProperty ATTACH_DISPOSITION = + new MAPIProperty(0x3716, Types.UNKNOWN, "AttachDisposition", "PR_ATTACH_DISPOSITION"); + public static final MAPIProperty ATTACH_ENCODING = + new MAPIProperty(0x3702, BINARY, "AttachEncoding", "PR_ATTACH_ENCODING"); + public static final MAPIProperty ATTACH_EXTENSION = + new MAPIProperty(0x3703, ASCII_STRING, "AttachExtension", "PR_ATTACH_EXTENSION"); + public static final MAPIProperty ATTACH_FILENAME = + new MAPIProperty(0x3704, ASCII_STRING, "AttachFilename", "PR_ATTACH_FILENAME"); + public static final MAPIProperty ATTACH_FLAGS = + new MAPIProperty(0x3714, Types.UNKNOWN, "AttachFlags", "PR_ATTACH_FLAGS"); + public static final MAPIProperty ATTACH_LONG_FILENAME = + new MAPIProperty(0x3707, ASCII_STRING, "AttachLongFilename", "PR_ATTACH_LONG_FILENAME"); + public static final MAPIProperty ATTACH_LONG_PATHNAME = + new MAPIProperty(0x370d, ASCII_STRING, "AttachLongPathname", "PR_ATTACH_LONG_PATHNAME"); + public static final MAPIProperty ATTACH_METHOD = + new MAPIProperty(0x3705, LONG, "AttachMethod", "PR_ATTACH_METHOD"); + public static final MAPIProperty ATTACH_MIME_SEQUENCE = + new MAPIProperty(0x3710, Types.UNKNOWN, "AttachMimeSequence", "PR_ATTACH_MIME_SEQUENCE"); + public static final MAPIProperty ATTACH_MIME_TAG = + new MAPIProperty(0x370e, ASCII_STRING, "AttachMimeTag", "PR_ATTACH_MIME_TAG"); + public static final MAPIProperty ATTACH_NETSCAPE_MAC_INFO = + new MAPIProperty(0x3715, Types.UNKNOWN, "AttachNetscapeMacInfo", "PR_ATTACH_NETSCAPE_MAC_INFO"); + public static final MAPIProperty ATTACH_NUM = + new MAPIProperty(0xe21, LONG, "AttachNum", "PR_ATTACH_NUM"); + public static final MAPIProperty ATTACH_PATHNAME = + new MAPIProperty(0x3708, ASCII_STRING, "AttachPathname", "PR_ATTACH_PATHNAME"); + public static final MAPIProperty ATTACH_RENDERING = + new MAPIProperty(0x3709, BINARY, "AttachRendering", "PR_ATTACH_RENDERING"); + public static final MAPIProperty ATTACH_SIZE = + new MAPIProperty(0xe20, LONG, "AttachSize", "PR_ATTACH_SIZE"); + public static final MAPIProperty ATTACH_TAG = + new MAPIProperty(0x370a, BINARY, "AttachTag", "PR_ATTACH_TAG"); + public static final MAPIProperty ATTACH_TRANSPORT_NAME = + new MAPIProperty(0x370c, ASCII_STRING, "AttachTransportName", "PR_ATTACH_TRANSPORT_NAME"); + public static final MAPIProperty ATTACHMENT_X400_PARAMETERS = + new MAPIProperty(0x3700, BINARY, "AttachmentX400Parameters", "PR_ATTACHMENT_X400_PARAMETERS"); + public static final MAPIProperty AUTHORIZING_USERS = + new MAPIProperty(3, BINARY, "AuthorizingUsers", "PR_AUTHORIZING_USERS"); + public static final MAPIProperty AUTO_FORWARD_COMMENT = + new MAPIProperty(4, ASCII_STRING, "AutoForwardComment", "PR_AUTO_FORWARD_COMMENT"); + public static final MAPIProperty AUTO_FORWARDED = + new MAPIProperty(5, BOOLEAN, "AutoForwarded", "PR_AUTO_FORWARDED"); + public static final MAPIProperty AUTO_RESPONSE_SUPPRESS = + new MAPIProperty(0x3fdf, Types.UNKNOWN, "AutoResponseSuppress", "PR_AUTO_RESPONSE_SUPPRESS"); + public static final MAPIProperty BIRTHDAY = + new MAPIProperty(0x3a42, TIME, "Birthday", "PR_BIRTHDAY"); + public static final MAPIProperty BODY = + new MAPIProperty(0x1000, ASCII_STRING, "Body", "PR_BODY"); + public static final MAPIProperty BODY_CONTENT_ID = + new MAPIProperty(0x1015, Types.UNKNOWN, "BodyContentId", "PR_BODY_CONTENT_ID"); + public static final MAPIProperty BODY_CONTENT_LOCATION = + new MAPIProperty(0x1014, Types.UNKNOWN, "BodyContentLocation", "PR_BODY_CONTENT_LOCATION"); + public static final MAPIProperty BODY_CRC = + new MAPIProperty(0xe1c, LONG, "BodyCrc", "PR_BODY_CRC"); + public static final MAPIProperty BODY_HTML = + new MAPIProperty(0x1013, Types.UNKNOWN, "BodyHtml", "data"); + public static final MAPIProperty BUSINESS_FAX_NUMBER = + new MAPIProperty(0x3a24, ASCII_STRING, "BusinessFaxNumber", "PR_BUSINESS_FAX_NUMBER"); + public static final MAPIProperty BUSINESS_HOME_PAGE = + new MAPIProperty(0x3a51, ASCII_STRING, "BusinessHomePage", "PR_BUSINESS_HOME_PAGE"); + public static final MAPIProperty CALLBACK_TELEPHONE_NUMBER = + new MAPIProperty(0x3a02, ASCII_STRING, "CallbackTelephoneNumber", "PR_CALLBACK_TELEPHONE_NUMBER"); + public static final MAPIProperty CAR_TELEPHONE_NUMBER = + new MAPIProperty(0x3a1e, ASCII_STRING, "CarTelephoneNumber", "PR_CAR_TELEPHONE_NUMBER"); + public static final MAPIProperty CHILDRENS_NAMES = + new MAPIProperty(0x3a58, Types.createCustom(4126), "ChildrensNames", "PR_CHILDRENS_NAMES"); + public static final MAPIProperty CLIENT_SUBMIT_TIME = + new MAPIProperty(0x39, TIME, "ClientSubmitTime", "PR_CLIENT_SUBMIT_TIME"); + public static final MAPIProperty COMMENT = + new MAPIProperty(0x3004, ASCII_STRING, "Comment", "PR_COMMENT"); + public static final MAPIProperty COMMON_VIEWS_ENTRY_ID = + new MAPIProperty(0x35e6, BINARY, "CommonViewsEntryId", "PR_COMMON_VIEWS_ENTRYID"); + public static final MAPIProperty COMPANY_MAIN_PHONE_NUMBER = + new MAPIProperty(0x3a57, ASCII_STRING, "CompanyMainPhoneNumber", "PR_COMPANY_MAIN_PHONE_NUMBER"); + public static final MAPIProperty COMPANY_NAME = + new MAPIProperty(0x3a16, ASCII_STRING, "CompanyName", "PR_COMPANY_NAME"); + public static final MAPIProperty COMPUTER_NETWORK_NAME = + new MAPIProperty(0x3a49, ASCII_STRING, "ComputerNetworkName", "PR_COMPUTER_NETWORK_NAME"); + public static final MAPIProperty CONTACT_ADDRTYPES = + new MAPIProperty(0x3a54, Types.createCustom(4126), "ContactAddrtypes", "PR_CONTACT_ADDRTYPES"); + public static final MAPIProperty CONTACT_DEFAULT_ADDRESS_INDEX = + new MAPIProperty(0x3a55, LONG, "ContactDefaultAddressIndex", "PR_CONTACT_DEFAULT_ADDRESS_INDEX"); + public static final MAPIProperty CONTACT_EMAIL_ADDRESSES = + new MAPIProperty(0x3a56, Types.createCustom(4126), "ContactEmailAddresses", "PR_CONTACT_EMAIL_ADDRESSES"); + public static final MAPIProperty CONTACT_ENTRY_IDS = + new MAPIProperty(0x3a53, Types.createCustom(4354), "ContactEntryIds", "PR_CONTACT_ENTRYIDS"); + public static final MAPIProperty CONTACT_VERSION = + new MAPIProperty(0x3a52, CLS_ID, "ContactVersion", "PR_CONTACT_VERSION"); + public static final MAPIProperty CONTAINER_CLASS = + new MAPIProperty(0x3613, ASCII_STRING, "ContainerClass", "PR_CONTAINER_CLASS"); + public static final MAPIProperty CONTAINER_CONTENTS = + new MAPIProperty(0x360f, DIRECTORY, "ContainerContents", "PR_CONTAINER_CONTENTS"); + public static final MAPIProperty CONTAINER_FLAGS = + new MAPIProperty(0x3600, LONG, "ContainerFlags", "PR_CONTAINER_FLAGS"); + public static final MAPIProperty CONTAINER_HIERARCHY = + new MAPIProperty(0x360e, DIRECTORY, "ContainerHierarchy", "PR_CONTAINER_HIERARCHY"); + public static final MAPIProperty CONTAINER_MODIFY_VERSION = + new MAPIProperty(0x3614, LONG_LONG, "ContainerModifyVersion", "PR_CONTAINER_MODIFY_VERSION"); + public static final MAPIProperty CONTENT_CONFIDENTIALITY_ALGORITHM_ID = + new MAPIProperty(6, BINARY, "ContentConfidentialityAlgorithmId", "PR_CONTENT_CONFIDENTIALITY_ALGORITHM_ID"); + public static final MAPIProperty CONTENT_CORRELATOR = + new MAPIProperty(7, BINARY, "ContentCorrelator", "PR_CONTENT_CORRELATOR"); + public static final MAPIProperty CONTENT_COUNT = + new MAPIProperty(0x3602, LONG, "ContentCount", "PR_CONTENT_COUNT"); + public static final MAPIProperty CONTENT_IDENTIFIER = + new MAPIProperty(8, ASCII_STRING, "ContentIdentifier", "PR_CONTENT_IDENTIFIER"); + public static final MAPIProperty CONTENT_INTEGRITY_CHECK = + new MAPIProperty(0xc00, BINARY, "ContentIntegrityCheck", "PR_CONTENT_INTEGRITY_CHECK"); + public static final MAPIProperty CONTENT_LENGTH = + new MAPIProperty(9, LONG, "ContentLength", "PR_CONTENT_LENGTH"); + public static final MAPIProperty CONTENT_RETURN_REQUESTED = + new MAPIProperty(10, BOOLEAN, "ContentReturnRequested", "PR_CONTENT_RETURN_REQUESTED"); + public static final MAPIProperty CONTENT_UNREAD = + new MAPIProperty(0x3603, LONG, "ContentUnread", "PR_CONTENT_UNREAD"); + public static final MAPIProperty CONTENTS_SORT_ORDER = + new MAPIProperty(0x360d, Types.createCustom(4099), "ContentsSortOrder", "PR_CONTENTS_SORT_ORDER"); + public static final MAPIProperty CONTROL_FLAGS = + new MAPIProperty(0x3f00, LONG, "ControlFlags", "PR_CONTROL_FLAGS"); + public static final MAPIProperty CONTROL_ID = + new MAPIProperty(0x3f07, BINARY, "ControlId", "PR_CONTROL_ID"); + public static final MAPIProperty CONTROL_STRUCTURE = + new MAPIProperty(0x3f01, BINARY, "ControlStructure", "PR_CONTROL_STRUCTURE"); + public static final MAPIProperty CONTROL_TYPE = + new MAPIProperty(0x3f02, LONG, "ControlType", "PR_CONTROL_TYPE"); + public static final MAPIProperty CONVERSATION_INDEX = + new MAPIProperty(0x71, BINARY, "ConversationIndex", "PR_CONVERSATION_INDEX"); + public static final MAPIProperty CONVERSATION_KEY = + new MAPIProperty(11, BINARY, "ConversationKey", "PR_CONVERSATION_KEY"); + public static final MAPIProperty CONVERSATION_TOPIC = + new MAPIProperty(0x70, ASCII_STRING, "ConversationTopic", "PR_CONVERSATION_TOPIC"); + public static final MAPIProperty CONVERSION_EITS = + new MAPIProperty(12, BINARY, "ConversionEits", "PR_CONVERSION_EITS"); + public static final MAPIProperty CONVERSION_PROHIBITED = + new MAPIProperty(0x3a03, BOOLEAN, "ConversionProhibited", "PR_CONVERSION_PROHIBITED"); + public static final MAPIProperty CONVERSION_WITH_LOSS_PROHIBITED = + new MAPIProperty(13, BOOLEAN, "ConversionWithLossProhibited", "PR_CONVERSION_WITH_LOSS_PROHIBITED"); + public static final MAPIProperty CONVERTED_EITS = + new MAPIProperty(14, BINARY, "ConvertedEits", "PR_CONVERTED_EITS"); + public static final MAPIProperty CORRELATE = + new MAPIProperty(0xe0c, BOOLEAN, "Correlate", "PR_CORRELATE"); + public static final MAPIProperty CORRELATE_MTSID = + new MAPIProperty(0xe0d, BINARY, "CorrelateMtsid", "PR_CORRELATE_MTSID"); + public static final MAPIProperty COUNTRY = + new MAPIProperty(0x3a26, ASCII_STRING, "Country", "PR_COUNTRY"); + public static final MAPIProperty CREATE_TEMPLATES = + new MAPIProperty(0x3604, DIRECTORY, "CreateTemplates", "PR_CREATE_TEMPLATES"); + public static final MAPIProperty CREATION_TIME = + new MAPIProperty(0x3007, TIME, "CreationTime", "PR_CREATION_TIME"); + public static final MAPIProperty CREATION_VERSION = + new MAPIProperty(0xe19, LONG_LONG, "CreationVersion", "PR_CREATION_VERSION"); + public static final MAPIProperty CURRENT_VERSION = + new MAPIProperty(0xe00, LONG_LONG, "CurrentVersion", "PR_CURRENT_VERSION"); + public static final MAPIProperty CUSTOMER_ID = + new MAPIProperty(0x3a4a, ASCII_STRING, "CustomerId", "PR_CUSTOMER_ID"); + public static final MAPIProperty DEF_CREATE_DL = + new MAPIProperty(0x3611, BINARY, "DefCreateDl", "PR_DEF_CREATE_DL"); + public static final MAPIProperty DEF_CREATE_MAILUSER = + new MAPIProperty(0x3612, BINARY, "DefCreateMailuser", "PR_DEF_CREATE_MAILUSER"); + public static final MAPIProperty DEFAULT_PROFILE = + new MAPIProperty(0x3d04, BOOLEAN, "DefaultProfile", "PR_DEFAULT_PROFILE"); + public static final MAPIProperty DEFAULT_STORE = + new MAPIProperty(0x3400, BOOLEAN, "DefaultStore", "PR_DEFAULT_STORE"); + public static final MAPIProperty DEFAULT_VIEW_ENTRY_ID = + new MAPIProperty(0x3616, BINARY, "DefaultViewEntryId", "PR_DEFAULT_VIEW_ENTRYID"); + public static final MAPIProperty DEFERRED_DELIVERY_TIME = + new MAPIProperty(15, TIME, "DeferredDeliveryTime", "PR_DEFERRED_DELIVERY_TIME"); + public static final MAPIProperty DELEGATION = + new MAPIProperty(0x7e, BINARY, "Delegation", "PR_DELEGATION"); + public static final MAPIProperty DELETE_AFTER_SUBMIT = + new MAPIProperty(0xe01, BOOLEAN, "DeleteAfterSubmit", "PR_DELETE_AFTER_SUBMIT"); + public static final MAPIProperty DELIVER_TIME = + new MAPIProperty(0x10, TIME, "DeliverTime", "PR_DELIVER_TIME"); + public static final MAPIProperty DELIVERY_POINT = + new MAPIProperty(0xc07, LONG, "DeliveryPoint", "PR_DELIVERY_POINT"); + public static final MAPIProperty DELTAX = + new MAPIProperty(0x3f03, LONG, "Deltax", "PR_DELTAX"); + public static final MAPIProperty DELTAY = + new MAPIProperty(0x3f04, LONG, "Deltay", "PR_DELTAY"); + public static final MAPIProperty DEPARTMENT_NAME = + new MAPIProperty(0x3a18, ASCII_STRING, "DepartmentName", "PR_DEPARTMENT_NAME"); + public static final MAPIProperty DEPTH = + new MAPIProperty(0x3005, LONG, "Depth", "PR_DEPTH"); + public static final MAPIProperty DETAILS_TABLE = + new MAPIProperty(0x3605, DIRECTORY, "DetailsTable", "PR_DETAILS_TABLE"); + public static final MAPIProperty DISC_VAL = + new MAPIProperty(0x4a, BOOLEAN, "DiscVal", "PR_DISC_VAL"); + public static final MAPIProperty DISCARD_REASON = + new MAPIProperty(0x11, LONG, "DiscardReason", "PR_DISCARD_REASON"); + public static final MAPIProperty DISCLOSE_RECIPIENTS = + new MAPIProperty(0x3a04, BOOLEAN, "DiscloseRecipients", "PR_DISCLOSE_RECIPIENTS"); + public static final MAPIProperty DISCLOSURE_OF_RECIPIENTS = + new MAPIProperty(0x12, BOOLEAN, "DisclosureOfRecipients", "PR_DISCLOSURE_OF_RECIPIENTS"); + public static final MAPIProperty DISCRETE_VALUES = + new MAPIProperty(0xe0e, BOOLEAN, "DiscreteValues", "PR_DISCRETE_VALUES"); + public static final MAPIProperty DISPLAY_BCC = + new MAPIProperty(0xe02, ASCII_STRING, "DisplayBcc", "PR_DISPLAY_BCC"); + public static final MAPIProperty DISPLAY_CC = + new MAPIProperty(0xe03, ASCII_STRING, "DisplayCc", "PR_DISPLAY_CC"); + public static final MAPIProperty DISPLAY_NAME = + new MAPIProperty(0x3001, ASCII_STRING, "DisplayName", "PR_DISPLAY_NAME"); + public static final MAPIProperty DISPLAY_NAME_PREFIX = + new MAPIProperty(0x3a45, ASCII_STRING, "DisplayNamePrefix", "PR_DISPLAY_NAME_PREFIX"); + public static final MAPIProperty DISPLAY_TO = + new MAPIProperty(0xe04, ASCII_STRING, "DisplayTo", "PR_DISPLAY_TO"); + public static final MAPIProperty DISPLAY_TYPE = + new MAPIProperty(0x3900, LONG, "DisplayType", "PR_DISPLAY_TYPE"); + public static final MAPIProperty DL_EXPANSION_HISTORY = + new MAPIProperty(0x13, BINARY, "DlExpansionHistory", "PR_DL_EXPANSION_HISTORY"); + public static final MAPIProperty DL_EXPANSION_PROHIBITED = + new MAPIProperty(20, BOOLEAN, "DlExpansionProhibited", "PR_DL_EXPANSION_PROHIBITED"); + public static final MAPIProperty EMAIL_ADDRESS = + new MAPIProperty(0x3003, ASCII_STRING, "EmailAddress", "PR_EMAIL_ADDRESS"); + public static final MAPIProperty END_DATE = + new MAPIProperty(0x61, TIME, "EndDate", "PR_END_DATE"); + public static final MAPIProperty ENTRY_ID = + new MAPIProperty(0xfff, BINARY, "EntryId", "PR_ENTRYID"); + public static final MAPIProperty EXPAND_BEGIN_TIME = + new MAPIProperty(0x3618, Types.UNKNOWN, "ExpandBeginTime", "PR_EXPAND_BEGIN_TIME"); + public static final MAPIProperty EXPAND_END_TIME = + new MAPIProperty(0x3619, Types.UNKNOWN, "ExpandEndTime", "PR_EXPAND_END_TIME"); + public static final MAPIProperty EXPANDED_BEGIN_TIME = + new MAPIProperty(0x361a, Types.UNKNOWN, "ExpandedBeginTime", "PR_EXPANDED_BEGIN_TIME"); + public static final MAPIProperty EXPANDED_END_TIME = + new MAPIProperty(0x361b, Types.UNKNOWN, "ExpandedEndTime", "PR_EXPANDED_END_TIME"); + public static final MAPIProperty EXPIRY_TIME = + new MAPIProperty(0x15, TIME, "ExpiryTime", "PR_EXPIRY_TIME"); + public static final MAPIProperty EXPLICIT_CONVERSION = + new MAPIProperty(0xc01, LONG, "ExplicitConversion", "PR_EXPLICIT_CONVERSION"); + public static final MAPIProperty FILTERING_HOOKS = + new MAPIProperty(0x3d08, BINARY, "FilteringHooks", "PR_FILTERING_HOOKS"); + public static final MAPIProperty FINDER_ENTRY_ID = + new MAPIProperty(0x35e7, BINARY, "FinderEntryId", "PR_FINDER_ENTRYID"); + public static final MAPIProperty FOLDER_ASSOCIATED_CONTENTS = + new MAPIProperty(0x3610, DIRECTORY, "FolderAssociatedContents", "PR_FOLDER_ASSOCIATED_CONTENTS"); + public static final MAPIProperty FOLDER_TYPE = + new MAPIProperty(0x3601, LONG, "FolderType", "PR_FOLDER_TYPE"); + public static final MAPIProperty FORM_CATEGORY = + new MAPIProperty(0x3304, ASCII_STRING, "FormCategory", "PR_FORM_CATEGORY"); + public static final MAPIProperty FORM_CATEGORY_SUB = + new MAPIProperty(0x3305, ASCII_STRING, "FormCategorySub", "PR_FORM_CATEGORY_SUB"); + public static final MAPIProperty FORM_CLSID = + new MAPIProperty(0x3302, CLS_ID, "FormClsid", "PR_FORM_ClsID"); + public static final MAPIProperty FORM_CONTACT_NAME = + new MAPIProperty(0x3303, ASCII_STRING, "FormContactName", "PR_FORM_CONTACT_NAME"); + public static final MAPIProperty FORM_DESIGNER_GUID = + new MAPIProperty(0x3309, CLS_ID, "FormDesignerGuid", "PR_FORM_DESIGNER_GUID"); + public static final MAPIProperty FORM_DESIGNER_NAME = + new MAPIProperty(0x3308, ASCII_STRING, "FormDesignerName", "PR_FORM_DESIGNER_NAME"); + public static final MAPIProperty FORM_HIDDEN = + new MAPIProperty(0x3307, BOOLEAN, "FormHidden", "PR_FORM_HIDDEN"); + public static final MAPIProperty FORM_HOST_MAP = + new MAPIProperty(0x3306, Types.createCustom(4099), "FormHostMap", "PR_FORM_HOST_MAP"); + public static final MAPIProperty FORM_MESSAGE_BEHAVIOR = + new MAPIProperty(0x330a, LONG, "FormMessageBehavior", "PR_FORM_MESSAGE_BEHAVIOR"); + public static final MAPIProperty FORM_VERSION = + new MAPIProperty(0x3301, ASCII_STRING, "FormVersion", "PR_FORM_VERSION"); + public static final MAPIProperty FTP_SITE = + new MAPIProperty(0x3a4c, ASCII_STRING, "FtpSite", "PR_FTP_SITE"); + public static final MAPIProperty GENDER = + new MAPIProperty(0x3a4d, SHORT, "Gender", "PR_GENDER"); + public static final MAPIProperty GENERATION = + new MAPIProperty(0x3a05, ASCII_STRING, "Generation", "PR_GENERATION"); + public static final MAPIProperty GIVEN_NAME = + new MAPIProperty(0x3a06, ASCII_STRING, "GivenName", "PR_GIVEN_NAME"); + public static final MAPIProperty GOVERNMENT_ID_NUMBER = + new MAPIProperty(0x3a07, ASCII_STRING, "GovernmentIdNumber", "PR_GOVERNMENT_ID_NUMBER"); + public static final MAPIProperty HASATTACH = + new MAPIProperty(0xe1b, BOOLEAN, "Hasattach", "PR_HASATTACH"); + public static final MAPIProperty HEADER_FOLDER_ENTRY_ID = + new MAPIProperty(0x3e0a, BINARY, "HeaderFolderEntryId", "PR_HEADER_FOLDER_ENTRYID"); + public static final MAPIProperty HOBBIES = + new MAPIProperty(0x3a43, ASCII_STRING, "Hobbies", "PR_HOBBIES"); + public static final MAPIProperty HOME2_TELEPHONE_NUMBER = + new MAPIProperty(0x3a2f, ASCII_STRING, "Home2TelephoneNumber", "PR_HOME2_TELEPHONE_NUMBER"); + public static final MAPIProperty HOME_ADDRESS_CITY = + new MAPIProperty(0x3a59, ASCII_STRING, "HomeAddressCity", "PR_HOME_ADDRESS_CITY"); + public static final MAPIProperty HOME_ADDRESS_COUNTRY = + new MAPIProperty(0x3a5a, ASCII_STRING, "HomeAddressCountry", "PR_HOME_ADDRESS_COUNTRY"); + public static final MAPIProperty HOME_ADDRESS_POST_OFFICE_BOX = + new MAPIProperty(0x3a5e, ASCII_STRING, "HomeAddressPostOfficeBox", "PR_HOME_ADDRESS_POST_OFFICE_BOX"); + public static final MAPIProperty HOME_ADDRESS_POSTAL_CODE = + new MAPIProperty(0x3a5b, ASCII_STRING, "HomeAddressPostalCode", "PR_HOME_ADDRESS_POSTAL_CODE"); + public static final MAPIProperty HOME_ADDRESS_STATE_OR_PROVINCE = + new MAPIProperty(0x3a5c, ASCII_STRING, "HomeAddressStateOrProvince", "PR_HOME_ADDRESS_STATE_OR_PROVINCE"); + public static final MAPIProperty HOME_ADDRESS_STREET = + new MAPIProperty(0x3a5d, ASCII_STRING, "HomeAddressStreet", "PR_HOME_ADDRESS_STREET"); + public static final MAPIProperty HOME_FAX_NUMBER = + new MAPIProperty(0x3a25, ASCII_STRING, "HomeFaxNumber", "PR_HOME_FAX_NUMBER"); + public static final MAPIProperty HOME_TELEPHONE_NUMBER = + new MAPIProperty(0x3a09, ASCII_STRING, "HomeTelephoneNumber", "PR_HOME_TELEPHONE_NUMBER"); + public static final MAPIProperty INET_MAIL_OVERRIDE_CHARSET = + new MAPIProperty(0x5903, Types.UNKNOWN, "INetMailOverrideCharset", "Charset"); + public static final MAPIProperty INET_MAIL_OVERRIDE_FORMAT = + new MAPIProperty(0x5902, Types.UNKNOWN, "INetMailOverrideFormat", "Format"); + public static final MAPIProperty ICON = + new MAPIProperty(0xffd, BINARY, "Icon", "PR_ICON"); + public static final MAPIProperty IDENTITY_DISPLAY = + new MAPIProperty(0x3e00, ASCII_STRING, "IdentityDisplay", "PR_IDENTITY_DISPLAY"); + public static final MAPIProperty IDENTITY_ENTRY_ID = + new MAPIProperty(0x3e01, BINARY, "IdentityEntryId", "PR_IDENTITY_ENTRYID"); + public static final MAPIProperty IDENTITY_SEARCH_KEY = + new MAPIProperty(0x3e05, BINARY, "IdentitySearchKey", "PR_IDENTITY_SEARCH_KEY"); + public static final MAPIProperty IMPLICIT_CONVERSION_PROHIBITED = + new MAPIProperty(0x16, BOOLEAN, "ImplicitConversionProhibited", "PR_IMPLICIT_CONVERSION_PROHIBITED"); + public static final MAPIProperty IMPORTANCE = + new MAPIProperty(0x17, LONG, "Importance", "PR_IMPORTANCE"); + public static final MAPIProperty IN_REPLY_TO_ID = + new MAPIProperty(0x1042, Types.UNKNOWN, "InReplyToId", "PR_IN_REPLY_TO_ID"); + public static final MAPIProperty INCOMPLETE_COPY = + new MAPIProperty(0x35, BOOLEAN, "IncompleteCopy", "PR_INCOMPLETE_COPY"); + public static final MAPIProperty INITIAL_DETAILS_PANE = + new MAPIProperty(0x3f08, LONG, "InitialDetailsPane", "PR_INITIAL_DETAILS_PANE"); + public static final MAPIProperty INITIALS = + new MAPIProperty(0x3a0a, ASCII_STRING, "Initials", "PR_INITIALS"); + public static final MAPIProperty INSTANCE_KEY = + new MAPIProperty(0xff6, BINARY, "InstanceKey", "PR_INSTANCE_KEY"); + public static final MAPIProperty INTERNET_APPROVED = + new MAPIProperty(0x1030, ASCII_STRING, "InternetApproved", "PR_INTERNET_APPROVED"); + public static final MAPIProperty INTERNET_ARTICLE_NUMBER = + new MAPIProperty(0xe23, LONG, "InternetArticleNumber", "PR_INTERNET_ARTICLE_NUMBER"); + public static final MAPIProperty INTERNET_CPID = + new MAPIProperty(0x3fde, Types.LONG, "InternetCPID", "PR_INTERNET_CPID"); + public static final MAPIProperty INTERNET_CONTROL = + new MAPIProperty(0x1031, ASCII_STRING, "InternetControl", "PR_INTERNET_CONTROL"); + public static final MAPIProperty INTERNET_DISTRIBUTION = + new MAPIProperty(0x1032, ASCII_STRING, "InternetDistribution", "PR_INTERNET_DISTRIBUTION"); + public static final MAPIProperty INTERNET_FOLLOWUP_TO = + new MAPIProperty(0x1033, ASCII_STRING, "InternetFollowupTo", "PR_INTERNET_FOLLOWUP_TO"); + public static final MAPIProperty INTERNET_LINES = + new MAPIProperty(0x1034, LONG, "InternetLines", "PR_INTERNET_LINES"); + public static final MAPIProperty INTERNET_MESSAGE_ID = + new MAPIProperty(0x1035, ASCII_STRING, "InternetMessageId", "PR_INTERNET_MESSAGE_ID"); + public static final MAPIProperty INTERNET_NEWSGROUPS = + new MAPIProperty(0x1036, ASCII_STRING, "InternetNewsgroups", "PR_INTERNET_NEWSGROUPS"); + public static final MAPIProperty INTERNET_NNTP_PATH = + new MAPIProperty(0x1038, ASCII_STRING, "InternetNntpPath", "PR_INTERNET_NNTP_PATH"); + public static final MAPIProperty INTERNET_ORGANIZATION = + new MAPIProperty(0x1037, ASCII_STRING, "InternetOrganization", "PR_INTERNET_ORGANIZATION"); + public static final MAPIProperty INTERNET_PRECEDENCE = + new MAPIProperty(0x1041, ASCII_STRING, "InternetPrecedence", "PR_INTERNET_PRECEDENCE"); + public static final MAPIProperty INTERNET_REFERENCES = + new MAPIProperty(0x1039, ASCII_STRING, "InternetReferences", "PR_INTERNET_REFERENCES"); + public static final MAPIProperty IPM_ID = + new MAPIProperty(0x18, BINARY, "IpmId", "PR_IPM_ID"); + public static final MAPIProperty IPM_OUTBOX_ENTRY_ID = + new MAPIProperty(0x35e2, BINARY, "IpmOutboxEntryId", "PR_IPM_OUTBOX_ENTRYID"); + public static final MAPIProperty IPM_OUTBOX_SEARCH_KEY = + new MAPIProperty(0x3411, BINARY, "IpmOutboxSearchKey", "PR_IPM_OUTBOX_SEARCH_KEY"); + public static final MAPIProperty IPM_RETURN_REQUESTED = + new MAPIProperty(0xc02, BOOLEAN, "IpmReturnRequested", "PR_IPM_RETURN_REQUESTED"); + public static final MAPIProperty IPM_SENTMAIL_ENTRY_ID = + new MAPIProperty(0x35e4, BINARY, "IpmSentmailEntryId", "PR_IPM_SENTMAIL_ENTRYID"); + public static final MAPIProperty IPM_SENTMAIL_SEARCH_KEY = + new MAPIProperty(0x3413, BINARY, "IpmSentmailSearchKey", "PR_IPM_SENTMAIL_SEARCH_KEY"); + public static final MAPIProperty IPM_SUBTREE_ENTRY_ID = + new MAPIProperty(0x35e0, BINARY, "IpmSubtreeEntryId", "PR_IPM_SUBTREE_ENTRYID"); + public static final MAPIProperty IPM_SUBTREE_SEARCH_KEY = + new MAPIProperty(0x3410, BINARY, "IpmSubtreeSearchKey", "PR_IPM_SUBTREE_SEARCH_KEY"); + public static final MAPIProperty IPM_WASTEBASKET_ENTRY_ID = + new MAPIProperty(0x35e3, BINARY, "IpmWastebasketEntryId", "PR_IPM_WASTEBASKET_ENTRYID"); + public static final MAPIProperty IPM_WASTEBASKET_SEARCH_KEY = + new MAPIProperty(0x3412, BINARY, "IpmWastebasketSearchKey", "PR_IPM_WASTEBASKET_SEARCH_KEY"); + public static final MAPIProperty ISDN_NUMBER = + new MAPIProperty(0x3a2d, ASCII_STRING, "IsdnNumber", "PR_ISDN_NUMBER"); + public static final MAPIProperty KEYWORD = + new MAPIProperty(0x3a0b, ASCII_STRING, "Keyword", "PR_KEYWORD"); + public static final MAPIProperty LANGUAGE = + new MAPIProperty(0x3a0c, ASCII_STRING, "Language", "PR_LANGUAGE"); + public static final MAPIProperty LANGUAGES = + new MAPIProperty(0x2f, ASCII_STRING, "Languages", "PR_LANGUAGES"); + public static final MAPIProperty LAST_MODIFICATION_TIME = + new MAPIProperty(0x3008, TIME, "LastModificationTime", "PR_LAST_MODIFICATION_TIME"); + public static final MAPIProperty LATEST_DELIVERY_TIME = + new MAPIProperty(0x19, TIME, "LatestDeliveryTime", "PR_LATEST_DELIVERY_TIME"); + public static final MAPIProperty LIST_HELP = + new MAPIProperty(0x1043, Types.UNKNOWN, "ListHelp", "PR_LIST_HELP"); + public static final MAPIProperty LIST_SUBSCRIBE = + new MAPIProperty(0x1044, Types.UNKNOWN, "ListSubscribe", "PR_LIST_SUBSCRIBE"); + public static final MAPIProperty LIST_UNSUBSCRIBE = + new MAPIProperty(0x1045, Types.UNKNOWN, "ListUnsubscribe", "PR_LIST_UNSUBSCRIBE"); + public static final MAPIProperty LOCALITY = + new MAPIProperty(0x3a27, ASCII_STRING, "Locality", "PR_LOCALITY"); + public static final MAPIProperty LOCALLY_DELIVERED = + new MAPIProperty(0x6745, Types.UNKNOWN, "LocallyDelivered", "ptagLocallyDelivered"); + public static final MAPIProperty LOCATION = + new MAPIProperty(0x3a0d, ASCII_STRING, "Location", "PR_LOCATION"); + public static final MAPIProperty LOCK_BRANCH_ID = + new MAPIProperty(0x3800, Types.UNKNOWN, "LockBranchId", "PR_LOCK_BRANCH_ID"); + public static final MAPIProperty LOCK_DEPTH = + new MAPIProperty(0x3808, Types.UNKNOWN, "LockDepth", "PR_LOCK_DEPTH"); + public static final MAPIProperty LOCK_ENLISTMENT_CONTEXT = + new MAPIProperty(0x3804, Types.UNKNOWN, "LockEnlistmentContext", "PR_LOCK_ENLISTMENT_CONTEXT"); + public static final MAPIProperty LOCK_EXPIRY_TIME = + new MAPIProperty(0x380a, Types.UNKNOWN, "LockExpiryTime", "PR_LOCK_EXPIRY_TIME"); + public static final MAPIProperty LOCK_PERSISTENT = + new MAPIProperty(0x3807, Types.UNKNOWN, "LockPersistent", "PR_LOCK_PERSISTENT"); + public static final MAPIProperty LOCK_RESOURCE_DID = + new MAPIProperty(0x3802, Types.UNKNOWN, "LockResourceDid", "PR_LOCK_RESOURCE_DID"); + public static final MAPIProperty LOCK_RESOURCE_FID = + new MAPIProperty(0x3801, Types.UNKNOWN, "LockResourceFid", "PR_LOCK_RESOURCE_FID"); + public static final MAPIProperty LOCK_RESOURCE_MID = + new MAPIProperty(0x3803, Types.UNKNOWN, "LockResourceMid", "PR_LOCK_RESOURCE_MID"); + public static final MAPIProperty LOCK_SCOPE = + new MAPIProperty(0x3806, Types.UNKNOWN, "LockScope", "PR_LOCK_SCOPE"); + public static final MAPIProperty LOCK_TIMEOUT = + new MAPIProperty(0x3809, Types.UNKNOWN, "LockTimeout", "PR_LOCK_TIMEOUT"); + public static final MAPIProperty LOCK_TYPE = + new MAPIProperty(0x3805, Types.UNKNOWN, "LockType", "PR_LOCK_TYPE"); + public static final MAPIProperty MAIL_PERMISSION = + new MAPIProperty(0x3a0e, BOOLEAN, "MailPermission", "PR_MAIL_PERMISSION"); + public static final MAPIProperty MANAGER_NAME = + new MAPIProperty(0x3a4e, ASCII_STRING, "ManagerName", "PR_MANAGER_NAME"); + public static final MAPIProperty MAPPING_SIGNATURE = + new MAPIProperty(0xff8, BINARY, "MappingSignature", "PR_MAPPING_SIGNATURE"); + public static final MAPIProperty MDB_PROVIDER = + new MAPIProperty(0x3414, BINARY, "MdbProvider", "PR_MDB_PROVIDER"); + public static final MAPIProperty MESSAGE_ATTACHMENTS = + new MAPIProperty(0xe13, DIRECTORY, "MessageAttachments", "PR_MESSAGE_ATTACHMENTS"); + public static final MAPIProperty MESSAGE_CC_ME = + new MAPIProperty(0x58, BOOLEAN, "MessageCcMe", "PR_MESSAGE_CC_ME"); + public static final MAPIProperty MESSAGE_CLASS = + new MAPIProperty(0x1a, ASCII_STRING, "MessageClass", "PR_MESSAGE_CLASS"); + public static final MAPIProperty MESSAGE_CODEPAGE = + new MAPIProperty(0x3ffd, Types.LONG, "MessageCodepage", "PR_MESSAGE_CODEPAGE"); + public static final MAPIProperty MESSAGE_DELIVERY_ID = + new MAPIProperty(0x1b, BINARY, "MessageDeliveryId", "PR_MESSAGE_DELIVERY_ID"); + public static final MAPIProperty MESSAGE_DELIVERY_TIME = + new MAPIProperty(0xe06, TIME, "MessageDeliveryTime", "PR_MESSAGE_DELIVERY_TIME"); + public static final MAPIProperty MESSAGE_DOWNLOAD_TIME = + new MAPIProperty(0xe18, LONG, "MessageDownloadTime", "PR_MESSAGE_DOWNLOAD_TIME"); + public static final MAPIProperty MESSAGE_FLAGS = + new MAPIProperty(0xe07, LONG, "MessageFlags", "PR_MESSAGE_FLAGS"); + public static final MAPIProperty MESSAGE_RECIP_ME = + new MAPIProperty(0x59, BOOLEAN, "MessageRecipMe", "PR_MESSAGE_RECIP_ME"); + public static final MAPIProperty MESSAGE_RECIPIENTS = + new MAPIProperty(0xe12, DIRECTORY, "MessageRecipients", "PR_MESSAGE_RECIPIENTS"); + public static final MAPIProperty MESSAGE_SECURITY_LABEL = + new MAPIProperty(30, BINARY, "MessageSecurityLabel", "PR_MESSAGE_SECURITY_LABEL"); + public static final MAPIProperty MESSAGE_SIZE = + new MAPIProperty(0xe08, LONG, "MessageSize", "PR_MESSAGE_SIZE"); + public static final MAPIProperty MESSAGE_SUBMISSION_ID = + new MAPIProperty(0x47, BINARY, "MessageSubmissionId", "PR_MESSAGE_SUBMISSION_ID"); + public static final MAPIProperty MESSAGE_TO_ME = + new MAPIProperty(0x57, BOOLEAN, "MessageToMe", "PR_MESSAGE_TO_ME"); + public static final MAPIProperty MESSAGE_TOKEN = + new MAPIProperty(0xc03, BINARY, "MessageToken", "PR_MESSAGE_TOKEN"); + public static final MAPIProperty MHS_COMMON_NAME = + new MAPIProperty(0x3a0f, ASCII_STRING, "MhsCommonName", "PR_MHS_COMMON_NAME"); + public static final MAPIProperty MIDDLE_NAME = + new MAPIProperty(0x3a44, ASCII_STRING, "MiddleName", "PR_MIDDLE_NAME"); + public static final MAPIProperty MINI_ICON = + new MAPIProperty(0xffc, BINARY, "MiniIcon", "PR_MINI_ICON"); + public static final MAPIProperty MOBILE_TELEPHONE_NUMBER = + new MAPIProperty(0x3a1c, ASCII_STRING, "MobileTelephoneNumber", "PR_MOBILE_TELEPHONE_NUMBER"); + public static final MAPIProperty MODIFY_VERSION = + new MAPIProperty(0xe1a, LONG_LONG, "ModifyVersion", "PR_MODIFY_VERSION"); + public static final MAPIProperty MSG_STATUS = + new MAPIProperty(0xe17, LONG, "MsgStatus", "PR_MSG_STATUS"); + public static final MAPIProperty NDR_DIAG_CODE = + new MAPIProperty(0xc05, LONG, "NdrDiagCode", "PR_NDR_DIAG_CODE"); + public static final MAPIProperty NDR_REASON_CODE = + new MAPIProperty(0xc04, LONG, "NdrReasonCode", "PR_NDR_REASON_CODE"); + public static final MAPIProperty NDR_STATUS_CODE = + new MAPIProperty(0xc20, Types.UNKNOWN, "NdrStatusCode", "PR_NDR_STATUS_CODE"); + public static final MAPIProperty NEWSGROUP_NAME = + new MAPIProperty(0xe24, ASCII_STRING, "NewsgroupName", "PR_NEWSGROUP_NAME"); + public static final MAPIProperty NICKNAME = + new MAPIProperty(0x3a4f, ASCII_STRING, "Nickname", "PR_NICKNAME"); + public static final MAPIProperty NNTP_XREF = + new MAPIProperty(0x1040, ASCII_STRING, "NntpXref", "PR_NNTP_XREF"); + public static final MAPIProperty NON_RECEIPT_NOTIFICATION_REQUESTED = + new MAPIProperty(0xc06, BOOLEAN, "NonReceiptNotificationRequested", "PR_NON_RECEIPT_NOTIFICATION_REQUESTED"); + public static final MAPIProperty NON_RECEIPT_REASON = + new MAPIProperty(0x3e, LONG, "NonReceiptReason", "PR_NON_RECEIPT_REASON"); + public static final MAPIProperty NORMALIZED_SUBJECT = + new MAPIProperty(0xe1d, ASCII_STRING, "NormalizedSubject", "PR_NORMALIZED_SUBJECT"); + public static final MAPIProperty NT_SECURITY_DESCRIPTOR = + new MAPIProperty(0xe27, Types.UNKNOWN, "NtSecurityDescriptor", "PR_NT_SECURITY_DESCRIPTOR"); + public static final MAPIProperty NULL = + new MAPIProperty(1, LONG, "Null", "PR_NULL"); + public static final MAPIProperty OBJECT_TYPE = + new MAPIProperty(0xffe, LONG, "ObjectType", "PR_Object_TYPE"); + public static final MAPIProperty OBSOLETED_IPMS = + new MAPIProperty(0x1f, BINARY, "ObsoletedIpms", "PR_OBSOLETED_IPMS"); + public static final MAPIProperty OFFICE2_TELEPHONE_NUMBER = + new MAPIProperty(0x3a1b, ASCII_STRING, "Office2TelephoneNumber", "PR_OFFICE2_TELEPHONE_NUMBER"); + public static final MAPIProperty OFFICE_LOCATION = + new MAPIProperty(0x3a19, ASCII_STRING, "OfficeLocation", "PR_OFFICE_LOCATION"); + public static final MAPIProperty OFFICE_TELEPHONE_NUMBER = + new MAPIProperty(0x3a08, ASCII_STRING, "OfficeTelephoneNumber", "PR_OFFICE_TELEPHONE_NUMBER"); + public static final MAPIProperty OOF_REPLY_TYPE = + new MAPIProperty(0x4080, Types.UNKNOWN, "OofReplyType", "PR_OOF_REPLY_TYPE"); + public static final MAPIProperty ORGANIZATIONAL_ID_NUMBER = + new MAPIProperty(0x3a10, ASCII_STRING, "OrganizationalIdNumber", "PR_ORGANIZATIONAL_ID_NUMBER"); + public static final MAPIProperty ORIG_ENTRY_ID = + new MAPIProperty(0x300f, Types.UNKNOWN, "OrigEntryId", "PR_ORIG_ENTRYID"); + public static final MAPIProperty ORIG_MESSAGE_CLASS = + new MAPIProperty(0x4b, ASCII_STRING, "OrigMessageClass", "PR_ORIG_MESSAGE_CLASS"); + public static final MAPIProperty ORIGIN_CHECK = + new MAPIProperty(0x27, BINARY, "OriginCheck", "PR_ORIGIN_CHECK"); + public static final MAPIProperty ORIGINAL_AUTHOR_ADDRTYPE = + new MAPIProperty(0x79, ASCII_STRING, "OriginalAuthorAddrtype", "PR_ORIGINAL_AUTHOR_ADDRTYPE"); + public static final MAPIProperty ORIGINAL_AUTHOR_EMAIL_ADDRESS = + new MAPIProperty(0x7a, ASCII_STRING, "OriginalAuthorEmailAddress", "PR_ORIGINAL_AUTHOR_EMAIL_ADDRESS"); + public static final MAPIProperty ORIGINAL_AUTHOR_ENTRY_ID = + new MAPIProperty(0x4c, BINARY, "OriginalAuthorEntryId", "PR_ORIGINAL_AUTHOR_ENTRYID"); + public static final MAPIProperty ORIGINAL_AUTHOR_NAME = + new MAPIProperty(0x4d, ASCII_STRING, "OriginalAuthorName", "PR_ORIGINAL_AUTHOR_NAME"); + public static final MAPIProperty ORIGINAL_AUTHOR_SEARCH_KEY = + new MAPIProperty(0x56, BINARY, "OriginalAuthorSearchKey", "PR_ORIGINAL_AUTHOR_SEARCH_KEY"); + public static final MAPIProperty ORIGINAL_DELIVERY_TIME = + new MAPIProperty(0x55, TIME, "OriginalDeliveryTime", "PR_ORIGINAL_DELIVERY_TIME"); + public static final MAPIProperty ORIGINAL_DISPLAY_BCC = + new MAPIProperty(0x72, ASCII_STRING, "OriginalDisplayBcc", "PR_ORIGINAL_DISPLAY_BCC"); + public static final MAPIProperty ORIGINAL_DISPLAY_CC = + new MAPIProperty(0x73, ASCII_STRING, "OriginalDisplayCc", "PR_ORIGINAL_DISPLAY_CC"); + public static final MAPIProperty ORIGINAL_DISPLAY_NAME = + new MAPIProperty(0x3a13, ASCII_STRING, "OriginalDisplayName", "PR_ORIGINAL_DISPLAY_NAME"); + public static final MAPIProperty ORIGINAL_DISPLAY_TO = + new MAPIProperty(0x74, ASCII_STRING, "OriginalDisplayTo", "PR_ORIGINAL_DISPLAY_TO"); + public static final MAPIProperty ORIGINAL_EITS = + new MAPIProperty(0x21, BINARY, "OriginalEits", "PR_ORIGINAL_EITS"); + public static final MAPIProperty ORIGINAL_ENTRY_ID = + new MAPIProperty(0x3a12, BINARY, "OriginalEntryId", "PR_ORIGINAL_ENTRYID"); + public static final MAPIProperty ORIGINAL_SEARCH_KEY = + new MAPIProperty(0x3a14, BINARY, "OriginalSearchKey", "PR_ORIGINAL_SEARCH_KEY"); + public static final MAPIProperty ORIGINAL_SENDER_ADDRTYPE = + new MAPIProperty(0x66, ASCII_STRING, "OriginalSenderAddrtype", "PR_ORIGINAL_SENDER_ADDRTYPE"); + public static final MAPIProperty ORIGINAL_SENDER_EMAIL_ADDRESS = + new MAPIProperty(0x67, ASCII_STRING, "OriginalSenderEmailAddress", "PR_ORIGINAL_SENDER_EMAIL_ADDRESS"); + public static final MAPIProperty ORIGINAL_SENDER_ENTRY_ID = + new MAPIProperty(0x5b, BINARY, "OriginalSenderEntryId", "PR_ORIGINAL_SENDER_ENTRYID"); + public static final MAPIProperty ORIGINAL_SENDER_NAME = + new MAPIProperty(90, ASCII_STRING, "OriginalSenderName", "PR_ORIGINAL_SENDER_NAME"); + public static final MAPIProperty ORIGINAL_SENDER_SEARCH_KEY = + new MAPIProperty(0x5c, BINARY, "OriginalSenderSearchKey", "PR_ORIGINAL_SENDER_SEARCH_KEY"); + public static final MAPIProperty ORIGINAL_SENSITIVITY = + new MAPIProperty(0x2e, LONG, "OriginalSensitivity", "PR_ORIGINAL_SENSITIVITY"); + public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_ADDRTYPE = + new MAPIProperty(0x68, ASCII_STRING, "OriginalSentRepresentingAddrtype", "PR_ORIGINAL_SENT_REPRESENTING_ADDRTYPE"); + public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS = + new MAPIProperty(0x69, ASCII_STRING, "OriginalSentRepresentingEmailAddress", "PR_ORIGINAL_SENT_REPRESENTING_EMAIL_ADDRESS"); + public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_ENTRY_ID = + new MAPIProperty(0x5e, BINARY, "OriginalSentRepresentingEntryId", "PR_ORIGINAL_SENT_REPRESENTING_ENTRYID"); + public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_NAME = + new MAPIProperty(0x5d, ASCII_STRING, "OriginalSentRepresentingName", "PR_ORIGINAL_SENT_REPRESENTING_NAME"); + public static final MAPIProperty ORIGINAL_SENT_REPRESENTING_SEARCH_KEY = + new MAPIProperty(0x5f, BINARY, "OriginalSentRepresentingSearchKey", "PR_ORIGINAL_SENT_REPRESENTING_SEARCH_KEY"); + public static final MAPIProperty ORIGINAL_SUBJECT = + new MAPIProperty(0x49, ASCII_STRING, "OriginalSubject", "PR_ORIGINAL_SUBJECT"); + public static final MAPIProperty ORIGINAL_SUBMIT_TIME = + new MAPIProperty(0x4e, TIME, "OriginalSubmitTime", "PR_ORIGINAL_SUBMIT_TIME"); + public static final MAPIProperty ORIGINALLY_INTENDED_RECIP_ADDRTYPE = + new MAPIProperty(0x7b, ASCII_STRING, "OriginallyIntendedRecipAddrtype", "PR_ORIGINALLY_INTENDED_RECIP_ADDRTYPE"); + public static final MAPIProperty ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS = + new MAPIProperty(0x7c, ASCII_STRING, "OriginallyIntendedRecipEmailAddress", "PR_ORIGINALLY_INTENDED_RECIP_EMAIL_ADDRESS"); + public static final MAPIProperty ORIGINALLY_INTENDED_RECIP_ENTRY_ID = + new MAPIProperty(0x1012, BINARY, "OriginallyIntendedRecipEntryId", "PR_ORIGINALLY_INTENDED_RECIP_ENTRYID"); + public static final MAPIProperty ORIGINALLY_INTENDED_RECIPIENT_NAME = + new MAPIProperty(0x20, BINARY, "OriginallyIntendedRecipientName", "PR_ORIGINALLY_INTENDED_RECIPIENT_NAME"); + public static final MAPIProperty ORIGINATING_MTA_CERTIFICATE = + new MAPIProperty(0xe25, BINARY, "OriginatingMtaCertificate", "PR_ORIGINATING_MTA_CERTIFICATE"); + public static final MAPIProperty ORIGINATOR_AND_DL_EXPANSION_HISTORY = + new MAPIProperty(0x1002, BINARY, "OriginatorAndDlExpansionHistory", "PR_ORIGINATOR_AND_DL_EXPANSION_HISTORY"); + public static final MAPIProperty ORIGINATOR_CERTIFICATE = + new MAPIProperty(0x22, BINARY, "OriginatorCertificate", "PR_ORIGINATOR_CERTIFICATE"); + public static final MAPIProperty ORIGINATOR_DELIVERY_REPORT_REQUESTED = + new MAPIProperty(0x23, BOOLEAN, "OriginatorDeliveryReportRequested", "PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED"); + public static final MAPIProperty ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED = + new MAPIProperty(0xc08, BOOLEAN, "OriginatorNonDeliveryReportRequested", "PR_ORIGINATOR_NON_DELIVERY_REPORT_REQUESTED"); + public static final MAPIProperty ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT = + new MAPIProperty(0xc09, BINARY, "OriginatorRequestedAlternateRecipient", "PR_ORIGINATOR_REQUESTED_ALTERNATE_RECIPIENT"); + public static final MAPIProperty ORIGINATOR_RETURN_ADDRESS = + new MAPIProperty(0x24, BINARY, "OriginatorReturnAddress", "PR_ORIGINATOR_RETURN_ADDRESS"); + public static final MAPIProperty OTHER_ADDRESS_CITY = + new MAPIProperty(0x3a5f, ASCII_STRING, "OtherAddressCity", "PR_OTHER_ADDRESS_CITY"); + public static final MAPIProperty OTHER_ADDRESS_COUNTRY = + new MAPIProperty(0x3a60, ASCII_STRING, "OtherAddressCountry", "PR_OTHER_ADDRESS_COUNTRY"); + public static final MAPIProperty OTHER_ADDRESS_POST_OFFICE_BOX = + new MAPIProperty(0x3a64, ASCII_STRING, "OtherAddressPostOfficeBox", "PR_OTHER_ADDRESS_POST_OFFICE_BOX"); + public static final MAPIProperty OTHER_ADDRESS_POSTAL_CODE = + new MAPIProperty(0x3a61, ASCII_STRING, "OtherAddressPostalCode", "PR_OTHER_ADDRESS_POSTAL_CODE"); + public static final MAPIProperty OTHER_ADDRESS_STATE_OR_PROVINCE = + new MAPIProperty(0x3a62, ASCII_STRING, "OtherAddressStateOrProvince", "PR_OTHER_ADDRESS_STATE_OR_PROVINCE"); + public static final MAPIProperty OTHER_ADDRESS_STREET = + new MAPIProperty(0x3a63, ASCII_STRING, "OtherAddressStreet", "PR_OTHER_ADDRESS_STREET"); + public static final MAPIProperty OTHER_TELEPHONE_NUMBER = + new MAPIProperty(0x3a1f, ASCII_STRING, "OtherTelephoneNumber", "PR_OTHER_TELEPHONE_NUMBER"); + public static final MAPIProperty OWN_STORE_ENTRY_ID = + new MAPIProperty(0x3e06, BINARY, "OwnStoreEntryId", "PR_OWN_STORE_ENTRYID"); + public static final MAPIProperty OWNER_APPT_ID = + new MAPIProperty(0x62, LONG, "OwnerApptId", "PR_OWNER_APPT_ID"); + public static final MAPIProperty PAGER_TELEPHONE_NUMBER = + new MAPIProperty(0x3a21, ASCII_STRING, "PagerTelephoneNumber", "PR_PAGER_TELEPHONE_NUMBER"); + public static final MAPIProperty PARENT_DISPLAY = + new MAPIProperty(0xe05, ASCII_STRING, "ParentDisplay", "PR_PARENT_DISPLAY"); + public static final MAPIProperty PARENT_ENTRY_ID = + new MAPIProperty(0xe09, BINARY, "ParentEntryId", "PR_PARENT_ENTRYID"); + public static final MAPIProperty PARENT_KEY = + new MAPIProperty(0x25, BINARY, "ParentKey", "PR_PARENT_KEY"); + public static final MAPIProperty PERSONAL_HOME_PAGE = + new MAPIProperty(0x3a50, ASCII_STRING, "PersonalHomePage", "PR_PERSONAL_HOME_PAGE"); + public static final MAPIProperty PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY = + new MAPIProperty(0xc0a, BOOLEAN, "PhysicalDeliveryBureauFaxDelivery", "PR_PHYSICAL_DELIVERY_BUREAU_FAX_DELIVERY"); + public static final MAPIProperty PHYSICAL_DELIVERY_MODE = + new MAPIProperty(0xc0b, LONG, "PhysicalDeliveryMode", "PR_PHYSICAL_DELIVERY_MODE"); + public static final MAPIProperty PHYSICAL_DELIVERY_REPORT_REQUEST = + new MAPIProperty(0xc0c, LONG, "PhysicalDeliveryReportRequest", "PR_PHYSICAL_DELIVERY_REPORT_REQUEST"); + public static final MAPIProperty PHYSICAL_FORWARDING_ADDRESS = + new MAPIProperty(0xc0d, BINARY, "PhysicalForwardingAddress", "PR_PHYSICAL_FORWARDING_ADDRESS"); + public static final MAPIProperty PHYSICAL_FORWARDING_ADDRESS_REQUESTED = + new MAPIProperty(0xc0e, BOOLEAN, "PhysicalForwardingAddressRequested", "PR_PHYSICAL_FORWARDING_ADDRESS_REQUESTED"); + public static final MAPIProperty PHYSICAL_FORWARDING_PROHIBITED = + new MAPIProperty(0xc0f, BOOLEAN, "PhysicalForwardingProhibited", "PR_PHYSICAL_FORWARDING_PROHIBITED"); + public static final MAPIProperty PHYSICAL_RENDITION_ATTRIBUTES = + new MAPIProperty(0xc10, BINARY, "PhysicalRenditionAttributes", "PR_PHYSICAL_RENDITION_ATTRIBUTES"); + public static final MAPIProperty POST_FOLDER_ENTRIES = + new MAPIProperty(0x103b, BINARY, "PostFolderEntries", "PR_POST_FOLDER_ENTRIES"); + public static final MAPIProperty POST_FOLDER_NAMES = + new MAPIProperty(0x103c, ASCII_STRING, "PostFolderNames", "PR_POST_FOLDER_NAMES"); + public static final MAPIProperty POST_OFFICE_BOX = + new MAPIProperty(0x3a2b, ASCII_STRING, "PostOfficeBox", "PR_POST_OFFICE_BOX"); + public static final MAPIProperty POST_REPLY_DENIED = + new MAPIProperty(0x103f, BINARY, "PostReplyDenied", "PR_POST_REPLY_DENIED"); + public static final MAPIProperty POST_REPLY_FOLDER_ENTRIES = + new MAPIProperty(0x103d, BINARY, "PostReplyFolderEntries", "PR_POST_REPLY_FOLDER_ENTRIES"); + public static final MAPIProperty POST_REPLY_FOLDER_NAMES = + new MAPIProperty(0x103e, ASCII_STRING, "PostReplyFolderNames", "PR_POST_REPLY_FOLDER_NAMES"); + public static final MAPIProperty POSTAL_ADDRESS = + new MAPIProperty(0x3a15, ASCII_STRING, "PostalAddress", "PR_POSTAL_ADDRESS"); + public static final MAPIProperty POSTAL_CODE = + new MAPIProperty(0x3a2a, ASCII_STRING, "PostalCode", "PR_POSTAL_CODE"); + public static final MAPIProperty PREPROCESS = + new MAPIProperty(0xe22, BOOLEAN, "Preprocess", "PR_PREPROCESS"); + public static final MAPIProperty PRIMARY_CAPABILITY = + new MAPIProperty(0x3904, BINARY, "PrimaryCapability", "PR_PRIMARY_CAPABILITY"); + public static final MAPIProperty PRIMARY_FAX_NUMBER = + new MAPIProperty(0x3a23, ASCII_STRING, "PrimaryFaxNumber", "PR_PRIMARY_FAX_NUMBER"); + public static final MAPIProperty PRIMARY_TELEPHONE_NUMBER = + new MAPIProperty(0x3a1a, ASCII_STRING, "PrimaryTelephoneNumber", "PR_PRIMARY_TELEPHONE_NUMBER"); + public static final MAPIProperty PRIORITY = + new MAPIProperty(0x26, LONG, "Priority", "PR_PRIORITY"); + public static final MAPIProperty PROFESSION = + new MAPIProperty(0x3a46, ASCII_STRING, "Profession", "PR_PROFESSION"); + public static final MAPIProperty PROFILE_NAME = + new MAPIProperty(0x3d12, ASCII_STRING, "ProfileName", "PR_PROFILE_NAME"); + public static final MAPIProperty PROOF_OF_DELIVERY = + new MAPIProperty(0xc11, BINARY, "ProofOfDelivery", "PR_PROOF_OF_DELIVERY"); + public static final MAPIProperty PROOF_OF_DELIVERY_REQUESTED = + new MAPIProperty(0xc12, BOOLEAN, "ProofOfDeliveryRequested", "PR_PROOF_OF_DELIVERY_REQUESTED"); + public static final MAPIProperty PROOF_OF_SUBMISSION = + new MAPIProperty(0xe26, BINARY, "ProofOfSubmission", "PR_PROOF_OF_SUBMISSION"); + public static final MAPIProperty PROOF_OF_SUBMISSION_REQUESTED = + new MAPIProperty(40, BOOLEAN, "ProofOfSubmissionRequested", "PR_PROOF_OF_SUBMISSION_REQUESTED"); + public static final MAPIProperty PROP_ID_SECURE_MAX = + new MAPIProperty(0x67ff, Types.UNKNOWN, "PropIdSecureMax", "PROP_ID_SECURE_MAX"); + public static final MAPIProperty PROP_ID_SECURE_MIN = + new MAPIProperty(0x67f0, Types.UNKNOWN, "PropIdSecureMin", "PROP_ID_SECURE_MIN"); + public static final MAPIProperty PROVIDER_DISPLAY = + new MAPIProperty(0x3006, ASCII_STRING, "ProviderDisplay", "PR_PROVIDER_DISPLAY"); + public static final MAPIProperty PROVIDER_DLL_NAME = + new MAPIProperty(0x300a, ASCII_STRING, "ProviderDllName", "PR_PROVIDER_DLL_NAME"); + public static final MAPIProperty PROVIDER_ORDINAL = + new MAPIProperty(0x300d, LONG, "ProviderOrdinal", "PR_PROVIDER_ORDINAL"); + public static final MAPIProperty PROVIDER_SUBMIT_TIME = + new MAPIProperty(0x48, TIME, "ProviderSubmitTime", "PR_PROVIDER_SUBMIT_TIME"); + public static final MAPIProperty PROVIDER_UID = + new MAPIProperty(0x300c, BINARY, "ProviderUid", "PR_PROVIDER_UID"); + public static final MAPIProperty PUID = + new MAPIProperty(0x300e, Types.UNKNOWN, "Puid", "PR_PUID"); + public static final MAPIProperty RADIO_TELEPHONE_NUMBER = + new MAPIProperty(0x3a1d, ASCII_STRING, "RadioTelephoneNumber", "PR_RADIO_TELEPHONE_NUMBER"); + public static final MAPIProperty RCVD_REPRESENTING_ADDRTYPE = + new MAPIProperty(0x77, ASCII_STRING, "RcvdRepresentingAddrtype", "PR_RCVD_REPRESENTING_ADDRTYPE"); + public static final MAPIProperty RCVD_REPRESENTING_EMAIL_ADDRESS = + new MAPIProperty(120, ASCII_STRING, "RcvdRepresentingEmailAddress", "PR_RCVD_REPRESENTING_EMAIL_ADDRESS"); + public static final MAPIProperty RCVD_REPRESENTING_ENTRY_ID = + new MAPIProperty(0x43, BINARY, "RcvdRepresentingEntryId", "PR_RCVD_REPRESENTING_ENTRYID"); + public static final MAPIProperty RCVD_REPRESENTING_NAME = + new MAPIProperty(0x44, ASCII_STRING, "RcvdRepresentingName", "PR_RCVD_REPRESENTING_NAME"); + public static final MAPIProperty RCVD_REPRESENTING_SEARCH_KEY = + new MAPIProperty(0x52, BINARY, "RcvdRepresentingSearchKey", "PR_RCVD_REPRESENTING_SEARCH_KEY"); + public static final MAPIProperty READ_RECEIPT_ENTRY_ID = + new MAPIProperty(70, BINARY, "ReadReceiptEntryId", "PR_READ_RECEIPT_ENTRYID"); + public static final MAPIProperty READ_RECEIPT_REQUESTED = + new MAPIProperty(0x29, BOOLEAN, "ReadReceiptRequested", "PR_READ_RECEIPT_REQUESTED"); + public static final MAPIProperty READ_RECEIPT_SEARCH_KEY = + new MAPIProperty(0x53, BINARY, "ReadReceiptSearchKey", "PR_READ_RECEIPT_SEARCH_KEY"); + public static final MAPIProperty RECEIPT_TIME = + new MAPIProperty(0x2a, TIME, "ReceiptTime", "PR_RECEIPT_TIME"); + public static final MAPIProperty RECEIVE_FOLDER_SETTINGS = + new MAPIProperty(0x3415, DIRECTORY, "ReceiveFolderSettings", "PR_RECEIVE_FOLDER_SETTINGS"); + public static final MAPIProperty RECEIVED_BY_ADDRTYPE = + new MAPIProperty(0x75, ASCII_STRING, "ReceivedByAddrtype", "PR_RECEIVED_BY_ADDRTYPE"); + public static final MAPIProperty RECEIVED_BY_EMAIL_ADDRESS = + new MAPIProperty(0x76, ASCII_STRING, "ReceivedByEmailAddress", "PR_RECEIVED_BY_EMAIL_ADDRESS"); + public static final MAPIProperty RECEIVED_BY_ENTRY_ID = + new MAPIProperty(0x3f, BINARY, "ReceivedByEntryId", "PR_RECEIVED_BY_ENTRYID"); + public static final MAPIProperty RECEIVED_BY_NAME = + new MAPIProperty(0x40, ASCII_STRING, "ReceivedByName", "PR_RECEIVED_BY_NAME"); + public static final MAPIProperty RECIPIENT_DISPLAY_NAME = + new MAPIProperty(0x5ff6, Types.UNICODE_STRING, "RecipientDisplayName", null); + public static final MAPIProperty RECIPIENT_ENTRY_ID = + new MAPIProperty(0x5ff7, Types.UNKNOWN, "RecipientEntryId", null); + public static final MAPIProperty RECIPIENT_FLAGS = + new MAPIProperty(0x5ffd, Types.UNKNOWN, "RecipientFlags", null); + public static final MAPIProperty RECEIVED_BY_SEARCH_KEY = + new MAPIProperty(0x51, BINARY, "ReceivedBySearchKey", "PR_RECEIVED_BY_SEARCH_KEY"); + public static final MAPIProperty RECIPIENT_CERTIFICATE = + new MAPIProperty(0xc13, BINARY, "RecipientCertificate", "PR_RECIPIENT_CERTIFICATE"); + public static final MAPIProperty RECIPIENT_NUMBER_FOR_ADVICE = + new MAPIProperty(0xc14, ASCII_STRING, "RecipientNumberForAdvice", "PR_RECIPIENT_NUMBER_FOR_ADVICE"); + public static final MAPIProperty RECIPIENT_REASSIGNMENT_PROHIBITED = + new MAPIProperty(0x2b, BOOLEAN, "RecipientReassignmentProhibited", "PR_RECIPIENT_REASSIGNMENT_PROHIBITED"); + public static final MAPIProperty RECIPIENT_STATUS = + new MAPIProperty(0xe15, LONG, "RecipientStatus", "PR_RECIPIENT_STATUS"); + public static final MAPIProperty RECIPIENT_TYPE = + new MAPIProperty(0xc15, LONG, "RecipientType", "PR_RECIPIENT_TYPE"); + public static final MAPIProperty RECORD_KEY = + new MAPIProperty(0xff9, BINARY, "RecordKey", "PR_RECORD_KEY"); + public static final MAPIProperty REDIRECTION_HISTORY = + new MAPIProperty(0x2c, BINARY, "RedirectionHistory", "PR_REDIRECTION_HISTORY"); + public static final MAPIProperty REFERRED_BY_NAME = + new MAPIProperty(0x3a47, ASCII_STRING, "ReferredByName", "PR_REFERRED_BY_NAME"); + public static final MAPIProperty REGISTERED_MAIL_TYPE = + new MAPIProperty(0xc16, LONG, "RegisteredMailType", "PR_REGISTERED_MAIL_TYPE"); + public static final MAPIProperty RELATED_IPMS = + new MAPIProperty(0x2d, BINARY, "RelatedIpms", "PR_RELATED_IPMS"); + public static final MAPIProperty REMOTE_PROGRESS = + new MAPIProperty(0x3e0b, LONG, "RemoteProgress", "PR_REMOTE_PROGRESS"); + public static final MAPIProperty REMOTE_PROGRESS_TEXT = + new MAPIProperty(0x3e0c, ASCII_STRING, "RemoteProgressText", "PR_REMOTE_PROGRESS_TEXT"); + public static final MAPIProperty REMOTE_VALIDATE_OK = + new MAPIProperty(0x3e0d, BOOLEAN, "RemoteValidateOk", "PR_REMOTE_VALIDATE_OK"); + public static final MAPIProperty RENDERING_POSITION = + new MAPIProperty(0x370b, LONG, "RenderingPosition", "PR_RENDERING_POSITION"); + public static final MAPIProperty REPLY_RECIPIENT_ENTRIES = + new MAPIProperty(0x4f, BINARY, "ReplyRecipientEntries", "PR_REPLY_RECIPIENT_ENTRIES"); + public static final MAPIProperty REPLY_RECIPIENT_NAMES = + new MAPIProperty(80, ASCII_STRING, "ReplyRecipientNames", "PR_REPLY_RECIPIENT_NAMES"); + public static final MAPIProperty REPLY_REQUESTED = + new MAPIProperty(0xc17, BOOLEAN, "ReplyRequested", "PR_REPLY_REQUESTED"); + public static final MAPIProperty REPLY_TIME = + new MAPIProperty(0x30, TIME, "ReplyTime", "PR_REPLY_TIME"); + public static final MAPIProperty REPORT_ENTRY_ID = + new MAPIProperty(0x45, BINARY, "ReportEntryId", "PR_REPORT_ENTRYID"); + public static final MAPIProperty REPORT_NAME = + new MAPIProperty(0x3a, ASCII_STRING, "ReportName", "PR_REPORT_NAME"); + public static final MAPIProperty REPORT_SEARCH_KEY = + new MAPIProperty(0x54, BINARY, "ReportSearchKey", "PR_REPORT_SEARCH_KEY"); + public static final MAPIProperty REPORT_TAG = + new MAPIProperty(0x31, BINARY, "ReportTag", "PR_REPORT_TAG"); + public static final MAPIProperty REPORT_TEXT = + new MAPIProperty(0x1001, ASCII_STRING, "ReportText", "PR_REPORT_TEXT"); + public static final MAPIProperty REPORT_TIME = + new MAPIProperty(50, TIME, "ReportTime", "PR_REPORT_TIME"); + public static final MAPIProperty REPORTING_DL_NAME = + new MAPIProperty(0x1003, BINARY, "ReportingDlName", "PR_REPORTING_DL_NAME"); + public static final MAPIProperty REPORTING_MTA_CERTIFICATE = + new MAPIProperty(0x1004, BINARY, "ReportingMtaCertificate", "PR_REPORTING_MTA_CERTIFICATE"); + public static final MAPIProperty REQUESTED_DELIVERY_METHOD = + new MAPIProperty(0xc18, LONG, "RequestedDeliveryMethod", "PR_REQUESTED_DELIVERY_METHOD"); + public static final MAPIProperty RESOURCE_FLAGS = + new MAPIProperty(0x3009, LONG, "ResourceFlags", "PR_RESOURCE_FLAGS"); + public static final MAPIProperty RESOURCE_METHODS = + new MAPIProperty(0x3e02, LONG, "ResourceMethods", "PR_RESOURCE_METHODS"); + public static final MAPIProperty RESOURCE_PATH = + new MAPIProperty(0x3e07, ASCII_STRING, "ResourcePath", "PR_RESOURCE_PATH"); + public static final MAPIProperty RESOURCE_TYPE = + new MAPIProperty(0x3e03, LONG, "ResourceType", "PR_RESOURCE_TYPE"); + public static final MAPIProperty RESPONSE_REQUESTED = + new MAPIProperty(0x63, BOOLEAN, "ResponseRequested", "PR_RESPONSE_REQUESTED"); + public static final MAPIProperty RESPONSIBILITY = + new MAPIProperty(0xe0f, BOOLEAN, "Responsibility", "PR_RESPONSIBILITY"); + public static final MAPIProperty RETURNED_IPM = + new MAPIProperty(0x33, BOOLEAN, "ReturnedIpm", "PR_RETURNED_IPM"); + public static final MAPIProperty ROW_TYPE = + new MAPIProperty(0xff5, LONG, "RowType", "PR_ROW_TYPE"); + public static final MAPIProperty ROWID = + new MAPIProperty(0x3000, LONG, "Rowid", "PR_ROWID"); + public static final MAPIProperty RTF_COMPRESSED = + new MAPIProperty(0x1009, BINARY, "RtfCompressed", "PR_RTF_COMPRESSED"); + public static final MAPIProperty RTF_IN_SYNC = + new MAPIProperty(0xe1f, BOOLEAN, "RtfInSync", "PR_RTF_IN_SYNC"); + public static final MAPIProperty RTF_SYNC_BODY_COUNT = + new MAPIProperty(0x1007, LONG, "RtfSyncBodyCount", "PR_RTF_SYNC_BODY_COUNT"); + public static final MAPIProperty RTF_SYNC_BODY_CRC = + new MAPIProperty(0x1006, LONG, "RtfSyncBodyCrc", "PR_RTF_SYNC_BODY_CRC"); + public static final MAPIProperty RTF_SYNC_BODY_TAG = + new MAPIProperty(0x1008, ASCII_STRING, "RtfSyncBodyTag", "PR_RTF_SYNC_BODY_TAG"); + public static final MAPIProperty RTF_SYNC_PREFIX_COUNT = + new MAPIProperty(0x1010, LONG, "RtfSyncPrefixCount", "PR_RTF_SYNC_PREFIX_COUNT"); + public static final MAPIProperty RTF_SYNC_TRAILING_COUNT = + new MAPIProperty(0x1011, LONG, "RtfSyncTrailingCount", "PR_RTF_SYNC_TRAILING_COUNT"); + public static final MAPIProperty SEARCH = + new MAPIProperty(0x3607, DIRECTORY, "Search", "PR_SEARCH"); + public static final MAPIProperty SEARCH_KEY = + new MAPIProperty(0x300b, BINARY, "SearchKey", "PR_SEARCH_KEY"); + public static final MAPIProperty SECURITY = + new MAPIProperty(0x34, LONG, "Security", "PR_SECURITY"); + public static final MAPIProperty SELECTABLE = + new MAPIProperty(0x3609, BOOLEAN, "Selectable", "PR_SELECTABLE"); + public static final MAPIProperty SEND_INTERNET_ENCODING = + new MAPIProperty(0x3a71, LONG, "SendInternetEncoding", "PR_SEND_INTERNET_ENCODING"); + public static final MAPIProperty SEND_RECALL_REPORT = + new MAPIProperty(0x6803, Types.UNKNOWN, "SendRecallReport", "messages"); + public static final MAPIProperty SEND_RICH_INFO = + new MAPIProperty(0x3a40, BOOLEAN, "SendRichInfo", "PR_SEND_RICH_INFO"); + public static final MAPIProperty SENDER_ADDRTYPE = + new MAPIProperty(0xc1e, ASCII_STRING, "SenderAddrtype", "PR_SENDER_ADDRTYPE"); + public static final MAPIProperty SENDER_EMAIL_ADDRESS = + new MAPIProperty(0xc1f, ASCII_STRING, "SenderEmailAddress", "PR_SENDER_EMAIL_ADDRESS"); + public static final MAPIProperty SENDER_ENTRY_ID = + new MAPIProperty(0xc19, BINARY, "SenderEntryId", "PR_SENDER_ENTRYID"); + public static final MAPIProperty SENDER_NAME = + new MAPIProperty(0xc1a, ASCII_STRING, "SenderName", "PR_SENDER_NAME"); + public static final MAPIProperty SENDER_SEARCH_KEY = + new MAPIProperty(0xc1d, BINARY, "SenderSearchKey", "PR_SENDER_SEARCH_KEY"); + public static final MAPIProperty SENSITIVITY = + new MAPIProperty(0x36, LONG, "Sensitivity", "PR_SENSITIVITY"); + public static final MAPIProperty SENT_REPRESENTING_ADDRTYPE = + new MAPIProperty(100, ASCII_STRING, "SentRepresentingAddrtype", "PR_SENT_REPRESENTING_ADDRTYPE"); + public static final MAPIProperty SENT_REPRESENTING_EMAIL_ADDRESS = + new MAPIProperty(0x65, ASCII_STRING, "SentRepresentingEmailAddress", "PR_SENT_REPRESENTING_EMAIL_ADDRESS"); + public static final MAPIProperty SENT_REPRESENTING_ENTRY_ID = + new MAPIProperty(0x41, BINARY, "SentRepresentingEntryId", "PR_SENT_REPRESENTING_ENTRYID"); + public static final MAPIProperty SENT_REPRESENTING_NAME = + new MAPIProperty(0x42, ASCII_STRING, "SentRepresentingName", "PR_SENT_REPRESENTING_NAME"); + public static final MAPIProperty SENT_REPRESENTING_SEARCH_KEY = + new MAPIProperty(0x3b, BINARY, "SentRepresentingSearchKey", "PR_SENT_REPRESENTING_SEARCH_KEY"); + public static final MAPIProperty SENTMAIL_ENTRY_ID = + new MAPIProperty(0xe0a, BINARY, "SentmailEntryId", "PR_SENTMAIL_ENTRYID"); + public static final MAPIProperty SERVICE_DELETE_FILES = + new MAPIProperty(0x3d10, Types.createCustom(4126), "ServiceDeleteFiles", "PR_SERVICE_DELETE_FILES"); + public static final MAPIProperty SERVICE_DLL_NAME = + new MAPIProperty(0x3d0a, ASCII_STRING, "ServiceDllName", "PR_SERVICE_DLL_NAME"); + public static final MAPIProperty SERVICE_ENTRY_NAME = + new MAPIProperty(0x3d0b, ASCII_STRING, "ServiceEntryName", "PR_SERVICE_ENTRY_NAME"); + public static final MAPIProperty SERVICE_EXTRA_UIDS = + new MAPIProperty(0x3d0d, BINARY, "ServiceExtraUids", "PR_SERVICE_EXTRA_UIDS"); + public static final MAPIProperty SERVICE_NAME = + new MAPIProperty(0x3d09, ASCII_STRING, "ServiceName", "PR_SERVICE_NAME"); + public static final MAPIProperty SERVICE_SUPPORT_FILES = + new MAPIProperty(0x3d0f, Types.createCustom(4126), "ServiceSupportFiles", "PR_SERVICE_SUPPORT_FILES"); + public static final MAPIProperty SERVICE_UID = + new MAPIProperty(0x3d0c, BINARY, "ServiceUid", "PR_SERVICE_UID"); + public static final MAPIProperty SERVICES = + new MAPIProperty(0x3d0e, BINARY, "Services", "PR_SERVICES"); + public static final MAPIProperty SEVEN_BIT_DISPLAY_NAME = + new MAPIProperty(0x39ff, ASCII_STRING, "SevenBitDisplayName", "PR_SEVEN_BIT_DISPLAY_NAME"); + public static final MAPIProperty SMTP_ADDRESS = + new MAPIProperty(0x39fe, Types.UNICODE_STRING, "SmtpAddress", "PR_SMTP_ADDRESS"); + public static final MAPIProperty SPOOLER_STATUS = + new MAPIProperty(0xe10, LONG, "SpoolerStatus", "PR_SPOOLER_STATUS"); + public static final MAPIProperty SPOUSE_NAME = + new MAPIProperty(0x3a48, ASCII_STRING, "SpouseName", "PR_SPOUSE_NAME"); + public static final MAPIProperty START_DATE = + new MAPIProperty(0x60, TIME, "StartDate", "PR_START_DATE"); + public static final MAPIProperty STATE_OR_PROVINCE = + new MAPIProperty(0x3a28, ASCII_STRING, "StateOrProvince", "PR_STATE_OR_PROVINCE"); + public static final MAPIProperty STATUS = + new MAPIProperty(0x360b, LONG, "Status", "PR_STATUS"); + public static final MAPIProperty STATUS_CODE = + new MAPIProperty(0x3e04, LONG, "StatusCode", "PR_STATUS_CODE"); + public static final MAPIProperty STATUS_STRING = + new MAPIProperty(0x3e08, ASCII_STRING, "StatusString", "PR_STATUS_STRING"); + public static final MAPIProperty STORE_ENTRY_ID = + new MAPIProperty(0xffb, BINARY, "StoreEntryId", "PR_STORE_ENTRYID"); + public static final MAPIProperty STORE_PROVIDERS = + new MAPIProperty(0x3d00, BINARY, "StoreProviders", "PR_STORE_PROVIDERS"); + public static final MAPIProperty STORE_RECORD_KEY = + new MAPIProperty(0xffa, BINARY, "StoreRecordKey", "PR_STORE_RECORD_KEY"); + public static final MAPIProperty STORE_STATE = + new MAPIProperty(0x340e, LONG, "StoreState", "PR_STORE_STATE"); + public static final MAPIProperty STORE_SUPPORT_MASK = + new MAPIProperty(0x340d, LONG, "StoreSupportMask", "PR_STORE_SUPPORT_MASK"); + public static final MAPIProperty STREET_ADDRESS = + new MAPIProperty(0x3a29, ASCII_STRING, "StreetAddress", "PR_STREET_ADDRESS"); + public static final MAPIProperty SUBFOLDERS = + new MAPIProperty(0x360a, BOOLEAN, "Subfolders", "PR_SUBFOLDERS"); + public static final MAPIProperty SUBJECT = + new MAPIProperty(0x37, ASCII_STRING, "Subject", "PR_SUBJECT"); + public static final MAPIProperty SUBJECT_IPM = + new MAPIProperty(0x38, BINARY, "SubjectIpm", "PR_SUBJECT_IPM"); + public static final MAPIProperty SUBJECT_PREFIX = + new MAPIProperty(0x3d, ASCII_STRING, "SubjectPrefix", "PR_SUBJECT_PREFIX"); + public static final MAPIProperty SUBMIT_FLAGS = + new MAPIProperty(0xe14, LONG, "SubmitFlags", "PR_SUBMIT_FLAGS"); + public static final MAPIProperty SUPERSEDES = + new MAPIProperty(0x103a, ASCII_STRING, "Supersedes", "PR_SUPERSEDES"); + public static final MAPIProperty SUPPLEMENTARY_INFO = + new MAPIProperty(0xc1b, ASCII_STRING, "SupplementaryInfo", "PR_SUPPLEMENTARY_INFO"); + public static final MAPIProperty SURNAME = + new MAPIProperty(0x3a11, ASCII_STRING, "Surname", "PR_SURNAME"); + public static final MAPIProperty TELEX_NUMBER = + new MAPIProperty(0x3a2c, ASCII_STRING, "TelexNumber", "PR_TELEX_NUMBER"); + public static final MAPIProperty TEMPLATEID = + new MAPIProperty(0x3902, BINARY, "Templateid", "PR_TEMPLATEID"); + public static final MAPIProperty TITLE = + new MAPIProperty(0x3a17, ASCII_STRING, "Title", "PR_TITLE"); + public static final MAPIProperty TNEF_CORRELATION_KEY = + new MAPIProperty(0x7f, BINARY, "TnefCorrelationKey", "PR_TNEF_CORRELATION_KEY"); + public static final MAPIProperty TRANSMITABLE_DISPLAY_NAME = + new MAPIProperty(0x3a20, ASCII_STRING, "TransmitableDisplayName", "PR_TRANSMITABLE_DISPLAY_NAME"); + public static final MAPIProperty TRANSPORT_KEY = + new MAPIProperty(0xe16, LONG, "TransportKey", "PR_TRANSPORT_KEY"); + public static final MAPIProperty TRANSPORT_MESSAGE_HEADERS = + new MAPIProperty(0x7d, ASCII_STRING, "TransportMessageHeaders", "PR_TRANSPORT_MESSAGE_HEADERS"); + public static final MAPIProperty TRANSPORT_PROVIDERS = + new MAPIProperty(0x3d02, BINARY, "TransportProviders", "PR_TRANSPORT_PROVIDERS"); + public static final MAPIProperty TRANSPORT_STATUS = + new MAPIProperty(0xe11, LONG, "TransportStatus", "PR_TRANSPORT_STATUS"); + public static final MAPIProperty TTYTDD_PHONE_NUMBER = + new MAPIProperty(0x3a4b, ASCII_STRING, "TtytddPhoneNumber", "PR_TTYTDD_PHONE_NUMBER"); + public static final MAPIProperty TYPE_OF_MTS_USER = + new MAPIProperty(0xc1c, LONG, "TypeOfMtsUser", "PR_TYPE_OF_MTS_USER"); + public static final MAPIProperty USER_CERTIFICATE = + new MAPIProperty(0x3a22, BINARY, "UserCertificate", "PR_USER_CERTIFICATE"); + public static final MAPIProperty USER_X509_CERTIFICATE = + new MAPIProperty(0x3a70, Types.createCustom(4354), "UserX509Certificate", "PR_USER_X509_CERTIFICATE"); + public static final MAPIProperty VALID_FOLDER_MASK = + new MAPIProperty(0x35df, LONG, "ValidFolderMask", "PR_VALID_FOLDER_MASK"); + public static final MAPIProperty VIEWS_ENTRY_ID = + new MAPIProperty(0x35e5, BINARY, "ViewsEntryId", "PR_VIEWS_ENTRYID"); + public static final MAPIProperty WEDDING_ANNIVERSARY = + new MAPIProperty(0x3a41, TIME, "WeddingAnniversary", "PR_WEDDING_ANNIVERSARY"); + public static final MAPIProperty X400_CONTENT_TYPE = + new MAPIProperty(60, BINARY, "X400ContentType", "PR_X400_CONTENT_TYPE"); + public static final MAPIProperty X400_DEFERRED_DELIVERY_CANCEL = + new MAPIProperty(0x3e09, BOOLEAN, "X400DeferredDeliveryCancel", "PR_X400_DEFERRED_DELIVERY_CANCEL"); + public static final MAPIProperty XPOS = + new MAPIProperty(0x3f05, LONG, "Xpos", "PR_XPOS"); + public static final MAPIProperty YPOS = + new MAPIProperty(0x3f06, LONG, "Ypos", "PR_YPOS"); + + public static final MAPIProperty UNKNOWN = + new MAPIProperty(-1, Types.UNKNOWN, "Unknown", null); + + // 0x8??? ones are outlook specific, and not standard MAPI + // TODO See http://msdn.microsoft.com/en-us/library/ee157150%28v=exchg.80%29 + // for some + // info on how we might decode them properly in the future + private static final int ID_FIRST_CUSTOM = 0x8000; + private static final int ID_LAST_CUSTOM = 0xFFFE; + + /* --------------------------------------------------------------------- */ + + public final int id; + public final MAPIType usualType; + public final String name; + public final String mapiProperty; + + private MAPIProperty(int id, MAPIType usualType, String name, + String mapiProperty) { + this.id = id; + this.usualType = usualType; + this.name = name; + this.mapiProperty = mapiProperty; + + // If it isn't unknown or custom, store it for lookup + if (id == -1 + || (id >= ID_FIRST_CUSTOM && id <= ID_LAST_CUSTOM) || (this instanceof CustomMAPIProperty)) { - // Custom/Unknown, skip - } else { - if(attributes.containsKey(id)) { - throw new IllegalArgumentException( - "Duplicate MAPI Property with ID " + id + " : " + - toString() + " vs " + attributes.get(id).toString() - ); - } - attributes.put(id, this); - } - } - - public String asFileName() { - String str = Integer.toHexString(id).toUpperCase(Locale.ROOT); - while(str.length() < 4) { - str = "0" + str; - } - return str + usualType.asFileEnding(); - } + // Custom/Unknown, skip + } else { + if (attributes.containsKey(id)) { + throw new IllegalArgumentException( + "Duplicate MAPI Property with ID " + id + " : " + + toString() + " vs " + + attributes.get(id).toString()); + } + attributes.put(id, this); + } + } + + public String asFileName() { + String str = Integer.toHexString(id).toUpperCase(Locale.ROOT); + while (str.length() < 4) { + str = "0" + str; + } + return str + usualType.asFileEnding(); + } + + public String toString() { + StringBuffer str = new StringBuffer(); + str.append(name); + str.append(" ["); + str.append(id); + str.append("]"); + if (mapiProperty != null) { + str.append(" ("); + str.append(mapiProperty); + str.append(")"); + } + return str.toString(); + } + + public static MAPIProperty get(int id) { + MAPIProperty attr = attributes.get(id); + if (attr != null) { + return attr; + } else { + return UNKNOWN; + } + } + + public static Collection<MAPIProperty> getAll() { + return Collections.unmodifiableCollection(attributes.values()); + } + + public static MAPIProperty createCustom(int id, MAPIType type, String name) { + return new CustomMAPIProperty(id, type, name, null); + } - public String toString() { - StringBuffer str = new StringBuffer(); - str.append(name); - str.append(" ["); - str.append(id); - str.append("]"); - if(mapiProperty != null) { - str.append(" ("); - str.append(mapiProperty); - str.append(")"); - } - return str.toString(); - } - - public static MAPIProperty get(int id) { - MAPIProperty attr = attributes.get(id); - if(attr != null) { - return attr; - } else { - return UNKNOWN; - } - } - public static Collection<MAPIProperty> getAll() { - return Collections.unmodifiableCollection( attributes.values() ); - } - - public static MAPIProperty createCustom(int id, MAPIType type, String name) { - return new CustomMAPIProperty(id, type, name, null); - } - - private static class CustomMAPIProperty extends MAPIProperty { - private CustomMAPIProperty(int id, MAPIType usualType, String name, String mapiProperty) { - super(id, usualType, name, mapiProperty); - } - } + private static class CustomMAPIProperty extends MAPIProperty { + private CustomMAPIProperty(int id, MAPIType usualType, String name, String mapiProperty) { + super(id, usualType, name, mapiProperty); + } + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessagePropertiesChunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessagePropertiesChunk.java index dbf77c51c6..ecc11a1767 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessagePropertiesChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessagePropertiesChunk.java @@ -24,66 +24,68 @@ import java.io.OutputStream; import org.apache.poi.util.LittleEndian; /** - * A {@link PropertiesChunk} for a Message or Embedded-Message. - * This has a 32 byte header + * A {@link PropertiesChunk} for a Message or Embedded-Message. This has a 32 + * byte header */ public class MessagePropertiesChunk extends PropertiesChunk { - private long nextRecipientId; - private long nextAttachmentId; - private long recipientCount; - private long attachmentCount; - - public MessagePropertiesChunk(ChunkGroup parentGroup) { - super(parentGroup); - } - - public long getNextRecipientId() { - return nextRecipientId; - } - public long getNextAttachmentId() { - return nextAttachmentId; - } - - public long getRecipientCount() { - return recipientCount; - } - public long getAttachmentCount() { - return attachmentCount; - } - - @Override - public void readValue(InputStream stream) throws IOException { - // 8 bytes of reserved zeros - LittleEndian.readLong(stream); - - // Nexts and counts - nextRecipientId = LittleEndian.readUInt(stream); - nextAttachmentId = LittleEndian.readUInt(stream); - recipientCount = LittleEndian.readUInt(stream); - attachmentCount = LittleEndian.readUInt(stream); - - // 8 bytes of reserved zeros - LittleEndian.readLong(stream); - - // Now properties - readProperties(stream); - } - - @Override - public void writeValue(OutputStream out) throws IOException { - // 8 bytes of reserved zeros - out.write(new byte[8]); - - // Nexts and counts - LittleEndian.putUInt(nextRecipientId, out); - LittleEndian.putUInt(nextAttachmentId, out); - LittleEndian.putUInt(recipientCount, out); - LittleEndian.putUInt(attachmentCount, out); - - // 8 bytes of reserved zeros - out.write(new byte[8]); - - // Now properties - writeProperties(out); - } + private long nextRecipientId; + private long nextAttachmentId; + private long recipientCount; + private long attachmentCount; + + public MessagePropertiesChunk(ChunkGroup parentGroup) { + super(parentGroup); + } + + public long getNextRecipientId() { + return nextRecipientId; + } + + public long getNextAttachmentId() { + return nextAttachmentId; + } + + public long getRecipientCount() { + return recipientCount; + } + + public long getAttachmentCount() { + return attachmentCount; + } + + @Override + public void readValue(InputStream stream) throws IOException { + // 8 bytes of reserved zeros + LittleEndian.readLong(stream); + + // Nexts and counts + nextRecipientId = LittleEndian.readUInt(stream); + nextAttachmentId = LittleEndian.readUInt(stream); + recipientCount = LittleEndian.readUInt(stream); + attachmentCount = LittleEndian.readUInt(stream); + + // 8 bytes of reserved zeros + LittleEndian.readLong(stream); + + // Now properties + readProperties(stream); + } + + @Override + public void writeValue(OutputStream out) throws IOException { + // 8 bytes of reserved zeros + out.write(new byte[8]); + + // Nexts and counts + LittleEndian.putUInt(nextRecipientId, out); + LittleEndian.putUInt(nextAttachmentId, out); + LittleEndian.putUInt(recipientCount, out); + LittleEndian.putUInt(attachmentCount, out); + + // 8 bytes of reserved zeros + out.write(new byte[8]); + + // Now properties + writeProperties(out); + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java index fa81d55f72..409da20c04 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java @@ -31,100 +31,106 @@ import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; /** - * A Chunk that holds the details given back by the - * server at submission time. - * This includes the date the message was given to the - * server, and an ID that's used if you want to cancel - * a message or similar + * A Chunk that holds the details given back by the server at submission time. + * This includes the date the message was given to the server, and an ID that's + * used if you want to cancel a message or similar */ public class MessageSubmissionChunk extends Chunk { - private static POILogger logger = POILogFactory.getLogger(MessageSubmissionChunk.class); - private String rawId; - private Calendar date; - - private static final Pattern datePatern = - Pattern.compile("(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)Z?"); - - /** - * Creates a Byte Chunk. - */ - public MessageSubmissionChunk(String namePrefix, int chunkId, MAPIType type) { - super(namePrefix, chunkId, type); - } - - /** - * Create a Byte Chunk, with the specified - * type. - */ - public MessageSubmissionChunk(int chunkId, MAPIType type) { - super(chunkId, type); - } - - public void readValue(InputStream value) throws IOException { - // Stored in the file as us-ascii - byte[] data = IOUtils.toByteArray(value); - rawId = new String(data, Charset.forName("ASCII")); - - // Now process the date - String[] parts = rawId.split(";"); - for(String part : parts) { - if(part.startsWith("l=")) { - // Format of this bit appears to be l=<id>-<time>-<number> - // ID may contain hyphens. - - String dateS = null; - final int numberPartBegin = part.lastIndexOf('-'); - if (numberPartBegin != -1) { - final int datePartBegin = part.lastIndexOf('-', numberPartBegin-1); - if (datePartBegin != -1 && - // cannot extract date if only one hyphen is in the string... - numberPartBegin > datePartBegin) { - dateS = part.substring(datePartBegin + 1, numberPartBegin); + private static POILogger logger = POILogFactory + .getLogger(MessageSubmissionChunk.class); + private String rawId; + private Calendar date; + + private static final Pattern datePatern = Pattern + .compile("(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)Z?"); + + /** + * Creates a Byte Chunk. + */ + public MessageSubmissionChunk(String namePrefix, int chunkId, + MAPIType type) { + super(namePrefix, chunkId, type); + } + + /** + * Create a Byte Chunk, with the specified type. + */ + public MessageSubmissionChunk(int chunkId, MAPIType type) { + super(chunkId, type); + } + + public void readValue(InputStream value) throws IOException { + // Stored in the file as us-ascii + byte[] data = IOUtils.toByteArray(value); + rawId = new String(data, Charset.forName("ASCII")); + + // Now process the date + String[] parts = rawId.split(";"); + for (String part : parts) { + if (part.startsWith("l=")) { + // Format of this bit appears to be l=<id>-<time>-<number> + // ID may contain hyphens. + + String dateS = null; + final int numberPartBegin = part.lastIndexOf('-'); + if (numberPartBegin != -1) { + final int datePartBegin = part.lastIndexOf('-', + numberPartBegin - 1); + if (datePartBegin != -1 && + // cannot extract date if only one hyphen is in the + // string... + numberPartBegin > datePartBegin) { + dateS = part.substring(datePartBegin + 1, + numberPartBegin); + } + } + if (dateS != null) { + // Should be yymmddhhmmssZ + Matcher m = datePatern.matcher(dateS); + if (m.matches()) { + date = LocaleUtil.getLocaleCalendar(); + + // work around issues with dates like 1989, which appear as "89" here + int year = Integer.parseInt(m.group(1)); + date.set(Calendar.YEAR, year + (year > 80 ? 1900 : 2000)); + + // Java is 0 based + date.set(Calendar.MONTH, Integer.parseInt(m.group(2)) - 1); + date.set(Calendar.DATE, Integer.parseInt(m.group(3))); + date.set(Calendar.HOUR_OF_DAY, + Integer.parseInt(m.group(4))); + date.set(Calendar.MINUTE, Integer.parseInt(m.group(5))); + date.set(Calendar.SECOND, Integer.parseInt(m.group(6))); + date.clear(Calendar.MILLISECOND); + } else { + logger.log(POILogger.WARN, + "Warning - unable to make sense of date " + + dateS); + } } } - if (dateS != null) { - // Should be yymmddhhmmssZ - Matcher m = datePatern.matcher(dateS); - if(m.matches()) { - date = LocaleUtil.getLocaleCalendar(); - - // work around issues with dates like 1989, which appear as "89" here - int year = Integer.parseInt(m.group(1)); - date.set(Calendar.YEAR, year + (year > 80 ? 1900 : 2000)); - - date.set(Calendar.MONTH, Integer.parseInt(m.group(2)) - 1); // Java is 0 based - date.set(Calendar.DATE, Integer.parseInt(m.group(3))); - date.set(Calendar.HOUR_OF_DAY, Integer.parseInt(m.group(4))); - date.set(Calendar.MINUTE, Integer.parseInt(m.group(5))); - date.set(Calendar.SECOND, Integer.parseInt(m.group(6))); - date.clear(Calendar.MILLISECOND); - } else { - logger.log(POILogger.WARN, "Warning - unable to make sense of date " + dateS); - } - } - } - } - } - - public void writeValue(OutputStream out) throws IOException { - byte[] data = rawId.getBytes(Charset.forName("ASCII")); - out.write(data); - } - - /** - * @return the date that the server accepted the - * message, as found from the message ID it generated. - * - */ - public Calendar getAcceptedAtTime() { - return date; - } - - /** - * @return the full ID that the server generated when - * it accepted the message. - */ - public String getSubmissionId() { - return rawId; - } + } + } + + public void writeValue(OutputStream out) throws IOException { + byte[] data = rawId.getBytes(Charset.forName("ASCII")); + out.write(data); + } + + /** + * @return the date that the server accepted the message, as found from the + * message ID it generated. + * + */ + public Calendar getAcceptedAtTime() { + return date; + } + + /** + * @return the full ID that the server generated when it accepted the + * message. + */ + public String getSubmissionId() { + return rawId; + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/NameIdChunks.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/NameIdChunks.java index a976d9395f..e31c8ab639 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/NameIdChunks.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/NameIdChunks.java @@ -20,37 +20,35 @@ package org.apache.poi.hsmf.datatypes; import java.util.ArrayList; import java.util.List; - /** - * Collection of convenience chunks for the - * NameID part of an outlook file + * Collection of convenience chunks for the NameID part of an outlook file */ public final class NameIdChunks implements ChunkGroup { - public static final String NAME = "__nameid_version1.0"; - - /** Holds all the chunks that were found. */ - private List<Chunk> allChunks = new ArrayList<Chunk>(); - - public Chunk[] getAll() { - return allChunks.toArray(new Chunk[allChunks.size()]); - } - public Chunk[] getChunks() { - return getAll(); - } - - /** - * Called by the parser whenever a chunk is found. - */ - public void record(Chunk chunk) { - allChunks.add(chunk); - } - - /** - * Used to flag that all the chunks of the NameID - * have now been located. - */ - public void chunksComplete() { - // Currently, we don't need to do anything special once - // all the chunks have been located - } + public static final String NAME = "__nameid_version1.0"; + + /** Holds all the chunks that were found. */ + private List<Chunk> allChunks = new ArrayList<Chunk>(); + + public Chunk[] getAll() { + return allChunks.toArray(new Chunk[allChunks.size()]); + } + + public Chunk[] getChunks() { + return getAll(); + } + + /** + * Called by the parser whenever a chunk is found. + */ + public void record(Chunk chunk) { + allChunks.add(chunk); + } + + /** + * Used to flag that all the chunks of the NameID have now been located. + */ + public void chunksComplete() { + // Currently, we don't need to do anything special once + // all the chunks have been located + } } 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 076c15f2b0..0efea0d0eb 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertiesChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertiesChunk.java @@ -42,240 +42,238 @@ import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; /** - * <p>A Chunk which holds (single) fixed-length properties, and pointer - * to the variable length ones / multi-valued ones (which get their - * own chunk). - * <p>There are two kinds of PropertiesChunks, which differ only in - * their headers. + * <p> + * A Chunk which holds (single) fixed-length properties, and pointer to the + * variable length ones / multi-valued ones (which get their own chunk). + * <p> + * There are two kinds of PropertiesChunks, which differ only in their headers. */ public abstract class PropertiesChunk extends Chunk { - public static final String NAME = "__properties_version1.0"; - - /** For logging problems we spot with the file */ - private POILogger logger = POILogFactory.getLogger(PropertiesChunk.class); + public static final String NAME = "__properties_version1.0"; - /** - * Holds properties, indexed by type. If a property is multi-valued, - * or variable length, it will be held via a {@link ChunkBasedPropertyValue}. - */ - private Map<MAPIProperty, PropertyValue> properties = - new HashMap<MAPIProperty, PropertyValue>(); + /** For logging problems we spot with the file */ + private POILogger logger = POILogFactory.getLogger(PropertiesChunk.class); - /** - * The ChunkGroup that these properties apply to. Used when - * matching chunks to variable sized and multi-valued properties - */ - private ChunkGroup parentGroup; - - /** - * Creates a Properties Chunk. - */ - protected PropertiesChunk(ChunkGroup parentGroup) { - super(NAME, -1, Types.UNKNOWN); - this.parentGroup = parentGroup; - } + /** + * Holds properties, indexed by type. If a property is multi-valued, or + * variable length, it will be held via a {@link ChunkBasedPropertyValue}. + */ + private Map<MAPIProperty, PropertyValue> properties = new HashMap<MAPIProperty, PropertyValue>(); - @Override - public String getEntryName() { - return NAME; - } - - /** - * Returns all the properties in the chunk, without - * looking up any chunk-based values - */ - public Map<MAPIProperty, PropertyValue> getRawProperties() { - return properties; - } + /** + * The ChunkGroup that these properties apply to. Used when matching chunks + * to variable sized and multi-valued properties + */ + private ChunkGroup parentGroup; - /** - * <p>Returns all the properties in the chunk, along with their - * values. - * <p>Any chunk-based values will be looked up and returned as such - */ - public Map<MAPIProperty, List<PropertyValue>> getProperties() { - Map<MAPIProperty, List<PropertyValue>> props = - new HashMap<MAPIProperty, List<PropertyValue>>(properties.size()); - for (MAPIProperty prop : properties.keySet()) { - props.put(prop, getValues(prop)); - } - return props; - } + /** + * Creates a Properties Chunk. + */ + protected PropertiesChunk(ChunkGroup parentGroup) { + super(NAME, -1, Types.UNKNOWN); + this.parentGroup = parentGroup; + } - /** - * Returns all values for the given property, looking up chunk based - * ones as required, of null if none exist - */ - public List<PropertyValue> getValues(MAPIProperty property) { - PropertyValue val = properties.get(property); - if (val == null) { - return null; - } - if (val instanceof ChunkBasedPropertyValue) { - // ChunkBasedPropertyValue cval = (ChunkBasedPropertyValue)val; - // TODO Lookup - return Collections.emptyList(); - } else { - return Collections.singletonList(val); - } - } + @Override + public String getEntryName() { + return NAME; + } - /** - * Returns the value / pointer to the value chunk of - * the property, or null if none exists - */ - public PropertyValue getRawValue(MAPIProperty property) { - return properties.get(property); - } - - /** - * Called once the parent ChunkGroup has been populated, to match - * up the Chunks in it with our Variable Sized Properties. - */ - protected void matchVariableSizedPropertiesToChunks() { - // Index the Parent Group chunks for easy lookup - // TODO Is this the right way? - Map<Integer,Chunk> chunks = new HashMap<Integer, Chunk>(); - for (Chunk chunk : parentGroup.getChunks()) { - chunks.put(chunk.chunkId, chunk); - } - - // Loop over our values, looking for chunk based ones - for (PropertyValue val : properties.values()) { - if (val instanceof ChunkBasedPropertyValue) { - ChunkBasedPropertyValue cVal = (ChunkBasedPropertyValue)val; - Chunk chunk = chunks.get(cVal.getProperty().id); -//System.err.println(cVal.getProperty() + " = " + cVal + " -> " + HexDump.toHex(cVal.data)); - - // TODO Make sense of the raw offset value - - if (chunk != null) { - cVal.setValue(chunk); - } else { - logger.log(POILogger.WARN, "No chunk found matching Property " + cVal); - } - } - } - } + /** + * Returns all the properties in the chunk, without looking up any + * chunk-based values + */ + public Map<MAPIProperty, PropertyValue> getRawProperties() { + return properties; + } - protected void readProperties(InputStream value) throws IOException { - boolean going = true; - while (going) { - try { - // Read in the header - int typeID = LittleEndian.readUShort(value); - int id = LittleEndian.readUShort(value); - long flags = LittleEndian.readUInt(value); - - // 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) { - // 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); + /** + * <p> + * Returns all the properties in the chunk, along with their values. + * <p> + * Any chunk-based values will be looked up and returned as such + */ + public Map<MAPIProperty, List<PropertyValue>> getProperties() { + Map<MAPIProperty, List<PropertyValue>> props = + new HashMap<MAPIProperty, List<PropertyValue>>(properties.size()); + for (MAPIProperty prop : properties.keySet()) { + props.put(prop, getValues(prop)); + } + return props; + } + + /** + * Returns all values for the given property, looking up chunk based ones as + * required, of null if none exist + */ + public List<PropertyValue> getValues(MAPIProperty property) { + PropertyValue val = properties.get(property); + if (val == null) { + return null; + } + if (val instanceof ChunkBasedPropertyValue) { + // ChunkBasedPropertyValue cval = (ChunkBasedPropertyValue)val; + // TODO Lookup + return Collections.emptyList(); + } else { + return Collections.singletonList(val); + } + } + + /** + * Returns the value / pointer to the value chunk of the property, or null + * if none exists + */ + public PropertyValue getRawValue(MAPIProperty property) { + return properties.get(property); + } + + /** + * Called once the parent ChunkGroup has been populated, to match up the + * Chunks in it with our Variable Sized Properties. + */ + protected void matchVariableSizedPropertiesToChunks() { + // Index the Parent Group chunks for easy lookup + // TODO Is this the right way? + Map<Integer, Chunk> chunks = new HashMap<Integer, Chunk>(); + for (Chunk chunk : parentGroup.getChunks()) { + chunks.put(chunk.chunkId, chunk); + } + + // Loop over our values, looking for chunk based ones + for (PropertyValue val : properties.values()) { + if (val instanceof ChunkBasedPropertyValue) { + ChunkBasedPropertyValue cVal = (ChunkBasedPropertyValue) val; + Chunk chunk = chunks.get(cVal.getProperty().id); + // System.err.println(cVal.getProperty() + " = " + cVal + " -> " + // + HexDump.toHex(cVal.data)); + + // TODO Make sense of the raw offset value + + if (chunk != null) { + cVal.setValue(chunk); } 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; + logger.log(POILogger.WARN, "No chunk found matching Property " + cVal); } } - - // TODO Detect if it is multi-valued, since if it is - // then even fixed-length strings store their multiple - // values in another chunk (much as variable length ones) - - // 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 - boolean isPointer = false; - int length = type.getLength(); - if (! type.isFixedLength()) { - isPointer = true; - length = 8; - } - - // Grab the data block - byte[] data = new byte[length]; - IOUtils.readFully(value, data); - - // Skip over any padding - if (length < 8) { - byte[] padding = new byte[8-length]; - IOUtils.readFully(value, padding); - } - - // Wrap and store - PropertyValue propVal = null; - if (isPointer) { - // We'll match up the chunk later - propVal = new ChunkBasedPropertyValue(prop, flags, data); - } - else if (type == Types.NULL) { - propVal = new NullPropertyValue(prop, flags, data); - } - else if (type == Types.BOOLEAN) { - propVal = new BooleanPropertyValue(prop, flags, data); - } - else if (type == Types.SHORT) { - propVal = new ShortPropertyValue(prop, flags, data); - } - else if (type == Types.LONG) { - propVal = new LongPropertyValue(prop, flags, data); - } - else if (type == Types.LONG_LONG) { - propVal = new LongLongPropertyValue(prop, flags, data); - } - else if (type == Types.FLOAT) { - propVal = new FloatPropertyValue(prop, flags, data); - } - else if (type == Types.DOUBLE) { - propVal = new DoublePropertyValue(prop, flags, data); - } - else if (type == Types.CURRENCY) { - propVal = new CurrencyPropertyValue(prop, flags, data); - } - else if (type == Types.TIME) { - propVal = new TimePropertyValue(prop, flags, data); - } - // TODO Add in the rest of the types - else { - propVal = new PropertyValue(prop, flags, data); - } + } + } + + protected void readProperties(InputStream value) throws IOException { + boolean going = true; + while (going) { + try { + // Read in the header + int typeID = LittleEndian.readUShort(value); + int id = LittleEndian.readUShort(value); + long flags = LittleEndian.readUInt(value); + + // 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) { + // 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; + } + } + + // TODO Detect if it is multi-valued, since if it is + // then even fixed-length strings store their multiple + // values in another chunk (much as variable length ones) - if (properties.get(prop) != null) { - logger.log(POILogger.WARN, "Duplicate values found for " + prop); + // 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 + boolean isPointer = false; + int length = type.getLength(); + if (!type.isFixedLength()) { + isPointer = true; + length = 8; + } + + // Grab the data block + byte[] data = new byte[length]; + IOUtils.readFully(value, data); + + // Skip over any padding + if (length < 8) { + byte[] padding = new byte[8 - length]; + IOUtils.readFully(value, padding); + } + + // Wrap and store + PropertyValue propVal = null; + if (isPointer) { + // We'll match up the chunk later + propVal = new ChunkBasedPropertyValue(prop, flags, data); + } else if (type == Types.NULL) { + propVal = new NullPropertyValue(prop, flags, data); + } else if (type == Types.BOOLEAN) { + propVal = new BooleanPropertyValue(prop, flags, data); + } else if (type == Types.SHORT) { + propVal = new ShortPropertyValue(prop, flags, data); + } else if (type == Types.LONG) { + propVal = new LongPropertyValue(prop, flags, data); + } else if (type == Types.LONG_LONG) { + propVal = new LongLongPropertyValue(prop, flags, data); + } else if (type == Types.FLOAT) { + propVal = new FloatPropertyValue(prop, flags, data); + } else if (type == Types.DOUBLE) { + propVal = new DoublePropertyValue(prop, flags, data); + } else if (type == Types.CURRENCY) { + propVal = new CurrencyPropertyValue(prop, flags, data); + } else if (type == Types.TIME) { + propVal = new TimePropertyValue(prop, flags, data); + } + // TODO Add in the rest of the types + else { + propVal = new PropertyValue(prop, flags, data); + } + + if (properties.get(prop) != null) { + logger.log(POILogger.WARN, + "Duplicate values found for " + prop); + } + properties.put(prop, propVal); + } catch (BufferUnderrunException e) { + // Invalid property, ended short + going = false; } - properties.put(prop, propVal); - } catch (BufferUnderrunException e) { - // Invalid property, ended short - going = false; - } - } - } + } + } - protected void writeProperties(OutputStream out) throws IOException { - // TODO - } + protected void writeProperties(OutputStream out) throws IOException { + // TODO + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertyValue.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertyValue.java index a22927c7b6..cd65276565 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertyValue.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/PropertyValue.java @@ -24,212 +24,228 @@ import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LocaleUtil; /** - * An instance of a {@link MAPIProperty} inside a {@link PropertiesChunk}. - * Where the {@link Types} type is a fixed length one, this will contain the - * actual value. - * Where the {@link Types} type is a variable length one, this will contain - * the length of the property, and the value will be in the associated {@link Chunk}. + * An instance of a {@link MAPIProperty} inside a {@link PropertiesChunk}. Where + * the {@link Types} type is a fixed length one, this will contain the actual + * value. Where the {@link Types} type is a variable length one, this will + * contain the length of the property, and the value will be in the associated + * {@link Chunk}. */ public class PropertyValue { - private MAPIProperty property; - private long flags; - protected byte[] data; - - public PropertyValue(MAPIProperty property, long flags, byte[] data) { - this.property = property; - this.flags = flags; - this.data = data; - } - - public MAPIProperty getProperty() { - return property; - } - - /** - * Get the raw value flags. - * TODO Also provide getters for the flag meanings - */ - public long getFlags() { - return flags; - } - - public Object getValue() { - return data; - } - public void setRawValue(byte[] value) { - this.data = value; - } - - public String toString() { - Object v = getValue(); - if (v == null) - return "(No value available)"; - - if (v instanceof byte[]) { - return ByteChunk.toDebugFriendlyString((byte[])v); - } else { - // Just use the normal toString on the value - return v.toString(); - } - } - - public static class NullPropertyValue extends PropertyValue { - public NullPropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public Void getValue() { - return null; - } - } - - public static class BooleanPropertyValue extends PropertyValue { - public BooleanPropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public Boolean getValue() { - short val = LittleEndian.getShort(data); - return val > 0; - } - public void setValue(boolean value) { - if (data.length != 2) { - data = new byte[2]; - } - if (value) { - LittleEndian.putShort(data, 0, (short)1); - } - } - } - - public static class ShortPropertyValue extends PropertyValue { - public ShortPropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public Short getValue() { - return LittleEndian.getShort(data); - } - public void setValue(short value) { - if (data.length != 2) { - data = new byte[2]; - } - LittleEndian.putShort(data, 0, value); - } - } - - public static class LongPropertyValue extends PropertyValue { - public LongPropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public Integer getValue() { - return LittleEndian.getInt(data); - } - public void setValue(int value) { - if (data.length != 4) { - data = new byte[4]; - } - LittleEndian.putInt(data, 0, value); - } + private MAPIProperty property; + private long flags; + protected byte[] data; + + public PropertyValue(MAPIProperty property, long flags, byte[] data) { + this.property = property; + this.flags = flags; + this.data = data; + } + + public MAPIProperty getProperty() { + return property; + } + + /** + * Get the raw value flags. TODO Also provide getters for the flag meanings + */ + public long getFlags() { + return flags; + } + + public Object getValue() { + return data; + } + + public void setRawValue(byte[] value) { + this.data = value; + } + + public String toString() { + Object v = getValue(); + if (v == null) + return "(No value available)"; + + if (v instanceof byte[]) { + return ByteChunk.toDebugFriendlyString((byte[]) v); + } else { + // Just use the normal toString on the value + return v.toString(); + } + } + + public static class NullPropertyValue extends PropertyValue { + public NullPropertyValue(MAPIProperty property, long flags, + byte[] data) { + super(property, flags, data); + } + + public Void getValue() { + return null; + } + } + + public static class BooleanPropertyValue extends PropertyValue { + public BooleanPropertyValue(MAPIProperty property, long flags, + byte[] data) { + super(property, flags, data); + } + + public Boolean getValue() { + short val = LittleEndian.getShort(data); + return val > 0; + } + + public void setValue(boolean value) { + if (data.length != 2) { + data = new byte[2]; + } + if (value) { + LittleEndian.putShort(data, 0, (short) 1); + } + } + } + + public static class ShortPropertyValue extends PropertyValue { + public ShortPropertyValue(MAPIProperty property, long flags, + byte[] data) { + super(property, flags, data); + } + + public Short getValue() { + return LittleEndian.getShort(data); + } + + public void setValue(short value) { + if (data.length != 2) { + data = new byte[2]; + } + LittleEndian.putShort(data, 0, value); + } + } + + public static class LongPropertyValue extends PropertyValue { + public LongPropertyValue(MAPIProperty property, long flags, byte[] data) { + super(property, flags, data); + } + + public Integer getValue() { + return LittleEndian.getInt(data); + } + + public void setValue(int value) { + if (data.length != 4) { + data = new byte[4]; + } + LittleEndian.putInt(data, 0, value); + } + } + + public static class LongLongPropertyValue extends PropertyValue { + public LongLongPropertyValue(MAPIProperty property, long flags, + byte[] data) { + super(property, flags, data); + } + + public Long getValue() { + return LittleEndian.getLong(data); + } + + public void setValue(long value) { + if (data.length != 8) { + data = new byte[8]; + } + LittleEndian.putLong(data, 0, value); + } + } + + public static class FloatPropertyValue extends PropertyValue { + public FloatPropertyValue(MAPIProperty property, long flags, + byte[] data) { + super(property, flags, data); + } + + public Float getValue() { + return LittleEndian.getFloat(data); + } + + public void setValue(float value) { + if (data.length != 4) { + data = new byte[4]; + } + LittleEndian.putFloat(data, 0, value); + } + } + + public static class DoublePropertyValue extends PropertyValue { + public DoublePropertyValue(MAPIProperty property, long flags, byte[] data) { + super(property, flags, data); + } + + public Double getValue() { + return LittleEndian.getDouble(data); + } + + public void setValue(double value) { + if (data.length != 8) { + data = new byte[8]; + } + LittleEndian.putDouble(data, 0, value); + } + } + + /** + * signed 64-bit integer that represents a base ten decimal, with four + * digits to the right of the decimal point + */ + public static class CurrencyPropertyValue extends PropertyValue { + private static final BigInteger SHIFT = BigInteger.valueOf(10000); + + public CurrencyPropertyValue(MAPIProperty property, long flags, byte[] data) { + super(property, flags, data); + } + + public BigInteger getValue() { + long unshifted = LittleEndian.getLong(data); + return BigInteger.valueOf(unshifted).divide(SHIFT); + } + + public void setValue(BigInteger value) { + if (data.length != 8) { + data = new byte[8]; + } + long shifted = value.multiply(SHIFT).longValue(); + LittleEndian.putLong(data, 0, shifted); + } + } + + /** + * 64-bit integer specifying the number of 100ns periods since Jan 1, 1601 + */ + public static class TimePropertyValue extends PropertyValue { + private static final long OFFSET = 1000L * 60L * 60L * 24L + * (365L * 369L + 89L); + + public TimePropertyValue(MAPIProperty property, long flags, byte[] data) { + super(property, flags, data); + } + + public Calendar getValue() { + long time = LittleEndian.getLong(data); + time = (time / 10 / 1000) - OFFSET; + + Calendar timeC = LocaleUtil.getLocaleCalendar(); + timeC.setTimeInMillis(time); + + return timeC; + } + + public void setValue(Calendar value) { + if (data.length != 8) { + data = new byte[8]; + } + long time = value.getTimeInMillis(); + time = (time + OFFSET) * 10 * 1000; + LittleEndian.putLong(data, 0, time); + } } - - public static class LongLongPropertyValue extends PropertyValue { - public LongLongPropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public Long getValue() { - return LittleEndian.getLong(data); - } - public void setValue(long value) { - if (data.length != 8) { - data = new byte[8]; - } - LittleEndian.putLong(data, 0, value); - } - } - - public static class FloatPropertyValue extends PropertyValue { - public FloatPropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public Float getValue() { - return LittleEndian.getFloat(data); - } - public void setValue(float value) { - if (data.length != 4) { - data = new byte[4]; - } - LittleEndian.putFloat(data, 0, value); - } - } - - public static class DoublePropertyValue extends PropertyValue { - public DoublePropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public Double getValue() { - return LittleEndian.getDouble(data); - } - public void setValue(double value) { - if (data.length != 8) { - data = new byte[8]; - } - LittleEndian.putDouble(data, 0, value); - } - } - - /** - * signed 64-bit integer that represents a base ten decimal, - * with four digits to the right of the decimal point - */ - public static class CurrencyPropertyValue extends PropertyValue { - private static final BigInteger SHIFT = BigInteger.valueOf(10000); - public CurrencyPropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public BigInteger getValue() { - long unshifted = LittleEndian.getLong(data); - return BigInteger.valueOf(unshifted).divide(SHIFT); - } - public void setValue(BigInteger value) { - if (data.length != 8) { - data = new byte[8]; - } - long shifted = value.multiply(SHIFT).longValue(); - LittleEndian.putLong(data, 0, shifted); - } - } - - /** - * 64-bit integer specifying the number of 100ns periods since Jan 1, 1601 - */ - public static class TimePropertyValue extends PropertyValue { - private static final long OFFSET = 1000L * 60L * 60L * 24L * (365L * 369L + 89L); - public TimePropertyValue(MAPIProperty property, long flags, byte[] data) { - super(property, flags, data); - } - - public Calendar getValue() { - long time = LittleEndian.getLong(data); - time = (time / 10 / 1000) - OFFSET; - - Calendar timeC = LocaleUtil.getLocaleCalendar(); - timeC.setTimeInMillis(time); - - return timeC; - } - public void setValue(Calendar value) { - if (data.length != 8) { - data = new byte[8]; - } - long time = value.getTimeInMillis(); - time = (time + OFFSET) *10*1000; - LittleEndian.putLong(data, 0, time); - } - } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java index 2cfd3c480d..f9afb601b3 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java @@ -27,209 +27,199 @@ import java.util.Map; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; - /** - * Collection of convenience chunks for the - * Recip(ient) part of an outlook file. + * Collection of convenience chunks for the Recip(ient) part of an outlook file. * - * If a message has multiple recipients, there will be - * several of these. + * If a message has multiple recipients, there will be several of these. */ public final class RecipientChunks implements ChunkGroupWithProperties { - private static POILogger logger = POILogFactory.getLogger(RecipientChunks.class); - - public static final String PREFIX = "__recip_version1.0_#"; - - public static final MAPIProperty RECIPIENT_NAME = MAPIProperty.DISPLAY_NAME; - public static final MAPIProperty DELIVERY_TYPE = MAPIProperty.ADDRTYPE; - public static final MAPIProperty RECIPIENT_EMAIL_ADDRESS = MAPIProperty.EMAIL_ADDRESS; - public static final MAPIProperty RECIPIENT_SEARCH = MAPIProperty.SEARCH_KEY; - public static final MAPIProperty RECIPIENT_SMTP_ADDRESS = MAPIProperty.SMTP_ADDRESS; - public static final MAPIProperty RECIPIENT_DISPLAY_NAME = MAPIProperty.RECIPIENT_DISPLAY_NAME; - - /** Our 0 based position in the list of recipients */ - public int recipientNumber; - - /** TODO */ - public ByteChunk recipientSearchChunk; - /** - * The "name", which could be their name if an - * internal person, or their email address - * if an external person - */ - public StringChunk recipientNameChunk; - /** - * The email address of the recipient, which - * could be in SMTP or SEARCH format, but - * isn't always present... - */ - public StringChunk recipientEmailChunk; - /** - * The smtp destination email address of - * the recipient, but isn't always present... - */ - public StringChunk recipientSMTPChunk; - /** - * Normally EX or SMTP. Will generally affect - * where the email address ends up. - */ - public StringChunk deliveryTypeChunk; - /** - * The display name of the recipient. - * Normally seems to hold the same value - * as in recipientNameChunk - */ - public StringChunk recipientDisplayNameChunk; - /** - * Holds the fixed sized properties, and the - * pointers to the data of variable sized ones - */ - private PropertiesChunk recipientProperties; - - public RecipientChunks(String name) { - recipientNumber = -1; - int splitAt = name.lastIndexOf('#'); - if(splitAt > -1) { - String number = name.substring(splitAt+1); - try { - recipientNumber = Integer.parseInt(number, 16); - } catch(NumberFormatException e) { - logger.log(POILogger.ERROR, "Invalid recipient number in name " + name); - } - } - } - - /** - * Tries to find their name, - * in whichever chunk holds it. - */ - public String getRecipientName() { - if(recipientNameChunk != null) { - return recipientNameChunk.getValue(); - } - if(recipientDisplayNameChunk != null) { - return recipientDisplayNameChunk.getValue(); - } - - // Can't find it - return null; - } - - /** - * Tries to find their email address, in - * whichever chunk holds it given the - * delivery type. - */ - public String getRecipientEmailAddress() { - // If we have this, it really has the email - if(recipientSMTPChunk != null) { - return recipientSMTPChunk.getValue(); - } - - // This might be a real email, or might be - // in CN=... format - if(recipientEmailChunk != null) { - String email = recipientEmailChunk.getValue(); - int cne = email.indexOf("/CN="); - if(cne == -1) { - // Normal smtp address - return email; - } else { - // /O=..../CN=em@ail - return email.substring(cne+4); - } - } - - // Might be in the name field, check there - if(recipientNameChunk != null) { - String name = recipientNameChunk.getValue(); - if(name.indexOf('@') > -1) { - // Strip leading and trailing quotes if needed - if(name.startsWith("'") && name.endsWith("'")) { - return name.substring(1, name.length()-1); + private static POILogger logger = POILogFactory.getLogger(RecipientChunks.class); + + public static final String PREFIX = "__recip_version1.0_#"; + + public static final MAPIProperty RECIPIENT_NAME = MAPIProperty.DISPLAY_NAME; + public static final MAPIProperty DELIVERY_TYPE = MAPIProperty.ADDRTYPE; + public static final MAPIProperty RECIPIENT_EMAIL_ADDRESS = MAPIProperty.EMAIL_ADDRESS; + public static final MAPIProperty RECIPIENT_SEARCH = MAPIProperty.SEARCH_KEY; + public static final MAPIProperty RECIPIENT_SMTP_ADDRESS = MAPIProperty.SMTP_ADDRESS; + public static final MAPIProperty RECIPIENT_DISPLAY_NAME = MAPIProperty.RECIPIENT_DISPLAY_NAME; + + /** Our 0 based position in the list of recipients */ + public int recipientNumber; + + /** TODO */ + public ByteChunk recipientSearchChunk; + /** + * The "name", which could be their name if an internal person, or their + * email address if an external person + */ + public StringChunk recipientNameChunk; + /** + * The email address of the recipient, which could be in SMTP or SEARCH + * format, but isn't always present... + */ + public StringChunk recipientEmailChunk; + /** + * The smtp destination email address of the recipient, but isn't always + * present... + */ + public StringChunk recipientSMTPChunk; + /** + * Normally EX or SMTP. Will generally affect where the email address ends + * up. + */ + public StringChunk deliveryTypeChunk; + /** + * The display name of the recipient. Normally seems to hold the same value + * as in recipientNameChunk + */ + public StringChunk recipientDisplayNameChunk; + /** + * Holds the fixed sized properties, and the pointers to the data of + * variable sized ones + */ + private PropertiesChunk recipientProperties; + + public RecipientChunks(String name) { + recipientNumber = -1; + int splitAt = name.lastIndexOf('#'); + if (splitAt > -1) { + String number = name.substring(splitAt + 1); + try { + recipientNumber = Integer.parseInt(number, 16); + } catch (NumberFormatException e) { + logger.log(POILogger.ERROR, + "Invalid recipient number in name " + name); + } + } + } + + /** + * Tries to find their name, in whichever chunk holds it. + */ + public String getRecipientName() { + if (recipientNameChunk != null) { + return recipientNameChunk.getValue(); + } + if (recipientDisplayNameChunk != null) { + return recipientDisplayNameChunk.getValue(); + } + + // Can't find it + return null; + } + + /** + * Tries to find their email address, in whichever chunk holds it given the + * delivery type. + */ + public String getRecipientEmailAddress() { + // If we have this, it really has the email + if (recipientSMTPChunk != null) { + return recipientSMTPChunk.getValue(); + } + + // This might be a real email, or might be + // in CN=... format + if (recipientEmailChunk != null) { + String email = recipientEmailChunk.getValue(); + int cne = email.indexOf("/CN="); + if (cne == -1) { + // Normal smtp address + return email; + } else { + // /O=..../CN=em@ail + return email.substring(cne + 4); + } + } + + // Might be in the name field, check there + if (recipientNameChunk != null) { + String name = recipientNameChunk.getValue(); + if (name.indexOf('@') > -1) { + // Strip leading and trailing quotes if needed + if (name.startsWith("'") && name.endsWith("'")) { + return name.substring(1, name.length() - 1); + } + return name; + } + } + + // Check the search chunk, see if it's + // encoded as a SMTP destination in there. + if (recipientSearchChunk != null) { + String search = recipientSearchChunk.getAs7bitString(); + if (search.indexOf("SMTP:") != -1) { + return search.substring(search.indexOf("SMTP:") + 5); } - return name; - } - } - - // Check the search chunk, see if it's - // encoded as a SMTP destination in there. - if(recipientSearchChunk != null) { - String search = recipientSearchChunk.getAs7bitString(); - if(search.indexOf("SMTP:") != -1) { - return search.substring(search.indexOf("SMTP:") + 5); - } - } - - // Can't find it - return null; - } - - /** Holds all the chunks that were found. */ - private List<Chunk> allChunks = new ArrayList<Chunk>(); - - public Map<MAPIProperty,List<PropertyValue>> getProperties() { - if (recipientProperties != null) { - return recipientProperties.getProperties(); - } - else return Collections.emptyMap(); - } - public Chunk[] getAll() { - return allChunks.toArray(new Chunk[allChunks.size()]); - } - public Chunk[] getChunks() { - return getAll(); - } - - /** - * Called by the parser whenever a chunk is found. - */ - public void record(Chunk chunk) { - if(chunk.getChunkId() == RECIPIENT_SEARCH.id) { - // TODO - parse - recipientSearchChunk = (ByteChunk)chunk; - } - else if(chunk.getChunkId() == RECIPIENT_NAME.id) { - recipientDisplayNameChunk = (StringChunk)chunk; - } - else if(chunk.getChunkId() == RECIPIENT_DISPLAY_NAME.id) { - recipientNameChunk = (StringChunk)chunk; - } - else if(chunk.getChunkId() == RECIPIENT_EMAIL_ADDRESS.id) { - recipientEmailChunk = (StringChunk)chunk; - } - else if(chunk.getChunkId() == RECIPIENT_SMTP_ADDRESS.id) { - recipientSMTPChunk = (StringChunk)chunk; - } - else if(chunk.getChunkId() == DELIVERY_TYPE.id) { - deliveryTypeChunk = (StringChunk)chunk; - } - else if(chunk instanceof PropertiesChunk) { - recipientProperties = (PropertiesChunk) chunk; - } - - // And add to the main list - allChunks.add(chunk); - } - - public void chunksComplete() { - if (recipientProperties != null) { - recipientProperties.matchVariableSizedPropertiesToChunks(); - } else { - logger.log(POILogger.WARN, "Recipeints Chunk didn't contain a list of properties!"); - } - } - - /** - * Orders by the recipient number. - */ - public static class RecipientChunksSorter implements Comparator<RecipientChunks>, Serializable { - public int compare(RecipientChunks a, RecipientChunks b) { - if(a.recipientNumber < b.recipientNumber) - return -1; - if(a.recipientNumber > b.recipientNumber) - return +1; - return 0; - } - } + } + + // Can't find it + return null; + } + + /** Holds all the chunks that were found. */ + private List<Chunk> allChunks = new ArrayList<Chunk>(); + + public Map<MAPIProperty, List<PropertyValue>> getProperties() { + if (recipientProperties != null) { + return recipientProperties.getProperties(); + } else + return Collections.emptyMap(); + } + + public Chunk[] getAll() { + return allChunks.toArray(new Chunk[allChunks.size()]); + } + + public Chunk[] getChunks() { + return getAll(); + } + + /** + * Called by the parser whenever a chunk is found. + */ + public void record(Chunk chunk) { + if (chunk.getChunkId() == RECIPIENT_SEARCH.id) { + // TODO - parse + recipientSearchChunk = (ByteChunk) chunk; + } else if (chunk.getChunkId() == RECIPIENT_NAME.id) { + recipientDisplayNameChunk = (StringChunk) chunk; + } else if (chunk.getChunkId() == RECIPIENT_DISPLAY_NAME.id) { + recipientNameChunk = (StringChunk) chunk; + } else if (chunk.getChunkId() == RECIPIENT_EMAIL_ADDRESS.id) { + recipientEmailChunk = (StringChunk) chunk; + } else if (chunk.getChunkId() == RECIPIENT_SMTP_ADDRESS.id) { + recipientSMTPChunk = (StringChunk) chunk; + } else if (chunk.getChunkId() == DELIVERY_TYPE.id) { + deliveryTypeChunk = (StringChunk) chunk; + } else if (chunk instanceof PropertiesChunk) { + recipientProperties = (PropertiesChunk) chunk; + } + + // And add to the main list + allChunks.add(chunk); + } + + public void chunksComplete() { + if (recipientProperties != null) { + recipientProperties.matchVariableSizedPropertiesToChunks(); + } else { + logger.log(POILogger.WARN, "Recipeints Chunk didn't contain a list of properties!"); + } + } + + /** + * Orders by the recipient number. + */ + public static class RecipientChunksSorter + implements Comparator<RecipientChunks>, Serializable { + public int compare(RecipientChunks a, RecipientChunks b) { + if (a.recipientNumber < b.recipientNumber) + return -1; + if (a.recipientNumber > b.recipientNumber) + return +1; + return 0; + } + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StoragePropertiesChunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StoragePropertiesChunk.java index 5cb0d4bc7c..50b393d21b 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StoragePropertiesChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StoragePropertiesChunk.java @@ -24,30 +24,29 @@ import java.io.OutputStream; import org.apache.poi.util.LittleEndian; /** - * A {@link PropertiesChunk} for a Storage Properties, such as - * Attachments and Recipients. - * This only has a 8 byte header + * A {@link PropertiesChunk} for a Storage Properties, such as Attachments and + * Recipients. This only has a 8 byte header */ public class StoragePropertiesChunk extends PropertiesChunk { - public StoragePropertiesChunk(ChunkGroup parentGroup) { - super(parentGroup); - } - - @Override - public void readValue(InputStream stream) throws IOException { - // 8 bytes of reserved zeros - LittleEndian.readLong(stream); - - // Now properties - readProperties(stream); - } - - @Override - public void writeValue(OutputStream out) throws IOException { - // 8 bytes of reserved zeros - out.write(new byte[8]); - - // Now properties - writeProperties(out); - } + public StoragePropertiesChunk(ChunkGroup parentGroup) { + super(parentGroup); + } + + @Override + public void readValue(InputStream stream) throws IOException { + // 8 bytes of reserved zeros + LittleEndian.readLong(stream); + + // Now properties + readProperties(stream); + } + + @Override + public void writeValue(OutputStream out) throws IOException { + // 8 bytes of reserved zeros + out.write(new byte[8]); + + // Now properties + writeProperties(out); + } }
\ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java index be541ec114..5f0538a652 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java @@ -30,120 +30,119 @@ import org.apache.poi.util.StringUtil; * A Chunk made up of a single string. */ public class StringChunk extends Chunk { - private static final String DEFAULT_ENCODING = "CP1252"; - private String encoding7Bit = DEFAULT_ENCODING; - private byte[] rawValue; - private String value; - - /** - * Creates a String Chunk. - */ - public StringChunk(String namePrefix, int chunkId, MAPIType type) { - super(namePrefix, chunkId, type); - } - - /** - * Create a String Chunk, with the specified - * type. - */ - public StringChunk(int chunkId, MAPIType type) { - super(chunkId, type); - } - - /** - * Returns the Encoding that will be used to - * decode any "7 bit" (non unicode) data. - * Most files default to CP1252 - */ - public String get7BitEncoding() { - return encoding7Bit; - } - - /** - * Sets the Encoding that will be used to - * decode any "7 bit" (non unicode) data. - * This doesn't appear to be stored anywhere - * specific in the file, so you may need - * to guess by looking at headers etc - */ - public void set7BitEncoding(String encoding) { - this.encoding7Bit = encoding; - - // Re-read the String if we're a 7 bit one - if(type == Types.ASCII_STRING) { - parseString(); - } - } - - public void readValue(InputStream value) throws IOException { - rawValue = IOUtils.toByteArray(value); - parseString(); - } - private void parseString() { - String tmpValue; - if (type == Types.ASCII_STRING) { - tmpValue = parseAs7BitData(rawValue, encoding7Bit); - } else if (type == Types.UNICODE_STRING) { - tmpValue = StringUtil.getFromUnicodeLE(rawValue); - } else { - throw new IllegalArgumentException("Invalid type " + type + " for String Chunk"); - } - - // Clean up - this.value = tmpValue.replace("\0", ""); - } - - public void writeValue(OutputStream out) throws IOException { - out.write(rawValue); - } - private void storeString() { - if (type == Types.ASCII_STRING) { - rawValue = value.getBytes(Charset.forName(encoding7Bit)); - } else if (type == Types.UNICODE_STRING) { - rawValue = StringUtil.getToUnicodeLE(value); - } else { - throw new IllegalArgumentException("Invalid type " + type + " for String Chunk"); - } - } - - /** - * Returns the Text value of the chunk - */ - public String getValue() { - return this.value; - } - - public byte[] getRawValue() { - return this.rawValue; - } - - public void setValue(String str) { - this.value = str; - storeString(); - } - - public String toString() { - return this.value; - } - - /** - * Parses as non-unicode, supposedly 7 bit CP1252 data - * and returns the string that that yields. - */ - protected static String parseAs7BitData(byte[] data) { - return parseAs7BitData(data, DEFAULT_ENCODING); - } - /** - * Parses as non-unicode, supposedly 7 bit data - * and returns the string that that yields. - */ - protected static String parseAs7BitData(byte[] data, String encoding) { - // Handle any encoding aliases, where outlook describes it differently - if ("ansi".equals(encoding)) { - encoding = DEFAULT_ENCODING; - } - - // Decode - return new String(data, Charset.forName(encoding)); - } + private static final String DEFAULT_ENCODING = "CP1252"; + private String encoding7Bit = DEFAULT_ENCODING; + private byte[] rawValue; + private String value; + + /** + * Creates a String Chunk. + */ + public StringChunk(String namePrefix, int chunkId, MAPIType type) { + super(namePrefix, chunkId, type); + } + + /** + * Create a String Chunk, with the specified type. + */ + public StringChunk(int chunkId, MAPIType type) { + super(chunkId, type); + } + + /** + * Returns the Encoding that will be used to decode any "7 bit" (non + * unicode) data. Most files default to CP1252 + */ + public String get7BitEncoding() { + return encoding7Bit; + } + + /** + * Sets the Encoding that will be used to decode any "7 bit" (non unicode) + * data. This doesn't appear to be stored anywhere specific in the file, so + * you may need to guess by looking at headers etc + */ + public void set7BitEncoding(String encoding) { + this.encoding7Bit = encoding; + + // Re-read the String if we're a 7 bit one + if (type == Types.ASCII_STRING) { + parseString(); + } + } + + public void readValue(InputStream value) throws IOException { + rawValue = IOUtils.toByteArray(value); + parseString(); + } + + private void parseString() { + String tmpValue; + if (type == Types.ASCII_STRING) { + tmpValue = parseAs7BitData(rawValue, encoding7Bit); + } else if (type == Types.UNICODE_STRING) { + tmpValue = StringUtil.getFromUnicodeLE(rawValue); + } else { + throw new IllegalArgumentException("Invalid type " + type + " for String Chunk"); + } + + // Clean up + this.value = tmpValue.replace("\0", ""); + } + + public void writeValue(OutputStream out) throws IOException { + out.write(rawValue); + } + + private void storeString() { + if (type == Types.ASCII_STRING) { + rawValue = value.getBytes(Charset.forName(encoding7Bit)); + } else if (type == Types.UNICODE_STRING) { + rawValue = StringUtil.getToUnicodeLE(value); + } else { + throw new IllegalArgumentException("Invalid type " + type + " for String Chunk"); + } + } + + /** + * Returns the Text value of the chunk + */ + public String getValue() { + return this.value; + } + + public byte[] getRawValue() { + return this.rawValue; + } + + public void setValue(String str) { + this.value = str; + storeString(); + } + + public String toString() { + return this.value; + } + + /** + * Parses as non-unicode, supposedly 7 bit CP1252 data and returns the + * string that that yields. + */ + protected static String parseAs7BitData(byte[] data) { + return parseAs7BitData(data, DEFAULT_ENCODING); + } + + /** + * Parses as non-unicode, supposedly 7 bit data and returns the string that + * that yields. + */ + protected static String parseAs7BitData(byte[] data, String encoding) { + // Handle any encoding aliases, where outlook describes it differently + if ("ansi".equals(encoding)) { + encoding = DEFAULT_ENCODING; + } + + // Decode + return new String(data, Charset.forName(encoding)); + } } diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Types.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Types.java index 4716cc1c33..f273c880fa 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Types.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Types.java @@ -23,158 +23,169 @@ import java.util.Map; /** * The types list and details are available from - * http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefpropertytype%28v=EXCHG.140%29.aspx + * http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefpropertytype%28v=EXCHG.140%29.aspx */ public final class Types { - private static Map<Integer, MAPIType> builtInTypes = new HashMap<Integer, MAPIType>(); - private static Map<Integer, MAPIType> customTypes = new HashMap<Integer, Types.MAPIType>(); - - /** Unspecified */ - public static final MAPIType UNSPECIFIED = new MAPIType(0x0000, "Unspecified", -1); - /** Unknown */ - public static final MAPIType UNKNOWN = new MAPIType(-1, "Unknown", -1); - - /** Null - NULL property value */ - public static final MAPIType NULL = new MAPIType(0x0001, "Null", 0); - /** I2 - signed 16-bit value */ - public static final MAPIType SHORT = new MAPIType(0x0002, "Short", 2); - /** Long - signed 32-bit value */ - public static final MAPIType LONG = new MAPIType(0x0003, "Long", 4); - /** R4 - 4-byte floating point value */ - public static final MAPIType FLOAT = new MAPIType(0x0004, "Float", 4); - /** Double - floating point double */ - public static final MAPIType DOUBLE = new MAPIType(0x0005, "Double", 8); - /** Currency - signed 64-bit integer that represents a base ten decimal with four digits to the right of the decimal point */ - public static final MAPIType CURRENCY = new MAPIType(0x0006, "Currency", 8); - /** AppTime - application time value */ - public static final MAPIType APP_TIME = new MAPIType(0x0007, "Application Time", 8); - /** Error - 32-bit error value */ - public static final MAPIType ERROR = new MAPIType(0x000A, "Error", 4); - /** Boolean - 16-bit Boolean value. '0' is false. Non-zero is true */ - public static final MAPIType BOOLEAN = new MAPIType(0x000B, "Boolean", 2); - /** Object/Directory - embedded object in a property */ - public static final MAPIType DIRECTORY = new MAPIType(0x000D, "Directory", -1); - /** I8 - 8-byte signed integer */ - public static final MAPIType LONG_LONG = new MAPIType(0x0014, "Long Long", 8); - /** SysTime - FILETIME 64-bit integer specifying the number of 100ns periods since Jan 1, 1601 */ - public static final MAPIType TIME = new MAPIType(0x0040, "Time", 8); - /** ClassId - OLE GUID */ - public static final MAPIType CLS_ID = new MAPIType(0x0048, "CLS ID GUID", 16); - - /** Binary - counted byte array */ - public static final MAPIType BINARY = new MAPIType(0x0102, "Binary", -1); - - /** - * An 8-bit string, probably in CP1252, but don't quote us... - * Normally used for everything before Outlook 3.0, and some - * fields in Outlook 3.0. - */ - public static final MAPIType ASCII_STRING = new MAPIType(0x001E, "ASCII String", -1); - /** A string, from Outlook 3.0 onwards. Normally unicode */ - public static final MAPIType UNICODE_STRING = new MAPIType(0x001F, "Unicode String", -1); - - /** MultiValued - Value part contains multiple values */ - public static final int MULTIVALUED_FLAG = 0x1000; - - public static final class MAPIType { - private final int id; - private final String name; - private final int length; - - /** - * Creates a standard, built-in type - */ - private MAPIType(int id, String name, int length) { - this.id = id; - this.name = name; - this.length = length; - builtInTypes.put(id, this); - } - /** - * Creates a custom type - */ - private MAPIType(int id, int length) { - this.id = id; - this.name = asCustomName(id); - this.length = length; - customTypes.put(id, this); - } - - /** - * Returns the length, in bytes, of values of this type, or - * -1 if it is a variable length type. - */ - public int getLength() { - return length; - } - /** - * Is this type a fixed-length type, or a variable-length one? - */ - public boolean isFixedLength() { - return (length != -1); - } - - public int getId() { - return id; - } - public String getName() { - return name; - } - - public String toString() { - return id + " / 0x" + asFileEnding() + " - " + name + " @ " + length; - } - - /** - * Return the 4 character hex encoded version, - * as used in file endings - */ - public String asFileEnding() { - return Types.asFileEnding(id); - } - } - - public static MAPIType getById(int typeId) { - return builtInTypes.get(typeId); - } - - public static String asFileEnding(int type) { - String str = Integer.toHexString(type).toUpperCase(Locale.ROOT); - while(str.length() < 4) { - str = "0" + str; - } - return str; - } - public static String asName(int typeId) { - MAPIType type = builtInTypes.get(typeId); - if (type != null) { - return type.name; - } - return asCustomName(typeId); - } - private static String asCustomName(int typeId) { - return "0x" + Integer.toHexString(typeId); - } - - public static MAPIType createCustom(int typeId) { - // Check they're not being silly, and asking for a built-in one... - if (getById(typeId) != null) { - return getById(typeId); - } - - // Try to get an existing definition of this - MAPIType type = customTypes.get(typeId); - - // If none, do a thread-safe creation - if (type == null) { - synchronized (customTypes) { - type = customTypes.get(typeId); - if (type == null) { - type = new MAPIType(typeId, -1); + private static Map<Integer, MAPIType> builtInTypes = new HashMap<Integer, MAPIType>(); + private static Map<Integer, MAPIType> customTypes = new HashMap<Integer, Types.MAPIType>(); + + /** Unspecified */ + public static final MAPIType UNSPECIFIED = new MAPIType(0x0000, + "Unspecified", -1); + /** Unknown */ + public static final MAPIType UNKNOWN = new MAPIType(-1, "Unknown", -1); + + /** Null - NULL property value */ + public static final MAPIType NULL = new MAPIType(0x0001, "Null", 0); + /** I2 - signed 16-bit value */ + public static final MAPIType SHORT = new MAPIType(0x0002, "Short", 2); + /** Long - signed 32-bit value */ + public static final MAPIType LONG = new MAPIType(0x0003, "Long", 4); + /** R4 - 4-byte floating point value */ + public static final MAPIType FLOAT = new MAPIType(0x0004, "Float", 4); + /** Double - floating point double */ + public static final MAPIType DOUBLE = new MAPIType(0x0005, "Double", 8); + /** + * Currency - signed 64-bit integer that represents a base ten decimal with + * four digits to the right of the decimal point + */ + public static final MAPIType CURRENCY = new MAPIType(0x0006, "Currency", 8); + /** AppTime - application time value */ + public static final MAPIType APP_TIME = new MAPIType(0x0007, "Application Time", 8); + /** Error - 32-bit error value */ + public static final MAPIType ERROR = new MAPIType(0x000A, "Error", 4); + /** Boolean - 16-bit Boolean value. '0' is false. Non-zero is true */ + public static final MAPIType BOOLEAN = new MAPIType(0x000B, "Boolean", 2); + /** Object/Directory - embedded object in a property */ + public static final MAPIType DIRECTORY = new MAPIType(0x000D, "Directory", -1); + /** I8 - 8-byte signed integer */ + public static final MAPIType LONG_LONG = new MAPIType(0x0014, "Long Long", 8); + /** + * SysTime - FILETIME 64-bit integer specifying the number of 100ns periods + * since Jan 1, 1601 + */ + public static final MAPIType TIME = new MAPIType(0x0040, "Time", 8); + /** ClassId - OLE GUID */ + public static final MAPIType CLS_ID = new MAPIType(0x0048, "CLS ID GUID", 16); + + /** Binary - counted byte array */ + public static final MAPIType BINARY = new MAPIType(0x0102, "Binary", -1); + + /** + * An 8-bit string, probably in CP1252, but don't quote us... Normally used + * for everything before Outlook 3.0, and some fields in Outlook 3.0. + */ + public static final MAPIType ASCII_STRING = new MAPIType(0x001E, "ASCII String", -1); + /** A string, from Outlook 3.0 onwards. Normally unicode */ + public static final MAPIType UNICODE_STRING = new MAPIType(0x001F, "Unicode String", -1); + + /** MultiValued - Value part contains multiple values */ + public static final int MULTIVALUED_FLAG = 0x1000; + + public static final class MAPIType { + private final int id; + private final String name; + private final int length; + + /** + * Creates a standard, built-in type + */ + private MAPIType(int id, String name, int length) { + this.id = id; + this.name = name; + this.length = length; + builtInTypes.put(id, this); + } + + /** + * Creates a custom type + */ + private MAPIType(int id, int length) { + this.id = id; + this.name = asCustomName(id); + this.length = length; + customTypes.put(id, this); + } + + /** + * Returns the length, in bytes, of values of this type, or -1 if it is + * a variable length type. + */ + public int getLength() { + return length; + } + + /** + * Is this type a fixed-length type, or a variable-length one? + */ + public boolean isFixedLength() { + return (length != -1); + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public String toString() { + return id + " / 0x" + asFileEnding() + " - " + name + " @ " + + length; + } + + /** + * Return the 4 character hex encoded version, as used in file endings + */ + public String asFileEnding() { + return Types.asFileEnding(id); + } + } + + public static MAPIType getById(int typeId) { + return builtInTypes.get(typeId); + } + + public static String asFileEnding(int type) { + String str = Integer.toHexString(type).toUpperCase(Locale.ROOT); + while (str.length() < 4) { + str = "0" + str; + } + return str; + } + + public static String asName(int typeId) { + MAPIType type = builtInTypes.get(typeId); + if (type != null) { + return type.name; + } + return asCustomName(typeId); + } + + private static String asCustomName(int typeId) { + return "0x" + Integer.toHexString(typeId); + } + + public static MAPIType createCustom(int typeId) { + // Check they're not being silly, and asking for a built-in one... + if (getById(typeId) != null) { + return getById(typeId); + } + + // Try to get an existing definition of this + MAPIType type = customTypes.get(typeId); + + // If none, do a thread-safe creation + if (type == null) { + synchronized (customTypes) { + type = customTypes.get(typeId); + if (type == null) { + type = new MAPIType(typeId, -1); + } } - } - } - - return type; - } + } + + return type; + } } |