1 package org.columba.mail.gui.message.command; 17 18 import java.io.File ; 19 import java.io.FileOutputStream ; 20 import java.io.InputStream ; 21 import java.util.Enumeration ; 22 import java.util.logging.Level ; 23 import java.util.logging.Logger ; 24 25 import javax.swing.JFileChooser ; 26 import javax.swing.JOptionPane ; 27 28 import org.columba.api.command.ICommandReference; 29 import org.columba.api.command.IWorkerStatusController; 30 import org.columba.api.plugin.IExtension; 31 import org.columba.api.plugin.IExtensionHandler; 32 import org.columba.api.plugin.PluginException; 33 import org.columba.api.plugin.PluginHandlerNotFoundException; 34 import org.columba.core.base.cFileChooser; 35 import org.columba.core.base.cFileFilter; 36 import org.columba.core.command.Command; 37 import org.columba.core.command.CommandProcessor; 38 import org.columba.core.command.ProgressObservedInputStream; 39 import org.columba.core.command.Worker; 40 import org.columba.core.desktop.ColumbaDesktop; 41 import org.columba.core.gui.frame.DefaultContainer; 42 import org.columba.core.gui.frame.FrameManager; 43 import org.columba.core.io.StreamUtils; 44 import org.columba.core.logging.Logging; 45 import org.columba.core.plugin.PluginManager; 46 import org.columba.core.util.TempFileStore; 47 import org.columba.mail.command.IMailFolderCommandReference; 48 import org.columba.mail.command.MailFolderCommandReference; 49 import org.columba.mail.folder.IMailbox; 50 import org.columba.mail.folder.temp.TempFolder; 51 import org.columba.mail.gui.attachment.IAttachmentHandler; 52 import org.columba.mail.gui.message.util.AttachmentContext; 53 import org.columba.mail.gui.messageframe.MessageFrameController; 54 import org.columba.mail.gui.tree.FolderTreeModel; 55 import org.columba.mail.plugin.IExtensionHandlerKeys; 56 import org.columba.ristretto.coder.Base64DecoderInputStream; 57 import org.columba.ristretto.coder.QuotedPrintableDecoderInputStream; 58 import org.columba.ristretto.message.MimeHeader; 59 60 63 public class OpenAttachmentCommand extends SaveAttachmentCommand { 64 private static final Logger LOG = Logger 65 .getLogger("org.columba.mail.gui.message.attachment.command"); 66 67 private File tempFile; 68 69 private TempFolder tempFolder; 70 71 private Object tempMessageUid; 72 73 private MimeHeader header; 74 75 81 public OpenAttachmentCommand(ICommandReference reference) { 82 super(reference); 83 84 priority = Command.REALTIME_PRIORITY; 85 commandType = Command.NORMAL_OPERATION; 86 } 87 88 91 public void updateGUI() throws Exception { 92 93 if (header.getMimeType().getType().toLowerCase().indexOf("message") != -1) { 94 MessageFrameController c = new MessageFrameController(); 95 new DefaultContainer(c); 96 97 Object [] uidList = new Object [1]; 98 uidList[0] = tempMessageUid; 99 100 IMailFolderCommandReference r = new MailFolderCommandReference( 101 tempFolder, uidList); 102 103 c.setTreeSelection(r); 104 c.setTableSelection(r); 105 106 CommandProcessor.getInstance().addOp(new ViewMessageCommand(c, r)); 107 108 } else { 109 110 boolean attachmentHandlerExecuted = false; 111 try { 112 IExtensionHandler handler = PluginManager 113 .getInstance() 114 .getExtensionHandler( 115 IExtensionHandlerKeys.ORG_COLUMBA_ATTACHMENT_HANDLER); 116 117 Enumeration <IExtension> e = handler.getExtensionEnumeration(); 118 while (e.hasMoreElements()) { 119 IExtension extension = e.nextElement(); 120 try { 121 IAttachmentHandler attachmentHandler = (IAttachmentHandler) extension 122 .instanciateExtension(null); 123 124 attachmentHandler.execute(new AttachmentContext( 125 tempFile, header)); 126 attachmentHandlerExecuted &= true; 127 } catch (PluginException e1) { 128 LOG.severe("Error while loading plugin: " 129 + e1.getMessage()); 130 if (Logging.DEBUG) 131 e1.printStackTrace(); 132 } 133 } 134 135 } catch (PluginHandlerNotFoundException e2) { 136 LOG.severe("Error while loading plugin: " + e2.getMessage()); 137 if (Logging.DEBUG) 138 e2.printStackTrace(); 139 } 140 141 if (!attachmentHandlerExecuted) { 144 boolean success = ColumbaDesktop.getInstance().open(tempFile); 145 146 if (!success) { 148 File saveToFile = getDestinationFile(header); 149 150 if (saveToFile.exists()) 151 saveToFile.delete(); 152 tempFile.renameTo(saveToFile); 153 } 154 } 155 } 156 } 157 158 161 public void execute(IWorkerStatusController worker) throws Exception { 162 IMailFolderCommandReference r = (IMailFolderCommandReference) getReference(); 163 IMailbox folder = (IMailbox) r.getSourceFolder(); 164 Object [] uids = r.getUids(); 165 166 Integer [] address = r.getAddress(); 167 168 header = folder.getMimePartTree(uids[0]).getFromAddress(address) 169 .getHeader(); 170 171 worker.setDisplayText("Opening " + header.getFileName()); 172 173 InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address); 174 bodyStream = new ProgressObservedInputStream(bodyStream, worker); 176 177 if (header.getMimeType().getType().equals("message")) { 178 179 tempFolder = FolderTreeModel.getInstance().getTempFolder(); 180 try { 181 tempMessageUid = tempFolder.addMessage(bodyStream); 182 } catch (Exception e) { 183 LOG 184 .warning("Could not create temporary email from the attachment."); 185 } 186 187 } else { 188 189 String filename = header.getFileName(); 190 if (filename != null) { 191 tempFile = TempFileStore.createTempFile(filename); 192 } else { 193 tempFile = TempFileStore.createTempFile(); 194 } 195 196 int encoding = header.getContentTransferEncoding(); 197 198 switch (encoding) { 199 case MimeHeader.QUOTED_PRINTABLE: 200 bodyStream = new QuotedPrintableDecoderInputStream(bodyStream); 201 break; 202 203 case MimeHeader.BASE64: 204 bodyStream = new Base64DecoderInputStream(bodyStream); 205 break; 206 default: 207 } 208 209 if (LOG.isLoggable(Level.FINE)) { 210 LOG.fine("Storing the attachment to :" + tempFile); 211 } 212 213 FileOutputStream fileStream = new FileOutputStream (tempFile); 214 StreamUtils.streamCopy(bodyStream, fileStream); 215 fileStream.close(); 216 bodyStream.close(); 217 } 218 } 219 220 protected File getDestinationFile(MimeHeader header) { 221 cFileChooser fileChooser; 222 223 if (lastDir == null) { 224 fileChooser = new cFileChooser(); 225 } else { 226 fileChooser = new cFileChooser(lastDir); 227 } 228 229 cFileFilter fileFilter = new cFileFilter(); 230 fileFilter.acceptFilesWithProperty(cFileFilter.FILEPROPERTY_FILE); 231 232 fileChooser.setDialogTitle("Save Attachment as ..."); 233 234 String fileName = getFilename(header); 235 if (fileName != null) { 236 fileChooser.forceSelectedFile(new File (fileName)); 237 } 238 239 fileChooser.setSelectFilter(fileFilter); 240 File tempFile = null; 241 242 while (true) { 243 if (fileChooser.showSaveDialog(null) != JFileChooser.APPROVE_OPTION) { 244 return null; 245 } 246 247 tempFile = fileChooser.getSelectedFile(); 248 lastDir = tempFile.getParentFile(); 249 250 if (tempFile.exists()) { 251 if (JOptionPane.showConfirmDialog(FrameManager.getInstance() 252 .getActiveFrame(), "Overwrite File?", 253 "Warning", JOptionPane.YES_NO_OPTION, 254 JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { 255 break; 256 } 257 } else { 258 break; 259 } 260 } 261 return tempFile; 262 } 263 } | Popular Tags |