Integrate test_header in test_view_mail and various coding style modifications
[rmail.git] / src / utils / mime.c
blobe2efded2461cf4067aecf07333eb1de3b3e6aae8
1 #include <stdio.h>
2 #include <string.h>
3 #include <ctype.h>
5 #include "mime.h"
7 /*
8 text/plain
9 multipart/mixed: MIME E-mail; Defined in RFC 2045 and RFC 2046
10 multipart/alternative: MIME E-mail; Defined in RFC 2045 and RFC 2046
11 multipart/related: MIME E-mail; Defined in RFC 2387 and used by MHTML (HTML mail)
12 multipart/form-data: MIME Webform; Defined in RFC 2388
13 multipart/signed: Defined in RFC 1847
14 multipart/encrypted: Defined in RFC 1847
18 application
19 audio
20 example
21 image
22 message
23 model
24 multipart
25 text
26 video
28 void mime_content_type(const char *buf, struct mime_header *hdr)
30 const char *p;
32 p = strchr(buf, ':');
33 p++;
35 while (*p != '\0' && isspace(*p)) {
36 if (*p == '\n' || *p == '\r') {
37 hdr->type = MIME_TYPE_UNKNOWN;
38 return;
40 p++;
43 /* text/plain is the default for e-mail */
44 if (!strncmp(p, "text", 4)) {
45 hdr->type = MIME_TYPE_TEXT;
46 p += 4;
47 } else if (!strncmp(p, "multipart", 9)) {
48 hdr->type = MIME_TYPE_MULTIPART;
49 p += 9;
50 } else if (!strncmp(p, "application", 11)) {
51 hdr->type = MIME_TYPE_APPLICATION;
52 p += 11;
53 } else if (!strncmp(p, "audio", 5)) {
54 hdr->type = MIME_TYPE_AUDIO;
55 p += 5;
56 } else if (!strncmp(p, "example", 7)) {
57 hdr->type = MIME_TYPE_EXAMPLE;
58 p += 7;
59 } else if (!strncmp(p, "image", 5)) {
60 hdr->type = MIME_TYPE_IMAGE;
61 p += 5;
62 } else if (!strncmp(p, "message", 7)) {
63 hdr->type = MIME_TYPE_MESSAGE;
64 p += 7;
65 } else if (!strncmp(p, "model", 5)) {
66 hdr->type = MIME_TYPE_MODEL;
67 p += 5;
68 } else if (!strncmp(p, "video", 5)) {
69 hdr->type = MIME_TYPE_VIDEO;
70 p += 5;
71 } else {
72 hdr->type = MIME_TYPE_UNKNOWN;
76 int mime_content_disposition(const char *buf)
78 const char *p;
80 p = strchr(buf, ':');
81 p++;
83 while (*p != '\0' && isspace(*p)) {
84 if (*p == '\n' || *p == '\r') {
85 return MIME_DISPOSITION_UNKNOWN;
87 p++;
90 /* text/plain is the default */
91 if (!strncmp(p, "inline", 6)) {
92 return MIME_DISPOSITION_INLINE;
93 } else if (!strncmp(p, "attachment", 10)) {
94 return MIME_DISPOSITION_ATTACHMENT;
95 } else {
96 return MIME_DISPOSITION_UNKNOWN;
99 return MIME_DISPOSITION_UNKNOWN;
103 int mime_content_transfer_encoding(const char *buf)
105 const char *p;
107 p = strchr(buf, ':');
108 p++;
110 while (*p != '\0' && isspace(*p)) {
111 if (*p == '\n' || *p == '\r') {
112 return MIME_ENCODING_7BIT;
114 p++;
117 fprintf(stderr, "%s - %s\n", __func__, p);
119 if (!strncmp(p, "7bit", 4)) {
120 return MIME_ENCODING_7BIT;
121 } else if (!strncmp(p, "quoted-printable", 16)) {
122 return MIME_ENCODING_QUOTED_PRINTABLE;
123 } else if (!strncmp(p, "base64", 6)) {
124 return MIME_ENCODING_BASE64;
125 } else if (!strncmp(p, "8bit", 4)) {
126 return MIME_ENCODING_8BIT;
127 } else if (!strncmp(p, "binary", 6)) {
128 return MIME_ENCODING_BINARY;
129 } else {
130 return MIME_ENCODING_UNKNOWN;
133 return MIME_ENCODING_UNKNOWN;
136 void debug_mime_header(const struct mime_header *hdr)
138 fprintf(stderr, "MIME Header:\n");
140 /* MIME Content-Type */
141 fprintf(stderr, " Content-Type.............: ");
142 switch (hdr->type) {
143 case MIME_TYPE_TEXT:
144 fprintf(stderr, "text\n");
145 break;
146 case MIME_TYPE_MULTIPART:
147 fprintf(stderr, "multipart\n");
148 break;
149 case MIME_TYPE_UNKNOWN:
150 default:
151 fprintf(stderr, "Unknown\n");
152 break;
155 /* MIME Content-Disposition */
156 fprintf(stderr, " Content-Disposition......: ");
157 switch (hdr->disposition) {
158 case MIME_DISPOSITION_INLINE:
159 fprintf(stderr, "inline\n");
160 break;
161 case MIME_DISPOSITION_ATTACHMENT:
162 fprintf(stderr, "attachment\n");
163 break;
164 case MIME_DISPOSITION_UNKNOWN:
165 default:
166 fprintf(stderr, "Unknown\n");
167 break;
170 /* MIME Content-Transfer-Encoding */
171 fprintf(stderr, " Content-Transfer-Encoding: ");
172 switch (hdr->transfer_encoding) {
173 case MIME_ENCODING_7BIT:
174 fprintf(stderr, "7bit\n");
175 break;
176 case MIME_ENCODING_QUOTED_PRINTABLE:
177 fprintf(stderr, "quoted-printable\n");
178 break;
179 case MIME_ENCODING_BASE64:
180 fprintf(stderr, "base64\n");
181 break;
182 case MIME_ENCODING_8BIT:
183 fprintf(stderr, "8bit\n");
184 break;
185 case MIME_ENCODING_BINARY:
186 fprintf(stderr, "binary\n");
187 break;
188 case MIME_ENCODING_UNKNOWN:
189 default:
190 fprintf(stderr, "Unknown\n");
191 break;