talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 52e13bbc7a9a703335c74fcd71202ef16fa18561
parent ffe5a18e30b56f526f29e42812b2e805797eadae
Author: Andrej Kacian <ticho@claws-mail.org>
Date:   Tue,  5 Mar 2019 22:59:10 +0100

Write procmime_get_part_as_inputstream()

We also change procmime_get_part_as_string() to return
a void* instead of a gchar*, and add an option to not
null-terminate the returned buffer.

Diffstat:
Msrc/procmime.c | 32+++++++++++++++++++++++++++++---
Msrc/procmime.h | 7++++++-
2 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/src/procmime.c b/src/procmime.c @@ -2701,7 +2701,8 @@ gchar *procmime_get_part_file_name(MimeInfo *mimeinfo) return base; } -gchar *procmime_get_part_as_string(MimeInfo *mimeinfo) +void *procmime_get_part_as_string(MimeInfo *mimeinfo, + gboolean null_terminate) { FILE *infp; gchar *data; @@ -2728,7 +2729,8 @@ gchar *procmime_get_part_as_string(MimeInfo *mimeinfo) } length = mimeinfo->length; - data = g_malloc(length + 1); + + data = g_malloc(null_terminate ? length + 1 : length); cm_return_val_if_fail(data != NULL, NULL); readlength = claws_fread(data, length, 1, infp); @@ -2741,8 +2743,32 @@ gchar *procmime_get_part_as_string(MimeInfo *mimeinfo) claws_fclose(infp); - data[length] = '\0'; + if (null_terminate) + data[length] = '\0'; return data; } +/* Returns an open GInputStream. The caller should just + * read mimeinfo->length bytes from it and then release it. */ +GInputStream *procmime_get_part_as_inputstream(MimeInfo *mimeinfo, + GError **error) +{ + cm_return_val_if_fail(mimeinfo != NULL, NULL); + + if (mimeinfo->encoding_type != ENC_BINARY && + !procmime_decode_content(mimeinfo)) + return NULL; + + if (mimeinfo->content == MIMECONTENT_MEM) { + /* NULL for destroy func, since we're not copying + * the data for the stream. */ + return g_memory_input_stream_new_from_data( + mimeinfo->data.mem, + mimeinfo->length, NULL); + } else { + return g_memory_input_stream_new_from_data( + procmime_get_part_as_string(mimeinfo, FALSE), + mimeinfo->length, g_free); + } +} diff --git a/src/procmime.h b/src/procmime.h @@ -24,6 +24,8 @@ #include "claws-features.h" #endif +#include <gio/gio.h> + #include "utils.h" #include "proctypes.h" typedef enum @@ -238,7 +240,10 @@ FILE *procmime_get_binary_content(MimeInfo *mimeinfo); gboolean procmime_scan_text_content(MimeInfo *mimeinfo, gboolean (*scan_callback)(const gchar *str, gpointer cb_data), gpointer cb_data); -gchar *procmime_get_part_as_string(MimeInfo *mimeinfo); +void *procmime_get_part_as_string(MimeInfo *mimeinfo, + gboolean null_terminate); +GInputStream *procmime_get_part_as_inputstream(MimeInfo *mimeinfo, + GError **error); #ifdef __cplusplus }