aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-folder-tree-model.c
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2004-01-06 12:13:11 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2004-01-06 12:13:11 +0800
commit3e09ab6d6f1efee104f7c66ec292339e31c91ded (patch)
treea67e8fc4eab22465c506e2ea39d641bab96af1ea /mail/em-folder-tree-model.c
parent328a85b85a7bc4bacb0ac4d3fcca813b31cf22c4 (diff)
downloadgsoc2013-evolution-3e09ab6d6f1efee104f7c66ec292339e31c91ded.tar
gsoc2013-evolution-3e09ab6d6f1efee104f7c66ec292339e31c91ded.tar.gz
gsoc2013-evolution-3e09ab6d6f1efee104f7c66ec292339e31c91ded.tar.bz2
gsoc2013-evolution-3e09ab6d6f1efee104f7c66ec292339e31c91ded.tar.lz
gsoc2013-evolution-3e09ab6d6f1efee104f7c66ec292339e31c91ded.tar.xz
gsoc2013-evolution-3e09ab6d6f1efee104f7c66ec292339e31c91ded.tar.zst
gsoc2013-evolution-3e09ab6d6f1efee104f7c66ec292339e31c91ded.zip
Clone the CamelRenameInfo and ref the store before emitting the async
2004-01-05 Jeffrey Stedfast <fejj@ximian.com> * em-folder-tree-model.c (folder_renamed_cb): Clone the CamelRenameInfo and ref the store before emitting the async event. (folder_deleted_cb): Same idea but for CamelFolderInfo's. (folder_created_cb): Here too. (folder_subscribed_cb): Same. (folder_unsubscribed_cb): And here. (folder_renamed): Split out from folder_rename_cb(), free the CamelRenameInfo and unref the store when done. (folder_unsubscribed): Same idea. (folder_subscribed): Same. svn path=/trunk/; revision=24062
Diffstat (limited to 'mail/em-folder-tree-model.c')
-rw-r--r--mail/em-folder-tree-model.c129
1 files changed, 82 insertions, 47 deletions
diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c
index 118f05f28e..549195d5ca 100644
--- a/mail/em-folder-tree-model.c
+++ b/mail/em-folder-tree-model.c
@@ -786,31 +786,25 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, GtkTreeIter *ite
static void
-folder_subscribed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
+folder_subscribed (CamelStore *store, CamelFolderInfo *fi, EMFolderTreeModel *model)
{
struct _EMFolderTreeModelStoreInfo *si;
- CamelFolderInfo *fi = event_data;
GtkTreeRowReference *row;
GtkTreeIter parent, iter;
GtkTreePath *path;
gboolean load;
char *dirname;
- if (pthread_self () != mail_gui_thread) {
- mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_subscribed_cb, store, event_data, model);
- return;
- }
-
if (!(si = g_hash_table_lookup (model->store_hash, store)))
- return;
+ goto done;
/* make sure we don't already know about it? */
if (g_hash_table_lookup (si->path_hash, fi->path))
- return;
+ goto done;
/* get our parent folder's path */
if (!(dirname = g_path_get_dirname (fi->path)))
- return;
+ goto done;
if (!strcmp (dirname, "/")) {
/* user subscribed to a toplevel folder */
@@ -824,13 +818,13 @@ folder_subscribed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *mo
* when the user expands enough nodes - it will be
* added auto-magically */
if (row == NULL)
- return;
+ goto done;
}
path = gtk_tree_row_reference_get_path (row);
if (!(gtk_tree_model_get_iter ((GtkTreeModel *) model, &parent, path))) {
gtk_tree_path_free (path);
- return;
+ goto done;
}
gtk_tree_path_free (path);
@@ -838,98 +832,118 @@ folder_subscribed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *mo
/* make sure parent's subfolders have already been loaded */
gtk_tree_model_get ((GtkTreeModel *) model, &parent, COL_BOOL_LOAD_SUBDIRS, &load, -1);
if (load)
- return;
+ goto done;
/* append a new node */
gtk_tree_store_append ((GtkTreeStore *) model, &iter, &parent);
em_folder_tree_model_set_folder_info (model, &iter, si, fi);
+
+ done:
+
+ camel_object_unref (store);
+ camel_folder_info_free (fi);
}
static void
-folder_unsubscribed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
+folder_subscribed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
+{
+ CamelFolderInfo *fi;
+
+ camel_object_ref (store);
+ fi = camel_folder_info_clone (event_data);
+ mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_subscribed, store, fi, model);
+}
+
+static void
+folder_unsubscribed (CamelStore *store, CamelFolderInfo *fi, EMFolderTreeModel *model)
{
struct _EMFolderTreeModelStoreInfo *si;
- CamelFolderInfo *fi = event_data;
GtkTreeRowReference *row;
GtkTreePath *path;
GtkTreeIter iter;
- if (pthread_self () != mail_gui_thread) {
- mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_unsubscribed_cb, store, event_data, model);
- return;
- }
-
if (!(si = g_hash_table_lookup (model->store_hash, store)))
- return;
+ goto done;
if (!(row = g_hash_table_lookup (si->path_hash, fi->path)))
- return;
+ goto done;
path = gtk_tree_row_reference_get_path (row);
if (!(gtk_tree_model_get_iter ((GtkTreeModel *) model, &iter, path))) {
gtk_tree_path_free (path);
- return;
+ goto done;
}
em_folder_tree_model_remove_folders (model, si, &iter);
+
+ done:
+
+ camel_object_unref (store);
+ camel_folder_info_free (fi);
+}
+
+static void
+folder_unsubscribed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
+{
+ CamelFolderInfo *fi;
+
+ camel_object_ref (store);
+ fi = camel_folder_info_clone (event_data);
+ mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_unsubscribed, store, fi, model);
}
static void
folder_created_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
{
- if (pthread_self () != mail_gui_thread) {
- mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_created_cb, store, event_data, model);
- return;
- }
+ CamelFolderInfo *fi;
/* we only want created events to do more work if we don't support subscriptions */
- if (!camel_store_supports_subscriptions (store))
- folder_subscribed_cb (store, event_data, model);
+ if (camel_store_supports_subscriptions (store))
+ return;
+
+ camel_object_ref (store);
+ fi = camel_folder_info_clone (event_data);
+ mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_subscribed_cb, store, fi, model);
}
static void
folder_deleted_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
{
- if (pthread_self () != mail_gui_thread) {
- mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_deleted_cb, store, event_data, model);
- return;
- }
+ CamelFolderInfo *fi;
/* we only want deleted events to do more work if we don't support subscriptions */
- if (!camel_store_supports_subscriptions (store))
- folder_unsubscribed_cb (store, event_data, model);
+ if (camel_store_supports_subscriptions (store))
+ return;
+
+ camel_object_ref (store);
+ fi = camel_folder_info_clone (event_data);
+ mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_unsubscribed_cb, store, fi, model);
}
static void
-folder_renamed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
+folder_renamed (CamelStore *store, CamelRenameInfo *info, EMFolderTreeModel *model)
{
struct _EMFolderTreeModelStoreInfo *si;
- CamelRenameInfo *info = event_data;
GtkTreeRowReference *row;
GtkTreeIter root, iter;
GtkTreePath *path;
char *parent, *p;
- if (pthread_self () != mail_gui_thread) {
- mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_renamed_cb, store, event_data, model);
- return;
- }
-
if (!(si = g_hash_table_lookup (model->store_hash, store)))
- return;
+ goto done;
parent = g_strdup_printf ("/%s", info->old_base);
if (!(row = g_hash_table_lookup (si->path_hash, parent))) {
g_free (parent);
- return;
+ goto done;
}
g_free (parent);
path = gtk_tree_row_reference_get_path (row);
if (!(gtk_tree_model_get_iter ((GtkTreeModel *) model, &iter, path))) {
gtk_tree_path_free (path);
- return;
+ goto done;
}
em_folder_tree_model_remove_folders (model, si, &iter);
@@ -949,7 +963,7 @@ folder_renamed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model
* tree */
g_assert_not_reached ();
g_free (parent);
- return;
+ goto done;
}
path = gtk_tree_row_reference_get_path (row);
@@ -960,13 +974,34 @@ folder_renamed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model
if (!gtk_tree_model_get_iter ((GtkTreeModel *) model, &root, path)) {
gtk_tree_path_free (path);
g_assert_not_reached ();
- return;
+ goto done;
}
gtk_tree_store_append ((GtkTreeStore *) model, &iter, &root);
em_folder_tree_model_set_folder_info (model, &iter, si, info->new);
+
+ done:
+
+ camel_object_unref (store);
+
+ g_free (info->old_base);
+ camel_folder_info_free (info->new);
+ g_free (info);
}
+static void
+folder_renamed_cb (CamelStore *store, void *event_data, EMFolderTreeModel *model)
+{
+ CamelRenameInfo *rinfo, *info = event_data;
+
+ camel_object_ref (store);
+
+ rinfo = g_new0 (CamelRenameInfo, 1);
+ rinfo->old_base = g_strdup (info->old_base);
+ rinfo->new = camel_folder_info_clone (info->new);
+
+ mail_async_event_emit (mail_async_event, MAIL_ASYNC_GUI, (MailAsyncFunc) folder_renamed, store, rinfo, model);
+}
void
em_folder_tree_model_add_store (EMFolderTreeModel *model, CamelStore *store, const char *display_name)