NeoMutt  2022-04-29-247-gc6aae8
Teaching an old dog new tricks
DOXYGEN
multipart.c
Go to the documentation of this file.
1
30#include "config.h"
31#include <stddef.h>
32#include <stdbool.h>
33#include "mutt/lib.h"
34#include "email/lib.h"
35#include "multipart.h"
36#include "sendlib.h"
37
43static int get_toplevel_encoding(struct Body *a)
44{
45 int e = ENC_7BIT;
46
47 for (; a; a = a->next)
48 {
49 if (a->encoding == ENC_BINARY)
50 return ENC_BINARY;
51 if (a->encoding == ENC_8BIT)
52 e = ENC_8BIT;
53 }
54
55 return e;
56}
57
64static bool check_boundary(const char *boundary, struct Body *b)
65{
66 char *p = NULL;
67
68 if (b->parts && check_boundary(boundary, b->parts))
69 return true;
70
71 if (b->next && check_boundary(boundary, b->next))
72 return true;
73
74 p = mutt_param_get(&b->parameter, "boundary");
75 if (p && mutt_str_equal(p, boundary))
76 {
77 return true;
78 }
79 return false;
80}
81
86void mutt_generate_boundary(struct ParameterList *pl)
87{
88 char rs[MUTT_RANDTAG_LEN + 1];
89
90 mutt_rand_base32(rs, sizeof(rs) - 1);
91 rs[MUTT_RANDTAG_LEN] = 0;
92 mutt_param_set(pl, "boundary", rs);
93}
94
100struct Body *mutt_make_multipart(struct Body *b)
101{
102 struct Body *new_body = mutt_body_new();
103 new_body->type = TYPE_MULTIPART;
104 new_body->subtype = mutt_str_dup("mixed");
105 new_body->encoding = get_toplevel_encoding(b);
106 do
107 {
109 if (check_boundary(mutt_param_get(&new_body->parameter, "boundary"), b))
110 mutt_param_delete(&new_body->parameter, "boundary");
111 } while (!mutt_param_get(&new_body->parameter, "boundary"));
112 new_body->use_disp = false;
113 new_body->disposition = DISP_INLINE;
114 new_body->parts = b;
115
116 return new_body;
117}
118
127{
128 struct Body *t = NULL;
129
130 if (b->parts)
131 {
132 t = b;
133 b = b->parts;
134 t->parts = NULL;
135 mutt_body_free(&t);
136 }
137 return b;
138}
void mutt_body_free(struct Body **ptr)
Free a Body.
Definition: body.c:57
struct Body * mutt_body_new(void)
Create a new Body.
Definition: body.c:43
Structs that make up an email.
@ ENC_7BIT
7-bit text
Definition: mime.h:49
@ ENC_BINARY
Binary.
Definition: mime.h:53
@ ENC_8BIT
8-bit text
Definition: mime.h:50
@ TYPE_MULTIPART
Type: 'multipart/*'.
Definition: mime.h:37
@ DISP_INLINE
Content is inline.
Definition: mime.h:62
struct Body * mutt_remove_multipart(struct Body *b)
Extract the multipart body if it exists.
Definition: multipart.c:126
static bool check_boundary(const char *boundary, struct Body *b)
Check for duplicate boundary.
Definition: multipart.c:64
static int get_toplevel_encoding(struct Body *a)
Find the most restrictive encoding type.
Definition: multipart.c:43
struct Body * mutt_make_multipart(struct Body *b)
Create a multipart email.
Definition: multipart.c:100
void mutt_generate_boundary(struct ParameterList *pl)
Create a unique boundary id for a MIME part.
Definition: multipart.c:86
Manipulate multipart Emails.
Convenience wrapper for the library headers.
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:250
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
Definition: string.c:807
char * mutt_param_get(const struct ParameterList *pl, const char *s)
Find a matching Parameter.
Definition: parameter.c:84
void mutt_param_delete(struct ParameterList *pl, const char *attribute)
Delete a matching Parameter.
Definition: parameter.c:142
void mutt_param_set(struct ParameterList *pl, const char *attribute, const char *value)
Set a Parameter.
Definition: parameter.c:110
void mutt_rand_base32(char *buf, size_t buflen)
Fill a buffer with a base32-encoded random string.
Definition: random.c:102
Miscellaneous functions for sending an email.
#define MUTT_RANDTAG_LEN
Definition: sendlib.h:35
The body of an email.
Definition: body.h:36
struct Body * parts
parts of a multipart or message/rfc822
Definition: body.h:72
struct ParameterList parameter
Parameters of the content-type.
Definition: body.h:62
bool use_disp
Content-Disposition uses filename= ?
Definition: body.h:47
unsigned int disposition
content-disposition, ContentDisposition
Definition: body.h:42
struct Body * next
next attachment in the list
Definition: body.h:71
char * subtype
content-type subtype
Definition: body.h:60
unsigned int encoding
content-transfer-encoding, ContentEncoding
Definition: body.h:41
unsigned int type
content-type primary type, ContentType
Definition: body.h:40