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

Commit e03df3d9 authored by Vincent Breitmoser's avatar Vincent Breitmoser Committed by cketti
Browse files

improve error handling when opening missing parts (don't crash at least)

parent d80a1d41
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;

@@ -681,6 +682,7 @@ public class LocalStore extends Store implements Serializable {
        });
    }

    @Nullable
    public InputStream getAttachmentInputStream(final String attachmentId) throws MessagingException {
        return database.execute(false, new DbCallback<InputStream>() {
            @Override
@@ -707,6 +709,7 @@ public class LocalStore extends Store implements Serializable {
        });
    }

    @Nullable
    private InputStream getRawAttachmentInputStream(Cursor cursor, int location, String attachmentId) {
        switch (location) {
            case DataLocation.IN_DATABASE: {
@@ -718,7 +721,7 @@ public class LocalStore extends Store implements Serializable {
                try {
                    return new FileInputStream(file);
                } catch (FileNotFoundException e) {
                    throw new WrappedException(e);
                    return null;
                }
            }
            default: {
@@ -727,7 +730,12 @@ public class LocalStore extends Store implements Serializable {
        }
    }

    InputStream getDecodingInputStream(final InputStream rawInputStream, String encoding) {
    @Nullable
    InputStream getDecodingInputStream(@Nullable final InputStream rawInputStream, @Nullable String encoding) {
        if (rawInputStream == null) {
            return null;
        }

        if (MimeUtil.ENC_BASE64.equals(encoding)) {
            return new Base64InputStream(rawInputStream) {
                @Override
+22 −10
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@ import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

import com.fsck.k9.Account;
@@ -58,7 +60,7 @@ public class AttachmentProvider extends ContentProvider {
    }

    @Override
    public String getType(Uri uri) {
    public String getType(@NonNull Uri uri) {
        List<String> segments = uri.getPathSegments();
        String accountUuid = segments.get(0);
        String id = segments.get(1);
@@ -68,16 +70,20 @@ public class AttachmentProvider extends ContentProvider {
    }

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
    public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode) throws FileNotFoundException {
        List<String> segments = uri.getPathSegments();
        String accountUuid = segments.get(0);
        String attachmentId = segments.get(1);

        return openAttachment(accountUuid, attachmentId);
        ParcelFileDescriptor parcelFileDescriptor = openAttachment(accountUuid, attachmentId);
        if (parcelFileDescriptor == null) {
            throw new FileNotFoundException("Attachment missing or cannot be opened!");
        }
        return parcelFileDescriptor;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

        String[] columnNames = (projection == null) ? DEFAULT_PROJECTION : projection;

@@ -120,18 +126,18 @@ public class AttachmentProvider extends ContentProvider {
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        throw new UnsupportedOperationException();
    }

    @Override
    public int delete(Uri uri, String arg1, String[] arg2) {
        return 0;
    public int delete(@NonNull Uri uri, String arg1, String[] arg2) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    public Uri insert(@NonNull Uri uri, ContentValues values) {
        throw new UnsupportedOperationException();
    }

    private String getType(String accountUuid, String id, String mimeType) {
@@ -155,9 +161,14 @@ public class AttachmentProvider extends ContentProvider {
        return type;
    }

    @Nullable
    private ParcelFileDescriptor openAttachment(String accountUuid, String attachmentId) {
        try {
            InputStream inputStream = getAttachmentInputStream(accountUuid, attachmentId);
            if (inputStream == null) {
                Log.e(K9.LOG_TAG, "Error getting InputStream for attachment (part doesn't exist?)");
                return null;
            }
            return ParcelFileDescriptorUtil.pipeFrom(inputStream);
        } catch (MessagingException e) {
            Log.e(K9.LOG_TAG, "Error getting InputStream for attachment", e);
@@ -168,6 +179,7 @@ public class AttachmentProvider extends ContentProvider {
        }
    }

    @Nullable
    private InputStream getAttachmentInputStream(String accountUuid, String attachmentId) throws MessagingException {
        final Account account = Preferences.getPreferences(getContext()).getAccount(accountUuid);
        LocalStore localStore = LocalStore.getInstance(account, getContext());