Setup the GMimeStream only when needed

I ran into this while looking at the vim plugin.  Vim's system() call
redirects output to a file and it was missing many of the part{ lines.

If stream_stdout is setup too early, it will overwrite the part start
when notmuch is redirected to a file.

Reviewed-by Carl Worth <cworth@cworth.org>: GMime is calling fseek
before every write to reset the FILE* to the position it believes is
correct based on the writes it has seen. Our code was getting
incorrect results because our GMime writes were interleaved with
non-GMime writes via printf.

The bug appears when writing to a file because it's seekable, but not
when writing to a pipe which is not.
This commit is contained in:
nstraz@redhat.com 2010-04-01 09:47:21 -04:00 committed by Carl Worth
parent b884ab2ef1
commit 685cfcc9e8

View file

@ -236,9 +236,6 @@ format_part_text (GMimeObject *part, int *part_count)
{
GMimeContentDisposition *disposition;
GMimeContentType *content_type;
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
disposition = g_mime_object_get_content_disposition (part);
if (disposition &&
@ -256,14 +253,14 @@ format_part_text (GMimeObject *part, int *part_count)
if (g_mime_content_type_is_type (content_type, "text", "*") &&
!g_mime_content_type_is_type (content_type, "text", "html"))
{
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
show_part_content (part, stream_stdout);
g_object_unref(stream_stdout);
}
printf ("\fattachment}\n");
if (stream_stdout)
g_object_unref(stream_stdout);
return;
}
@ -276,7 +273,10 @@ format_part_text (GMimeObject *part, int *part_count)
if (g_mime_content_type_is_type (content_type, "text", "*") &&
!g_mime_content_type_is_type (content_type, "text", "html"))
{
GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
show_part_content (part, stream_stdout);
g_object_unref(stream_stdout);
}
else
{
@ -285,9 +285,6 @@ format_part_text (GMimeObject *part, int *part_count)
}
printf ("\fpart}\n");
if (stream_stdout)
g_object_unref(stream_stdout);
}
static void