aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--my-evolution/ChangeLog8
-rw-r--r--my-evolution/e-summary-mail.c39
2 files changed, 31 insertions, 16 deletions
diff --git a/my-evolution/ChangeLog b/my-evolution/ChangeLog
index 40d8d443c1..e3cab6c49c 100644
--- a/my-evolution/ChangeLog
+++ b/my-evolution/ChangeLog
@@ -1,3 +1,11 @@
+2002-06-28 Dan Winship <danw@ximian.com>
+
+ * e-summary-mail.c (e_summary_mail_idle_get_info): Add this, to
+ call e_summary_mail_get_info from an idle handler.
+ (new_folder_cb, update_folder_cb): Use idle_get_info rather than
+ making another corba call from inside the corba handler. (Fixes a
+ three-way deadlock between mail, summary, and exchange.)
+
2002-06-26 Iain <iain@ximian.com>
* e-summary-rdf.c (layer_find_url): If w == NULL return. Fixes crash
diff --git a/my-evolution/e-summary-mail.c b/my-evolution/e-summary-mail.c
index 50b06901b8..ffa65159ef 100644
--- a/my-evolution/e-summary-mail.c
+++ b/my-evolution/e-summary-mail.c
@@ -51,7 +51,7 @@ typedef struct _FolderStore {
GNOME_Evolution_Shell shell;
GNOME_Evolution_FolderInfo folder_info;
GNOME_Evolution_StorageRegistry registry;
- BonoboListener *listener;
+ Bonobo_Listener corba_listener;
EvolutionStorageListener *storage_listener;
GSList *storage_list;
@@ -185,18 +185,15 @@ e_summary_mail_get_html (ESummary *summary)
}
static void
-e_summary_mail_get_info (const char *uri,
- BonoboListener *listener)
+e_summary_mail_get_info (const char *uri)
{
- Bonobo_Listener corba_listener;
CORBA_Environment ev;
g_return_if_fail (folder_store->folder_info != CORBA_OBJECT_NIL);
- corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener));
CORBA_exception_init (&ev);
GNOME_Evolution_FolderInfo_getInfo (folder_store->folder_info, uri ? uri : "",
- corba_listener, &ev);
+ folder_store->corba_listener, &ev);
if (BONOBO_EX (&ev)) {
g_warning ("Error getting info for %s:\n%s", uri,
CORBA_exception_id (&ev));
@@ -208,6 +205,16 @@ e_summary_mail_get_info (const char *uri,
return;
}
+static gboolean
+e_summary_mail_idle_get_info (gpointer user_data)
+{
+ char *uri = user_data;
+
+ e_summary_mail_get_info (uri);
+ g_free (uri);
+ return FALSE;
+}
+
static void
new_folder_cb (EvolutionStorageListener *listener,
const char *path,
@@ -240,8 +247,8 @@ new_folder_cb (EvolutionStorageListener *listener,
if (strcmp (f->physical_uri, folder->physicalUri) == 0) {
folder_store->shown = g_list_append (folder_store->shown, mail_folder);
- e_summary_mail_get_info (mail_folder->path,
- folder_store->listener);
+ g_idle_add (e_summary_mail_idle_get_info,
+ g_strdup (mail_folder->path));
}
}
}
@@ -271,9 +278,7 @@ update_folder_cb (EvolutionStorageListener *listener,
g_print ("uri: %s\n", uri);
}
- e_summary_mail_get_info (uri, folder_store->listener);
-
- g_free (uri);
+ g_idle_add (e_summary_mail_idle_get_info, uri);
}
static void
@@ -537,8 +542,7 @@ e_summary_mail_reconfigure (void)
folder = g_hash_table_lookup (folder_store->folders, uri);
if (folder != NULL) {
if (folder->init == FALSE) {
- e_summary_mail_get_info (folder->path,
- folder_store->listener);
+ e_summary_mail_get_info (folder->path);
}
folder_store->shown = g_list_append (folder_store->shown, folder);
}
@@ -895,7 +899,8 @@ gboolean
e_summary_folder_init_folder_store (GNOME_Evolution_Shell shell)
{
CORBA_Environment ev;
-
+ BonoboListener *listener;
+
if (folder_store != NULL) {
return TRUE;
}
@@ -913,9 +918,11 @@ e_summary_folder_init_folder_store (GNOME_Evolution_Shell shell)
}
CORBA_exception_free (&ev);
- folder_store->listener = bonobo_listener_new (NULL, NULL);
- gtk_signal_connect (GTK_OBJECT (folder_store->listener), "event-notify",
+
+ listener = bonobo_listener_new (NULL, NULL);
+ gtk_signal_connect (GTK_OBJECT (listener), "event-notify",
GTK_SIGNAL_FUNC (mail_change_notify), NULL);
+ folder_store->corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener));
/* Create a hash table for the folders */
folder_store->folders = g_hash_table_new (g_str_hash, g_str_equal);