From d91b5bb03431dc5477cacfd2b922a68a1ec623c5 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Thu, 24 Oct 2002 14:01:53 +0000 Subject: ** For bug #31647 and bug #31456. 2002-10-24 Not Zed ** For bug #31647 and bug #31456. * camel-store-summary.c (store_info_string): for STORE_INFO_NAME, skip the leading /. * providers/imap/camel-imap-store.c (parse_list_response_as_folder_info): Remove jeff's last patch, and use the store summary to create the name and path of the folderinfo so it manages namespace issues. (get_folder_info_online): Just pass @top directly to build_folder_info always, since namespace is mapped to 1 tree level. (imap_build_folder_info): Remove jeff's last patch, dont strip leading /'s, they shouldn't exist. (imap_connect_online): Remove adding the INBOX here, we add it later. (get_subscribed_folders): Make sure INBOX is always in the list. some imap servers dont seem to let you subscribe to it(?), so always have it act as subscribed. * camel-store.c (camel_folder_info_build): back out the last 2 patches from Jeff (for #31456) to get the original behaviour. (camel_folder_info_build): When creating a fake parent, dont strip the namespace from the full_name. malloc keys in hash since we dont have them anymore. (free_name): Helper to free names. * providers/imap/camel-imap-store-summary.c (camel_imap_store_summary_namespace_new): Canonicalise the namespace (strip trailing dir_sep), and change the path to remove any /'s. (camel_imap_store_summary_namespace_find_path): (camel_imap_store_summary_namespace_find_full): new, find namespace by path/full name. (camel_imap_store_summary_full_from_path): Changed to a simple wrapper around path_to_full, after checking namespace. (camel_imap_store_summary_add_from_full): map the namespace if present. (camel_imap_store_summary_path_to_full): If namespace exists, unmap it. svn path=/trunk/; revision=18424 --- camel/providers/imap/camel-imap-store.c | 100 +++++++++++--------------------- 1 file changed, 35 insertions(+), 65 deletions(-) (limited to 'camel/providers/imap/camel-imap-store.c') diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c index 1da03ffdef..ac8d3e93ab 100644 --- a/camel/providers/imap/camel-imap-store.c +++ b/camel/providers/imap/camel-imap-store.c @@ -816,31 +816,26 @@ imap_build_folder_info(CamelImapStore *imap_store, const char *folder_name) CamelURL *url; const char *name; CamelFolderInfo *fi; - + fi = g_malloc0(sizeof(*fi)); - + fi->full_name = g_strdup(folder_name); fi->unread_message_count = 0; - + url = camel_url_new (imap_store->base_url, NULL); g_free (url->path); url->path = g_strdup_printf ("/%s", folder_name); fi->url = camel_url_to_string (url, CAMEL_URL_HIDE_ALL); camel_url_free(url); - - /* strip extranious leading /'s */ - while (*folder_name == '/') - folder_name++; - fi->path = g_strdup_printf("/%s", folder_name); name = strrchr (fi->path, '/'); if (name) name++; else name = fi->path; - + fi->name = g_strdup (name); - + return fi; } @@ -1271,33 +1266,29 @@ imap_connect_online (CamelService *service, CamelException *ex) /* canonicalize the namespace to end with dir_sep */ len = strlen (store->namespace); if (len && store->namespace[len - 1] != store->dir_sep) { - char *tmp; + gchar *tmp; tmp = g_strdup_printf ("%s%c", store->namespace, store->dir_sep); g_free (store->namespace); store->namespace = tmp; } - + ns = camel_imap_store_summary_namespace_new(store->summary, store->namespace, store->dir_sep); camel_imap_store_summary_namespace_set(store->summary, ns); if (CAMEL_STORE (store)->flags & CAMEL_STORE_SUBSCRIPTIONS) { GPtrArray *folders; char *pattern; - + /* this pre-fills the summary, and checks that lsub is useful */ - folders = g_ptr_array_new (); - pattern = g_strdup_printf ("%s*", store->namespace); - get_folders_online (store, pattern, folders, TRUE, ex); - g_free (pattern); - - /* if we have a namespace, then our LSUB won't include INBOX so LSUB for the INBOX too */ - if (*store->namespace && !camel_exception_is_set (ex)) - get_folders_online (store, "INBOX", folders, TRUE, ex); - + folders = g_ptr_array_new(); + pattern = g_strdup_printf("%s*", store->namespace); + get_folders_online(store, pattern, folders, TRUE, ex); + g_free(pattern); + for (i=0;ilen;i++) { CamelFolderInfo *fi = folders->pdata[i]; - + if (fi->flags & (CAMEL_IMAP_FOLDER_MARKED | CAMEL_IMAP_FOLDER_UNMARKED)) store->capabilities |= IMAP_CAPABILITY_useful_lsub; camel_folder_info_free(fi); @@ -1312,7 +1303,7 @@ imap_connect_online (CamelService *service, CamelException *ex) done: /* save any changes we had */ camel_store_summary_save((CamelStoreSummary *)store->summary); - + CAMEL_SERVICE_UNLOCK (store, connect_lock); if (camel_exception_is_set (ex)) @@ -1926,19 +1917,17 @@ parse_list_response_as_folder_info (CamelImapStore *imap_store, const char *response) { CamelFolderInfo *fi; - int flags; - char sep, *dir, *name = NULL, *path, *p; + int flags, i; + char sep, *dir, *name = NULL, *path; CamelURL *url; CamelImapStoreInfo *si; guint32 newflags; - + if (!imap_parse_list_response (imap_store, response, &flags, &sep, &dir)) return NULL; - + /* FIXME: should use imap_build_folder_info, note the differences with param setting tho */ - path = camel_utf7_utf8(dir); - - /* hack: pokes in value from any list response */ + si = camel_imap_store_summary_add_from_full(imap_store->summary, dir, sep?sep:'/'); newflags = (si->info.flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) | (flags & ~CAMEL_STORE_INFO_FOLDER_SUBSCRIBED); if (si->info.flags != newflags) { @@ -1946,45 +1935,24 @@ parse_list_response_as_folder_info (CamelImapStore *imap_store, camel_store_summary_touch((CamelStoreSummary *)imap_store->summary); } - if (sep && sep != '/') { - for (p = path; *p; p++) { - if (*p == sep) - *p = '/'; - } - } - - if ((name = strrchr (path, '/'))) { - name++; - if (!*name) { - g_free(dir); - g_free(path); - return NULL; - } - } else - name = path; - fi = g_new0 (CamelFolderInfo, 1); fi->flags = flags; - fi->name = g_strdup (name); - fi->full_name = path; - - while (*path == '/') - path++; - fi->path = g_strdup_printf ("/%s", path); + fi->name = g_strdup(camel_store_info_name(imap_store->summary, si)); + fi->path = g_strdup_printf("/%s", camel_store_info_path(imap_store->summary, si)); + fi->full_name = g_strdup(fi->path+1); url = camel_url_new (imap_store->base_url, NULL); - g_free (url->path); - url->path = g_strdup_printf ("/%s", fi->full_name); - + camel_url_set_path(url, fi->path); + if (flags & CAMEL_FOLDER_NOSELECT || fi->name[0] == 0) camel_url_set_param (url, "noselect", "yes"); fi->url = camel_url_to_string (url, 0); camel_url_free (url); - + /* FIXME: redundant */ if (flags & CAMEL_IMAP_FOLDER_UNMARKED) fi->unread_message_count = -1; - + return fi; } @@ -1998,16 +1966,19 @@ get_subscribed_folders (CamelImapStore *imap_store, const char *top, CamelExcept CamelImapResponse *response; CamelFolderInfo *fi; char *result; + int haveinbox = FALSE; folders = g_ptr_array_new (); names = g_ptr_array_new (); for (i=0;(si = camel_store_summary_index((CamelStoreSummary *)imap_store->summary, i));i++) { - if (si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) + if (si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) { g_ptr_array_add(names, (char *)camel_imap_store_info_full_name(imap_store->summary, si)); + haveinbox = haveinbox || strcasecmp(camel_imap_store_info_full_name(imap_store->summary, si), "INBOX") == 0; + } camel_store_summary_info_free((CamelStoreSummary *)imap_store->summary, si); } - - if (names->len == 0) + + if (!haveinbox) g_ptr_array_add (names, "INBOX"); for (i = 0; i < names->len; i++) { @@ -2399,14 +2370,13 @@ get_folder_info_online (CamelStore *store, const char *top, guint32 flags, Camel if (folders == NULL) return NULL; - /* note the weird top stuff, it is so a namespace based list "" is properly tree-ised */ - tree = camel_folder_info_build(folders, top[0] == 0 && imap_store->namespace?"":top, '/', TRUE); + tree = camel_folder_info_build(folders, top, '/', TRUE); g_ptr_array_free(folders, TRUE); if (!(flags & CAMEL_STORE_FOLDER_INFO_FAST)) get_folder_counts(imap_store, tree, ex); - dumpfi(tree); + d(dumpfi(tree)); camel_store_summary_save((CamelStoreSummary *)imap_store->summary); return tree; -- cgit v1.2.3