1 17 package org.columba.mail.gui.composer.command; 18 19 import java.io.IOException ; 20 import java.io.InputStream ; 21 import java.nio.charset.Charset ; 22 import java.nio.charset.UnsupportedCharsetException ; 23 import java.text.DateFormat ; 24 import java.util.logging.Logger ; 25 26 import org.columba.api.command.ICommandReference; 27 import org.columba.api.command.IWorkerStatusController; 28 import org.columba.core.command.Command; 29 import org.columba.core.gui.frame.DefaultContainer; 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.AccountItem; 35 import org.columba.mail.config.MailConfig; 36 import org.columba.mail.folder.IMailbox; 37 import org.columba.mail.gui.composer.ComposerController; 38 import org.columba.mail.gui.composer.ComposerModel; 39 import org.columba.mail.gui.composer.util.QuoteFilterInputStream; 40 import org.columba.mail.gui.util.AddressListRenderer; 41 import org.columba.mail.parser.text.HtmlParser; 42 import org.columba.mail.util.MailResourceLoader; 43 import org.columba.ristretto.coder.Base64DecoderInputStream; 44 import org.columba.ristretto.coder.CharsetDecoderInputStream; 45 import org.columba.ristretto.coder.QuotedPrintableDecoderInputStream; 46 import org.columba.ristretto.message.Address; 47 import org.columba.ristretto.message.BasicHeader; 48 import org.columba.ristretto.message.Header; 49 import org.columba.ristretto.message.MimeHeader; 50 import org.columba.ristretto.message.MimePart; 51 import org.columba.ristretto.message.MimeTree; 52 53 60 public class ReplyCommand extends Command { 61 62 63 private static final Logger LOG = Logger 64 .getLogger("org.columba.mail.gui.composer.command"); 65 66 protected final String [] headerfields = new String [] { "Subject", "Date", 67 "From", "To", "Reply-To", "Message-ID", "In-Reply-To", "References"}; 68 69 protected ComposerController controller; 70 71 protected ComposerModel model; 72 73 79 public ReplyCommand(ICommandReference reference) { 80 super(reference); 81 } 82 83 public void updateGUI() throws Exception { 84 controller = new ComposerController(); 86 new DefaultContainer(controller); 87 88 controller.setComposerModel(model); 90 91 controller.updateComponents(true); 93 94 controller.getCurrentEditor().getViewUIComponent().requestFocus(); 96 controller.getCurrentEditor().getViewUIComponent().moveCaretPosition(0); 97 controller.getCurrentEditor().getViewUIComponent().select(0,0); 98 } 99 100 public void execute(IWorkerStatusController worker) throws Exception { 101 model = new ComposerModel(); 103 104 IMailbox folder = (IMailbox) ((MailFolderCommandReference) getReference()) 106 .getSourceFolder(); 107 108 Object [] uids = ((MailFolderCommandReference) getReference()).getUids(); 110 111 MailFolderCommandReference ref = new MailFolderCommandReference(folder, uids); 115 model.setSourceReference(ref); 116 117 initHeader(folder, uids); 119 120 MimeTree mimePartTree = folder.getMimePartTree(uids[0]); 122 123 XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig() 124 .getRoot().getElement("/options/html"); 125 126 MimePart bodyPart = null; 128 129 if (Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) { 130 bodyPart = mimePartTree.getFirstTextPart("html"); 131 } else { 132 bodyPart = mimePartTree.getFirstTextPart("plain"); 133 } 134 135 if (bodyPart != null) { 136 initMimeHeader(bodyPart); 138 139 Integer [] address = bodyPart.getAddress(); 140 141 String quotedBodyText = createQuotedBody(bodyPart.getHeader(), folder, uids, address); 142 143 LOG.fine("Quoted body text:\n" + quotedBodyText); 145 146 model.setBodyText(quotedBodyText); 147 } 148 } 149 150 protected void initMimeHeader(MimePart bodyPart) { 151 MimeHeader bodyHeader = bodyPart.getHeader(); 152 153 if (bodyHeader.getMimeType().getSubtype().equals("html")) { 154 model.setHtml(true); 155 } else { 156 model.setHtml(false); 157 } 158 159 String charset = bodyHeader.getContentParameter("charset"); 161 162 if (charset != null) { 163 try { 164 model.setCharset(Charset.forName(charset)); 165 } catch( UnsupportedCharsetException e ) { 166 } 168 } 169 } 170 171 protected void initHeader(IMailbox folder, Object [] uids) throws Exception { 172 Header header = folder.getHeaderFields(uids[0], headerfields); 174 175 BasicHeader rfcHeader = new BasicHeader(header); 176 177 model.setSubject(MessageBuilderHelper.createReplySubject(rfcHeader 179 .getSubject())); 180 181 Address[] to = rfcHeader.getReplyTo(); 183 184 if (to.length == 0) { 185 to = new Address[] { rfcHeader.getFrom()}; 186 } 187 188 MessageBuilderHelper.addAddressesToAddressbook(to); 190 model.setTo(to); 191 192 MessageBuilderHelper.createMailingListHeaderItems(header, model); 194 195 Integer accountUid = (Integer ) folder.getAttribute(uids[0], 197 "columba.accountuid"); 198 AccountItem accountItem = MessageBuilderHelper 199 .getAccountItem(accountUid); 200 model.setAccountItem(accountItem); 201 } 202 203 protected String createQuotedBody(MimeHeader header, IMailbox folder, Object [] uids, 204 Integer [] address) throws IOException , Exception { 205 InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address); 206 207 switch( header.getContentTransferEncoding() ) { 209 case MimeHeader.QUOTED_PRINTABLE : { 210 bodyStream = new QuotedPrintableDecoderInputStream(bodyStream); 211 break; 212 } 213 214 case MimeHeader.BASE64 : { 215 bodyStream = new Base64DecoderInputStream(bodyStream); 216 } 217 } 218 String charset = header.getContentParameter("charset"); 219 if( charset != null ) { 220 try { 221 bodyStream = new CharsetDecoderInputStream(bodyStream, Charset.forName(charset)); 222 } catch( UnsupportedCharsetException e ) { 223 } 225 } 226 227 String quotedBody; 228 if (model.isHtml()) { 230 BasicHeader rfcHeader = new BasicHeader(folder.getHeaderFields( 233 uids[0], headerfields)); 234 String subject = rfcHeader.getSubject(); 235 String date = DateFormat.getDateTimeInstance(DateFormat.LONG, 236 DateFormat.MEDIUM).format(rfcHeader.getDate()); 237 String from = AddressListRenderer.renderToHTMLWithLinks( 238 new Address[] { rfcHeader.getFrom()}).toString(); 239 String to = AddressListRenderer.renderToHTMLWithLinks( 240 rfcHeader.getTo()).toString(); 241 242 StringBuffer buf = new StringBuffer (); 244 buf.append("<html><body><p>"); 245 buf.append(MailResourceLoader.getString("dialog", "composer", 246 "original_message_start")); 247 buf.append("<br>" 248 + MailResourceLoader.getString("header", "header", 249 "subject") + ": " + subject); 250 buf.append("<br>" 251 + MailResourceLoader.getString("header", "header", "date") 252 + ": " + date); 253 buf.append("<br>" 254 + MailResourceLoader.getString("header", "header", "from") 255 + ": " + from); 256 buf.append("<br>" 257 + MailResourceLoader.getString("header", "header", "to") 258 + ": " + to); 259 buf.append("</p>"); 260 buf.append(HtmlParser.removeComments( HtmlParser.getHtmlBody(StreamUtils.readCharacterStream(bodyStream) 263 .toString()))); 264 buf.append("<p>"); 265 buf.append(MailResourceLoader.getString("dialog", "composer", 266 "original_message_end")); 267 buf.append("</p></body></html>"); 268 269 quotedBody = buf.toString(); 270 } else { 271 quotedBody = StreamUtils.readCharacterStream(new QuoteFilterInputStream(bodyStream)).toString(); 273 } 274 275 bodyStream.close(); 276 return quotedBody; 277 } 278 279 286 public ComposerModel getModel() { 287 return model; 288 } 289 } 290 | Popular Tags |