mirror of https://github.com/djcb/mu.git
* WIP: more attachment handling changes
This commit is contained in:
parent
2980737853
commit
f1bbb3fb96
|
@ -1026,7 +1026,6 @@ mu_msg_gmime_msg_part_infos_foreach (MuMsgGMime *msg,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct _SavePartData {
|
struct _SavePartData {
|
||||||
guint idx, wanted_idx;
|
guint idx, wanted_idx;
|
||||||
const gchar* targetdir;
|
const gchar* targetdir;
|
||||||
|
@ -1037,6 +1036,49 @@ struct _SavePartData {
|
||||||
typedef struct _SavePartData 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
|
static void
|
||||||
part_foreach_save_cb (GMimeObject *parent, GMimeObject *part,
|
part_foreach_save_cb (GMimeObject *parent, GMimeObject *part,
|
||||||
SavePartData *spd)
|
SavePartData *spd)
|
||||||
|
@ -1052,28 +1094,9 @@ part_foreach_save_cb (GMimeObject *parent, GMimeObject *part,
|
||||||
|
|
||||||
filename = g_mime_part_get_filename (GMIME_PART(part));
|
filename = g_mime_part_get_filename (GMIME_PART(part));
|
||||||
if (filename) {
|
if (filename) {
|
||||||
int fd, rv;
|
spd->result = save_part (part, filename,
|
||||||
GMimeDataWrapper *wrapper;
|
spd->targetdir,
|
||||||
GMimeStream *stream;
|
spd->overwrite);
|
||||||
|
|
||||||
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);
|
|
||||||
} else
|
} else
|
||||||
spd->result = FALSE;
|
spd->result = FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,3 +66,5 @@ mu_msg_part_infos_free (GSList *lst)
|
||||||
g_slist_foreach (lst, (GFunc)mu_msg_part_info_destroy, NULL);
|
g_slist_foreach (lst, (GFunc)mu_msg_part_info_destroy, NULL);
|
||||||
g_slist_free (lst);
|
g_slist_free (lst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,8 @@ struct _MuMsgPartInfo {
|
||||||
/* size of the part; or 0 if unknown */
|
/* size of the part; or 0 if unknown */
|
||||||
size_t *size;
|
size_t *size;
|
||||||
|
|
||||||
|
gpointer data; /* opaque data */
|
||||||
|
|
||||||
/* if TRUE, mu_msg_part_info_destroy will free the member vars
|
/* if TRUE, mu_msg_part_info_destroy will free the member vars
|
||||||
* as well*/
|
* as well*/
|
||||||
gboolean own_members;
|
gboolean own_members;
|
||||||
|
|
|
@ -166,7 +166,7 @@ mu_util_str_from_strv (const gchar **params)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
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;
|
int fd;
|
||||||
char *fullpath;
|
char *fullpath;
|
||||||
|
|
|
@ -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
|
* @return a file descriptor, or -1 in case of error. If it's a fily
|
||||||
* system error, 'errno' may have more info.
|
* system error, 'errno' may have more info.
|
||||||
*/
|
*/
|
||||||
int mu_util_create_writeable_file (const char* filename, const char* dir,
|
int mu_util_create_writeable_fd (const char* filename, const char* dir,
|
||||||
gboolean overwrite);
|
gboolean overwrite);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue