NeoMutt  2020-11-20
Teaching an old dog new tricks
DOXYGEN
email.c
Go to the documentation of this file.
1 
29 #include "config.h"
30 #include <stdbool.h>
31 #include "mutt/lib.h"
32 #include "email.h"
33 #include "body.h"
34 #include "envelope.h"
35 #include "tags.h"
36 
37 void nm_edata_free(void **ptr);
38 
43 void email_free(struct Email **ptr)
44 {
45  if (!ptr || !*ptr)
46  return;
47 
48  struct Email *e = *ptr;
49 
50  if (e->edata && e->edata_free)
51  e->edata_free(&e->edata);
52 
53  mutt_env_free(&e->env);
54  mutt_body_free(&e->body);
55  FREE(&e->tree);
56  FREE(&e->path);
57 #ifdef MIXMASTER
58  mutt_list_free(&e->chain);
59 #endif
60 #ifdef USE_NOTMUCH
62 #endif
64 
65  FREE(ptr);
66 }
67 
72 struct Email *email_new(void)
73 {
74  static size_t sequence = 0;
75 
76  struct Email *e = mutt_mem_calloc(1, sizeof(struct Email));
77 #ifdef MIXMASTER
78  STAILQ_INIT(&e->chain);
79 #endif
80  STAILQ_INIT(&e->tags);
81  e->visible = true;
82  e->sequence = sequence++;
83  return e;
84 }
85 
92 bool email_cmp_strict(const struct Email *e1, const struct Email *e2)
93 {
94  if (e1 && e2)
95  {
96  if ((e1->received != e2->received) || (e1->date_sent != e2->date_sent) ||
97  (e1->body->length != e2->body->length) || (e1->lines != e2->lines) ||
98  (e1->zhours != e2->zhours) || (e1->zminutes != e2->zminutes) ||
99  (e1->zoccident != e2->zoccident) || (e1->mime != e2->mime) ||
100  !mutt_env_cmp_strict(e1->env, e2->env) || !mutt_body_cmp_strict(e1->body, e2->body))
101  {
102  return false;
103  }
104  return true;
105  }
106  else
107  {
108  return (!e1 && !e2);
109  }
110 }
111 
117 size_t email_size(const struct Email *e)
118 {
119  if (!e || !e->body)
120  return 0;
121  return e->body->length + e->body->offset - e->body->hdr_offset;
122 }
123 
130 void emaillist_clear(struct EmailList *el)
131 {
132  if (!el)
133  return;
134 
135  struct EmailNode *en = NULL, *tmp = NULL;
136  STAILQ_FOREACH_SAFE(en, el, entries, tmp)
137  {
138  STAILQ_REMOVE(el, en, EmailNode, entries);
139  FREE(&en);
140  }
141  STAILQ_INIT(el);
142 }
143 
151 int emaillist_add_email(struct EmailList *el, struct Email *e)
152 {
153  if (!el || !e)
154  return -1;
155 
156  struct EmailNode *en = mutt_mem_calloc(1, sizeof(*en));
157  en->email = e;
158  STAILQ_INSERT_TAIL(el, en, entries);
159 
160  return 0;
161 }
162 
172 struct ListNode *header_find(const struct ListHead *hdrlist, const char *header)
173 {
174  const char *key_end = strchr(header, ':');
175  if (!key_end)
176  return NULL;
177 
178  const int keylen = key_end - header + 1;
179 
180  struct ListNode *n = NULL;
181  STAILQ_FOREACH(n, hdrlist, entries)
182  {
183  if (mutt_istrn_equal(n->data, header, keylen))
184  return n;
185  }
186  return n;
187 }
188 
195 struct ListNode *header_add(struct ListHead *hdrlist, const char *header)
196 {
197  struct ListNode *n = mutt_list_insert_tail(hdrlist, NULL);
198  n->data = mutt_str_dup(header);
199 
200  return n;
201 }
202 
209 struct ListNode *header_update(struct ListNode *hdr, const char *header)
210 {
211  FREE(&hdr->data);
212  hdr->data = mutt_str_dup(header);
213 
214  return hdr;
215 }
216 
225 struct ListNode *header_set(struct ListHead *hdrlist, const char *header)
226 {
227  struct ListNode *n = header_find(hdrlist, header);
228 
229  return n ? header_update(n, header) : header_add(hdrlist, header);
230 }
231 
237 void header_free(struct ListHead *hdrlist, struct ListNode *target)
238 {
239  STAILQ_REMOVE(hdrlist, target, ListNode, entries);
240  FREE(&target->data);
241  FREE(&target);
242 }
int lines
How many lines in the body of this message?
Definition: email.h:85
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
#define STAILQ_REMOVE(head, elm, type, field)
Definition: queue.h:399
The envelope/body of an email.
Definition: email.h:37
struct Body * body
List of MIME parts.
Definition: email.h:91
struct ListNode * header_add(struct ListHead *hdrlist, const char *header)
Add a header to a list.
Definition: email.c:195
int emaillist_add_email(struct EmailList *el, struct Email *e)
Add an Email to a list.
Definition: email.c:151
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:370
LOFF_T offset
offset where the actual data begins
Definition: body.h:44
bool mutt_env_cmp_strict(const struct Envelope *e1, const struct Envelope *e2)
Strictly compare two Envelopes.
Definition: envelope.c:241
#define STAILQ_INSERT_TAIL(head, elm, field)
Definition: queue.h:386
bool zoccident
True, if west of UTC, False if east.
Definition: email.h:65
Representation of the body of an email.
void driver_tags_free(struct TagList *list)
Free tags from a header.
Definition: tags.c:104
void mutt_list_free(struct ListHead *h)
Free a List AND its strings.
Definition: list.c:122
void nm_edata_free(void **ptr)
Free data attached to an Email.
Definition: notmuch.c:251
struct ListNode * header_update(struct ListNode *hdr, const char *header)
Update an existing header.
Definition: email.c:209
bool mutt_istrn_equal(const char *a, const char *b, size_t l)
Check for equality of two strings ignoring case (to a maximum), safely.
Definition: string.c:621
bool mutt_body_cmp_strict(const struct Body *b1, const struct Body *b2)
Strictly compare two email Body&#39;s.
Definition: body.c:108
Representation of an email.
#define STAILQ_INIT(head)
Definition: queue.h:369
bool mime
Has a MIME-Version header?
Definition: email.h:42
struct Envelope * env
Envelope information.
Definition: email.h:90
#define STAILQ_FOREACH_SAFE(var, head, field, tvar)
Definition: queue.h:359
struct TagList tags
For drivers that support server tagging.
Definition: email.h:109
time_t date_sent
Time when the message was sent (UTC)
Definition: email.h:82
struct ListNode * mutt_list_insert_tail(struct ListHead *h, char *s)
Append a string to the end of a List.
Definition: list.c:64
bool visible
Is this message part of the view?
Definition: email.h:74
struct ListHead chain
Mixmaster chain.
Definition: email.h:102
LOFF_T length
length (in bytes) of attachment
Definition: body.h:45
Representation of an email header (envelope)
void mutt_env_free(struct Envelope **ptr)
Free an Envelope.
Definition: envelope.c:96
void(* edata_free)(void **ptr)
Free the private data attached to the Email.
Definition: email.h:117
size_t sequence
Sequence number assigned on creation.
Definition: email.h:99
void mutt_body_free(struct Body **ptr)
Free a Body.
Definition: body.c:57
#define STAILQ_FOREACH(var, head, field)
Definition: queue.h:349
unsigned int zhours
Hours away from UTC.
Definition: email.h:63
char * tree
Character string to print thread tree.
Definition: email.h:94
struct ListNode * header_set(struct ListHead *hdrlist, const char *header)
Set a header value in a list.
Definition: email.c:225
void header_free(struct ListHead *hdrlist, struct ListNode *target)
Free and remove a header from a header list.
Definition: email.c:237
bool email_cmp_strict(const struct Email *e1, const struct Email *e2)
Strictly compare message emails.
Definition: email.c:92
char * data
String.
Definition: list.h:36
void emaillist_clear(struct EmailList *el)
Drop a private list of Emails.
Definition: email.c:130
void * edata
Driver-specific data.
Definition: email.h:111
struct Email * email
Email in the list.
Definition: email.h:127
char * path
Path of Email (for local Mailboxes)
Definition: email.h:92
#define FREE(x)
Definition: memory.h:40
Driver based email tags.
struct ListNode * header_find(const struct ListHead *hdrlist, const char *header)
Find a header, matching on its field, in a list of headers.
Definition: email.c:172
List of Emails.
Definition: email.h:125
struct Email * email_new(void)
Create a new Email.
Definition: email.c:72
long hdr_offset
Offset in stream where the headers begin.
Definition: body.h:42
Convenience wrapper for the library headers.
A List node for strings.
Definition: list.h:34
void email_free(struct Email **ptr)
Free an Email.
Definition: email.c:43
unsigned int zminutes
Minutes away from UTC.
Definition: email.h:64
size_t email_size(const struct Email *e)
compute the size of an email
Definition: email.c:117
time_t received
Time when the message was placed in the mailbox.
Definition: email.h:83
void * nm_edata
Notmuch private data.
Definition: email.h:106