diff options
author | Ettore Perazzoli <ettore@src.gnome.org> | 2002-02-02 04:32:08 +0800 |
---|---|---|
committer | Ettore Perazzoli <ettore@src.gnome.org> | 2002-02-02 04:32:08 +0800 |
commit | 8d91d3461106080ebaefe3f7bac563a1ebecc310 (patch) | |
tree | 94370aead37a48733e1e50c6a562e2a2f0782473 /my-evolution/e-summary-offline-handler.c | |
parent | 8555a05de522d9b185db2f2884b6806fe0d44cf6 (diff) | |
download | gsoc2013-evolution-8d91d3461106080ebaefe3f7bac563a1ebecc310.tar.gz gsoc2013-evolution-8d91d3461106080ebaefe3f7bac563a1ebecc310.tar.zst gsoc2013-evolution-8d91d3461106080ebaefe3f7bac563a1ebecc310.zip |
[Fix a crash that can happen if you have opened multiple views of
the summary and try to go off-line. This is not the correct fix,
as the code should really be changed to only use one set of
connections for all the views, instead of binding the connections
to the view.]
* e-summary-factory.c (e_summary_factory_new_control): Call
`e_summary_offline_handler_add_summary()' instead of
e_summary_offline_handler_set_summary()'.
* e-summary-offline-handler.c: Replace member `summary' with
`summaries' in the ESummaryOfflineHandlerPriv. This way, instead
of assuming that there is only one summary, we keep a list of the
summaries.
(impl_destroy): Free ->summaries.
(e_summary_offline_handler_set_summary): Removed.
(e_summary_offline_handler_add_summary): New. Add the summary to
->summaries. Also, connect to the ::destroy handler so we can
bookkeep them correctly.
(create_connection_list): Made private from
e_summary_offline_handler_create_connection_list(). Get a GSList
instead of just one summary, and sum up all the connections from
it.
(impl_prepareForOffline): Use it.
(impl__get_isOffline): Return %FALSE if any of the summaries are
online, %TRUE otherwise.
(impl_goOffline): Call ::set_online on all the summaries. Pass
CORBA_OBJECT_NIL for the progress_listener as it doesn't really
get used anyways.
(impl_goOnline): Likewise. Pass CORBA_OBJECT_NIL, not NULL, for
the progress CORBA_Object pointer.
svn path=/trunk/; revision=15547
Diffstat (limited to 'my-evolution/e-summary-offline-handler.c')
-rw-r--r-- | my-evolution/e-summary-offline-handler.c | 114 |
1 files changed, 77 insertions, 37 deletions
diff --git a/my-evolution/e-summary-offline-handler.c b/my-evolution/e-summary-offline-handler.c index d03bf0eb32..da54180981 100644 --- a/my-evolution/e-summary-offline-handler.c +++ b/my-evolution/e-summary-offline-handler.c @@ -38,36 +38,62 @@ static BonoboXObjectClass *parent_class = NULL; struct _ESummaryOfflineHandlerPriv { - ESummary *summary; + GSList *summaries; GNOME_Evolution_OfflineProgressListener listener_interface; }; -GNOME_Evolution_ConnectionList * -e_summary_offline_handler_create_connection_list (ESummary *summary) +/* ::destroy handler for the bookkeeping of the list of summary views. */ + +static void +summary_destroy_callback (GtkObject *object, + void *data) +{ + ESummaryOfflineHandler *offline_handler; + ESummaryOfflineHandlerPriv *priv; + ESummary *summary; + + summary = E_SUMMARY (object); + offline_handler = E_SUMMARY_OFFLINE_HANDLER (data); + priv = offline_handler->priv; + + priv->summaries = g_slist_remove (priv->summaries, summary); +} + +static GNOME_Evolution_ConnectionList * +create_connection_list (GSList *summaries) { GNOME_Evolution_ConnectionList *list; GList *connections, *p; + GSList *sp; list = GNOME_Evolution_ConnectionList__alloc (); list->_length = 0; - list->_maximum = e_summary_count_connections (summary) + 1; + list->_maximum = 0; list->_buffer = CORBA_sequence_GNOME_Evolution_Connection_allocbuf (list->_maximum); - g_print ("_length: %d\n_maximum: %d\n", list->_length, list->_maximum); - connections = e_summary_add_connections (summary); - for (p = connections; p; p = p->next) { - ESummaryConnectionData *data; + /* Count the total number of connections first to make CORBA happy. */ + for (sp = summaries; sp != NULL; sp = sp->next) + list->_maximum += e_summary_count_connections (E_SUMMARY (sp->data)) + 1; + + for (sp = summaries; sp != NULL; sp = sp->next) { + ESummary *summary; + + summary = E_SUMMARY (sp->data); + connections = e_summary_add_connections (summary); + for (p = connections; p != NULL; p = p->next) { + ESummaryConnectionData *data; - data = p->data; - list->_buffer[list->_length].hostName = CORBA_string_dup (data->hostname); - list->_buffer[list->_length].type = CORBA_string_dup (data->type); - list->_length++; + data = p->data; + list->_buffer[list->_length].hostName = CORBA_string_dup (data->hostname); + list->_buffer[list->_length].type = CORBA_string_dup (data->type); + list->_length++; - g_free (data->hostname); - g_free (data->type); - g_free (data); + g_free (data->hostname); + g_free (data->type); + g_free (data); + } + g_list_free (connections); } - g_list_free (connections); return list; } @@ -78,10 +104,17 @@ impl__get_isOffline (PortableServer_Servant servant, CORBA_Environment *ev) { ESummaryOfflineHandler *offline_handler; + GSList *sp; offline_handler = E_SUMMARY_OFFLINE_HANDLER (bonobo_object_from_servant (servant)); - if (offline_handler->priv->summary != NULL) { - return offline_handler->priv->summary->online; + + /* We are offline if all of the views are offline. */ + for (sp = offline_handler->priv->summaries; sp != NULL; sp = sp->next) { + ESummary *summary; + + summary = E_SUMMARY (sp->data); + if (summary->online) + return FALSE; } return TRUE; @@ -98,14 +131,7 @@ impl_prepareForOffline (PortableServer_Servant servant, offline_handler = E_SUMMARY_OFFLINE_HANDLER (bonobo_object_from_servant (servant)); priv = offline_handler->priv; - if (priv->summary != NULL) { - *active_connection_list = e_summary_offline_handler_create_connection_list (priv->summary); - } else { - *active_connection_list = GNOME_Evolution_ConnectionList__alloc (); - (*active_connection_list)->_length = 0; - (*active_connection_list)->_maximum = 0; - (*active_connection_list)->_buffer = CORBA_sequence_GNOME_Evolution_Connection_allocbuf (0); - } + *active_connection_list = create_connection_list (priv->summaries); } static void @@ -122,7 +148,7 @@ went_offline (ESummary *summary, g_return_if_fail (offline_handler != NULL); priv = offline_handler->priv; - connection_list = e_summary_offline_handler_create_connection_list (summary); + connection_list = create_connection_list (priv->summaries); CORBA_exception_init (&ev); @@ -143,14 +169,20 @@ impl_goOffline (PortableServer_Servant servant, { ESummaryOfflineHandler *offline_handler; ESummaryOfflineHandlerPriv *priv; + GSList *sp; offline_handler = E_SUMMARY_OFFLINE_HANDLER (bonobo_object_from_servant (servant)); priv = offline_handler->priv; - if (priv->summary != NULL) { - priv->listener_interface = CORBA_Object_duplicate (progress_listener, ev); - - e_summary_set_online (priv->summary, progress_listener, FALSE, went_offline, offline_handler); + /* FIXME: If we have a progress already, then something is wrong and we + should raise an exception. */ + priv->listener_interface = CORBA_Object_duplicate (progress_listener, &ev); + + for (sp = priv->summaries; sp != NULL; sp = sp->next) { + ESummary *summary; + + summary = E_SUMMARY (sp->data); + e_summary_set_online (summary, CORBA_OBJECT_NIL, FALSE, went_offline, offline_handler); } } @@ -159,10 +191,15 @@ impl_goOnline (PortableServer_Servant servant, CORBA_Environment *ev) { ESummaryOfflineHandler *offline_handler; + GSList *sp; offline_handler = E_SUMMARY_OFFLINE_HANDLER (bonobo_object_from_servant (servant)); - if (offline_handler->priv->summary != NULL) { - e_summary_set_online (offline_handler->priv->summary, NULL, TRUE, NULL, NULL); + + for (sp = offline_handler->priv->summaries; sp != NULL; sp = sp->next) { + ESummary *summary; + + summary = E_SUMMARY (sp->data); + e_summary_set_online (summary, CORBA_OBJECT_NIL, TRUE, NULL, NULL); } } @@ -188,7 +225,7 @@ impl_destroy (GtkObject *object) CORBA_exception_free (&ev); } - gtk_object_unref (GTK_OBJECT (priv->summary)); + g_slist_free (priv->summaries); offline_handler->priv = NULL; g_free (priv); @@ -237,15 +274,18 @@ e_summary_offline_handler_new (void) } void -e_summary_offline_handler_set_summary (ESummaryOfflineHandler *handler, +e_summary_offline_handler_add_summary (ESummaryOfflineHandler *handler, ESummary *summary) { g_return_if_fail (handler != NULL); g_return_if_fail (summary != NULL); g_return_if_fail (IS_E_SUMMARY (summary)); - handler->priv->summary = summary; - gtk_object_ref (GTK_OBJECT (summary)); + handler->priv->summaries = g_slist_prepend (handler->priv->summaries, + summary); + + gtk_signal_connect (GTK_OBJECT (summary), "destroy", + GTK_SIGNAL_FUNC (summary_destroy_callback), handler); } BONOBO_X_TYPE_FUNC_FULL (ESummaryOfflineHandler, GNOME_Evolution_Offline, PARENT_TYPE, e_summary_offline_handler); |