1 /****************************************************************
2  * Licensed to the Apache Software Foundation (ASF) under one   *
3  * or more contributor license agreements.  See the NOTICE file *
4  * distributed with this work for additional information        *
5  * regarding copyright ownership.  The ASF licenses this file   *
6  * to you under the Apache License, Version 2.0 (the            *
7  * "License"); you may not use this file except in compliance   *
8  * with the License.  You may obtain a copy of the License at   *
9  *                                                              *
10  *   http://www.apache.org/licenses/LICENSE-2.0                 *
11  *                                                              *
12  * Unless required by applicable law or agreed to in writing,   *
13  * software distributed under the License is distributed on an  *
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15  * KIND, either express or implied.  See the License for the    *
16  * specific language governing permissions and limitations      *
17  * under the License.                                           *
18  ****************************************************************/
19 
20 package org.apache.james.mime4j;
21 
22 import org.apache.james.mime4j.decoder.Base64InputStream;
23 import org.apache.james.mime4j.decoder.QuotedPrintableInputStream;
24 import org.apache.james.mime4j.field.Field;
25 import org.apache.james.mime4j.message.Header;
26 
27 import java.io.InputStream;
28 import java.io.IOException;
29 
30 /**
31  * Abstract implementation of ContentHandler that automates common
32  * tasks. Currently performs header parsing and applies content-transfer
33  * decoding to body parts.
34  *
35  *
36  */
37 public abstract class SimpleContentHandler extends  AbstractContentHandler {
38 
39     /**
40      * Called after headers are parsed.
41      */
headers(Header header)42     public abstract void headers(Header header);
43 
44     /**
45      * Called when the body of a discrete (non-multipart) entity is encountered.
46 
47      * @param bd encapsulates the values (either read from the
48      *        message stream or, if not present, determined implictly
49      *        as described in the
50      *        MIME rfc:s) of the <code>Content-Type</code> and
51      *        <code>Content-Transfer-Encoding</code> header fields.
52      * @param is the contents of the body. Base64 or quoted-printable
53      *        decoding will be applied transparently.
54      * @throws IOException should be thrown on I/O errors.
55      */
bodyDecoded(BodyDescriptor bd, InputStream is)56     public abstract void bodyDecoded(BodyDescriptor bd, InputStream is) throws IOException;
57 
58 
59     /* Implement introduced callbacks. */
60 
61     private Header currHeader;
62 
63     /**
64      * @see org.apache.james.mime4j.AbstractContentHandler#startHeader()
65      */
startHeader()66     public final void startHeader() {
67         currHeader = new Header();
68     }
69 
70     /**
71      * @see org.apache.james.mime4j.AbstractContentHandler#field(java.lang.String)
72      */
field(String fieldData)73     public final void field(String fieldData) {
74         currHeader.addField(Field.parse(fieldData));
75     }
76 
77     /**
78      * @see org.apache.james.mime4j.AbstractContentHandler#endHeader()
79      */
endHeader()80     public final void endHeader() {
81         Header tmp = currHeader;
82         currHeader = null;
83         headers(tmp);
84     }
85 
86     /**
87      * @see org.apache.james.mime4j.AbstractContentHandler#body(org.apache.james.mime4j.BodyDescriptor, java.io.InputStream)
88      */
body(BodyDescriptor bd, InputStream is)89     public final void body(BodyDescriptor bd, InputStream is) throws IOException {
90         if (bd.isBase64Encoded()) {
91             bodyDecoded(bd, new Base64InputStream(is));
92         }
93         else if (bd.isQuotedPrintableEncoded()) {
94             bodyDecoded(bd, new QuotedPrintableInputStream(is));
95         }
96         else {
97             bodyDecoded(bd, is);
98         }
99     }
100 }
101