/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, see .
*/
#ifndef CAMEL_IMAPX_UTILS_H
#define CAMEL_IMAPX_UTILS_H
#include
#include "camel-imapx-mailbox.h"
G_BEGIN_DECLS
/* FIXME Split off a camel-imapx-types.h file with supplemental
* enum/struct definitions and helper macros, so we don't
* have these conflicting header dependencies. */
struct _CamelIMAPXCommand;
struct _CamelIMAPXStream;
struct _CamelFlag;
struct _CamelIMAPXStore;
/* list of strings we know about that can be *quickly* tokenised */
typedef enum _camel_imapx_id_t {
IMAPX_UNKNOWN = 0,
IMAPX_ALERT,
IMAPX_APPENDUID,
IMAPX_BAD,
IMAPX_BODY,
IMAPX_BODYSTRUCTURE,
IMAPX_BYE,
IMAPX_CAPABILITY,
IMAPX_CLOSED,
IMAPX_COPYUID,
IMAPX_ENVELOPE,
IMAPX_EXISTS,
IMAPX_EXPUNGE,
IMAPX_FETCH,
IMAPX_FLAGS,
IMAPX_HIGHESTMODSEQ,
IMAPX_INTERNALDATE,
IMAPX_LIST,
IMAPX_LSUB,
IMAPX_MESSAGES,
IMAPX_MODSEQ,
IMAPX_NAMESPACE,
IMAPX_NEWNAME,
IMAPX_NO,
IMAPX_NOMODSEQ,
IMAPX_OK,
IMAPX_PARSE,
IMAPX_PERMANENTFLAGS,
IMAPX_PREAUTH,
IMAPX_READ_ONLY,
IMAPX_READ_WRITE,
IMAPX_RECENT,
IMAPX_RFC822_HEADER,
IMAPX_RFC822_SIZE,
IMAPX_RFC822_TEXT,
IMAPX_STATUS,
IMAPX_TRYCREATE,
IMAPX_UID,
IMAPX_UIDVALIDITY,
IMAPX_UNSEEN,
IMAPX_UIDNEXT,
IMAPX_VANISHED,
/* RFC 5530: IMAP Response Codes */
IMAPX_ALREADYEXISTS,
IMAPX_AUTHENTICATIONFAILED,
IMAPX_AUTHORIZATIONFAILED,
IMAPX_CANNOT,
IMAPX_CLIENTBUG,
IMAPX_CONTACTADMIN,
IMAPX_CORRUPTION,
IMAPX_EXPIRED,
IMAPX_EXPUNGEISSUED,
IMAPX_INUSE,
IMAPX_LIMIT,
IMAPX_NONEXISTENT,
IMAPX_NOPERM,
IMAPX_OVERQUOTA,
IMAPX_PRIVACYREQUIRED,
IMAPX_SERVERBUG,
IMAPX_UNAVAILABLE
} camel_imapx_id_t;
#define CAMEL_IMAPX_UNTAGGED_BAD "BAD"
#define CAMEL_IMAPX_UNTAGGED_BYE "BYE"
#define CAMEL_IMAPX_UNTAGGED_CAPABILITY "CAPABILITY"
#define CAMEL_IMAPX_UNTAGGED_EXISTS "EXISTS"
#define CAMEL_IMAPX_UNTAGGED_EXPUNGE "EXPUNGE"
#define CAMEL_IMAPX_UNTAGGED_FETCH "FETCH"
#define CAMEL_IMAPX_UNTAGGED_FLAGS "FLAGS"
#define CAMEL_IMAPX_UNTAGGED_LIST "LIST"
#define CAMEL_IMAPX_UNTAGGED_LSUB "LSUB"
#define CAMEL_IMAPX_UNTAGGED_NAMESPACE "NAMESPACE"
#define CAMEL_IMAPX_UNTAGGED_NO "NO"
#define CAMEL_IMAPX_UNTAGGED_OK "OK"
#define CAMEL_IMAPX_UNTAGGED_PREAUTH "PREAUTH"
#define CAMEL_IMAPX_UNTAGGED_QUOTA "QUOTA"
#define CAMEL_IMAPX_UNTAGGED_QUOTAROOT "QUOTAROOT"
#define CAMEL_IMAPX_UNTAGGED_RECENT "RECENT"
#define CAMEL_IMAPX_UNTAGGED_SEARCH "SEARCH"
#define CAMEL_IMAPX_UNTAGGED_STATUS "STATUS"
#define CAMEL_IMAPX_UNTAGGED_VANISHED "VANISHED"
/* str MUST be in upper case, tokenised using gperf function */
camel_imapx_id_t
imapx_tokenise (register const gchar *str,
register guint len);
/* this flag should be part of imapfoldersummary */
enum {
CAMEL_IMAPX_MESSAGE_RECENT = (1 << 21),
};
/* ********************************************************************** */
GArray * imapx_parse_uids (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
gboolean imapx_parse_flags (struct _CamelIMAPXStream *is,
guint32 *flagsp,
struct _CamelFlag **user_flagsp,
GCancellable *cancellable,
GError **error);
void imapx_write_flags (GString *string,
guint32 flags,
struct _CamelFlag *user_flags);
gboolean imapx_update_message_info_flags (CamelMessageInfo *info,
guint32 server_flags,
CamelFlag *server_user_flags,
guint32 permanent_flags,
CamelFolder *folder,
gboolean unsolicited);
void imapx_set_message_info_flags_for_new_message
(CamelMessageInfo *info,
guint32 server_flags,
CamelFlag *server_user_flags,
CamelFolder *folder);
void imapx_update_store_summary (CamelFolder *folder);
gchar * camel_imapx_dup_uid_from_summary_index
(CamelFolder *folder,
guint summary_index);
/* ********************************************************************** */
/* Handy server capability test macros.
* Both return FALSE if capabilities are unknown. */
#define CAMEL_IMAPX_HAVE_CAPABILITY(info, name) \
((info) != NULL && ((info)->capa & IMAPX_CAPABILITY_##name) != 0)
#define CAMEL_IMAPX_LACK_CAPABILITY(info, name) \
((info) != NULL && ((info)->capa & IMAPX_CAPABILITY_##name) == 0)
enum {
IMAPX_CAPABILITY_IMAP4 = (1 << 0),
IMAPX_CAPABILITY_IMAP4REV1 = (1 << 1),
IMAPX_CAPABILITY_STATUS = (1 << 2),
IMAPX_CAPABILITY_NAMESPACE = (1 << 3),
IMAPX_CAPABILITY_UIDPLUS = (1 << 4),
IMAPX_CAPABILITY_LITERALPLUS = (1 << 5),
IMAPX_CAPABILITY_STARTTLS = (1 << 6),
IMAPX_CAPABILITY_IDLE = (1 << 7),
IMAPX_CAPABILITY_CONDSTORE = (1 << 8),
IMAPX_CAPABILITY_QRESYNC = (1 << 9),
IMAPX_CAPABILITY_LIST_STATUS = (1 << 10),
IMAPX_CAPABILITY_LIST_EXTENDED = (1 << 11),
IMAPX_CAPABILITY_QUOTA = (1 << 12),
IMAPX_CAPABILITY_MOVE = (1 << 13),
IMAPX_CAPABILITY_NOTIFY = (1 << 14),
IMAPX_CAPABILITY_SPECIAL_USE = (1 << 15)
};
struct _capability_info {
guint32 capa;
GHashTable *auth_types;
};
struct _capability_info *
imapx_parse_capability (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
void imapx_free_capability (struct _capability_info *);
guint32 imapx_register_capability (const gchar *capability);
guint32 imapx_lookup_capability (const gchar *capability);
gboolean imapx_parse_param_list (struct _CamelIMAPXStream *is,
struct _camel_header_param **plist,
GCancellable *cancellable,
GError **error);
struct _CamelContentDisposition *
imapx_parse_ext_optional (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
struct _CamelMessageContentInfo *
imapx_parse_body_fields (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
struct _camel_header_address *
imapx_parse_address_list (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
struct _CamelMessageInfo *
imapx_parse_envelope (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
struct _CamelMessageContentInfo *
imapx_parse_body (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
gchar * imapx_parse_section (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
void imapx_free_body (struct _CamelMessageContentInfo *cinfo);
/* ********************************************************************** */
/* all the possible stuff we might get from a fetch request */
/* this assumes the caller/server doesn't send any one of these types twice */
struct _fetch_info {
guint32 got; /* what we got, see below */
CamelStream *body; /* BODY[.*](<.*>)? */
CamelStream *text; /* RFC822.TEXT */
CamelStream *header; /* RFC822.HEADER */
CamelMessageInfo *minfo; /* ENVELOPE */
CamelMessageContentInfo *cinfo; /* BODYSTRUCTURE,BODY */
guint32 size; /* RFC822.SIZE */
guint32 offset; /* start offset of a BODY[] request */
guint32 flags; /* FLAGS */
guint64 modseq; /* MODSEQ */
CamelFlag *user_flags;
gchar *date; /* INTERNALDATE */
gchar *section; /* section for a BODY[section] request */
gchar *uid; /* UID */
};
#define FETCH_BODY (1 << 0)
#define FETCH_TEXT (1 << 1)
#define FETCH_HEADER (1 << 2)
#define FETCH_MINFO (1 << 3)
#define FETCH_CINFO (1 << 4)
#define FETCH_SIZE (1 << 5)
#define FETCH_OFFSET (1 << 6)
#define FETCH_FLAGS (1 << 7)
#define FETCH_DATE (1 << 8)
#define FETCH_SECTION (1 << 9)
#define FETCH_UID (1 << 10)
#define FETCH_MODSEQ (1 << 11)
struct _fetch_info *
imapx_parse_fetch (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
GError **error);
void imapx_free_fetch (struct _fetch_info *finfo);
void imapx_dump_fetch (struct _fetch_info *finfo);
/* ********************************************************************** */
struct _status_info {
camel_imapx_id_t result; /* ok/no/bad/preauth only, user_cancel - client response */
camel_imapx_id_t condition; /* read-only/read-write/alert/parse/trycreate/newname/permanentflags/uidvalidity/unseen/highestmodseq */
union {
struct {
gchar *oldname;
gchar *newname;
} newname;
guint32 permanentflags;
struct {
guint64 uidvalidity;
guint32 uid;
} appenduid;
struct {
guint64 uidvalidity;
GArray *uids;
GArray *copied_uids;
} copyuid;
struct _capability_info *cinfo;
} u;
gchar *text;
};
struct _status_info *
imapx_parse_status (struct _CamelIMAPXStream *is,
CamelIMAPXMailbox *mailbox,
GCancellable *cancellable,
GError **error);
struct _status_info *
imapx_copy_status (struct _status_info *sinfo);
void imapx_free_status (struct _status_info *sinfo);
/* ********************************************************************** */
gboolean camel_imapx_command_add_qresync_parameter
(struct _CamelIMAPXCommand *ic,
CamelFolder *folder);
/* ********************************************************************** */
gchar * camel_imapx_parse_mailbox (struct _CamelIMAPXStream *is,
gchar separator,
GCancellable *cancellable,
GError **error);
void camel_imapx_normalize_mailbox (gchar *mailbox_name,
gchar separator);
gboolean camel_imapx_mailbox_is_inbox (const gchar *mailbox_name);
gchar * camel_imapx_mailbox_to_folder_path
(const gchar *mailbox_name,
gchar separator);
gchar * camel_imapx_folder_path_to_mailbox
(const gchar *folder_path,
gchar separator);
/* ********************************************************************** */
gboolean camel_imapx_parse_quota (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
gchar **out_quota_root_name,
CamelFolderQuotaInfo **out_quota_info,
GError **error);
gboolean camel_imapx_parse_quotaroot (struct _CamelIMAPXStream *is,
GCancellable *cancellable,
gchar **out_mailbox_name,
gchar ***out_quota_roots,
GError **error);
/* ********************************************************************** */
extern guchar imapx_specials[256];
#define IMAPX_TYPE_CHAR (1 << 0)
#define IMAPX_TYPE_TEXT_CHAR (1 << 1)
#define IMAPX_TYPE_QUOTED_CHAR (1 << 2)
#define IMAPX_TYPE_ATOM_CHAR (1 << 3)
#define IMAPX_TYPE_TOKEN_CHAR (1 << 4)
#define IMAPX_TYPE_NOTID_CHAR (1 << 5)
guchar imapx_is_mask (const gchar *p);
#define imapx_is_text_char(c) \
((imapx_specials[((guchar)(c)) & 0xff] & IMAPX_TYPE_TEXT_CHAR) != 0)
#define imapx_is_quoted_char(c) \
((imapx_specials[((guchar)(c)) & 0xff] & IMAPX_TYPE_QUOTED_CHAR) != 0)
#define imapx_is_atom_char(c) \
((imapx_specials[((guchar)(c)) & 0xff] & IMAPX_TYPE_ATOM_CHAR) != 0)
#define imapx_is_token_char(c) \
((imapx_specials[((guchar)(c)) & 0xff] & IMAPX_TYPE_TOKEN_CHAR) != 0)
#define imapx_is_notid_char(c) \
((imapx_specials[((guchar)(c)) & 0xff] & IMAPX_TYPE_NOTID_CHAR) != 0)
#define imapx_is_atom(s) \
(imapx_is_mask (s) & IMAPX_TYPE_ATOM_CHAR)
extern gint camel_imapx_debug_flags;
#define CAMEL_IMAPX_DEBUG_command (1 << 0)
#define CAMEL_IMAPX_DEBUG_debug (1 << 1)
#define CAMEL_IMAPX_DEBUG_extra (1 << 2)
#define CAMEL_IMAPX_DEBUG_io (1 << 3)
#define CAMEL_IMAPX_DEBUG_token (1 << 4)
#define CAMEL_IMAPX_DEBUG_parse (1 << 5)
/* Set this to zero to remove all debug output at build time */
#define CAMEL_IMAPX_DEBUG_ALL ((1 << 7)-1)
#define camel_debug_flag(type) \
(camel_imapx_debug_flags & \
CAMEL_IMAPX_DEBUG_ALL & CAMEL_IMAPX_DEBUG_ ## type)
#define camel_imapx_debug(type, tagprefix, fmt, ...) \
G_STMT_START { \
if (camel_debug_flag (type)) { \
printf ("[imapx:%c] " fmt, tagprefix , ##__VA_ARGS__); \
fflush (stdout); \
} \
} G_STMT_END
/* ********************************************************************** */
void imapx_utils_init (void);
/* chen adds from old imap provider - place it in right place */
gchar * imapx_path_to_physical (const gchar *prefix,
const gchar *vpath);
gchar * imapx_get_temp_uid (void);
G_END_DECLS
#endif /* CAMEL_IMAPX_UTILS_H */