196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * you may not use this file except in compliance with the License.
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * You may obtain a copy of the License at
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
172193962ca2b3157e79f731736afa2a0c972e778aMarc Blankpackage com.android.emailcommon.internet;
182193962ca2b3157e79f731736afa2a0c972e778aMarc Blank
192193962ca2b3157e79f731736afa2a0c972e778aMarc Blankimport com.android.emailcommon.mail.BodyPart;
202193962ca2b3157e79f731736afa2a0c972e778aMarc Blankimport com.android.emailcommon.mail.MessagingException;
212193962ca2b3157e79f731736afa2a0c972e778aMarc Blankimport com.android.emailcommon.mail.Multipart;
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.BufferedWriter;
2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException;
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStream;
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStream;
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStreamWriter;
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class MimeMultipart extends Multipart {
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected String mPreamble;
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected String mContentType;
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected String mBoundary;
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected String mSubType;
3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public MimeMultipart() throws MessagingException {
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mBoundary = generateBoundary();
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setSubType("mixed");
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public MimeMultipart(String contentType) throws MessagingException {
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        this.mContentType = contentType;
4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        try {
4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mSubType = MimeUtility.getHeaderParameter(contentType, null).split("/")[1];
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mBoundary = MimeUtility.getHeaderParameter(contentType, "boundary");
4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            if (mBoundary == null) {
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                throw new MessagingException("MultiPart does not contain boundary: " + contentType);
5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        } catch (Exception e) {
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            throw new MessagingException(
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                    "Invalid MultiPart Content-Type; must contain subtype and boundary. ("
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                            + contentType + ")", e);
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public String generateBoundary() {
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        StringBuffer sb = new StringBuffer();
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        sb.append("----");
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        for (int i = 0; i < 30; i++) {
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            sb.append(Integer.toString((int)(Math.random() * 35), 36));
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return sb.toString().toUpperCase();
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public String getPreamble() throws MessagingException {
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return mPreamble;
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void setPreamble(String preamble) throws MessagingException {
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        this.mPreamble = preamble;
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
75165e8bfe7a46564ea98bb16cb059102ba356a1b5Makoto Onuki    @Override
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public String getContentType() throws MessagingException {
7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return mContentType;
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void setSubType(String subType) throws MessagingException {
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        this.mSubType = subType;
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mContentType = String.format("multipart/%s; boundary=\"%s\"", subType, mBoundary);
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void writeTo(OutputStream out) throws IOException, MessagingException {
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (mPreamble != null) {
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            writer.write(mPreamble + "\r\n");
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        for (int i = 0, count = mParts.size(); i < count; i++) {
932193962ca2b3157e79f731736afa2a0c972e778aMarc Blank            BodyPart bodyPart = mParts.get(i);
9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            writer.write("--" + mBoundary + "\r\n");
9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            writer.flush();
9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            bodyPart.writeTo(out);
9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            writer.write("\r\n");
9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        writer.write("--" + mBoundary + "--\r\n");
10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        writer.flush();
10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public InputStream getInputStream() throws MessagingException {
10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return null;
10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
1077d3519151a34792956cfc2b63bd2735fd0202d54Makoto Onuki
1087d3519151a34792956cfc2b63bd2735fd0202d54Makoto Onuki    public String getSubTypeForTest() {
1097d3519151a34792956cfc2b63bd2735fd0202d54Makoto Onuki        return mSubType;
1107d3519151a34792956cfc2b63bd2735fd0202d54Makoto Onuki    }
11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
112