From 59f1e78af272bb54e9e87f68c665ceb57a068514 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 19 Jun 2023 09:34:10 +0200 Subject: [PATCH] Experimental delete attachment support --- .../eu/faircode/email/AdapterAttachment.java | 16 ++++- app/src/main/java/eu/faircode/email/Core.java | 60 ++++++++++++++++--- .../java/eu/faircode/email/MimeMessageEx.java | 5 ++ 3 files changed, 71 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterAttachment.java b/app/src/main/java/eu/faircode/email/AdapterAttachment.java index e3fd6ed859..909f804d28 100644 --- a/app/src/main/java/eu/faircode/email/AdapterAttachment.java +++ b/app/src/main/java/eu/faircode/email/AdapterAttachment.java @@ -137,7 +137,7 @@ public class AdapterAttachment extends RecyclerView.Adapter() { @Override protected Void onExecute(Context context, Bundle args) { long id = args.getLong("id"); + boolean readonly = args.getBoolean("readonly"); EntityAttachment attachment; @@ -359,14 +361,22 @@ public class AdapterAttachment extends RecyclerView.Adapter aparts = parts.getAttachmentParts(); - // Download attachment - parts.downloadAttachment(context, attachment, folder); + if (attachment.sequence > aparts.size()) + throw new IllegalArgumentException("Invalid attachment sequence=" + attachment.sequence + "/" + aparts.size()); + Part apart = aparts.get(attachment.sequence - 1).part; + if (!deletePart(icopy, apart)) + throw new IllegalArgumentException("Attachment part not found"); - if (attachment.size != null) - EntityLog.log(context, "Operation attachment size=" + attachment.size); + ifolder.appendMessages(new Message[]{icopy}); + + imessage.setFlag(Flags.Flag.DELETED, true); + expunge(context, ifolder, Arrays.asList(imessage)); + } else { + // Get message parts + MessageHelper helper = new MessageHelper((MimeMessage) imessage, context); + MessageHelper.MessageParts parts = helper.getMessageParts(); + + // Download attachment + parts.downloadAttachment(context, attachment, folder); + + if (attachment.size != null) + EntityLog.log(context, "Operation attachment size=" + attachment.size); + } + } + + static boolean deletePart(Part part, Part attachment) throws MessagingException, IOException { + boolean deleted = false; + if (part.isMimeType("multipart/*")) { + Multipart multipart = (Multipart) part.getContent(); + int count = multipart.getCount(); + for (int i = 0; i < count; i++) { + Part child = multipart.getBodyPart(i); + if (child == attachment) { + multipart.removeBodyPart(i); + deleted = true; + } else { + if (deletePart(child, attachment)) + deleted = true; + } + } + } + + if (part instanceof MimeMessage) + ((MimeMessage) part).saveChanges(); + else if (part instanceof Multipart) + part.setDataHandler(part.getDataHandler()); + + return deleted; } private static void onBody(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, POP3Folder ifolder, POP3Store istore) throws MessagingException, IOException { diff --git a/app/src/main/java/eu/faircode/email/MimeMessageEx.java b/app/src/main/java/eu/faircode/email/MimeMessageEx.java index b0a6dad875..eec74438f1 100644 --- a/app/src/main/java/eu/faircode/email/MimeMessageEx.java +++ b/app/src/main/java/eu/faircode/email/MimeMessageEx.java @@ -30,6 +30,11 @@ public class MimeMessageEx extends MimeMessage { private String msgid; private MimeMessage original; + MimeMessageEx(MimeMessage imessage, String msgid) throws MessagingException { + super(imessage); + this.msgid = msgid; + } + MimeMessageEx(Session session, String msgid) { super(session); this.msgid = msgid;