2 * Copyright (C) 1996-9 Brandon Long <blong@fiction.net>
3 * Copyright (C) 1999-2008 Brendan Cully <brendan@kublai.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #ifndef _IMAP_PRIVATE_H
21 #define _IMAP_PRIVATE_H 1
24 #include "mutt_curses.h"
25 #include "mutt_socket.h"
33 #define IMAP_SSL_PORT 993
36 #define IMAP_LOG_CMD 2
37 #define IMAP_LOG_LTRL 4
38 #define IMAP_LOG_PASS 5
40 /* IMAP command responses. Used in IMAP_COMMAND.state too */
42 #define IMAP_CMD_OK (0)
44 #define IMAP_CMD_BAD (-1)
46 #define IMAP_CMD_NO (-2)
48 #define IMAP_CMD_CONTINUE (1)
50 #define IMAP_CMD_RESPOND (2)
51 /* IMAP_COMMAND.state additions */
52 #define IMAP_CMD_NEW (3)
54 /* number of entries in the hash table */
55 #define IMAP_CACHE_LEN 10
58 /* maximum length of command lines before they must be split (for
60 #define IMAP_MAX_CMDLEN 1024
62 #define IMAP_REOPEN_ALLOW (1<<0)
63 #define IMAP_EXPUNGE_EXPECTED (1<<1)
64 #define IMAP_EXPUNGE_PENDING (1<<2)
65 #define IMAP_NEWMAIL_PENDING (1<<3)
66 #define IMAP_FLAGS_PENDING (1<<4)
68 /* imap_exec flags (see imap_exec) */
69 #define IMAP_CMD_FAIL_OK (1<<0)
70 #define IMAP_CMD_PASS (1<<1)
71 #define IMAP_CMD_QUEUE (1<<2)
82 IMAP_DISCONNECTED = 0,
87 /* and pseudo-states */
99 /* Capabilities we are interested in */
105 ACL, /* RFC 2086: IMAP4 ACL extension */
106 NAMESPACE, /* RFC 2342: IMAP4 Namespace */
107 ACRAM_MD5, /* RFC 2195: CRAM-MD5 authentication */
108 AGSSAPI, /* RFC 1731: GSSAPI authentication */
109 AUTH_ANON, /* AUTH=ANONYMOUS */
110 STARTTLS, /* RFC 2595: STARTTLS */
111 LOGINDISABLED, /* LOGINDISABLED */
112 IDLE, /* RFC 2177: IDLE */
113 SASL_IR, /* SASL initial response draft */
118 /* imap_conn_find flags */
119 #define M_IMAP_CONN_NONEW (1<<0)
120 #define M_IMAP_CONN_NOSELECT (1<<1)
122 /* -- data structures -- */
133 unsigned int messages;
135 unsigned int uidnext;
136 unsigned int uidvalidity;
145 /* if we end up storing a lot of these we could turn this into a bitfield */
146 unsigned char noselect;
147 unsigned char noinferiors;
150 /* IMAP command structure */
166 /* This data is specific to a CONNECTION to an IMAP server */
169 unsigned char status;
170 /* let me explain capstr: SASL needs the capability string (not bits).
172 * 1. rerun CAPABILITY inside SASL function.
173 * 2. build appropriate CAPABILITY string by reverse-engineering from bits.
174 * 3. keep a copy until after authentication.
175 * I've chosen (3) for now. (2) might not be too bad, but it involves
176 * tracking all possible capabilities. bah. (1) I don't like because
177 * it's just no fun to get the same information twice */
179 unsigned char capabilities[(CAPMAX + 7)/8];
181 time_t lastread; /* last time we read a command for the server */
185 /* if set, the response parser will store results for complicated commands
187 IMAP_COMMAND_TYPE cmdtype;
197 /* cache IMAP_STATUS of visited mailboxes */
200 /* The following data is all specific to the currently SELECTED mbox */
204 unsigned short check_status;
205 unsigned char reopen;
206 unsigned int newMailCount;
207 IMAP_CACHE cache[IMAP_CACHE_LEN];
208 unsigned int uid_validity;
209 unsigned int uidnext;
210 body_cache_t *bcache;
212 /* all folder flags - system flags AND keywords */
215 header_cache_t *hcache;
218 /* I wish that were called IMAP_CONTEXT :( */
221 #define CTX_DATA ((IMAP_DATA *) ctx->data)
223 /* -- private IMAP functions -- */
225 int imap_create_mailbox (IMAP_DATA* idata, char* mailbox);
226 int imap_rename_mailbox (IMAP_DATA* idata, IMAP_MBOX* mx, const char* newname);
227 IMAP_STATUS* imap_mboxcache_get (IMAP_DATA* idata, const char* mbox,
229 void imap_mboxcache_free (IMAP_DATA* idata);
230 int imap_exec_msgset (IMAP_DATA* idata, const char* pre, const char* post,
231 int flag, int changed, int invert);
232 int imap_open_connection (IMAP_DATA* idata);
233 void imap_close_connection (IMAP_DATA* idata);
234 IMAP_DATA* imap_conn_find (const ACCOUNT* account, int flags);
235 int imap_read_literal (FILE* fp, IMAP_DATA* idata, long bytes, progress_t*);
236 void imap_expunge_mailbox (IMAP_DATA* idata);
237 void imap_logout (IMAP_DATA** idata);
238 int imap_sync_message (IMAP_DATA *idata, HEADER *hdr, BUFFER *cmd,
240 int imap_has_flag (LIST* flag_list, const char* flag);
243 int imap_authenticate (IMAP_DATA* idata);
246 int imap_cmd_start (IMAP_DATA* idata, const char* cmd);
247 int imap_cmd_step (IMAP_DATA* idata);
248 void imap_cmd_finish (IMAP_DATA* idata);
249 int imap_code (const char* s);
250 const char* imap_cmd_trailer (IMAP_DATA* idata);
251 int imap_exec (IMAP_DATA* idata, const char* cmd, int flags);
252 int imap_cmd_idle (IMAP_DATA* idata);
255 void imap_add_keywords (char* s, HEADER* keywords, LIST* mailbox_flags, size_t slen);
256 void imap_free_header_data (void** data);
257 int imap_read_headers (IMAP_DATA* idata, int msgbegin, int msgend);
258 char* imap_set_flags (IMAP_DATA* idata, HEADER* h, char* s);
259 int imap_cache_del (IMAP_DATA* idata, HEADER* h);
260 int imap_cache_clean (IMAP_DATA* idata);
264 header_cache_t* imap_hcache_open (IMAP_DATA* idata, const char* path);
265 void imap_hcache_close (IMAP_DATA* idata);
266 HEADER* imap_hcache_get (IMAP_DATA* idata, unsigned int uid);
267 int imap_hcache_put (IMAP_DATA* idata, HEADER* h);
268 int imap_hcache_del (IMAP_DATA* idata, unsigned int uid);
271 int imap_continue (const char* msg, const char* resp);
272 void imap_error (const char* where, const char* msg);
273 IMAP_DATA* imap_new_idata (void);
274 void imap_free_idata (IMAP_DATA** idata);
275 char* imap_fix_path (IMAP_DATA* idata, char* mailbox, char* path,
277 void imap_cachepath(IMAP_DATA* idata, const char* mailbox, char* dest,
279 int imap_get_literal_count (const char* buf, long* bytes);
280 char* imap_get_qualifier (char* buf);
281 int imap_mxcmp (const char* mx1, const char* mx2);
282 char* imap_next_word (char* s);
283 time_t imap_parse_date (char* s);
284 void imap_qualify_path (char *dest, size_t len, IMAP_MBOX *mx, char* path);
285 void imap_quote_string (char* dest, size_t slen, const char* src);
286 void imap_unquote_string (char* s);
287 void imap_munge_mbox_name (char *dest, size_t dlen, const char *src);
288 void imap_unmunge_mbox_name (char *s);
289 int imap_wordcasecmp(const char *a, const char *b);
292 void imap_utf7_encode (char **s);
293 void imap_utf7_decode (char **s);
296 /* typedef size_t (*hcache_keylen_t)(const char* fn); */
297 #define imap_hcache_keylen mutt_strlen
298 #endif /* USE_HCACHE */