Author: nick
Date: Fri Jan 8 11:14:58 2010
New Revision: 897167
URL: http://svn.apache.org/viewvc?rev=897167&view=rev
Log:
Fix some chunk types, fix the directory descent, fix the Msg2txt example, and
start on fixing core tests
Added:
poi/trunk/test-data/hsmf/quick.msg (with props)
Modified:
poi/trunk/src/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/parsers/POIFSChunkParser.java
poi/trunk/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java
Modified: poi/trunk/src/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java?rev=897167&r1=897166&r2=897167&view=diff
==============================================================================
--- poi/trunk/src/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java
(original)
+++ poi/trunk/src/examples/src/org/apache/poi/hsmf/examples/Msg2txt.java Fri
Jan 8 11:14:58 2010
@@ -17,16 +17,14 @@
package org.apache.poi.hsmf.examples;
-import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
-import java.util.Iterator;
-import java.util.Map;
import org.apache.poi.hsmf.MAPIMessage;
+import org.apache.poi.hsmf.datatypes.AttachmentChunks;
import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
/**
@@ -35,7 +33,6 @@
* attachments.
*
* @author Bruno Girin
- *
*/
public class Msg2txt {
@@ -105,17 +102,13 @@
} catch (ChunkNotFoundException e) {
System.err.println("No message body");
}
- Map attachmentMap = msg.getAttachmentFiles();
- if(attachmentMap.size() > 0) {
+
+ AttachmentChunks[] attachments =
msg.getAttachmentFiles();
+ if(attachments.length > 0) {
File d = new File(attDirName);
if(d.mkdir()) {
- for(
- Iterator ii =
attachmentMap.entrySet().iterator();
- ii.hasNext();
- ) {
- Map.Entry entry =
(Map.Entry)ii.next();
- processAttachment(d,
entry.getKey().toString(),
-
(ByteArrayInputStream)entry.getValue());
+ for(AttachmentChunks attachment :
attachments) {
+ processAttachment(attachment,
d);
}
} else {
System.err.println("Can't create
directory "+attDirName);
@@ -131,33 +124,26 @@
/**
* Processes a single attachment: reads it from the Outlook MSG file and
* writes it to disk as an individual file.
- *
+ *
+ * @param attachment the chunk group describing the attachment
* @param dir the directory in which to write the attachment file
- * @param fileName the name of the attachment file
- * @param fileIn the input stream that contains the attachment's data
* @throws IOException when any of the file operations fails
*/
- public void processAttachment(File dir, String fileName,
- ByteArrayInputStream fileIn) throws IOException {
+ public void processAttachment(AttachmentChunks attachment,
+ File dir) throws IOException {
+ String fileName = attachment.attachFileName.toString();
+ if(attachment.attachLongFileName != null) {
+ fileName = attachment.attachLongFileName.toString();
+ }
+
File f = new File(dir, fileName);
OutputStream fileOut = null;
try {
fileOut = new FileOutputStream(f);
- byte[] buffer = new byte[2048];
- int bNum = fileIn.read(buffer);
- while(bNum > 0) {
- fileOut.write(buffer);
- bNum = fileIn.read(buffer);
- }
+ fileOut.write(attachment.attachData.getValue());
} finally {
- try {
- if(fileIn != null) {
- fileIn.close();
- }
- } finally {
- if(fileOut != null) {
- fileOut.close();
- }
+ if(fileOut != null) {
+ fileOut.close();
}
}
}
Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java?rev=897167&r1=897166&r2=897167&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java
(original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/Chunks.java Fri
Jan 8 11:14:58 2010
@@ -63,7 +63,7 @@
/** Type of server that the message originated from (SMTP, etc). */
public StringChunk sentByServerType;
/** TODO */
- public StringChunk dateChunk;
+ public ByteChunk dateChunk;
/** TODO */
public StringChunk emailFromChunk;
@@ -86,7 +86,7 @@
subjectChunk = (StringChunk)chunk;
break;
case DATE:
- dateChunk = (StringChunk)chunk;
+ dateChunk = (ByteChunk)chunk;
break;
case CONVERSATION_TOPIC:
conversationTopic = (StringChunk)chunk;
Modified:
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java?rev=897167&r1=897166&r2=897167&view=diff
==============================================================================
---
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java
(original)
+++
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/RecipientChunks.java
Fri Jan 8 11:14:58 2010
@@ -32,7 +32,7 @@
public static final int RECIPIENT_EMAIL = 0x39FE;
/** TODO */
- public StringChunk recipientSearchChunk;
+ public ByteChunk recipientSearchChunk;
/** TODO */
public StringChunk recipientEmailChunk;
@@ -53,7 +53,7 @@
public void record(Chunk chunk) {
switch(chunk.getChunkId()) {
case RECIPIENT_SEARCH:
- recipientSearchChunk = (StringChunk)chunk;
+ recipientSearchChunk = (ByteChunk)chunk;
break;
case RECIPIENT_EMAIL:
recipientEmailChunk = (StringChunk)chunk;
Modified:
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java?rev=897167&r1=897166&r2=897167&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java
(original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/datatypes/StringChunk.java
Fri Jan 8 11:14:58 2010
@@ -55,7 +55,7 @@
switch(type) {
case Types.ASCII_STRING:
try {
- tmpValue = new String(data, "UTF-16LE");
+ tmpValue = new String(data, "CP1252");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Core encoding not found, JVM broken?",
e);
}
@@ -77,7 +77,7 @@
switch(type) {
case Types.ASCII_STRING:
try {
- data = value.getBytes("UTF-16LE");
+ data = value.getBytes("CP1252");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Core encoding not found, JVM broken?",
e);
}
Modified:
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/parsers/POIFSChunkParser.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/parsers/POIFSChunkParser.java?rev=897167&r1=897166&r2=897167&view=diff
==============================================================================
---
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/parsers/POIFSChunkParser.java
(original)
+++
poi/trunk/src/scratchpad/src/org/apache/poi/hsmf/parsers/POIFSChunkParser.java
Fri Jan 8 11:14:58 2010
@@ -55,7 +55,7 @@
// there doesn't seem to be any use of that in Outlook
for(Entry entry : node) {
if(entry instanceof DirectoryNode) {
- DirectoryNode dir = (DirectoryNode)node;
+ DirectoryNode dir = (DirectoryNode)entry;
ChunkGroup group = null;
// Do we know what to do with it?
@@ -66,7 +66,7 @@
group = new NameIdChunks();
}
if(dir.getName().startsWith(RecipientChunks.PREFIX)) {
- group = new NameIdChunks();
+ group = new RecipientChunks();
}
if(group != null) {
Modified:
poi/trunk/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java
URL:
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java?rev=897167&r1=897166&r2=897167&view=diff
==============================================================================
---
poi/trunk/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java
(original)
+++
poi/trunk/src/scratchpad/testcases/org/apache/poi/hsmf/parsers/TestPOIFSChunkParser.java
Fri Jan 8 11:14:58 2010
@@ -18,8 +18,16 @@
package org.apache.poi.hsmf.parsers;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
+import org.apache.poi.hsmf.MAPIMessage;
+import org.apache.poi.hsmf.datatypes.AttachmentChunks;
+import org.apache.poi.hsmf.datatypes.ChunkGroup;
+import org.apache.poi.hsmf.datatypes.Chunks;
+import org.apache.poi.hsmf.datatypes.NameIdChunks;
+import org.apache.poi.hsmf.datatypes.RecipientChunks;
+import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.POIDataSamples;
@@ -44,13 +52,83 @@
new FileInputStream(samples.getFile("attachment_test_msg.msg"))
);
POIFSFileSystem without = new POIFSFileSystem(
- new FileInputStream(samples.getFile("simple_test_msg.msg"))
+ new FileInputStream(samples.getFile("quick.msg"))
);
+ AttachmentChunks attachment;
+
+
+ // Check raw details on the one with
+ with.getRoot().getEntry("__attach_version1.0_#00000000");
+ with.getRoot().getEntry("__attach_version1.0_#00000001");
+ POIFSChunkParser.parse(with.getRoot());
+
+ ChunkGroup[] groups = POIFSChunkParser.parse(with.getRoot());
+ assertEquals(5, groups.length);
+ assertTrue(groups[0] instanceof Chunks);
+ assertTrue(groups[1] instanceof RecipientChunks);
+ assertTrue(groups[2] instanceof AttachmentChunks);
+ assertTrue(groups[3] instanceof AttachmentChunks);
+ assertTrue(groups[4] instanceof NameIdChunks);
+
+ attachment = (AttachmentChunks)groups[2];
+ assertEquals("TEST-U~1.DOC", attachment.attachFileName.toString());
+ assertEquals("test-unicode.doc",
attachment.attachLongFileName.toString());
+ assertEquals(24064, attachment.attachData.getValue().length);
+
+ attachment = (AttachmentChunks)groups[3];
+ assertEquals("pj1.txt", attachment.attachFileName.toString());
+ assertEquals("pj1.txt", attachment.attachLongFileName.toString());
+ assertEquals(89, attachment.attachData.getValue().length);
+
+
+ // Check raw details on one without
+ try {
+ without.getRoot().getEntry("__attach_version1.0_#00000000");
+ fail();
+ } catch(FileNotFoundException e) {}
+ try {
+ without.getRoot().getEntry("__attach_version1.0_#00000001");
+ fail();
+ } catch(FileNotFoundException e) {}
+
- // Check details on the one with
-
// One with, from the top
+ MAPIMessage msgWith = new MAPIMessage(with);
+ assertEquals(2, msgWith.getAttachmentFiles().length);
+
+ attachment = msgWith.getAttachmentFiles()[0];
+ assertEquals("TEST-U~1.DOC", attachment.attachFileName.toString());
+ assertEquals("test-unicode.doc",
attachment.attachLongFileName.toString());
+ assertEquals(24064, attachment.attachData.getValue().length);
+
+ attachment = msgWith.getAttachmentFiles()[1];
+ assertEquals("pj1.txt", attachment.attachFileName.toString());
+ assertEquals("pj1.txt", attachment.attachLongFileName.toString());
+ assertEquals(89, attachment.attachData.getValue().length);
+
+ // Plus check core details are there
+ try {
+ assertEquals("'[email protected]'", msgWith.getDisplayTo());
+ assertEquals("Nicolas1 23456", msgWith.getDisplayFrom());
+ assertEquals("test pi\u00e8ce jointe 1", msgWith.getSubject());
+ } catch(ChunkNotFoundException e) {
+ fail();
+ }
+
// One without, from the top
+ MAPIMessage msgWithout = new MAPIMessage(without);
+
+ // No attachments
+ assertEquals(0, msgWithout.getAttachmentFiles().length);
+
+ // But has core details
+ try {
+ assertEquals("Kevin Roast", msgWithout.getDisplayTo());
+ assertEquals("Kevin Roast", msgWithout.getDisplayFrom());
+ assertEquals("Test the content transformer", msgWithout.getSubject());
+ } catch(ChunkNotFoundException e) {
+ fail();
+ }
}
}
Added: poi/trunk/test-data/hsmf/quick.msg
URL:
http://svn.apache.org/viewvc/poi/trunk/test-data/hsmf/quick.msg?rev=897167&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/test-data/hsmf/quick.msg
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]