From: Richard Russon Date: Tue, 3 Jul 2018 16:25:09 +0000 (+0100) Subject: move Attach, AttachCtx to library X-Git-Tag: 2019-10-25~762^2~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=151c18d6e02073d0fb49cccca43e1d90d422a1b8;p=neomutt move Attach, AttachCtx to library --- diff --git a/Makefile.autosetup b/Makefile.autosetup index aa2ace917..dbbb43f7f 100644 --- a/Makefile.autosetup +++ b/Makefile.autosetup @@ -61,12 +61,12 @@ ALL_FILES!= (cd $(SRCDIR) && git ls-files 2>/dev/null) || true ############################################################################### # neomutt NEOMUTT= neomutt$(EXEEXT) -NEOMUTTOBJS= addrbook.o alias.o attach.o bcache.o browser.o buffy.o \ +NEOMUTTOBJS= addrbook.o alias.o bcache.o browser.o buffy.o \ color.o commands.o complete.o compose.o compress.o \ conststrings.o copy.o curs_lib.o curs_main.o edit.o editmsg.o \ enriched.o enter.o filter.o flags.o from.o group.o handler.o \ hdrline.o header.o help.o history.o hook.o init.o keymap.o \ - main.o mbox.o menu.o mh.o muttlib.o mutt_account.o mutt_body.o \ + main.o mbox.o menu.o mh.o muttlib.o mutt_account.o mutt_attach.o mutt_body.o \ mutt_logging.o mutt_signal.o mutt_socket.o mutt_window.o mx.o newsrc.o \ nntp.o pager.o parse.o pattern.o pop.o pop_auth.o pop_lib.o \ postpone.o progress.o query.o recvattach.o recvcmd.o resize.o rfc1524.o \ @@ -92,7 +92,7 @@ ALLOBJS+= $(NEOMUTTOBJS) ############################################################################### # libmutt LIBMUTT= libmutt.a -LIBMUTTOBJS= mutt/address.o mutt/base64.o mutt/body.o mutt/buffer.o mutt/charset.o \ +LIBMUTTOBJS= mutt/address.o mutt/attach.o mutt/base64.o mutt/body.o mutt/buffer.o mutt/charset.o \ mutt/date.o mutt/envelope.o mutt/envlist.o mutt/exit.o mutt/file.o mutt/hash.o \ mutt/idna.o mutt/list.o mutt/logging.o mutt/mapping.o \ mutt/mbyte.o mutt/md5.o mutt/memory.o mutt/mime.o \ diff --git a/browser.c b/browser.c index 93c3198bd..a929e5dfd 100644 --- a/browser.c +++ b/browser.c @@ -39,7 +39,6 @@ #include "conn/conn.h" #include "mutt.h" #include "browser.h" -#include "attach.h" #include "buffy.h" #include "context.h" #include "format_flags.h" @@ -47,6 +46,7 @@ #include "keymap.h" #include "mailbox.h" #include "mutt_account.h" +#include "mutt_attach.h" #include "mutt_curses.h" #include "mutt_menu.h" #include "mutt_window.h" diff --git a/compose.c b/compose.c index b56510809..42990b379 100644 --- a/compose.c +++ b/compose.c @@ -33,13 +33,13 @@ #include "conn/conn.h" #include "mutt.h" #include "alias.h" -#include "attach.h" #include "context.h" #include "format_flags.h" #include "globals.h" #include "header.h" #include "keymap.h" #include "mailbox.h" +#include "mutt_attach.h" #include "mutt_curses.h" #include "mutt_menu.h" #include "mutt_window.h" @@ -48,6 +48,7 @@ #include "opcodes.h" #include "options.h" #include "protos.h" +#include "recvattach.h" #include "sort.h" #ifdef MIXMASTER #include "remailer.h" @@ -1940,7 +1941,7 @@ int mutt_compose_menu(struct Header *msg, char *fcc, size_t fcclen, else msg->content = NULL; - mutt_free_attach_context(&actx); + mutt_actx_free(&actx); return r; } diff --git a/mutt/attach.c b/mutt/attach.c new file mode 100644 index 000000000..5f697e601 --- /dev/null +++ b/mutt/attach.c @@ -0,0 +1,142 @@ +/** + * @file + * Handling of email attachments + * + * @authors + * Copyright (C) 1996-2000,2002,2013 Michael R. Elkins + * Copyright (C) 1999-2004,2006 Thomas Roessler + * + * @copyright + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +/** + * @page attach Handling of email attachments + * + * Handling of email attachments + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include "attach.h" +#include "body.h" +#include "file.h" +#include "memory.h" + +/** + * mutt_actx_add_attach - Add an Attachment to an Attachment Context + * @param actx Attachment context + * @param attach Attachment to add + */ +void mutt_actx_add_attach(struct AttachCtx *actx, struct AttachPtr *attach) +{ + if (actx->idxlen == actx->idxmax) + { + actx->idxmax += 5; + mutt_mem_realloc(&actx->idx, sizeof(struct AttachPtr *) * actx->idxmax); + mutt_mem_realloc(&actx->v2r, sizeof(short) * actx->idxmax); + for (int i = actx->idxlen; i < actx->idxmax; i++) + actx->idx[i] = NULL; + } + + actx->idx[actx->idxlen++] = attach; +} + +/** + * mutt_actx_add_fp - Save a File handle to the Attachment Context + * @param actx Attachment context + * @param new_fp File handle to save + */ +void mutt_actx_add_fp(struct AttachCtx *actx, FILE *new_fp) +{ + if (actx->fp_len == actx->fp_max) + { + actx->fp_max += 5; + mutt_mem_realloc(&actx->fp_idx, sizeof(FILE *) * actx->fp_max); + for (int i = actx->fp_len; i < actx->fp_max; i++) + actx->fp_idx[i] = NULL; + } + + actx->fp_idx[actx->fp_len++] = new_fp; +} + +/** + * mutt_actx_add_body - Add an email box to an Attachment Context + * @param actx Attachment context + * @param new_body Email Body to add + */ +void mutt_actx_add_body(struct AttachCtx *actx, struct Body *new_body) +{ + if (actx->body_len == actx->body_max) + { + actx->body_max += 5; + mutt_mem_realloc(&actx->body_idx, sizeof(struct Body *) * actx->body_max); + for (int i = actx->body_len; i < actx->body_max; i++) + actx->body_idx[i] = NULL; + } + + actx->body_idx[actx->body_len++] = new_body; +} + +/** + * mutt_actx_free_entries - Free entries in an Attachment Context + * @param actx Attachment context + */ +void mutt_actx_free_entries(struct AttachCtx *actx) +{ + int i; + + for (i = 0; i < actx->idxlen; i++) + { + if (actx->idx[i]->content) + actx->idx[i]->content->aptr = NULL; + FREE(&actx->idx[i]->tree); + FREE(&actx->idx[i]); + } + actx->idxlen = 0; + actx->vcount = 0; + + for (i = 0; i < actx->fp_len; i++) + mutt_file_fclose(&actx->fp_idx[i]); + actx->fp_len = 0; + + for (i = 0; i < actx->body_len; i++) + mutt_body_free(&actx->body_idx[i]); + actx->body_len = 0; +} + +/** + * mutt_actx_free - Free an Attachment Context + * @param pactx Attachment context + */ +void mutt_actx_free(struct AttachCtx **pactx) +{ + struct AttachCtx *actx = NULL; + + if (!pactx || !*pactx) + return; + + actx = *pactx; + mutt_actx_free_entries(actx); + FREE(&actx->idx); + FREE(&actx->v2r); + FREE(&actx->fp_idx); + FREE(&actx->body_idx); + FREE(pactx); +} diff --git a/attach.h b/mutt/attach.h similarity index 60% rename from attach.h rename to mutt/attach.h index 5f5063f59..42c5e0446 100644 --- a/attach.h +++ b/mutt/attach.h @@ -20,15 +20,12 @@ * this program. If not, see . */ -/* common protos for compose / attach menus */ - #ifndef _MUTT_ATTACH_H #define _MUTT_ATTACH_H #include #include -struct Menu; struct Header; struct Body; @@ -71,33 +68,10 @@ struct AttachCtx short body_max; }; -void mutt_attach_init(struct AttachCtx *actx); -void mutt_update_tree(struct AttachCtx *actx); -int mutt_view_attachment(FILE *fp, struct Body *a, int flag, struct Header *hdr, - struct AttachCtx *actx); - -int mutt_tag_attach(struct Menu *menu, int n, int m); -int mutt_attach_display_loop(struct Menu *menu, int op, struct Header *hdr, - struct AttachCtx *actx, bool recv); - -void mutt_save_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, - struct Body *top, struct Header *hdr, struct Menu *menu); -void mutt_pipe_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, - struct Body *top, bool filter); -void mutt_print_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, - struct Body *top); - -void mutt_attach_bounce(FILE *fp, struct AttachCtx *actx, struct Body *cur); -void mutt_attach_resend(FILE *fp, struct AttachCtx *actx, struct Body *cur); -void mutt_attach_forward(FILE *fp, struct Header *hdr, struct AttachCtx *actx, - struct Body *cur, int flags); -void mutt_attach_reply(FILE *fp, struct Header *hdr, struct AttachCtx *actx, - struct Body *cur, int flags); - void mutt_actx_add_attach(struct AttachCtx *actx, struct AttachPtr *attach); -void mutt_actx_add_fp(struct AttachCtx *actx, FILE *new_fp); void mutt_actx_add_body(struct AttachCtx *actx, struct Body *new_body); +void mutt_actx_add_fp(struct AttachCtx *actx, FILE *new_fp); +void mutt_actx_free(struct AttachCtx **pactx); void mutt_actx_free_entries(struct AttachCtx *actx); -void mutt_free_attach_context(struct AttachCtx **pactx); #endif /* _MUTT_ATTACH_H */ diff --git a/mutt/mutt.h b/mutt/mutt.h index 841abb4ac..75dbe02c9 100644 --- a/mutt/mutt.h +++ b/mutt/mutt.h @@ -28,6 +28,7 @@ * | File | Description | * | :--------------- | :----------------- | * | mutt/address.c | @subpage address | + * | mutt/attach.c | @subpage attach | * | mutt/base64.c | @subpage base64 | * | mutt/body.c | @subpage base64 | * | mutt/buffer.c | @subpage buffer | @@ -61,6 +62,7 @@ #define _MUTT_MUTT_H #include "address.h" +#include "attach.h" #include "base64.h" #include "body.h" #include "buffer.h" diff --git a/attach.c b/mutt_attach.c similarity index 93% rename from attach.c rename to mutt_attach.c index 1a88a8c17..349d238b9 100644 --- a/attach.c +++ b/mutt_attach.c @@ -28,9 +28,6 @@ #include #include #include -#include "mutt/mutt.h" -#include "mutt.h" -#include "attach.h" #include "context.h" #include "copy.h" #include "filter.h" @@ -41,7 +38,6 @@ #include "mutt_curses.h" #include "mx.h" #include "ncrypt/ncrypt.h" -#include "options.h" #include "pager.h" #include "protos.h" #include "rfc1524.h" @@ -1121,82 +1117,3 @@ int mutt_print_attachment(FILE *fp, struct Body *a) return 0; } } - -void mutt_actx_add_attach(struct AttachCtx *actx, struct AttachPtr *attach) -{ - if (actx->idxlen == actx->idxmax) - { - actx->idxmax += 5; - mutt_mem_realloc(&actx->idx, sizeof(struct AttachPtr *) * actx->idxmax); - mutt_mem_realloc(&actx->v2r, sizeof(short) * actx->idxmax); - for (int i = actx->idxlen; i < actx->idxmax; i++) - actx->idx[i] = NULL; - } - - actx->idx[actx->idxlen++] = attach; -} - -void mutt_actx_add_fp(struct AttachCtx *actx, FILE *new_fp) -{ - if (actx->fp_len == actx->fp_max) - { - actx->fp_max += 5; - mutt_mem_realloc(&actx->fp_idx, sizeof(FILE *) * actx->fp_max); - for (int i = actx->fp_len; i < actx->fp_max; i++) - actx->fp_idx[i] = NULL; - } - - actx->fp_idx[actx->fp_len++] = new_fp; -} - -void mutt_actx_add_body(struct AttachCtx *actx, struct Body *new_body) -{ - if (actx->body_len == actx->body_max) - { - actx->body_max += 5; - mutt_mem_realloc(&actx->body_idx, sizeof(struct Body *) * actx->body_max); - for (int i = actx->body_len; i < actx->body_max; i++) - actx->body_idx[i] = NULL; - } - - actx->body_idx[actx->body_len++] = new_body; -} - -void mutt_actx_free_entries(struct AttachCtx *actx) -{ - int i; - - for (i = 0; i < actx->idxlen; i++) - { - if (actx->idx[i]->content) - actx->idx[i]->content->aptr = NULL; - FREE(&actx->idx[i]->tree); - FREE(&actx->idx[i]); - } - actx->idxlen = 0; - actx->vcount = 0; - - for (i = 0; i < actx->fp_len; i++) - mutt_file_fclose(&actx->fp_idx[i]); - actx->fp_len = 0; - - for (i = 0; i < actx->body_len; i++) - mutt_body_free(&actx->body_idx[i]); - actx->body_len = 0; -} - -void mutt_free_attach_context(struct AttachCtx **pactx) -{ - struct AttachCtx *actx = NULL; - - if (!pactx || !*pactx) - return; - - actx = *pactx; - mutt_actx_free_entries(actx); - FREE(&actx->idx); - FREE(&actx->v2r); - FREE(&actx->fp_idx); - FREE(&actx->body_idx); - FREE(pactx); -} diff --git a/mutt_attach.h b/mutt_attach.h new file mode 100644 index 000000000..6910582c5 --- /dev/null +++ b/mutt_attach.h @@ -0,0 +1,50 @@ +/** + * @file + * Handling of email attachments + * + * @authors + * Copyright (C) 1996-2000 Michael R. Elkins + * + * @copyright + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +/* common protos for compose / attach menus */ + +#ifndef _MUTT_ATTACH2_H +#define _MUTT_ATTACH2_H + +#include "config.h" +#include +#include +#include "mutt/mutt.h" + +struct Menu; +struct Header; +struct Body; + +int mutt_tag_attach(struct Menu *menu, int n, int m); +int mutt_attach_display_loop(struct Menu *menu, int op, struct Header *hdr, + struct AttachCtx *actx, bool recv); + +void mutt_save_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, + struct Body *top, struct Header *hdr, struct Menu *menu); +void mutt_pipe_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, + struct Body *top, bool filter); +void mutt_print_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, + struct Body *top); + +int mutt_view_attachment(FILE *fp, struct Body *a, int flag, struct Header *hdr, struct AttachCtx *actx); + +#endif /* _MUTT_ATTACH2_H */ diff --git a/pager.c b/pager.c index ea7a640f8..c6eda5ed2 100644 --- a/pager.c +++ b/pager.c @@ -36,13 +36,13 @@ #include "mutt.h" #include "pager.h" #include "alias.h" -#include "attach.h" #include "context.h" #include "format_flags.h" #include "globals.h" #include "header.h" #include "keymap.h" #include "mailbox.h" +#include "mutt_attach.h" #include "mutt_curses.h" #include "mutt_menu.h" #include "mutt_window.h" @@ -51,6 +51,7 @@ #include "opcodes.h" #include "options.h" #include "protos.h" +#include "recvcmd.h" #include "sort.h" #include "terminal.h" #ifdef USE_SIDEBAR diff --git a/po/POTFILES.in b/po/POTFILES.in index aadfcbd49..6f5afc083 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,6 +1,5 @@ addrbook.c alias.c -attach.c bcache.c browser.c buffy.c @@ -62,6 +61,7 @@ mbox.c menu.c mh.c mutt/address.c +mutt/attach.c mutt/base64.c mutt/body.c mutt/buffer.c @@ -87,6 +87,7 @@ mutt/sha1.c mutt/signal.c mutt/string.c mutt_account.c +mutt_attach.c mutt_body.c mutt_logging.c mutt_lua.c diff --git a/recvattach.c b/recvattach.c index e095ac148..6fa766047 100644 --- a/recvattach.c +++ b/recvattach.c @@ -30,7 +30,6 @@ #include #include "mutt/mutt.h" #include "mutt.h" -#include "attach.h" #include "context.h" #include "filter.h" #include "format_flags.h" @@ -39,6 +38,7 @@ #include "header.h" #include "keymap.h" #include "mailbox.h" +#include "mutt_attach.h" #include "mutt_curses.h" #include "mutt_menu.h" #include "mutt_window.h" @@ -47,6 +47,7 @@ #include "opcodes.h" #include "options.h" #include "protos.h" +#include "recvcmd.h" #include "rfc1524.h" #include "state.h" @@ -1580,7 +1581,7 @@ void mutt_view_attachments(struct Header *hdr) if (hdr->attach_del) hdr->changed = true; - mutt_free_attach_context(&actx); + mutt_actx_free(&actx); mutt_menu_pop_current(menu); mutt_menu_destroy(&menu); diff --git a/recvattach.h b/recvattach.h new file mode 100644 index 000000000..62a84c036 --- /dev/null +++ b/recvattach.h @@ -0,0 +1,30 @@ +/** + * @file + * Routines for managing attachments + * + * @authors + * Copyright (C) 1996-2000,2002,2007,2010 Michael R. Elkins + * Copyright (C) 1999-2006 Thomas Roessler + * + * @copyright + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#ifndef _MUTT_RECVATTACH_H +#define _MUTT_RECVATTACH_H + +void mutt_attach_init(struct AttachCtx *actx); +void mutt_update_tree(struct AttachCtx *actx); + +#endif /* _MUTT_RECVATTACH_H */ diff --git a/recvcmd.c b/recvcmd.c index 400c2daf6..94f70c16b 100644 --- a/recvcmd.c +++ b/recvcmd.c @@ -28,7 +28,6 @@ #include "mutt/mutt.h" #include "mutt.h" #include "alias.h" -#include "attach.h" #include "copy.h" #include "globals.h" #include "handler.h" diff --git a/recvcmd.h b/recvcmd.h new file mode 100644 index 000000000..55e459ee4 --- /dev/null +++ b/recvcmd.h @@ -0,0 +1,31 @@ +/** + * @file + * Send/reply with an attachment + * + * @authors + * Copyright (C) 1999-2004 Thomas Roessler + * + * @copyright + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#ifndef _MUTT_RECVCMD_H +#define _MUTT_RECVCMD_H + +void mutt_attach_bounce(FILE *fp, struct AttachCtx *actx, struct Body *cur); +void mutt_attach_resend(FILE *fp, struct AttachCtx *actx, struct Body *cur); +void mutt_attach_forward(FILE *fp, struct Header *hdr, struct AttachCtx *actx, struct Body *cur, int flags); +void mutt_attach_reply(FILE *fp, struct Header *hdr, struct AttachCtx *actx, struct Body *cur, int flags); + +#endif /* _MUTT_RECVCMD_H */