diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2013-05-13 22:11:47 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2013-05-15 03:20:14 +0800 |
commit | 5551dd5a5488ba91f7ced37ca0d0d3faedd03f6b (patch) | |
tree | 5ddf095783ca977008656025c54a9c8ee632f837 | |
parent | 1a0d3e0d91f43b3ece84b873178ef6c6a4041eea (diff) | |
download | gsoc2013-evolution-5551dd5a5488ba91f7ced37ca0d0d3faedd03f6b.tar gsoc2013-evolution-5551dd5a5488ba91f7ced37ca0d0d3faedd03f6b.tar.gz gsoc2013-evolution-5551dd5a5488ba91f7ced37ca0d0d3faedd03f6b.tar.bz2 gsoc2013-evolution-5551dd5a5488ba91f7ced37ca0d0d3faedd03f6b.tar.lz gsoc2013-evolution-5551dd5a5488ba91f7ced37ca0d0d3faedd03f6b.tar.xz gsoc2013-evolution-5551dd5a5488ba91f7ced37ca0d0d3faedd03f6b.tar.zst gsoc2013-evolution-5551dd5a5488ba91f7ced37ca0d0d3faedd03f6b.zip |
EMailFormatter cleanups.
-rw-r--r-- | em-format/e-mail-formatter.c | 632 | ||||
-rw-r--r-- | em-format/e-mail-formatter.h | 9 |
2 files changed, 339 insertions, 302 deletions
diff --git a/em-format/e-mail-formatter.c b/em-format/e-mail-formatter.c index b28bce4942..1794231b3d 100644 --- a/em-format/e-mail-formatter.c +++ b/em-format/e-mail-formatter.c @@ -31,27 +31,21 @@ #define d(x) -/* internal formatter extensions */ -GType e_mail_formatter_attachment_get_type (void); -GType e_mail_formatter_attachment_bar_get_type (void); -GType e_mail_formatter_error_get_type (void); -GType e_mail_formatter_headers_get_type (void); -GType e_mail_formatter_image_get_type (void); -GType e_mail_formatter_message_rfc822_get_type (void); -GType e_mail_formatter_secure_button_get_type (void); -GType e_mail_formatter_source_get_type (void); -GType e_mail_formatter_text_enriched_get_type (void); -GType e_mail_formatter_text_html_get_type (void); -GType e_mail_formatter_text_plain_get_type (void); +#define E_MAIL_FORMATTER_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_MAIL_FORMATTER, EMailFormatterPrivate))\ -void e_mail_formatter_internal_extensions_load (EMailExtensionRegistry *ereg); +#define STYLESHEET_URI \ + "evo-file://" EVOLUTION_PRIVDATADIR "/theme/webview.css" + +typedef struct _AsyncContext AsyncContext; struct _EMailFormatterPrivate { EMailImageLoadingPolicy image_loading_policy; - guint show_sender_photo : 1; - guint show_real_date : 1; - guint animate_images : 1; + gboolean show_sender_photo; + gboolean show_real_date; + gboolean animate_images; GMutex property_lock; @@ -61,28 +55,45 @@ struct _EMailFormatterPrivate { GQueue *header_list; }; -#define E_MAIL_FORMATTER_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), E_TYPE_MAIL_FORMATTER, EMailFormatterPrivate))\ +struct _AsyncContext { + CamelStream *stream; + EMailPartList *part_list; + EMailFormatterHeaderFlags flags; + EMailFormatterMode mode; +}; + +/* internal formatter extensions */ +GType e_mail_formatter_attachment_get_type (void); +GType e_mail_formatter_attachment_bar_get_type (void); +GType e_mail_formatter_error_get_type (void); +GType e_mail_formatter_headers_get_type (void); +GType e_mail_formatter_image_get_type (void); +GType e_mail_formatter_message_rfc822_get_type (void); +GType e_mail_formatter_secure_button_get_type (void); +GType e_mail_formatter_source_get_type (void); +GType e_mail_formatter_text_enriched_get_type (void); +GType e_mail_formatter_text_html_get_type (void); +GType e_mail_formatter_text_plain_get_type (void); + +void e_mail_formatter_internal_extensions_load (EMailExtensionRegistry *ereg); static gpointer e_mail_formatter_parent_class = 0; enum { PROP_0, + PROP_ANIMATE_IMAGES, PROP_BODY_COLOR, + PROP_CHARSET, PROP_CITATION_COLOR, PROP_CONTENT_COLOR, + PROP_DEFAULT_CHARSET, PROP_FRAME_COLOR, PROP_HEADER_COLOR, - PROP_TEXT_COLOR, PROP_IMAGE_LOADING_POLICY, - PROP_FORCE_IMAGE_LOADING, PROP_MARK_CITATIONS, - PROP_SHOW_SENDER_PHOTO, PROP_SHOW_REAL_DATE, - PROP_ANIMATE_IMAGES, - PROP_CHARSET, - PROP_DEFAULT_CHARSET + PROP_SHOW_SENDER_PHOTO, + PROP_TEXT_COLOR }; enum { @@ -92,6 +103,15 @@ enum { static gint signals[LAST_SIGNAL]; +static void +async_context_free (AsyncContext *async_context) +{ + g_clear_object (&async_context->part_list); + g_clear_object (&async_context->stream); + + g_slice_free (AsyncContext, async_context); +} + static EMailFormatterContext * mail_formatter_create_context (EMailFormatter *formatter, EMailPartList *part_list, @@ -129,6 +149,12 @@ e_mail_formatter_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { + case PROP_ANIMATE_IMAGES: + e_mail_formatter_set_animate_images ( + E_MAIL_FORMATTER (object), + g_value_get_boolean (value)); + return; + case PROP_BODY_COLOR: e_mail_formatter_set_color ( E_MAIL_FORMATTER (object), @@ -136,6 +162,12 @@ e_mail_formatter_set_property (GObject *object, g_value_get_boxed (value)); return; + case PROP_CHARSET: + e_mail_formatter_set_charset ( + E_MAIL_FORMATTER (object), + g_value_get_string (value)); + return; + case PROP_CITATION_COLOR: e_mail_formatter_set_color ( E_MAIL_FORMATTER (object), @@ -150,6 +182,12 @@ e_mail_formatter_set_property (GObject *object, g_value_get_boxed (value)); return; + case PROP_DEFAULT_CHARSET: + e_mail_formatter_set_default_charset ( + E_MAIL_FORMATTER (object), + g_value_get_string (value)); + return; + case PROP_FRAME_COLOR: e_mail_formatter_set_color ( E_MAIL_FORMATTER (object), @@ -176,14 +214,14 @@ e_mail_formatter_set_property (GObject *object, g_value_get_boolean (value)); return; - case PROP_SHOW_SENDER_PHOTO: - e_mail_formatter_set_show_sender_photo ( + case PROP_SHOW_REAL_DATE: + e_mail_formatter_set_show_real_date ( E_MAIL_FORMATTER (object), g_value_get_boolean (value)); return; - case PROP_SHOW_REAL_DATE: - e_mail_formatter_set_show_real_date ( + case PROP_SHOW_SENDER_PHOTO: + e_mail_formatter_set_show_sender_photo ( E_MAIL_FORMATTER (object), g_value_get_boolean (value)); return; @@ -194,24 +232,6 @@ e_mail_formatter_set_property (GObject *object, E_MAIL_FORMATTER_COLOR_TEXT, g_value_get_boxed (value)); return; - - case PROP_ANIMATE_IMAGES: - e_mail_formatter_set_animate_images ( - E_MAIL_FORMATTER (object), - g_value_get_boolean (value)); - return; - - case PROP_CHARSET: - e_mail_formatter_set_charset ( - E_MAIL_FORMATTER (object), - g_value_get_string (value)); - return; - - case PROP_DEFAULT_CHARSET: - e_mail_formatter_set_default_charset ( - E_MAIL_FORMATTER (object), - g_value_get_string (value)); - return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -224,6 +244,13 @@ e_mail_formatter_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { + case PROP_ANIMATE_IMAGES: + g_value_set_boolean ( + value, + e_mail_formatter_get_animate_images ( + E_MAIL_FORMATTER (object))); + return; + case PROP_BODY_COLOR: g_value_set_boxed ( value, @@ -232,6 +259,13 @@ e_mail_formatter_get_property (GObject *object, E_MAIL_FORMATTER_COLOR_BODY)); return; + case PROP_CHARSET: + g_value_take_string ( + value, + e_mail_formatter_dup_charset ( + E_MAIL_FORMATTER (object))); + return; + case PROP_CITATION_COLOR: g_value_set_boxed ( value, @@ -248,6 +282,13 @@ e_mail_formatter_get_property (GObject *object, E_MAIL_FORMATTER_COLOR_CONTENT)); return; + case PROP_DEFAULT_CHARSET: + g_value_take_string ( + value, + e_mail_formatter_dup_default_charset ( + E_MAIL_FORMATTER (object))); + return; + case PROP_FRAME_COLOR: g_value_set_boxed ( value, @@ -278,17 +319,17 @@ e_mail_formatter_get_property (GObject *object, E_MAIL_FORMATTER (object))); return; - case PROP_SHOW_SENDER_PHOTO: + case PROP_SHOW_REAL_DATE: g_value_set_boolean ( value, - e_mail_formatter_get_show_sender_photo ( + e_mail_formatter_get_show_real_date ( E_MAIL_FORMATTER (object))); return; - case PROP_SHOW_REAL_DATE: + case PROP_SHOW_SENDER_PHOTO: g_value_set_boolean ( value, - e_mail_formatter_get_show_real_date ( + e_mail_formatter_get_show_sender_photo ( E_MAIL_FORMATTER (object))); return; @@ -299,27 +340,6 @@ e_mail_formatter_get_property (GObject *object, E_MAIL_FORMATTER (object), E_MAIL_FORMATTER_COLOR_TEXT)); return; - - case PROP_ANIMATE_IMAGES: - g_value_set_boolean ( - value, - e_mail_formatter_get_animate_images ( - E_MAIL_FORMATTER (object))); - return; - - case PROP_CHARSET: - g_value_take_string ( - value, - e_mail_formatter_dup_charset ( - E_MAIL_FORMATTER (object))); - return; - - case PROP_DEFAULT_CHARSET: - g_value_take_string ( - value, - e_mail_formatter_dup_default_charset ( - E_MAIL_FORMATTER (object))); - return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -330,17 +350,10 @@ e_mail_formatter_finalize (GObject *object) { EMailFormatterPrivate *priv; - priv = E_MAIL_FORMATTER (object)->priv; + priv = E_MAIL_FORMATTER_GET_PRIVATE (object); - if (priv->charset) { - g_free (priv->charset); - priv->charset = NULL; - } - - if (priv->default_charset) { - g_free (priv->default_charset); - priv->default_charset = NULL; - } + g_free (priv->charset); + g_free (priv->default_charset); if (priv->header_list) { e_mail_formatter_clear_headers (E_MAIL_FORMATTER (object)); @@ -350,13 +363,14 @@ e_mail_formatter_finalize (GObject *object) g_mutex_clear (&priv->property_lock); - /* Chain up to parent's finalize() */ + /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_mail_formatter_parent_class)->finalize (object); } static void e_mail_formatter_constructed (GObject *object) { + /* Chain up to parent's constructed() method. */ G_OBJECT_CLASS (e_mail_formatter_parent_class)->constructed (object); e_extensible_load_extensions (E_EXTENSIBLE (object)); @@ -482,23 +496,30 @@ mail_formatter_update_style (EMailFormatter *formatter, gtk_style_context_set_path (style_context, widget_path); gtk_style_context_get_background_color (style_context, state, &rgba); - e_mail_formatter_set_color (formatter, E_MAIL_FORMATTER_COLOR_BODY, &rgba); + e_mail_formatter_set_color ( + formatter, E_MAIL_FORMATTER_COLOR_BODY, &rgba); rgba.red *= 0.8; rgba.green *= 0.8; rgba.blue *= 0.8; - e_mail_formatter_set_color (formatter, E_MAIL_FORMATTER_COLOR_FRAME, &rgba); + e_mail_formatter_set_color ( + formatter, E_MAIL_FORMATTER_COLOR_FRAME, &rgba); gtk_style_context_get_color (style_context, state, &rgba); - e_mail_formatter_set_color (formatter, E_MAIL_FORMATTER_COLOR_HEADER, &rgba); + e_mail_formatter_set_color ( + formatter, E_MAIL_FORMATTER_COLOR_HEADER, &rgba); gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_ENTRY); - gtk_style_context_get_background_color (style_context, state | GTK_STATE_FLAG_FOCUSED, &rgba); - e_mail_formatter_set_color (formatter, E_MAIL_FORMATTER_COLOR_CONTENT, &rgba); + gtk_style_context_get_background_color ( + style_context, state | GTK_STATE_FLAG_FOCUSED, &rgba); + e_mail_formatter_set_color ( + formatter, E_MAIL_FORMATTER_COLOR_CONTENT, &rgba); - gtk_style_context_get_color (style_context, state | GTK_STATE_FLAG_FOCUSED, &rgba); - e_mail_formatter_set_color (formatter, E_MAIL_FORMATTER_COLOR_TEXT, &rgba); + gtk_style_context_get_color ( + style_context, state | GTK_STATE_FLAG_FOCUSED, &rgba); + e_mail_formatter_set_color ( + formatter, E_MAIL_FORMATTER_COLOR_TEXT, &rgba); gtk_widget_path_free (widget_path); g_object_unref (style_context); @@ -582,13 +603,36 @@ e_mail_formatter_class_init (EMailFormatterClass *class) g_object_class_install_property ( object_class, + PROP_ANIMATE_IMAGES, + g_param_spec_boolean ( + "animate-images", + "Animate images", + NULL, + FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property ( + object_class, PROP_BODY_COLOR, g_param_spec_boxed ( "body-color", "Body Color", NULL, GDK_TYPE_RGBA, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property ( + object_class, + PROP_CHARSET, + g_param_spec_string ( + "charset", + NULL, + NULL, + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, @@ -598,7 +642,8 @@ e_mail_formatter_class_init (EMailFormatterClass *class) "Citation Color", NULL, GDK_TYPE_RGBA, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, @@ -608,7 +653,19 @@ e_mail_formatter_class_init (EMailFormatterClass *class) "Content Color", NULL, GDK_TYPE_RGBA, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property ( + object_class, + PROP_DEFAULT_CHARSET, + g_param_spec_string ( + "default-charset", + NULL, + NULL, + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, @@ -618,7 +675,8 @@ e_mail_formatter_class_init (EMailFormatterClass *class) "Frame Color", NULL, GDK_TYPE_RGBA, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, @@ -628,7 +686,8 @@ e_mail_formatter_class_init (EMailFormatterClass *class) "Header Color", NULL, GDK_TYPE_RGBA, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, @@ -639,7 +698,8 @@ e_mail_formatter_class_init (EMailFormatterClass *class) NULL, E_TYPE_MAIL_IMAGE_LOADING_POLICY, E_MAIL_IMAGE_LOADING_POLICY_NEVER, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, @@ -649,18 +709,8 @@ e_mail_formatter_class_init (EMailFormatterClass *class) "Mark Citations", NULL, TRUE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_SHOW_SENDER_PHOTO, - g_param_spec_boolean ( - "show-sender-photo", - "Show Sender Photo", - NULL, - FALSE, G_PARAM_READWRITE | - G_PARAM_CONSTRUCT)); + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, @@ -671,57 +721,39 @@ e_mail_formatter_class_init (EMailFormatterClass *class) NULL, TRUE, G_PARAM_READWRITE | - G_PARAM_CONSTRUCT)); - - g_object_class_install_property ( - object_class, - PROP_TEXT_COLOR, - g_param_spec_boxed ( - "text-color", - "Text Color", - NULL, - GDK_TYPE_COLOR, - G_PARAM_READWRITE)); + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, - PROP_ANIMATE_IMAGES, + PROP_SHOW_SENDER_PHOTO, g_param_spec_boolean ( - "animate-images", - "Animate images", + "show-sender-photo", + "Show Sender Photo", NULL, FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property ( - object_class, - PROP_CHARSET, - g_param_spec_string ( - "charset", - NULL, - NULL, - NULL, - G_PARAM_READWRITE)); + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, - PROP_DEFAULT_CHARSET, - g_param_spec_string ( - "default-charset", - NULL, - NULL, + PROP_TEXT_COLOR, + g_param_spec_boxed ( + "text-color", + "Text Color", NULL, - G_PARAM_READWRITE)); + GDK_TYPE_COLOR, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); signals[NEED_REDRAW] = g_signal_new ( - "need-redraw", - E_TYPE_MAIL_FORMATTER, - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EMailFormatterClass, need_redraw), - NULL, - NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, NULL); + "need-redraw", + E_TYPE_MAIL_FORMATTER, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (EMailFormatterClass, need_redraw), + NULL, NULL, NULL, + G_TYPE_NONE, 0); } static void @@ -782,50 +814,51 @@ e_mail_formatter_get_type (void) void e_mail_formatter_format_sync (EMailFormatter *formatter, - EMailPartList *parts, + EMailPartList *part_list, CamelStream *stream, EMailFormatterHeaderFlags flags, EMailFormatterMode mode, GCancellable *cancellable) { EMailFormatterContext *context; - EMailFormatterClass *formatter_class; + EMailFormatterClass *class; g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); + /* EMailPartList can be NULL. */ g_return_if_fail (CAMEL_IS_STREAM (stream)); - formatter_class = E_MAIL_FORMATTER_GET_CLASS (formatter); - g_return_if_fail (formatter_class->run != NULL); + class = E_MAIL_FORMATTER_GET_CLASS (formatter); + g_return_if_fail (class->run != NULL); context = mail_formatter_create_context ( - formatter, parts, mode, flags); + formatter, part_list, mode, flags); - formatter_class->run ( - formatter, context, stream, cancellable); + class->run (formatter, context, stream, cancellable); mail_formatter_free_context (context); } static void -mail_format_async_prepare (GSimpleAsyncResult *result, - GObject *object, - GCancellable *cancellable) +mail_formatter_format_thread (GSimpleAsyncResult *simple, + GObject *source_object, + GCancellable *cancellable) { - EMailFormatterContext *context; - EMailFormatterClass *formatter_class; - CamelStream *stream; + AsyncContext *async_context; - context = g_object_get_data (G_OBJECT (result), "context"); - stream = g_object_get_data (G_OBJECT (result), "stream"); + async_context = g_simple_async_result_get_op_res_gpointer (simple); - formatter_class = E_MAIL_FORMATTER_GET_CLASS (object); - formatter_class->run ( - E_MAIL_FORMATTER (object), context, stream, cancellable); + e_mail_formatter_format_sync ( + E_MAIL_FORMATTER (source_object), + async_context->part_list, + async_context->stream, + async_context->flags, + async_context->mode, + cancellable); } void e_mail_formatter_format (EMailFormatter *formatter, - EMailPartList *parts, + EMailPartList *part_list, CamelStream *stream, EMailFormatterHeaderFlags flags, EMailFormatterMode mode, @@ -834,14 +867,20 @@ e_mail_formatter_format (EMailFormatter *formatter, gpointer user_data) { GSimpleAsyncResult *simple; - EMailFormatterContext *context; - EMailFormatterClass *formatter_class; + AsyncContext *async_context; + EMailFormatterClass *class; g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); + /* EMailPartList can be NULL. */ g_return_if_fail (CAMEL_IS_STREAM (stream)); - formatter_class = E_MAIL_FORMATTER_GET_CLASS (formatter); - g_return_if_fail (formatter_class->run != NULL); + class = E_MAIL_FORMATTER_GET_CLASS (formatter); + g_return_if_fail (class->run != NULL); + + async_context = g_slice_new0 (AsyncContext); + async_context->stream = g_object_ref (stream); + async_context->flags = flags; + async_context->mode = mode; simple = g_simple_async_result_new ( G_OBJECT (formatter), callback, @@ -849,41 +888,38 @@ e_mail_formatter_format (EMailFormatter *formatter, g_simple_async_result_set_check_cancellable (simple, cancellable); - if (!parts) { - if (callback) - callback (G_OBJECT (formatter), G_ASYNC_RESULT (simple), user_data); - g_object_unref (simple); - return; - } + g_simple_async_result_set_op_res_gpointer ( + simple, async_context, (GDestroyNotify) async_context_free); - context = mail_formatter_create_context ( - formatter, parts, mode, flags); - - g_object_set_data (G_OBJECT (simple), "context", context); - g_object_set_data (G_OBJECT (simple), "stream", stream); + if (part_list != NULL) { + async_context->part_list = g_object_ref (part_list); - g_simple_async_result_run_in_thread ( - simple, mail_format_async_prepare, - G_PRIORITY_DEFAULT, cancellable); + g_simple_async_result_run_in_thread ( + simple, mail_formatter_format_thread, + G_PRIORITY_DEFAULT, cancellable); + } else { + g_simple_async_result_complete_in_idle (simple); + } g_object_unref (simple); } -CamelStream * -e_mail_formatter_format_finished (EMailFormatter *formatter, - GAsyncResult *result, - GError *error) +gboolean +e_mail_formatter_format_finish (EMailFormatter *formatter, + GAsyncResult *result, + GError **error) { - EMailFormatterContext *context; - - g_return_val_if_fail (E_IS_MAIL_FORMATTER (formatter), NULL); - g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + GSimpleAsyncResult *simple; - context = g_object_get_data (G_OBJECT (result), "context"); + g_return_val_if_fail ( + g_simple_async_result_is_valid ( + result, G_OBJECT (formatter), + e_mail_formatter_format), FALSE); - mail_formatter_free_context (context); + simple = G_SIMPLE_ASYNC_RESULT (result); - return g_object_get_data (G_OBJECT (result), "stream"); + /* Assume success unless a GError is set. */ + return !g_simple_async_result_propagate_error (simple, error); } /** @@ -910,9 +946,8 @@ e_mail_formatter_format_as (EMailFormatter *formatter, const gchar *as_mime_type, GCancellable *cancellable) { - EMailExtensionRegistry *reg; + EMailExtensionRegistry *extension_registry; GQueue *formatters; - GList *iter; gboolean ok; d ( gint _call_i; @@ -925,22 +960,22 @@ e_mail_formatter_format_as (EMailFormatter *formatter, ); g_return_val_if_fail (E_IS_MAIL_FORMATTER (formatter), FALSE); - g_return_val_if_fail (part, FALSE); + g_return_val_if_fail (part != NULL, FALSE); g_return_val_if_fail (CAMEL_IS_STREAM (stream), FALSE); - if (!as_mime_type || !*as_mime_type) + if (as_mime_type == NULL || *as_mime_type == '\0') as_mime_type = part->mime_type; - if (!as_mime_type || !*as_mime_type) + if (as_mime_type == NULL || *as_mime_type == '\0') return FALSE; - reg = e_mail_formatter_get_extension_registry (formatter); + extension_registry = + e_mail_formatter_get_extension_registry (formatter); formatters = e_mail_extension_registry_get_for_mime_type ( - reg, as_mime_type); - if (!formatters) { + extension_registry, as_mime_type); + if (formatters == NULL) formatters = e_mail_extension_registry_get_fallback ( - reg, as_mime_type); - } + extension_registry, as_mime_type); ok = FALSE; @@ -949,18 +984,21 @@ e_mail_formatter_format_as (EMailFormatter *formatter, _call_i, part->id, as_mime_type, formatters ? g_queue_get_length (formatters) : 0)); - if (formatters) { - for (iter = formatters->head; iter; iter = iter->next) { + if (formatters != NULL) { + GList *head, *link; + head = g_queue_peek_head_link (formatters); + + for (link = head; link != NULL; link = g_list_next (link)) { EMailFormatterExtension *extension; - extension = iter->data; - if (!extension) + extension = link->data; + if (extension == NULL) continue; ok = e_mail_formatter_extension_format ( - extension, formatter, context, - part, stream, cancellable); + extension, formatter, context, + part, stream, cancellable); d ( printf ( @@ -994,7 +1032,7 @@ e_mail_formatter_format_text (EMailFormatter *formatter, CamelStream *filter_stream; CamelMimeFilter *filter; const gchar *charset = NULL; - CamelMimeFilterWindows *windows = NULL; + CamelMimeFilter *windows = NULL; CamelStream *mem_stream = NULL; CamelDataWrapper *dw; @@ -1019,17 +1057,17 @@ e_mail_formatter_format_text (EMailFormatter *formatter, filter_stream = camel_stream_filter_new (null); g_object_unref (null); - windows = (CamelMimeFilterWindows *) camel_mime_filter_windows_new (charset); + windows = camel_mime_filter_windows_new (charset); camel_stream_filter_add ( - CAMEL_STREAM_FILTER (filter_stream), - CAMEL_MIME_FILTER (windows)); + CAMEL_STREAM_FILTER (filter_stream), windows); camel_data_wrapper_decode_to_stream_sync ( - dw, (CamelStream *) filter_stream, cancellable, NULL); - camel_stream_flush ((CamelStream *) filter_stream, cancellable, NULL); + dw, filter_stream, cancellable, NULL); + camel_stream_flush (filter_stream, cancellable, NULL); g_object_unref (filter_stream); - charset = camel_mime_filter_windows_real_charset (windows); + charset = camel_mime_filter_windows_real_charset ( + CAMEL_MIME_FILTER_WINDOWS (windows)); } else if (charset == NULL) { charset = formatter->priv->default_charset; } @@ -1037,28 +1075,27 @@ e_mail_formatter_format_text (EMailFormatter *formatter, mem_stream = (CamelStream *) camel_stream_mem_new (); filter_stream = camel_stream_filter_new (mem_stream); - if ((filter = camel_mime_filter_charset_new (charset, "UTF-8"))) { + filter = camel_mime_filter_charset_new (charset, "UTF-8"); + if (filter != NULL) { camel_stream_filter_add ( - CAMEL_STREAM_FILTER (filter_stream), - CAMEL_MIME_FILTER (filter)); + CAMEL_STREAM_FILTER (filter_stream), filter); g_object_unref (filter); } camel_data_wrapper_decode_to_stream_sync ( - camel_medium_get_content ((CamelMedium *) dw), - (CamelStream *) filter_stream, cancellable, NULL); - camel_stream_flush ((CamelStream *) filter_stream, cancellable, NULL); + camel_medium_get_content (CAMEL_MEDIUM (dw)), + filter_stream, cancellable, NULL); + camel_stream_flush (filter_stream, cancellable, NULL); g_object_unref (filter_stream); g_seekable_seek (G_SEEKABLE (mem_stream), 0, G_SEEK_SET, NULL, NULL); camel_stream_write_to_stream ( - mem_stream, (CamelStream *) stream, cancellable, NULL); - camel_stream_flush ((CamelStream *) mem_stream, cancellable, NULL); + mem_stream, stream, cancellable, NULL); + camel_stream_flush (mem_stream, cancellable, NULL); - if (windows) { + if (windows != NULL) g_object_unref (windows); - } g_object_unref (mem_stream); } @@ -1067,14 +1104,18 @@ gchar * e_mail_formatter_get_html_header (EMailFormatter *formatter) { return g_strdup_printf ( - "<!DOCTYPE HTML>\n<html>\n" - "<head>\n<meta name=\"generator\" content=\"Evolution Mail Component\" />\n" + "<!DOCTYPE HTML>\n" + "<html>\n" + "<head>\n" + "<meta name=\"generator\" content=\"Evolution Mail\"/>\n" "<title>Evolution Mail Display</title>\n" - "<link type=\"text/css\" rel=\"stylesheet\" href=\"evo-file://" EVOLUTION_PRIVDATADIR "/theme/webview.css\" />\n" + "<link type=\"text/css\" rel=\"stylesheet\" " + " href=\"" STYLESHEET_URI "\"/>\n" "<style type=\"text/css\">\n" " table th { color: #%06x; font-weight: bold; }\n" "</style>\n" - "</head><body bgcolor=\"#%06x\" text=\"#%06x\">", + "</head>" + "<body bgcolor=\"#%06x\" text=\"#%06x\">", e_rgba_to_value ( e_mail_formatter_get_color ( formatter, E_MAIL_FORMATTER_COLOR_HEADER)), @@ -1089,12 +1130,12 @@ e_mail_formatter_get_html_header (EMailFormatter *formatter) EMailExtensionRegistry * e_mail_formatter_get_extension_registry (EMailFormatter *formatter) { - EMailFormatterClass * formatter_class; + EMailFormatterClass * class; g_return_val_if_fail (E_IS_MAIL_FORMATTER (formatter), NULL); - formatter_class = E_MAIL_FORMATTER_GET_CLASS (formatter); - return E_MAIL_EXTENSION_REGISTRY (formatter_class->extension_registry); + class = E_MAIL_FORMATTER_GET_CLASS (formatter); + return E_MAIL_EXTENSION_REGISTRY (class->extension_registry); } CamelMimeFilterToHTMLFlags @@ -1166,14 +1207,14 @@ void e_mail_formatter_update_style (EMailFormatter *formatter, GtkStateFlags state) { - EMailFormatterClass *formatter_class; + EMailFormatterClass *class; g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); - formatter_class = E_MAIL_FORMATTER_GET_CLASS (formatter); - g_return_if_fail (formatter_class->update_style != NULL); + class = E_MAIL_FORMATTER_GET_CLASS (formatter); + g_return_if_fail (class->update_style != NULL); - formatter_class->update_style (formatter, state); + class->update_style (formatter, state); } EMailImageLoadingPolicy @@ -1303,15 +1344,19 @@ e_mail_formatter_get_charset (EMailFormatter *formatter) gchar * e_mail_formatter_dup_charset (EMailFormatter *formatter) { - gchar *charset; + const gchar *protected; + gchar *duplicate; g_return_val_if_fail (E_IS_MAIL_FORMATTER (formatter), NULL); g_mutex_lock (&formatter->priv->property_lock); - charset = g_strdup (e_mail_formatter_get_charset (formatter)); + + protected = e_mail_formatter_get_charset (formatter); + duplicate = g_strdup (protected); + g_mutex_unlock (&formatter->priv->property_lock); - return charset; + return duplicate; } void @@ -1321,18 +1366,14 @@ e_mail_formatter_set_charset (EMailFormatter *formatter, g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); g_mutex_lock (&formatter->priv->property_lock); + if (g_strcmp0 (formatter->priv->charset, charset) == 0) { g_mutex_unlock (&formatter->priv->property_lock); return; } g_free (formatter->priv->charset); - - if (!charset) { - formatter->priv->charset = NULL; - } else { - formatter->priv->charset = g_strdup (charset); - } + formatter->priv->charset = g_strdup (charset); g_mutex_unlock (&formatter->priv->property_lock); @@ -1350,15 +1391,19 @@ e_mail_formatter_get_default_charset (EMailFormatter *formatter) gchar * e_mail_formatter_dup_default_charset (EMailFormatter *formatter) { - gchar *default_charset; + const gchar *protected; + gchar *duplicate; g_return_val_if_fail (E_IS_MAIL_FORMATTER (formatter), NULL); g_mutex_lock (&formatter->priv->property_lock); - default_charset = g_strdup (e_mail_formatter_get_default_charset (formatter)); + + protected = e_mail_formatter_get_default_charset (formatter); + duplicate = g_strdup (protected); + g_mutex_unlock (&formatter->priv->property_lock); - return default_charset; + return duplicate; } void @@ -1421,8 +1466,8 @@ e_mail_formatter_get_headers (EMailFormatter *formatter) * * Returns copy of a list of currently set headers. * - * Returns: (transfer-full): A new #GQueue of currently set headers; the pointer should - * be freed when no longer needed with command: + * Returns: (transfer-full): A new #GQueue of currently set headers; + * the pointer should be freed when no longer needed with command: * g_queue_free_full (queue, (GDestroyNotify) e_mail_formatter_header_free); */ GQueue * @@ -1471,7 +1516,8 @@ e_mail_formatter_clear_headers (EMailFormatter *formatter) g_mutex_lock (&formatter->priv->property_lock); - while ((header = g_queue_pop_head (formatter->priv->header_list)) != NULL) { + while (!g_queue_is_empty (formatter->priv->header_list)) { + header = g_queue_pop_head (formatter->priv->header_list); e_mail_formatter_header_free (header); } @@ -1519,16 +1565,16 @@ e_mail_formatter_add_header (EMailFormatter *formatter, const gchar *value, EMailFormatterHeaderFlags flags) { - EMailFormatterHeader *h; + EMailFormatterHeader *header; g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); - g_return_if_fail (name && *name); + g_return_if_fail (name != NULL && *name != '\0'); - h = e_mail_formatter_header_new (name, value); - h->flags = flags; + header = e_mail_formatter_header_new (name, value); + header->flags = flags; g_mutex_lock (&formatter->priv->property_lock); - g_queue_push_tail (formatter->priv->header_list, h); + g_queue_push_tail (formatter->priv->header_list, header); g_mutex_unlock (&formatter->priv->property_lock); g_signal_emit (formatter, signals[NEED_REDRAW], 0, NULL); @@ -1539,9 +1585,10 @@ e_mail_formatter_add_header_struct (EMailFormatter *formatter, const EMailFormatterHeader *header) { g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); - g_return_if_fail (header && header->name); + g_return_if_fail (header != NULL); - e_mail_formatter_add_header (formatter, header->name, header->value, header->flags); + e_mail_formatter_add_header ( + formatter, header->name, header->value, header->flags); } void @@ -1549,41 +1596,37 @@ e_mail_formatter_remove_header (EMailFormatter *formatter, const gchar *name, const gchar *value) { - GList *iter = NULL; + GQueue trash = G_QUEUE_INIT; + GList *head, *link; g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); - g_return_if_fail (name && *name); + g_return_if_fail (name != NULL && *name != '\0'); g_mutex_lock (&formatter->priv->property_lock); - iter = g_queue_peek_head_link (formatter->priv->header_list); - while (iter) { - EMailFormatterHeader *header = iter->data; - - if (!header->value || !*header->value) { - GList *next = iter->next; - if (g_strcmp0 (name, header->name) == 0) - g_queue_delete_link (formatter->priv->header_list, iter); + head = g_queue_peek_head_link (formatter->priv->header_list); - iter = next; - continue; - } - - if (value && *value) { - if ((g_strcmp0 (name, header->name) == 0) && - (g_strcmp0 (value, header->value) == 0)) + for (link = head; link != NULL; link = g_list_next (link)) { + EMailFormatterHeader *header = link->data; + + if (g_strcmp0 (name, header->name) == 0) { + if (header->value == NULL || *header->value == '\0') { + g_queue_push_tail (&trash, link); + /* do not break */ + } else if (value == NULL || *value == '\0') { + g_queue_push_tail (&trash, link); break; - } else { - if (g_strcmp0 (name, header->name) == 0) + } else if (g_strcmp0 (value, header->value) == 0) { + g_queue_push_tail (&trash, link); break; + } } - - iter = iter->next; } - if (iter) { - e_mail_formatter_header_free (iter->data); - g_queue_delete_link (formatter->priv->header_list, iter); + while (!g_queue_is_empty (&trash)) { + link = g_queue_pop_head (&trash); + e_mail_formatter_header_free (link->data); + g_queue_delete_link (formatter->priv->header_list, link); } g_mutex_unlock (&formatter->priv->property_lock); @@ -1593,9 +1636,11 @@ void e_mail_formatter_remove_header_struct (EMailFormatter *formatter, const EMailFormatterHeader *header) { + g_return_if_fail (E_IS_MAIL_FORMATTER (formatter)); g_return_if_fail (header != NULL); - e_mail_formatter_remove_header (formatter, header->name, header->value); + e_mail_formatter_remove_header ( + formatter, header->name, header->value); } EMailFormatterHeader * @@ -1604,11 +1649,11 @@ e_mail_formatter_header_new (const gchar *name, { EMailFormatterHeader *header; - g_return_val_if_fail (name && *name, NULL); + g_return_val_if_fail (name != NULL && *name != '\0', NULL); header = g_new0 (EMailFormatterHeader, 1); header->name = g_strdup (name); - if (value && *value) + if (value != NULL && *value != '\0') header->value = g_strdup (value); return header; @@ -1617,17 +1662,10 @@ e_mail_formatter_header_new (const gchar *name, void e_mail_formatter_header_free (EMailFormatterHeader *header) { - g_return_if_fail (header); - - if (header->name) { - g_free (header->name); - header->name = NULL; - } + g_return_if_fail (header != NULL); - if (header->value) { - g_free (header->value); - header->value = NULL; - } + g_free (header->name); + g_free (header->value); g_free (header); } diff --git a/em-format/e-mail-formatter.h b/em-format/e-mail-formatter.h index c2cebfa6a2..ca87246aeb 100644 --- a/em-format/e-mail-formatter.h +++ b/em-format/e-mail-formatter.h @@ -133,14 +133,14 @@ EMailFormatter * e_mail_formatter_new (void); void e_mail_formatter_format_sync (EMailFormatter *formatter, - EMailPartList *parts_list, + EMailPartList *part_list, CamelStream *stream, EMailFormatterHeaderFlags flags, EMailFormatterMode mode, GCancellable *cancellable); void e_mail_formatter_format (EMailFormatter *formatter, - EMailPartList *parts_list, + EMailPartList *part_list, CamelStream *stream, EMailFormatterHeaderFlags flags, EMailFormatterMode mode, @@ -148,10 +148,9 @@ void e_mail_formatter_format (EMailFormatter *formatter, GCancellable *cancellable, gpointer user_data); -CamelStream * e_mail_formatter_format_finished - (EMailFormatter *formatter, +gboolean e_mail_formatter_format_finish (EMailFormatter *formatter, GAsyncResult *result, - GError *error); + GError **error); gboolean e_mail_formatter_format_as (EMailFormatter *formatter, EMailFormatterContext *context, |