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