NeoMutt  2021-10-29-225-gb9986f
Teaching an old dog new tricks
DOXYGEN
mailbox.c File Reference

Representation of a mailbox. More...

#include "config.h"
#include <assert.h>
#include <sys/stat.h>
#include "config/lib.h"
#include "email/lib.h"
#include "mailbox.h"
#include "neomutt.h"
+ Include dependency graph for mailbox.c:

Go to the source code of this file.

Data Structures

struct  EmailGarbageCollector
 Email garbage collection. More...
 

Functions

int mailbox_gen (void)
 Get the next generation number. More...
 
struct Mailboxmailbox_new (void)
 Create a new Mailbox. More...
 
void mailbox_free (struct Mailbox **ptr)
 Free a Mailbox. More...
 
struct Mailboxmailbox_find (const char *path)
 Find the mailbox with a given path. More...
 
struct Mailboxmailbox_find_name (const char *name)
 Find the mailbox with a given name. More...
 
void mailbox_update (struct Mailbox *m)
 Get the mailbox's current size. More...
 
void mailbox_changed (struct Mailbox *m, enum NotifyMailbox action)
 Notify observers of a change to a Mailbox. More...
 
void mailbox_size_add (struct Mailbox *m, const struct Email *e)
 Add an email's size to the total size of a Mailbox. More...
 
void mailbox_size_sub (struct Mailbox *m, const struct Email *e)
 Subtract an email's size from the total size of a Mailbox. More...
 
bool mailbox_set_subset (struct Mailbox *m, struct ConfigSubset *sub)
 Set a Mailbox's Config Subset. More...
 
void mailbox_gc_add (struct Email *e)
 Add an Email to the garbage-collection set. More...
 
void mailbox_gc_run (void)
 Run the garbage-collection. More...
 
const char * mailbox_get_type_name (enum MailboxType type)
 Get the type of a Mailbox. More...
 

Variables

static const struct Mapping MailboxTypes []
 Lookups for Mailbox types. More...
 
static struct EmailGarbageCollector gc = { 0 }
 

Detailed Description

Representation of a mailbox.

Authors
  • Michael R. Elkins
  • Kevin J. McCarthy
  • 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 http://www.gnu.org/licenses/.

Definition in file mailbox.c.

Function Documentation

◆ mailbox_gen()

int mailbox_gen ( void  )

Get the next generation number.

Definition at line 58 of file mailbox.c.

59 {
60  static int gen = 0;
61  return gen++;
62 }
+ Here is the caller graph for this function:

◆ mailbox_new()

struct Mailbox* mailbox_new ( void  )

Create a new Mailbox.

Return values
ptrNew Mailbox

Definition at line 68 of file mailbox.c.

69 {
70  struct Mailbox *m = mutt_mem_calloc(1, sizeof(struct Mailbox));
71 
73  m->notify = notify_new();
74 
75  m->email_max = 25;
76  m->emails = mutt_mem_calloc(m->email_max, sizeof(struct Email *));
77  m->v2r = mutt_mem_calloc(m->email_max, sizeof(int));
78  m->gen = mailbox_gen();
79 
80  return m;
81 }
struct Buffer * mutt_buffer_init(struct Buffer *buf)
Initialise a new Buffer.
Definition: buffer.c:46
int mailbox_gen(void)
Get the next generation number.
Definition: mailbox.c:58
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
struct Notify * notify_new(void)
Create a new notifications handler.
Definition: notify.c:60
The envelope/body of an email.
Definition: email.h:37
A mailbox.
Definition: mailbox.h:82
int * v2r
Mapping from virtual to real msgno.
Definition: mailbox.h:101
int email_max
Number of pointers in emails.
Definition: mailbox.h:100
struct Email ** emails
Array of Emails.
Definition: mailbox.h:99
struct Notify * notify
Notifications: NotifyMailbox, EventMailbox.
Definition: mailbox.h:148
struct Buffer pathbuf
Path of the Mailbox.
Definition: mailbox.h:83
int gen
Generation number, for sorting.
Definition: mailbox.h:150
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_free()

void mailbox_free ( struct Mailbox **  ptr)

Free a Mailbox.

Parameters
[out]ptrMailbox to free

Definition at line 87 of file mailbox.c.

88 {
89  if (!ptr || !*ptr)
90  return;
91 
92  struct Mailbox *m = *ptr;
93 
94  mutt_debug(LL_NOTIFY, "NT_MAILBOX_DELETE: %s %p\n", mailbox_get_type_name(m->type), m);
95  struct EventMailbox ev_m = { m };
97 
98  mutt_debug(LL_NOTIFY, "NT_EMAIL_DELETE_ALL\n");
99  struct EventEmail ev_e = { 0, NULL };
101 
102  for (size_t i = 0; i < m->email_max; i++)
103  email_free(&m->emails[i]);
104 
105  if (m->mdata_free && m->mdata)
106  m->mdata_free(&m->mdata);
107 
109  cs_subset_free(&m->sub);
110  FREE(&m->name);
111  FREE(&m->realpath);
112  FREE(&m->emails);
113  FREE(&m->v2r);
114  notify_free(&m->notify);
115  mailbox_gc_run();
116 
117  /* The NT_MAILBOX_DELETE notification might already have caused *ptr to be NULL,
118  * so call free() on the m pointer */
119  *ptr = NULL;
120  FREE(&m);
121 }
void mutt_buffer_dealloc(struct Buffer *buf)
Release the memory allocated by a buffer.
Definition: buffer.c:294
void email_free(struct Email **ptr)
Free an Email.
Definition: email.c:44
@ NT_EMAIL_DELETE_ALL
All the Emails are about to be deleted.
Definition: email.h:149
#define mutt_debug(LEVEL,...)
Definition: logging.h:84
@ LL_NOTIFY
Log of notifications.
Definition: logging.h:45
void mailbox_gc_run(void)
Run the garbage-collection.
Definition: mailbox.c:285
const char * mailbox_get_type_name(enum MailboxType type)
Get the type of a Mailbox.
Definition: mailbox.c:299
@ NT_MAILBOX_DELETE
Mailbox is about to be deleted.
Definition: mailbox.h:174
#define FREE(x)
Definition: memory.h:40
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition: notify.c:171
void notify_free(struct Notify **ptr)
Free a notification handler.
Definition: notify.c:73
@ NT_EMAIL
Email has changed, NotifyEmail, EventEmail.
Definition: notify_type.h:44
@ NT_MAILBOX
Mailbox has changed, NotifyMailbox, EventMailbox.
Definition: notify_type.h:48
An Event that happened to an Email.
Definition: email.h:157
An Event that happened to a Mailbox.
Definition: mailbox.h:191
void(* mdata_free)(void **ptr)
Free the private data attached to the Mailbox.
Definition: mailbox.h:146
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
Definition: mailbox.h:84
enum MailboxType type
Mailbox type.
Definition: mailbox.h:105
void * mdata
Driver specific data.
Definition: mailbox.h:136
char * name
A short name for the Mailbox.
Definition: mailbox.h:85
struct ConfigSubset * sub
Inherited config items.
Definition: mailbox.h:86
void cs_subset_free(struct ConfigSubset **ptr)
Free a Config Subset.
Definition: subset.c:104
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_find()

struct Mailbox* mailbox_find ( const char *  path)

Find the mailbox with a given path.

Parameters
pathPath to match
Return values
ptrMatching Mailbox

Definition at line 128 of file mailbox.c.

129 {
130  if (!path)
131  return NULL;
132 
133  struct stat st = { 0 };
134  struct stat st_tmp = { 0 };
135 
136  if (stat(path, &st) != 0)
137  return NULL;
138 
139  struct MailboxList ml = STAILQ_HEAD_INITIALIZER(ml);
141  struct MailboxNode *np = NULL;
142  struct Mailbox *m = NULL;
143  STAILQ_FOREACH(np, &ml, entries)
144  {
145  if ((stat(mailbox_path(np->mailbox), &st_tmp) == 0) &&
146  (st.st_dev == st_tmp.st_dev) && (st.st_ino == st_tmp.st_ino))
147  {
148  m = np->mailbox;
149  break;
150  }
151  }
153 
154  return m;
155 }
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox's path string.
Definition: mailbox.h:215
@ MUTT_MAILBOX_ANY
Match any Mailbox type.
Definition: mailbox.h:45
void neomutt_mailboxlist_clear(struct MailboxList *ml)
Free a Mailbox List.
Definition: neomutt.c:141
size_t neomutt_mailboxlist_get_all(struct MailboxList *head, struct NeoMutt *n, enum MailboxType type)
Get a List of all Mailboxes.
Definition: neomutt.c:164
#define STAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:324
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
List of Mailboxes.
Definition: mailbox.h:157
struct Mailbox * mailbox
Mailbox in the list.
Definition: mailbox.h:158
Container for Accounts, Notifications.
Definition: neomutt.h:37
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_find_name()

struct Mailbox* mailbox_find_name ( const char *  name)

Find the mailbox with a given name.

Parameters
nameName to match
Return values
ptrMatching Mailbox
NULLNo matching mailbox found
Note
This searches across all Accounts

Definition at line 165 of file mailbox.c.

166 {
167  if (!name)
168  return NULL;
169 
170  struct MailboxList ml = STAILQ_HEAD_INITIALIZER(ml);
172  struct MailboxNode *np = NULL;
173  struct Mailbox *m = NULL;
174  STAILQ_FOREACH(np, &ml, entries)
175  {
176  if (mutt_str_equal(np->mailbox->name, name))
177  {
178  m = np->mailbox;
179  break;
180  }
181  }
183 
184  return m;
185 }
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:715
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_update()

void mailbox_update ( struct Mailbox m)

Get the mailbox's current size.

Parameters
mMailbox to check
Note
Only applies to local Mailboxes

Definition at line 193 of file mailbox.c.

194 {
195  struct stat st = { 0 };
196 
197  if (!m)
198  return;
199 
200  if (stat(mailbox_path(m), &st) == 0)
201  m->size = (off_t) st.st_size;
202  else
203  m->size = 0;
204 }
off_t size
Size of the Mailbox.
Definition: mailbox.h:87
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_changed()

void mailbox_changed ( struct Mailbox m,
enum NotifyMailbox  action 
)

Notify observers of a change to a Mailbox.

Parameters
mMailbox
actionChange to Mailbox

Definition at line 211 of file mailbox.c.

212 {
213  if (!m)
214  return;
215 
216  mutt_debug(LL_NOTIFY, "NT_MAILBOX_CHANGE: %s %p\n", mailbox_get_type_name(m->type), m);
217  struct EventMailbox ev_m = { m };
218  notify_send(m->notify, NT_MAILBOX, action, &ev_m);
219 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_size_add()

void mailbox_size_add ( struct Mailbox m,
const struct Email e 
)

Add an email's size to the total size of a Mailbox.

Parameters
mMailbox
eEmail

Definition at line 226 of file mailbox.c.

227 {
228  m->size += email_size(e);
229 }
size_t email_size(const struct Email *e)
Compute the size of an email.
Definition: email.c:125
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_size_sub()

void mailbox_size_sub ( struct Mailbox m,
const struct Email e 
)

Subtract an email's size from the total size of a Mailbox.

Parameters
mMailbox
eEmail

Definition at line 236 of file mailbox.c.

237 {
238  m->size -= email_size(e);
239 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_set_subset()

bool mailbox_set_subset ( struct Mailbox m,
struct ConfigSubset sub 
)

Set a Mailbox's Config Subset.

Parameters
mMailbox
subParent Config Subset
Return values
trueSuccess

Definition at line 247 of file mailbox.c.

248 {
249  if (!m || m->sub || !sub)
250  return false;
251 
252  m->sub = cs_subset_new(m->name, sub, m->notify);
254  return true;
255 }
enum ConfigScope scope
Scope of Subset, e.g. SET_SCOPE_ACCOUNT.
Definition: subset.h:49
struct ConfigSubset * cs_subset_new(const char *name, struct ConfigSubset *sub_parent, struct Notify *not_parent)
Create a new Config Subset.
Definition: subset.c:144
@ SET_SCOPE_MAILBOX
This Config is Mailbox-specific.
Definition: subset.h:40
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_gc_add()

void mailbox_gc_add ( struct Email e)

Add an Email to the garbage-collection set.

Parameters
eEmail
Precondition
e != NULL

Definition at line 271 of file mailbox.c.

272 {
273  assert(e);
274  if (gc.idx == mutt_array_size(gc.arr))
275  {
276  mailbox_gc_run();
277  }
278  gc.arr[gc.idx] = e;
279  gc.idx++;
280 }
static struct EmailGarbageCollector gc
#define mutt_array_size(x)
Definition: memory.h:33
size_t idx
Current position.
Definition: mailbox.c:263
struct Email * arr[10]
Array of Emails to be deleted.
Definition: mailbox.c:262
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_gc_run()

void mailbox_gc_run ( void  )

Run the garbage-collection.

Definition at line 285 of file mailbox.c.

286 {
287  for (size_t i = 0; i < gc.idx; i++)
288  {
289  email_free(&gc.arr[i]);
290  }
291  gc.idx = 0;
292 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mailbox_get_type_name()

const char* mailbox_get_type_name ( enum MailboxType  type)

Get the type of a Mailbox.

Parameters
typeMailbox type, e.g. MUTT_IMAP
Return values
ptrString describing Mailbox type

Definition at line 299 of file mailbox.c.

300 {
301  const char *name = mutt_map_get_name(type, MailboxTypes);
302  if (name)
303  return name;
304  return "UNKNOWN";
305 }
static const struct Mapping MailboxTypes[]
Lookups for Mailbox types.
Definition: mailbox.c:40
const char * mutt_map_get_name(int val, const struct Mapping *map)
Lookup a string for a constant.
Definition: mapping.c:42
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ MailboxTypes

const struct Mapping MailboxTypes[]
static
Initial value:
= {
{ "compressed", MUTT_COMPRESSED },
{ "imap", MUTT_IMAP },
{ "maildir", MUTT_MAILDIR },
{ "mbox", MUTT_MBOX },
{ "mh", MUTT_MH },
{ "mmdf", MUTT_MMDF },
{ "nntp", MUTT_NNTP },
{ "notmuch", MUTT_NOTMUCH },
{ "pop", MUTT_POP },
{ NULL, 0 },
}
@ MUTT_NOTMUCH
'Notmuch' (virtual) Mailbox type
Definition: mailbox.h:54
@ MUTT_MMDF
'mmdf' Mailbox type
Definition: mailbox.h:49
@ MUTT_POP
'POP3' Mailbox type
Definition: mailbox.h:55
@ MUTT_MH
'MH' Mailbox type
Definition: mailbox.h:50
@ MUTT_NNTP
'NNTP' (Usenet) Mailbox type
Definition: mailbox.h:52
@ MUTT_IMAP
'IMAP' Mailbox type
Definition: mailbox.h:53
@ MUTT_MBOX
'mbox' Mailbox type
Definition: mailbox.h:48
@ MUTT_COMPRESSED
Compressed file Mailbox type.
Definition: mailbox.h:56
@ MUTT_MAILDIR
'Maildir' Mailbox type
Definition: mailbox.h:51

Lookups for Mailbox types.

Definition at line 1 of file mailbox.c.

◆ gc

struct EmailGarbageCollector gc = { 0 }
static