Diffstat (limited to 'libetpan/src/low-level/imap/mailimap_keywords.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | libetpan/src/low-level/imap/mailimap_keywords.c | 353 |
1 files changed, 353 insertions, 0 deletions
diff --git a/libetpan/src/low-level/imap/mailimap_keywords.c b/libetpan/src/low-level/imap/mailimap_keywords.c new file mode 100644 index 0000000..7e832a3 --- a/dev/null +++ b/libetpan/src/low-level/imap/mailimap_keywords.c | |||
@@ -0,0 +1,353 @@ | |||
1 | /* | ||
2 | * libEtPan! -- a mail stuff library | ||
3 | * | ||
4 | * Copyright (C) 2001, 2005 - DINH Viet Hoa | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * Redistribution and use in source and binary forms, with or without | ||
8 | * modification, are permitted provided that the following conditions | ||
9 | * are met: | ||
10 | * 1. Redistributions of source code must retain the above copyright | ||
11 | * notice, this list of conditions and the following disclaimer. | ||
12 | * 2. Redistributions in binary form must reproduce the above copyright | ||
13 | * notice, this list of conditions and the following disclaimer in the | ||
14 | * documentation and/or other materials provided with the distribution. | ||
15 | * 3. Neither the name of the libEtPan! project nor the names of its | ||
16 | * contributors may be used to endorse or promote products derived | ||
17 | * from this software without specific prior written permission. | ||
18 | * | ||
19 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND | ||
20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE | ||
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
29 | * SUCH DAMAGE. | ||
30 | */ | ||
31 | |||
32 | /* | ||
33 | * $Id$ | ||
34 | */ | ||
35 | |||
36 | #include "mailimap_keywords.h" | ||
37 | #include "mailimap_types.h" | ||
38 | #include <string.h> | ||
39 | #include <stdio.h> | ||
40 | |||
41 | #ifndef UNSTRICT_SYNTAX | ||
42 | #define UNSTRICT_SYNTAX | ||
43 | #endif | ||
44 | |||
45 | struct mailimap_token_value { | ||
46 | int value; | ||
47 | const char * str; | ||
48 | }; | ||
49 | |||
50 | int mailimap_token_case_insensitive_parse(mailstream * fd, | ||
51 | MMAPString * buffer, | ||
52 | size_t * index, | ||
53 | const char * token) | ||
54 | { | ||
55 | int len; | ||
56 | size_t cur_token; | ||
57 | int r; | ||
58 | |||
59 | cur_token = * index; | ||
60 | len = strlen(token); | ||
61 | |||
62 | #ifdef UNSTRICT_SYNTAX | ||
63 | r = mailimap_space_parse(fd, buffer, &cur_token); | ||
64 | if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) | ||
65 | return r; | ||
66 | #endif | ||
67 | |||
68 | if (strncasecmp(buffer->str + cur_token, token, len) == 0) { | ||
69 | cur_token += len; | ||
70 | * index = cur_token; | ||
71 | return MAILIMAP_NO_ERROR; | ||
72 | } | ||
73 | else | ||
74 | return MAILIMAP_ERROR_PARSE; | ||
75 | } | ||
76 | |||
77 | |||
78 | static int is_space_or_tab(char ch) | ||
79 | { | ||
80 | return (ch == ' ') || (ch == '\t'); | ||
81 | } | ||
82 | |||
83 | int mailimap_char_parse(mailstream * fd, MMAPString * buffer, | ||
84 | size_t * index, char token) | ||
85 | { | ||
86 | int cur_token; | ||
87 | |||
88 | cur_token = * index; | ||
89 | |||
90 | if (buffer->str[cur_token] == token) { | ||
91 | cur_token ++; | ||
92 | * index = cur_token; | ||
93 | return MAILIMAP_NO_ERROR; | ||
94 | } | ||
95 | else | ||
96 | return MAILIMAP_ERROR_PARSE; | ||
97 | } | ||
98 | |||
99 | int mailimap_space_parse(mailstream * fd, MMAPString * buffer, | ||
100 | size_t * index) | ||
101 | { | ||
102 | #ifdef UNSTRICT_SYNTAX | ||
103 | |||
104 | /* can accept unstrict syntax */ | ||
105 | size_t cur_token; | ||
106 | |||
107 | cur_token = * index; | ||
108 | |||
109 | while (is_space_or_tab(* (buffer->str + cur_token))) | ||
110 | cur_token ++; | ||
111 | |||
112 | if (cur_token == * index) | ||
113 | return MAILIMAP_ERROR_PARSE; | ||
114 | |||
115 | * index = cur_token; | ||
116 | |||
117 | return MAILIMAP_NO_ERROR; | ||
118 | |||
119 | #else | ||
120 | return mailimap_char_parse(fd, buffer, index, ' '); | ||
121 | #endif | ||
122 | } | ||
123 | |||
124 | |||
125 | |||
126 | #define mailimap_get_token_str(index, tab) \ | ||
127 | mailimap_get_token_str_size(index, tab, \ | ||
128 | sizeof(tab) / sizeof(struct mailimap_token_value)) | ||
129 | |||
130 | #define mailimap_get_token_value(fd, buffer, index, tab) \ | ||
131 | mailimap_get_token_value_size(fd, buffer, index, tab, \ | ||
132 | sizeof(tab) / sizeof(struct mailimap_token_value)) | ||
133 | |||
134 | |||
135 | static const char * mailimap_get_token_str_size(int index, | ||
136 | struct mailimap_token_value * tab, | ||
137 | size_t size) | ||
138 | { | ||
139 | size_t i; | ||
140 | |||
141 | for(i = 0 ; i < size ; i++) | ||
142 | if (index == tab[i].value) | ||
143 | return tab[i].str; | ||
144 | |||
145 | return NULL; | ||
146 | } | ||
147 | |||
148 | |||
149 | |||
150 | static int mailimap_get_token_value_size(mailstream * fd, MMAPString * buffer, | ||
151 | size_t * index, | ||
152 | struct mailimap_token_value * tab, | ||
153 | size_t size) | ||
154 | { | ||
155 | size_t i; | ||
156 | int r; | ||
157 | |||
158 | #ifdef UNSTRICT_SYNTAX | ||
159 | /* can accept unstrict syntax */ | ||
160 | r = mailimap_space_parse(fd, buffer, index); | ||
161 | if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) | ||
162 | return r; | ||
163 | #endif | ||
164 | |||
165 | for(i = 0 ; i < size ; i++) { | ||
166 | r = mailimap_token_case_insensitive_parse(fd, buffer, index, tab[i].str); | ||
167 | if (r == MAILIMAP_NO_ERROR) | ||
168 | return tab[i].value; | ||
169 | } | ||
170 | |||
171 | return -1; | ||
172 | } | ||
173 | |||
174 | |||
175 | static struct mailimap_token_value status_att_tab[] = { | ||
176 | {MAILIMAP_STATUS_ATT_MESSAGES, "MESSAGES"}, | ||
177 | {MAILIMAP_STATUS_ATT_RECENT, "RECENT"}, | ||
178 | {MAILIMAP_STATUS_ATT_UIDNEXT, "UIDNEXT"}, | ||
179 | {MAILIMAP_STATUS_ATT_UIDVALIDITY, "UIDVALIDITY"}, | ||
180 | {MAILIMAP_STATUS_ATT_UNSEEN, "UNSEEN"} | ||
181 | }; | ||
182 | |||
183 | int mailimap_status_att_get_token_value(mailstream * fd, MMAPString * buffer, | ||
184 | size_t * index) | ||
185 | { | ||
186 | int r; | ||
187 | |||
188 | #ifdef UNSTRICT_SYNTAX | ||
189 | /* can accept unstrict syntax */ | ||
190 | r = mailimap_space_parse(fd, buffer, index); | ||
191 | if ((r != MAILIMAP_NO_ERROR) && (r != MAILIMAP_ERROR_PARSE)) | ||
192 | return r; | ||
193 | #endif | ||
194 | return mailimap_get_token_value(fd, buffer, index, | ||
195 | status_att_tab); | ||
196 | } | ||
197 | |||
198 | |||
199 | const char * mailimap_status_att_get_token_str(size_t index) | ||
200 | { | ||
201 | return mailimap_get_token_str(index, status_att_tab); | ||
202 | } | ||
203 | |||
204 | static struct mailimap_token_value month_tab[] = { | ||
205 | {1, "Jan"}, | ||
206 | {2, "Feb"}, | ||
207 | {3, "Mar"}, | ||
208 | {4, "Apr"}, | ||
209 | {5, "May"}, | ||
210 | {6, "Jun"}, | ||
211 | {7, "Jul"}, | ||
212 | {8, "Aug"}, | ||
213 | {9, "Sep"}, | ||
214 | {10, "Oct"}, | ||
215 | {11, "Nov"}, | ||
216 | {12, "Dec"} | ||
217 | }; | ||
218 | |||
219 | int mailimap_month_get_token_value(mailstream * fd, MMAPString * buffer, | ||
220 | size_t * index) | ||
221 | { | ||
222 | return mailimap_get_token_value(fd, buffer, index, month_tab); | ||
223 | } | ||
224 | |||
225 | |||
226 | const char * mailimap_month_get_token_str(size_t index) | ||
227 | { | ||
228 | return mailimap_get_token_str(index, month_tab); | ||
229 | } | ||
230 | |||
231 | |||
232 | |||
233 | |||
234 | |||
235 | static struct mailimap_token_value mailimap_flag_tab[] = { | ||
236 | {MAILIMAP_FLAG_ANSWERED, "\\Answered"}, | ||
237 | {MAILIMAP_FLAG_FLAGGED, "\\Flagged"}, | ||
238 | {MAILIMAP_FLAG_DELETED, "\\Deleted"}, | ||
239 | {MAILIMAP_FLAG_SEEN, "\\Seen"}, | ||
240 | {MAILIMAP_FLAG_DRAFT, "\\Draft"} | ||
241 | }; | ||
242 | |||
243 | int mailimap_flag_get_token_value(mailstream * fd, MMAPString * buffer, | ||
244 | size_t * index) | ||
245 | { | ||
246 | return mailimap_get_token_value(fd, buffer, index, | ||
247 | mailimap_flag_tab); | ||
248 | } | ||
249 | |||
250 | |||
251 | const char * mailimap_flag_get_token_str(size_t index) | ||
252 | { | ||
253 | return mailimap_get_token_str(index, mailimap_flag_tab); | ||
254 | } | ||
255 | |||
256 | |||
257 | |||
258 | |||
259 | static struct mailimap_token_value encoding_tab[] = { | ||
260 | {MAILIMAP_BODY_FLD_ENC_7BIT, "7BIT"}, | ||
261 | {MAILIMAP_BODY_FLD_ENC_8BIT, "8BIT"}, | ||
262 | {MAILIMAP_BODY_FLD_ENC_BINARY, "BINARY"}, | ||
263 | {MAILIMAP_BODY_FLD_ENC_BASE64, "BASE64"}, | ||
264 | {MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE, "QUOTED-PRINTABLE"} | ||
265 | }; | ||
266 | |||
267 | int mailimap_encoding_get_token_value(mailstream * fd, MMAPString * buffer, | ||
268 | size_t * index) | ||
269 | { | ||
270 | return mailimap_get_token_value(fd, buffer, index, encoding_tab); | ||
271 | } | ||
272 | |||
273 | static struct mailimap_token_value mbx_list_sflag_tab[] = { | ||
274 | {MAILIMAP_MBX_LIST_SFLAG_MARKED, "\\Marked"}, | ||
275 | {MAILIMAP_MBX_LIST_SFLAG_NOSELECT, "\\Noselect"}, | ||
276 | {MAILIMAP_MBX_LIST_SFLAG_UNMARKED, "\\Unmarked"} | ||
277 | }; | ||
278 | |||
279 | int mailimap_mbx_list_sflag_get_token_value(mailstream * fd, | ||
280 | MMAPString * buffer, | ||
281 | size_t * index) | ||
282 | { | ||
283 | return mailimap_get_token_value(fd, buffer, index, mbx_list_sflag_tab); | ||
284 | } | ||
285 | |||
286 | static struct mailimap_token_value media_basic_tab[] = { | ||
287 | {MAILIMAP_MEDIA_BASIC_APPLICATION, "APPLICATION"}, | ||
288 | {MAILIMAP_MEDIA_BASIC_AUDIO, "AUDIO"}, | ||
289 | {MAILIMAP_MEDIA_BASIC_IMAGE, "IMAGE"}, | ||
290 | {MAILIMAP_MEDIA_BASIC_MESSAGE, "MESSAGE"}, | ||
291 | {MAILIMAP_MEDIA_BASIC_VIDEO, "VIDEO"} | ||
292 | }; | ||
293 | |||
294 | int mailimap_media_basic_get_token_value(mailstream * fd, MMAPString * buffer, | ||
295 | size_t * index) | ||
296 | { | ||
297 | return mailimap_get_token_value(fd, buffer, index, media_basic_tab); | ||
298 | } | ||
299 | |||
300 | static struct mailimap_token_value resp_cond_state_tab[] = { | ||
301 | {MAILIMAP_RESP_COND_STATE_OK, "OK"}, | ||
302 | {MAILIMAP_RESP_COND_STATE_NO, "NO"}, | ||
303 | {MAILIMAP_RESP_COND_STATE_BAD, "BAD"} | ||
304 | }; | ||
305 | |||
306 | int mailimap_resp_cond_state_get_token_value(mailstream * fd, | ||
307 | MMAPString * buffer, | ||
308 | size_t * index) | ||
309 | { | ||
310 | return mailimap_get_token_value(fd, buffer, index, resp_cond_state_tab); | ||
311 | } | ||
312 | |||
313 | static struct mailimap_token_value resp_text_code_1_tab[] = { | ||
314 | {MAILIMAP_RESP_TEXT_CODE_ALERT, "ALERT"}, | ||
315 | {MAILIMAP_RESP_TEXT_CODE_PARSE, "PARSE"}, | ||
316 | {MAILIMAP_RESP_TEXT_CODE_READ_ONLY, "READ-ONLY"}, | ||
317 | {MAILIMAP_RESP_TEXT_CODE_READ_WRITE, "READ-WRITE"}, | ||
318 | {MAILIMAP_RESP_TEXT_CODE_TRY_CREATE, "TRYCREATE"} | ||
319 | }; | ||
320 | |||
321 | int mailimap_resp_text_code_1_get_token_value(mailstream * fd, | ||
322 | MMAPString * buffer, | ||
323 | size_t * index) | ||
324 | { | ||
325 | return mailimap_get_token_value(fd, buffer, index, resp_text_code_1_tab); | ||
326 | } | ||
327 | |||
328 | static struct mailimap_token_value resp_text_code_2_tab[] = { | ||
329 | {MAILIMAP_RESP_TEXT_CODE_UIDNEXT, "UIDNEXT"}, | ||
330 | {MAILIMAP_RESP_TEXT_CODE_UIDVALIDITY, "UIDVALIDITY"}, | ||
331 | {MAILIMAP_RESP_TEXT_CODE_UNSEEN, "UNSEEN"}, | ||
332 | }; | ||
333 | |||
334 | int mailimap_resp_text_code_2_get_token_value(mailstream * fd, | ||
335 | MMAPString * buffer, | ||
336 | size_t * index) | ||
337 | { | ||
338 | return mailimap_get_token_value(fd, buffer, index, resp_text_code_2_tab); | ||
339 | } | ||
340 | |||
341 | static struct mailimap_token_value section_msgtext_tab[] = { | ||
342 | {MAILIMAP_SECTION_MSGTEXT_HEADER_FIELDS_NOT, "HEADER.FIELDS.NOT"}, | ||
343 | {MAILIMAP_SECTION_MSGTEXT_HEADER_FIELDS, "HEADER.FIELDS"}, | ||
344 | {MAILIMAP_SECTION_MSGTEXT_HEADER, "HEADER"}, | ||
345 | {MAILIMAP_SECTION_MSGTEXT_TEXT, "TEXT"} | ||
346 | }; | ||
347 | |||
348 | int mailimap_section_msgtext_get_token_value(mailstream * fd, | ||
349 | MMAPString * buffer, | ||
350 | size_t * index) | ||
351 | { | ||
352 | return mailimap_get_token_value(fd, buffer, index, section_msgtext_tab); | ||
353 | } | ||