1 package org.columba.mail.gui.composer.command; 19 20 import java.io.IOException ; 21 import java.io.InputStream ; 22 import java.nio.charset.Charset ; 23 import java.nio.charset.UnsupportedCharsetException ; 24 import java.text.DateFormat ; 25 import java.util.Arrays ; 26 import java.util.Iterator ; 27 28 import org.columba.api.command.ICommandReference; 29 import org.columba.api.command.IWorkerStatusController; 30 import org.columba.core.io.StreamUtils; 31 import org.columba.core.xml.XmlElement; 32 import org.columba.mail.command.MailFolderCommandReference; 33 import org.columba.mail.composer.MessageBuilderHelper; 34 import org.columba.mail.config.MailConfig; 35 import org.columba.mail.folder.IMailbox; 36 import org.columba.mail.gui.composer.ComposerModel; 37 import org.columba.mail.gui.composer.util.QuoteFilterInputStream; 38 import org.columba.mail.gui.util.AddressListRenderer; 39 import org.columba.mail.parser.text.HtmlParser; 40 import org.columba.mail.util.MailResourceLoader; 41 import org.columba.ristretto.coder.Base64DecoderInputStream; 42 import org.columba.ristretto.coder.CharsetDecoderInputStream; 43 import org.columba.ristretto.coder.QuotedPrintableDecoderInputStream; 44 import org.columba.ristretto.message.Address; 45 import org.columba.ristretto.message.BasicHeader; 46 import org.columba.ristretto.message.Header; 47 import org.columba.ristretto.message.InputStreamMimePart; 48 import org.columba.ristretto.message.MimeHeader; 49 import org.columba.ristretto.message.MimePart; 50 import org.columba.ristretto.message.MimeTree; 51 52 58 public class ForwardInlineCommand extends ForwardCommand { 59 60 protected final String [] headerfields = new String [] { "Subject", "Date", 61 "From", "To" }; 62 63 69 public ForwardInlineCommand(ICommandReference reference) { 70 super(reference); 71 } 72 73 public void execute(IWorkerStatusController worker) throws Exception { 74 model = new ComposerModel(); 76 77 IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference()) 79 .getSourceFolder(); 80 81 Object [] uids = ((MailFolderCommandReference) getReference()).getUids(); 83 84 MailFolderCommandReference ref = new MailFolderCommandReference(folder, uids); 88 model.setSourceReference(ref); 89 90 initHeader(folder, uids); 92 93 MimeTree mimePartTree = folder.getMimePartTree(uids[0]); 95 96 XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig() 97 .getRoot().getElement("/options/html"); 98 99 MimePart bodyPart = null; 101 Integer [] bodyPartAddress = null; 102 if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) { 103 bodyPart = mimePartTree.getFirstTextPart("html"); 104 } else { 105 bodyPart = mimePartTree.getFirstTextPart("plain"); 106 } 107 108 if (bodyPart != null) { 109 initMimeHeader(bodyPart); 111 112 bodyPartAddress = bodyPart.getAddress(); 113 114 String quotedBodyText = createQuotedBody(bodyPart.getHeader(), 115 folder, uids, bodyPartAddress); 116 117 121 if (bodyPart.getHeader().getMimeType().getSubtype().equals("html")) { 122 quotedBodyText = HtmlParser.removeComments(quotedBodyText); 123 } 124 125 model.setBodyText(quotedBodyText); 126 } 127 128 MimeTree mt = folder.getMimePartTree(uids[0]); 130 Iterator it = mt.getAllLeafs().iterator(); 131 while (it.hasNext()) { 132 MimePart mp = (MimePart) it.next(); 133 Integer [] address = mp.getAddress(); 134 if (Arrays.equals(address, bodyPartAddress)) 136 continue; 137 138 InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address); 140 int encoding = mp.getHeader().getContentTransferEncoding(); 141 142 switch (encoding) { 143 case MimeHeader.QUOTED_PRINTABLE: 144 bodyStream = new QuotedPrintableDecoderInputStream(bodyStream); 145 break; 146 147 case MimeHeader.BASE64: 148 bodyStream = new Base64DecoderInputStream(bodyStream); 149 break; 150 default: 151 } 152 153 model.addMimePart(new InputStreamMimePart(mp.getHeader(), bodyStream)); 154 } 155 156 } 157 158 private void initMimeHeader(MimePart bodyPart) { 159 MimeHeader bodyHeader = bodyPart.getHeader(); 160 161 if (bodyHeader.getMimeType().getSubtype().equals("html")) { 162 model.setHtml(true); 163 } else { 164 model.setHtml(false); 165 } 166 167 String charset = bodyHeader.getContentParameter("charset"); 169 170 if (charset != null) { 171 try { 172 model.setCharset(Charset.forName(charset)); 173 } catch( UnsupportedCharsetException e ) { 174 } 176 } 177 } 178 179 private void initHeader(IMailbox folder, Object [] uids) 180 throws Exception { 181 Header header = folder.getHeaderFields(uids[0], 183 new String [] { "Subject" }); 184 185 BasicHeader rfcHeader = new BasicHeader(header); 186 187 model.setSubject(MessageBuilderHelper.createForwardSubject(rfcHeader 189 .getSubject())); 190 } 191 192 protected String createQuotedBody(MimeHeader header, IMailbox folder, 193 Object [] uids, Integer [] address) throws IOException , Exception { 194 InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address); 195 196 switch (header.getContentTransferEncoding()) { 198 case MimeHeader.QUOTED_PRINTABLE: { 199 bodyStream = new QuotedPrintableDecoderInputStream(bodyStream); 200 break; 201 } 202 203 case MimeHeader.BASE64: { 204 bodyStream = new Base64DecoderInputStream(bodyStream); 205 } 206 } 207 String charset = header.getContentParameter("charset"); 208 if (charset != null) { 209 bodyStream = new CharsetDecoderInputStream(bodyStream, Charset 210 .forName(charset)); 211 } 212 213 String quotedBody; 214 if (model.isHtml()) { 216 BasicHeader rfcHeader = new BasicHeader(folder.getHeaderFields( 219 uids[0], headerfields)); 220 String subject = rfcHeader.getSubject(); 221 String date = DateFormat.getDateTimeInstance(DateFormat.LONG, 222 DateFormat.MEDIUM).format(rfcHeader.getDate()); 223 String from = AddressListRenderer.renderToHTMLWithLinks( 224 new Address[] { rfcHeader.getFrom() }).toString(); 225 String to = AddressListRenderer.renderToHTMLWithLinks( 226 rfcHeader.getTo()).toString(); 227 228 StringBuffer buf = new StringBuffer (); 230 buf.append("<html><body><p>"); 231 buf.append(MailResourceLoader.getString("dialog", "composer", 232 "original_message_start")); 233 buf.append("<br>" 234 + MailResourceLoader.getString("header", "header", 235 "subject") + ": " + subject); 236 buf.append("<br>" 237 + MailResourceLoader.getString("header", "header", "date") 238 + ": " + date); 239 buf.append("<br>" 240 + MailResourceLoader.getString("header", "header", "from") 241 + ": " + from); 242 buf.append("<br>" 243 + MailResourceLoader.getString("header", "header", "to") 244 + ": " + to); 245 buf.append("</p>"); 246 buf.append(HtmlParser.removeComments( HtmlParser.getHtmlBody(StreamUtils.readCharacterStream(bodyStream) 249 .toString()))); 250 buf.append("<p>"); 251 buf.append(MailResourceLoader.getString("dialog", "composer", 252 "original_message_end")); 253 buf.append("</p></body></html>"); 254 255 quotedBody = buf.toString(); 256 } else { 257 BasicHeader rfcHeader = new BasicHeader(folder.getHeaderFields( 258 uids[0], headerfields)); 259 String date = DateFormat.getDateTimeInstance(DateFormat.LONG, 260 DateFormat.MEDIUM).format(rfcHeader.getDate()); 261 String from = rfcHeader.getFrom().toString(); 262 263 StringBuffer buf = StreamUtils.readCharacterStream( 265 new QuoteFilterInputStream(bodyStream)); 266 267 buf.insert(0, ">\n"); 268 buf.insert(0, "> Date: " + date + "\n"); 269 buf.insert(0, "> From: " + from + "\n"); 270 271 quotedBody = buf.toString(); 272 } 273 274 bodyStream.close(); 275 return quotedBody; 276 } 277 } | Popular Tags |