Add support for loading parts with DataLocation.ON_DISK

This commit is contained in:
cketti 2015-01-28 15:29:49 +01:00
parent d92be22ce3
commit bb83fdc0e8
2 changed files with 67 additions and 1 deletions

View File

@ -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;
}
}

View File

@ -725,12 +725,18 @@ public class LocalFolder extends Folder<LocalMessage> 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);
}
}