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