14fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy/**************************************************************** 24fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Licensed to the Apache Software Foundation (ASF) under one * 34fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * or more contributor license agreements. See the NOTICE file * 44fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * distributed with this work for additional information * 54fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * regarding copyright ownership. The ASF licenses this file * 64fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * to you under the Apache License, Version 2.0 (the * 74fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * "License"); you may not use this file except in compliance * 84fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * with the License. You may obtain a copy of the License at * 94fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * * 104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * http://www.apache.org/licenses/LICENSE-2.0 * 114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * * 124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Unless required by applicable law or agreed to in writing, * 134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * software distributed under the License is distributed on an * 144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * 154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * KIND, either express or implied. See the License for the * 164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * specific language governing permissions and limitations * 174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * under the License. * 184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ****************************************************************/ 194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedypackage org.apache.james.mime4j.message; 214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.IOException; 234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.InputStream; 244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.OutputStream; 254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.util.Stack; 264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.BodyDescriptor; 284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.ContentHandler; 294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.MimeStreamParser; 304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.decoder.Base64InputStream; 314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.decoder.QuotedPrintableInputStream; 324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.field.Field; 334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport org.apache.james.mime4j.field.UnstructuredField; 344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy/** 374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Represents a MIME message. The following code parses a stream into a 384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * <code>Message</code> object. 394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * 404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * <pre> 414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Message msg = new Message(new BufferedInputStream( 424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * new FileInputStream("mime.msg"))); 434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * </pre> 444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * 454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * 464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * 474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @version $Id: Message.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $ 484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedypublic class Message extends Entity implements Body { 504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Creates a new empty <code>Message</code>. 534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public Message() { 554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Parses the specified MIME message stream into a <code>Message</code> 594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * instance. 604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * 614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @param is the stream to parse. 624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @throws IOException on I/O errors. 634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public Message(InputStream is) throws IOException { 654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy MimeStreamParser parser = new MimeStreamParser(); 664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy parser.setContentHandler(new MessageBuilder()); 674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy parser.parse(is); 684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Gets the <code>Subject</code> field. 734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * 744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @return the <code>Subject</code> field or <code>null</code> if it 754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * doesn't exist. 764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public UnstructuredField getSubject() { 784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy return (UnstructuredField) getHeader().getField(Field.SUBJECT); 794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * 834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.message.Entity#writeTo(java.io.OutputStream) 844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy @Override 864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void writeTo(OutputStream out) throws IOException { 874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy getHeader().writeTo(out); 884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy Body body = getBody(); 904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy if (body instanceof Multipart) { 914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy Multipart mp = (Multipart) body; 924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy mp.writeTo(out); 934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } else { 944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy body.writeTo(out); 954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy private class MessageBuilder implements ContentHandler { 1004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy private Stack<Object> stack = new Stack<Object>(); 1014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public MessageBuilder() { 1034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy private void expect(Class c) { 1064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy if (!c.isInstance(stack.peek())) { 1074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy throw new IllegalStateException("Internal stack error: " 1084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy + "Expected '" + c.getName() + "' found '" 1094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy + stack.peek().getClass().getName() + "'"); 1104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 1144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#startMessage() 1154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 1164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void startMessage() { 1174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy if (stack.isEmpty()) { 1184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy stack.push(Message.this); 1194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } else { 1204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Entity.class); 1214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy Message m = new Message(); 1224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ((Entity) stack.peek()).setBody(m); 1234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy stack.push(m); 1244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 1284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#endMessage() 1294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 1304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void endMessage() { 1314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Message.class); 1324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy stack.pop(); 1334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 1364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#startHeader() 1374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 1384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void startHeader() { 1394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy stack.push(new Header()); 1404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 1434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#field(java.lang.String) 1444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 1454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void field(String fieldData) { 1464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Header.class); 1474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ((Header) stack.peek()).addField(Field.parse(fieldData)); 1484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 1514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#endHeader() 1524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 1534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void endHeader() { 1544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Header.class); 1554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy Header h = (Header) stack.pop(); 1564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Entity.class); 1574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ((Entity) stack.peek()).setHeader(h); 1584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 1614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#startMultipart(org.apache.james.mime4j.BodyDescriptor) 1624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 1634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void startMultipart(BodyDescriptor bd) { 1644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Entity.class); 1654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy Entity e = (Entity) stack.peek(); 1674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy Multipart multiPart = new Multipart(); 1684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy e.setBody(multiPart); 1694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy stack.push(multiPart); 1704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 1734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#body(org.apache.james.mime4j.BodyDescriptor, java.io.InputStream) 1744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 1754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void body(BodyDescriptor bd, InputStream is) throws IOException { 1764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Entity.class); 1774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy String enc = bd.getTransferEncoding(); 1794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy if ("base64".equals(enc)) { 1804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy is = new Base64InputStream(is); 1814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } else if ("quoted-printable".equals(enc)) { 1824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy is = new QuotedPrintableInputStream(is); 1834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy Body body = null; 1864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy if (bd.getMimeType().startsWith("text/")) { 1874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy body = new MemoryTextBody(is, bd.getCharset()); 1884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } else { 1894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy body = new MemoryBinaryBody(is); 1904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ((Entity) stack.peek()).setBody(body); 1934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 1944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 1954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 1964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#endMultipart() 1974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 1984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void endMultipart() { 1994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy stack.pop(); 2004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 2024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 2034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#startBodyPart() 2044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 2054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void startBodyPart() { 2064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Multipart.class); 2074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 2084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy BodyPart bodyPart = new BodyPart(); 2094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ((Multipart) stack.peek()).addBodyPart(bodyPart); 2104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy stack.push(bodyPart); 2114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 2134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 2144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#endBodyPart() 2154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 2164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void endBodyPart() { 2174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(BodyPart.class); 2184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy stack.pop(); 2194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 2214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 2224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#epilogue(java.io.InputStream) 2234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 2244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void epilogue(InputStream is) throws IOException { 2254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Multipart.class); 2264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy StringBuffer sb = new StringBuffer(); 2274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy int b; 2284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy while ((b = is.read()) != -1) { 2294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy sb.append((char) b); 2304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ((Multipart) stack.peek()).setEpilogue(sb.toString()); 2324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 2344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 2354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#preamble(java.io.InputStream) 2364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 2374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void preamble(InputStream is) throws IOException { 2384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy expect(Multipart.class); 2394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy StringBuffer sb = new StringBuffer(); 2404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy int b; 2414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy while ((b = is.read()) != -1) { 2424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy sb.append((char) b); 2434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy ((Multipart) stack.peek()).setPreamble(sb.toString()); 2454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 2474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy /** 2484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * TODO: Implement me 2494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * 2504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.james.mime4j.ContentHandler#raw(java.io.InputStream) 2514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */ 2524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy public void raw(InputStream is) throws IOException { 2534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy throw new UnsupportedOperationException("Not supported"); 2544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy 2564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy } 2574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy} 258