diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c.camel-imapx-folder-removed-on-refresh evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c
--- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c.camel-imapx-folder-removed-on-refresh 2015-07-24 13:52:20.253840769 +0200
+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c 2015-07-24 13:52:20.266840678 +0200
@@ -468,7 +468,7 @@ imapx_store_process_mailbox_attributes (
fi = imapx_store_build_folder_info (store, folder_path, flags);
/* Figure out which signals to emit, if any. */
- if (use_subscriptions) {
+ if (use_subscriptions || camel_imapx_namespace_get_category (camel_imapx_mailbox_get_namespace (mailbox)) != CAMEL_IMAPX_NAMESPACE_PERSONAL) {
/* If we are honoring folder subscriptions, then
* subscription changes are equivalent to folder
* creation / deletion as far as we're concerned. */
@@ -1079,6 +1079,20 @@ get_folder_info_offline (CamelStore *sto
if (!si_is_match)
continue;
+ if (!use_subscriptions && !(si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) &&
+ !(flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIPTION_LIST)) {
+ CamelIMAPXMailbox *mailbox;
+
+ mailbox = camel_imapx_store_ref_mailbox (imapx_store, ((CamelIMAPXStoreInfo *) si)->mailbox_name);
+ if (!mailbox || camel_imapx_namespace_get_category (camel_imapx_mailbox_get_namespace (mailbox)) != CAMEL_IMAPX_NAMESPACE_PERSONAL) {
+ /* Skip unsubscribed mailboxes which are not in the Personal namespace */
+ g_clear_object (&mailbox);
+ continue;
+ }
+
+ g_clear_object (&mailbox);
+ }
+
fi = imapx_store_build_folder_info (
imapx_store, folder_path, 0);
fi->unread = si->unread;
@@ -1417,6 +1431,58 @@ imapx_store_remove_unknown_mailboxes_cb
}
static gboolean
+imapx_store_mailbox_is_unknown (CamelIMAPXStore *imapx_store,
+ GPtrArray *store_infos,
+ const CamelIMAPXStoreInfo *to_check)
+{
+ CamelIMAPXMailbox *mailbox;
+ gboolean is_unknown;
+
+ g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (imapx_store), FALSE);
+ g_return_val_if_fail (store_infos != NULL, FALSE);
+
+ if (!to_check || !to_check->mailbox_name || !*to_check->mailbox_name)
+ return FALSE;
+
+ mailbox = camel_imapx_store_ref_mailbox (imapx_store, to_check->mailbox_name);
+
+ is_unknown = mailbox && camel_imapx_mailbox_get_state (mailbox) == CAMEL_IMAPX_MAILBOX_STATE_UNKNOWN;
+
+ if (!mailbox && to_check->separator) {
+ CamelSettings *settings;
+ gboolean use_subscriptions;
+ gchar *mailbox_with_separator;
+ gint ii;
+
+ settings = camel_service_ref_settings (CAMEL_SERVICE (imapx_store));
+ use_subscriptions = camel_imapx_settings_get_use_subscriptions (CAMEL_IMAPX_SETTINGS (settings));
+ g_object_unref (settings);
+
+ mailbox_with_separator = g_strdup_printf ("%s%c", to_check->mailbox_name, to_check->separator);
+
+ for (ii = 0; ii < store_infos->len; ii++) {
+ CamelIMAPXStoreInfo *si;
+
+ si = g_ptr_array_index (store_infos, ii);
+
+ if (si->mailbox_name && g_str_has_prefix (si->mailbox_name, mailbox_with_separator) && (
+ !use_subscriptions || (((CamelStoreInfo *) si)->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) != 0)) {
+ /* This can be a 'virtual' parent folder of some subscribed subfolder */
+ break;
+ }
+ }
+
+ is_unknown = ii == store_infos->len;
+
+ g_free (mailbox_with_separator);
+ }
+
+ g_clear_object (&mailbox);
+
+ return is_unknown;
+}
+
+static gboolean
sync_folders (CamelIMAPXStore *imapx_store,
const gchar *root_folder_path,
CamelStoreGetFolderInfoFlags flags,
@@ -1426,8 +1492,7 @@ sync_folders (CamelIMAPXStore *imapx_sto
{
CamelIMAPXServer *server;
GHashTable *folder_info_results;
- GPtrArray *array;
- guint ii;
+ gboolean update_folder_list;
gboolean success;
server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error);
@@ -1445,7 +1510,9 @@ sync_folders (CamelIMAPXStore *imapx_sto
* in imapx_store_process_mailbox_attributes(). */
g_atomic_int_inc (&imapx_store->priv->syncing_folders);
- if (!initial_setup && (!root_folder_path || !*root_folder_path)) {
+ update_folder_list = !initial_setup && (!root_folder_path || !*root_folder_path);
+
+ if (update_folder_list) {
g_mutex_lock (&imapx_store->priv->mailboxes_lock);
g_hash_table_foreach (imapx_store->priv->mailboxes, imapx_store_mark_mailbox_unknown_cb, imapx_store);
g_mutex_unlock (&imapx_store->priv->mailboxes_lock);
@@ -1458,9 +1525,9 @@ sync_folders (CamelIMAPXStore *imapx_sto
} else {
gboolean have_folder_info_for_inbox;
- /* XXX We only fetch personal mailboxes at this time. */
success = fetch_folder_info_for_namespace_category (
- imapx_store, server, CAMEL_IMAPX_NAMESPACE_PERSONAL, flags,
+ imapx_store, server, CAMEL_IMAPX_NAMESPACE_PERSONAL, flags |
+ (update_folder_list ? CAMEL_STORE_FOLDER_INFO_SUBSCRIBED : 0),
folder_info_results, cancellable, error);
have_folder_info_for_inbox =
@@ -1481,53 +1548,41 @@ sync_folders (CamelIMAPXStore *imapx_sto
if (!success)
goto exit;
- if (!initial_setup && (!root_folder_path || !*root_folder_path)) {
+ if (update_folder_list) {
g_mutex_lock (&imapx_store->priv->mailboxes_lock);
g_hash_table_foreach_remove (imapx_store->priv->mailboxes, imapx_store_remove_unknown_mailboxes_cb, imapx_store);
g_mutex_unlock (&imapx_store->priv->mailboxes_lock);
}
- array = camel_store_summary_array (imapx_store->summary);
-
- for (ii = 0; ii < array->len; ii++) {
- CamelStoreInfo *si;
- CamelFolderInfo *fi;
- const gchar *mailbox_name;
- const gchar *si_path;
- gboolean pattern_match;
-
- si = g_ptr_array_index (array, ii);
- si_path = camel_store_info_path (imapx_store->summary, si);
-
- mailbox_name = ((CamelIMAPXStoreInfo *) si)->mailbox_name;
- if (mailbox_name == NULL || *mailbox_name == '\0')
- continue;
-
- pattern_match =
- (root_folder_path == NULL) ||
- (*root_folder_path == '\0') ||
- (g_str_has_prefix (si_path, root_folder_path));
- if (!pattern_match)
- continue;
-
- fi = g_hash_table_lookup (folder_info_results, mailbox_name);
-
- if (fi == NULL) {
- gchar *dup_folder_path = g_strdup (si_path);
-
- if (dup_folder_path != NULL) {
- /* Do not unsubscribe from it, it influences UI for non-subscribable folders */
- imapx_delete_folder_from_cache (
- imapx_store, dup_folder_path, FALSE);
- g_free (dup_folder_path);
- } else {
- camel_store_summary_remove (
- imapx_store->summary, si);
+ if (!root_folder_path || !*root_folder_path) {
+ GPtrArray *array;
+ guint ii;
+
+ /* Finally update store's summary */
+ array = camel_store_summary_array (imapx_store->summary);
+ for (ii = 0; array && ii < array->len; ii++) {
+ CamelStoreInfo *si;
+ const gchar *si_path;
+
+ si = g_ptr_array_index (array, ii);
+ si_path = camel_store_info_path (imapx_store->summary, si);
+
+ if (imapx_store_mailbox_is_unknown (imapx_store, array, (CamelIMAPXStoreInfo *) si)) {
+ gchar *dup_folder_path = g_strdup (si_path);
+
+ if (dup_folder_path != NULL) {
+ /* Do not unsubscribe from it, it influences UI for non-subscribable folders */
+ imapx_delete_folder_from_cache (imapx_store, dup_folder_path, FALSE);
+ g_free (dup_folder_path);
+ } else {
+ camel_store_summary_remove (imapx_store->summary, si);
+ }
}
}
+
+ camel_store_summary_array_free (imapx_store->summary, array);
}
- camel_store_summary_array_free (imapx_store->summary, array);
camel_store_summary_save (imapx_store->summary);
exit: