LegacyConversions.java revision 3f1ac4da947f426775c9546f2e37206f58ce1a6e
13f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler/* 23f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copyright (C) 2009 The Android Open Source Project 33f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 43f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License"); 53f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * you may not use this file except in compliance with the License. 63f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * You may obtain a copy of the License at 73f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 83f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * http://www.apache.org/licenses/LICENSE-2.0 93f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 103f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Unless required by applicable law or agreed to in writing, software 113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS, 123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * See the License for the specific language governing permissions and 143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * limitations under the License. 153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerpackage com.android.email; 183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Address; 203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Message; 213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.MessagingException; 223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.Part; 233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.internet.MimeHeader; 243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.mail.internet.MimeUtility; 253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.AttachmentProvider; 263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent; 273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent.Attachment; 283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport com.android.email.provider.EmailContent.AttachmentColumns; 293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport org.apache.commons.io.IOUtils; 313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.ContentUris; 333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.ContentValues; 343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.content.Context; 353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport android.net.Uri; 363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.File; 383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.FileOutputStream; 393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.IOException; 403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.io.InputStream; 413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.util.ArrayList; 423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerimport java.util.Date; 433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadlerpublic class LegacyConversions { 453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copy field-by-field from a "store" message to a "provider" message 483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param message The message we've just downloaded 493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param localMessage The message we'd like to write into the DB 503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @result true if dirty (changes were made) 513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public static boolean updateMessageFields(EmailContent.Message localMessage, Message message, 533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long accountId, long mailboxId) throws MessagingException { 543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] from = message.getFrom(); 563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] to = message.getRecipients(Message.RecipientType.TO); 573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] cc = message.getRecipients(Message.RecipientType.CC); 583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] bcc = message.getRecipients(Message.RecipientType.BCC); 593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Address[] replyTo = message.getReplyTo(); 603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String subject = message.getSubject(); 613f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Date sentDate = message.getSentDate(); 623f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 633f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (from != null && from.length > 0) { 643f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mDisplayName = from[0].toFriendly(); 653f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 663f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sentDate != null) { 673f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mTimeStamp = sentDate.getTime(); 683f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 693f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (subject != null) { 703f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mSubject = subject; 713f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mPreview; 733f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public boolean mFlagRead = false; 743f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 753f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Keep the message in the "unloaded" state until it has (at least) a display name. 763f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // This prevents early flickering of empty messages in POP download. 773f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (localMessage.mFlagLoaded != EmailContent.Message.LOADED) { 783f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (localMessage.mDisplayName == null || "".equals(localMessage.mDisplayName)) { 793f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mFlagLoaded = EmailContent.Message.NOT_LOADED; 803f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } else { 813f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mFlagLoaded = EmailContent.Message.PARTIALLY_LOADED; 823f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 833f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 843f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // TODO handle flags, favorites, and read/unread 853f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public boolean mFlagFavorite = false; 863f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public boolean mFlagAttachment = false; 873f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public int mFlags = 0; 883f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// 893f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mTextInfo; 903f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mHtmlInfo; 913f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// 923f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mServerId = message.getUid(); 933f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public int mServerIntId; 943f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mClientId; 953f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mMessageId; 963f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mThreadId; 973f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// 983f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public long mBodyKey; 993f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mMailboxKey = mailboxId; 1003f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mAccountKey = accountId; 1013f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public long mReferenceKey; 1023f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// 1033f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mSender; 1043f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (from != null && from.length > 0) { 1053f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mFrom = Address.pack(from); 1063f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1073f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1083f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mTo = Address.pack(to); 1093f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mCc = Address.pack(cc); 1103f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mBcc = Address.pack(bcc); 1113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mReplyTo = Address.pack(replyTo); 1123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mServerVersion; 1143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// 1153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mText; 1163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// public String mHtml; 1173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// 1183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// // Can be used while building messages, but is NOT saved by the Provider 1193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler// transient public ArrayList<Attachment> mAttachments = null; 1203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler return true; 1223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 1253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copy body text (plain and/or HTML) from MimeMessage to provider Message 1263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 1273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: Take a closer look at textInfo and deal with it if necessary. 1283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 1293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public static boolean updateBodyFields(EmailContent.Body body, 1303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler EmailContent.Message localMessage, ArrayList<Part> viewables) 1313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler throws MessagingException { 1323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler body.mMessageKey = localMessage.mId; 1343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler StringBuffer sbHtml = new StringBuffer(); 1363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler StringBuffer sbText = new StringBuffer(); 1373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler for (Part viewable : viewables) { 1383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String text = MimeUtility.getTextFromPart(viewable); 1393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if ("text/html".equalsIgnoreCase(viewable.getMimeType())) { 1403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sbHtml.length() > 0) { 1413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler sbHtml.append('\n'); 1423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler sbHtml.append(text); 1443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } else { 1453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sbText.length() > 0) { 1463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler sbText.append('\n'); 1473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler sbText.append(text); 1493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // write the combined data to the body part 1533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sbText.length() != 0) { 1543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mTextInfo = "X;X;8;" + sbText.length()*2; 1553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler body.mTextContent = sbText.toString(); 1563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (sbHtml.length() != 0) { 1583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mHtmlInfo = "X;X;8;" + sbHtml.length()*2; 1593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler body.mHtmlContent = sbHtml.toString(); 1603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1613f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler return true; 1623f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1633f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1643f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 1653f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Copy attachments from MimeMessage to provider Message. 1663f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 1673f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param context a context for file operations 1683f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param localMessage the attachments will be built against this message 1693f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param message the original message from POP or IMAP, that may have attachments 1703f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @return true if it succeeded 1713f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @throws IOException 1723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 1733f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler public static void updateAttachments(Context context, EmailContent.Message localMessage, 1743f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler ArrayList<Part> attachments) throws MessagingException, IOException { 1753f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mAttachments = null; 1763f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler for (Part attachmentPart : attachments) { 1773f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler addOneAttachment(context, localMessage, attachmentPart); 1783f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1793f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 1803f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1813f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler /** 1823f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * Add a single attachment part to the message 1833f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 1843f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: This will simply add to any existing attachments - could this ever happen? If so, 1853f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * change it to find existing attachments and delete/merge them. 1863f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * TODO: Take a closer look at encoding and deal with it if necessary. 1873f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * 1883f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param context a context for file operations 1893f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param localMessage the attachments will be built against this message 1903f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @param part a single attachment part from POP or IMAP 1913f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @return true if it succeeded 1923f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler * @throws IOException 1933f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler */ 1943f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler private static void addOneAttachment(Context context, EmailContent.Message localMessage, 1953f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Part part) throws MessagingException, IOException { 1963f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1973f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Attachment localAttachment = new Attachment(); 1983f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 1993f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Transfer fields from mime format to provider format 2003f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String contentType = MimeUtility.unfoldAndDecode(part.getContentType()); 2013f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String name = MimeUtility.getHeaderParameter(contentType, "name"); 2023f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (name == null) { 2033f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String contentDisposition = MimeUtility.unfoldAndDecode(part.getContentType()); 2043f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler name = MimeUtility.getHeaderParameter(contentDisposition, "filename"); 2053f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2063f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2073f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Try to pull size from disposition (if not downloaded) 2083f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long size = 0; 2093f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String disposition = part.getDisposition(); 2103f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (disposition != null) { 2113f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String s = MimeUtility.getHeaderParameter(disposition, "size"); 2123f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (s != null) { 2133f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler size = Long.parseLong(s); 2143f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2153f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2163f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2173f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Get partId for unloaded IMAP attachments (if any) 2183f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // This is only provided (and used) when we have structure but not the actual attachment 2193f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String[] partIds = part.getHeader(MimeHeader.HEADER_ANDROID_ATTACHMENT_STORE_DATA); 2203f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String partId = partIds != null ? partIds[0] : null;; 2213f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2223f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mFileName = MimeUtility.getHeaderParameter(contentType, "name"); 2233f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mMimeType = part.getMimeType(); 2243f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mSize = size; // May be reset below if file handled 2253f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mContentId = part.getContentId(); 2263f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mContentUri = null; // Will be set when file is saved 2273f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mMessageKey = localMessage.mId; 2283f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mLocation = partId; 2293f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mEncoding = "B"; // TODO - convert other known encodings 2303f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2313f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // Save the attachment (so far) in order to obtain an id 2323f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.save(context); 2333f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2343f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // If an attachment body was actually provided, we need to write the file now 2353f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // TODO this should be separated so it can be reused for attachment downloads 2363f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (part.getBody() != null) { 2373f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long attachmentId = localAttachment.mId; 2383f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long accountId = localMessage.mAccountKey; 2393f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2403f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler InputStream in = part.getBody().getInputStream(); 2413f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2423f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler File saveIn = AttachmentProvider.getAttachmentDirectory(context, accountId); 2433f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (!saveIn.exists()) { 2443f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler saveIn.mkdirs(); 2453f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2463f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler File saveAs = AttachmentProvider.getAttachmentFilename(context, accountId, 2473f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler attachmentId); 2483f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler saveAs.createNewFile(); 2493f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler FileOutputStream out = new FileOutputStream(saveAs); 2503f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler long copySize = IOUtils.copy(in, out); 2513f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler in.close(); 2523f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler out.close(); 2533f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2543f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // update the attachment with the extra information we now know 2553f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler String contentUriString = AttachmentProvider.getAttachmentUri( 2563f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler accountId, attachmentId).toString(); 2573f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2583f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mSize = copySize; 2593f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localAttachment.mContentUri = contentUriString; 2603f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2613f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler // update the attachment in the database as well 2623f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler ContentValues cv = new ContentValues(); 2633f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler cv.put(AttachmentColumns.SIZE, copySize); 2643f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler cv.put(AttachmentColumns.CONTENT_URI, contentUriString); 2653f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler Uri uri = ContentUris.withAppendedId(Attachment.CONTENT_URI, attachmentId); 2663f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler context.getContentResolver().update(uri, cv, null, null); 2673f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2683f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler 2693f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler if (localMessage.mAttachments == null) { 2703f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mAttachments = new ArrayList<Attachment>(); 2713f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2723f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mAttachments.add(localAttachment); 2733f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler localMessage.mFlagAttachment = true; 2743f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler } 2753f1ac4da947f426775c9546f2e37206f58ce1a6eAndrew Stadler} 276