diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2013-05-21 01:41:57 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2013-05-21 03:34:32 +0800 |
commit | badc0e6156777c65885bad6858a6f44f7cbf037e (patch) | |
tree | 1154558584d4ef39c9e9350507063114458d7f54 | |
parent | 3df09670afb44ecf2d39fb71a228f0fa7ebbdb73 (diff) | |
download | gsoc2013-evolution-badc0e6156777c65885bad6858a6f44f7cbf037e.tar gsoc2013-evolution-badc0e6156777c65885bad6858a6f44f7cbf037e.tar.gz gsoc2013-evolution-badc0e6156777c65885bad6858a6f44f7cbf037e.tar.bz2 gsoc2013-evolution-badc0e6156777c65885bad6858a6f44f7cbf037e.tar.lz gsoc2013-evolution-badc0e6156777c65885bad6858a6f44f7cbf037e.tar.xz gsoc2013-evolution-badc0e6156777c65885bad6858a6f44f7cbf037e.tar.zst gsoc2013-evolution-badc0e6156777c65885bad6858a6f44f7cbf037e.zip |
Simplify EABContactFormatter.
Simplify the EABContactFormatter API as follows:
* Drop all constructor arguments from eab_contact_formatter_new()
since get/set functions exist for all of them.
* Remove eab_contact_formatter_format_contact_async() since
EABContactFormatter does not block.
* Replace eab_contact_formatter_format_contact_sync() with
eab_contact_formatter_format_contact() which drops the CamelStream
and GCancellable arguments and takes a GString as an output buffer.
* Remove the "state" and "style" properties, and always use a white
background when rendering the full contact.
This is particularly important since render_normal() dereferenced
the GtkStyle without checking for NULL, which would crash on mails
with a vCard MIME part when "Show Full vCard" was clicked, because
the "vcard-inline" module never set a GtkStyle.
-rw-r--r-- | addressbook/gui/widgets/eab-contact-display.c | 56 | ||||
-rw-r--r-- | addressbook/gui/widgets/eab-contact-formatter.c | 276 | ||||
-rw-r--r-- | addressbook/gui/widgets/eab-contact-formatter.h | 20 | ||||
-rw-r--r-- | modules/vcard-inline/e-mail-formatter-vcard.c | 20 |
4 files changed, 56 insertions, 316 deletions
diff --git a/addressbook/gui/widgets/eab-contact-display.c b/addressbook/gui/widgets/eab-contact-display.c index e71ea23b9f..c467e385e4 100644 --- a/addressbook/gui/widgets/eab-contact-display.c +++ b/addressbook/gui/widgets/eab-contact-display.c @@ -47,8 +47,6 @@ struct _EABContactDisplayPrivate { EABContactDisplayMode mode; gboolean show_maps; - - GCancellable *formatter_cancellable; }; enum { @@ -163,62 +161,32 @@ static GtkActionEntry internal_mailto_entries[] = { }; static void -contact_formatting_finished (GObject *object, - GSimpleAsyncResult *result, - gpointer user_data) -{ - EABContactDisplay *display = user_data; - CamelStreamMem *stream; - gchar *html; - GByteArray *ba; - - stream = g_simple_async_result_get_op_res_gpointer (result); - /* The operation was probably cancelled */ - if (!stream) - return; - - ba = camel_stream_mem_get_byte_array (stream); - - html = g_strndup ((gchar *) ba->data, ba->len); - e_web_view_load_string (E_WEB_VIEW (display), html); - - g_free (html); - g_object_unref (stream); - g_object_unref (object); - g_clear_object (&display->priv->formatter_cancellable); -} - -static void load_contact (EABContactDisplay *display) { EABContactFormatter *formatter; - - if (display->priv->formatter_cancellable) { - g_cancellable_cancel (display->priv->formatter_cancellable); - g_clear_object (&display->priv->formatter_cancellable); - } + GString *buffer; if (!display->priv->contact) { e_web_view_clear (E_WEB_VIEW (display)); return; } - formatter = eab_contact_formatter_new ( - display->priv->mode, - display->priv->show_maps); + formatter = eab_contact_formatter_new (); g_object_set ( G_OBJECT (formatter), - "style", gtk_widget_get_style (GTK_WIDGET (display)), - "state", gtk_widget_get_state (GTK_WIDGET (display)), + "display-mode", display->priv->mode, + "render-maps", display->priv->show_maps, NULL); - display->priv->formatter_cancellable = g_cancellable_new (); + buffer = g_string_sized_new (1024); + + eab_contact_formatter_format_contact ( + formatter, display->priv->contact, buffer); + e_web_view_load_string (E_WEB_VIEW (display), buffer->str); + + g_string_free (buffer, TRUE); - eab_contact_formatter_format_contact_async ( - formatter, display->priv->contact, - display->priv->formatter_cancellable, - (GAsyncReadyCallback) contact_formatting_finished, - display); + g_object_unref (formatter); } static void diff --git a/addressbook/gui/widgets/eab-contact-formatter.c b/addressbook/gui/widgets/eab-contact-formatter.c index 24f92f3ef9..60beefa5c3 100644 --- a/addressbook/gui/widgets/eab-contact-formatter.c +++ b/addressbook/gui/widgets/eab-contact-formatter.c @@ -63,21 +63,14 @@ "</head>\n" struct _EABContactFormatterPrivate { - EContact *contact; - EABContactDisplayMode mode; gboolean render_maps; - - GtkStyle *style; - GtkStateType state; }; enum { PROP_0, PROP_DISPLAY_MODE, - PROP_RENDER_MAPS, - PROP_STYLE, - PROP_STATE + PROP_RENDER_MAPS }; static struct { @@ -377,14 +370,12 @@ get_email_location (EVCardAttribute *attr) static void render_title_block (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { const gchar *str; gchar *html; EContactPhoto *photo; - EContact *contact; - - contact = formatter->priv->contact; g_string_append_printf ( buffer, @@ -520,19 +511,17 @@ render_contact_list_row (EABContactFormatter *formatter, static void render_contact_list (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { - EContact *contact; EDestination *destination; const GList *dest, *dests; - contact = formatter->priv->contact; - destination = e_destination_new (); e_destination_set_contact (destination, contact, 0); dests = e_destination_list_get_root_dests (destination); - render_title_block (formatter, buffer); + render_title_block (formatter, contact, buffer); g_string_append_printf ( buffer, @@ -552,15 +541,14 @@ render_contact_list (EABContactFormatter *formatter, static void render_contact_column (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { - EContact *contact; GString *accum, *email; GList *email_list, *l, *email_attr_list, *al; gint email_num = 0; const gchar *nl; - contact = formatter->priv->contact; email = g_string_new (""); nl = ""; @@ -649,9 +637,9 @@ accum_address_map (GString *buffer, static void render_work_column (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { - EContact *contact = formatter->priv->contact; GString *accum = g_string_new (""); accum_attribute (accum, contact, _("Company"), E_CONTACT_ORG, NULL, 0); @@ -683,9 +671,9 @@ render_work_column (EABContactFormatter *formatter, static void render_personal_column (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { - EContact *contact = formatter->priv->contact; GString *accum = g_string_new (""); accum_attribute (accum, contact, _("Home Page"), E_CONTACT_HOMEPAGE_URL, NULL, E_TEXT_TO_HTML_CONVERT_URLS); @@ -713,13 +701,11 @@ render_personal_column (EABContactFormatter *formatter, static void render_footer (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { - EContact *contact; const gchar *str; - contact = formatter->priv->contact; - str = e_contact_get_const (contact, E_CONTACT_NOTE); if (!str || !*str) return; @@ -741,38 +727,33 @@ render_footer (EABContactFormatter *formatter, static void render_contact (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { - render_title_block (formatter, buffer); + render_title_block (formatter, contact, buffer); g_string_append (buffer, "<div id=\"columns\">"); - render_contact_column (formatter, buffer); - render_work_column (formatter, buffer); - render_personal_column (formatter, buffer); + render_contact_column (formatter, contact, buffer); + render_work_column (formatter, contact, buffer); + render_personal_column (formatter, contact, buffer); g_string_append (buffer, "</div>"); - render_footer (formatter, buffer); + render_footer (formatter, contact, buffer); } static void render_normal (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { - EContact *contact = formatter->priv->contact; - g_string_append (buffer, HTML_HEADER); - g_string_append_printf ( - buffer, "<body bgcolor=\"#%06x\" text=\"#%06x\">", - e_color_to_value ( - &formatter->priv->style->base[formatter->priv->state]), - e_color_to_value ( - &formatter->priv->style->text[formatter->priv->state])); + g_string_append (buffer, "<body bgcolor=\"white\">"); if (contact != NULL) { if (e_contact_get (contact, E_CONTACT_IS_LIST)) - render_contact_list (formatter, buffer); + render_contact_list (formatter, contact, buffer); else - render_contact (formatter, buffer); + render_contact (formatter, contact, buffer); } g_string_append (buffer, "</body></html>\n"); @@ -780,9 +761,9 @@ render_normal (EABContactFormatter *formatter, static void render_compact (EABContactFormatter *formatter, + EContact *contact, GString *buffer) { - EContact *contact = formatter->priv->contact; const gchar *str; gchar *html; EContactPhoto *photo; @@ -1003,43 +984,6 @@ render_compact (EABContactFormatter *formatter, g_string_append (buffer, "</body></html>\n"); } -static CamelStream * -format_contact (EABContactFormatter *formatter, - GCancellable *cancellable) -{ - GString *buffer; - CamelStream *stream; - - buffer = g_string_new (""); - - if (formatter->priv->mode == EAB_CONTACT_DISPLAY_RENDER_NORMAL) - render_normal (formatter, buffer); - else - render_compact (formatter, buffer); - - stream = camel_stream_mem_new (); - camel_stream_write_string (stream, buffer->str, cancellable, NULL); - - g_string_free (buffer, TRUE); - - return stream; -} - -static void -do_start_async_formatter (GSimpleAsyncResult *result, - GObject *object, - GCancellable *cancellable) -{ - EABContactFormatter *formatter; - CamelStream *stream; - - formatter = EAB_CONTACT_FORMATTER (object); - - stream = format_contact (formatter, cancellable); - - g_simple_async_result_set_op_res_gpointer (result, stream, NULL); -} - static void eab_contact_formatter_set_property (GObject *object, guint property_id, @@ -1058,18 +1002,6 @@ eab_contact_formatter_set_property (GObject *object, EAB_CONTACT_FORMATTER (object), g_value_get_boolean (value)); return; - - case PROP_STYLE: - eab_contact_formatter_set_style ( - EAB_CONTACT_FORMATTER (object), - g_value_get_object (value)); - return; - - case PROP_STATE: - eab_contact_formatter_set_state ( - EAB_CONTACT_FORMATTER (object), - g_value_get_uint (value)); - return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -1095,40 +1027,12 @@ eab_contact_formatter_get_property (GObject *object, eab_contact_formatter_get_render_maps ( EAB_CONTACT_FORMATTER (object))); return; - - case PROP_STYLE: - g_value_set_object ( - value, - eab_contact_formatter_get_style ( - EAB_CONTACT_FORMATTER (object))); - return; - - case PROP_STATE: - g_value_set_uint ( - value, - eab_contact_formatter_get_state ( - EAB_CONTACT_FORMATTER (object))); - return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void -eab_contact_formatter_dispose (GObject *object) -{ - EABContactFormatterPrivate *priv; - - priv = EAB_CONTACT_FORMATTER_GET_PRIVATE (object); - - g_clear_object (&priv->contact); - g_clear_object (&priv->style); - - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (eab_contact_formatter_parent_class)->dispose (object); -} - -static void eab_contact_formatter_class_init (EABContactFormatterClass *class) { GObjectClass *object_class; @@ -1138,7 +1042,6 @@ eab_contact_formatter_class_init (EABContactFormatterClass *class) object_class = G_OBJECT_CLASS (class); object_class->set_property = eab_contact_formatter_set_property; object_class->get_property = eab_contact_formatter_get_property; - object_class->dispose = eab_contact_formatter_dispose; g_object_class_install_property ( object_class, @@ -1151,6 +1054,7 @@ eab_contact_formatter_class_init (EABContactFormatterClass *class) EAB_CONTACT_DISPLAY_RENDER_COMPACT, EAB_CONTACT_DISPLAY_RENDER_NORMAL, G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( @@ -1162,31 +1066,6 @@ eab_contact_formatter_class_init (EABContactFormatterClass *class) NULL, FALSE, G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STYLE, - g_param_spec_object ( - "style", - "Style", - NULL, - GTK_TYPE_STYLE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property ( - object_class, - PROP_STATE, - g_param_spec_uint ( - "state", - "State", - NULL, - 0, - G_MAXUINT, - 0, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); } @@ -1196,67 +1075,14 @@ eab_contact_formatter_init (EABContactFormatter *formatter) { formatter->priv = EAB_CONTACT_FORMATTER_GET_PRIVATE (formatter); - formatter->priv->contact = NULL; formatter->priv->mode = EAB_CONTACT_DISPLAY_RENDER_NORMAL; formatter->priv->render_maps = FALSE; } EABContactFormatter * -eab_contact_formatter_new (EABContactDisplayMode mode, - gboolean render_maps) -{ - return g_object_new ( - EAB_TYPE_CONTACT_FORMATTER, - "display-mode", mode, - "render-maps", render_maps, - NULL); -} - -GtkStyle * -eab_contact_formatter_get_style (EABContactFormatter *formatter) -{ - g_return_val_if_fail (EAB_IS_CONTACT_FORMATTER (formatter), NULL); - - return formatter->priv->style; -} - -void -eab_contact_formatter_set_style (EABContactFormatter *formatter, - GtkStyle *style) -{ - g_return_if_fail (EAB_IS_CONTACT_FORMATTER (formatter)); - - if (formatter->priv->style == style) - return; - - g_clear_object (&formatter->priv->style); - - if (style != NULL) - formatter->priv->style = g_object_ref (style); - - g_object_notify (G_OBJECT (formatter), "style"); -} - -GtkStateType -eab_contact_formatter_get_state (EABContactFormatter *formatter) +eab_contact_formatter_new (void) { - g_return_val_if_fail (EAB_IS_CONTACT_FORMATTER (formatter), 0); - - return formatter->priv->state; -} - -void -eab_contact_formatter_set_state (EABContactFormatter *formatter, - GtkStateType state) -{ - g_return_if_fail (EAB_IS_CONTACT_FORMATTER (formatter)); - - if (formatter->priv->state == state) - return; - - formatter->priv->state = state; - - g_object_notify (G_OBJECT (formatter), "state"); + return g_object_new (EAB_TYPE_CONTACT_FORMATTER, NULL); } gboolean @@ -1306,60 +1132,18 @@ eab_contact_formatter_set_display_mode (EABContactFormatter *formatter, } void -eab_contact_formatter_format_contact_sync (EABContactFormatter *formatter, - EContact *contact, - CamelStream *stream, - GCancellable *cancellable) +eab_contact_formatter_format_contact (EABContactFormatter *formatter, + EContact *contact, + GString *output_buffer) { - CamelStream *out; - g_return_if_fail (EAB_IS_CONTACT_FORMATTER (formatter)); g_return_if_fail (E_IS_CONTACT (contact)); + g_return_if_fail (output_buffer != NULL); - g_object_ref (contact); - - if (formatter->priv->contact) - g_object_unref (formatter->priv->contact); - - formatter->priv->contact = contact; - - out = format_contact (formatter, cancellable); - - g_seekable_seek (G_SEEKABLE (out), 0, G_SEEK_SET, cancellable, NULL); - camel_stream_write_to_stream (out, stream, cancellable, NULL); - - g_object_unref (out); -} - -void -eab_contact_formatter_format_contact_async (EABContactFormatter *formatter, - EContact *contact, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GSimpleAsyncResult *simple; - - g_return_if_fail (EAB_IS_CONTACT_FORMATTER (formatter)); - g_return_if_fail (E_IS_CONTACT (contact)); - g_return_if_fail (callback != NULL); - - g_object_ref (contact); - - g_clear_object (&formatter->priv->contact); - formatter->priv->contact = contact; - - simple = g_simple_async_result_new ( - G_OBJECT (formatter), callback, user_data, - eab_contact_formatter_format_contact_async); - - g_simple_async_result_set_check_cancellable (simple, cancellable); - - g_simple_async_result_run_in_thread ( - simple, do_start_async_formatter, - G_PRIORITY_DEFAULT, cancellable); - - g_object_unref (simple); + if (formatter->priv->mode == EAB_CONTACT_DISPLAY_RENDER_NORMAL) + render_normal (formatter, contact, output_buffer); + else + render_compact (formatter, contact, output_buffer); } static void diff --git a/addressbook/gui/widgets/eab-contact-formatter.h b/addressbook/gui/widgets/eab-contact-formatter.h index 58f671fe9f..4dc1427960 100644 --- a/addressbook/gui/widgets/eab-contact-formatter.h +++ b/addressbook/gui/widgets/eab-contact-formatter.h @@ -60,14 +60,7 @@ struct _EABContactFormatterClass { GType eab_contact_formatter_get_type (void) G_GNUC_CONST; EABContactFormatter * - eab_contact_formatter_new (EABContactDisplayMode mode, - gboolean render_maps); -GtkStyle * eab_contact_formatter_get_style (EABContactFormatter *formatter); -void eab_contact_formatter_set_style (EABContactFormatter *formatter, - GtkStyle *context); -GtkStateType eab_contact_formatter_get_state (EABContactFormatter *formatter); -void eab_contact_formatter_set_state (EABContactFormatter *formatter, - GtkStateType state); + eab_contact_formatter_new (void); gboolean eab_contact_formatter_get_render_maps (EABContactFormatter *formatter); void eab_contact_formatter_set_render_maps @@ -79,17 +72,10 @@ EABContactDisplayMode void eab_contact_formatter_set_display_mode (EABContactFormatter *formatter, EABContactDisplayMode mode); -void eab_contact_formatter_format_contact_sync - (EABContactFormatter *formatter, - EContact *contact, - CamelStream *stream, - GCancellable *cancellable); -void eab_contact_formatter_format_contact_async +void eab_contact_formatter_format_contact (EABContactFormatter *formatter, EContact *contact, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); + GString *output_buffer); void eab_contact_formatter_bind_dom (WebKitDOMDocument *document); G_END_DECLS diff --git a/modules/vcard-inline/e-mail-formatter-vcard.c b/modules/vcard-inline/e-mail-formatter-vcard.c index 01d015f754..75c1d2ec44 100644 --- a/modules/vcard-inline/e-mail-formatter-vcard.c +++ b/modules/vcard-inline/e-mail-formatter-vcard.c @@ -69,18 +69,22 @@ mail_formatter_vcard_format (EMailFormatterExtension *extension, g_return_val_if_fail (E_IS_MAIL_PART_VCARD (part), FALSE); vcard_part = (EMailPartVCard *) part; + g_return_val_if_fail (vcard_part->contact_list != NULL, FALSE); if (context->mode == E_MAIL_FORMATTER_MODE_RAW) { - EContact *contact; + GString *buffer; + + contact = E_CONTACT (vcard_part->contact_list->data); + + buffer = g_string_sized_new (1024); - if (vcard_part->contact_list != NULL) - contact = E_CONTACT (vcard_part->contact_list->data); - else - contact = NULL; + eab_contact_formatter_format_contact ( + vcard_part->formatter, contact, buffer); + camel_stream_write_string ( + stream, buffer->str, cancellable, NULL); - eab_contact_formatter_format_contact_sync ( - vcard_part->formatter, contact, stream, cancellable); + g_string_free (buffer, TRUE); } else { CamelFolder *folder; @@ -94,8 +98,6 @@ mail_formatter_vcard_format (EMailFormatterExtension *extension, gchar *html_label, *access_key; length = g_slist_length (vcard_part->contact_list); - if (length < 1) - return FALSE; folder = e_mail_part_list_get_folder (context->part_list); message_uid = e_mail_part_list_get_message_uid (context->part_list); |