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:
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
}