NeoMutt  2024-04-25-89-g194907
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
neomutt.c
Go to the documentation of this file.
1
30#include "config.h"
31#include <errno.h>
32#include <locale.h>
33#include <stddef.h>
34#include <stdio.h>
35#include <string.h>
36#include <sys/stat.h>
37#include "mutt/lib.h"
38#include "config/lib.h"
39#include "neomutt.h"
40#include "account.h"
41#include "mailbox.h"
42
43struct NeoMutt *NeoMutt = NULL;
44
50struct NeoMutt *neomutt_new(struct ConfigSet *cs)
51{
52 if (!cs)
53 return NULL;
54
55 struct NeoMutt *n = mutt_mem_calloc(1, sizeof(*NeoMutt));
56
58 n->notify = notify_new();
59 n->sub = cs_subset_new(NULL, NULL, n->notify);
60 n->sub->cs = cs;
62
63 n->time_c_locale = duplocale(LC_GLOBAL_LOCALE);
64 if (n->time_c_locale)
65 n->time_c_locale = newlocale(LC_TIME_MASK, "C", n->time_c_locale);
66
67 if (!n->time_c_locale)
68 {
69 mutt_error("%s", strerror(errno)); // LCOV_EXCL_LINE
70 mutt_exit(1); // LCOV_EXCL_LINE
71 }
72
75
78
79 return n;
80}
81
86void neomutt_free(struct NeoMutt **ptr)
87{
88 if (!ptr || !*ptr)
89 return;
90
91 struct NeoMutt *n = *ptr;
92
98 if (n->time_c_locale)
99 freelocale(n->time_c_locale);
100
101 FREE(ptr);
102}
103
110bool neomutt_account_add(struct NeoMutt *n, struct Account *a)
111{
112 if (!n || !a)
113 return false;
114
115 TAILQ_INSERT_TAIL(&n->accounts, a, entries);
117
118 mutt_debug(LL_NOTIFY, "NT_ACCOUNT_ADD: %s %p\n",
119 mailbox_get_type_name(a->type), (void *) a);
120 struct EventAccount ev_a = { a };
122 return true;
123}
124
133bool neomutt_account_remove(struct NeoMutt *n, const struct Account *a)
134{
135 if (!n || TAILQ_EMPTY(&n->accounts))
136 return false;
137
138 if (!a)
139 {
140 mutt_debug(LL_NOTIFY, "NT_ACCOUNT_DELETE_ALL\n");
141 struct EventAccount ev_a = { NULL };
143 }
144
145 bool result = false;
146 struct Account *np = NULL;
147 struct Account *tmp = NULL;
148 TAILQ_FOREACH_SAFE(np, &n->accounts, entries, tmp)
149 {
150 if (a && (np != a))
151 continue;
152
153 TAILQ_REMOVE(&n->accounts, np, entries);
154 account_free(&np);
155 result = true;
156 if (a)
157 break;
158 }
159 return result;
160}
161
168void neomutt_mailboxlist_clear(struct MailboxList *ml)
169{
170 if (!ml)
171 return;
172
173 struct MailboxNode *mn = NULL;
174 struct MailboxNode *tmp = NULL;
175 STAILQ_FOREACH_SAFE(mn, ml, entries, tmp)
176 {
177 STAILQ_REMOVE(ml, mn, MailboxNode, entries);
178 FREE(&mn);
179 }
180}
181
191size_t neomutt_mailboxlist_get_all(struct MailboxList *head, struct NeoMutt *n,
192 enum MailboxType type)
193{
194 if (!n)
195 return 0;
196
197 size_t count = 0;
198 struct Account *a = NULL;
199 struct MailboxNode *mn = NULL;
200
201 TAILQ_FOREACH(a, &n->accounts, entries)
202 {
203 if ((type > MUTT_UNKNOWN) && (a->type != type))
204 continue;
205
206 STAILQ_FOREACH(mn, &a->mailboxes, entries)
207 {
208 struct MailboxNode *mn2 = mutt_mem_calloc(1, sizeof(*mn2));
209 mn2->mailbox = mn->mailbox;
210 STAILQ_INSERT_TAIL(head, mn2, entries);
211 count++;
212 }
213 }
214
215 return count;
216}
217
230FILE *mutt_file_fopen_masked_full(const char *path, const char *mode,
231 const char *file, int line, const char *func)
232{
233 // Set the user's umask (saved on startup)
234 mode_t old_umask = umask(NeoMutt->user_default_umask);
235 mutt_debug(LL_DEBUG3, "umask set to %03o\n", NeoMutt->user_default_umask);
236
237 // The permissions will be limited by the umask
238 FILE *fp = mutt_file_fopen_full(path, mode, 0666, file, line, func);
239
240 umask(old_umask); // Immediately restore the umask
241 mutt_debug(LL_DEBUG3, "umask set to %03o\n", old_umask);
242
243 return fp;
244}
Convenience wrapper for the config headers.
void account_free(struct Account **ptr)
Free an Account.
Definition: account.c:143
@ NT_ACCOUNT_ADD
Account has been added.
Definition: account.h:69
@ NT_ACCOUNT_DELETE_ALL
All Accounts are about to be deleted.
Definition: account.h:71
const char * mailbox_get_type_name(enum MailboxType type)
Get the type of a Mailbox.
Definition: mailbox.c:326
MailboxType
Supported mailbox formats.
Definition: mailbox.h:41
@ MUTT_UNKNOWN
Mailbox wasn't recognised.
Definition: mailbox.h:44
FILE * mutt_file_fopen_full(const char *path, const char *mode, const mode_t perms, const char *file, int line, const char *func)
Call fopen() safely.
Definition: file.c:666
#define mutt_error(...)
Definition: logging2.h:92
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
@ LL_DEBUG3
Log at debug level 3.
Definition: logging2.h:45
@ LL_NOTIFY
Log of notifications.
Definition: logging2.h:48
Maildir Account.
Maildir Mailbox.
void mutt_exit(int code)
Leave NeoMutt NOW.
Definition: main.c:269
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:51
#define FREE(x)
Definition: memory.h:45
Convenience wrapper for the library headers.
struct Notify * notify_new(void)
Create a new notifications handler.
Definition: notify.c:62
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 notify_set_parent(struct Notify *notify, struct Notify *parent)
Set the parent notification handler.
Definition: notify.c:95
void notify_free(struct Notify **ptr)
Free a notification handler.
Definition: notify.c:75
void neomutt_mailboxlist_clear(struct MailboxList *ml)
Free a Mailbox List.
Definition: neomutt.c:168
bool neomutt_account_add(struct NeoMutt *n, struct Account *a)
Add an Account to the global list.
Definition: neomutt.c:110
size_t neomutt_mailboxlist_get_all(struct MailboxList *head, struct NeoMutt *n, enum MailboxType type)
Get a List of all Mailboxes.
Definition: neomutt.c:191
bool neomutt_account_remove(struct NeoMutt *n, const struct Account *a)
Remove an Account from the global list.
Definition: neomutt.c:133
struct NeoMutt * neomutt_new(struct ConfigSet *cs)
Create the main NeoMutt object.
Definition: neomutt.c:50
FILE * mutt_file_fopen_masked_full(const char *path, const char *mode, const char *file, int line, const char *func)
Wrapper around mutt_file_fopen_full()
Definition: neomutt.c:230
void neomutt_free(struct NeoMutt **ptr)
Free a NeoMutt.
Definition: neomutt.c:86
Container for Accounts, Notifications.
@ NT_ACCOUNT
Account has changed, NotifyAccount, EventAccount.
Definition: notify_type.h:36
#define TAILQ_FOREACH(var, head, field)
Definition: queue.h:725
#define STAILQ_REMOVE(head, elm, type, field)
Definition: queue.h:402
#define TAILQ_FOREACH_SAFE(var, head, field, tvar)
Definition: queue.h:735
#define TAILQ_INIT(head)
Definition: queue.h:765
#define TAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:809
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:352
#define STAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:389
#define TAILQ_REMOVE(head, elm, field)
Definition: queue.h:841
#define STAILQ_FOREACH_SAFE(var, head, field, tvar)
Definition: queue.h:362
#define TAILQ_EMPTY(head)
Definition: queue.h:721
A group of associated Mailboxes.
Definition: account.h:36
enum MailboxType type
Type of Mailboxes this Account contains.
Definition: account.h:37
struct Notify * notify
Notifications: NotifyAccount, EventAccount.
Definition: account.h:41
struct MailboxList mailboxes
List of Mailboxes.
Definition: account.h:40
Container for lots of config items.
Definition: set.h:252
struct ConfigSet * cs
Parent ConfigSet.
Definition: subset.h:51
enum ConfigScope scope
Scope of Subset, e.g. SET_SCOPE_ACCOUNT.
Definition: subset.h:49
An Event that happened to an Account.
Definition: account.h:79
List of Mailboxes.
Definition: mailbox.h:166
struct Mailbox * mailbox
Mailbox in the list.
Definition: mailbox.h:167
Container for Accounts, Notifications.
Definition: neomutt.h:42
struct Notify * notify_timeout
Timeout notifications handler.
Definition: neomutt.h:45
struct Notify * notify_resize
Window resize notifications handler.
Definition: neomutt.h:44
struct AccountList accounts
List of all Accounts.
Definition: neomutt.h:47
mode_t user_default_umask
User's default file writing permissions (inferred from umask)
Definition: neomutt.h:49
struct Notify * notify
Notifications handler.
Definition: neomutt.h:43
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:46
locale_t time_c_locale
Current locale but LC_TIME=C.
Definition: neomutt.h:48
struct ConfigSubset * cs_subset_new(const char *name, struct ConfigSubset *sub_parent, struct Notify *not_parent)
Create a new Config Subset.
Definition: subset.c:152
void cs_subset_free(struct ConfigSubset **ptr)
Free a Config Subset.
Definition: subset.c:108
@ SET_SCOPE_NEOMUTT
This Config is NeoMutt-specific (global)
Definition: subset.h:38