diff options
-rw-r--r-- | shell/ChangeLog | 13 | ||||
-rw-r--r-- | shell/e-shell-offline-handler.c | 29 |
2 files changed, 38 insertions, 4 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog index 0e668bb2ac..3b196f755b 100644 --- a/shell/ChangeLog +++ b/shell/ChangeLog @@ -1,5 +1,18 @@ 2001-10-26 Ettore Perazzoli <ettore@ximian.com> + * e-shell-offline-handler.c: New member `finished' in + `EShellOfflineHandlerPrivate'. + (finalize_offline): Ref the handler as we might get destroyed + while putting every component offline. + (impl_OfflineProgressListener_updateProgress): Don't emit + ::offline_procedure_finished if ->finished is %TRUE. Also, set it + to %TRUE after emitting the signal. + (cancel_offline): Likewise. + (finalize_offline): Likewise. + (update_dialog_clist): Guard against NULL ->dialog_gui. + +2001-10-26 Ettore Perazzoli <ettore@ximian.com> + * evolution-storage.c (impl_Storage_async_xfer_folder): Implement. (class_init): Add the signal "xfer_folder" signal. diff --git a/shell/e-shell-offline-handler.c b/shell/e-shell-offline-handler.c index bd7f450780..6e02bc2104 100644 --- a/shell/e-shell-offline-handler.c +++ b/shell/e-shell-offline-handler.c @@ -90,7 +90,8 @@ struct _EShellOfflineHandlerPrivate { int num_total_connections; GHashTable *id_to_component_info; - gboolean procedure_in_progress : 1; + int procedure_in_progress : 1; + int finished : 1; }; @@ -206,8 +207,10 @@ impl_OfflineProgressListener_updateProgress (PortableServer_Servant servant, update_dialog_clist (offline_handler); - if (priv->num_total_connections == 0) + if (priv->num_total_connections == 0 && ! priv->finished) { gtk_signal_emit (GTK_OBJECT (offline_handler), signals[OFFLINE_PROCEDURE_FINISHED], TRUE); + priv->finished = TRUE; + } } static gboolean @@ -362,7 +365,10 @@ cancel_offline (EShellOfflineHandler *offline_handler) priv->num_total_connections = 0; - gtk_signal_emit (GTK_OBJECT (offline_handler), signals[OFFLINE_PROCEDURE_FINISHED], FALSE); + if (! priv->finished) { + gtk_signal_emit (GTK_OBJECT (offline_handler), signals[OFFLINE_PROCEDURE_FINISHED], FALSE); + priv->finished = TRUE; + } } @@ -432,6 +438,8 @@ prepare_for_offline (EShellOfflineHandler *offline_handler) g_assert (g_hash_table_lookup (priv->id_to_component_info, component_info->id) == NULL); g_hash_table_insert (priv->id_to_component_info, component_info->id, component_info); + + g_print ("Inserting -- %p %s\n", component_info, component_info->id); } /* If an error occurred while preparing, just put all the components @@ -464,6 +472,8 @@ finalize_offline_hash_foreach (void *key, CORBA_exception_init (&ev); + g_print ("Offline -- %p\n", component_info); + GNOME_Evolution_Offline_goOffline (component_info->offline_interface, component_info->progress_listener_interface, &ev); @@ -484,12 +494,17 @@ finalize_offline (EShellOfflineHandler *offline_handler) priv = offline_handler->priv; + gtk_object_ref (GTK_OBJECT (offline_handler)); + g_hash_table_foreach (priv->id_to_component_info, finalize_offline_hash_foreach, offline_handler); - if (priv->num_total_connections == 0) { + if (priv->num_total_connections == 0 && ! priv->finished) { /* Nothing else to do, we are all set. */ gtk_signal_emit (GTK_OBJECT (offline_handler), signals[OFFLINE_PROCEDURE_FINISHED], TRUE); + priv->finished = TRUE; } + + gtk_object_unref (GTK_OBJECT (offline_handler)); } @@ -528,6 +543,8 @@ update_dialog_clist (EShellOfflineHandler *offline_handler) GtkWidget *clist; priv = offline_handler->priv; + if (priv->dialog_gui == NULL) + return; clist = glade_xml_get_widget (priv->dialog_gui, "active_connection_clist"); @@ -719,6 +736,7 @@ init (EShellOfflineHandler *shell_offline_handler) priv->id_to_component_info = g_hash_table_new (g_str_hash, g_str_equal); priv->procedure_in_progress = FALSE; + priv->finished = FALSE; shell_offline_handler->priv = priv; } @@ -805,10 +823,13 @@ e_shell_offline_handler_put_components_offline (EShellOfflineHandler *offline_ha gtk_signal_emit (GTK_OBJECT (offline_handler), signals[OFFLINE_PROCEDURE_STARTED]); + priv->finished = FALSE; + if (! prepare_for_offline (offline_handler)) { /* FIXME: Maybe do something smarter here. */ g_warning ("Couldn't put components off-line"); gtk_signal_emit (GTK_OBJECT (offline_handler), signals[OFFLINE_PROCEDURE_FINISHED], FALSE); + priv->finished = TRUE; gtk_object_unref (GTK_OBJECT (offline_handler)); return; } |