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
This commit is contained in:
Ettore Perazzoli
2001-10-26 23:14:46 +00:00
parent 4d55b72ada
commit c944779866
2 changed files with 38 additions and 4 deletions

View File

@ -1,3 +1,16 @@
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.

View File

@ -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;
}