diff options
-rw-r--r-- | mail/ChangeLog | 7 | ||||
-rw-r--r-- | mail/mail-display.c | 116 |
2 files changed, 74 insertions, 49 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 41c4b9c2bf..0264fc14f5 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,10 @@ +2001-01-11 Miguel de Icaza <miguel@gnu.org> + + * mail-display.c (on_object_requested): Unref the property bag + when we are done with it. + (get_embedded_for_component): Moved the code to request the + embeddable/control to a separate function. + 2001-01-12 Jeffrey Stedfast <fejj@ximian.com> * mail-config.c (mail_config_get_account_by_name): New convenience diff --git a/mail/mail-display.c b/mail/mail-display.c index 09b62c9bf9..a407ee1c2e 100644 --- a/mail/mail-display.c +++ b/mail/mail-display.c @@ -551,6 +551,72 @@ embeddable_destroy_cb (GtkObject *embeddable, g_free (pbl); }; +static GtkWidget * +get_embedded_for_component (const char *iid, MailDisplay *md) +{ + GtkWidget *embedded; + BonoboControlFrame *control_frame; + Bonobo_PropertyBag prop_bag; + + embedded = bonobo_widget_new_subdoc (iid, NULL); + if (embedded) { + /* FIXME: as of bonobo 0.18, there's an extra + * client_site dereference in the BonoboWidget + * destruction path that we have to balance out to + * prevent problems. + */ + bonobo_object_ref (BONOBO_OBJECT(bonobo_widget_get_client_site ( + BONOBO_WIDGET (embedded)))); + + return embedded; + } + + /* + * Try a control now + */ + embedded = bonobo_widget_new_control (iid, NULL); + if (!embedded) + return NULL; + + control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (embedded)); + + prop_bag = bonobo_control_frame_get_control_property_bag ( control_frame, NULL ); + + if (prop_bag != CORBA_OBJECT_NIL){ + CORBA_Environment ev; + /* + * Now we can take care of business. Currently, the only control + * that needs something passed to it through a property bag is + * the iTip control, and it needs only the From email address, + * but perhaps in the future we can generalize this section of code + * to pass a bunch of useful things to all embedded controls. + */ + const CamelInternetAddress *from; + const MailConfigIdentity *id; + + id = mail_config_get_default_identity (); + CORBA_exception_init (&ev); + if (id){ + char *from_address; + + + from = camel_mime_message_get_from (md->current_message); + from_address = camel_address_encode((CamelAddress *)from); + bonobo_property_bag_client_set_value_string ( + prop_bag, "from_address", + from_address, &ev); + bonobo_property_bag_client_set_value_string ( + prop_bag, "my_address", + id ? id->address : "", &ev); + g_free(from_address); + } + Bonobo_Unknown_unref (prop_bag, &ev); + CORBA_exception_free (&ev); + } + + return embedded; +} + static gboolean on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data) { @@ -566,8 +632,6 @@ on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data) GByteArray *ba; CamelStream *cstream; BonoboStream *bstream; - BonoboControlFrame *control_frame; - Bonobo_PropertyBag prop_bag; char *cid; cid = eb->classid; @@ -632,53 +696,7 @@ on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data) if (!component) return FALSE; - embedded = bonobo_widget_new_subdoc (component->iid, NULL); - if (embedded) { - /* FIXME: as of bonobo 0.18, there's an extra - * client_site dereference in the BonoboWidget - * destruction path that we have to balance out to - * prevent problems. - */ - bonobo_object_ref (BONOBO_OBJECT(bonobo_widget_get_client_site ( - BONOBO_WIDGET (embedded)))); - } else { - embedded = bonobo_widget_new_control (component->iid, NULL); - if (!embedded) { - CORBA_free (component); - return FALSE; - } - - control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (embedded)); - if (control_frame) { - prop_bag = bonobo_control_frame_get_control_property_bag ( control_frame, NULL ); - - if (prop_bag != CORBA_OBJECT_NIL) { - /* Now we can take care of business. Currently, the only control - that needs something passed to it through a property bag is - the iTip control, and it needs only the From email address, - but perhaps in the future we can generalize this section of code - to pass a bunch of useful things to all embedded controls. */ - const CamelInternetAddress *from; - char *from_address; - const MailConfigIdentity *id; - - id = mail_config_get_default_identity (); - if (!id) - g_warning ("No identity configured!"); - - CORBA_exception_init (&ev); - - from = camel_mime_message_get_from (md->current_message); - from_address = camel_address_encode((CamelAddress *)from); - bonobo_property_bag_client_set_value_string (prop_bag, "from_address", - from_address, &ev); - bonobo_property_bag_client_set_value_string (prop_bag, "my_address", - id ? id->address : "", &ev); - g_free(from_address); - CORBA_exception_free (&ev); - } - } - } /* end else (we're going to use a control) */ + embedded = get_embedded_for_component (component->iid, md); CORBA_free (component); if (!embedded) return FALSE; |