196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/****************************************************************
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one   *
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * or more contributor license agreements.  See the NOTICE file *
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed with this work for additional information        *
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * regarding copyright ownership.  The ASF licenses this file   *
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * to you under the Apache License, Version 2.0 (the            *
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * "License"); you may not use this file except in compliance   *
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * with the License.  You may obtain a copy of the License at   *
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *                                                              *
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *   http://www.apache.org/licenses/LICENSE-2.0                 *
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *                                                              *
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing,   *
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * software distributed under the License is distributed on an  *
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * KIND, either express or implied.  See the License for the    *
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * specific language governing permissions and limitations      *
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * under the License.                                           *
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project ****************************************************************/
1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage org.apache.james.mime4j.message;
2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException;
2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStream;
2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStream;
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.Stack;
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport org.apache.james.mime4j.BodyDescriptor;
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport org.apache.james.mime4j.ContentHandler;
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport org.apache.james.mime4j.MimeStreamParser;
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport org.apache.james.mime4j.decoder.Base64InputStream;
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport org.apache.james.mime4j.field.Field;
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport org.apache.james.mime4j.field.UnstructuredField;
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
378546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy * Represents a MIME message. The following code parses a stream into a
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <code>Message</code> object.
398546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy *
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <pre>
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      Message msg = new Message(new BufferedInputStream(
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *                                      new FileInputStream("mime.msg")));
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * </pre>
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
458546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy *
468546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy *
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @version $Id: Message.java,v 1.3 2004/10/02 12:41:11 ntherning Exp $
4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class Message extends Entity implements Body {
508546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Creates a new empty <code>Message</code>.
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public Message() {
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
568546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Parses the specified MIME message stream into a <code>Message</code>
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * instance.
608546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy     *
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param is the stream to parse.
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException on I/O errors.
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public Message(InputStream is) throws IOException {
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        MimeStreamParser parser = new MimeStreamParser();
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        parser.setContentHandler(new MessageBuilder());
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        parser.parse(is);
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
708546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Gets the <code>Subject</code> field.
738546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy     *
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the <code>Subject</code> field or <code>null</code> if it
7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *         doesn't exist.
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public UnstructuredField getSubject() {
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return (UnstructuredField) getHeader().getField(Field.SUBJECT);
7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
828546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy     *
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @see org.apache.james.mime4j.message.Entity#writeTo(java.io.OutputStream)
8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
858546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy    @Override
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void writeTo(OutputStream out) throws IOException {
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getHeader().writeTo(out);
8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Body body = getBody();
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (body instanceof Multipart) {
9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Multipart mp = (Multipart) body;
9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mp.writeTo(out);
9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        } else {
9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            body.writeTo(out);
9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
978546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
988546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private class MessageBuilder implements ContentHandler {
1008546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy        private Stack<Object> stack = new Stack<Object>();
1018546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public MessageBuilder() {
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1048546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        private void expect(Class c) {
10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            if (!c.isInstance(stack.peek())) {
10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throw new IllegalStateException("Internal stack error: "
10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        + "Expected '" + c.getName() + "' found '"
10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                        + stack.peek().getClass().getName() + "'");
11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1128546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#startMessage()
11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void startMessage() {
11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            if (stack.isEmpty()) {
11896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                stack.push(Message.this);
11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            } else {
12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                expect(Entity.class);
12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                Message m = new Message();
12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                ((Entity) stack.peek()).setBody(m);
12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                stack.push(m);
12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1268546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
12896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#endMessage()
12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
13096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void endMessage() {
13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Message.class);
13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            stack.pop();
13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1348546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#startHeader()
13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void startHeader() {
13996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            stack.push(new Header());
14096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1418546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#field(java.lang.String)
14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
14596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void field(String fieldData) {
14696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Header.class);
14796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ((Header) stack.peek()).addField(Field.parse(fieldData));
14896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1498546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
15096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
15196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#endHeader()
15296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
15396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void endHeader() {
15496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Header.class);
15596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Header h = (Header) stack.pop();
15696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Entity.class);
15796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ((Entity) stack.peek()).setHeader(h);
15896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1598546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
16096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
16196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#startMultipart(org.apache.james.mime4j.BodyDescriptor)
16296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
16396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void startMultipart(BodyDescriptor bd) {
16496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Entity.class);
1658546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
16696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Entity e = (Entity) stack.peek();
16796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Multipart multiPart = new Multipart();
16896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            e.setBody(multiPart);
16996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            stack.push(multiPart);
17096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1718546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
17296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
17396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#body(org.apache.james.mime4j.BodyDescriptor, java.io.InputStream)
17496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
17596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void body(BodyDescriptor bd, InputStream is) throws IOException {
17696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Entity.class);
1778546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
17896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            String enc = bd.getTransferEncoding();
17996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            if ("base64".equals(enc)) {
18096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                is = new Base64InputStream(is);
18196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            } else if ("quoted-printable".equals(enc)) {
18296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                is = new QuotedPrintableInputStream(is);
18396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
1848546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
18596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            Body body = null;
18696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            if (bd.getMimeType().startsWith("text/")) {
18796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                body = new MemoryTextBody(is, bd.getCharset());
18896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            } else {
18996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                body = new MemoryBinaryBody(is);
19096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
1918546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
19296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ((Entity) stack.peek()).setBody(body);
19396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
1948546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
19596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
19696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#endMultipart()
19796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
19896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void endMultipart() {
19996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            stack.pop();
20096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
2018546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
20296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
20396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#startBodyPart()
20496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
20596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void startBodyPart() {
20696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Multipart.class);
2078546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
20896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            BodyPart bodyPart = new BodyPart();
20996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ((Multipart) stack.peek()).addBodyPart(bodyPart);
21096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            stack.push(bodyPart);
21196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
2128546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
21396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
21496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#endBodyPart()
21596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
21696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void endBodyPart() {
21796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(BodyPart.class);
21896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            stack.pop();
21996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
2208546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
22196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
22296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#epilogue(java.io.InputStream)
22396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
22496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void epilogue(InputStream is) throws IOException {
22596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Multipart.class);
22696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            StringBuffer sb = new StringBuffer();
22796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            int b;
22896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            while ((b = is.read()) != -1) {
22996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                sb.append((char) b);
23096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
23196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ((Multipart) stack.peek()).setEpilogue(sb.toString());
23296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
2338546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
23496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
23596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#preamble(java.io.InputStream)
23696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
23796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void preamble(InputStream is) throws IOException {
23896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            expect(Multipart.class);
23996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            StringBuffer sb = new StringBuffer();
24096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            int b;
24196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            while ((b = is.read()) != -1) {
24296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                sb.append((char) b);
24396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
24496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ((Multipart) stack.peek()).setPreamble(sb.toString());
24596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
2468546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy
24796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        /**
24896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * TODO: Implement me
2498546e21e1e127845071c595beda16fc23eb0f58eTodd Kennedy         *
25096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         * @see org.apache.james.mime4j.ContentHandler#raw(java.io.InputStream)
25196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project         */
25296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        public void raw(InputStream is) throws IOException {
25396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            throw new UnsupportedOperationException("Not supported");
25496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
25596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
25696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
25796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
258