NeoMutt  2023-11-03-107-g582dc1
Teaching an old dog new tricks
No Matches
attach.c File Reference

Compose Attachments. More...

#include "config.h"
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
#include "private.h"
#include "mutt/lib.h"
#include "config/lib.h"
#include "email/lib.h"
#include "core/lib.h"
#include "gui/lib.h"
#include "attach/lib.h"
#include "convert/lib.h"
#include "menu/lib.h"
#include "attach_data.h"
#include "format_flags.h"
#include "muttlib.h"
#include "shared_data.h"
+ Include dependency graph for attach.c:

Go to the source code of this file.


unsigned long cum_attachs_size (struct ConfigSubset *sub, struct ComposeAttachData *adata)
 Cumulative Attachments Size.
static int attach_email_observer (struct NotifyCallback *nc)
 Notification that the Email has changed - Implements observer_t -.
static int attach_config_observer (struct NotifyCallback *nc)
 Notification that a Config Variable has changed - Implements observer_t -.
static int attach_window_observer (struct NotifyCallback *nc)
 Notification that a Window has changed - Implements observer_t -.
static int compose_attach_tag (struct Menu *menu, int sel, int act)
 Tag an attachment - Implements Menu::tag() -.
static void compose_make_entry (struct Menu *menu, char *buf, size_t buflen, int line)
 Format an Attachment for the Menu - Implements Menu::make_entry() -.
struct MuttWindowattach_new (struct MuttWindow *parent, struct ComposeSharedData *shared)
 Create the Attachments Menu.

Detailed Description

Compose Attachments.

  • Richard Russon

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

Definition in file attach.c.

Function Documentation

◆ cum_attachs_size()

unsigned long cum_attachs_size ( struct ConfigSubset sub,
struct ComposeAttachData adata 

Cumulative Attachments Size.

subConfig Subset
adataAttachment data
Return values
numBytes in attachments

Returns the total number of bytes used by the attachments in the attachment list after content-transfer-encodings have been applied.

Definition at line 85 of file attach.c.

87 if (!adata || !adata->actx)
88 return 0;
90 size_t s = 0;
91 struct Content *info = NULL;
92 struct Body *b = NULL;
93 struct AttachCtx *actx = adata->actx;
94 struct AttachPtr **idx = actx->idx;
96 for (unsigned short i = 0; i < actx->idxlen; i++)
97 {
98 b = idx[i]->body;
100 if (!b->content)
101 b->content = mutt_get_content_info(b->filename, b, sub);
103 info = b->content;
104 if (info)
105 {
106 switch (b->encoding)
107 {
109 s += 3 * (info->lobin + info->hibin) + info->ascii + info->crlf;
110 break;
111 case ENC_BASE64:
112 s += (4 * (info->lobin + info->hibin + info->ascii + info->crlf)) / 3;
113 break;
114 default:
115 s += info->lobin + info->hibin + info->ascii + info->crlf;
116 break;
117 }
118 }
119 }
121 return s;
struct Content * mutt_get_content_info(const char *fname, struct Body *b, struct ConfigSubset *sub)
Analyze file to determine MIME encoding to use.
Definition: content_info.c:187
Base-64 encoded text.
Definition: mime.h:52
Quoted-printable text.
Definition: mime.h:51
A set of attachments.
Definition: attach.h:51
struct AttachPtr ** idx
Array of attachments.
Definition: attach.h:55
short idxlen
Number of attachmentes.
Definition: attach.h:56
An email to which things will be attached.
Definition: attach.h:35
struct Body * body
Definition: attach.h:36
The body of an email.
Definition: body.h:36
struct Content * content
Detailed info about the content of the attachment.
Definition: body.h:69
unsigned int encoding
content-transfer-encoding, ContentEncoding
Definition: body.h:41
char * filename
When sending a message, this is the file to which this structure refers.
Definition: body.h:58
struct AttachCtx * actx
Set of attachments.
Definition: attach_data.h:34
Info about an attachment.
Definition: content.h:35
long crlf
\r and \n characters
Definition: content.h:39
long hibin
8-bit characters
Definition: content.h:36
long ascii
Number of ascii chars.
Definition: content.h:40
long lobin
Unprintable 7-bit chars (eg., control chars)
Definition: content.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ attach_window_observer()

static int attach_window_observer ( struct NotifyCallback nc)

Notification that a Window has changed - Implements observer_t -.

Definition at line 168 of file attach.c.

170 if (nc->event_type != NT_WINDOW)
171 return 0;
172 if (!nc->global_data || !nc->event_data)
173 return -1;
175 struct MuttWindow *win_attach = nc->global_data;
176 struct EventWindow *ev_w = nc->event_data;
177 if (ev_w->win != win_attach)
178 return 0;
181 {
182 win_attach->actions |= WA_RECALC;
183 mutt_debug(LL_DEBUG5, "window state done, request WA_RECALC\n");
184 }
185 else if (nc->event_subtype == NT_WINDOW_DELETE)
186 {
187 struct Menu *menu = win_attach->wdata;
188 struct ComposeAttachData *adata = menu->mdata;
189 struct AttachCtx *actx = adata->actx;
192 notify_observer_remove(win_attach->notify, attach_window_observer, win_attach);
193 mutt_debug(LL_DEBUG5, "window delete done\n");
194 }
196 return 0;
static int attach_window_observer(struct NotifyCallback *nc)
Notification that a Window has changed - Implements observer_t -.
Definition: attach.c:168
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
static int attach_email_observer(struct NotifyCallback *nc)
Notification that the Email has changed - Implements observer_t -.
Definition: attach.c:127
static int attach_config_observer(struct NotifyCallback *nc)
Notification that a Config Variable has changed - Implements observer_t -.
Definition: dlg_attach.c:109
Log at debug level 5.
Definition: logging2.h:47
bool notify_observer_remove(struct Notify *notify, const observer_t callback, const void *global_data)
Remove an observer from an object.
Definition: notify.c:230
#define WA_RECALC
Recalculate the contents of the Window.
Definition: mutt_window.h:110
Window state has changed, e.g. WN_VISIBLE.
Definition: mutt_window.h:230
Window is about to be deleted.
Definition: mutt_window.h:229
MuttWindow has changed, NotifyWindow, EventWindow.
Definition: notify_type.h:57
struct Email * email
Used by recvattach for updating.
Definition: attach.h:52
Data to fill the Compose Attach Window.
Definition: attach_data.h:33
struct Menu * menu
Menu displaying the attachments.
Definition: attach_data.h:35
struct Notify * notify
Notifications: NotifyConfig, EventConfig.
Definition: subset.h:52
struct Notify * notify
Notifications: NotifyEmail, EventEmail.
Definition: email.h:71
An Event that happened to a Window.
Definition: mutt_window.h:239
struct MuttWindow * win
Window that changed.
Definition: mutt_window.h:240
Definition: lib.h:70
void * mdata
Private data.
Definition: lib.h:137
void * wdata
Private data.
Definition: mutt_window.h:145
struct Notify * notify
Notifications: NotifyWindow, EventWindow.
Definition: mutt_window.h:138
WindowActionFlags actions
Actions to be performed, e.g. WA_RECALC.
Definition: mutt_window.h:132
Container for Accounts, Notifications.
Definition: neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:45
void * event_data
Data from notify_send()
Definition: observer.h:38
enum NotifyType event_type
Send: Event type, e.g. NT_ACCOUNT.
Definition: observer.h:36
int event_subtype
Send: Event subtype, e.g. NT_ACCOUNT_ADD.
Definition: observer.h:37
void * global_data
Data from notify_observer_add()
Definition: observer.h:39
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ attach_new()

struct MuttWindow * attach_new ( struct MuttWindow parent,
struct ComposeSharedData shared 

Create the Attachments Menu.

parentParent Window
sharedShared compose data

Definition at line 236 of file attach.c.

238 struct MuttWindow *win_attach = menu_window_new(MENU_COMPOSE, NeoMutt->sub);
240 struct ComposeAttachData *adata = attach_data_new(shared->email);
242 shared->adata = adata;
244 // NT_COLOR is handled by the Menu Window
249 struct Menu *menu = win_attach->wdata;
250 menu->page_len = win_attach->state.rows;
251 menu->win = win_attach;
254 menu->tag = compose_attach_tag;
255 menu->mdata = adata;
257 adata->menu = menu;
259 return win_attach;
struct ComposeAttachData * attach_data_new(struct Email *e)
Create new Compose Attach Data.
Definition: attach_data.c:54
static void compose_make_entry(struct Menu *menu, char *buf, size_t buflen, int line)
Format an Attachment for the Menu - Implements Menu::make_entry() -.
Definition: attach.c:218
void attach_data_free(struct Menu *menu, void **ptr)
Free the Compose Attach Data - Implements Menu::mdata_free() -.
Definition: attach_data.c:37
static int compose_attach_tag(struct Menu *menu, int sel, int act)
Tag an attachment - Implements Menu::tag() -.
Definition: attach.c:202
struct MuttWindow * menu_window_new(enum MenuType type, struct ConfigSubset *sub)
Create a new Menu Window.
Definition: window.c:140
bool notify_observer_add(struct Notify *notify, enum NotifyType type, observer_t callback, void *global_data)
Add an observer to an object.
Definition: notify.c:191
Config has changed, NotifyConfig, EventConfig.
Definition: notify_type.h:43
Email has changed, NotifyEmail, EventEmail.
Definition: notify_type.h:44
struct ComposeAttachData * adata
Definition: shared_data.h:39
struct Email * email
Email being composed.
Definition: shared_data.h:38
struct MuttWindow * win
Window holding the Menu.
Definition: lib.h:77
void(* make_entry)(struct Menu *menu, char *buf, size_t buflen, int line)
Definition: lib.h:96
void(* mdata_free)(struct Menu *menu, void **ptr)
Definition: lib.h:151
int(* tag)(struct Menu *menu, int sel, int act)
Definition: lib.h:121
int page_len
Number of entries per screen.
Definition: lib.h:75
struct WindowState state
Current state of the Window.
Definition: mutt_window.h:127
short rows
Number of rows, can be MUTT_WIN_SIZE_UNLIMITED.
Definition: mutt_window.h:61
Compose an email.
Definition: type.h:42
+ Here is the call graph for this function:
+ Here is the caller graph for this function: