aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-folder-tree-model.c
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2014-06-11 18:26:13 +0800
committerMilan Crha <mcrha@redhat.com>2014-06-11 18:26:56 +0800
commit6576094f7e7ee1910c1e57d689dc38abe2813e6e (patch)
tree744795024870b536beda1fbacc2114bfb4fbf26a /mail/em-folder-tree-model.c
parent53d071edc63ba6bfed035d937e9695aa12e143a0 (diff)
downloadgsoc2013-evolution-6576094f7e7ee1910c1e57d689dc38abe2813e6e.tar
gsoc2013-evolution-6576094f7e7ee1910c1e57d689dc38abe2813e6e.tar.gz
gsoc2013-evolution-6576094f7e7ee1910c1e57d689dc38abe2813e6e.tar.bz2
gsoc2013-evolution-6576094f7e7ee1910c1e57d689dc38abe2813e6e.tar.lz
gsoc2013-evolution-6576094f7e7ee1910c1e57d689dc38abe2813e6e.tar.xz
gsoc2013-evolution-6576094f7e7ee1910c1e57d689dc38abe2813e6e.tar.zst
gsoc2013-evolution-6576094f7e7ee1910c1e57d689dc38abe2813e6e.zip
Bug 704663 - Crash under em_folder_tree_model_add_store()
Diffstat (limited to 'mail/em-folder-tree-model.c')
-rw-r--r--mail/em-folder-tree-model.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c
index 8bbceab85d..f64e147d2a 100644
--- a/mail/em-folder-tree-model.c
+++ b/mail/em-folder-tree-model.c
@@ -640,6 +640,13 @@ folder_tree_model_dispose (GObject *object)
}
if (priv->session != NULL) {
+ MailFolderCache *folder_cache;
+
+ folder_cache = e_mail_session_get_folder_cache (priv->session);
+ g_signal_handlers_disconnect_matched (
+ folder_cache, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, object);
+
g_object_unref (priv->session);
priv->session = NULL;
}
@@ -936,8 +943,16 @@ em_folder_tree_model_set_session (EMFolderTreeModel *model,
g_object_ref (session);
}
- if (model->priv->session != NULL)
+ if (model->priv->session != NULL) {
+ MailFolderCache *folder_cache;
+
+ folder_cache = e_mail_session_get_folder_cache (model->priv->session);
+ g_signal_handlers_disconnect_matched (
+ folder_cache, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, model);
+
g_object_unref (model->priv->session);
+ }
model->priv->session = session;
@@ -1662,6 +1677,29 @@ em_folder_tree_model_remove_store (EMFolderTreeModel *model,
store_info_unref (si);
}
+/* This is necessary, because of circular dependency between the model
+ and its row references */
+void
+em_folder_tree_model_remove_all_stores (EMFolderTreeModel *model)
+{
+ GList *list, *link;
+
+ g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model));
+
+ g_mutex_lock (&model->priv->store_index_lock);
+ list = g_hash_table_get_keys (model->priv->store_index);
+ g_list_foreach (list, (GFunc) g_object_ref, NULL);
+ g_mutex_unlock (&model->priv->store_index_lock);
+
+ for (link = list; link; link = g_list_next (link)) {
+ CamelStore *store = link->data;
+
+ em_folder_tree_model_remove_store (model, store);
+ }
+
+ g_list_free_full (list, g_object_unref);
+}
+
GList *
em_folder_tree_model_list_stores (EMFolderTreeModel *model)
{