diff --git a/src/mu-msg-gmime.c b/src/mu-msg-gmime.c index ac7d3e96..61312747 100644 --- a/src/mu-msg-gmime.c +++ b/src/mu-msg-gmime.c @@ -1026,7 +1026,6 @@ mu_msg_gmime_msg_part_infos_foreach (MuMsgGMime *msg, } - struct _SavePartData { guint idx, wanted_idx; const gchar* targetdir; @@ -1037,6 +1036,49 @@ struct _SavePartData { typedef struct _SavePartData SavePartData; +static gboolean +save_part (GMimeObject *part, const char *filename, + const char *targetdir, gboolean overwrite) +{ + int fd, rv; + GMimeDataWrapper *wrapper; + GMimeStream *stream; + + rv = TRUE; + fd = mu_util_create_writeable_fd (filename, targetdir, + overwrite); + if (fd == -1) { + g_warning ("error saving file %s%s %s", + filename, errno != 0 ? ":" : "", + errno != 0 ? strerror(errno) : ""); + return FALSE; + } + + stream = g_mime_stream_fs_new (fd); + if (!stream) { + g_warning ("%s: failed to create stream", __FUNCTION__); + close (fd); + return FALSE; + } + + g_mime_stream_fs_set_owner (GMIME_STREAM_FS(stream), + TRUE); /* GMimeStream will close fd */ + + wrapper = g_mime_part_get_content_object (GMIME_PART(part)); + if (!wrapper) { + g_object_unref (G_OBJECT(stream)); + g_warning ("%s: failed to create wrapper", __FUNCTION__); + return FALSE; + } + + rv = g_mime_data_wrapper_write_to_stream (wrapper, stream); + g_object_unref (G_OBJECT(rv)); + + return rv == -1 ? FALSE : TRUE; +} + + + static void part_foreach_save_cb (GMimeObject *parent, GMimeObject *part, SavePartData *spd) @@ -1052,28 +1094,9 @@ part_foreach_save_cb (GMimeObject *parent, GMimeObject *part, filename = g_mime_part_get_filename (GMIME_PART(part)); if (filename) { - int fd, rv; - GMimeDataWrapper *wrapper; - GMimeStream *stream; - - fd = mu_util_create_writeable_file (filename, spd->targetdir, - spd->overwrite); - if (fd == -1) { - g_warning ("error saving file %s", filename); - spd->result = FALSE; - return; - } - stream = g_mime_stream_fs_new (fd); - g_mime_stream_fs_set_owner (GMIME_STREAM_FS(stream), - TRUE); /* GMimeStream will close fd */ - - wrapper = g_mime_part_get_content_object (GMIME_PART(part)); - rv = g_mime_data_wrapper_write_to_stream (wrapper, stream); - - g_object_unref (G_OBJECT(stream)); - //g_object_unref (G_OBJECT(wrapper)); - - spd->result = (rv != -1); + spd->result = save_part (part, filename, + spd->targetdir, + spd->overwrite); } else spd->result = FALSE; } diff --git a/src/mu-msg-part-info.c b/src/mu-msg-part-info.c index da19a3c4..88a938ca 100644 --- a/src/mu-msg-part-info.c +++ b/src/mu-msg-part-info.c @@ -66,3 +66,5 @@ mu_msg_part_infos_free (GSList *lst) g_slist_foreach (lst, (GFunc)mu_msg_part_info_destroy, NULL); g_slist_free (lst); } + + diff --git a/src/mu-msg-part-info.h b/src/mu-msg-part-info.h index b0239e29..92055023 100644 --- a/src/mu-msg-part-info.h +++ b/src/mu-msg-part-info.h @@ -47,6 +47,8 @@ struct _MuMsgPartInfo { /* size of the part; or 0 if unknown */ size_t *size; + gpointer data; /* opaque data */ + /* if TRUE, mu_msg_part_info_destroy will free the member vars * as well*/ gboolean own_members; diff --git a/src/mu-util.c b/src/mu-util.c index 30862095..33e7cd52 100644 --- a/src/mu-util.c +++ b/src/mu-util.c @@ -166,7 +166,7 @@ mu_util_str_from_strv (const gchar **params) } int -mu_util_create_writeable_file (const char* filename, const char* dir, gboolean overwrite) +mu_util_create_writeable_fd (const char* filename, const char* dir, gboolean overwrite) { int fd; char *fullpath; diff --git a/src/mu-util.h b/src/mu-util.h index 62ed2f9f..5528cd2a 100644 --- a/src/mu-util.h +++ b/src/mu-util.h @@ -82,8 +82,8 @@ gboolean mu_util_check_dir (const gchar* path, gboolean readable, * @return a file descriptor, or -1 in case of error. If it's a fily * system error, 'errno' may have more info. */ -int mu_util_create_writeable_file (const char* filename, const char* dir, - gboolean overwrite); +int mu_util_create_writeable_fd (const char* filename, const char* dir, + gboolean overwrite); /**