diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/FileBackedBody.java b/k9mail/src/main/java/com/fsck/k9/mailstore/FileBackedBody.java new file mode 100644 index 000000000..beb1c56c5 --- /dev/null +++ b/k9mail/src/main/java/com/fsck/k9/mailstore/FileBackedBody.java @@ -0,0 +1,60 @@ +package com.fsck.k9.mailstore; + + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.fsck.k9.mail.Body; +import com.fsck.k9.mail.MessagingException; +import com.fsck.k9.mail.internet.RawDataBody; +import com.fsck.k9.mail.internet.SizeAware; +import org.apache.commons.io.IOUtils; + + +public class FileBackedBody implements Body, SizeAware, RawDataBody { + private final File file; + private final String encoding; + + public FileBackedBody(File file, String encoding) { + this.file = file; + this.encoding = encoding; + } + + @Override + public InputStream getInputStream() throws MessagingException { + try { + return new FileInputStream(file); + } catch (FileNotFoundException e) { + throw new MessagingException("File not found", e); + } + } + + @Override + public void setEncoding(String encoding) throws MessagingException { + throw new RuntimeException("not supported"); + } + + @Override + public void writeTo(OutputStream out) throws IOException, MessagingException { + InputStream in = getInputStream(); + try { + IOUtils.copy(in, out); + } finally { + in.close(); + } + } + + @Override + public long getSize() { + return file.length(); + } + + @Override + public String getEncoding() { + return encoding; + } +} 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 9b7905b85..4c92abfb1 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java +++ b/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java @@ -725,12 +725,18 @@ public class LocalFolder extends Folder implements Serializable { part.setBody(multipart); multipart.setPreamble(preamble); multipart.setEpilogue(epilogue); - } else if (dataLocation != DataLocation.MISSING) { + } else if (dataLocation == DataLocation.IN_DATABASE) { String encoding = cursor.getString(7); byte[] data = cursor.getBlob(10); Body body = new BinaryMemoryBody(data, encoding); part.setBody(body); + } else if (dataLocation == DataLocation.ON_DISK) { + String encoding = cursor.getString(7); + + File file = localStore.getAttachmentFile(Long.toString(id)); + Body body = new FileBackedBody(file, encoding); + part.setBody(body); } }