From 58806414fc645c6fa6662ec4ce1f46946469a982 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 8 Jan 2010 12:08:35 +0000 Subject: [PATCH] Tweak a few tests, and add in a few more chunk types git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@897185 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/org/apache/poi/hsmf/MAPIMessage.java | 7 +- .../poi/hsmf/datatypes/AttachmentChunks.java | 12 +++ .../org/apache/poi/hsmf/datatypes/Chunks.java | 1 + .../poi/hsmf/datatypes/RecipientChunks.java | 1 + .../poi/hsmf/TestFileWithAttachmentsRead.java | 94 ++++++++++--------- .../hsmf/parsers/TestPOIFSChunkParser.java | 1 - 6 files changed, 70 insertions(+), 46 deletions(-) diff --git a/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java b/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java index 790669032..936715f2b 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java @@ -35,8 +35,11 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * Reads an Outlook MSG File in and provides hooks into its data structure. - * - * @author Travis Ferguson + * + * If you want to develop with HSMF, you might find it worth getting + * some of the microsoft public documentation, such as: + * + * [MS-OXCMSG]: Message and Attachment Object Protocol Specification */ public class MAPIMessage { private POIFSFileSystem fs; 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 c7ad005e7..10984b941 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/AttachmentChunks.java @@ -27,9 +27,13 @@ public class AttachmentChunks implements ChunkGroup { /* String parts of Outlook Messages Attachments that are currently known */ public static final int ATTACH_DATA = 0x3701; + // 0x3702 might be "attach encoding" public static final int ATTACH_EXTENSION = 0x3703; public static final int ATTACH_FILENAME = 0x3704; + // 0x3705 might be "attach method" public static final int ATTACH_LONG_FILENAME = 0x3707; + public static final int ATTACH_RENDERING_WMF = 0x3709; + // 0x370B might be "rendering position" public static final int ATTACH_MIME_TAG = 0x370E; public ByteChunk attachData; @@ -37,6 +41,12 @@ public class AttachmentChunks implements ChunkGroup { public StringChunk attachFileName; public StringChunk attachLongFileName; public StringChunk attachMimeTag; + /** + * 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. @@ -82,6 +92,8 @@ public class AttachmentChunks implements ChunkGroup { case ATTACH_MIME_TAG: attachMimeTag = (StringChunk)chunk; break; + case ATTACH_RENDERING_WMF: + attachRenderingWMF = (ByteChunk)chunk; } // And add to the main list 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 9f68cc167..d6b433c15 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java @@ -86,6 +86,7 @@ public final class Chunks implements ChunkGroup { subjectChunk = (StringChunk)chunk; break; case DATE: + // TODO - parse dateChunk = (ByteChunk)chunk; break; case CONVERSATION_TOPIC: 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 b5157bb2c..d03a96242 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java @@ -53,6 +53,7 @@ public final class RecipientChunks implements ChunkGroup { public void record(Chunk chunk) { switch(chunk.getChunkId()) { case RECIPIENT_SEARCH: + // TODO - parse recipientSearchChunk = (ByteChunk)chunk; break; case RECIPIENT_EMAIL: diff --git a/src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java b/src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java index c3fcda741..cd8bfbf11 100644 --- a/src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java +++ b/src/scratchpad/testcases/org/apache/poi/hsmf/TestFileWithAttachmentsRead.java @@ -17,18 +17,13 @@ package org.apache.poi.hsmf; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.Iterator; -import java.util.Map; import junit.framework.TestCase; -import org.apache.poi.hsmf.MAPIMessage; +import org.apache.poi.POIDataSamples; import org.apache.poi.hsmf.datatypes.AttachmentChunks; import org.apache.poi.hsmf.exceptions.ChunkNotFoundException; -import org.apache.poi.POIDataSamples; /** * Tests to verify that we can read attachments from msg file @@ -36,50 +31,63 @@ import org.apache.poi.POIDataSamples; * @author Nicolas Bureau */ public class TestFileWithAttachmentsRead extends TestCase { - private MAPIMessage mapiMessage; + private MAPIMessage mapiMessage; - /** - * Initialize this test, load up the attachment_test_msg.msg mapi message. - * - * @throws Exception - */ - public TestFileWithAttachmentsRead() throws IOException { - POIDataSamples samples = POIDataSamples.getHSMFInstance(); - this.mapiMessage = new MAPIMessage(samples.openResourceAsStream("attachment_test_msg.msg")); - } + /** + * Initialize this test, load up the attachment_test_msg.msg mapi message. + * + * @throws Exception + */ + public TestFileWithAttachmentsRead() throws IOException { + POIDataSamples samples = POIDataSamples.getHSMFInstance(); + this.mapiMessage = new MAPIMessage(samples.openResourceAsStream("attachment_test_msg.msg")); + } - /** - * Test to see if we can retrieve attachments. - * - * @throws ChunkNotFoundException - * - */ - // public void testReadDisplayCC() throws ChunkNotFoundException { - public void testRetrieveAttachments() { - AttachmentChunks[] attachments = mapiMessage.getAttachmentFiles(); - int obtained = attachments.length; - int expected = 2; + /** + * Test to see if we can retrieve attachments. + * + * @throws ChunkNotFoundException + * + */ + public void testRetrieveAttachments() { + AttachmentChunks[] attachments = mapiMessage.getAttachmentFiles(); + int obtained = attachments.length; + int expected = 2; - TestCase.assertEquals(obtained, expected); - } + TestCase.assertEquals(obtained, expected); + } - /** - * Test to see if attachments are not empty. - * - * @throws ChunkNotFoundException - * - */ - public void testReadAttachments() throws IOException { + /** + * Test to see if attachments are not empty. + */ + public void testReadAttachments() throws IOException { AttachmentChunks[] attachments = mapiMessage.getAttachmentFiles(); - for (AttachmentChunks attachment : attachments) { - assertTrue(attachment.attachFileName.getValue().length() > 0); + // Basic checks + for (AttachmentChunks attachment : attachments) { + assertTrue(attachment.attachFileName.getValue().length() > 0); assertTrue(attachment.attachLongFileName.getValue().length() > 0); assertTrue(attachment.attachExtension.getValue().length() > 0); - assertTrue(attachment.attachMimeTag.getValue().length() > 0); - } - - // TODO better checking - } + if(attachment.attachMimeTag != null) { + assertTrue(attachment.attachMimeTag.getValue().length() > 0); + } + } + AttachmentChunks attachment; + + // Now check in detail + attachment = mapiMessage.getAttachmentFiles()[0]; + assertEquals("TEST-U~1.DOC", attachment.attachFileName.toString()); + assertEquals("test-unicode.doc", attachment.attachLongFileName.toString()); + assertEquals(".doc", attachment.attachExtension.getValue()); + assertEquals(null, attachment.attachMimeTag); + assertEquals(24064, attachment.attachData.getValue().length); + + attachment = mapiMessage.getAttachmentFiles()[1]; + assertEquals("pj1.txt", attachment.attachFileName.toString()); + assertEquals("pj1.txt", attachment.attachLongFileName.toString()); + assertEquals(".txt", attachment.attachExtension.getValue()); + assertEquals(null, attachment.attachMimeTag); + assertEquals(89, attachment.attachData.getValue().length); + } } diff --git a/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java b/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java index f379d8b2b..5c9e55f96 100644 --- a/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java +++ b/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java @@ -20,7 +20,6 @@ package org.apache.poi.hsmf.parsers; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.nio.charset.Charset; import org.apache.poi.hsmf.MAPIMessage; import org.apache.poi.hsmf.datatypes.AttachmentChunks;