diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2012-12-05 21:19:04 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2012-12-08 03:01:04 +0800 |
commit | 91822b42dc7b5eb64cad2626f9fc620a2ee6a2c8 (patch) | |
tree | 1c06f36fa153eee0779cdfa1be1a24f62e93787d /em-format/e-mail-formatter-message-rfc822.c | |
parent | 2f0d83cf74b94d5e6272c07179df6e6c7a929789 (diff) | |
download | gsoc2013-evolution-91822b42dc7b5eb64cad2626f9fc620a2ee6a2c8.tar gsoc2013-evolution-91822b42dc7b5eb64cad2626f9fc620a2ee6a2c8.tar.gz gsoc2013-evolution-91822b42dc7b5eb64cad2626f9fc620a2ee6a2c8.tar.bz2 gsoc2013-evolution-91822b42dc7b5eb64cad2626f9fc620a2ee6a2c8.tar.lz gsoc2013-evolution-91822b42dc7b5eb64cad2626f9fc620a2ee6a2c8.tar.xz gsoc2013-evolution-91822b42dc7b5eb64cad2626f9fc620a2ee6a2c8.tar.zst gsoc2013-evolution-91822b42dc7b5eb64cad2626f9fc620a2ee6a2c8.zip |
Make EMailPartList thread-safe.
Exposing data members in the public struct is unwise, especially when
EMailPartList is used from multiple threads. Instead keep the members
private and provide a set of thread-safe functions to manipulate them.
Diffstat (limited to 'em-format/e-mail-formatter-message-rfc822.c')
-rw-r--r-- | em-format/e-mail-formatter-message-rfc822.c | 97 |
1 files changed, 50 insertions, 47 deletions
diff --git a/em-format/e-mail-formatter-message-rfc822.c b/em-format/e-mail-formatter-message-rfc822.c index 78dfe3f45d..06f7e49603 100644 --- a/em-format/e-mail-formatter-message-rfc822.c +++ b/em-format/e-mail-formatter-message-rfc822.c @@ -74,7 +74,8 @@ emfe_message_rfc822_format (EMailFormatterExtension *extension, return FALSE; if (context->mode == E_MAIL_FORMATTER_MODE_RAW) { - GSList *iter; + GQueue queue = G_QUEUE_INIT; + GList *head, *link; gchar *header, *end; header = e_mail_formatter_get_html_header (formatter); @@ -84,35 +85,36 @@ emfe_message_rfc822_format (EMailFormatterExtension *extension, /* Print content of the message normally */ context->mode = E_MAIL_FORMATTER_MODE_NORMAL; - iter = e_mail_part_list_get_iter ( - context->part_list->list, part->id); + e_mail_part_list_queue_parts ( + context->part_list, part->id, &queue); + + /* Discard the first EMailPart. */ + if (!g_queue_is_empty (&queue)) + e_mail_part_unref (g_queue_pop_head (&queue)); + + head = g_queue_peek_head_link (&queue); end = g_strconcat (part->id, ".end", NULL); - for (iter = g_slist_next (iter); iter; iter = g_slist_next (iter)) { - EMailPart * p = iter->data; - if (!p) - continue; + + for (link = head; link != NULL; link = g_list_next (link)) { + EMailPart *p = link->data; /* Check for nested rfc822 messages */ if (g_str_has_suffix (p->id, ".rfc822")) { gchar *sub_end = g_strconcat (p->id, ".end", NULL); - while (iter) { - p = iter->data; - if (!p) { - iter = iter->next; - continue; - } + while (link != NULL) { + p = link->data; - if (g_strcmp0 (p->id, sub_end) == 0) { + if (g_strcmp0 (p->id, sub_end) == 0) break; - } - iter = iter->next; + link = g_list_next (link); } g_free (sub_end); continue; } + if ((g_strcmp0 (p->id, end) == 0)) break; @@ -122,35 +124,41 @@ emfe_message_rfc822_format (EMailFormatterExtension *extension, e_mail_formatter_format_as ( formatter, context, p, stream, NULL, cancellable); - } g_free (end); + while (!g_queue_is_empty (&queue)) + e_mail_part_unref (g_queue_pop_head (&queue)); + context->mode = E_MAIL_FORMATTER_MODE_RAW; camel_stream_write_string (stream, "</body></html>", cancellable, NULL); } else if (context->mode == E_MAIL_FORMATTER_MODE_PRINTING) { - - GSList *iter; + GQueue queue = G_QUEUE_INIT; + GList *head, *link; gchar *end; /* Part is EMailPartAttachment */ - iter = e_mail_part_list_get_iter ( - context->part_list->list, part->id); - iter = g_slist_next (iter); + e_mail_part_list_queue_parts ( + context->part_list, part->id, &queue); + + /* Discard the first EMailPart. */ + if (!g_queue_is_empty (&queue)) + e_mail_part_unref (g_queue_pop_head (&queue)); - if (!iter || !iter->next || !iter->data) + if (g_queue_is_empty (&queue)) return FALSE; - part = iter->data; + part = g_queue_pop_head (&queue); end = g_strconcat (part->id, ".end", NULL); + e_mail_part_unref (part); - for (iter = iter->next; iter; iter = g_slist_next (iter)) { - EMailPart * p = iter->data; - if (!p) - continue; + head = g_queue_peek_head_link (&queue); + + for (link = head; link != NULL; link = g_list_next (link)) { + EMailPart *p = link->data; /* Skip attachment bar */ if (g_str_has_suffix (part->id, ".attachment-bar")) @@ -160,18 +168,13 @@ emfe_message_rfc822_format (EMailFormatterExtension *extension, if (g_str_has_suffix (p->id, ".rfc822")) { gchar *sub_end = g_strconcat (p->id, ".end", NULL); - while (iter) { - p = iter->data; - if (!p) { - iter = iter->next; - continue; - } + while (link != NULL) { + p = link->data; - if (g_strcmp0 (p->id, sub_end) == 0) { + if (g_strcmp0 (p->id, sub_end) == 0) break; - } - iter = iter->next; + link = g_list_next (link); } g_free (sub_end); continue; @@ -190,24 +193,22 @@ emfe_message_rfc822_format (EMailFormatterExtension *extension, g_free (end); + while (!g_queue_is_empty (&queue)) + e_mail_part_unref (g_queue_pop_head (&queue)); + } else { + EMailPart *p; CamelFolder *folder; const gchar *message_uid; gchar *str; gchar *uri; - EMailPart *p; - GSList *iter; - - iter = e_mail_part_list_get_iter ( - context->part_list->list, part->id); - if (!iter || !iter->next) + p = e_mail_part_list_ref_part (context->part_list, part->id); + if (p == NULL) return FALSE; - p = iter->data; - - folder = context->part_list->folder; - message_uid = context->part_list->message_uid; + folder = e_mail_part_list_get_folder (context->part_list); + message_uid = e_mail_part_list_get_message_uid (context->part_list); uri = e_mail_part_build_uri ( folder, message_uid, @@ -235,6 +236,8 @@ emfe_message_rfc822_format (EMailFormatterExtension *extension, g_free (str); g_free (uri); + + e_mail_part_unref (p); } return TRUE; |