diff options
author | Ettore Perazzoli <ettore@src.gnome.org> | 2001-10-27 07:14:46 +0800 |
---|---|---|
committer | Ettore Perazzoli <ettore@src.gnome.org> | 2001-10-27 07:14:46 +0800 |
commit | c944779866017804bbeb94f9c81af4ffa0eef3ba (patch) | |
tree | 60afd9a6a15df7367ede23bb27bdbd48549d913c /shell/e-shell-offline-handler.c | |
parent | 4d55b72adae439372f1d939937e9976c7221ca87 (diff) | |
download | gsoc2013-evolution-c944779866017804bbeb94f9c81af4ffa0eef3ba.tar.gz gsoc2013-evolution-c944779866017804bbeb94f9c81af4ffa0eef3ba.tar.zst gsoc2013-evolution-c944779866017804bbeb94f9c81af4ffa0eef3ba.zip |
New member `finished' in `EShellOfflineHandlerPrivate'.
* 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.
svn path=/trunk/; revision=14182
Diffstat (limited to 'shell/e-shell-offline-handler.c')
-rw-r--r-- | shell/e-shell-offline-handler.c | 29 |
1 files changed, 25 insertions, 4 deletions
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; } |