148360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler/*
248360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * Copyright (C) 2014 The Android Open Source Project
348360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler *
448360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
548360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * you may not use this file except in compliance with the License.
648360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * You may obtain a copy of the License at
748360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler *
848360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
948360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler *
1048360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * Unless required by applicable law or agreed to in writing, software
1148360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
1248360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1348360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * See the License for the specific language governing permissions and
1448360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler * limitations under the License.
1548360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler */
1648360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
1748360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerpackage com.android.emailcommon.mail;
1848360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
1948360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerimport android.util.Base64;
2048360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerimport android.util.Base64OutputStream;
2148360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
2248360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerimport org.apache.commons.io.IOUtils;
2348360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
2448360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerimport java.io.IOException;
2548360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerimport java.io.InputStream;
2648360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerimport java.io.OutputStream;
2748360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
2848360707c04c11a92a725d74546a53a5afb36ad8Tony Mantlerpublic class Base64Body implements Body {
2948360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    private final InputStream mSource;
30c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler    // Because we consume the input stream, we can only write out once
31c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler    private boolean mAlreadyWritten;
3248360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
3348360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    public Base64Body(InputStream source) {
3448360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler        mSource = source;
3548360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    }
3648360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
3748360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    @Override
3848360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    public InputStream getInputStream() throws MessagingException {
3948360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler        return mSource;
4048360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    }
4148360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler
42c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler    /**
43c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler     * This method consumes the input stream, so can only be called once
44c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler     * @param out Stream to write to
45c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler     * @throws IllegalStateException If called more than once
46c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler     * @throws IOException
47c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler     * @throws MessagingException
48c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler     */
4948360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    @Override
50c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler    public void writeTo(OutputStream out)
51c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler            throws IllegalStateException, IOException, MessagingException {
52c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler        if (mAlreadyWritten) {
53c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler            throw new IllegalStateException("Base64Body can only be written once");
54c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler        }
55c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler        mAlreadyWritten = true;
56c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler        try {
57c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler            final Base64OutputStream b64out = new Base64OutputStream(out, Base64.DEFAULT);
58c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler            IOUtils.copyLarge(mSource, b64out);
59c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler        } finally {
60c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler            mSource.close();
61c68d34d924b32dd40644637be5817d0e64ac73beTony Mantler        }
6248360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler    }
6348360707c04c11a92a725d74546a53a5afb36ad8Tony Mantler}
64