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_HEADER_H
19 #define _MAILUTILS_HEADER_H
20 
21 #include <mailutils/types.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #define MU_HEADER_UNIX_FROM                 "From "
28 #define MU_HEADER_RETURN_PATH               "Return-Path"
29 #define MU_HEADER_RECEIVED                  "Received"
30 #define MU_HEADER_DATE                      "Date"
31 #define MU_HEADER_DCC                       "Dcc"
32 #define MU_HEADER_FROM                      "From"
33 #define MU_HEADER_SENDER                    "Sender"
34 #define MU_HEADER_RESENT_FROM               "Resent-From"
35 #define MU_HEADER_SUBJECT                   "Subject"
36 #define MU_HEADER_RESENT_SENDER             "Resent-Sender"
37 #define MU_HEADER_TO                        "To"
38 #define MU_HEADER_RESENT_TO                 "Resent-To"
39 #define MU_HEADER_CC                        "Cc"
40 #define MU_HEADER_RESENT_CC                 "Resent-Cc"
41 #define MU_HEADER_BCC                       "Bcc"
42 #define MU_HEADER_RESENT_BCC                "Resent-Bcc"
43 #define MU_HEADER_REPLY_TO                  "Reply-To"
44 #define MU_HEADER_RESENT_REPLY_TO           "Resent-Reply-To"
45 #define MU_HEADER_MESSAGE_ID                "Message-ID"
46 #define MU_HEADER_RESENT_MESSAGE_ID         "Resent-Message-ID"
47 #define MU_HEADER_IN_REPLY_TO               "In-Reply-To"
48 #define MU_HEADER_REFERENCE                 "Reference"
49 #define MU_HEADER_REFERENCES                "References"
50 #define MU_HEADER_ENCRYPTED                 "Encrypted"
51 #define MU_HEADER_PRECEDENCE                "Precedence"
52 #define MU_HEADER_STATUS                    "Status"
53 #define MU_HEADER_CONTENT_LENGTH            "Content-Length"
54 #define MU_HEADER_CONTENT_LANGUAGE          "Content-Language"
55 #define MU_HEADER_CONTENT_TRANSFER_ENCODING "Content-Transfer-Encoding"
56 #define MU_HEADER_CONTENT_ID                "Content-ID"
57 #define MU_HEADER_CONTENT_TYPE              "Content-Type"
58 #define MU_HEADER_CONTENT_DESCRIPTION       "Content-Description"
59 #define MU_HEADER_CONTENT_DISPOSITION       "Content-Disposition"
60 #define MU_HEADER_CONTENT_MD5               "Content-MD5"
61 #define MU_HEADER_CONTENT_LOCATION          "Content-Location"
62 #define MU_HEADER_MIME_VERSION              "MIME-Version"
63 #define MU_HEADER_X_MAILER                  "X-Mailer"
64 #define MU_HEADER_X_UIDL                    "X-UIDL"
65 #define MU_HEADER_X_UID                     "X-UID"
66 #define MU_HEADER_X_IMAPBASE                "X-IMAPbase"
67 #define MU_HEADER_ENV_SENDER                "X-Envelope-Sender"
68 #define MU_HEADER_ENV_DATE                  "X-Envelope-Date"
69 #define MU_HEADER_FCC                       "Fcc"
70 #define MU_HEADER_DELIVERY_DATE             "Delivery-Date"
71 #define MU_HEADER_ENVELOPE_TO               "Envelope-To"
72 #define MU_HEADER_X_EXPIRE_TIMESTAMP        "X-Expire-Timestamp"
73 #define MU_HEADER_USER_AGENT                "User-Agent"
74 
75 #define MU_HEADER_REPLACE 0x01
76 #define MU_HEADER_BEFORE  0x02
77 
78 extern int mu_header_create (mu_header_t *, const char *, size_t);
79 extern void mu_header_destroy (mu_header_t *);
80 extern int mu_header_invalidate (mu_header_t);
81 extern int mu_header_clear (mu_header_t header);
82 
83 extern int mu_header_is_modified (mu_header_t);
84 extern int mu_header_clear_modified (mu_header_t);
85 
86 /* Set and get field values by field name. */
87 extern int mu_header_set_value (mu_header_t, const char *, const char *, int);
88 extern int mu_header_remove (mu_header_t, const char *, int);
89 extern int mu_header_append (mu_header_t header, const char *fn,
90 			     const char *fv);
91 extern int mu_header_prepend (mu_header_t header, const char *fn,
92 			      const char *fv);
93 extern int mu_header_insert (mu_header_t, const char *, const char *,
94 			     const char *, int, int);
95 
96 extern int mu_header_sget_value_n (mu_header_t, const char *, int,
97 				   const char **);
98 #define mu_header_sget_value(header, name, pval) \
99   mu_header_sget_value_n (header, name, 1, pval)
100 
101 extern int mu_header_get_value_n (mu_header_t, const char *, int, char *,
102 				  size_t, size_t *);
103 #define mu_header_get_value(header, name, buffer, buflen, pn) \
104   mu_header_get_value_n (header, name, 1, buffer, buflen, pn)
105 
106 extern int mu_header_aget_value_n (mu_header_t, const char *, int, char **);
107 #define mu_header_aget_value(header, name, pptr) \
108   mu_header_aget_value_n (header, name, 1, pptr)
109 
110 int mu_header_sget_firstof (mu_header_t hdr, char **names,
111 			    const char **pval, int *pidx);
112 
113 /* Get field values as an mu_address_t. */
114 extern int mu_header_get_address_n (mu_header_t, const char *,
115 				    int, mu_address_t *);
116 #define mu_header_get_address(header, name, addr) \
117   mu_header_get_address_n (header, name, 1, addr)
118 
119 /* Set and get field values by field index (1-based). */
120 extern int mu_header_get_field_count (mu_header_t, size_t *count);
121 
122 extern int mu_header_sget_field_name (mu_header_t, size_t index,
123 				      const char **);
124 
125 extern int mu_header_get_field_name (mu_header_t, size_t index,
126 				     char *, size_t, size_t *);
127 extern int mu_header_aget_field_name (mu_header_t, size_t index,
128 				      char **);
129 
130 extern int mu_header_sget_field_value (mu_header_t, size_t index,
131 				       const char **);
132 extern int mu_header_get_field_value (mu_header_t, size_t index,
133 				      char *, size_t, size_t *);
134 extern int mu_header_aget_field_value (mu_header_t, size_t index, char **);
135 
136 extern int mu_header_get_value_unfold_n (mu_header_t header,
137 					 const char *name, int n,
138 					 char *buffer, size_t buflen,
139 					 size_t *pn);
140 #define mu_header_get_value_unfold(header, name, buffer, buflen, pn) \
141   mu_header_get_value_unfold_n (header, name, 1, buffer, buflen, pn)
142 
143 extern int mu_header_aget_value_unfold_n (mu_header_t header,
144 					  const char *name, int n,
145 					  char **pvalue);
146 #define mu_header_aget_value_unfold(header, name, pvalue) \
147   mu_header_aget_value_unfold_n (header, name, 1, pvalue)
148 
149 extern int mu_header_get_field_value_unfold (mu_header_t header, size_t num,
150 					     char *buf, size_t buflen,
151 					     size_t *nwritten);
152 extern int mu_header_aget_field_value_unfold (mu_header_t header, size_t num,
153 					      char **pvalue);
154 
155 extern int mu_header_get_streamref (mu_header_t, mu_stream_t *);
156 
157 /* FIXME: This function does not exist:
158    extern int mu_header_set_stream (mu_header_t, mu_stream_t, void *);
159 */
160 extern int mu_header_size (mu_header_t, size_t *);
161 extern int mu_header_lines (mu_header_t, size_t *);
162 
163 extern int mu_header_get_iterator (mu_header_t, mu_iterator_t *);
164 
165 
166 extern int mu_header_set_fill (mu_header_t,
167 			       int (*_fill) (void *data, char **, size_t *),
168 			       void *data);
169 
170 extern int mu_header_get_itemptr (mu_header_t header, size_t num,
171 				  const void **sptr);
172 
173 #ifdef __cplusplus
174 }
175 #endif
176 
177 #endif /* _MAILUTILS_HEADER_H */
178