NeoMutt  2024-04-25-91-gb0e085
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
Compose Function API

Prototype for a Compose Function. More...

+ Collaboration diagram for Compose Function API:

Functions

static int op_attachment_attach_file (struct ComposeSharedData *shared, int op)
 Attach files to this message - Implements compose_function_t -.
 
static int op_attachment_attach_key (struct ComposeSharedData *shared, int op)
 Attach a PGP public key - Implements compose_function_t -.
 
static int op_attachment_attach_message (struct ComposeSharedData *shared, int op)
 Attach messages to this message - Implements compose_function_t -.
 
static int op_attachment_detach (struct ComposeSharedData *shared, int op)
 Delete the current entry - Implements compose_function_t -.
 
static int op_attachment_edit_content_id (struct ComposeSharedData *shared, int op)
 Edit the 'Content-ID' of the attachment - Implements compose_function_t -.
 
static int op_attachment_edit_description (struct ComposeSharedData *shared, int op)
 Edit attachment description - Implements compose_function_t -.
 
static int op_attachment_edit_encoding (struct ComposeSharedData *shared, int op)
 Edit attachment transfer-encoding - Implements compose_function_t -.
 
static int op_attachment_edit_language (struct ComposeSharedData *shared, int op)
 Edit the 'Content-Language' of the attachment - Implements compose_function_t -.
 
static int op_attachment_edit_mime (struct ComposeSharedData *shared, int op)
 Edit attachment using mailcap entry - Implements compose_function_t -.
 
static int op_attachment_edit_type (struct ComposeSharedData *shared, int op)
 Edit attachment content type - Implements compose_function_t -.
 
static int op_attachment_filter (struct ComposeSharedData *shared, int op)
 Filter attachment through a shell command - Implements compose_function_t -.
 
static int op_attachment_get_attachment (struct ComposeSharedData *shared, int op)
 Get a temporary copy of an attachment - Implements compose_function_t -.
 
static int op_attachment_group_alts (struct ComposeSharedData *shared, int op)
 Group tagged attachments as 'multipart/alternative' - Implements compose_function_t -.
 
static int op_attachment_group_lingual (struct ComposeSharedData *shared, int op)
 Group tagged attachments as 'multipart/multilingual' - Implements compose_function_t -.
 
static int op_attachment_group_related (struct ComposeSharedData *shared, int op)
 Group tagged attachments as 'multipart/related' - Implements compose_function_t -.
 
static int op_attachment_move_down (struct ComposeSharedData *shared, int op)
 Move an attachment down in the attachment list - Implements compose_function_t -.
 
static int op_attachment_move_up (struct ComposeSharedData *shared, int op)
 Move an attachment up in the attachment list - Implements compose_function_t -.
 
static int op_attachment_new_mime (struct ComposeSharedData *shared, int op)
 Compose new attachment using mailcap entry - Implements compose_function_t -.
 
static int op_attachment_print (struct ComposeSharedData *shared, int op)
 Print the current entry - Implements compose_function_t -.
 
static int op_attachment_rename_attachment (struct ComposeSharedData *shared, int op)
 Send attachment with a different name - Implements compose_function_t -.
 
static int op_attachment_save (struct ComposeSharedData *shared, int op)
 Save message/attachment to a mailbox/file - Implements compose_function_t -.
 
static int op_attachment_toggle_disposition (struct ComposeSharedData *shared, int op)
 Toggle disposition between inline/attachment - Implements compose_function_t -.
 
static int op_attachment_toggle_recode (struct ComposeSharedData *shared, int op)
 Toggle recoding of this attachment - Implements compose_function_t -.
 
static int op_attachment_toggle_unlink (struct ComposeSharedData *shared, int op)
 Toggle whether to delete file after sending it - Implements compose_function_t -.
 
static int op_attachment_ungroup (struct ComposeSharedData *shared, int op)
 Ungroup a 'multipart' attachment - Implements compose_function_t -.
 
static int op_attachment_update_encoding (struct ComposeSharedData *shared, int op)
 Update an attachment's encoding info - Implements compose_function_t -.
 
static int op_envelope_edit_headers (struct ComposeSharedData *shared, int op)
 Edit the message with headers - Implements compose_function_t -.
 
static int op_compose_edit_file (struct ComposeSharedData *shared, int op)
 Edit the file to be attached - Implements compose_function_t -.
 
static int op_compose_edit_message (struct ComposeSharedData *shared, int op)
 Edit the message - Implements compose_function_t -.
 
static int op_compose_ispell (struct ComposeSharedData *shared, int op)
 Run ispell on the message - Implements compose_function_t -.
 
static int op_compose_postpone_message (struct ComposeSharedData *shared, int op)
 Save this message to send later - Implements compose_function_t -.
 
static int op_compose_rename_file (struct ComposeSharedData *shared, int op)
 Rename/move an attached file - Implements compose_function_t -.
 
static int op_compose_send_message (struct ComposeSharedData *shared, int op)
 Send the message - Implements compose_function_t -.
 
static int op_compose_write_message (struct ComposeSharedData *shared, int op)
 Write the message to a folder - Implements compose_function_t -.
 
static int op_display_headers (struct ComposeSharedData *shared, int op)
 Display message and toggle header weeding - Implements compose_function_t -.
 
static int op_exit (struct ComposeSharedData *shared, int op)
 Exit this menu - Implements compose_function_t -.
 
static int op_forget_passphrase (struct ComposeSharedData *shared, int op)
 Wipe passphrases from memory - Implements compose_function_t -.
 

Detailed Description

Prototype for a Compose Function.

Parameters
sharedShared Compose data
opOperation to perform, e.g. OP_COMPOSE_WRITE_MESSAGE
Return values
enumFunctionRetval

Function Documentation

◆ op_attachment_attach_file()

static int op_attachment_attach_file ( struct ComposeSharedData shared,
int  op 
)
static

Attach files to this message - Implements compose_function_t -.

Definition at line 731 of file functions.c.

732{
733 char *prompt = _("Attach file");
734 int numfiles = 0;
735 char **files = NULL;
736
737 struct Buffer *fname = buf_pool_get();
738 if ((mw_enter_fname(prompt, fname, false, NULL, true, &files, &numfiles,
739 MUTT_SEL_MULTI) == -1) ||
740 buf_is_empty(fname))
741 {
742 for (int i = 0; i < numfiles; i++)
743 FREE(&files[i]);
744
745 FREE(&files);
746 buf_pool_release(&fname);
747 return FR_NO_ACTION;
748 }
749
750 bool error = false;
751 bool added_attachment = false;
752 if (numfiles > 1)
753 {
754 mutt_message(ngettext("Attaching selected file...",
755 "Attaching selected files...", numfiles));
756 }
757 for (int i = 0; i < numfiles; i++)
758 {
759 char *att = files[i];
760 if (!att)
761 continue;
762
763 struct AttachPtr *ap = mutt_aptr_new();
764 ap->unowned = true;
765 ap->body = mutt_make_file_attach(att, shared->sub);
766 if (ap->body)
767 {
768 added_attachment = true;
769 update_idx(shared->adata->menu, shared->adata->actx, ap);
770 }
771 else
772 {
773 error = true;
774 mutt_error(_("Unable to attach %s"), att);
775 mutt_aptr_free(&ap);
776 }
777 FREE(&files[i]);
778 }
779
780 FREE(&files);
781 buf_pool_release(&fname);
782
783 if (!error)
785
788 if (added_attachment)
790 return FR_SUCCESS;
791}
struct AttachPtr * mutt_aptr_new(void)
Create a new Attachment Pointer.
Definition: attach.c:40
void mutt_aptr_free(struct AttachPtr **ptr)
Free an Attachment Pointer.
Definition: attach.c:49
#define MUTT_SEL_MULTI
Multi-selection is enabled.
Definition: lib.h:59
bool buf_is_empty(const struct Buffer *buf)
Is the Buffer empty?
Definition: buffer.c:291
static void update_idx(struct Menu *menu, struct AttachCtx *actx, struct AttachPtr *ap)
Add a new attachment to the message.
Definition: functions.c:422
@ FR_SUCCESS
Valid function - successfully performed.
Definition: dispatcher.h:39
@ FR_NO_ACTION
Valid function - no action performed.
Definition: dispatcher.h:37
@ NT_EMAIL_CHANGE_ATTACH
Email's Attachments have changed.
Definition: email.h:188
int mw_enter_fname(const char *prompt, struct Buffer *fname, bool mailbox, struct Mailbox *m, bool multiple, char ***files, int *numfiles, SelectFileFlags flags)
Ask the user to select a file -.
Definition: curs_lib.c:236
#define mutt_error(...)
Definition: logging2.h:92
#define mutt_message(...)
Definition: logging2.h:91
void mutt_message_hook(struct Mailbox *m, struct Email *e, HookFlags type)
Perform a message hook.
Definition: hook.c:692
#define MUTT_SEND2_HOOK
send2-hook: when changing fields in the compose menu
Definition: hook.h:48
#define FREE(x)
Definition: memory.h:45
#define MENU_REDRAW_INDEX
Redraw the index.
Definition: lib.h:56
void menu_queue_redraw(struct Menu *menu, MenuRedrawFlags redraw)
Queue a request for a redraw.
Definition: menu.c:184
#define _(a)
Definition: message.h:28
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition: notify.c:173
void mutt_clear_error(void)
Clear the message line (bottom line of screen)
Definition: mutt_logging.c:74
@ NT_EMAIL
Email has changed, NotifyEmail, EventEmail.
Definition: notify_type.h:44
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
Definition: pool.c:81
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
Definition: pool.c:94
struct Body * mutt_make_file_attach(const char *path, struct ConfigSubset *sub)
Create a file attachment.
Definition: sendlib.c:607
An email to which things will be attached.
Definition: attach.h:37
struct Body * body
Attachment.
Definition: attach.h:38
bool unowned
Don't unlink on detach.
Definition: attach.h:44
String manipulation buffer.
Definition: buffer.h:36
struct Menu * menu
Menu displaying the attachments.
Definition: attach_data.h:35
struct AttachCtx * actx
Set of attachments.
Definition: attach_data.h:34
struct ConfigSubset * sub
Config set to use.
Definition: shared_data.h:36
struct ComposeAttachData * adata
Attachments.
Definition: shared_data.h:39
struct Email * email
Email being composed.
Definition: shared_data.h:38
struct Notify * notify
Notifications: NotifyEmail, EventEmail.
Definition: email.h:73
+ Here is the call graph for this function:

◆ op_attachment_attach_key()

static int op_attachment_attach_key ( struct ComposeSharedData shared,
int  op 
)
static

Attach a PGP public key - Implements compose_function_t -.

Definition at line 796 of file functions.c.

797{
799 return FR_NOT_IMPL;
800 struct AttachPtr *ap = mutt_aptr_new();
802 if (ap->body)
803 {
804 update_idx(shared->adata->menu, shared->adata->actx, ap);
807 }
808 else
809 {
810 mutt_aptr_free(&ap);
811 }
812
814 return FR_SUCCESS;
815}
struct Body * crypt_pgp_make_key_attachment(void)
Wrapper for CryptModuleSpecs::pgp_make_key_attachment()
Definition: cryptglue.c:304
@ FR_NOT_IMPL
Invalid function - feature not enabled.
Definition: dispatcher.h:36
#define APPLICATION_PGP
Use PGP to encrypt/sign.
Definition: lib.h:90
#define WithCrypto
Definition: lib.h:116
+ Here is the call graph for this function:

◆ op_attachment_attach_message()

static int op_attachment_attach_message ( struct ComposeSharedData shared,
int  op 
)
static

Attach messages to this message - Implements compose_function_t -.

This function handles:

  • OP_ATTACHMENT_ATTACH_MESSAGE
  • OP_ATTACHMENT_ATTACH_NEWS_MESSAGE

Definition at line 824 of file functions.c.

825{
826 char *prompt = _("Open mailbox to attach message from");
827
828 OptNews = false;
829 if (shared->mailbox && (op == OP_ATTACHMENT_ATTACH_NEWS_MESSAGE))
830 {
831 const char *const c_news_server = cs_subset_string(shared->sub, "news_server");
832 CurrentNewsSrv = nntp_select_server(shared->mailbox, c_news_server, false);
833 if (!CurrentNewsSrv)
834 return FR_NO_ACTION;
835
836 prompt = _("Open newsgroup to attach message from");
837 OptNews = true;
838 }
839
840 struct Buffer *fname = buf_pool_get();
841 if (shared->mailbox)
842 {
843 if ((op == OP_ATTACHMENT_ATTACH_MESSAGE) ^ (shared->mailbox->type == MUTT_NNTP))
844 {
845 buf_strcpy(fname, mailbox_path(shared->mailbox));
846 buf_pretty_mailbox(fname);
847 }
848 }
849
850 if ((mw_enter_fname(prompt, fname, true, shared->mailbox, false, NULL, NULL,
851 MUTT_SEL_NO_FLAGS) == -1) ||
852 buf_is_empty(fname))
853 {
854 buf_pool_release(&fname);
855 return FR_NO_ACTION;
856 }
857
858 if (OptNews)
860 else
861 buf_expand_path(fname);
862
863 if (imap_path_probe(buf_string(fname), NULL) != MUTT_IMAP)
864 {
865 if (pop_path_probe(buf_string(fname), NULL) != MUTT_POP)
866 {
867 if (!OptNews && (nntp_path_probe(buf_string(fname), NULL) != MUTT_NNTP))
868 {
870 {
871 /* check to make sure the file exists and is readable */
872 if (access(buf_string(fname), R_OK) == -1)
873 {
874 mutt_perror("%s", buf_string(fname));
875 buf_pool_release(&fname);
876 return FR_ERROR;
877 }
878 }
879 }
880 }
881 }
882
884
885 struct Mailbox *m_attach = mx_path_resolve(buf_string(fname));
886 const bool old_readonly = m_attach->readonly;
887 if (!mx_mbox_open(m_attach, MUTT_READONLY))
888 {
889 mutt_error(_("Unable to open mailbox %s"), buf_string(fname));
890 mx_fastclose_mailbox(m_attach, false);
891 m_attach = NULL;
892 buf_pool_release(&fname);
893 return FR_ERROR;
894 }
895 buf_pool_release(&fname);
896
897 if (m_attach->msg_count == 0)
898 {
899 mx_mbox_close(m_attach);
900 mutt_error(_("No messages in that folder"));
901 return FR_NO_ACTION;
902 }
903
904 /* `$sort`, `$sort_aux`, `$use_threads` could be changed in dlg_index() */
905 const enum SortType old_sort = cs_subset_sort(shared->sub, "sort");
906 const enum SortType old_sort_aux = cs_subset_sort(shared->sub, "sort_aux");
907 const unsigned char old_use_threads = cs_subset_enum(shared->sub, "use_threads");
908
909 mutt_message(_("Tag the messages you want to attach"));
910 struct MuttWindow *dlg = index_pager_init();
911 struct IndexSharedData *index_shared = dlg->wdata;
912 index_shared->attach_msg = true;
913 dialog_push(dlg);
914 struct Mailbox *m_attach_new = dlg_index(dlg, m_attach);
915 dialog_pop();
916 mutt_window_free(&dlg);
917
918 if (!shared->mailbox)
919 {
920 /* Restore old $sort variables */
921 cs_subset_str_native_set(shared->sub, "sort", old_sort, NULL);
922 cs_subset_str_native_set(shared->sub, "sort_aux", old_sort_aux, NULL);
923 cs_subset_str_native_set(shared->sub, "use_threads", old_use_threads, NULL);
926 return FR_SUCCESS;
927 }
928
929 bool added_attachment = false;
930 for (int i = 0; i < m_attach_new->msg_count; i++)
931 {
932 if (!m_attach_new->emails[i])
933 break;
934 if (!message_is_tagged(m_attach_new->emails[i]))
935 continue;
936
937 struct AttachPtr *ap = mutt_aptr_new();
938 ap->body = mutt_make_message_attach(m_attach_new, m_attach_new->emails[i],
939 true, shared->sub);
940 if (ap->body)
941 {
942 added_attachment = true;
943 update_idx(shared->adata->menu, shared->adata->actx, ap);
944 }
945 else
946 {
947 mutt_error(_("Unable to attach"));
948 mutt_aptr_free(&ap);
949 }
950 }
952
953 if (m_attach_new == m_attach)
954 {
955 m_attach->readonly = old_readonly;
956 }
957 mx_fastclose_mailbox(m_attach_new, false);
958
959 /* Restore old $sort variables */
960 cs_subset_str_native_set(shared->sub, "sort", old_sort, NULL);
961 cs_subset_str_native_set(shared->sub, "sort_aux", old_sort_aux, NULL);
962 cs_subset_str_native_set(shared->sub, "use_threads", old_use_threads, NULL);
964 if (added_attachment)
966 return FR_SUCCESS;
967}
#define MUTT_SEL_NO_FLAGS
No flags are set.
Definition: lib.h:57
size_t buf_strcpy(struct Buffer *buf, const char *s)
Copy a string into a Buffer.
Definition: buffer.c:395
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:96
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
Definition: helpers.c:291
unsigned char cs_subset_enum(const struct ConfigSubset *sub, const char *name)
Get a enumeration config item by name.
Definition: helpers.c:71
short cs_subset_sort(const struct ConfigSubset *sub, const char *name)
Get a sort config item by name.
Definition: helpers.c:266
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
Definition: mailbox.h:223
@ MUTT_NOTMUCH
'Notmuch' (virtual) Mailbox type
Definition: mailbox.h:51
@ MUTT_POP
'POP3' Mailbox type
Definition: mailbox.h:52
@ MUTT_NNTP
'NNTP' (Usenet) Mailbox type
Definition: mailbox.h:49
@ MUTT_IMAP
'IMAP' Mailbox type
Definition: mailbox.h:50
void dialog_push(struct MuttWindow *dlg)
Display a Window to the user.
Definition: dialog.c:109
void dialog_pop(void)
Hide a Window from the user.
Definition: dialog.c:142
@ FR_ERROR
Valid function - error occurred.
Definition: dispatcher.h:38
struct MuttWindow * index_pager_init(void)
Allocate the Windows for the Index/Pager.
Definition: dlg_index.c:1404
bool OptNews
(pseudo) used to change reader mode
Definition: globals.c:70
struct Mailbox * dlg_index(struct MuttWindow *dlg, struct Mailbox *m_init)
Display a list of emails -.
Definition: dlg_index.c:1070
#define mutt_perror(...)
Definition: logging2.h:93
enum MailboxType nntp_path_probe(const char *path, const struct stat *st)
Is this an NNTP Mailbox? - Implements MxOps::path_probe() -.
Definition: nntp.c:2786
enum MailboxType pop_path_probe(const char *path, const struct stat *st)
Is this a POP Mailbox? - Implements MxOps::path_probe() -.
Definition: pop.c:1157
enum MailboxType imap_path_probe(const char *path, const struct stat *st)
Is this an IMAP Mailbox? - Implements MxOps::path_probe() -.
Definition: imap.c:2345
#define MENU_REDRAW_FULL
Redraw everything.
Definition: lib.h:59
void mutt_window_free(struct MuttWindow **ptr)
Free a Window and its children.
Definition: mutt_window.c:201
void buf_pretty_mailbox(struct Buffer *buf)
Shorten a mailbox path using '~' or '='.
Definition: muttlib.c:519
void buf_expand_path(struct Buffer *buf)
Create the canonical path.
Definition: muttlib.c:315
bool message_is_tagged(struct Email *e)
Is a message in the index tagged (and within limit)
Definition: mview.c:364
void mx_fastclose_mailbox(struct Mailbox *m, bool keep_account)
Free up memory associated with the Mailbox.
Definition: mx.c:414
bool mx_mbox_open(struct Mailbox *m, OpenMailboxFlags flags)
Open a mailbox and parse it.
Definition: mx.c:288
enum MailboxType mx_path_probe(const char *path)
Find a mailbox that understands a path.
Definition: mx.c:1321
struct Mailbox * mx_path_resolve(const char *path)
Get a Mailbox for a path.
Definition: mx.c:1636
enum MxStatus mx_mbox_close(struct Mailbox *m)
Save changes and close mailbox.
Definition: mx.c:598
#define MUTT_READONLY
Open in read-only mode.
Definition: mxapi.h:43
void nntp_expand_path(char *buf, size_t buflen, struct ConnAccount *acct)
Make fully qualified url from newsgroup name.
Definition: newsrc.c:558
struct NntpAccountData * CurrentNewsSrv
Current NNTP news server.
Definition: nntp.c:77
struct NntpAccountData * nntp_select_server(struct Mailbox *m, const char *server, bool leave_lock)
Open a connection to an NNTP server.
Definition: newsrc.c:1063
struct Body * mutt_make_message_attach(struct Mailbox *m, struct Email *e, bool attach_msg, struct ConfigSubset *sub)
Create a message attachment.
Definition: sendlib.c:454
SortType
Methods for sorting.
Definition: sort2.h:34
size_t dsize
Length of data.
Definition: buffer.h:39
char * data
Pointer to data.
Definition: buffer.h:37
struct Mailbox * mailbox
Current Mailbox.
Definition: shared_data.h:37
struct ConnAccount account
Account details: username, password, etc.
Definition: connection.h:49
Data shared between Index, Pager and Sidebar.
Definition: shared_data.h:37
bool attach_msg
Are we in "attach message" mode?
Definition: shared_data.h:46
A mailbox.
Definition: mailbox.h:79
int msg_count
Total number of messages.
Definition: mailbox.h:88
enum MailboxType type
Mailbox type.
Definition: mailbox.h:102
struct Email ** emails
Array of Emails.
Definition: mailbox.h:96
bool readonly
Don't allow changes to the mailbox.
Definition: mailbox.h:116
void * wdata
Private data.
Definition: mutt_window.h:144
struct Connection * conn
Connection to NNTP Server.
Definition: adata.h:62
int cs_subset_str_native_set(const struct ConfigSubset *sub, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.
Definition: subset.c:297
+ Here is the call graph for this function:

◆ op_attachment_detach()

static int op_attachment_detach ( struct ComposeSharedData shared,
int  op 
)
static

Delete the current entry - Implements compose_function_t -.

Definition at line 972 of file functions.c.

973{
974 struct AttachCtx *actx = shared->adata->actx;
975 if (!check_count(actx))
976 return FR_NO_ACTION;
977
978 struct Menu *menu = shared->adata->menu;
979 struct AttachPtr *cur_att = current_attachment(actx, menu);
980 if (cur_att->unowned)
981 cur_att->body->unlink = false;
982
983 int index = menu_get_index(menu);
984 if (delete_attachment(actx, index) == -1)
985 return FR_ERROR;
986
987 menu->num_tagged = 0;
988 for (int i = 0; i < actx->idxlen; i++)
989 {
990 if (actx->idx[i]->body->tagged)
991 menu->num_tagged++;
992 }
993
994 update_menu(actx, menu, false);
996
997 index = menu_get_index(menu);
998 if (index == 0)
999 shared->email->body = actx->idx[0]->body;
1000
1001 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1002 return FR_SUCCESS;
1003}
static bool check_count(struct AttachCtx *actx)
Check if there are any attachments.
Definition: functions.c:216
static int delete_attachment(struct AttachCtx *actx, int aidx)
Delete an attachment.
Definition: functions.c:332
void update_menu(struct AttachCtx *actx, struct Menu *menu, bool init)
Redraw the compose window.
Definition: dlg_compose.c:217
int menu_get_index(struct Menu *menu)
Get the current selection in the Menu.
Definition: menu.c:160
struct AttachPtr * current_attachment(struct AttachCtx *actx, struct Menu *menu)
Get the current attachment.
Definition: recvattach.c:77
A set of attachments.
Definition: attach.h:65
struct AttachPtr ** idx
Array of attachments.
Definition: attach.h:69
short idxlen
Number of attachmentes.
Definition: attach.h:70
bool unlink
If true, filename should be unlink()ed before free()ing this structure.
Definition: body.h:68
bool tagged
This attachment is tagged.
Definition: body.h:90
struct Body * body
List of MIME parts.
Definition: email.h:69
Definition: lib.h:79
int num_tagged
Number of tagged entries.
Definition: lib.h:93
+ Here is the call graph for this function:

◆ op_attachment_edit_content_id()

static int op_attachment_edit_content_id ( struct ComposeSharedData shared,
int  op 
)
static

Edit the 'Content-ID' of the attachment - Implements compose_function_t -.

Definition at line 1008 of file functions.c.

1009{
1010 if (!check_count(shared->adata->actx))
1011 return FR_NO_ACTION;
1012
1013 int rc = FR_NO_ACTION;
1014 struct Buffer *buf = buf_pool_get();
1015 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1016 shared->adata->menu);
1017
1018 char *id = cur_att->body->content_id;
1019 if (id)
1020 {
1021 buf_strcpy(buf, id);
1022 }
1023 else
1024 {
1025 id = gen_cid();
1026 buf_strcpy(buf, id);
1027 FREE(&id);
1028 }
1029
1030 if (mw_get_field("Content-ID: ", buf, MUTT_COMP_NO_FLAGS, HC_OTHER, NULL, NULL) == 0)
1031 {
1032 if (!mutt_str_equal(id, buf_string(buf)))
1033 {
1034 if (check_cid(buf_string(buf)))
1035 {
1036 mutt_str_replace(&cur_att->body->content_id, buf_string(buf));
1039 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1040 rc = FR_SUCCESS;
1041 }
1042 else
1043 {
1044 mutt_error(_("Content-ID can only contain the characters: -.0-9@A-Z_a-z"));
1045 rc = FR_ERROR;
1046 }
1047 }
1048 }
1049
1050 buf_pool_release(&buf);
1051
1052 if (rc != FR_ERROR)
1054
1055 return rc;
1056}
static char * gen_cid(void)
Generate a random Content ID.
Definition: functions.c:233
static bool check_cid(const char *cid)
Check if a Content-ID is valid.
Definition: functions.c:249
int mw_get_field(const char *prompt, struct Buffer *buf, CompletionFlags complete, enum HistoryClass hclass, const struct CompleteOps *comp_api, void *cdata)
Ask the user for a string -.
Definition: window.c:274
@ HC_OTHER
Miscellaneous strings.
Definition: lib.h:56
#define MENU_REDRAW_CURRENT
Redraw the current line of the menu.
Definition: lib.h:58
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:660
char * mutt_str_replace(char **p, const char *s)
Replace one string with another.
Definition: string.c:280
#define MUTT_COMP_NO_FLAGS
No flags are set.
Definition: mutt.h:56
char * content_id
Content-Id (RFC2392)
Definition: body.h:58
+ Here is the call graph for this function:

◆ op_attachment_edit_description()

static int op_attachment_edit_description ( struct ComposeSharedData shared,
int  op 
)
static

Edit attachment description - Implements compose_function_t -.

Definition at line 1061 of file functions.c.

1062{
1063 if (!check_count(shared->adata->actx))
1064 return FR_NO_ACTION;
1065
1066 int rc = FR_NO_ACTION;
1067 struct Buffer *buf = buf_pool_get();
1068
1069 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1070 shared->adata->menu);
1071 buf_strcpy(buf, cur_att->body->description);
1072
1073 /* header names should not be translated */
1074 if (mw_get_field("Description: ", buf, MUTT_COMP_NO_FLAGS, HC_OTHER, NULL, NULL) == 0)
1075 {
1076 if (!mutt_str_equal(cur_att->body->description, buf_string(buf)))
1077 {
1078 mutt_str_replace(&cur_att->body->description, buf_string(buf));
1080 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1081 rc = FR_SUCCESS;
1082 }
1083 }
1084
1085 buf_pool_release(&buf);
1086 return rc;
1087}
char * description
content-description
Definition: body.h:55
+ Here is the call graph for this function:

◆ op_attachment_edit_encoding()

static int op_attachment_edit_encoding ( struct ComposeSharedData shared,
int  op 
)
static

Edit attachment transfer-encoding - Implements compose_function_t -.

Definition at line 1092 of file functions.c.

1093{
1094 if (!check_count(shared->adata->actx))
1095 return FR_NO_ACTION;
1096
1097 int rc = FR_NO_ACTION;
1098 struct Buffer *buf = buf_pool_get();
1099
1100 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1101 shared->adata->menu);
1102 buf_strcpy(buf, ENCODING(cur_att->body->encoding));
1103
1104 if ((mw_get_field("Content-Transfer-Encoding: ", buf, MUTT_COMP_NO_FLAGS,
1105 HC_OTHER, NULL, NULL) == 0) &&
1106 !buf_is_empty(buf))
1107 {
1108 int enc = mutt_check_encoding(buf_string(buf));
1109 if ((enc != ENC_OTHER) && (enc != ENC_UUENCODED))
1110 {
1111 if (enc != cur_att->body->encoding)
1112 {
1113 cur_att->body->encoding = enc;
1117 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1118 rc = FR_SUCCESS;
1119 }
1120 }
1121 else
1122 {
1123 mutt_error(_("Invalid encoding"));
1124 rc = FR_ERROR;
1125 }
1126 }
1127
1128 buf_pool_release(&buf);
1129 return rc;
1130}
int mutt_check_encoding(const char *c)
Check the encoding type.
Definition: parse.c:437
@ ENC_UUENCODED
UUEncoded text.
Definition: mime.h:54
@ ENC_OTHER
Encoding unknown.
Definition: mime.h:48
#define ENCODING(x)
Definition: mime.h:92
unsigned int encoding
content-transfer-encoding, ContentEncoding
Definition: body.h:41
+ Here is the call graph for this function:

◆ op_attachment_edit_language()

static int op_attachment_edit_language ( struct ComposeSharedData shared,
int  op 
)
static

Edit the 'Content-Language' of the attachment - Implements compose_function_t -.

Definition at line 1135 of file functions.c.

1136{
1137 if (!check_count(shared->adata->actx))
1138 return FR_NO_ACTION;
1139
1140 int rc = FR_NO_ACTION;
1141 struct Buffer *buf = buf_pool_get();
1142 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1143 shared->adata->menu);
1144
1145 buf_strcpy(buf, cur_att->body->language);
1146 if (mw_get_field("Content-Language: ", buf, MUTT_COMP_NO_FLAGS, HC_OTHER, NULL, NULL) == 0)
1147 {
1148 if (!mutt_str_equal(cur_att->body->language, buf_string(buf)))
1149 {
1150 mutt_str_replace(&cur_att->body->language, buf_string(buf));
1153 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1154 rc = FR_SUCCESS;
1155 }
1157 }
1158 else
1159 {
1160 mutt_warning(_("Empty 'Content-Language'"));
1161 rc = FR_ERROR;
1162 }
1163
1164 buf_pool_release(&buf);
1165 return rc;
1166}
#define mutt_warning(...)
Definition: logging2.h:90
char * language
content-language (RFC8255)
Definition: body.h:78
+ Here is the call graph for this function:

◆ op_attachment_edit_mime()

static int op_attachment_edit_mime ( struct ComposeSharedData shared,
int  op 
)
static

Edit attachment using mailcap entry - Implements compose_function_t -.

Definition at line 1171 of file functions.c.

1172{
1173 if (!check_count(shared->adata->actx))
1174 return FR_NO_ACTION;
1175 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1176 shared->adata->menu);
1177 if (!mutt_edit_attachment(cur_att->body))
1178 return FR_NO_ACTION;
1179
1180 mutt_update_encoding(cur_att->body, shared->sub);
1182 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1183 return FR_SUCCESS;
1184}
bool mutt_edit_attachment(struct Body *b)
Edit an attachment.
Definition: mutt_attach.c:265
void mutt_update_encoding(struct Body *b, struct ConfigSubset *sub)
Update the encoding type.
Definition: sendlib.c:422
+ Here is the call graph for this function:

◆ op_attachment_edit_type()

static int op_attachment_edit_type ( struct ComposeSharedData shared,
int  op 
)
static

Edit attachment content type - Implements compose_function_t -.

Definition at line 1189 of file functions.c.

1190{
1191 if (!check_count(shared->adata->actx))
1192 return FR_NO_ACTION;
1193
1194 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1195 shared->adata->menu);
1196 if (!mutt_edit_content_type(NULL, cur_att->body, NULL))
1197 return FR_NO_ACTION;
1198
1199 /* this may have been a change to text/something */
1200 mutt_update_encoding(cur_att->body, shared->sub);
1202 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1203 return FR_SUCCESS;
1204}
bool mutt_edit_content_type(struct Email *e, struct Body *b, FILE *fp)
Edit the content type of an attachment.
Definition: external.c:1070
+ Here is the call graph for this function:

◆ op_attachment_filter()

static int op_attachment_filter ( struct ComposeSharedData shared,
int  op 
)
static

Filter attachment through a shell command - Implements compose_function_t -.

This function handles:

  • OP_ATTACHMENT_FILTER
  • OP_PIPE

Definition at line 1213 of file functions.c.

1214{
1215 struct AttachCtx *actx = shared->adata->actx;
1216 if (!check_count(actx))
1217 return FR_NO_ACTION;
1218
1219 struct Menu *menu = shared->adata->menu;
1220 struct AttachPtr *cur_att = current_attachment(actx, menu);
1221 if (cur_att->body->type == TYPE_MULTIPART)
1222 {
1223 mutt_error(_("Can't filter multipart attachments"));
1224 return FR_ERROR;
1225 }
1226 mutt_pipe_attachment_list(actx, NULL, menu->tag_prefix, cur_att->body,
1227 (op == OP_ATTACHMENT_FILTER));
1228 if (op == OP_ATTACHMENT_FILTER) /* cte might have changed */
1229 {
1231 }
1233 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1234 return FR_SUCCESS;
1235}
@ TYPE_MULTIPART
Type: 'multipart/*'.
Definition: mime.h:37
void mutt_pipe_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, struct Body *b, bool filter)
Pipe a list of attachments to a command.
Definition: recvattach.c:725
unsigned int type
content-type primary type, ContentType
Definition: body.h:40
bool tag_prefix
User has pressed <tag-prefix>
Definition: lib.h:85
+ Here is the call graph for this function:

◆ op_attachment_get_attachment()

static int op_attachment_get_attachment ( struct ComposeSharedData shared,
int  op 
)
static

Get a temporary copy of an attachment - Implements compose_function_t -.

Definition at line 1240 of file functions.c.

1241{
1242 struct AttachCtx *actx = shared->adata->actx;
1243 if (!check_count(actx))
1244 return FR_NO_ACTION;
1245
1246 int rc = FR_ERROR;
1247 struct Menu *menu = shared->adata->menu;
1248 struct BodyArray ba = ARRAY_HEAD_INITIALIZER;
1249 ba_add_tagged(&ba, actx, menu);
1250 if (ARRAY_EMPTY(&ba))
1251 goto done;
1252
1253 struct Body **bp = NULL;
1254 ARRAY_FOREACH(bp, &ba)
1255 {
1256 if ((*bp)->type == TYPE_MULTIPART)
1257 {
1258 mutt_warning(_("Can't get multipart attachments"));
1259 continue;
1260 }
1262 }
1263
1265 rc = FR_SUCCESS;
1266
1267done:
1268 ARRAY_FREE(&ba);
1269 /* No send2hook since this doesn't change the message. */
1270 return rc;
1271}
#define ARRAY_FOREACH(elem, head)
Iterate over all elements of the array.
Definition: array.h:212
#define ARRAY_EMPTY(head)
Check if an array is empty.
Definition: array.h:74
#define ARRAY_FREE(head)
Release all memory.
Definition: array.h:204
#define ARRAY_HEAD_INITIALIZER
Static initializer for arrays.
Definition: array.h:58
int mutt_get_tmp_attachment(struct Body *b)
Get a temporary copy of an attachment.
Definition: mutt_attach.c:72
int ba_add_tagged(struct BodyArray *ba, struct AttachCtx *actx, struct Menu *menu)
Get an array of tagged Attachments.
Definition: recvattach.c:1241
The body of an email.
Definition: body.h:36
+ Here is the call graph for this function:

◆ op_attachment_group_alts()

static int op_attachment_group_alts ( struct ComposeSharedData shared,
int  op 
)
static

Group tagged attachments as 'multipart/alternative' - Implements compose_function_t -.

Definition at line 1276 of file functions.c.

1277{
1278 if (shared->adata->menu->num_tagged < 2)
1279 {
1280 mutt_error(_("Grouping 'alternatives' requires at least 2 tagged messages"));
1281 return FR_ERROR;
1282 }
1283
1284 return group_attachments(shared, "alternative");
1285}
static int group_attachments(struct ComposeSharedData *shared, char *subtype)
Group tagged attachments into a multipart group.
Definition: functions.c:513
+ Here is the call graph for this function:

◆ op_attachment_group_lingual()

static int op_attachment_group_lingual ( struct ComposeSharedData shared,
int  op 
)
static

Group tagged attachments as 'multipart/multilingual' - Implements compose_function_t -.

Definition at line 1290 of file functions.c.

1291{
1292 if (shared->adata->menu->num_tagged < 2)
1293 {
1294 mutt_error(_("Grouping 'multilingual' requires at least 2 tagged messages"));
1295 return FR_ERROR;
1296 }
1297
1298 /* traverse to see whether all the parts have Content-Language: set */
1299 int tagged_with_lang_num = 0;
1300 for (struct Body *b = shared->email->body; b; b = b->next)
1301 if (b->tagged && b->language && *b->language)
1302 tagged_with_lang_num++;
1303
1304 if (shared->adata->menu->num_tagged != tagged_with_lang_num)
1305 {
1306 if (query_yesorno(_("Not all parts have 'Content-Language' set, continue?"),
1307 MUTT_YES) != MUTT_YES)
1308 {
1309 mutt_message(_("Not sending this message"));
1310 return FR_ERROR;
1311 }
1312 }
1313
1314 return group_attachments(shared, "multilingual");
1315}
@ MUTT_YES
User answered 'Yes', or assume 'Yes'.
Definition: quad.h:39
enum QuadOption query_yesorno(const char *prompt, enum QuadOption def)
Ask the user a Yes/No question.
Definition: question.c:326
struct Body * next
next attachment in the list
Definition: body.h:72
+ Here is the call graph for this function:

◆ op_attachment_group_related()

static int op_attachment_group_related ( struct ComposeSharedData shared,
int  op 
)
static

Group tagged attachments as 'multipart/related' - Implements compose_function_t -.

Definition at line 1320 of file functions.c.

1321{
1322 if (shared->adata->menu->num_tagged < 2)
1323 {
1324 mutt_error(_("Grouping 'related' requires at least 2 tagged messages"));
1325 return FR_ERROR;
1326 }
1327
1328 // ensure Content-ID is set for tagged attachments
1329 for (struct Body *b = shared->email->body; b; b = b->next)
1330 {
1331 if (!b->tagged || (b->type == TYPE_MULTIPART))
1332 continue;
1333
1334 char *id = b->content_id;
1335 if (id)
1336 continue;
1337
1338 id = gen_cid();
1339 if (id)
1340 {
1341 mutt_str_replace(&b->content_id, id);
1342 }
1343 }
1344
1345 return group_attachments(shared, "related");
1346}
+ Here is the call graph for this function:

◆ op_attachment_move_down()

static int op_attachment_move_down ( struct ComposeSharedData shared,
int  op 
)
static

Move an attachment down in the attachment list - Implements compose_function_t -.

Definition at line 1351 of file functions.c.

1352{
1353 int index = menu_get_index(shared->adata->menu);
1354
1355 struct AttachCtx *actx = shared->adata->actx;
1356
1357 if (index < 0)
1358 return FR_ERROR;
1359
1360 if (index == (actx->idxlen - 1))
1361 {
1362 mutt_error(_("Attachment is already at bottom"));
1363 return FR_NO_ACTION;
1364 }
1365 if ((actx->idx[index]->parent_type == TYPE_MULTIPART) &&
1366 !actx->idx[index]->body->next)
1367 {
1368 mutt_error(_("Attachment can't be moved out of group"));
1369 return FR_ERROR;
1370 }
1371
1372 // find next attachment at current level
1373 int nextidx = index + 1;
1374 while ((nextidx < actx->idxlen) &&
1375 (actx->idx[nextidx]->level > actx->idx[index]->level))
1376 {
1377 nextidx++;
1378 }
1379 if (nextidx == actx->idxlen)
1380 {
1381 mutt_error(_("Attachment is already at bottom"));
1382 return FR_NO_ACTION;
1383 }
1384
1385 // find final position
1386 int finalidx = index + 1;
1387 if (nextidx < actx->idxlen - 1)
1388 {
1389 if ((actx->idx[nextidx]->body->type == TYPE_MULTIPART) &&
1390 (actx->idx[nextidx + 1]->level > actx->idx[nextidx]->level))
1391 {
1392 finalidx += attach_body_count(actx->idx[nextidx]->body->parts, true);
1393 }
1394 }
1395
1396 compose_attach_swap(shared->email, shared->adata->actx, index, nextidx);
1397 mutt_update_tree(shared->adata->actx);
1399 menu_set_index(shared->adata->menu, finalidx);
1400 return FR_SUCCESS;
1401}
int attach_body_count(struct Body *body, bool recurse)
Count bodies.
Definition: lib.c:42
static void compose_attach_swap(struct Email *e, struct AttachCtx *actx, int first, int second)
Swap two adjacent entries in the attachment list.
Definition: functions.c:447
MenuRedrawFlags menu_set_index(struct Menu *menu, int index)
Set the current selection in the Menu.
Definition: menu.c:174
void mutt_update_tree(struct AttachCtx *actx)
Refresh the list of attachments.
Definition: recvattach.c:122
int level
Nesting depth of attachment.
Definition: attach.h:42
int parent_type
Type of parent attachment, e.g. TYPE_MULTIPART.
Definition: attach.h:40
struct Body * parts
parts of a multipart or message/rfc822
Definition: body.h:73
+ Here is the call graph for this function:

◆ op_attachment_move_up()

static int op_attachment_move_up ( struct ComposeSharedData shared,
int  op 
)
static

Move an attachment up in the attachment list - Implements compose_function_t -.

Definition at line 1406 of file functions.c.

1407{
1408 int index = menu_get_index(shared->adata->menu);
1409 if (index < 0)
1410 return FR_ERROR;
1411
1412 struct AttachCtx *actx = shared->adata->actx;
1413
1414 if (index == 0)
1415 {
1416 mutt_error(_("Attachment is already at top"));
1417 return FR_NO_ACTION;
1418 }
1419 if (actx->idx[index - 1]->level < actx->idx[index]->level)
1420 {
1421 mutt_error(_("Attachment can't be moved out of group"));
1422 return FR_ERROR;
1423 }
1424
1425 // find previous attachment at current level
1426 int previdx = index - 1;
1427 while ((previdx > 0) && (actx->idx[previdx]->level > actx->idx[index]->level))
1428 previdx--;
1429
1430 compose_attach_swap(shared->email, actx, previdx, index);
1431 mutt_update_tree(actx);
1433 menu_set_index(shared->adata->menu, previdx);
1434 return FR_SUCCESS;
1435}
+ Here is the call graph for this function:

◆ op_attachment_new_mime()

static int op_attachment_new_mime ( struct ComposeSharedData shared,
int  op 
)
static

Compose new attachment using mailcap entry - Implements compose_function_t -.

Definition at line 1440 of file functions.c.

1441{
1442 int rc = FR_NO_ACTION;
1443 struct Buffer *fname = buf_pool_get();
1444 struct Buffer *type = NULL;
1445 struct AttachPtr *ap = NULL;
1446
1447 struct FileCompletionData cdata = { false, shared->mailbox, NULL, NULL };
1448 if ((mw_get_field(_("New file: "), fname, MUTT_COMP_NO_FLAGS, HC_FILE,
1449 &CompleteFileOps, &cdata) != 0) ||
1450 buf_is_empty(fname))
1451 {
1452 goto done;
1453 }
1454 buf_expand_path(fname);
1455
1456 /* Call to lookup_mime_type () ? maybe later */
1457 type = buf_pool_get();
1458 if ((mw_get_field("Content-Type: ", type, MUTT_COMP_NO_FLAGS, HC_OTHER, NULL, NULL) != 0) ||
1459 buf_is_empty(type))
1460 {
1461 goto done;
1462 }
1463
1464 rc = FR_ERROR;
1465 char *p = strchr(buf_string(type), '/');
1466 if (!p)
1467 {
1468 mutt_error(_("Content-Type is of the form base/sub"));
1469 goto done;
1470 }
1471 *p++ = 0;
1472 enum ContentType itype = mutt_check_mime_type(buf_string(type));
1473 if (itype == TYPE_OTHER)
1474 {
1475 mutt_error(_("Unknown Content-Type %s"), buf_string(type));
1476 goto done;
1477 }
1478
1479 ap = mutt_aptr_new();
1480 /* Touch the file */
1481 FILE *fp = mutt_file_fopen(buf_string(fname), "w");
1482 if (!fp)
1483 {
1484 mutt_error(_("Can't create file %s"), buf_string(fname));
1485 goto done;
1486 }
1487 mutt_file_fclose(&fp);
1488
1489 ap->body = mutt_make_file_attach(buf_string(fname), shared->sub);
1490 if (!ap->body)
1491 {
1492 mutt_error(_("Error attaching file"));
1493 goto done;
1494 }
1495 update_idx(shared->adata->menu, shared->adata->actx, ap);
1496 ap = NULL; // shared->adata->actx has taken ownership
1497
1498 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1499 shared->adata->menu);
1500 cur_att->body->type = itype;
1501 mutt_str_replace(&cur_att->body->subtype, p);
1502 cur_att->body->unlink = true;
1505
1506 if (mutt_compose_attachment(cur_att->body))
1507 {
1508 mutt_update_encoding(cur_att->body, shared->sub);
1510 }
1511 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1512 rc = FR_SUCCESS;
1513
1514done:
1515 mutt_aptr_free(&ap);
1516 buf_pool_release(&type);
1517 buf_pool_release(&fname);
1518 return rc;
1519}
const struct CompleteOps CompleteFileOps
Auto-Completion of Files.
Definition: complete.c:153
enum ContentType mutt_check_mime_type(const char *s)
Check a MIME type string.
Definition: parse.c:366
#define mutt_file_fclose(FP)
Definition: file.h:149
#define mutt_file_fopen(PATH, MODE)
Definition: file.h:148
@ HC_FILE
Files.
Definition: lib.h:54
ContentType
Content-Type.
Definition: mime.h:30
@ TYPE_OTHER
Unknown Content-Type.
Definition: mime.h:31
int mutt_compose_attachment(struct Body *b)
Create an attachment.
Definition: mutt_attach.c:120
char * subtype
content-type subtype
Definition: body.h:61
Input for the file completion function.
Definition: curs_lib.h:40
+ Here is the call graph for this function:

◆ op_attachment_print()

static int op_attachment_print ( struct ComposeSharedData shared,
int  op 
)
static

Print the current entry - Implements compose_function_t -.

Definition at line 1524 of file functions.c.

1525{
1526 struct AttachCtx *actx = shared->adata->actx;
1527 if (!check_count(actx))
1528 return FR_NO_ACTION;
1529
1530 struct Menu *menu = shared->adata->menu;
1531 struct AttachPtr *cur_att = current_attachment(actx, menu);
1532 if (cur_att->body->type == TYPE_MULTIPART)
1533 {
1534 mutt_error(_("Can't print multipart attachments"));
1535 return FR_ERROR;
1536 }
1537
1538 mutt_print_attachment_list(actx, NULL, menu->tag_prefix, cur_att->body);
1539 /* no send2hook, since this doesn't modify the message */
1540 return FR_SUCCESS;
1541}
void mutt_print_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, struct Body *b)
Print a list of Attachments.
Definition: recvattach.c:888
+ Here is the call graph for this function:

◆ op_attachment_rename_attachment()

static int op_attachment_rename_attachment ( struct ComposeSharedData shared,
int  op 
)
static

Send attachment with a different name - Implements compose_function_t -.

Definition at line 1546 of file functions.c.

1547{
1548 if (!check_count(shared->adata->actx))
1549 return FR_NO_ACTION;
1550 char *src = NULL;
1551 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1552 shared->adata->menu);
1553 if (cur_att->body->d_filename)
1554 src = cur_att->body->d_filename;
1555 else
1556 src = cur_att->body->filename;
1557 struct Buffer *fname = buf_pool_get();
1558 buf_strcpy(fname, mutt_path_basename(NONULL(src)));
1559 struct FileCompletionData cdata = { false, shared->mailbox, NULL, NULL };
1560 int rc = mw_get_field(_("Send attachment with name: "), fname,
1562 if (rc == 0)
1563 {
1564 // It's valid to set an empty string here, to erase what was set
1565 mutt_str_replace(&cur_att->body->d_filename, buf_string(fname));
1567 }
1568 buf_pool_release(&fname);
1569 return FR_SUCCESS;
1570}
const char * mutt_path_basename(const char *path)
Find the last component for a pathname.
Definition: path.c:282
#define NONULL(x)
Definition: string2.h:37
char * d_filename
filename to be used for the content-disposition header If NULL, filename is used instead.
Definition: body.h:56
char * filename
When sending a message, this is the file to which this structure refers.
Definition: body.h:59
+ Here is the call graph for this function:

◆ op_attachment_save()

static int op_attachment_save ( struct ComposeSharedData shared,
int  op 
)
static

Save message/attachment to a mailbox/file - Implements compose_function_t -.

Definition at line 1575 of file functions.c.

1576{
1577 struct AttachCtx *actx = shared->adata->actx;
1578 if (!check_count(actx))
1579 return FR_NO_ACTION;
1580
1581 struct Menu *menu = shared->adata->menu;
1582 struct AttachPtr *cur_att = current_attachment(actx, menu);
1583 if (cur_att->body->type == TYPE_MULTIPART)
1584 {
1585 mutt_error(_("Can't save multipart attachments"));
1586 return FR_ERROR;
1587 }
1588
1589 mutt_save_attachment_list(actx, NULL, menu->tag_prefix, cur_att->body, NULL, menu);
1590 /* no send2hook, since this doesn't modify the message */
1591 return FR_SUCCESS;
1592}
void mutt_save_attachment_list(struct AttachCtx *actx, FILE *fp, bool tag, struct Body *b, struct Email *e, struct Menu *menu)
Save a list of attachments.
Definition: recvattach.c:433
+ Here is the call graph for this function:

◆ op_attachment_toggle_disposition()

static int op_attachment_toggle_disposition ( struct ComposeSharedData shared,
int  op 
)
static

Toggle disposition between inline/attachment - Implements compose_function_t -.

Definition at line 1597 of file functions.c.

1598{
1599 /* toggle the content-disposition between inline/attachment */
1600 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1601 shared->adata->menu);
1602 cur_att->body->disposition = (cur_att->body->disposition == DISP_INLINE) ?
1603 DISP_ATTACH :
1606 return FR_SUCCESS;
1607}
@ DISP_ATTACH
Content is attached.
Definition: mime.h:63
@ DISP_INLINE
Content is inline.
Definition: mime.h:62
unsigned int disposition
content-disposition, ContentDisposition
Definition: body.h:42
+ Here is the call graph for this function:

◆ op_attachment_toggle_recode()

static int op_attachment_toggle_recode ( struct ComposeSharedData shared,
int  op 
)
static

Toggle recoding of this attachment - Implements compose_function_t -.

Definition at line 1612 of file functions.c.

1613{
1614 if (!check_count(shared->adata->actx))
1615 return FR_NO_ACTION;
1616 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1617 shared->adata->menu);
1618 if (!mutt_is_text_part(cur_att->body))
1619 {
1620 mutt_error(_("Recoding only affects text attachments"));
1621 return FR_ERROR;
1622 }
1623 cur_att->body->noconv = !cur_att->body->noconv;
1624 if (cur_att->body->noconv)
1625 mutt_message(_("The current attachment won't be converted"));
1626 else
1627 mutt_message(_("The current attachment will be converted"));
1629 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1630 return FR_SUCCESS;
1631}
bool mutt_is_text_part(const struct Body *b)
Is this part of an email in plain text?
Definition: muttlib.c:407
bool noconv
Don't do character set conversion.
Definition: body.h:46
+ Here is the call graph for this function:

◆ op_attachment_toggle_unlink()

static int op_attachment_toggle_unlink ( struct ComposeSharedData shared,
int  op 
)
static

Toggle whether to delete file after sending it - Implements compose_function_t -.

Definition at line 1636 of file functions.c.

1637{
1638 if (!check_count(shared->adata->actx))
1639 return FR_NO_ACTION;
1640 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1641 shared->adata->menu);
1642 cur_att->body->unlink = !cur_att->body->unlink;
1643
1645 /* No send2hook since this doesn't change the message. */
1646 return FR_SUCCESS;
1647}
+ Here is the call graph for this function:

◆ op_attachment_ungroup()

static int op_attachment_ungroup ( struct ComposeSharedData shared,
int  op 
)
static

Ungroup a 'multipart' attachment - Implements compose_function_t -.

Definition at line 1652 of file functions.c.

1653{
1654 if (shared->adata->actx->idx[shared->adata->menu->current]->body->type != TYPE_MULTIPART)
1655 {
1656 mutt_error(_("Attachment is not 'multipart'"));
1657 return FR_ERROR;
1658 }
1659
1660 int aidx = shared->adata->menu->current;
1661 struct AttachCtx *actx = shared->adata->actx;
1662 struct Body *b = actx->idx[aidx]->body;
1663 struct Body *b_next = b->next;
1664 struct Body *b_previous = NULL;
1665 struct Body *b_parent = NULL;
1666 int parent_type = actx->idx[aidx]->parent_type;
1667 int level = actx->idx[aidx]->level;
1668
1669 // reorder body pointers
1670 if (attach_body_previous(shared->email->body, b, &b_previous))
1671 b_previous->next = b->parts;
1672 else if (attach_body_parent(shared->email->body, NULL, b, &b_parent))
1673 b_parent->parts = b->parts;
1674 else
1675 shared->email->body = b->parts;
1676
1677 // update attachment list
1678 int i = aidx + 1;
1679 while (actx->idx[i]->level > level)
1680 {
1681 actx->idx[i]->level--;
1682 if (actx->idx[i]->level == level)
1683 {
1684 actx->idx[i]->parent_type = parent_type;
1685 // set body->next for final attachment in group
1686 if (!actx->idx[i]->body->next)
1687 actx->idx[i]->body->next = b_next;
1688 }
1689 i++;
1690 if (i == actx->idxlen)
1691 break;
1692 }
1693
1694 // free memory
1695 actx->idx[aidx]->body->parts = NULL;
1696 actx->idx[aidx]->body->next = NULL;
1697 actx->idx[aidx]->body->email = NULL;
1698 mutt_body_free(&actx->idx[aidx]->body);
1699 FREE(&actx->idx[aidx]->tree);
1700 FREE(&actx->idx[aidx]);
1701
1702 // reorder attachment list
1703 for (int j = aidx; j < (actx->idxlen - 1); j++)
1704 actx->idx[j] = actx->idx[j + 1];
1705 actx->idx[actx->idxlen - 1] = NULL;
1706 actx->idxlen--;
1707 update_menu(actx, shared->adata->menu, false);
1708
1709 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1710 return FR_SUCCESS;
1711}
bool attach_body_parent(struct Body *start, struct Body *start_parent, struct Body *body, struct Body **body_parent)
Find the parent of a body.
Definition: lib.c:71
bool attach_body_previous(struct Body *start, struct Body *body, struct Body **previous)
Find the previous body of a body.
Definition: lib.c:142
void mutt_body_free(struct Body **ptr)
Free a Body.
Definition: body.c:58
char * tree
Tree characters to display.
Definition: attach.h:41
struct Email * email
header information for message/rfc822
Definition: body.h:74
int current
Current entry.
Definition: lib.h:80
+ Here is the call graph for this function:

◆ op_attachment_update_encoding()

static int op_attachment_update_encoding ( struct ComposeSharedData shared,
int  op 
)
static

Update an attachment's encoding info - Implements compose_function_t -.

Definition at line 1716 of file functions.c.

1717{
1718 struct AttachCtx *actx = shared->adata->actx;
1719 if (!check_count(actx))
1720 return FR_NO_ACTION;
1721
1722 int rc = FR_NO_ACTION;
1723 struct Menu *menu = shared->adata->menu;
1724 struct BodyArray ba = ARRAY_HEAD_INITIALIZER;
1725 ba_add_tagged(&ba, actx, menu);
1726 if (ARRAY_EMPTY(&ba))
1727 goto done;
1728
1729 struct Body **bp = NULL;
1730 ARRAY_FOREACH(bp, &ba)
1731 {
1732 mutt_update_encoding(*bp, shared->sub);
1733 }
1734
1737 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1738 rc = FR_SUCCESS;
1739
1740done:
1741 ARRAY_FREE(&ba);
1742 return rc;
1743}
+ Here is the call graph for this function:

◆ op_envelope_edit_headers()

static int op_envelope_edit_headers ( struct ComposeSharedData shared,
int  op 
)
static

Edit the message with headers - Implements compose_function_t -.

Definition at line 1750 of file functions.c.

1751{
1753 const char *tag = NULL;
1754 char *err = NULL;
1755 mutt_env_to_local(shared->email->env);
1756 const char *const c_editor = cs_subset_string(shared->sub, "editor");
1757 if (shared->email->body->type == TYPE_MULTIPART)
1758 {
1759 struct Body *b = shared->email->body->parts;
1760 while (b->parts)
1761 b = b->parts;
1762 mutt_edit_headers(NONULL(c_editor), b->filename, shared->email, shared->fcc);
1763 }
1764 else
1765 {
1766 mutt_edit_headers(NONULL(c_editor), shared->email->body->filename,
1767 shared->email, shared->fcc);
1768 }
1769
1770 if (mutt_env_to_intl(shared->email->env, &tag, &err))
1771 {
1772 mutt_error(_("Bad IDN in '%s': '%s'"), tag, err);
1773 FREE(&err);
1774 }
1776
1778 mutt_update_encoding(shared->email->body, shared->sub);
1779
1780 /* attachments may have been added */
1781 if (shared->adata->actx->idxlen &&
1782 shared->adata->actx->idx[shared->adata->actx->idxlen - 1]->body->next)
1783 {
1785 update_menu(shared->adata->actx, shared->adata->menu, true);
1786 }
1787
1789 /* Unconditional hook since editor was invoked */
1790 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1791 return FR_SUCCESS;
1792}
void mutt_actx_entries_free(struct AttachCtx *actx)
Free entries in an Attachment Context.
Definition: attach.c:162
@ NT_EMAIL_CHANGE_ENVELOPE
Email's Envelope has changed.
Definition: email.h:187
int mutt_env_to_intl(struct Envelope *env, const char **tag, char **err)
Convert an Envelope's Address fields to Punycode format.
Definition: envelope.c:355
void mutt_env_to_local(struct Envelope *env)
Convert an Envelope's Address fields to local format.
Definition: envelope.c:317
void mutt_edit_headers(const char *editor, const char *body, struct Email *e, struct Buffer *fcc)
Let the user edit the message header and body.
Definition: mutt_header.c:182
void mutt_rfc3676_space_unstuff(struct Email *e)
Remove RFC3676 space stuffing.
Definition: rfc3676.c:499
void mutt_rfc3676_space_stuff(struct Email *e)
Perform RFC3676 space stuffing on an Email.
Definition: rfc3676.c:486
struct Buffer * fcc
Buffer to save FCC.
Definition: shared_data.h:42
struct Envelope * env
Envelope information.
Definition: email.h:68
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ op_compose_edit_file()

static int op_compose_edit_file ( struct ComposeSharedData shared,
int  op 
)
static

Edit the file to be attached - Implements compose_function_t -.

Definition at line 1797 of file functions.c.

1798{
1799 if (!check_count(shared->adata->actx))
1800 return FR_NO_ACTION;
1801 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1802 shared->adata->menu);
1803 if (cur_att->body->type == TYPE_MULTIPART)
1804 {
1805 mutt_error(_("Can't edit multipart attachments"));
1806 return FR_ERROR;
1807 }
1808 const char *const c_editor = cs_subset_string(shared->sub, "editor");
1809 mutt_edit_file(NONULL(c_editor), cur_att->body->filename);
1810 mutt_update_encoding(cur_att->body, shared->sub);
1813 /* Unconditional hook since editor was invoked */
1814 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1815 return FR_SUCCESS;
1816}
void mutt_edit_file(const char *editor, const char *file)
Let the user edit a file.
Definition: curs_lib.c:116
+ Here is the call graph for this function:

◆ op_compose_edit_message()

static int op_compose_edit_message ( struct ComposeSharedData shared,
int  op 
)
static

Edit the message - Implements compose_function_t -.

Definition at line 1821 of file functions.c.

1822{
1823 const bool c_edit_headers = cs_subset_bool(shared->sub, "edit_headers");
1824 if (!c_edit_headers)
1825 {
1827 const char *const c_editor = cs_subset_string(shared->sub, "editor");
1828 mutt_edit_file(c_editor, shared->email->body->filename);
1830 mutt_update_encoding(shared->email->body, shared->sub);
1832 /* Unconditional hook since editor was invoked */
1833 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1834 return FR_SUCCESS;
1835 }
1836
1837 return op_envelope_edit_headers(shared, op);
1838}
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:47
static int op_envelope_edit_headers(struct ComposeSharedData *shared, int op)
Edit the message with headers - Implements compose_function_t -.
Definition: functions.c:1750
+ Here is the call graph for this function:

◆ op_compose_ispell()

static int op_compose_ispell ( struct ComposeSharedData shared,
int  op 
)
static

Run ispell on the message - Implements compose_function_t -.

Definition at line 1843 of file functions.c.

1844{
1845 endwin();
1846 const char *const c_ispell = cs_subset_string(shared->sub, "ispell");
1847 char buf[PATH_MAX] = { 0 };
1848 snprintf(buf, sizeof(buf), "%s -x %s", NONULL(c_ispell), shared->email->body->filename);
1849 if (mutt_system(buf) == -1)
1850 {
1851 mutt_error(_("Error running \"%s\""), buf);
1852 return FR_ERROR;
1853 }
1854
1855 mutt_update_encoding(shared->email->body, shared->sub);
1857 return FR_SUCCESS;
1858}
#define PATH_MAX
Definition: mutt.h:42
int mutt_system(const char *cmd)
Run an external command.
Definition: system.c:52
int endwin(void)
+ Here is the call graph for this function:

◆ op_compose_postpone_message()

static int op_compose_postpone_message ( struct ComposeSharedData shared,
int  op 
)
static

Save this message to send later - Implements compose_function_t -.

Definition at line 1863 of file functions.c.

1864{
1865 if (check_attachments(shared->adata->actx, shared->sub) != 0)
1866 {
1868 return FR_ERROR;
1869 }
1870
1871 shared->rc = 1;
1872 return FR_DONE;
1873}
static int check_attachments(struct AttachCtx *actx, struct ConfigSubset *sub)
Check if any attachments have changed or been deleted.
Definition: functions.c:269
@ FR_DONE
Exit the Dialog.
Definition: dispatcher.h:35
int rc
Return code to leave compose.
Definition: shared_data.h:45
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ op_compose_rename_file()

static int op_compose_rename_file ( struct ComposeSharedData shared,
int  op 
)
static

Rename/move an attached file - Implements compose_function_t -.

Definition at line 1878 of file functions.c.

1879{
1880 if (!check_count(shared->adata->actx))
1881 return FR_NO_ACTION;
1882 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
1883 shared->adata->menu);
1884 if (cur_att->body->type == TYPE_MULTIPART)
1885 {
1886 mutt_error(_("Can't rename multipart attachments"));
1887 return FR_ERROR;
1888 }
1889 struct Buffer *fname = buf_pool_get();
1890 buf_strcpy(fname, cur_att->body->filename);
1891 buf_pretty_mailbox(fname);
1892 struct FileCompletionData cdata = { false, shared->mailbox, NULL, NULL };
1893 if ((mw_get_field(_("Rename to: "), fname, MUTT_COMP_NO_FLAGS, HC_FILE,
1894 &CompleteFileOps, &cdata) == 0) &&
1895 !buf_is_empty(fname))
1896 {
1897 struct stat st = { 0 };
1898 if (stat(cur_att->body->filename, &st) == -1)
1899 {
1900 /* L10N: "stat" is a system call. Do "man 2 stat" for more information. */
1901 mutt_error(_("Can't stat %s: %s"), buf_string(fname), strerror(errno));
1902 buf_pool_release(&fname);
1903 return FR_ERROR;
1904 }
1905
1906 buf_expand_path(fname);
1907 if (mutt_file_rename(cur_att->body->filename, buf_string(fname)))
1908 {
1909 buf_pool_release(&fname);
1910 return FR_ERROR;
1911 }
1912
1913 mutt_str_replace(&cur_att->body->filename, buf_string(fname));
1915
1916 if (cur_att->body->stamp >= st.st_mtime)
1917 mutt_stamp_attachment(cur_att->body);
1918 mutt_message_hook(NULL, shared->email, MUTT_SEND2_HOOK);
1919 }
1920 buf_pool_release(&fname);
1921 return FR_SUCCESS;
1922}
int mutt_file_rename(const char *oldfile, const char *newfile)
Rename a file.
Definition: file.c:1371
void mutt_stamp_attachment(struct Body *b)
Timestamp an Attachment.
Definition: sendlib.c:410
time_t stamp
Time stamp of last encoding update.
Definition: body.h:77
+ Here is the call graph for this function:

◆ op_compose_send_message()

static int op_compose_send_message ( struct ComposeSharedData shared,
int  op 
)
static

Send the message - Implements compose_function_t -.

Definition at line 1927 of file functions.c.

1928{
1929 /* Note: We don't invoke send2-hook here, since we want to leave
1930 * users an opportunity to change settings from the ":" prompt. */
1931 if (check_attachments(shared->adata->actx, shared->sub) != 0)
1932 {
1934 return FR_NO_ACTION;
1935 }
1936
1937 if (!shared->fcc_set && !buf_is_empty(shared->fcc))
1938 {
1939 enum QuadOption ans = query_quadoption(_("Save a copy of this message?"),
1940 shared->sub, "copy");
1941 if (ans == MUTT_ABORT)
1942 return FR_NO_ACTION;
1943 else if (ans == MUTT_NO)
1944 buf_reset(shared->fcc);
1945 }
1946
1947 shared->rc = 0;
1948 return FR_DONE;
1949}
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
Definition: buffer.c:76
QuadOption
Possible values for a quad-option.
Definition: quad.h:36
@ MUTT_ABORT
User aborted the question (with Ctrl-G)
Definition: quad.h:37
@ MUTT_NO
User answered 'No', or assume 'No'.
Definition: quad.h:38
enum QuadOption query_quadoption(const char *prompt, struct ConfigSubset *sub, const char *name)
Ask the user a quad-question.
Definition: question.c:365
bool fcc_set
User has edited the Fcc: field.
Definition: shared_data.h:44
+ Here is the call graph for this function:

◆ op_compose_write_message()

static int op_compose_write_message ( struct ComposeSharedData shared,
int  op 
)
static

Write the message to a folder - Implements compose_function_t -.

Definition at line 1954 of file functions.c.

1955{
1956 int rc = FR_NO_ACTION;
1957 struct Buffer *fname = buf_pool_get();
1958 if (shared->mailbox)
1959 {
1960 buf_strcpy(fname, mailbox_path(shared->mailbox));
1961 buf_pretty_mailbox(fname);
1962 }
1963 if (shared->adata->actx->idxlen)
1964 shared->email->body = shared->adata->actx->idx[0]->body;
1965 if ((mw_enter_fname(_("Write message to mailbox"), fname, true, shared->mailbox,
1966 false, NULL, NULL, MUTT_SEL_NO_FLAGS) != -1) &&
1967 !buf_is_empty(fname))
1968 {
1969 mutt_message(_("Writing message to %s ..."), buf_string(fname));
1970 buf_expand_path(fname);
1971
1972 if (shared->email->body->next)
1973 shared->email->body = mutt_make_multipart(shared->email->body);
1974
1975 if (mutt_write_fcc(buf_string(fname), shared->email, NULL, false, NULL,
1976 NULL, shared->sub) == 0)
1977 mutt_message(_("Message written"));
1978
1979 shared->email->body = mutt_remove_multipart(shared->email->body);
1980 rc = FR_SUCCESS;
1981 }
1982 buf_pool_release(&fname);
1983 return rc;
1984}
struct Body * mutt_remove_multipart(struct Body *b)
Extract the multipart body if it exists.
Definition: multipart.c:126
struct Body * mutt_make_multipart(struct Body *b)
Create a multipart email.
Definition: multipart.c:100
int mutt_write_fcc(const char *path, struct Email *e, const char *msgid, bool post, const char *fcc, char **finalpath, struct ConfigSubset *sub)
Write email to FCC mailbox.
Definition: sendlib.c:1058
+ Here is the call graph for this function:

◆ op_display_headers()

static int op_display_headers ( struct ComposeSharedData shared,
int  op 
)
static

Display message and toggle header weeding - Implements compose_function_t -.

This function handles:

  • OP_ATTACHMENT_VIEW
  • OP_ATTACHMENT_VIEW_MAILCAP
  • OP_ATTACHMENT_VIEW_PAGER
  • OP_ATTACHMENT_VIEW_TEXT
  • OP_DISPLAY_HEADERS

Definition at line 1996 of file functions.c.

1997{
1998 if (!check_count(shared->adata->actx))
1999 return FR_NO_ACTION;
2000
2001 enum ViewAttachMode mode = MUTT_VA_REGULAR;
2002
2003 switch (op)
2004 {
2005 case OP_ATTACHMENT_VIEW:
2006 case OP_DISPLAY_HEADERS:
2007 break;
2008
2009 case OP_ATTACHMENT_VIEW_MAILCAP:
2010 mode = MUTT_VA_MAILCAP;
2011 break;
2012
2013 case OP_ATTACHMENT_VIEW_PAGER:
2014 mode = MUTT_VA_PAGER;
2015 break;
2016
2017 case OP_ATTACHMENT_VIEW_TEXT:
2018 mode = MUTT_VA_AS_TEXT;
2019 break;
2020 }
2021
2022 if (mode == MUTT_VA_REGULAR)
2023 {
2024 mutt_attach_display_loop(shared->sub, shared->adata->menu, op,
2025 shared->email, shared->adata->actx, false);
2026 }
2027 else
2028 {
2029 struct AttachPtr *cur_att = current_attachment(shared->adata->actx,
2030 shared->adata->menu);
2031 mutt_view_attachment(NULL, cur_att->body, mode, shared->email,
2032 shared->adata->actx, shared->adata->menu->win);
2033 }
2034
2036 /* no send2hook, since this doesn't modify the message */
2037 return FR_SUCCESS;
2038}
int mutt_view_attachment(FILE *fp, struct Body *b, enum ViewAttachMode mode, struct Email *e, struct AttachCtx *actx, struct MuttWindow *win)
View an attachment.
Definition: mutt_attach.c:419
ViewAttachMode
Options for mutt_view_attachment()
Definition: mutt_attach.h:43
@ MUTT_VA_MAILCAP
Force viewing using mailcap entry.
Definition: mutt_attach.h:45
@ MUTT_VA_REGULAR
View using default method.
Definition: mutt_attach.h:44
@ MUTT_VA_PAGER
View attachment in pager using copiousoutput mailcap.
Definition: mutt_attach.h:47
@ MUTT_VA_AS_TEXT
Force viewing as text.
Definition: mutt_attach.h:46
int mutt_attach_display_loop(struct ConfigSubset *sub, struct Menu *menu, int op, struct Email *e, struct AttachCtx *actx, bool recv)
Event loop for the Attachment menu.
Definition: recvattach.c:962
struct MuttWindow * win
Window holding the Menu.
Definition: lib.h:86
+ Here is the call graph for this function:

◆ op_exit()

static int op_exit ( struct ComposeSharedData shared,
int  op 
)
static

Exit this menu - Implements compose_function_t -.

Definition at line 2043 of file functions.c.

2044{
2045 enum QuadOption ans = query_quadoption(_("Save (postpone) draft message?"),
2046 shared->sub, "postpone");
2047 if (ans == MUTT_NO)
2048 {
2049 for (int i = 0; i < shared->adata->actx->idxlen; i++)
2050 if (shared->adata->actx->idx[i]->unowned)
2051 shared->adata->actx->idx[i]->body->unlink = false;
2052
2053 if (!(shared->flags & MUTT_COMPOSE_NOFREEHEADER))
2054 {
2055 for (int i = 0; i < shared->adata->actx->idxlen; i++)
2056 {
2057 /* avoid freeing other attachments */
2058 shared->adata->actx->idx[i]->body->next = NULL;
2059 if (!shared->adata->actx->idx[i]->body->email)
2060 shared->adata->actx->idx[i]->body->parts = NULL;
2061 mutt_body_free(&shared->adata->actx->idx[i]->body);
2062 }
2063 }
2064 shared->rc = -1;
2065 return FR_DONE;
2066 }
2067 else if (ans == MUTT_ABORT)
2068 {
2069 return FR_NO_ACTION;
2070 }
2071
2072 return op_compose_postpone_message(shared, op);
2073}
#define MUTT_COMPOSE_NOFREEHEADER
Definition: lib.h:50
static int op_compose_postpone_message(struct ComposeSharedData *shared, int op)
Save this message to send later - Implements compose_function_t -.
Definition: functions.c:1863
int flags
Flags, e.g. MUTT_COMPOSE_NOFREEHEADER.
Definition: shared_data.h:43
+ Here is the call graph for this function:

◆ op_forget_passphrase()

static int op_forget_passphrase ( struct ComposeSharedData shared,
int  op 
)
static

Wipe passphrases from memory - Implements compose_function_t -.

Definition at line 2078 of file functions.c.

2079{
2081 return FR_SUCCESS;
2082}
void crypt_forget_passphrase(void)
Forget a passphrase and display a message.
Definition: crypt.c:90
+ Here is the call graph for this function: