[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
This commit is contained in:
Ettore Perazzoli
2002-02-01 20:32:08 +00:00
parent 8555a05de5
commit 8d91d34611
4 changed files with 117 additions and 43 deletions

View File

@ -1,3 +1,37 @@
2002-02-01 Ettore Perazzoli <ettore@ximian.com>
[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.
2002-01-24 Ettore Perazzoli <ettore@ximian.com>
* Makefile.am: Use EVOLUTION_EXECUTIVE_SUMMARY_CFLAGS and

View File

@ -138,7 +138,7 @@ e_summary_factory_new_control (const char *uri,
return NULL;
}
e_summary_offline_handler_set_summary (handler, E_SUMMARY (summary));
e_summary_offline_handler_add_summary (handler, E_SUMMARY (summary));
gtk_widget_show (summary);
control = bonobo_control_new (summary);

View File

@ -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;
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++;
for (sp = summaries; sp != NULL; sp = sp->next) {
ESummary *summary;
g_free (data->hostname);
g_free (data->type);
g_free (data);
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++;
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);

View File

@ -61,11 +61,11 @@ struct _ESummaryOfflineHandlerClass {
};
GtkType e_summary_offline_handler_get_type (void);
ESummaryOfflineHandler *e_summary_offline_handler_new (void);
void e_summary_offline_handler_set_summary (ESummaryOfflineHandler *handler,
ESummary *summary);
GNOME_Evolution_ConnectionList *e_summary_offline_handler_create_connection_list (ESummary *summary);
GtkType e_summary_offline_handler_get_type (void);
ESummaryOfflineHandler *e_summary_offline_handler_new (void);
void e_summary_offline_handler_add_summary (ESummaryOfflineHandler *handler,
ESummary *summary);
#ifdef __cplusplus
}