1 /* GNU Mailutils -- a suite of utilities for electronic mail
2    Copyright (C) 1999-2021 Free Software Foundation, Inc.
3 
4    This library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 3 of the License, or (at your option) any later version.
8 
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General
15    Public License along with this library.  If not, see
16    <http://www.gnu.org/licenses/>. */
17 
18 #ifndef _MAILUTILS_MESSAGE_H
19 #define _MAILUTILS_MESSAGE_H
20 
21 #include <mailutils/types.h>
22 #include <mailutils/datetime.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #define MU_SCAN_SEEK  0x01
29 #define MU_SCAN_SIZE  0x02
30 
31 struct mu_imapenvelope
32 {
33   struct tm date;
34   struct mu_timezone tz;
35   char *subject;
36   mu_address_t from;
37   mu_address_t sender;
38   mu_address_t reply_to;
39   mu_address_t to;
40   mu_address_t cc;
41   mu_address_t bcc;
42   char *in_reply_to;
43   char *message_id;
44 };
45 
46 enum mu_message_type
47   {
48     mu_message_other,
49     mu_message_text,     /* text/plain */
50     mu_message_rfc822,   /* message/rfc822 */
51     mu_message_multipart /* multipart/mixed */
52   };
53 
54 struct mu_bodystructure
55 {
56   enum mu_message_type body_message_type;
57   char *body_type;
58   char *body_subtype;
59   mu_assoc_t body_param;
60   char *body_id;
61   char *body_descr;
62   char *body_encoding;
63   size_t body_size;
64   /* Optional */
65   char *body_md5;
66   char *body_disposition;
67   mu_assoc_t body_disp_param;
68   char *body_language;
69   char *body_location;
70   union
71   {
72     struct
73     {
74       size_t body_lines;
75     } text;
76     struct
77     {
78       struct mu_imapenvelope *body_env;
79       struct mu_bodystructure *body_struct;
80       size_t body_lines;
81     } rfc822;
82     struct
83     {
84       mu_list_t body_parts;
85     } multipart;
86   } v;
87 };
88 
89 struct mu_message_scan
90 {
91   int flags;
92   mu_off_t message_start;
93   mu_off_t message_size;
94 
95   mu_off_t body_start;
96   mu_off_t body_end;
97   size_t header_lines;
98   size_t body_lines;
99   int attr_flags;
100 };
101 
102 int mu_stream_scan_message (mu_stream_t stream, struct mu_message_scan *sp);
103 
104 /* A message is considered to be a container for:
105   mu_header_t, mu_body_t, and its mu_attribute_t.  */
106 
107 extern int mu_message_create (mu_message_t *, void *owner);
108 extern void mu_message_destroy (mu_message_t *, void *owner);
109 
110 extern int mu_message_create_copy (mu_message_t *to, mu_message_t from);
111 
112 extern void *mu_message_get_owner (mu_message_t);
113 
114 #define MU_MSG_ATTRIBUTE_MODIFIED 0x01
115 #define MU_MSG_HEADER_MODIFIED    0x02
116 #define MU_MSG_BODY_MODIFIED      0x04
117 
118 extern int mu_message_is_modified (mu_message_t);
119 extern int mu_message_clear_modified (mu_message_t);
120 extern int mu_message_get_mailbox (mu_message_t, mu_mailbox_t *);
121 extern int mu_message_set_mailbox (mu_message_t, mu_mailbox_t, void *);
122 
123 extern void mu_message_ref (mu_message_t);
124 extern void mu_message_unref (mu_message_t);
125 
126 extern int mu_message_get_envelope (mu_message_t, mu_envelope_t *);
127 extern int mu_message_set_envelope (mu_message_t, mu_envelope_t, void *);
128 
129 extern int mu_message_reconstruct_envelope (mu_message_t msg,
130 					    mu_envelope_t *penv);
131 
132 extern int mu_message_get_header (mu_message_t, mu_header_t *);
133 extern int mu_message_set_header (mu_message_t, mu_header_t, void *);
134 
135 extern int mu_message_get_body (mu_message_t, mu_body_t *);
136 extern int mu_message_set_body (mu_message_t, mu_body_t, void *);
137 
138 extern int mu_message_get_streamref (mu_message_t, mu_stream_t *);
139 
140 extern int mu_message_set_stream (mu_message_t, mu_stream_t, void *);
141 
142 extern int mu_message_get_attribute (mu_message_t, mu_attribute_t *);
143 extern int mu_message_set_attribute (mu_message_t, mu_attribute_t, void *);
144 
145 extern int mu_message_get_observable (mu_message_t, mu_observable_t *);
146 
147 extern int mu_message_set_get_stream (mu_message_t,
148 				      int (*) (mu_message_t, mu_stream_t *),
149 				      void *);
150 extern int mu_message_is_multipart (mu_message_t, int *);
151 extern int mu_message_set_is_multipart (mu_message_t,
152 					int (*_is_multipart) (mu_message_t,
153 							      int *),
154 					void *);
155 
156 extern int mu_message_size (mu_message_t, size_t *);
157 extern int mu_message_set_size (mu_message_t,
158 				int (*_size) (mu_message_t, size_t *),
159 				void *owner);
160 
161 extern int mu_message_lines (mu_message_t, size_t *);
162 extern int mu_message_quick_lines (mu_message_t, size_t *);
163 extern int mu_message_set_lines (mu_message_t,
164 				 int (*_lines) (mu_message_t, size_t *, int),
165 				 void *owner);
166 
167 extern int mu_message_get_num_parts (mu_message_t, size_t *nparts);
168 extern int mu_message_set_get_num_parts (mu_message_t,
169 					 int (*_get_num_parts) (mu_message_t,
170 								size_t *),
171 					 void *owner);
172 
173 extern int mu_message_get_part (mu_message_t, size_t, mu_message_t *);
174 extern int mu_message_set_get_part (mu_message_t,
175 				    int (*_get_part) (mu_message_t, size_t,
176 						      mu_message_t *),
177 				    void *owner);
178 
179 extern int mu_message_get_uidl (mu_message_t, char *, size_t, size_t *);
180 extern int mu_message_set_uidl (mu_message_t,
181 				int (*_get_uidl) (mu_message_t,
182 						  char *,
183 						  size_t, size_t *),
184 				void *owner);
185 
186 extern int mu_message_get_uid (mu_message_t, size_t *);
187 extern int mu_message_set_uid (mu_message_t,
188 			       int (*_get_uid) (mu_message_t,
189 						size_t *),
190 			       void *owner);
191 
192 extern int mu_message_get_qid (mu_message_t, mu_message_qid_t *);
193 extern int mu_message_set_qid (mu_message_t,
194 			       int (*_get_qid) (mu_message_t,
195 						mu_message_qid_t *),
196 			       void *owner);
197 
198 extern int mu_message_get_imapenvelope (mu_message_t, struct mu_imapenvelope **);
199 extern void mu_message_imapenvelope_free (struct mu_imapenvelope *);
200 extern int mu_message_set_imapenvelope (mu_message_t,
201    int (*_imapenvelope) (mu_message_t, struct mu_imapenvelope **),
202    void *owner);
203 
204 extern void mu_bodystructure_free (struct mu_bodystructure *);
205 extern void mu_list_free_bodystructure (void *item);
206 
207 extern int mu_message_get_bodystructure (mu_message_t,
208 					 struct mu_bodystructure **);
209 extern int mu_message_set_bodystructure (mu_message_t msg,
210       int (*_bodystructure) (mu_message_t, struct mu_bodystructure **),
211       void *owner);
212 
213 /* misc functions */
214 extern int mu_attachment_create (mu_message_t *newmsg,
215 				 const char *content_type,
216 				 const char *encoding,
217 				 const char *name, const char *filename);
218 extern int mu_attachment_copy_from_stream (mu_message_t att,
219 					   mu_stream_t stream);
220 extern int mu_attachment_copy_from_file (mu_message_t att,
221 					 char const *filename);
222 extern int mu_message_create_attachment (const char *content_type,
223 					 const char *encoding,
224 					 const char *filename,
225 					 mu_message_t *newmsg);
226 
227 extern int mu_message_save_attachment (mu_message_t msg,
228 				       const char *filename,
229 				       mu_mime_io_buffer_t buf);
230 extern int mu_message_encapsulate (mu_message_t msg, mu_message_t *newmsg,
231 				   mu_mime_io_buffer_t buf);
232 extern int mu_message_unencapsulate (mu_message_t msg, mu_message_t *newmsg,
233 				     mu_mime_io_buffer_t buf);
234 
235 extern int mu_mime_io_buffer_create (mu_mime_io_buffer_t *pinfo);
236 extern void mu_mime_io_buffer_destroy (mu_mime_io_buffer_t *pinfo);
237 
238 extern int mu_mime_io_buffer_set_charset (mu_mime_io_buffer_t info,
239 					  const char *charset);
240 extern void mu_mime_io_buffer_sget_charset (mu_mime_io_buffer_t info,
241 					    const char **charset);
242 extern int mu_mime_io_buffer_aget_charset (mu_mime_io_buffer_t info,
243 					   const char **charset);
244 
245 
246 extern int mu_mimehdr_get_disp (const char *str, char *buf, size_t bufsz,
247 				size_t *retsz);
248 extern int mu_mimehdr_aget_disp (const char *str, char **pvalue);
249 extern int mu_mimehdr_get_param (const char *str, const char *param,
250 				 char *buf, size_t bufsz, size_t *retsz);
251 extern int mu_mimehdr_aget_param (const char *str, const char *param,
252 				  char **pval);
253 extern int mu_mimehdr_aget_decoded_param (const char *str, const char *param,
254 					  const char *charset,
255 					  char **pval, char **plang);
256 
257 extern int mu_message_get_attachment_name (mu_message_t, char *name,
258 					   size_t bufsz, size_t* sz);
259 extern int mu_message_aget_attachment_name (mu_message_t, char **name);
260 extern int mu_message_aget_decoded_attachment_name (mu_message_t msg,
261 						    const char *charset,
262 						    char **name,
263 						    char **plang);
264 
265 extern int mu_message_save_to_mailbox (mu_message_t msg, const char *toname,
266 				       int perms);
267 
268 
269 extern int mu_message_from_stream_with_envelope (mu_message_t *pmsg,
270 						 mu_stream_t instream,
271 						 mu_envelope_t env);
272 extern int mu_stream_to_message (mu_stream_t instream, mu_message_t *pmsg);
273 
274 extern int mu_message_get_iterator (mu_message_t msg, mu_iterator_t *pitr);
275 
276 /*
277  * Message part coordinates
278  */
279 typedef size_t *mu_coord_t;
280 
281 int mu_coord_alloc (mu_coord_t *ptr, size_t n);
282 int mu_coord_realloc (mu_coord_t *ptr, size_t n);
283 int mu_coord_dup (mu_coord_t orig, mu_coord_t *copy);
284 
285 static inline size_t
mu_coord_length(mu_coord_t c)286 mu_coord_length (mu_coord_t c)
287 {
288   return c[0];
289 }
290 
291 char *mu_coord_part_string (mu_coord_t c, size_t d);
292 
293 static inline char *
mu_coord_string(mu_coord_t c)294 mu_coord_string (mu_coord_t c)
295 {
296   return mu_coord_part_string (c, mu_coord_length (c));
297 }
298 
299 #ifdef __cplusplus
300 }
301 #endif
302 
303 #endif /* _MAILUTILS_MESSAGE_H */
304