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.util.Arrays ; 24 import java.util.Iterator ; 25 26 import org.columba.api.command.ICommandReference; 27 import org.columba.api.command.IWorkerStatusController; 28 import org.columba.core.io.StreamUtils; 29 import org.columba.core.xml.XmlElement; 30 import org.columba.mail.command.MailFolderCommandReference; 31 import org.columba.mail.config.MailConfig; 32 import org.columba.mail.folder.IMailbox; 33 import org.columba.mail.gui.composer.ComposerModel; 34 import org.columba.mail.parser.text.HtmlParser; 35 import org.columba.ristretto.message.BasicHeader; 36 import org.columba.ristretto.message.Header; 37 import org.columba.ristretto.message.InputStreamMimePart; 38 import org.columba.ristretto.message.MimeHeader; 39 import org.columba.ristretto.message.MimePart; 40 import org.columba.ristretto.message.MimeTree; 41 42 50 public class RedirectCommand extends ForwardCommand { 51 52 protected final String [] headerfields = new String [] { "Subject", "Date", 53 "From", "To" }; 54 55 61 public RedirectCommand(ICommandReference reference) { 62 super(reference); 63 } 64 65 public void execute(IWorkerStatusController worker) throws Exception { 66 model = new ComposerModel(); 68 69 IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference()) 71 .getSourceFolder(); 72 73 Object [] uids = ((MailFolderCommandReference) getReference()).getUids(); 75 76 MailFolderCommandReference ref = new MailFolderCommandReference(folder, 80 uids); 81 model.setSourceReference(ref); 82 83 initHeader(folder, uids); 85 86 MimeTree mimePartTree = folder.getMimePartTree(uids[0]); 88 89 XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig() 90 .getRoot().getElement("/options/html"); 91 92 MimePart bodyPart = null; 94 Integer [] bodyPartAddress = null; 95 if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) { 96 bodyPart = mimePartTree.getFirstTextPart("html"); 97 } else { 98 bodyPart = mimePartTree.getFirstTextPart("plain"); 99 } 100 101 if (bodyPart != null) { 102 initMimeHeader(bodyPart); 104 105 bodyPartAddress = bodyPart.getAddress(); 106 107 String quotedBodyText = createQuotedBody(folder, uids, 108 bodyPartAddress); 109 110 114 if (bodyPart.getHeader().getMimeType().getSubtype().equals("html")) { 115 quotedBodyText = HtmlParser.removeComments(quotedBodyText); 116 } 117 118 model.setBodyText(quotedBodyText); 119 } 120 121 MimeTree mt = folder.getMimePartTree(uids[0]); 123 Iterator it = mt.getAllLeafs().iterator(); 124 while (it.hasNext()) { 125 MimePart mp = (MimePart) it.next(); 126 Integer [] address = mp.getAddress(); 127 if (Arrays.equals(address, bodyPartAddress)) 129 continue; 130 131 InputStream stream = folder.getMimePartBodyStream(uids[0], address); 133 model.addMimePart(new InputStreamMimePart(mp.getHeader(), stream)); 134 } 135 136 } 137 138 private void initMimeHeader(MimePart bodyPart) { 139 MimeHeader bodyHeader = bodyPart.getHeader(); 140 141 if (bodyHeader.getMimeType().getSubtype().equals("html")) { 142 model.setHtml(true); 143 } else { 144 model.setHtml(false); 145 } 146 147 String charset = bodyHeader.getContentParameter("charset"); 149 150 if (charset != null) { 151 model.setCharset(Charset.forName(charset)); 152 } 153 } 154 155 private void initHeader(IMailbox folder, Object [] uids) throws Exception { 156 Header header = folder.getHeaderFields(uids[0], new String [] { 158 "Subject", "To", "From" }); 159 160 BasicHeader rfcHeader = new BasicHeader(header); 161 162 model.setSubject(rfcHeader.getSubject()); 164 165 model.setHeaderField("From", rfcHeader.getFrom().toString() 167 + " (by way of " + rfcHeader.get("To") + ")"); 168 } 169 170 protected String createQuotedBody(IMailbox folder, Object [] uids, 171 Integer [] address) throws IOException , Exception { 172 InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address); 173 174 String quotedBody; 175 if (model.isHtml()) { 177 179 StringBuffer buf = new StringBuffer (); 181 buf.append("<html><body>"); 182 buf.append(HtmlParser.removeComments( HtmlParser.getHtmlBody(StreamUtils.readCharacterStream( 186 bodyStream).toString()))); 187 buf.append("</body></html>"); 188 189 quotedBody = buf.toString(); 190 } else { 191 quotedBody = StreamUtils.readCharacterStream(bodyStream).toString(); 193 194 } 195 196 bodyStream.close(); 197 return quotedBody; 198 } 199 } | Popular Tags |