1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of version 2 of the GNU Lesser General Public
7
* License as published by the Free Software Foundation.
9
* This program 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
* General Public License for more details.
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with this library; if not, write to the
16
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
* Boston, MA 02110-1301, USA.
20
#ifndef CAMEL_IMAPX_UTILS_H
21
#define CAMEL_IMAPX_UTILS_H
23
#include <camel/camel.h>
25
struct _CamelIMAPXStream;
27
struct _CamelIMAPXNamespaceList;
28
struct _CamelIMAPXStore;
30
/* list of strings we know about that can be *quickly* tokenised */
31
typedef enum _camel_imapx_id_t {
76
/* str MUST be in upper case, tokenised using gperf function */
77
camel_imapx_id_t imapx_tokenise (register const gchar *str, register guint len);
79
/* this flag should be part of imapfoldersummary */
81
CAMEL_IMAPX_MESSAGE_RECENT = (1 << 21),
84
/* ********************************************************************** */
86
GPtrArray *imapx_parse_uids (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error);
87
void imapx_parse_flags (struct _CamelIMAPXStream *stream, guint32 *flagsp, struct _CamelFlag **user_flagsp, GCancellable *cancellable, GError **error);
88
void imapx_write_flags (GString *string, guint32 flags, struct _CamelFlag *user_flags);
89
gboolean imapx_update_message_info_flags (CamelMessageInfo *info, guint32 server_flags, CamelFlag *server_user_flags, guint32 permanent_flags, CamelFolder *folder, gboolean unsolicited);
90
void imapx_set_message_info_flags_for_new_message (CamelMessageInfo *info, guint32 server_flags, CamelFlag *server_user_flags,
92
void imapx_update_store_summary (CamelFolder *folder);
94
/* ********************************************************************** */
96
IMAPX_CAPABILITY_IMAP4 = (1 << 0),
97
IMAPX_CAPABILITY_IMAP4REV1 = (1 << 1),
98
IMAPX_CAPABILITY_STATUS = (1 << 2),
99
IMAPX_CAPABILITY_NAMESPACE = (1 << 3),
100
IMAPX_CAPABILITY_UIDPLUS = (1 << 4),
101
IMAPX_CAPABILITY_LITERALPLUS = (1 << 5),
102
IMAPX_CAPABILITY_STARTTLS = (1 << 6),
103
IMAPX_CAPABILITY_IDLE = (1 << 7),
104
IMAPX_CAPABILITY_CONDSTORE = (1 << 8),
105
IMAPX_CAPABILITY_QRESYNC = (1 << 9),
106
IMAPX_CAPABILITY_LIST_STATUS = (1 << 10),
107
IMAPX_CAPABILITY_LIST_EXTENDED = (1 << 11),
110
struct _capability_info {
112
GHashTable *auth_types;
115
struct _capability_info *imapx_parse_capability (struct _CamelIMAPXStream *stream, GCancellable *cancellable, GError **error);
116
void imapx_free_capability (struct _capability_info *);
118
gboolean imapx_parse_param_list (struct _CamelIMAPXStream *is, struct _camel_header_param **plist, GCancellable *cancellable, GError **error) /* IO,PARSE */;
119
struct _CamelContentDisposition *imapx_parse_ext_optional (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error) /* IO,PARSE */;
120
struct _CamelMessageContentInfo *imapx_parse_body_fields (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error) /* IO,PARSE */;
121
struct _camel_header_address *imapx_parse_address_list (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error) /* IO,PARSE */;
122
struct _CamelMessageInfo *imapx_parse_envelope (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error) /* IO, PARSE */;
123
struct _CamelMessageContentInfo *imapx_parse_body (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error) /* IO,PARSE */;
124
gchar *imapx_parse_section (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error) /* IO,PARSE */;
125
void imapx_free_body (struct _CamelMessageContentInfo *cinfo);
127
/* ********************************************************************** */
128
/* all the possible stuff we might get from a fetch request */
129
/* this assumes the caller/server doesn't send any one of these types twice */
131
guint32 got; /* what we got, see below */
132
CamelStream *body; /* BODY[.*](<.*>)? */
133
CamelStream *text; /* RFC822.TEXT */
134
CamelStream *header; /* RFC822.HEADER */
135
struct _CamelMessageInfo *minfo; /* ENVELOPE */
136
struct _CamelMessageContentInfo *cinfo; /* BODYSTRUCTURE,BODY */
137
guint32 size; /* RFC822.SIZE */
138
guint32 offset; /* start offset of a BODY[]<offset.length> request */
139
guint32 flags; /* FLAGS */
140
guint64 modseq; /* MODSEQ */
141
struct _CamelFlag *user_flags;
142
gchar *date; /* INTERNALDATE */
143
gchar *section; /* section for a BODY[section] request */
144
gchar *uid; /* UID */
147
#define FETCH_BODY (1 << 0)
148
#define FETCH_TEXT (1 << 1)
149
#define FETCH_HEADER (1 << 2)
150
#define FETCH_MINFO (1 << 3)
151
#define FETCH_CINFO (1 << 4)
152
#define FETCH_SIZE (1 << 5)
153
#define FETCH_OFFSET (1 << 6)
154
#define FETCH_FLAGS (1 << 7)
155
#define FETCH_DATE (1 << 8)
156
#define FETCH_SECTION (1 << 9)
157
#define FETCH_UID (1 << 10)
158
#define FETCH_MODSEQ (1 << 11)
160
struct _fetch_info *imapx_parse_fetch (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error);
161
void imapx_free_fetch (struct _fetch_info *finfo);
162
void imapx_dump_fetch (struct _fetch_info *finfo);
164
/* ********************************************************************** */
166
struct _status_info {
167
camel_imapx_id_t result; /* ok/no/bad/preauth only, user_cancel - client response */
168
camel_imapx_id_t condition; /* read-only/read-write/alert/parse/trycreate/newname/permanentflags/uidvalidity/unseen/highestmodseq */
175
guint32 permanentflags;
179
guint64 highestmodseq;
187
GPtrArray *copied_uids;
189
struct _capability_info *cinfo;
195
struct _status_info *imapx_parse_status (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error);
196
struct _status_info *imapx_copy_status (struct _status_info *sinfo);
197
void imapx_free_status (struct _status_info *sinfo);
199
/* ********************************************************************** */
200
/* parses the response from the status command */
208
guint64 highestmodseq;
211
/* use g_free to free the return value */
212
struct _state_info *imapx_parse_status_info (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error);
214
/* ********************************************************************** */
216
/* should this just return a FolderInfo?
217
* should this just return the name & flags & separator by reference? */
224
struct _list_info *imapx_parse_list (struct _CamelIMAPXStream *is, GCancellable *cancellable, GError **error);
225
gchar *imapx_list_get_path (struct _list_info *li);
226
void imapx_free_list (struct _list_info *linfo);
228
/* ********************************************************************** */
229
typedef struct _IMAPXJobQueueInfo {
232
/* list of folders for which jobs are in the queue */
236
void camel_imapx_destroy_job_queue_info (IMAPXJobQueueInfo *jinfo);
238
/* ********************************************************************** */
240
extern guchar imapx_specials[256];
242
#define IMAPX_TYPE_CHAR (1 << 0)
243
#define IMAPX_TYPE_TEXT_CHAR (1 << 1)
244
#define IMAPX_TYPE_QUOTED_CHAR (1 << 2)
245
#define IMAPX_TYPE_ATOM_CHAR (1 << 3)
246
#define IMAPX_TYPE_TOKEN_CHAR (1 << 4)
247
#define IMAPX_TYPE_NOTID_CHAR (1 << 5)
249
guchar imapx_is_mask (const gchar *p);
251
#define imapx_is_text_char(c) ((imapx_specials[((unsigned char)(c))&0xff] & IMAPX_TYPE_TEXT_CHAR) != 0)
252
#define imapx_is_quoted_char(c) ((imapx_specials[((unsigned char)(c))&0xff] & IMAPX_TYPE_QUOTED_CHAR) != 0)
253
#define imapx_is_atom_char(c) ((imapx_specials[((unsigned char)(c))&0xff] & IMAPX_TYPE_ATOM_CHAR) != 0)
254
#define imapx_is_token_char(c) ((imapx_specials[((unsigned char)(c))&0xff] & IMAPX_TYPE_TOKEN_CHAR) != 0)
255
#define imapx_is_notid_char(c) ((imapx_specials[((unsigned char)(c))&0xff] & IMAPX_TYPE_NOTID_CHAR) != 0)
257
#define imapx_is_atom(s) (imapx_is_mask(s) & IMAPX_TYPE_ATOM_CHAR)
259
extern gint camel_imapx_debug_flags;
260
#define CAMEL_IMAPX_DEBUG_command (1 << 0)
261
#define CAMEL_IMAPX_DEBUG_debug (1 << 1)
262
#define CAMEL_IMAPX_DEBUG_extra (1 << 2)
263
#define CAMEL_IMAPX_DEBUG_io (1 << 3)
264
#define CAMEL_IMAPX_DEBUG_token (1 << 4)
265
#define CAMEL_IMAPX_DEBUG_parse (1 << 5)
266
#define CAMEL_IMAPX_DEBUG_conman (1 << 6)
268
/* Set this to zero to remove all debug output at build time */
269
#define CAMEL_IMAPX_DEBUG_ALL ((1 << 7)-1)
271
#define camel_debug_flag(type) (camel_imapx_debug_flags & CAMEL_IMAPX_DEBUG_ALL & CAMEL_IMAPX_DEBUG_ ## type)
272
#define camel_imapx_debug(type, tagprefix, fmt, ...) do { \
273
if (camel_debug_flag (type)) \
274
printf ("[imapx:%c] " fmt, tagprefix , ##__VA_ARGS__); \
277
/* ********************************************************************** */
279
void imapx_utils_init (void);
281
/* chen adds from old imap provider - place it in right place */
282
gchar *imapx_path_to_physical (const gchar *prefix, const gchar *vpath);
283
gchar *imapx_concat (struct _CamelIMAPXStore *imapx_store, const gchar *prefix, const gchar *suffix);
284
gchar * imapx_get_temp_uid (void);
286
void camel_imapx_namespace_list_clear (struct _CamelIMAPXNamespaceList *nsl);
287
struct _CamelIMAPXNamespaceList * imapx_parse_namespace_list (struct _CamelIMAPXStream *stream, GCancellable *cancellable, GError **error);
288
struct _CamelIMAPXNamespaceList *camel_imapx_namespace_list_copy (const struct _CamelIMAPXNamespaceList *nsl);