NeoMutt  2020-08-07-1-gab41a1
Teaching an old dog new tricks
DOXYGEN
mailbox.c File Reference

Representation of a mailbox. More...

#include "config.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.

Functions

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...
 

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_new()

struct Mailbox* mailbox_new ( void  )

Create a new Mailbox.

Return values
ptrNew Mailbox

Definition at line 42 of file mailbox.c.

43 {
44  struct Mailbox *m = mutt_mem_calloc(1, sizeof(struct Mailbox));
45 
47  m->notify = notify_new();
48 
49  m->email_max = 25;
50  m->emails = mutt_mem_calloc(m->email_max, sizeof(struct Email *));
51  m->v2r = mutt_mem_calloc(m->email_max, sizeof(int));
52 
53  return m;
54 }
struct Email ** emails
Array of Emails.
Definition: mailbox.h:99
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
The envelope/body of an email.
Definition: email.h:37
struct Notify * notify_new(void)
Create a new notifications handler.
Definition: notify.c:49
int email_max
Number of pointers in emails.
Definition: mailbox.h:100
A mailbox.
Definition: mailbox.h:81
int * v2r
Mapping from virtual to real msgno.
Definition: mailbox.h:101
struct Notify * notify
Notifications handler.
Definition: mailbox.h:144
struct Buffer * mutt_buffer_init(struct Buffer *buf)
Initialise a new Buffer.
Definition: buffer.c:46
struct Buffer pathbuf
Definition: mailbox.h:83
+ 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 60 of file mailbox.c.

61 {
62  if (!ptr || !*ptr)
63  return;
64 
65  struct Mailbox *m = *ptr;
66 
68 
69  if (m->mdata && m->mdata_free)
70  m->mdata_free(&m->mdata);
71 
72  for (size_t i = 0; i < m->email_max; i++)
73  email_free(&m->emails[i]);
74 
76  cs_subset_free(&m->sub);
77  FREE(&m->name);
78  FREE(&m->realpath);
79  FREE(&m->emails);
80  FREE(&m->v2r);
81  notify_free(&m->notify);
82 
83  FREE(ptr);
84 }
struct Email ** emails
Array of Emails.
Definition: mailbox.h:99
void notify_free(struct Notify **ptr)
Free a notification handler.
Definition: notify.c:62
char * realpath
Used for duplicate detection, context comparison, and the sidebar.
Definition: mailbox.h:84
void cs_subset_free(struct ConfigSubset **ptr)
Free a Config Subset.
Definition: subset.c:93
Mailbox was closed.
Definition: mailbox.h:170
void(* mdata_free)(void **ptr)
Free the private data attached to the Mailbox.
Definition: mailbox.h:142
char * name
A short name for the Mailbox.
Definition: mailbox.h:85
void mutt_buffer_dealloc(struct Buffer *buf)
Release the memory allocated by a buffer.
Definition: buffer.c:294
void * mdata
Driver specific data.
Definition: mailbox.h:136
int email_max
Number of pointers in emails.
Definition: mailbox.h:100
A mailbox.
Definition: mailbox.h:81
struct ConfigSubset * sub
Inherited config items.
Definition: mailbox.h:86
int * v2r
Mapping from virtual to real msgno.
Definition: mailbox.h:101
#define FREE(x)
Definition: memory.h:40
struct Notify * notify
Notifications handler.
Definition: mailbox.h:144
struct Buffer pathbuf
Definition: mailbox.h:83
void email_free(struct Email **ptr)
Free an Email.
Definition: email.c:43
void mailbox_changed(struct Mailbox *m, enum NotifyMailbox action)
Notify observers of a change to a Mailbox.
Definition: mailbox.c:174
+ 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 91 of file mailbox.c.

92 {
93  if (!path)
94  return NULL;
95 
96  struct stat sb;
97  struct stat tmp_sb;
98 
99  if (stat(path, &sb) != 0)
100  return NULL;
101 
102  struct MailboxList ml = STAILQ_HEAD_INITIALIZER(ml);
104  struct MailboxNode *np = NULL;
105  struct Mailbox *m = NULL;
106  STAILQ_FOREACH(np, &ml, entries)
107  {
108  if ((stat(mailbox_path(np->mailbox), &tmp_sb) == 0) &&
109  (sb.st_dev == tmp_sb.st_dev) && (sb.st_ino == tmp_sb.st_ino))
110  {
111  m = np->mailbox;
112  break;
113  }
114  }
116 
117  return m;
118 }
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox&#39;s path string.
Definition: mailbox.h:201
void neomutt_mailboxlist_clear(struct MailboxList *ml)
Free a Mailbox List.
Definition: neomutt.c:137
Match any Mailbox type.
Definition: mailbox.h:45
size_t neomutt_mailboxlist_get_all(struct MailboxList *head, struct NeoMutt *n, enum MailboxType type)
Get a List of all Mailboxes.
Definition: neomutt.c:160
Container for Accounts, Notifications.
Definition: neomutt.h:36
A mailbox.
Definition: mailbox.h:81
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:349
#define STAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:321
List of Mailboxes.
Definition: mailbox.h:150
struct Mailbox * mailbox
Mailbox in the list.
Definition: mailbox.h:152
+ 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 128 of file mailbox.c.

129 {
130  if (!name)
131  return NULL;
132 
133  struct MailboxList ml = STAILQ_HEAD_INITIALIZER(ml);
135  struct MailboxNode *np = NULL;
136  struct Mailbox *m = NULL;
137  STAILQ_FOREACH(np, &ml, entries)
138  {
139  if (mutt_str_equal(np->mailbox->name, name))
140  {
141  m = np->mailbox;
142  break;
143  }
144  }
146 
147  return m;
148 }
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:876
void neomutt_mailboxlist_clear(struct MailboxList *ml)
Free a Mailbox List.
Definition: neomutt.c:137
Match any Mailbox type.
Definition: mailbox.h:45
size_t neomutt_mailboxlist_get_all(struct MailboxList *head, struct NeoMutt *n, enum MailboxType type)
Get a List of all Mailboxes.
Definition: neomutt.c:160
Container for Accounts, Notifications.
Definition: neomutt.h:36
char * name
A short name for the Mailbox.
Definition: mailbox.h:85
A mailbox.
Definition: mailbox.h:81
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:349
#define STAILQ_HEAD_INITIALIZER(head)
Definition: queue.h:321
List of Mailboxes.
Definition: mailbox.h:150
struct Mailbox * mailbox
Mailbox in the list.
Definition: mailbox.h:152
+ 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 156 of file mailbox.c.

157 {
158  struct stat sb;
159 
160  if (!m)
161  return;
162 
163  if (stat(mailbox_path(m), &sb) == 0)
164  m->size = (off_t) sb.st_size;
165  else
166  m->size = 0;
167 }
static const char * mailbox_path(const struct Mailbox *m)
Get the Mailbox&#39;s path string.
Definition: mailbox.h:201
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 174 of file mailbox.c.

175 {
176  if (!m)
177  return;
178 
179  struct EventMailbox ev_m = { m };
180  notify_send(m->notify, NT_MAILBOX, action, &ev_m);
181 }
An Event that happened to a Mailbox.
Definition: mailbox.h:181
Mailbox has changed, NotifyMailbox, EventMailbox.
Definition: notify_type.h:41
struct Notify * notify
Notifications handler.
Definition: mailbox.h:144
bool notify_send(struct Notify *notify, enum NotifyType event_type, int event_subtype, void *event_data)
Send out a notification message.
Definition: notify.c:152
+ 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 188 of file mailbox.c.

189 {
190  m->size += email_size(e);
191 }
off_t size
Size of the Mailbox.
Definition: mailbox.h:87
size_t email_size(const struct Email *e)
compute the size of an email
Definition: email.c:114
+ 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 198 of file mailbox.c.

199 {
200  m->size -= email_size(e);
201 }
off_t size
Size of the Mailbox.
Definition: mailbox.h:87
size_t email_size(const struct Email *e)
compute the size of an email
Definition: email.c:114
+ 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 209 of file mailbox.c.

210 {
211  if (!m || m->sub || !sub)
212  return false;
213 
214  m->sub = cs_subset_new(m->name, sub, m->notify);
216  return true;
217 }
struct ConfigSubset * cs_subset_new(const char *name, struct ConfigSubset *sub_parent, struct Notify *not_parent)
Create a new Config Subset.
Definition: subset.c:133
char * name
A short name for the Mailbox.
Definition: mailbox.h:85
struct ConfigSubset * sub
Inherited config items.
Definition: mailbox.h:86
enum ConfigScope scope
Scope of Subset, e.g. SET_SCOPE_ACCOUNT.
Definition: subset.h:49
This Config is Mailbox-specific.
Definition: subset.h:40
struct Notify * notify
Notifications handler.
Definition: mailbox.h:144
+ Here is the call graph for this function:
+ Here is the caller graph for this function: