1 17 package org.columba.mail.gui.composer.command; 18 19 import java.io.InputStream ; 20 import java.nio.charset.Charset ; 21 import java.nio.charset.UnsupportedCharsetException ; 22 import java.util.Iterator ; 23 import java.util.List ; 24 25 import org.columba.api.command.ICommandReference; 26 import org.columba.api.command.IWorkerStatusController; 27 import org.columba.core.command.Command; 28 import org.columba.core.gui.frame.DefaultContainer; 29 import org.columba.core.io.StreamUtils; 30 import org.columba.core.xml.XmlElement; 31 import org.columba.mail.command.MailFolderCommandReference; 32 import org.columba.mail.composer.MessageBuilderHelper; 33 import org.columba.mail.config.AccountItem; 34 import org.columba.mail.config.MailConfig; 35 import org.columba.mail.folder.IMailbox; 36 import org.columba.mail.gui.composer.ComposerController; 37 import org.columba.mail.gui.composer.ComposerModel; 38 import org.columba.ristretto.coder.Base64DecoderInputStream; 39 import org.columba.ristretto.coder.CharsetDecoderInputStream; 40 import org.columba.ristretto.coder.QuotedPrintableDecoderInputStream; 41 import org.columba.ristretto.io.Source; 42 import org.columba.ristretto.io.TempSourceFactory; 43 import org.columba.ristretto.message.BasicHeader; 44 import org.columba.ristretto.message.Flags; 45 import org.columba.ristretto.message.Header; 46 import org.columba.ristretto.message.LocalMimePart; 47 import org.columba.ristretto.message.Message; 48 import org.columba.ristretto.message.MimeHeader; 49 import org.columba.ristretto.message.MimePart; 50 import org.columba.ristretto.message.MimeTree; 51 import org.columba.ristretto.message.StreamableMimePart; 52 import org.columba.ristretto.parser.MessageParser; 53 54 59 public class OpenMessageWithComposerCommand extends Command { 60 protected ComposerController controller; 61 protected ComposerModel model; 62 protected IMailbox folder; 63 protected Object uid; 64 65 71 public OpenMessageWithComposerCommand(ICommandReference reference) { 72 super(reference); 73 } 74 75 public void updateGUI() throws Exception { 76 controller = new ComposerController(); 78 new DefaultContainer(controller); 79 80 controller.setComposerModel(model); 82 83 controller.updateComponents(true); 85 } 86 87 public void execute(IWorkerStatusController worker) throws Exception { 88 model = new ComposerModel(); 89 90 folder = (IMailbox) ((MailFolderCommandReference) getReference()) 92 .getSourceFolder(); 93 94 Object [] uids = ((MailFolderCommandReference) getReference()).getUids(); 96 97 uid = uids[0]; 99 100 102 InputStream messageSourceStream = folder.getMessageSourceStream(uid); 103 Source tempSource = TempSourceFactory.createTempSource( 104 messageSourceStream, -1); 105 messageSourceStream.close(); 106 107 Message message = MessageParser.parse(tempSource); 108 109 initHeader(message); 110 111 Flags flags = folder.getFlags(uid); 113 model.getMessage().getHeader().setFlags(flags); 114 115 Integer accountUid = (Integer ) folder.getAttribute(uids[0], 117 "columba.accountuid"); 118 AccountItem accountItem = MessageBuilderHelper 119 .getAccountItem(accountUid); 120 model.setAccountItem(accountItem); 121 122 XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig() 123 .getRoot().getElement("/options/html"); 124 125 boolean preferHtml = Boolean.valueOf(html.getAttribute("prefer")) 126 .booleanValue(); 127 128 initBody(message, preferHtml); 129 130 model.setSourceReference(new MailFolderCommandReference(folder, new Object [] {uid})); 132 } 133 134 private void initBody(Message message, boolean preferHtml) throws Exception { 135 MimeTree mimeTree = message.getMimePartTree(); 136 137 LocalMimePart bodyPart = null; 139 140 if (preferHtml) { 141 bodyPart = (LocalMimePart) mimeTree.getFirstTextPart("html"); 142 } else { 143 bodyPart = (LocalMimePart) mimeTree.getFirstTextPart("plain"); 144 } 145 146 if (bodyPart != null) { 147 MimeHeader header = bodyPart.getHeader(); 148 if (header.getMimeType().getSubtype().equals("html")) { 149 model.setHtml(true); 151 } else { 152 model.setHtml(false); 153 } 154 InputStream bodyStream = folder.getMimePartBodyStream(uid, bodyPart.getAddress()); 155 156 switch( header.getContentTransferEncoding() ) { 158 case MimeHeader.QUOTED_PRINTABLE : { 159 bodyStream = new QuotedPrintableDecoderInputStream(bodyStream); 160 break; 161 } 162 163 case MimeHeader.BASE64 : { 164 bodyStream = new Base64DecoderInputStream(bodyStream); 165 } 166 } 167 String charset = header.getContentParameter("charset"); 168 if (charset != null) { 169 try { 170 bodyStream = new CharsetDecoderInputStream(bodyStream, Charset.forName(charset)); 171 model.setCharset(Charset.forName(charset)); 172 } catch( UnsupportedCharsetException e ) { 173 } 175 } 176 177 model.setBodyText(StreamUtils.readCharacterStream( 178 bodyStream) 179 .toString()); 180 181 } 182 183 initAttachments(mimeTree, bodyPart); 184 } 185 186 private void initHeader(Message message) { 187 Header header = message.getHeader(); 188 189 BasicHeader rfcHeader = new BasicHeader(header); 190 191 model.setSubject(rfcHeader.getSubject()); 193 194 model.setTo(rfcHeader.getTo()); 195 196 model.setCc(rfcHeader.getCc()); 197 model.setBcc(rfcHeader.getBcc()); 198 199 model.setHeader(header); 201 } 202 203 private void initAttachments(MimeTree collection, MimePart bodyPart) { 204 List displayedMimeParts = collection.getAllLeafs(); 206 207 if (bodyPart != null) { 208 MimePart bodyParent = bodyPart.getParent(); 209 210 if (bodyParent != null && bodyParent.getHeader().getMimeType().getSubtype().equals( 213 "alternative")) { 214 List bodyParts = bodyParent.getChilds(); 215 displayedMimeParts.removeAll(bodyParts); 216 } else { 217 displayedMimeParts.remove(bodyPart); 218 } 219 220 Iterator it = displayedMimeParts.iterator(); 221 222 while (it.hasNext()) { 223 model.addMimePart((StreamableMimePart) it.next()); 224 } 225 } 226 } 227 } | Popular Tags |