You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2011/03/02 16:25:37 UTC
svn commit: r1076251 - in /poi/trunk/src/scratchpad:
src/org/apache/poi/hmef/ src/org/apache/poi/hmef/attribute/
src/org/apache/poi/hmef/dev/ testcases/org/apache/poi/hmef/
testcases/org/apache/poi/hmef/attribute/
Author: nick
Date: Wed Mar 2 15:25:35 2011
New Revision: 1076251
URL: http://svn.apache.org/viewvc?rev=1076251&view=rev
Log:
Refactor the TNEF Attributes to better match the MAPI ones, and move both into their own package
Added:
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIAttribute.java
- copied, changed from r1076169, poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIAttribute.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java
- copied, changed from r1076169, poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIRtfAttribute.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIStringAttribute.java
- copied, changed from r1076169, poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIStringAttribute.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFAttribute.java
- copied, changed from r1076169, poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attribute.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFProperty.java
poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/attribute/
Removed:
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attribute.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIAttribute.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIRtfAttribute.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIStringAttribute.java
Modified:
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attachment.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/HMEFMessage.java
poi/trunk/src/scratchpad/src/org/apache/poi/hmef/dev/HMEFDumper.java
poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestCompressedRTF.java
poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestHMEFMessage.java
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attachment.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attachment.java?rev=1076251&r1=1076250&r2=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attachment.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attachment.java Wed Mar 2 15:25:35 2011
@@ -20,15 +20,22 @@ package org.apache.poi.hmef;
import java.util.ArrayList;
import java.util.List;
+import org.apache.poi.hmef.attribute.TNEFAttribute;
+import org.apache.poi.hmef.attribute.MAPIAttribute;
+
/**
- * An attachment within a {@link HMEFMessage}
+ * An attachment within a {@link HMEFMessage}. Provides both helper
+ * methods to get at common parts and attributes of the attachment,
+ * and list methods to get all of them.
*/
public final class Attachment {
- private final List<Attribute> attributes = new ArrayList<Attribute>();
+ private final List<TNEFAttribute> attributes = new ArrayList<TNEFAttribute>();
private final List<MAPIAttribute> mapiAttributes = new ArrayList<MAPIAttribute>();
- protected void addAttribute(Attribute attr) {
+
+
+ protected void addAttribute(TNEFAttribute attr) {
attributes.add(attr);
}
@@ -36,7 +43,7 @@ public final class Attachment {
mapiAttributes.add(attr);
}
- public List<Attribute> getAttributes() {
+ public List<TNEFAttribute> getAttributes() {
return attributes;
}
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hmef/HMEFMessage.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hmef/HMEFMessage.java?rev=1076251&r1=1076250&r2=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hmef/HMEFMessage.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hmef/HMEFMessage.java Wed Mar 2 15:25:35 2011
@@ -22,7 +22,9 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
-import org.apache.poi.hmef.Attribute.AttributeID;
+import org.apache.poi.hmef.attribute.MAPIAttribute;
+import org.apache.poi.hmef.attribute.TNEFAttribute;
+import org.apache.poi.hmef.attribute.TNEFProperty;
import org.apache.poi.hsmf.datatypes.MAPIProperty;
import org.apache.poi.util.LittleEndian;
@@ -38,7 +40,7 @@ public final class HMEFMessage {
public static final long HEADER_SIGNATURE = 0x223e9f78;
private int fileId;
- private List<Attribute> messageAttributes = new ArrayList<Attribute>();
+ private List<TNEFAttribute> messageAttributes = new ArrayList<TNEFAttribute>();
private List<MAPIAttribute> mapiAttributes = new ArrayList<MAPIAttribute>();
private List<Attachment> attachments = new ArrayList<Attachment>();
@@ -59,16 +61,16 @@ public final class HMEFMessage {
process(inp, 0);
// Finally expand out the MAPI Attributes
- for(Attribute attr : messageAttributes) {
- if(attr.getId() == Attribute.ID_MAPIPROPERTIES) {
+ for(TNEFAttribute attr : messageAttributes) {
+ if(attr.getProperty() == TNEFProperty.ID_MAPIPROPERTIES) {
mapiAttributes.addAll(
MAPIAttribute.create(attr)
);
}
}
for(Attachment attachment : attachments) {
- for(Attribute attr : attachment.getAttributes()) {
- if(attr.getId() == Attribute.ID_MAPIPROPERTIES) {
+ for(TNEFAttribute attr : attachment.getAttributes()) {
+ if(attr.getProperty()== TNEFProperty.ID_MAPIPROPERTIES) {
attachment.getMAPIAttributes().addAll(
MAPIAttribute.create(attr)
);
@@ -80,19 +82,19 @@ public final class HMEFMessage {
private void process(InputStream inp, int lastLevel) throws IOException {
// Fetch the level
int level = inp.read();
- if(level == Attribute.LEVEL_END_OF_FILE) {
+ if(level == TNEFProperty.LEVEL_END_OF_FILE) {
return;
}
// Build the attribute
- Attribute attr = new Attribute(inp);
+ TNEFAttribute attr = new TNEFAttribute(inp);
// Decide what to attach it to, based on the levels and IDs
- if(level == Attribute.LEVEL_MESSAGE) {
+ if(level == TNEFProperty.LEVEL_MESSAGE) {
messageAttributes.add(attr);
- } else if(level == Attribute.LEVEL_ATTACHMENT) {
+ } else if(level == TNEFProperty.LEVEL_ATTACHMENT) {
// Previous attachment or a new one?
- if(attachments.size() == 0 || attr.getId() == Attribute.ID_ATTACHRENDERDATA) {
+ if(attachments.size() == 0 || attr.getProperty() == TNEFProperty.ID_ATTACHRENDERDATA) {
attachments.add(new Attachment());
}
@@ -111,7 +113,7 @@ public final class HMEFMessage {
* Note - In a typical message, most of the interesting properties
* are stored as {@link MAPIAttribute}s - see {@link #getMessageMAPIAttributes()}
*/
- public List<Attribute> getMessageAttributes() {
+ public List<TNEFAttribute> getMessageAttributes() {
return messageAttributes;
}
@@ -135,9 +137,9 @@ public final class HMEFMessage {
* Return the message attribute with the given ID,
* or null if there isn't one.
*/
- public Attribute getMessageAttribute(AttributeID id) {
- for(Attribute attr : messageAttributes) {
- if(attr.getId() == id) {
+ public TNEFAttribute getMessageAttribute(TNEFProperty id) {
+ for(TNEFAttribute attr : messageAttributes) {
+ if(attr.getProperty() == id) {
return attr;
}
}
Copied: poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIAttribute.java (from r1076169, poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIAttribute.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIAttribute.java?p2=poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIAttribute.java&p1=poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIAttribute.java&r1=1076169&r2=1076251&rev=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIAttribute.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIAttribute.java Wed Mar 2 15:25:35 2011
@@ -15,7 +15,7 @@
limitations under the License.
==================================================================== */
-package org.apache.poi.hmef;
+package org.apache.poi.hmef.attribute;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -23,6 +23,8 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
+import org.apache.poi.hmef.Attachment;
+import org.apache.poi.hmef.HMEFMessage;
import org.apache.poi.hsmf.datatypes.MAPIProperty;
import org.apache.poi.hsmf.datatypes.Types;
import org.apache.poi.util.HexDump;
@@ -79,11 +81,11 @@ public class MAPIAttribute {
* Parses a MAPI Properties TNEF Attribute, and returns
* the list of MAPI Attributes contained within it
*/
- public static List<MAPIAttribute> create(Attribute parent) throws IOException {
- if(parent.getId() != Attribute.ID_MAPIPROPERTIES) {
+ public static List<MAPIAttribute> create(TNEFAttribute parent) throws IOException {
+ if(parent.getProperty() != TNEFProperty.ID_MAPIPROPERTIES) {
throw new IllegalArgumentException(
"Can only create from a MAPIProperty attribute, " +
- "instead received a " + parent.getId() + " one"
+ "instead received a " + parent.getProperty() + " one"
);
}
ByteArrayInputStream inp = new ByteArrayInputStream(parent.getData());
Copied: poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java (from r1076169, poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIRtfAttribute.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java?p2=poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java&p1=poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIRtfAttribute.java&r1=1076169&r2=1076251&rev=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIRtfAttribute.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIRtfAttribute.java Wed Mar 2 15:25:35 2011
@@ -15,11 +15,14 @@
limitations under the License.
==================================================================== */
-package org.apache.poi.hmef;
+package org.apache.poi.hmef.attribute;
import java.io.ByteArrayInputStream;
import java.io.IOException;
+import org.apache.poi.hmef.Attachment;
+import org.apache.poi.hmef.CompressedRTF;
+import org.apache.poi.hmef.HMEFMessage;
import org.apache.poi.hsmf.datatypes.MAPIProperty;
import org.apache.poi.util.StringUtil;
Copied: poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIStringAttribute.java (from r1076169, poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIStringAttribute.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIStringAttribute.java?p2=poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIStringAttribute.java&p1=poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIStringAttribute.java&r1=1076169&r2=1076251&rev=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hmef/MAPIStringAttribute.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/MAPIStringAttribute.java Wed Mar 2 15:25:35 2011
@@ -15,24 +15,15 @@
limitations under the License.
==================================================================== */
-package org.apache.poi.hmef;
+package org.apache.poi.hmef.attribute;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.poi.util.HexDump;
-import org.apache.poi.util.IOUtils;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.hmef.Attribute.AttributeID;
+import org.apache.poi.hmef.Attachment;
+import org.apache.poi.hmef.HMEFMessage;
import org.apache.poi.hsmf.datatypes.MAPIProperty;
import org.apache.poi.hsmf.datatypes.Types;
+import org.apache.poi.util.StringUtil;
/**
* A pure-MAPI attribute holding a String, which applies
Copied: poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFAttribute.java (from r1076169, poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attribute.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFAttribute.java?p2=poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFAttribute.java&p1=poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attribute.java&r1=1076169&r2=1076251&rev=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hmef/Attribute.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFAttribute.java Wed Mar 2 15:25:35 2011
@@ -15,15 +15,13 @@
limitations under the License.
==================================================================== */
-package org.apache.poi.hmef;
+package org.apache.poi.hmef.attribute;
import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import org.apache.poi.hmef.Attachment;
+import org.apache.poi.hmef.HMEFMessage;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.LittleEndian;
@@ -34,192 +32,8 @@ import org.apache.poi.util.LittleEndian;
* Note - the types and IDs differ from standard Outlook/MAPI
* ones, so we can't just re-use the HSMF ones.
*/
-public final class Attribute {
- // Types taken from http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefattributetype%28v=EXCHG.140%29.aspx
- public static final int TYPE_TRIPLES = 0x0000;
- public static final int TYPE_STRING = 0x0001;
- public static final int TYPE_TEXT = 0x0002;
- public static final int TYPE_DATE = 0x0003;
- public static final int TYPE_SHORT = 0x0004;
- public static final int TYPE_LONG = 0x0005;
- public static final int TYPE_BYTE = 0x0006;
- public static final int TYPE_WORD = 0x0007;
- public static final int TYPE_DWORD = 0x0008;
- public static final int TYPE_MAX = 0x0009;
-
- // Types taken from http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefpropertytype%28v=EXCHG.140%29.aspx
- /** AppTime - application time value */
- public static final int PTYPE_APPTIME = 0x0007;
- /** Binary - counted byte array */
- public static final int PTYPE_BINARY = 0x0102;
- /** Boolean - 16-bit Boolean value. '0' is false. Non-zero is true */
- public static final int PTYPE_BOOLEAN = 0x000B;
- /** ClassId - OLE GUID */
- public static final int PTYPE_CLASSID = 0x0048;
- /** Currency - signed 64-bit integer that represents a base ten decimal with four digits to the right of the decimal point */
- public static final int PTYPE_CURRENCY = 0x0006;
- /** Double - floating point double */
- public static final int PTYPE_DOUBLE = 0x0005;
- /** Error - 32-bit error value */
- public static final int PTYPE_ERROR = 0x000A;
- /** I2 - signed 16-bit value */
- public static final int PTYPE_I2 = 0x0002;
- /** I8 - 8-byte signed integer */
- public static final int PTYPE_I8 = 0x0014;
- /** Long - signed 32-bit value */
- public static final int PTYPE_LONG = 0x0003;
- /** MultiValued - Value part contains multiple values */
- public static final int PTYPE_MULTIVALUED = 0x1000;
- /** Null - NULL property value */
- public static final int PTYPE_NULL = 0x0001;
- /** Object - embedded object in a property */
- public static final int PTYPE_OBJECT = 0x000D;
- /** R4 - 4-byte floating point value */
- public static final int PTYPE_R4 = 0x0004;
- /** String8 - null-terminated 8-bit character string */
- public static final int PTYPE_STRING8 = 0x001E;
- /** SysTime - FILETIME 64-bit integer specifying the number of 100ns periods since Jan 1, 1601 */
- public static final int PTYPE_SYSTIME = 0x0040;
- /** Unicode - null-terminated Unicode string */
- public static final int PTYPE_UNICODE = 0x001F;
- /** Unspecified */
- public static final int PTYPE_UNSPECIFIED = 0x0000;
-
-
- // Levels taken from http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefattributelevel%28v=EXCHG.140%29.aspx
- public static final int LEVEL_MESSAGE = 0x01;
- public static final int LEVEL_ATTACHMENT = 0x02;
- public static final int LEVEL_END_OF_FILE = -0x01;
-
- // ID information taken from http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefattributetag%28v=EXCHG.140%29.aspx
- public static final AttributeID ID_AIDOWNER =
- new AttributeID(0x0008, TYPE_LONG, "AidOwner", "PR_OWNER_APPT_ID");
- public static final AttributeID ID_ATTACHCREATEDATE =
- new AttributeID(0x8012, TYPE_DATE, "AttachCreateDate", "PR_CREATION_TIME");
- public static final AttributeID ID_ATTACHDATA =
- new AttributeID(0x800F, TYPE_BYTE, "AttachData", "PR_ATTACH_DATA_BIN");
- public static final AttributeID ID_ATTACHMENT =
- new AttributeID(0x9005, TYPE_BYTE, "Attachment", null);
- public static final AttributeID ID_ATTACHMETAFILE =
- new AttributeID(0x8011, TYPE_BYTE, "AttachMetaFile", "PR_ATTACH_RENDERING");
- public static final AttributeID ID_ATTACHMODIFYDATE =
- new AttributeID(0x8013, TYPE_DATE, "AttachModifyDate", "PR_LAST_MODIFICATION_TIME");
- public static final AttributeID ID_ATTACHRENDERDATA =
- new AttributeID(0x9002, TYPE_BYTE, "AttachRenderData", "attAttachRenddata");
- public static final AttributeID ID_ATTACHTITLE =
- new AttributeID(0x8010, TYPE_STRING, "AttachTitle", "PR_ATTACH_FILENAME");
- public static final AttributeID ID_ATTACHTRANSPORTFILENAME =
- new AttributeID(0x9001, TYPE_BYTE, "AttachTransportFilename", "PR_ATTACH_TRANSPORT_NAME");
- public static final AttributeID ID_BODY =
- new AttributeID(0x800C, TYPE_TEXT, "Body", "PR_BODY");
- public static final AttributeID ID_CONVERSATIONID =
- new AttributeID(0x800B, TYPE_STRING, "ConversationId", "PR_CONVERSATION_KEY");
- public static final AttributeID ID_DATEEND =
- new AttributeID(0x0007, TYPE_DATE, "DateEnd", "PR_END_DATE");
- public static final AttributeID ID_DATEMODIFIED =
- new AttributeID(0x8020, TYPE_DATE, "DateModified", "PR_LAST_MODIFICATION_TIME ");
- public static final AttributeID ID_DATERECEIVED =
- new AttributeID(0x8006, TYPE_DATE, "DateReceived", "PR_MESSAGE_DELIVERY_TIME ");
- public static final AttributeID ID_DATESENT =
- new AttributeID(0x8005, TYPE_DATE, "DateSent", "PR_CLIENT_SUBMIT_TIME ");
- public static final AttributeID ID_DATESTART =
- new AttributeID(0x0006, TYPE_DATE, "DateStart", "PR_START_DATE ");
- public static final AttributeID ID_DELEGATE =
- new AttributeID(0x0002, TYPE_BYTE, "Delegate", "PR_RCVD_REPRESENTING_xxx ");
- public static final AttributeID ID_FROM =
- new AttributeID(0x8000, TYPE_STRING, "From", "PR_SENDER_ENTRYID");
- public static final AttributeID ID_MAPIPROPERTIES =
- new AttributeID(0x9003, TYPE_BYTE, "MapiProperties", null);
- public static final AttributeID ID_MESSAGECLASS =
- new AttributeID(0x8008, TYPE_WORD, "MessageClass", "PR_MESSAGE_CLASS ");
- public static final AttributeID ID_MESSAGEID =
- new AttributeID(0x8009, TYPE_STRING, "MessageId", "PR_SEARCH_KEY");
- public static final AttributeID ID_MESSAGESTATUS =
- new AttributeID(0x8007, TYPE_BYTE, "MessageStatus", "PR_MESSAGE_FLAGS");
- public static final AttributeID ID_NULL =
- new AttributeID(0x0000, -1, "Null", null);
- public static final AttributeID ID_OEMCODEPAGE =
- new AttributeID(0x9007, TYPE_BYTE, "OemCodepage", "AttOemCodepage");
- public static final AttributeID ID_ORIGINALMESSAGECLASS =
- new AttributeID(0x0006, TYPE_WORD, "OriginalMessageClass", "PR_ORIG_MESSAGE_CLASS");
- public static final AttributeID ID_OWNER =
- new AttributeID(0x0000, TYPE_BYTE, "Owner", "PR_RCVD_REPRESENTING_xxx");
- public static final AttributeID ID_PARENTID =
- new AttributeID(0x800A, TYPE_STRING, "ParentId", "PR_PARENT_KEY");
- public static final AttributeID ID_PRIORITY =
- new AttributeID(0x800D, TYPE_SHORT, "Priority", "PR_IMPORTANCE");
- public static final AttributeID ID_RECIPIENTTABLE =
- new AttributeID(0x9004, TYPE_BYTE, "RecipientTable", "PR_MESSAGE_RECIPIENTS");
- public static final AttributeID ID_REQUESTRESPONSE =
- new AttributeID(0x009, TYPE_SHORT, "RequestResponse", "PR_RESPONSE_REQUESTED");
- public static final AttributeID ID_SENTFOR =
- new AttributeID(0x0001, TYPE_BYTE, "SentFor", "PR_SENT_REPRESENTING_xxx");
- public static final AttributeID ID_SUBJECT =
- new AttributeID(0x8004, TYPE_STRING, "Subject", "PR_SUBJECT");
- public static final AttributeID ID_TNEFVERSION =
- new AttributeID(0x9006, TYPE_DWORD, "TnefVersion", "attTnefVersion");
- public static final AttributeID ID_UNKNOWN =
- new AttributeID(-1, -1, "Unknown", null);
-
- /**
- * Holds information on one potential ID of an
- * attribute, and provides handy lookups for it.
- */
- public static class AttributeID {
- private static Map<Integer, List<AttributeID>> attributes = new HashMap<Integer, List<AttributeID>>();
-
- public final int id;
- public final int usualType;
- public final String name;
- public final String mapiProperty;
-
- private AttributeID(int id, int usualType, String name, String mapiProperty) {
- this.id = id;
- this.usualType = usualType;
- this.name = name;
- this.mapiProperty = mapiProperty;
-
- // Store it for lookup
- if(! attributes.containsKey(id)) {
- attributes.put(id, new ArrayList<AttributeID>());
- }
- attributes.get(id).add(this);
- }
- public static AttributeID getBest(int id, int type) {
- List<AttributeID> attrs = attributes.get(id);
- if(attrs == null) {
- return ID_UNKNOWN;
- }
-
- // If there's only one, it's easy
- if(attrs.size() == 1) {
- return attrs.get(0);
- }
-
- // Try by type
- for(AttributeID attr : attrs) {
- if(attr.usualType == type) return attr;
- }
-
- // Go for the first if we can't otherwise decide...
- return attrs.get(0);
- }
- 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();
- }
- }
-
- private final AttributeID id;
+public final class TNEFAttribute {
+ private final TNEFProperty property;
private final int type;
private final byte[] data;
private final int checksum;
@@ -228,12 +42,12 @@ public final class Attribute {
* Constructs a single new attribute from
* the contents of the stream
*/
- public Attribute(InputStream inp) throws IOException {
+ public TNEFAttribute(InputStream inp) throws IOException {
int id = LittleEndian.readUShort(inp);
this.type = LittleEndian.readUShort(inp);
int length = LittleEndian.readInt(inp);
- this.id = AttributeID.getBest(id, type);
+ property = TNEFProperty.getBest(id, type);
data = new byte[length];
IOUtils.readFully(inp, data);
@@ -243,8 +57,8 @@ public final class Attribute {
// a different way, as we need to recurse into it
}
- public AttributeID getId() {
- return id;
+ public TNEFProperty getProperty() {
+ return property;
}
public int getType() {
@@ -256,7 +70,7 @@ public final class Attribute {
}
public String toString() {
- return "Attachment " + getId().toString() + ", type=" + type +
+ return "Attachment " + property.toString() + ", type=" + type +
", data length=" + data.length;
}
}
Added: poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFProperty.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFProperty.java?rev=1076251&view=auto
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFProperty.java (added)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hmef/attribute/TNEFProperty.java Wed Mar 2 15:25:35 2011
@@ -0,0 +1,216 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hmef.attribute;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Holds the list of TNEF Attributes, and allows lookup
+ * by friendly name, ID and MAPI Property Name.
+ *
+ * Note - the types and IDs differ from standard Outlook/MAPI
+ * ones, so we can't just re-use the HSMF ones.
+ */
+public final class TNEFProperty {
+ private static Map<Integer, List<TNEFProperty>> properties = new HashMap<Integer, List<TNEFProperty>>();
+
+ // Types taken from http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefattributetype%28v=EXCHG.140%29.aspx
+ public static final int TYPE_TRIPLES = 0x0000;
+ public static final int TYPE_STRING = 0x0001;
+ public static final int TYPE_TEXT = 0x0002;
+ public static final int TYPE_DATE = 0x0003;
+ public static final int TYPE_SHORT = 0x0004;
+ public static final int TYPE_LONG = 0x0005;
+ public static final int TYPE_BYTE = 0x0006;
+ public static final int TYPE_WORD = 0x0007;
+ public static final int TYPE_DWORD = 0x0008;
+ public static final int TYPE_MAX = 0x0009;
+
+ // Types taken from http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefpropertytype%28v=EXCHG.140%29.aspx
+ /** AppTime - application time value */
+ public static final int PTYPE_APPTIME = 0x0007;
+ /** Binary - counted byte array */
+ public static final int PTYPE_BINARY = 0x0102;
+ /** Boolean - 16-bit Boolean value. '0' is false. Non-zero is true */
+ public static final int PTYPE_BOOLEAN = 0x000B;
+ /** ClassId - OLE GUID */
+ public static final int PTYPE_CLASSID = 0x0048;
+ /** Currency - signed 64-bit integer that represents a base ten decimal with four digits to the right of the decimal point */
+ public static final int PTYPE_CURRENCY = 0x0006;
+ /** Double - floating point double */
+ public static final int PTYPE_DOUBLE = 0x0005;
+ /** Error - 32-bit error value */
+ public static final int PTYPE_ERROR = 0x000A;
+ /** I2 - signed 16-bit value */
+ public static final int PTYPE_I2 = 0x0002;
+ /** I8 - 8-byte signed integer */
+ public static final int PTYPE_I8 = 0x0014;
+ /** Long - signed 32-bit value */
+ public static final int PTYPE_LONG = 0x0003;
+ /** MultiValued - Value part contains multiple values */
+ public static final int PTYPE_MULTIVALUED = 0x1000;
+ /** Null - NULL property value */
+ public static final int PTYPE_NULL = 0x0001;
+ /** Object - embedded object in a property */
+ public static final int PTYPE_OBJECT = 0x000D;
+ /** R4 - 4-byte floating point value */
+ public static final int PTYPE_R4 = 0x0004;
+ /** String8 - null-terminated 8-bit character string */
+ public static final int PTYPE_STRING8 = 0x001E;
+ /** SysTime - FILETIME 64-bit integer specifying the number of 100ns periods since Jan 1, 1601 */
+ public static final int PTYPE_SYSTIME = 0x0040;
+ /** Unicode - null-terminated Unicode string */
+ public static final int PTYPE_UNICODE = 0x001F;
+ /** Unspecified */
+ public static final int PTYPE_UNSPECIFIED = 0x0000;
+
+
+ // Levels taken from http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefattributelevel%28v=EXCHG.140%29.aspx
+ public static final int LEVEL_MESSAGE = 0x01;
+ public static final int LEVEL_ATTACHMENT = 0x02;
+ public static final int LEVEL_END_OF_FILE = -0x01;
+
+ // ID information taken from http://msdn.microsoft.com/en-us/library/microsoft.exchange.data.contenttypes.tnef.tnefattributetag%28v=EXCHG.140%29.aspx
+ public static final TNEFProperty ID_AIDOWNER =
+ new TNEFProperty(0x0008, TYPE_LONG, "AidOwner", "PR_OWNER_APPT_ID");
+ public static final TNEFProperty ID_ATTACHCREATEDATE =
+ new TNEFProperty(0x8012, TYPE_DATE, "AttachCreateDate", "PR_CREATION_TIME");
+ public static final TNEFProperty ID_ATTACHDATA =
+ new TNEFProperty(0x800F, TYPE_BYTE, "AttachData", "PR_ATTACH_DATA_BIN");
+ public static final TNEFProperty ID_ATTACHMENT =
+ new TNEFProperty(0x9005, TYPE_BYTE, "Attachment", null);
+ public static final TNEFProperty ID_ATTACHMETAFILE =
+ new TNEFProperty(0x8011, TYPE_BYTE, "AttachMetaFile", "PR_ATTACH_RENDERING");
+ public static final TNEFProperty ID_ATTACHMODIFYDATE =
+ new TNEFProperty(0x8013, TYPE_DATE, "AttachModifyDate", "PR_LAST_MODIFICATION_TIME");
+ public static final TNEFProperty ID_ATTACHRENDERDATA =
+ new TNEFProperty(0x9002, TYPE_BYTE, "AttachRenderData", "attAttachRenddata");
+ public static final TNEFProperty ID_ATTACHTITLE =
+ new TNEFProperty(0x8010, TYPE_STRING, "AttachTitle", "PR_ATTACH_FILENAME");
+ public static final TNEFProperty ID_ATTACHTRANSPORTFILENAME =
+ new TNEFProperty(0x9001, TYPE_BYTE, "AttachTransportFilename", "PR_ATTACH_TRANSPORT_NAME");
+ public static final TNEFProperty ID_BODY =
+ new TNEFProperty(0x800C, TYPE_TEXT, "Body", "PR_BODY");
+ public static final TNEFProperty ID_CONVERSATIONID =
+ new TNEFProperty(0x800B, TYPE_STRING, "ConversationId", "PR_CONVERSATION_KEY");
+ public static final TNEFProperty ID_DATEEND =
+ new TNEFProperty(0x0007, TYPE_DATE, "DateEnd", "PR_END_DATE");
+ public static final TNEFProperty ID_DATEMODIFIED =
+ new TNEFProperty(0x8020, TYPE_DATE, "DateModified", "PR_LAST_MODIFICATION_TIME ");
+ public static final TNEFProperty ID_DATERECEIVED =
+ new TNEFProperty(0x8006, TYPE_DATE, "DateReceived", "PR_MESSAGE_DELIVERY_TIME ");
+ public static final TNEFProperty ID_DATESENT =
+ new TNEFProperty(0x8005, TYPE_DATE, "DateSent", "PR_CLIENT_SUBMIT_TIME ");
+ public static final TNEFProperty ID_DATESTART =
+ new TNEFProperty(0x0006, TYPE_DATE, "DateStart", "PR_START_DATE ");
+ public static final TNEFProperty ID_DELEGATE =
+ new TNEFProperty(0x0002, TYPE_BYTE, "Delegate", "PR_RCVD_REPRESENTING_xxx ");
+ public static final TNEFProperty ID_FROM =
+ new TNEFProperty(0x8000, TYPE_STRING, "From", "PR_SENDER_ENTRYID");
+ public static final TNEFProperty ID_MAPIPROPERTIES =
+ new TNEFProperty(0x9003, TYPE_BYTE, "MapiProperties", null);
+ public static final TNEFProperty ID_MESSAGECLASS =
+ new TNEFProperty(0x8008, TYPE_WORD, "MessageClass", "PR_MESSAGE_CLASS ");
+ public static final TNEFProperty ID_MESSAGEID =
+ new TNEFProperty(0x8009, TYPE_STRING, "MessageId", "PR_SEARCH_KEY");
+ public static final TNEFProperty ID_MESSAGESTATUS =
+ new TNEFProperty(0x8007, TYPE_BYTE, "MessageStatus", "PR_MESSAGE_FLAGS");
+ public static final TNEFProperty ID_NULL =
+ new TNEFProperty(0x0000, -1, "Null", null);
+ public static final TNEFProperty ID_OEMCODEPAGE =
+ new TNEFProperty(0x9007, TYPE_BYTE, "OemCodepage", "AttOemCodepage");
+ public static final TNEFProperty ID_ORIGINALMESSAGECLASS =
+ new TNEFProperty(0x0006, TYPE_WORD, "OriginalMessageClass", "PR_ORIG_MESSAGE_CLASS");
+ public static final TNEFProperty ID_OWNER =
+ new TNEFProperty(0x0000, TYPE_BYTE, "Owner", "PR_RCVD_REPRESENTING_xxx");
+ public static final TNEFProperty ID_PARENTID =
+ new TNEFProperty(0x800A, TYPE_STRING, "ParentId", "PR_PARENT_KEY");
+ public static final TNEFProperty ID_PRIORITY =
+ new TNEFProperty(0x800D, TYPE_SHORT, "Priority", "PR_IMPORTANCE");
+ public static final TNEFProperty ID_RECIPIENTTABLE =
+ new TNEFProperty(0x9004, TYPE_BYTE, "RecipientTable", "PR_MESSAGE_RECIPIENTS");
+ public static final TNEFProperty ID_REQUESTRESPONSE =
+ new TNEFProperty(0x009, TYPE_SHORT, "RequestResponse", "PR_RESPONSE_REQUESTED");
+ public static final TNEFProperty ID_SENTFOR =
+ new TNEFProperty(0x0001, TYPE_BYTE, "SentFor", "PR_SENT_REPRESENTING_xxx");
+ public static final TNEFProperty ID_SUBJECT =
+ new TNEFProperty(0x8004, TYPE_STRING, "Subject", "PR_SUBJECT");
+ public static final TNEFProperty ID_TNEFVERSION =
+ new TNEFProperty(0x9006, TYPE_DWORD, "TnefVersion", "attTnefVersion");
+ public static final TNEFProperty ID_UNKNOWN =
+ new TNEFProperty(-1, -1, "Unknown", null);
+
+ /** The TNEF Property ID */
+ public final int id;
+ /** Usual Type */
+ public final int usualType;
+ /** Property Name */
+ public final String name;
+ /** Equivalent MAPI Property */
+ public final String mapiProperty;
+
+ private TNEFProperty(int id, int usualType, String name, String mapiProperty) {
+ this.id = id;
+ this.usualType = usualType;
+ this.name = name;
+ this.mapiProperty = mapiProperty;
+
+ // Store it for lookup
+ if(! properties.containsKey(id)) {
+ properties.put(id, new ArrayList<TNEFProperty>());
+ }
+ properties.get(id).add(this);
+ }
+
+ public static TNEFProperty getBest(int id, int type) {
+ List<TNEFProperty> attrs = properties.get(id);
+ if(attrs == null) {
+ return ID_UNKNOWN;
+ }
+
+ // If there's only one, it's easy
+ if(attrs.size() == 1) {
+ return attrs.get(0);
+ }
+
+ // Try by type
+ for(TNEFProperty attr : attrs) {
+ if(attr.usualType == type) return attr;
+ }
+
+ // Go for the first if we can't otherwise decide...
+ return attrs.get(0);
+ }
+
+ 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();
+ }
+}
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hmef/dev/HMEFDumper.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hmef/dev/HMEFDumper.java?rev=1076251&r1=1076250&r2=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hmef/dev/HMEFDumper.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hmef/dev/HMEFDumper.java Wed Mar 2 15:25:35 2011
@@ -22,9 +22,10 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.List;
-import org.apache.poi.hmef.Attribute;
import org.apache.poi.hmef.HMEFMessage;
-import org.apache.poi.hmef.MAPIAttribute;
+import org.apache.poi.hmef.attribute.TNEFAttribute;
+import org.apache.poi.hmef.attribute.MAPIAttribute;
+import org.apache.poi.hmef.attribute.TNEFProperty;
import org.apache.poi.util.HexDump;
import org.apache.poi.util.LittleEndian;
@@ -82,17 +83,17 @@ public final class HMEFDumper {
while(true) {
// Fetch the level
level = inp.read();
- if(level == Attribute.LEVEL_END_OF_FILE) {
+ if(level == TNEFProperty.LEVEL_END_OF_FILE) {
break;
}
// Build the attribute
- Attribute attr = new Attribute(inp);
+ TNEFAttribute attr = new TNEFAttribute(inp);
// Print the attribute into
System.out.println(
"Level " + level + " : Type " + attr.getType() +
- " : ID " + attr.getId().toString()
+ " : ID " + attr.getProperty().toString()
);
// Print the contents
@@ -124,7 +125,7 @@ public final class HMEFDumper {
}
System.out.println();
- if(attr.getId() == Attribute.ID_MAPIPROPERTIES) {
+ if(attr.getProperty() == TNEFProperty.ID_MAPIPROPERTIES) {
List<MAPIAttribute> attrs = MAPIAttribute.create(attr);
for(MAPIAttribute ma : attrs) {
System.out.println(indent + indent + ma);
Modified: poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestCompressedRTF.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestCompressedRTF.java?rev=1076251&r1=1076250&r2=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestCompressedRTF.java (original)
+++ poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestCompressedRTF.java Wed Mar 2 15:25:35 2011
@@ -22,7 +22,8 @@ import java.io.ByteArrayInputStream;
import junit.framework.TestCase;
import org.apache.poi.POIDataSamples;
-import org.apache.poi.hmef.Attribute.AttributeID;
+import org.apache.poi.hmef.attribute.MAPIAttribute;
+import org.apache.poi.hmef.attribute.MAPIRtfAttribute;
import org.apache.poi.hsmf.datatypes.MAPIProperty;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.StringUtil;
Modified: poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestHMEFMessage.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestHMEFMessage.java?rev=1076251&r1=1076250&r2=1076251&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestHMEFMessage.java (original)
+++ poi/trunk/src/scratchpad/testcases/org/apache/poi/hmef/TestHMEFMessage.java Wed Mar 2 15:25:35 2011
@@ -20,6 +20,8 @@ package org.apache.poi.hmef;
import junit.framework.TestCase;
import org.apache.poi.POIDataSamples;
+import org.apache.poi.hmef.attribute.TNEFAttribute;
+import org.apache.poi.hmef.attribute.TNEFProperty;
public final class TestHMEFMessage extends TestCase {
private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance();
@@ -70,20 +72,20 @@ public final class TestHMEFMessage exten
// Should have version, codepage, class and MAPI
assertEquals(4, msg.getMessageAttributes().size());
- assertNotNull(msg.getMessageAttribute(Attribute.ID_TNEFVERSION));
- assertNotNull(msg.getMessageAttribute(Attribute.ID_OEMCODEPAGE));
- assertNotNull(msg.getMessageAttribute(Attribute.ID_MESSAGECLASS));
- assertNotNull(msg.getMessageAttribute(Attribute.ID_MAPIPROPERTIES));
+ assertNotNull(msg.getMessageAttribute(TNEFProperty.ID_TNEFVERSION));
+ assertNotNull(msg.getMessageAttribute(TNEFProperty.ID_OEMCODEPAGE));
+ assertNotNull(msg.getMessageAttribute(TNEFProperty.ID_MESSAGECLASS));
+ assertNotNull(msg.getMessageAttribute(TNEFProperty.ID_MAPIPROPERTIES));
// Check the order
- assertEquals(Attribute.ID_TNEFVERSION, msg.getMessageAttributes().get(0).getId());
- assertEquals(Attribute.ID_OEMCODEPAGE, msg.getMessageAttributes().get(1).getId());
- assertEquals(Attribute.ID_MESSAGECLASS, msg.getMessageAttributes().get(2).getId());
- assertEquals(Attribute.ID_MAPIPROPERTIES, msg.getMessageAttributes().get(3).getId());
+ assertEquals(TNEFProperty.ID_TNEFVERSION, msg.getMessageAttributes().get(0).getProperty());
+ assertEquals(TNEFProperty.ID_OEMCODEPAGE, msg.getMessageAttributes().get(1).getProperty());
+ assertEquals(TNEFProperty.ID_MESSAGECLASS, msg.getMessageAttributes().get(2).getProperty());
+ assertEquals(TNEFProperty.ID_MAPIPROPERTIES, msg.getMessageAttributes().get(3).getProperty());
// Check some that aren't there
- assertNull(msg.getMessageAttribute(Attribute.ID_AIDOWNER));
- assertNull(msg.getMessageAttribute(Attribute.ID_ATTACHDATA));
+ assertNull(msg.getMessageAttribute(TNEFProperty.ID_AIDOWNER));
+ assertNull(msg.getMessageAttribute(TNEFProperty.ID_ATTACHDATA));
// Now check the details of one or two
// TODO
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org