Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0627ff5f authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #2500 from k9mail/GH-999_attachment_download_progress

Show progress for attachment downloads
parents 777ca0bd a5004584
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
package com.fsck.k9.mail;


import java.io.IOException;
import java.io.InputStream;


public interface BodyFactory {
    Body createBody(String contentTransferEncoding, String contentType, InputStream inputStream) throws IOException;
}
+43 −0
Original line number Diff line number Diff line
package com.fsck.k9.mail;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import com.fsck.k9.mail.internet.BinaryTempFileBody;
import com.fsck.k9.mail.internet.BinaryTempFileMessageBody;
import com.fsck.k9.mail.internet.MimeUtility;
import org.apache.commons.io.IOUtils;
import org.apache.james.mime4j.util.MimeUtil;


public class DefaultBodyFactory implements BodyFactory {
    public Body createBody(String contentTransferEncoding, String contentType, InputStream inputStream)
            throws IOException {

        if (contentTransferEncoding != null) {
            contentTransferEncoding = MimeUtility.getHeaderParameter(contentTransferEncoding, null);
        }

        final BinaryTempFileBody tempBody;
        if (MimeUtil.isMessage(contentType)) {
            tempBody = new BinaryTempFileMessageBody(contentTransferEncoding);
        } else {
            tempBody = new BinaryTempFileBody(contentTransferEncoding);
        }

        OutputStream outputStream = tempBody.getOutputStream();
        try {
            copyData(inputStream, outputStream);
        } finally {
            outputStream.close();
        }

        return tempBody;
    }

    protected void copyData(InputStream inputStream, OutputStream outputStream) throws IOException {
        IOUtils.copy(inputStream, outputStream);
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -127,8 +127,8 @@ public abstract class Folder<T extends Message> {
    public abstract void fetch(List<T> messages, FetchProfile fp,
                               MessageRetrievalListener<T> listener) throws MessagingException;

    public void fetchPart(Message message, Part part,
                          MessageRetrievalListener<Message> listener) throws MessagingException {
    public void fetchPart(Message message, Part part, MessageRetrievalListener<Message> listener,
            BodyFactory bodyFactory) throws MessagingException {
        // This is causing trouble. Disabled for now. See issue 1733
        //throw new RuntimeException("fetchPart() not implemented.");

+7 −3
Original line number Diff line number Diff line
@@ -19,7 +19,9 @@ import android.support.annotation.NonNull;

import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.Body;
import com.fsck.k9.mail.BodyFactory;
import com.fsck.k9.mail.BodyPart;
import com.fsck.k9.mail.DefaultBodyFactory;
import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.Multipart;
@@ -106,7 +108,7 @@ public class MimeMessage extends Message {
        // REALLY long References: headers
        parserConfig.setMaxHeaderCount(-1); // Disable the check for header count.
        MimeStreamParser parser = new MimeStreamParser(parserConfig);
        parser.setContentHandler(new MimeMessageBuilder());
        parser.setContentHandler(new MimeMessageBuilder(new DefaultBodyFactory()));
        if (recurse) {
            parser.setRecurse();
        }
@@ -520,8 +522,10 @@ public class MimeMessage extends Message {

    private class MimeMessageBuilder implements ContentHandler {
        private final LinkedList<Object> stack = new LinkedList<>();
        private final BodyFactory bodyFactory;

        public MimeMessageBuilder() {
        public MimeMessageBuilder(BodyFactory bodyFactory) {
            this.bodyFactory = bodyFactory;
        }

        private void expect(Class<?> c) {
@@ -576,7 +580,7 @@ public class MimeMessage extends Message {
        @Override
        public void body(BodyDescriptor bd, InputStream in) throws IOException, MimeException {
            expect(Part.class);
            Body body = MimeUtility.createBody(in, bd.getTransferEncoding(), bd.getMimeType());
            Body body = bodyFactory.createBody(bd.getTransferEncoding(), bd.getMimeType(), in);
            ((Part)stack.peek()).setBody(body);
        }

+1 −26
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@ package com.fsck.k9.mail.internet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;
import java.util.regex.Pattern;

@@ -16,7 +15,7 @@ import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.Multipart;
import com.fsck.k9.mail.Part;
import org.apache.commons.io.IOUtils;

import org.apache.james.mime4j.codec.Base64InputStream;
import org.apache.james.mime4j.codec.QuotedPrintableInputStream;
import org.apache.james.mime4j.util.MimeUtil;
@@ -985,30 +984,6 @@ public class MimeUtility {
        return isSameMimeType(mimeType, DEFAULT_ATTACHMENT_MIME_TYPE);
    }

    public static Body createBody(InputStream in, String contentTransferEncoding, String contentType)
            throws IOException {

        if (contentTransferEncoding != null) {
            contentTransferEncoding = MimeUtility.getHeaderParameter(contentTransferEncoding, null);
        }

        BinaryTempFileBody tempBody;
        if (MimeUtil.isMessage(contentType)) {
            tempBody = new BinaryTempFileMessageBody(contentTransferEncoding);
        } else {
            tempBody = new BinaryTempFileBody(contentTransferEncoding);
        }

        OutputStream out = tempBody.getOutputStream();
        try {
            IOUtils.copy(in, out);
        } finally {
            out.close();
        }

        return tempBody;
    }

    /**
     * Get decoded contents of a body.
     * <p/>
Loading