1345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein/* 2345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Copyright (C) 2008 The Android Open Source Project 3345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * 4345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 5345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * you may not use this file except in compliance with the License. 6345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * You may obtain a copy of the License at 7345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * 8345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 9345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * 10345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * Unless required by applicable law or agreed to in writing, software 11345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 12345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * See the License for the specific language governing permissions and 14345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * limitations under the License. 15345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */ 16345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 17345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpackage com.android.emailcommon.internet; 18345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 19345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport com.android.emailcommon.TempDirectory; 20345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport com.android.emailcommon.mail.Body; 21345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport com.android.emailcommon.mail.MessagingException; 22345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 23345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport org.apache.commons.io.IOUtils; 24345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 25345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport android.util.Base64; 26345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport android.util.Base64OutputStream; 27345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 28345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.io.File; 29345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.io.FileInputStream; 30345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.io.FileOutputStream; 31345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.io.FilterInputStream; 32345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.io.IOException; 33345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.io.InputStream; 34345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinimport java.io.OutputStream; 35345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 36345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein/** 37345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * A Body that is backed by a temp file. The Body exposes a getOutputStream method that allows 38345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * the user to write to the temp file. After the write the body is available via getInputStream 39345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * and writeTo one time. After writeTo is called, or the InputStream returned from 40345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * getInputStream is closed the file is deleted and the Body should be considered disposed of. 41345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */ 42345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sappersteinpublic class BinaryTempFileBody implements Body { 43345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein private File mFile; 44345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 45345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein /** 46345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * An alternate way to put data into a BinaryTempFileBody is to simply supply an already- 47345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * created file. Note that this file will be deleted after it is read. 48345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein * @param filePath The file containing the data to be stored on disk temporarily 49345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein */ 50345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public void setFile(String filePath) { 51345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mFile = new File(filePath); 52345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 53345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 54345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public OutputStream getOutputStream() throws IOException { 55345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mFile = File.createTempFile("body", null, TempDirectory.getTempDirectory()); 56345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mFile.deleteOnExit(); 57345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein return new FileOutputStream(mFile); 58345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 59345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 60aa27bc0e1c3bb6be4609b00007637a9d3e960f5eScott Kennedy @Override 61345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public InputStream getInputStream() throws MessagingException { 62345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein try { 63345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein return new BinaryTempFileBodyInputStream(new FileInputStream(mFile)); 64345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 65345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein catch (IOException ioe) { 66345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein throw new MessagingException("Unable to open body", ioe); 67345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 68345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 69345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 70aa27bc0e1c3bb6be4609b00007637a9d3e960f5eScott Kennedy @Override 71345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public void writeTo(OutputStream out) throws IOException, MessagingException { 72345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein InputStream in = getInputStream(); 73345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein Base64OutputStream base64Out = new Base64OutputStream( 74345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein out, Base64.CRLF | Base64.NO_CLOSE); 75345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein IOUtils.copy(in, base64Out); 76345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein base64Out.close(); 77345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mFile.delete(); 78345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 79345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 80345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein class BinaryTempFileBodyInputStream extends FilterInputStream { 81345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public BinaryTempFileBodyInputStream(InputStream in) { 82345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein super(in); 83345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 84345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein 85345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein @Override 86345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein public void close() throws IOException { 87345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein super.close(); 88345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein mFile.delete(); 89345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 90345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein } 91345c43e12db42f6bdc0c15ac1c96af10164a458cAndrew Sapperstein} 92