[evolution-data-server] Bug 609398 - [IMAPX] Subscriptions are not respected.
- From: Chenthill Palanisamy <pchen src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug 609398 - [IMAPX] Subscriptions are not respected.
- Date: Wed, 10 Feb 2010 00:37:55 +0000 (UTC)
commit 4c0f7459e4a32b96496120a0d39edfebf5b5e474
Author: Chenthill Palanisamy <pchenthill novell com>
Date: Wed Feb 10 06:09:36 2010 +0530
Bug 609398 - [IMAPX] Subscriptions are not respected.
camel/providers/imapx/camel-imapx-server.c | 1 -
camel/providers/imapx/camel-imapx-store.c | 496 +++++-----------------------
camel/providers/imapx/camel-imapx-store.h | 16 +-
camel/providers/imapx/camel-imapx-utils.h | 2 +-
4 files changed, 96 insertions(+), 419 deletions(-)
---
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index d17689f..df9a39d 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -3488,7 +3488,6 @@ imapx_server_get_message (CamelIMAPXServer *is, CamelFolder *folder, const gchar
stream = camel_stream_fs_new_with_name(cache_file, O_RDONLY, 0);
else {
camel_exception_set (ex, 1, "failed to copy the tmp file");
- g_assert_not_reached ();
}
} else {
camel_exception_setv(ex, 1, "closing tmp stream failed: %s", g_strerror(errno));
diff --git a/camel/providers/imapx/camel-imapx-store.c b/camel/providers/imapx/camel-imapx-store.c
index 659626e..ec6422b 100644
--- a/camel/providers/imapx/camel-imapx-store.c
+++ b/camel/providers/imapx/camel-imapx-store.c
@@ -84,7 +84,41 @@ imapx_name_equal(gconstpointer a, gconstpointer b)
return g_str_equal(aname, bname);
}
-static void imapx_construct(CamelService *service, CamelSession *session, CamelProvider *provider, CamelURL *url, CamelException *ex)
+static void
+imapx_parse_receiving_options (CamelIMAPXStore *istore, CamelURL *url)
+{
+ if (camel_url_get_param (url, "use_lsub"))
+ istore->rec_options |= IMAPX_SUBSCRIPTIONS;
+
+ if (camel_url_get_param (url, "override_namespace") && camel_url_get_param (url, "namespace")) {
+ istore->rec_options |= IMAPX_OVERRIDE_NAMESPACE;
+ g_free(istore->namespace);
+ istore->namespace = g_strdup (camel_url_get_param (url, "namespace"));
+ }
+
+ if (camel_url_get_param (url, "check_all"))
+ istore->rec_options |= IMAPX_CHECK_ALL;
+
+ if (camel_url_get_param (url, "check_lsub"))
+ istore->rec_options |= IMAPX_CHECK_LSUB;
+
+ if (camel_url_get_param (url, "filter")) {
+ istore->rec_options |= IMAPX_FILTER_INBOX;
+ ((CamelStore *) istore)->flags |= CAMEL_STORE_FILTER_INBOX;
+ }
+
+ if (camel_url_get_param (url, "filter_junk"))
+ istore->rec_options |= IMAPX_FILTER_JUNK;
+
+ if (camel_url_get_param (url, "filter_junk_inbox"))
+ istore->rec_options |= IMAPX_FILTER_JUNK_INBOX;
+
+ if (camel_url_get_param (url, "use_idle"))
+ istore->rec_options |= IMAPX_USE_IDLE;
+}
+
+static void
+imapx_construct(CamelService *service, CamelSession *session, CamelProvider *provider, CamelURL *url, CamelException *ex)
{
gchar *summary;
CamelIMAPXStore *store = (CamelIMAPXStore *)service;
@@ -93,6 +127,11 @@ static void imapx_construct(CamelService *service, CamelSession *session, CamelP
if (camel_exception_is_set(ex))
return;
+ store->base_url = camel_url_to_string (service->url, (CAMEL_URL_HIDE_PASSWORD |
+ CAMEL_URL_HIDE_PARAMS |
+ CAMEL_URL_HIDE_AUTH));
+ imapx_parse_receiving_options (store, service->url);
+
store->summary = camel_imapx_store_summary_new();
store->storage_path = camel_session_get_storage_path(session, service, ex);
if (store->storage_path) {
@@ -102,15 +141,12 @@ static void imapx_construct(CamelService *service, CamelSession *session, CamelP
camel_store_summary_set_uri_base((CamelStoreSummary *)store->summary, service->url);
camel_store_summary_load((CamelStoreSummary *)store->summary);
}
-
- store->base_url = camel_url_to_string (service->url, (CAMEL_URL_HIDE_PASSWORD |
- CAMEL_URL_HIDE_PARAMS |
- CAMEL_URL_HIDE_AUTH));
}
extern CamelServiceAuthType camel_imapx_password_authtype;
extern CamelServiceAuthType camel_imapx_apop_authtype;
+/* TODO implement */
static GList *
imapx_query_auth_types (CamelService *service, CamelException *ex)
{
@@ -121,63 +157,9 @@ imapx_query_auth_types (CamelService *service, CamelException *ex)
if (types == NULL)
return NULL;
-#if 0
- if (connect_to_server_wrapper (service, NULL)) {
- types = g_list_concat(types, g_list_copy(store->engine->auth));
- imapx_disconnect (service, TRUE, NULL);
- } else {
- camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
- _("Could not connect to POP server on %s"),
- service->url->host);
- }
-#endif
return types;
}
-#if 0
-static void
-store_get_pass(CamelIMAPXStore *store)
-{
- if (((CamelService *)store)->url->passwd == NULL) {
- gchar *prompt;
- CamelException ex;
-
- camel_exception_init(&ex);
-
- prompt = g_strdup_printf (_("%sPlease enter the IMAP password for %s %s"),
- store->login_error?store->login_error:"",
- ((CamelService *)store)->url->user,
- ((CamelService *)store)->url->host);
- ((CamelService *)store)->url->passwd = camel_session_get_password(camel_service_get_session((CamelService *)store),
- (CamelService *)store, NULL,
- prompt, "password", CAMEL_SESSION_PASSWORD_SECRET, &ex);
- g_free (prompt);
- if (camel_exception_is_set(&ex))
- camel_exception_throw_ex(&ex);
- }
-}
-
-static struct _CamelSasl *
-store_get_sasl(struct _CamelIMAPXDriver *driver, CamelIMAPXStore *store)
-{
- store_get_pass(store);
-
- if (((CamelService *)store)->url->authmech)
- return camel_sasl_new("imap", ((CamelService *)store)->url->authmech, (CamelService *)store);
-
- return NULL;
-}
-
-static void
-store_get_login(struct _CamelIMAPXDriver *driver, gchar **login, gchar **pass, CamelIMAPXStore *store)
-{
- store_get_pass(store);
-
- *login = g_strdup(((CamelService *)store)->url->user);
- *pass = g_strdup(((CamelService *)store)->url->passwd);
-}
-#endif
-
static gchar *
imapx_get_name (CamelService *service, gboolean brief)
{
@@ -340,118 +322,6 @@ imapx_get_inbox(CamelStore *store, CamelException *ex)
return NULL;
}
-#if 0
-static CamelFolderInfo *
-folders_build_info(CamelURL *base, struct _list_info *li)
-{
- gchar *path, *full_name, *name;
- CamelFolderInfo *fi;
-
- full_name = imapx_list_get_path(li);
- name = strrchr(full_name, '/');
- if (name)
- name++;
- else
- name = full_name;
-
- path = alloca(strlen(full_name)+2);
- sprintf(path, "/%s", full_name);
- camel_url_set_path(base, path);
-
- fi = g_malloc0(sizeof(*fi));
- fi->uri = camel_url_to_string(base, CAMEL_URL_HIDE_ALL);
- fi->name = g_strdup(name);
- fi->full_name = full_name;
- fi->unread = -1;
- fi->total = -1;
- fi->flags = li->flags;
-
- if (!g_ascii_strcasecmp(fi->full_name, "inbox"))
- fi->flags |= CAMEL_FOLDER_SYSTEM;
-
- /* TODO: could look up count here ... */
- /* ?? */
- /*folder = camel_object_bag_get(store->folders, "INBOX");*/
-
- return fi;
-}
-
-/*
- a
- a/b
- a/b/c
- a/d
- b
- c/d
-
-*/
-
-/* note, pname is the raw name, not the folderinfo name */
-/* note also this free's as we go, since we never go 'backwards' */
-static CamelFolderInfo *
-folders_build_rec(CamelURL *base, GPtrArray *folders, gint *ip, CamelFolderInfo *pfi, gchar *pname)
-{
- gint plen = 0;
- CamelFolderInfo *last = NULL, *first = NULL;
-
- if (pfi)
- plen = strlen(pname);
-
- for (;(*ip)<(gint)folders->len;) {
- CamelFolderInfo *fi;
- struct _list_info *li;
-
- li = folders->pdata[*ip];
- printf("checking '%s' is child of '%s'\n", li->name, pname);
-
- /* is this a child of the parent? */
- if (pfi != NULL
- && (strncmp(pname, li->name, strlen(pname)) != 0
- || li->name[plen] != li->separator)) {
- printf(" nope\n");
- break;
- }
- printf(" yep\n");
-
- /* is this not an immediate child of the parent? */
-#if 0
- gchar *p;
- if (pfi != NULL
- && li->separator != 0
- && (p = strchr(li->name + plen + 1, li->separator)) != NULL) {
- if (last == NULL) {
- struct _list_info tli;
-
- tli.flags = CAMEL_FOLDER_NOSELECT|CAMEL_FOLDER_CHILDREN;
- tli.separator = li->separator;
- tli.name = g_strndup(li->name, p-li->name+1);
- fi = folders_build_info(base, &tli);
- fi->parent = pfi;
- if (pfi && pfi->child == NULL)
- pfi->child = fi;
- i = folders_build_rec(folders, i, fi, tli.name);
- break;
- }
- }
-#endif
-
- fi = folders_build_info(base, li);
- fi->parent = pfi;
- if (last != NULL)
- last->next = fi;
- last = fi;
- if (first == NULL)
- first = fi;
-
- (*ip)++;
- fi->child = folders_build_rec(base, folders, ip, fi, li->name);
- imapx_free_list(li);
- }
-
- return first;
-}
-#endif
-
/* folder_name is path name */
static CamelFolderInfo *
imapx_build_folder_info (CamelIMAPXStore *imapx_store, const gchar *folder_name)
@@ -630,7 +500,8 @@ get_folder_info_offline (CamelStore *store, const gchar *top,
if ((g_str_equal (name, full_name)
|| imapx_match_pattern (ns, pattern, full_name)
|| (include_inbox && !g_ascii_strcasecmp (full_name, "INBOX")))
- && ( TRUE
+ && ( ((imapx_store->rec_options & IMAPX_SUBSCRIPTIONS) == 0
+ || (flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED) == 0)
|| (si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED)
|| (flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIPTION_LIST) != 0)) {
@@ -674,7 +545,7 @@ get_folder_info_offline (CamelStore *store, const gchar *top,
}
static void
-add_folders_to_summary (CamelIMAPXStore *istore, GPtrArray *folders, GHashTable **table)
+add_folders_to_summary (CamelIMAPXStore *istore, GPtrArray *folders, GHashTable *table, gboolean subcribed)
{
gint i = 0;
@@ -698,9 +569,6 @@ add_folders_to_summary (CamelIMAPXStore *istore, GPtrArray *folders, GHashTable
camel_store_summary_touch ((CamelStoreSummary *) istore->summary);
}
- if (!table)
- continue;
-
fi = camel_folder_info_new ();
fi->full_name = g_strdup(camel_store_info_path(istore->summary, si));
if (!g_ascii_strcasecmp(fi->full_name, "inbox")) {
@@ -709,6 +577,15 @@ add_folders_to_summary (CamelIMAPXStore *istore, GPtrArray *folders, GHashTable
} else
fi->name = g_strdup(camel_store_info_name(istore->summary, si));
+ hfi = g_hash_table_lookup (table, fi->name);
+ if (hfi) {
+ if (subcribed)
+ hfi->flags |= CAMEL_STORE_INFO_FOLDER_SUBSCRIBED;
+
+ camel_folder_info_free (fi);
+ continue;
+ }
+
/* HACK: some servers report noinferiors for all folders (uw-imapd)
We just translate this into nochildren, and let the imap layer enforce
it. See create folder */
@@ -716,6 +593,9 @@ add_folders_to_summary (CamelIMAPXStore *istore, GPtrArray *folders, GHashTable
li->flags = (li->flags & ~CAMEL_FOLDER_NOINFERIORS) | CAMEL_FOLDER_NOCHILDREN;
fi->flags = li->flags;
+ if (subcribed)
+ fi->flags |= CAMEL_STORE_INFO_FOLDER_SUBSCRIBED;
+
url = camel_url_new (istore->base_url, NULL);
path = alloca(strlen(fi->full_name)+2);
sprintf(path, "/%s", fi->full_name);
@@ -729,11 +609,7 @@ add_folders_to_summary (CamelIMAPXStore *istore, GPtrArray *folders, GHashTable
fi->total = -1;
fi->unread = -1;
- hfi = g_hash_table_lookup (*table, fi->name);
- if (hfi == NULL)
- g_hash_table_insert (*table, fi->name, fi);
- else if ((hfi->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) ^ (fi->flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED))
- hfi->flags |= CAMEL_STORE_INFO_FOLDER_SUBSCRIBED;
+ g_hash_table_insert (table, fi->name, fi);
}
}
@@ -745,12 +621,18 @@ free_list (gpointer data, gpointer user_data)
}
static void
-fetch_folders_for_pattern (CamelIMAPXStore *istore, const gchar *pattern, guint32 flags, GHashTable **table, CamelException *ex)
+imapx_get_folders_free(gpointer k, gpointer v, gpointer d)
+{
+ camel_folder_info_free(v);
+}
+
+static void
+fetch_folders_for_pattern (CamelIMAPXStore *istore, const gchar *pattern, guint32 flags, GHashTable *table, CamelException *ex)
{
GPtrArray *folders = NULL;
folders = camel_imapx_server_list (istore->server, pattern, flags, ex);
- add_folders_to_summary (istore, folders, table);
+ add_folders_to_summary (istore, folders, table, (flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED));
g_ptr_array_foreach (folders, free_list, folders);
g_ptr_array_free (folders, TRUE);
@@ -800,9 +682,9 @@ fetch_folders_for_namespaces (CamelIMAPXStore *istore, const gchar *pattern, Cam
pat = g_strdup (pattern);
flags |= CAMEL_STORE_FOLDER_INFO_RECURSIVE;
- fetch_folders_for_pattern (istore, pat, flags, &folders, ex);
+ fetch_folders_for_pattern (istore, pat, flags, folders, ex);
flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED;
- fetch_folders_for_pattern (istore, pat, flags, &folders, ex);
+ fetch_folders_for_pattern (istore, pat, flags, folders, ex);
g_free (pat);
@@ -840,7 +722,7 @@ sync_folders (CamelIMAPXStore *istore, const gchar *pattern, CamelException *ex)
continue;
}
- if (!pattern || imapx_match_pattern (camel_imapx_store_summary_namespace_find_full (istore->summary, full_name), pattern, full_name)) {
+ if (!pattern || !*pattern || imapx_match_pattern (camel_imapx_store_summary_namespace_find_full (istore->summary, full_name), pattern, full_name)) {
if ((fi = g_hash_table_lookup(folders_from_server, camel_store_info_path(istore->summary, si))) != NULL) {
if (((fi->flags ^ si->flags) & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED)) {
si->flags = (si->flags & ~CAMEL_FOLDER_SUBSCRIBED) | (fi->flags & CAMEL_FOLDER_SUBSCRIBED);
@@ -871,6 +753,9 @@ sync_folders (CamelIMAPXStore *istore, const gchar *pattern, CamelException *ex)
}
camel_store_summary_info_free((CamelStoreSummary *)istore->summary, si);
}
+
+ g_hash_table_foreach (folders_from_server, imapx_get_folders_free, NULL);
+ g_hash_table_destroy (folders_from_server);
}
static CamelFolderInfo *
@@ -890,13 +775,10 @@ imapx_get_folder_info(CamelStore *store, const gchar *top, guint32 flags, CamelE
if (!camel_service_connect((CamelService *)store, ex))
return NULL;
- if (camel_store_summary_count ((CamelStoreSummary *) istore->summary) == 0) {
- sync_folders (istore, top, ex);
- camel_store_summary_save((CamelStoreSummary *) istore->summary);
- }
+ sync_folders (istore, top, ex);
+ camel_store_summary_save((CamelStoreSummary *) istore->summary);
fi = get_folder_info_offline (store, top, flags, ex);
-
return fi;
}
@@ -946,231 +828,21 @@ imapx_can_refresh_folder (CamelStore *store, CamelFolderInfo *info, CamelExcepti
return res;
}
-/* ********************************************************************** */
-#if 0
-static gint store_resp_fetch(CamelIMAPXEngine *ie, guint32 id, gpointer data)
-{
- struct _fetch_info *finfo;
- CamelIMAPXStore *istore = data;
- CamelMessageInfo *info;
- struct _pending_fetch *pending;
-
- finfo = imapx_parse_fetch(ie->stream);
- if (istore->selected) {
- if ((finfo->got & FETCH_UID) == 0) {
- printf("didn't get uid in fetch response?\n");
- } else {
- info = camel_folder_summary_index(((CamelFolder *)istore->selected)->summary, id-1);
- /* exists, check/update */
- if (info) {
- if (strcmp(finfo->uid, camel_message_info_uid(info)) != 0) {
- printf("summary at index %d has uid %s expected %s\n", id, camel_message_info_uid(info), finfo->uid);
- /* uid mismatch??? try do it based on uid instead? try to reorder? i dont know? */
- camel_message_info_free(info);
- info = camel_folder_summary_uid(((CamelFolder *)istore->selected)->summary, finfo->uid);
- }
- }
-
- if (info) {
- if (finfo->got & (FETCH_FLAGS)) {
- printf("updating flags for uid '%s'\n", finfo->uid);
- info->flags = finfo->flags;
- camel_folder_change_info_change_uid(istore->selected->changes, finfo->uid);
- }
- if (finfo->got & FETCH_MINFO) {
- printf("got envelope unexpectedly?\n");
- }
- /* other things go here, like body fetches */
- } else {
- pending = g_hash_table_lookup(istore->pending_fetch_table, finfo->uid);
-
- /* we need to create a new info, we only care about flags and minfo */
-
- if (pending)
- info = pending->info;
- else {
- info = camel_folder_summary_info_new(((CamelFolder *)istore->selected)->summary);
- camel_message_info_set_uid(info, g_strdup(finfo->uid));
- }
-
- if (finfo->got & FETCH_FLAGS)
- info->flags = finfo->flags;
-
- if (finfo->got & FETCH_MINFO) {
- /* if we only use ENVELOPE? */
- camel_message_info_set_subject(info, g_strdup(camel_message_info_subject(finfo->minfo)));
- camel_message_info_set_from(info, g_strdup(camel_message_info_from(finfo->minfo)));
- camel_message_info_set_to(info, g_strdup(camel_message_info_to(finfo->minfo)));
- camel_message_info_set_cc(info, g_strdup(camel_message_info_cc(finfo->minfo)));
- info->date_sent = finfo->minfo->date_sent;
- camel_folder_summary_add(((CamelFolder *)istore->selected)->summary, info);
- camel_folder_change_info_add_uid(istore->selected->changes, finfo->uid);
- if (pending) {
- camel_dlist_remove((CamelDListNode *)pending);
- g_hash_table_remove(istore->pending_fetch_table, finfo->uid);
- /*e_memchunk_free(istore->pending_fetch_chunks, pending);*/
- }
- } else if (finfo->got & FETCH_HEADER) {
- /* if we only use HEADER? */
- CamelMimeParser *mp;
-
- if (pending == NULL)
- camel_message_info_free(info);
- mp = camel_mime_parser_new();
- camel_mime_parser_init_with_stream(mp, finfo->header);
- info = camel_folder_summary_info_new_from_parser(((CamelFolder *)istore->selected)->summary, mp);
- camel_object_unref(mp);
- camel_message_info_set_uid(info, g_strdup(finfo->uid));
-
- camel_folder_summary_add(((CamelFolder *)istore->selected)->summary, info);
- camel_folder_change_info_add_uid(istore->selected->changes, finfo->uid);
- if (pending) {
- /* FIXME: use a dlist */
- camel_dlist_remove((CamelDListNode *)pending);
- g_hash_table_remove(istore->pending_fetch_table, camel_message_info_uid(pending->info));
- camel_message_info_free(pending->info);
- /*e_memchunk_free(istore->pending_fetch_chunks, pending);*/
- }
- } else if (finfo->got & FETCH_FLAGS) {
- if (pending == NULL) {
- pending = e_memchunk_alloc(istore->pending_fetch_chunks);
- pending->info = info;
- g_hash_table_insert(istore->pending_fetch_table, (gchar *)camel_message_info_uid(info), pending);
- camel_dlist_addtail(&istore->pending_fetch_list, (CamelDListNode *)pending);
- }
- } else {
- if (pending == NULL)
- camel_message_info_free(info);
- printf("got unexpected fetch response?\n");
- imapx_dump_fetch(finfo);
- }
- }
- }
- } else {
- printf("unexpected fetch response, no folder selected?\n");
- }
- /*imapx_dump_fetch(finfo);*/
- imapx_free_fetch(finfo);
-
- return camel_imapx_engine_skip(ie);
-}
-#endif
-
-/* ********************************************************************** */
-
-/* should be moved to imapx-utils?
- stuff in imapx-utils should be moved to imapx-parse? */
-
-/* ********************************************************************** */
-
-#if 0
-void
-camel_imapx_store_folder_selected(CamelIMAPXStore *store, CamelIMAPXFolder *folder, CamelIMAPXSelectResponse *select)
-{
- CamelIMAPXCommand * volatile ic = NULL;
- CamelIMAPXStore *istore = (CamelIMAPXStore *)store;
- gint i;
- struct _uidset_state ss;
- GPtrArray *fetch;
- CamelMessageInfo *info;
- struct _pending_fetch *fw, *fn;
-
- printf("imap folder selected\n");
-
- if (select->uidvalidity == folder->uidvalidity
- && select->exists == folder->exists
- && select->recent == folder->recent
- && select->unseen == folder->unseen) {
- /* no work to do? */
- return;
- }
-
- istore->pending_fetch_table = g_hash_table_new(g_str_hash, g_str_equal);
- istore->pending_fetch_chunks = e_memchunk_new(256, sizeof(struct _pending_fetch));
-
- /* perform an update - flags first (and see what we have) */
- CAMEL_TRY {
- ic = camel_imapx_engine_command_new(istore->engine, "FETCH", NULL, "FETCH 1:%d (UID FLAGS)", select->exists);
- camel_imapx_engine_command_queue(istore->engine, ic);
- while (camel_imapx_engine_iterate(istore->engine, ic) > 0)
- ;
-
- if (ic->status->result != IMAP_OK)
- camel_exception_throw(1, "fetch failed: %s", ic->status->text);
-
- /* pending_fetch_list now contains any new messages */
- /* FIXME: how do we work out no-longer present messages? */
- printf("now fetching info for messages?\n");
- uidset_init(&ss, store->engine);
- ic = camel_imapx_engine_command_new(istore->engine, "FETCH", NULL, "UID FETCH ");
- fw = (struct _pending_fetch *)istore->pending_fetch_list.head;
- fn = fw->next;
- while (fn) {
- info = fw->info;
- /* if the uid set fills, then flush the command out */
- if (uidset_add(&ss, ic, camel_message_info_uid(info))
- || (fn->next == NULL && uidset_done(&ss, ic))) {
- camel_imapx_engine_command_add(istore->engine, ic, " (FLAGS RFC822.HEADER)");
- camel_imapx_engine_command_queue(istore->engine, ic);
- while (camel_imapx_engine_iterate(istore->engine, ic) > 0)
- ;
- if (ic->status->result != IMAP_OK)
- camel_exception_throw(1, "fetch failed: %s", ic->status->text);
- /* if not end ... */
- camel_imapx_engine_command_free(istore->engine, ic);
- ic = camel_imapx_engine_command_new(istore->engine, "FETCH", NULL, "UID FETCH ");
- }
- fw = fn;
- fn = fn->next;
- }
-
- printf("The pending list should now be empty: %s\n", camel_dlist_empty(&istore->pending_fetch_list)?"TRUE":"FALSE");
- for (i=0;i<10;i++) {
- info = camel_folder_summary_index(((CamelFolder *)istore->selected)->summary, i);
- if (info) {
- printf("message info [%d] =\n", i);
- camel_message_info_dump(info);
- camel_message_info_free(info);
- }
- }
- } CAMEL_CATCH (e) {
- /* FIXME: cleanup */
- camel_exception_throw_ex(e);
- } CAMEL_DONE;
-
- g_hash_table_destroy(istore->pending_fetch_table);
- istore->pending_fetch_table = NULL;
- e_memchunk_destroy(istore->pending_fetch_chunks);
-
- camel_imapx_engine_command_free(istore->engine, ic);
-}
-#endif
-
-#if 0
-/*char *uids[] = {"1", "2", "4", "5", "6", "7", "9", "11", "12", 0};*/
-/*char *uids[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 0};*/
-gchar *uids[] = {"1", "3", "5", "7", "9", "11", "12", "13", "14", "15", "20", "21", "24", "25", "26", 0};
-
-void
-uidset_test(CamelIMAPXEngine *ie)
+static gboolean
+imapx_folder_subscribed (CamelStore *store, const gchar *folder_name)
{
- struct _uidset_state ss;
- CamelIMAPXCommand *ic;
- gint i;
+ CamelIMAPXStore *istore = CAMEL_IMAPX_STORE (store);
+ CamelStoreInfo *si;
+ gint is_subscribed = FALSE;
- /*ic = camel_imapx_engine_command_new(ie, 0, "FETCH", NULL, "FETCH ");*/
- uidset_init(&ss, 0, 0);
- for (i=0;uids[i];i++) {
- if (uidset_add(&ss, uids[i])) {
- printf("\n[%d] flushing uids\n", i);
- }
+ si = camel_store_summary_path((CamelStoreSummary *)istore->summary, folder_name);
+ if (si) {
+ is_subscribed = (si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) != 0;
+ camel_store_summary_info_free((CamelStoreSummary *)istore->summary, si);
}
- if (uidset_done(&ss)) {
- printf("\nflushing uids\n");
- }
+ return is_subscribed;
}
-#endif
static void
camel_imapx_store_class_init(CamelIMAPXStoreClass *klass)
@@ -1199,6 +871,8 @@ camel_imapx_store_class_init(CamelIMAPXStoreClass *klass)
camel_store_class->rename_folder = imapx_rename_folder;
camel_store_class->delete_folder = imapx_delete_folder;
camel_store_class->get_folder_info = imapx_get_folder_info;
+ camel_store_class->folder_subscribed = imapx_folder_subscribed;
+ camel_store_class->free_folder_info = camel_store_free_folder_info_full;
((CamelStoreClass *)klass)->hash_folder_name = imapx_name_hash;
((CamelStoreClass *)klass)->compare_folder_name = imapx_name_equal;
diff --git a/camel/providers/imapx/camel-imapx-store.h b/camel/providers/imapx/camel-imapx-store.h
index 773e5a0..bfcedb4 100644
--- a/camel/providers/imapx/camel-imapx-store.h
+++ b/camel/providers/imapx/camel-imapx-store.h
@@ -39,12 +39,14 @@ extern "C" {
#define CAMEL_IMAPX_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_IMAPX_STORE_TYPE, CamelIMAPXStoreClass))
#define CAMEL_IS_IMAP_STORE(o) (CAMEL_CHECK_TYPE((o), CAMEL_IMAPX_STORE_TYPE))
-struct _pending_fetch {
- struct _pending_fetch *next;
- struct _pending_fetch *prev;
-
- struct _CamelMessageInfo *info;
-};
+#define IMAPX_OVERRIDE_NAMESPACE (1 << 0)
+#define IMAPX_CHECK_ALL (1 << 1)
+#define IMAPX_FILTER_INBOX (1 << 2)
+#define IMAPX_FILTER_JUNK (1 << 3)
+#define IMAPX_FILTER_JUNK_INBOX (1 << 4)
+#define IMAPX_SUBSCRIPTIONS (1 << 5)
+#define IMAPX_CHECK_LSUB (1 << 6)
+#define IMAPX_USE_IDLE (1 << 7)
typedef struct {
CamelOfflineStore parent_object;
@@ -54,6 +56,8 @@ typedef struct {
CamelIMAPXStoreSummary *summary; /* in-memory list of folders */
gchar *namespace, dir_sep, *base_url, *storage_path;
+ guint32 rec_options;
+
/* if we had a login error, what to show to user */
gchar *login_error;
diff --git a/camel/providers/imapx/camel-imapx-utils.h b/camel/providers/imapx/camel-imapx-utils.h
index 1c13aa8..51f4ce0 100644
--- a/camel/providers/imapx/camel-imapx-utils.h
+++ b/camel/providers/imapx/camel-imapx-utils.h
@@ -75,7 +75,7 @@ enum {
IMAPX_CAPABILITY_IMAP4REV1 = (1 << 1),
IMAPX_CAPABILITY_STATUS = (1 << 2),
IMAPX_CAPABILITY_NAMESPACE = (1 << 3),
- IMAPX_CAPABILITY_UIDPLUS = (1 << 4),
+ IMAPX_CAPABILITY_UIDPLUS = (1 << 4),
IMAPX_CAPABILITY_LITERALPLUS = (1 << 5),
IMAPX_CAPABILITY_STARTTLS = (1 << 6),
IMAPX_CAPABILITY_IDLE = (1 << 7),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]