summaryrefslogtreecommitdiffabout
path: root/libetpan/src/low-level/imap/mailimap_keywords.c
Unidiff
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.c353
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
45struct mailimap_token_value {
46 int value;
47 const char * str;
48};
49
50int 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
78static int is_space_or_tab(char ch)
79{
80 return (ch == ' ') || (ch == '\t');
81}
82
83int 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
99int 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
135static 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
150static 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
175static 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
183int 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
199const char * mailimap_status_att_get_token_str(size_t index)
200{
201 return mailimap_get_token_str(index, status_att_tab);
202}
203
204static 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
219int 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
226const 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
235static 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
243int 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
251const 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
259static 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
267int 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
273static 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
279int 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
286static 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
294int 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
300static 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
306int 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
313static 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
321int 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
328static 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
334int 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
341static 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
348int 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}