--- old/src/share/jaxws_classes/com/sun/xml/internal/org/jvnet/mimepull/MIMEPart.java 2013-04-04 15:28:19.828613898 +0200 +++ new/src/share/jaxws_classes/com/sun/xml/internal/org/jvnet/mimepull/MIMEPart.java 2013-04-04 15:28:19.772613897 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,22 +29,28 @@ import java.io.InputStream; import java.nio.ByteBuffer; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Represents an attachment part in a MIME message. MIME message parsing is done * lazily using a pull parser, so the part may not have all the data. {@link #read} * and {@link #readOnce} may trigger the actual parsing the message. In fact, * parsing of an attachment part may be triggered by calling {@link #read} methods - * on some other attachemnt parts. All this happens behind the scenes so the + * on some other attachment parts. All this happens behind the scenes so the * application developer need not worry about these details. * - * @author Jitendra Kotamraju + * @author Jitendra Kotamraju, Martin Grebac */ public class MIMEPart { + private static final Logger LOGGER = Logger.getLogger(MIMEPart.class.getName()); + private volatile InternetHeaders headers; private volatile String contentId; private String contentType; + private String contentTransferEncoding; + volatile boolean parsed; // part is parsed or not final MIMEMessage msg; private final DataHead dataHead; @@ -69,7 +75,15 @@ * @return data for the part's content */ public InputStream read() { - return dataHead.read(); + InputStream is = null; + try { + is = MimeUtility.decode(dataHead.read(), contentTransferEncoding); + } catch (DecodingException ex) { //ignore + if (LOGGER.isLoggable(Level.WARNING)) { + LOGGER.log(Level.WARNING, null, ex); + } + } + return is; } /** @@ -81,7 +95,6 @@ dataHead.close(); } - /** * Can get the attachment part's content only once. The content * will be lost after the method. Content data is not be stored @@ -95,7 +108,15 @@ * @return data for the part's content */ public InputStream readOnce() { - return dataHead.readOnce(); + InputStream is = null; + try { + is = MimeUtility.decode(dataHead.readOnce(), contentTransferEncoding); + } catch (DecodingException ex) { //ignore + if (LOGGER.isLoggable(Level.WARNING)) { + LOGGER.log(Level.WARNING, null, ex); + } + } + return is; } public void moveTo(File f) { @@ -115,6 +136,18 @@ } /** + * Returns Content-Transfer-Encoding MIME header for this attachment part + * + * @return Content-Transfer-Encoding of the part + */ + public String getContentTransferEncoding() { + if (contentTransferEncoding == null) { + getHeaders(); + } + return contentTransferEncoding; + } + + /** * Returns Content-Type MIME header for this attachment part * * @return Content-Type of the part @@ -171,6 +204,8 @@ this.headers = headers; List ct = getHeader("Content-Type"); this.contentType = (ct == null) ? "application/octet-stream" : ct.get(0); + List cte = getHeader("Content-Transfer-Encoding"); + this.contentTransferEncoding = (cte == null) ? "binary" : cte.get(0); } /** @@ -199,9 +234,17 @@ this.contentId = cid; } + /** + * Callback to set Content-Transfer-Encoding for this part + * @param cte Content-Transfer-Encoding of the part + */ + void setContentTransferEncoding(String cte) { + this.contentTransferEncoding = cte; + } + @Override public String toString() { - return "Part="+contentId; + return "Part="+contentId+":"+contentTransferEncoding; } }