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

Commit 2b5064ea authored by Vincent Breitmoser's avatar Vincent Breitmoser
Browse files

always load headers immediately for LocalMessage

parent 3f0fb9fd
Loading
Loading
Loading
Loading
+3 −20
Original line number Diff line number Diff line
@@ -660,7 +660,6 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
                                LocalMessage localMessage = (LocalMessage) message;

                                loadMessageParts(db, localMessage);
                                localMessage.loadHeadersIfNecessary();
                            }
                        }
                    } catch (MessagingException e) {
@@ -793,25 +792,6 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
        throw new IllegalStateException("Not implemented");
    }

    void populateHeaders(final LocalMessage message) throws MessagingException {
        this.localStore.database.execute(false, new DbCallback<Void>() {
            @Override
            public Void doDbWork(final SQLiteDatabase db) throws WrappedException, MessagingException {
                Cursor cursor = db.query("message_parts", new String[] { "header" }, "id = ?",
                        new String[] { Long.toString(message.getMessagePartId()) }, null, null, null);
                try {
                    if (cursor.moveToFirst()) {
                        byte[] header = cursor.getBlob(0);
                        parseHeaderBytes(message, header);
                    }
                } finally {
                    Utility.closeQuietly(cursor);
                }
                return null;
            }
        });
    }

    public String getMessageUidById(final long id) throws MessagingException {
        try {
            return this.localStore.database.execute(false, new DbCallback<String>() {
@@ -858,6 +838,7 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
                                    "SELECT " +
                                    LocalStore.GET_MESSAGES_COLS +
                                    "FROM messages " +
                                    "LEFT JOIN message_parts ON (message_parts.id = messages.message_part_id) " +
                                    "LEFT JOIN threads ON (threads.message_id = messages.id) " +
                                    "WHERE uid = ? AND folder_id = ?",
                                    new String[] { message.getUid(), Long.toString(mFolderId) });
@@ -895,6 +876,7 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
                        return LocalFolder.this.localStore.getMessages(listener, LocalFolder.this,
                                "SELECT " + LocalStore.GET_MESSAGES_COLS +
                                "FROM messages " +
                                "LEFT JOIN message_parts ON (message_parts.id = messages.message_part_id) " +
                                "LEFT JOIN threads ON (threads.message_id = messages.id) " +
                                "WHERE empty = 0 AND " +
                                (includeDeleted ? "" : "deleted = 0 AND ") +
@@ -1662,6 +1644,7 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
        List<? extends Message> messages  = this.localStore.getMessages(null, this,
                "SELECT " + LocalStore.GET_MESSAGES_COLS +
                "FROM messages " +
                "LEFT JOIN message_parts ON (message_parts.id = messages.message_part_id) " +
                "LEFT JOIN threads ON (threads.message_id = messages.id) " +
                "WHERE empty = 0 AND (folder_id = ? and date < ?)",
                new String[] { Long.toString(mFolderId), Long.toString(cutoff) });
+5 −53
Original line number Diff line number Diff line
package com.fsck.k9.mailstore;


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
@@ -21,6 +22,7 @@ import com.fsck.k9.mail.Flag;
import com.fsck.k9.mail.Folder;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.internet.MimeMessage;
import com.fsck.k9.mail.message.MessageHeaderParser;
import com.fsck.k9.mailstore.LockableDatabase.DbCallback;
import com.fsck.k9.mailstore.LockableDatabase.WrappedException;
import com.fsck.k9.message.extractors.PreviewResult.PreviewType;
@@ -36,8 +38,6 @@ public class LocalMessage extends MimeMessage {

    private String mPreview = "";

    private boolean mHeadersLoaded = false;

    private long mThreadId;
    private long mRootId;
    private long messagePartId;
@@ -122,6 +122,9 @@ public class LocalMessage extends MimeMessage {

        messagePartId = cursor.getLong(22);
        mimeType = cursor.getString(23);

        byte[] header = cursor.getBlob(25);
        MessageHeaderParser.parse(this, new ByteArrayInputStream(header));
    }

    public long getMessagePartId() {
@@ -137,15 +140,6 @@ public class LocalMessage extends MimeMessage {
     * changes.
     */

    @Override
    public void writeTo(OutputStream out) throws IOException, MessagingException {
        if (!mHeadersLoaded) {
            loadHeaders();
        }

        super.writeTo(out);
    }

    public PreviewType getPreviewType() {
        return previewType;
    }
@@ -500,47 +494,6 @@ public class LocalMessage extends MimeMessage {
        db.delete("threads", "message_id = ?", idArg);
    }

    private void loadHeaders() throws MessagingException {
        mHeadersLoaded = true;
        getFolder().populateHeaders(this);
    }

    void loadHeadersIfNecessary() throws MessagingException {
        if (!mHeadersLoaded) {
            loadHeaders();
        }
    }

    @Override
    public void setHeader(String name, String value) throws MessagingException {
        if (!mHeadersLoaded)
            loadHeaders();
        super.setHeader(name, value);
    }

    @NonNull
    @Override
    public String[] getHeader(String name) throws MessagingException {
        if (!mHeadersLoaded) {
            loadHeaders();
        }
        return super.getHeader(name);
    }

    @Override
    public void removeHeader(String name) throws MessagingException {
        if (!mHeadersLoaded)
            loadHeaders();
        super.removeHeader(name);
    }

    @Override
    public Set<String> getHeaderNames() throws MessagingException {
        if (!mHeadersLoaded)
            loadHeaders();
        return super.getHeaderNames();
    }

    @Override
    public LocalMessage clone() {
        LocalMessage message = new LocalMessage(this.localStore);
@@ -550,7 +503,6 @@ public class LocalMessage extends MimeMessage {
        message.mAttachmentCount = mAttachmentCount;
        message.mSubject = mSubject;
        message.mPreview = mPreview;
        message.mHeadersLoaded = mHeadersLoaded;

        return message;
    }
+2 −1
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ public class LocalStore extends Store implements Serializable {
        "subject, sender_list, date, uid, flags, messages.id, to_list, cc_list, " +
        "bcc_list, reply_to_list, attachment_count, internal_date, messages.message_id, " +
        "folder_id, preview, threads.id, threads.root, deleted, read, flagged, answered, " +
        "forwarded, message_part_id, mime_type, preview_type ";
        "forwarded, message_part_id, messages.mime_type, preview_type, header ";

    static final String GET_FOLDER_COLS =
        "folders.id, name, visible_limit, last_updated, status, push_state, last_pushed, " +
@@ -574,6 +574,7 @@ public class LocalStore extends Store implements Serializable {

        String sqlQuery = "SELECT " + GET_MESSAGES_COLS + "FROM messages " +
                "LEFT JOIN threads ON (threads.message_id = messages.id) " +
                "LEFT JOIN message_parts ON (message_parts.id = messages.message_part_id) " +
                "LEFT JOIN folders ON (folders.id = messages.folder_id) WHERE " +
                "(empty = 0 AND deleted = 0)" +
                ((!TextUtils.isEmpty(where)) ? " AND (" + where + ")" : "") +