Fix some chunk types, fix the directory descent, fix the Msg2txt example, and start on fixing core tests

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@897167 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2010-01-08 11:14:58 +00:00
parent 6afb781730
commit 0e368a23da
7 changed files with 108 additions and 44 deletions

View File

@ -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 @@ import org.apache.poi.hsmf.exceptions.ChunkNotFoundException;
* attachments.
*
* @author Bruno Girin
*
*/
public class Msg2txt {
@ -105,17 +102,13 @@ public class Msg2txt {
} 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);
@ -132,35 +125,28 @@ public class Msg2txt {
* 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);
}
} finally {
try {
if(fileIn != null) {
fileIn.close();
}
fileOut.write(attachment.attachData.getValue());
} finally {
if(fileOut != null) {
fileOut.close();
}
}
}
}
/**
* Processes the list of arguments as a list of names of Outlook MSG files.

View File

@ -63,7 +63,7 @@ public final class Chunks implements ChunkGroup {
/** 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 @@ public final class Chunks implements ChunkGroup {
subjectChunk = (StringChunk)chunk;
break;
case DATE:
dateChunk = (StringChunk)chunk;
dateChunk = (ByteChunk)chunk;
break;
case CONVERSATION_TOPIC:
conversationTopic = (StringChunk)chunk;

View File

@ -32,7 +32,7 @@ public final class RecipientChunks implements ChunkGroup {
public static final int RECIPIENT_EMAIL = 0x39FE;
/** TODO */
public StringChunk recipientSearchChunk;
public ByteChunk recipientSearchChunk;
/** TODO */
public StringChunk recipientEmailChunk;
@ -53,7 +53,7 @@ public final class RecipientChunks implements ChunkGroup {
public void record(Chunk chunk) {
switch(chunk.getChunkId()) {
case RECIPIENT_SEARCH:
recipientSearchChunk = (StringChunk)chunk;
recipientSearchChunk = (ByteChunk)chunk;
break;
case RECIPIENT_EMAIL:
recipientEmailChunk = (StringChunk)chunk;

View File

@ -55,7 +55,7 @@ public class StringChunk extends Chunk {
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 @@ public class StringChunk extends Chunk {
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);
}

View File

@ -55,7 +55,7 @@ public final class POIFSChunkParser {
// 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 @@ public final class POIFSChunkParser {
group = new NameIdChunks();
}
if(dir.getName().startsWith(RecipientChunks.PREFIX)) {
group = new NameIdChunks();
group = new RecipientChunks();
}
if(group != null) {

View File

@ -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 @@ public final class TestPOIFSChunkParser extends TestCase {
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("'nicolas1.23456@free.fr'", 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();
}
}
}

BIN
test-data/hsmf/quick.msg Normal file

Binary file not shown.