Search in sources :

Example 1 with LocalBodyPart

use of com.fsck.k9.mailstore.LocalBodyPart in project k-9 by k9mail.

the class LocalStoreTest method findPartById__withTwoTimesNestedLocalMessagePart.

@Test
public void findPartById__withTwoTimesNestedLocalMessagePart() throws Exception {
    LocalBodyPart searchRoot = new LocalBodyPart(null, null, 1L, -1L);
    LocalMimeMessage needlePart = new LocalMimeMessage(null, null, 123L);
    MimeMultipart mimeMultipartInner = new MimeMultipart("boundary");
    mimeMultipartInner.addBodyPart(new MimeBodyPart(needlePart));
    MimeMultipart mimeMultipart = new MimeMultipart("boundary");
    mimeMultipart.addBodyPart(new MimeBodyPart(mimeMultipartInner));
    searchRoot.setBody(mimeMultipart);
    Part part = LocalStore.findPartById(searchRoot, 123L);
    assertSame(needlePart, part);
}
Also used : MimeMultipart(com.fsck.k9.mail.internet.MimeMultipart) Part(com.fsck.k9.mail.Part) MimeBodyPart(com.fsck.k9.mail.internet.MimeBodyPart) MimeBodyPart(com.fsck.k9.mail.internet.MimeBodyPart) Test(org.junit.Test)

Example 2 with LocalBodyPart

use of com.fsck.k9.mailstore.LocalBodyPart in project k-9 by k9mail.

the class LocalStoreTest method findPartById__withNestedLocalMessagePart.

@Test
public void findPartById__withNestedLocalMessagePart() throws Exception {
    LocalBodyPart searchRoot = new LocalBodyPart(null, null, 1L, -1L);
    LocalMimeMessage needlePart = new LocalMimeMessage(null, null, 123L);
    MimeMultipart mimeMultipart = new MimeMultipart("boundary");
    mimeMultipart.addBodyPart(new MimeBodyPart(needlePart));
    searchRoot.setBody(mimeMultipart);
    Part part = LocalStore.findPartById(searchRoot, 123L);
    assertSame(needlePart, part);
}
Also used : MimeMultipart(com.fsck.k9.mail.internet.MimeMultipart) Part(com.fsck.k9.mail.Part) MimeBodyPart(com.fsck.k9.mail.internet.MimeBodyPart) MimeBodyPart(com.fsck.k9.mail.internet.MimeBodyPart) Test(org.junit.Test)

Example 3 with LocalBodyPart

use of com.fsck.k9.mailstore.LocalBodyPart in project k-9 by k9mail.

the class LocalStoreTest method findPartById__withRootLocalBodyPart.

@Test
public void findPartById__withRootLocalBodyPart() throws Exception {
    LocalBodyPart searchRoot = new LocalBodyPart(null, null, 123L, -1L);
    Part part = LocalStore.findPartById(searchRoot, 123L);
    assertSame(searchRoot, part);
}
Also used : Part(com.fsck.k9.mail.Part) MimeBodyPart(com.fsck.k9.mail.internet.MimeBodyPart) Test(org.junit.Test)

Example 4 with LocalBodyPart

use of com.fsck.k9.mailstore.LocalBodyPart in project k-9 by k9mail.

the class LocalFolder method loadMessagePart.

private void loadMessagePart(LocalMessage message, Map<Long, Part> partById, Cursor cursor) throws MessagingException {
    long id = cursor.getLong(0);
    long parentId = cursor.getLong(2);
    String mimeType = cursor.getString(3);
    long size = cursor.getLong(4);
    byte[] header = cursor.getBlob(6);
    int dataLocation = cursor.getInt(9);
    String serverExtra = cursor.getString(15);
    // TODO we don't currently cache much of the part data which is computed with AttachmentInfoExtractor,
    // TODO might want to do that at a later point?
    // String displayName = cursor.getString(5);
    // int type = cursor.getInt(1);
    // boolean inlineAttachment = (type == MessagePartType.HIDDEN_ATTACHMENT);
    final Part part;
    if (id == message.getMessagePartId()) {
        part = message;
    } else {
        Part parentPart = partById.get(parentId);
        if (parentPart == null) {
            throw new IllegalStateException("Parent part not found");
        }
        String parentMimeType = parentPart.getMimeType();
        if (MimeUtility.isMultipart(parentMimeType)) {
            BodyPart bodyPart = new LocalBodyPart(getAccountUuid(), message, id, size);
            ((Multipart) parentPart.getBody()).addBodyPart(bodyPart);
            part = bodyPart;
        } else if (MimeUtility.isMessage(parentMimeType)) {
            Message innerMessage = new LocalMimeMessage(getAccountUuid(), message, id);
            parentPart.setBody(innerMessage);
            part = innerMessage;
        } else {
            throw new IllegalStateException("Parent is neither a multipart nor a message");
        }
        parseHeaderBytes(part, header);
    }
    partById.put(id, part);
    part.setServerExtra(serverExtra);
    if (MimeUtility.isMultipart(mimeType)) {
        byte[] preamble = cursor.getBlob(11);
        byte[] epilogue = cursor.getBlob(12);
        String boundary = cursor.getString(13);
        MimeMultipart multipart = new MimeMultipart(mimeType, boundary);
        part.setBody(multipart);
        multipart.setPreamble(preamble);
        multipart.setEpilogue(epilogue);
    } 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));
        if (file.exists()) {
            Body body = new FileBackedBody(file, encoding);
            part.setBody(body);
        }
    }
}
Also used : BodyPart(com.fsck.k9.mail.BodyPart) Multipart(com.fsck.k9.mail.Multipart) MimeMultipart(com.fsck.k9.mail.internet.MimeMultipart) MimeMessage(com.fsck.k9.mail.internet.MimeMessage) Message(com.fsck.k9.mail.Message) MimeMultipart(com.fsck.k9.mail.internet.MimeMultipart) BodyPart(com.fsck.k9.mail.BodyPart) Part(com.fsck.k9.mail.Part) Body(com.fsck.k9.mail.Body) BinaryTempFileBody(com.fsck.k9.mail.internet.BinaryTempFileBody) File(java.io.File)

Example 5 with LocalBodyPart

use of com.fsck.k9.mailstore.LocalBodyPart in project k-9 by k9mail.

the class LocalStore method findPartById.

static Part findPartById(Part searchRoot, long partId) {
    if (searchRoot instanceof LocalMessage) {
        LocalMessage localMessage = (LocalMessage) searchRoot;
        if (localMessage.getMessagePartId() == partId) {
            return localMessage;
        }
    }
    Stack<Part> partStack = new Stack<>();
    partStack.add(searchRoot);
    while (!partStack.empty()) {
        Part part = partStack.pop();
        if (part instanceof LocalPart) {
            LocalPart localBodyPart = (LocalPart) part;
            if (localBodyPart.getId() == partId) {
                return part;
            }
        }
        Body body = part.getBody();
        if (body instanceof Multipart) {
            Multipart innerMultipart = (Multipart) body;
            for (BodyPart innerPart : innerMultipart.getBodyParts()) {
                partStack.add(innerPart);
            }
        }
        if (body instanceof Part) {
            partStack.add((Part) body);
        }
    }
    return null;
}
Also used : BodyPart(com.fsck.k9.mail.BodyPart) Multipart(com.fsck.k9.mail.Multipart) BodyPart(com.fsck.k9.mail.BodyPart) Part(com.fsck.k9.mail.Part) Body(com.fsck.k9.mail.Body) Stack(java.util.Stack)

Aggregations

Part (com.fsck.k9.mail.Part)6 Test (org.junit.Test)6 MimeBodyPart (com.fsck.k9.mail.internet.MimeBodyPart)4 MimeMultipart (com.fsck.k9.mail.internet.MimeMultipart)4 Multipart (com.fsck.k9.mail.Multipart)3 Body (com.fsck.k9.mail.Body)2 BodyPart (com.fsck.k9.mail.BodyPart)2 SQLiteDatabase (android.database.sqlite.SQLiteDatabase)1 FetchProfile (com.fsck.k9.mail.FetchProfile)1 Message (com.fsck.k9.mail.Message)1 BinaryTempFileBody (com.fsck.k9.mail.internet.BinaryTempFileBody)1 MimeMessage (com.fsck.k9.mail.internet.MimeMessage)1 AttachmentViewInfo (com.fsck.k9.mailstore.AttachmentViewInfo)1 LocalBodyPart (com.fsck.k9.mailstore.LocalBodyPart)1 File (java.io.File)1 Stack (java.util.Stack)1