Author: rdonkin
Date: Wed Jul  9 13:13:50 2008
New Revision: 675333

URL: http://svn.apache.org/viewvc?rev=675333&view=rev
Log:
MIME4J-30 Transfer-encoding should be transparent, 
https://issues.apache.org/jira/browse/MIME4J-30. Committed patch contributed by 
Oleg Kalnichevski. Introduces transparent encoding but makes it optional.

Modified:
    
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java
    
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java
    
james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java

Modified: 
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java?rev=675333&r1=675332&r2=675333&view=diff
==============================================================================
--- 
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java 
(original)
+++ 
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java 
Wed Jul  9 13:13:50 2008
@@ -35,17 +35,36 @@
  *      parser.setContentHandler(handler);
  *      parser.parse(new FileInputStream("mime.msg"));
  * </pre>
- * <strong>NOTE:</strong> All lines must end with CRLF 
- * (<code>\r\n</code>). If you are unsure of the line endings in your stream 
- * you should wrap it in a [EMAIL PROTECTED] 
org.apache.james.mime4j.EOLConvertingInputStream} instance.
- *
  * 
  * @version $Id: MimeStreamParser.java,v 1.8 2005/02/11 10:12:02 ntherning Exp 
$
  */
 public class MimeStreamParser {
+
     private ContentHandler handler = null;
+    private boolean contentDecoding;
     private final MimeTokenStream mimeTokenStream = new MimeTokenStream();
 
+    public MimeStreamParser() {
+        super();
+        this.contentDecoding = false;
+    }
+    
+    /**
+     * Determines whether this parser automatically decodes body content
+     * based on the on the MIME fields with the standard defaults.
+     */ 
+    public boolean isContentDecoding() {
+        return contentDecoding;
+    }
+
+    /**
+     * Defines whether parser should automatically decode body content
+     * based on the on the MIME fields with the standard defaults.
+     */ 
+    public void setContentDecoding(boolean b) {
+        this.contentDecoding = b;
+    }
+
     /**
      * Parses a stream of bytes containing a MIME message.
      * 
@@ -59,7 +78,14 @@
             int state = mimeTokenStream.getState();
             switch (state) {
                 case MimeTokenStream.T_BODY:
-                    handler.body(mimeTokenStream.getBodyDescriptor(), 
mimeTokenStream.getInputStream());
+                    BodyDescriptor desc = mimeTokenStream.getBodyDescriptor();
+                    InputStream bodyContent;
+                    if (contentDecoding) {
+                        bodyContent = mimeTokenStream.getDecodedInputStream(); 
+                    } else {
+                        bodyContent = mimeTokenStream.getInputStream(); 
+                    }
+                    handler.body(desc, bodyContent);
                     break;
                 case MimeTokenStream.T_END_BODYPART:
                     handler.endBodyPart();

Modified: 
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java?rev=675333&r1=675332&r2=675333&view=diff
==============================================================================
--- 
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java 
(original)
+++ 
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java 
Wed Jul  9 13:13:50 2008
@@ -239,9 +239,11 @@
     }
 
     /**
+     * This method returns the raw entity, preamble, or epilogue contents.
+     * <p/>
      * This method is valid, if [EMAIL PROTECTED] #getState()} returns either 
of
      * [EMAIL PROTECTED] #T_RAW_ENTITY}, [EMAIL PROTECTED] #T_PREAMBLE}, or 
[EMAIL PROTECTED] #T_EPILOGUE}.
-     * It returns the raw entity, preamble, or epilogue contents.
+     * 
      * @return Data stream, depending on the current state.
      * @throws IllegalStateException [EMAIL PROTECTED] #getState()} returns an
      *   invalid value.
@@ -249,6 +251,29 @@
     public InputStream getInputStream() {
         return currentStateMachine.getContentStream();
     }
+    
+    /**
+     * This method returns a transfer decoded stream based on the MIME 
+     * fields with the standard defaults.
+     * <p/>
+     * This method is valid, if [EMAIL PROTECTED] #getState()} returns either 
of
+     * [EMAIL PROTECTED] #T_RAW_ENTITY}, [EMAIL PROTECTED] #T_PREAMBLE}, or 
[EMAIL PROTECTED] #T_EPILOGUE}.
+     * 
+     * @return Data stream, depending on the current state.
+     * @throws IllegalStateException [EMAIL PROTECTED] #getState()} returns an
+     *   invalid value.
+     */
+    public InputStream getDecodedInputStream() {
+        BodyDescriptor bodyDescriptor = getBodyDescriptor();
+        String transferEncoding = bodyDescriptor.getTransferEncoding();
+        InputStream dataStream = currentStateMachine.getContentStream();
+        if (MimeUtil.isBase64Encoding(transferEncoding)) {
+            dataStream = new Base64InputStream(dataStream);
+        } else if (MimeUtil.isQuotedPrintableEncoded(transferEncoding)) {
+            dataStream = new QuotedPrintableInputStream(dataStream);
+        }
+        return dataStream;
+    }
 
     /**
      * Gets a reader configured for the current body or body part.
@@ -270,25 +295,14 @@
     public Reader getReader() {
         final BodyDescriptor bodyDescriptor = getBodyDescriptor();
         final String mimeCharset = bodyDescriptor.getCharset();
-        final String transferEncoding = bodyDescriptor.getTransferEncoding();
         final Charset charset;
         if (mimeCharset == null || "".equals(mimeCharset)) {
             charset = Charset.forName("US-ASCII");
         } else {
             charset = Charset.forName(mimeCharset);
         }
-        
-        final InputStream inputStream;
-        final InputStream transferEncodedStream = getInputStream();
-        if (MimeUtil.isBase64Encoding(transferEncoding)) {
-            inputStream = new Base64InputStream(transferEncodedStream);
-        } else if (MimeUtil.isQuotedPrintableEncoded(transferEncoding)) {
-            inputStream = new 
QuotedPrintableInputStream(transferEncodedStream);
-        } else {
-            inputStream = transferEncodedStream;
-        }
-        final InputStreamReader result = new InputStreamReader(inputStream, 
charset);
-        return result;
+        final InputStream instream = getDecodedInputStream();
+        return new InputStreamReader(instream, charset);
     }
     
     /**

Modified: 
james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java
URL: 
http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java?rev=675333&r1=675332&r2=675333&view=diff
==============================================================================
--- 
james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java
 (original)
+++ 
james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java
 Wed Jul  9 13:13:50 2008
@@ -449,7 +449,45 @@
             }
         }
     }
+    
+    public void testAutomaticContentDecoding() throws Exception {
+        MimeStreamParser parser = new MimeStreamParser();
+        parser.setContentDecoding(true);
+        TestHandler handler = new TestHandler();
+        parser.setContentHandler(handler);
 
+        String msg = "Subject: Yada yada\r\n"
+                   + "From: [EMAIL PROTECTED]"
+                   + "Content-Type: application/octet-stream\r\n"
+                   + "Content-Transfer-Encoding: base64\r\n"
+                   + "\r\n"
+                   + "V2hvIGF0ZSBteSBjYWtlPwo=";
+        String expected = "<message>\r\n"
+                        + "<header>\r\n"
+                        + "<field>\r\n"
+                        + "Subject: Yada yada"
+                        + "</field>\r\n"
+                        + "<field>\r\n"
+                        + "From: [EMAIL PROTECTED]"
+                        + "</field>\r\n"
+                        + "<field>\r\n"
+                        + "Content-Type: application/octet-stream"
+                        + "</field>\r\n"
+                        + "<field>\r\n"
+                        + "Content-Transfer-Encoding: base64"
+                        + "</field>\r\n"
+                        + "</header>\r\n"
+                        + "<body>\r\n"
+                        + "Who ate my cake?\n"
+                        + "</body>\r\n"
+                        + "</message>\r\n";
+        
+        parser.parse(new ByteArrayInputStream(msg.getBytes()));
+        String result = handler.sb.toString();
+        
+        assertEquals(expected, result);
+    }
+    
     private static class TestHandler implements ContentHandler {
         private StringBuffer sb = new StringBuffer();
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to