diff --git a/k9mail/src/androidTest/java/com/fsck/k9/mailstore/ReconstructMessageFromDatabaseTest.java b/k9mail/src/androidTest/java/com/fsck/k9/mailstore/ReconstructMessageFromDatabaseTest.java index a4b1aaaee..3b2c272e4 100644 --- a/k9mail/src/androidTest/java/com/fsck/k9/mailstore/ReconstructMessageFromDatabaseTest.java +++ b/k9mail/src/androidTest/java/com/fsck/k9/mailstore/ReconstructMessageFromDatabaseTest.java @@ -13,10 +13,12 @@ import android.test.RenamingDelegatingContext; import com.fsck.k9.Account; import com.fsck.k9.K9; +import com.fsck.k9.mail.Body; import com.fsck.k9.mail.FetchProfile; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.internet.BinaryTempFileBody; import com.fsck.k9.mail.internet.MimeMessage; +import org.apache.james.mime4j.util.MimeUtil; public class ReconstructMessageFromDatabaseTest extends ApplicationTestCase { @@ -89,6 +91,39 @@ public class ReconstructMessageFromDatabaseTest extends ApplicationTestCase assertEquals(MESSAGE_SOURCE, reconstructedMessage); } + public void testAddMissingPart() throws MessagingException, IOException { + LocalFolder folder = createFolderInDatabase(); + + MimeMessage message = new MimeMessage(); + message.addHeader("To", "to@example.com"); + message.addHeader("MIME-Version", "1.0"); + message.addHeader("Content-Type", "text/plain"); + message.setServerExtra("text"); + + saveMessageToDatabase(folder, message); + + LocalMessage localMessage = readMessageFromDatabase(folder, message); + + assertEquals("to@example.com", localMessage.getHeader("To")[0]); + assertEquals("text/plain", localMessage.getMimeType()); + assertEquals("text", localMessage.getServerExtra()); + assertNull(localMessage.getBody()); + + Body body = new BinaryMemoryBody("Test message body".getBytes(), MimeUtil.ENC_7BIT); + localMessage.setBody(body); + folder.addPartToMessage(localMessage, localMessage); + + LocalMessage completeLocalMessage = readMessageFromDatabase(folder, message); + String reconstructedMessage = writeMessageToString(completeLocalMessage); + + assertEquals("To: to@example.com\r\n" + + "MIME-Version: 1.0\r\n" + + "Content-Type: text/plain\r\n" + + "\r\n" + + "Test message body", + reconstructedMessage); + } + protected MimeMessage parseMessage() throws IOException, MessagingException { InputStream messageInputStream = new ByteArrayInputStream(MESSAGE_SOURCE.getBytes()); try { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java b/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java index 265a0015c..d15fdec2e 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java +++ b/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java @@ -672,6 +672,7 @@ public class LocalFolder extends Folder implements Serializable { long parentId = cursor.getLong(2); String mimeType = cursor.getString(3); byte[] header = cursor.getBlob(6); + int dataLocation = cursor.getInt(9); String serverExtra = cursor.getString(15); final Part part; @@ -711,7 +712,7 @@ public class LocalFolder extends Folder implements Serializable { part.setBody(multipart); multipart.setPreamble(preamble); multipart.setEpilogue(epilogue); - } else { + } else if (dataLocation != DataLocation.MISSING) { String encoding = cursor.getString(7); byte[] data = cursor.getBlob(10);