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.logging.Level ; 22 import java.util.logging.Logger ; 23 24 import org.columba.api.command.ICommandReference; 25 import org.columba.api.command.IWorkerStatusController; 26 import org.columba.core.command.Command; 27 import org.columba.core.command.ProgressObservedInputStream; 28 import org.columba.core.command.Worker; 29 import org.columba.core.io.StreamUtils; 30 import org.columba.mail.command.IMailFolderCommandReference; 31 import org.columba.mail.folder.IMailbox; 32 import org.columba.ristretto.coder.Base64DecoderInputStream; 33 import org.columba.ristretto.coder.EncodedWord; 34 import org.columba.ristretto.coder.QuotedPrintableDecoderInputStream; 35 import org.columba.ristretto.message.MimeHeader; 36 37 40 public abstract class SaveAttachmentCommand extends Command { 41 protected static File lastDir = null; 42 43 private static final Logger LOG = Logger 44 .getLogger("org.columba.mail.gui.message.attachment.command"); 45 46 52 public SaveAttachmentCommand(ICommandReference reference) { 53 super(reference); 54 } 55 56 59 public void execute(IWorkerStatusController worker) throws Exception { 60 IMailFolderCommandReference r = (IMailFolderCommandReference) getReference(); 61 IMailbox folder = (IMailbox) r.getSourceFolder(); 62 Object [] uids = r.getUids(); 63 64 Integer [] address = r.getAddress(); 65 66 MimeHeader header = folder.getMimePartTree(uids[0]).getFromAddress( 67 address).getHeader(); 68 69 InputStream bodyStream = folder.getMimePartBodyStream(uids[0], address); 70 71 bodyStream = new ProgressObservedInputStream(bodyStream, worker); 73 74 File destFile = getDestinationFile(header); 75 if ( destFile == null ) return; 76 77 worker.setDisplayText("Saving " + destFile.getName()); 78 79 File tempFile = new File (destFile.getAbsoluteFile() + ".part"); 81 82 if (tempFile == null) 83 return; 84 85 int encoding = header.getContentTransferEncoding(); 86 87 switch (encoding) { 88 case MimeHeader.QUOTED_PRINTABLE: 89 bodyStream = new QuotedPrintableDecoderInputStream(bodyStream); 90 break; 91 92 case MimeHeader.BASE64: 93 bodyStream = new Base64DecoderInputStream(bodyStream); 94 break; 95 default: 96 } 97 98 if (LOG.isLoggable(Level.FINE)) { 99 LOG.fine("Storing the attachment to :" + tempFile); 100 } 101 102 FileOutputStream fileStream = new FileOutputStream (tempFile); 103 StreamUtils.streamCopy(bodyStream, fileStream); 104 fileStream.close(); 105 bodyStream.close(); 106 107 tempFile.renameTo(destFile); 109 110 worker.setProgressBarValue(0); 112 113 worker.clearDisplayTextWithDelay(); 115 } 116 117 124 protected String getFilename(MimeHeader header) { 125 String fileName = header.getContentParameter("name"); 126 127 if (fileName == null) { 128 fileName = header.getDispositionParameter("filename"); 129 } 130 131 if (fileName != null) { 133 StringBuffer buf = EncodedWord.decode(fileName); 134 fileName = buf.toString(); 135 } 136 return fileName; 137 } 138 139 146 protected abstract File getDestinationFile(MimeHeader header); 147 } | Popular Tags |