aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/em-utils.c64
-rw-r--r--mail/em-utils.h2
-rw-r--r--mail/mail-ops.c107
-rw-r--r--mail/mail-ops.h4
-rw-r--r--plugins/itip-formatter/itip-formatter.c113
5 files changed, 109 insertions, 181 deletions
diff --git a/mail/em-utils.c b/mail/em-utils.c
index c7b7020b4b..971d74f892 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -84,8 +84,6 @@ extern const gchar *shell_builtin_backend;
/* Used in em_util_ask_open_many() */
#define TOO_MANY 10
-static void emu_save_part_done (CamelMimePart *part, gchar *name, gint done, gpointer data);
-
#define d(x)
gboolean
@@ -943,68 +941,6 @@ em_utils_selection_get_urilist (GtkSelectionData *selection_data,
g_strfreev (uris);
}
-static void
-emu_save_part_done (CamelMimePart *part, gchar *name, gint done, gpointer data)
-{
- ((gint *)data)[0] = done;
-}
-
-/**
- * em_utils_temp_save_part:
- * @parent:
- * @part:
- * @mode: readonly or not.
- *
- * Save a part's content to a temporary file, and return the
- * filename.
- *
- * Return value: NULL if anything failed.
- **/
-gchar *
-em_utils_temp_save_part (GtkWidget *parent, CamelMimePart *part, gboolean mode)
-{
- const gchar *filename;
- gchar *tmpdir, *path, *utf8_mfilename = NULL, *mfilename = NULL;
- gint done;
- GtkWidget *w;
-
- tmpdir = e_mkdtemp("evolution-tmp-XXXXXX");
- if (tmpdir == NULL) {
- w = e_alert_dialog_new_for_args ((GtkWindow *)parent, "mail:no-create-tmp-path", g_strerror(errno), NULL);
- em_utils_show_error_silent (w);
- return NULL;
- }
-
- filename = camel_mime_part_get_filename (part);
- if (filename == NULL) {
- /* This is the default filename used for temporary file creation */
- filename = _("Unknown");
- } else {
- utf8_mfilename = g_strdup (filename);
- e_filename_make_safe (utf8_mfilename);
- mfilename = g_filename_from_utf8 ((const gchar *) utf8_mfilename, -1, NULL, NULL, NULL);
- g_free (utf8_mfilename);
- filename = (const gchar *) mfilename;
- }
-
- path = g_build_filename (tmpdir, filename, NULL);
- g_free (tmpdir);
- g_free (mfilename);
-
- /* FIXME: This doesn't handle default charsets */
- if (mode)
- mail_msg_wait (mail_save_part (part, path, emu_save_part_done, &done, TRUE));
- else
- mail_msg_wait (mail_save_part (part, path, emu_save_part_done, &done, FALSE));
- if (!done) {
- /* mail_save_part should popup an error box automagically */
- g_free (path);
- path = NULL;
- }
-
- return path;
-}
-
/** em_utils_folder_is_templates:
* @folder: folder
* @uri: uri for this folder, if known
diff --git a/mail/em-utils.h b/mail/em-utils.h
index 0e9ef9f41a..36318ffdf4 100644
--- a/mail/em-utils.h
+++ b/mail/em-utils.h
@@ -61,8 +61,6 @@ void em_utils_selection_get_uidlist (GtkSelectionData *data, CamelFolder *dest,
void em_utils_selection_set_urilist (GtkSelectionData *data, CamelFolder *folder, GPtrArray *uids);
void em_utils_selection_get_urilist (GtkSelectionData *data, CamelFolder *folder);
-gchar *em_utils_temp_save_part (GtkWidget *parent, CamelMimePart *part, gboolean mode);
-
gboolean em_utils_folder_is_drafts (CamelFolder *folder, const gchar *uri);
gboolean em_utils_folder_is_templates (CamelFolder *folder, const gchar *uri);
gboolean em_utils_folder_is_sent (CamelFolder *folder, const gchar *uri);
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index 1146f8d126..4fd6ab207e 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -2303,113 +2303,6 @@ mail_save_messages (CamelFolder *folder, GPtrArray *uids, const gchar *path,
return id;
}
-/* ** SAVE PART ******************************************************* */
-
-struct _save_part_msg {
- MailMsg base;
-
- CamelMimePart *part;
- gchar *path;
- void (*done)(CamelMimePart *part, gchar *path, gint saved, gpointer data);
- gpointer data;
- gboolean readonly;
-};
-
-static gchar *
-save_part_desc (struct _save_part_msg *m)
-{
- return g_strdup(_("Saving attachment"));
-}
-
-static void
-save_part_exec (struct _save_part_msg *m)
-{
- CamelDataWrapper *content;
- CamelStream *stream;
- gchar *path;
-
- if (strstr (m->path, "://"))
- path = m->path;
- else
- path = g_filename_to_uri (m->path, NULL, NULL);
-
- if (!m->readonly) {
- if (!(stream = camel_stream_vfs_new_with_uri (path, CAMEL_STREAM_VFS_CREATE))) {
- g_set_error (
- &m->base.error, G_FILE_ERROR,
- g_file_error_from_errno (errno),
- _("Cannot create output file: %s:\n %s"),
- path, g_strerror (errno));
- if (path != m->path)
- g_free (path);
- return;
- }
- } else if (!(stream = camel_stream_vfs_new_with_uri (path, CAMEL_STREAM_VFS_CREATE))) {
- g_set_error (
- &m->base.error, G_FILE_ERROR,
- g_file_error_from_errno (errno),
- _("Cannot create output file: %s:\n %s"),
- path, g_strerror (errno));
- if (path != m->path)
- g_free (path);
- return;
- }
-
- if (path != m->path)
- g_free (path);
-
- content = camel_medium_get_content (CAMEL_MEDIUM (m->part));
-
- if (camel_data_wrapper_decode_to_stream_sync (
- content, stream, m->base.cancellable, &m->base.error) == -1
- || camel_stream_flush (stream, m->base.cancellable, &m->base.error) == -1)
- g_prefix_error (&m->base.error, _("Could not write data: "));
-
- g_object_unref (stream);
-}
-
-static void
-save_part_done (struct _save_part_msg *m)
-{
- if (m->done)
- m->done (m->part, m->path, m->base.error == NULL, m->data);
-}
-
-static void
-save_part_free (struct _save_part_msg *m)
-{
- g_object_unref (m->part);
- g_free (m->path);
-}
-
-static MailMsgInfo save_part_info = {
- sizeof (struct _save_part_msg),
- (MailMsgDescFunc) save_part_desc,
- (MailMsgExecFunc) save_part_exec,
- (MailMsgDoneFunc) save_part_done,
- (MailMsgFreeFunc) save_part_free
-};
-
-gint
-mail_save_part (CamelMimePart *part, const gchar *path,
- void (*done)(CamelMimePart *part, gchar *path, gint saved, gpointer data), gpointer data, gboolean readonly)
-{
- struct _save_part_msg *m;
- gint id;
- m = mail_msg_new (&save_part_info);
- m->part = part;
- g_object_ref (part);
- m->path = g_strdup (path);
- m->data = data;
- m->done = done;
- m->readonly = readonly;
-
- id = m->base.seq;
- mail_msg_unordered_push (m);
-
- return id;
-}
-
/* ** PREPARE OFFLINE ***************************************************** */
struct _prep_offline_msg {
diff --git a/mail/mail-ops.h b/mail/mail-ops.h
index a0af5ff097..4bea1b03df 100644
--- a/mail/mail-ops.h
+++ b/mail/mail-ops.h
@@ -120,10 +120,6 @@ gint mail_save_messages (CamelFolder *folder, GPtrArray *uids, const gchar *path
void (*done) (CamelFolder *folder, GPtrArray *uids, gchar *path, gpointer data),
gpointer data);
-gint mail_save_part (CamelMimePart *part, const gchar *path,
- void (*done)(CamelMimePart *part, gchar *path, gint saved, gpointer data),
- gpointer data, gboolean readonly);
-
/* yeah so this is messy, but it does a lot, maybe i can consolidate all user_data's to be the one */
void mail_send_queue (CamelFolder *queue,
const gchar *destination,
diff --git a/plugins/itip-formatter/itip-formatter.c b/plugins/itip-formatter/itip-formatter.c
index 2a71ce3707..2c95876bba 100644
--- a/plugins/itip-formatter/itip-formatter.c
+++ b/plugins/itip-formatter/itip-formatter.c
@@ -42,6 +42,7 @@
#include <mail/mail-mt.h>
#include <libedataserver/e-account-list.h>
#include <e-util/e-alert-dialog.h>
+#include <e-util/e-mktemp.h>
#include <calendar/gui/calendar-config.h>
#include <calendar/gui/itip-utils.h>
#include <calendar/common/authentication.h>
@@ -1009,6 +1010,108 @@ message_foreach_part (CamelMimePart *part, GSList **part_list)
}
}
+static void
+attachment_load_finished (EAttachment *attachment,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ struct {
+ GFile *file;
+ gboolean done;
+ } *status = user_data;
+
+ /* Should be no need to check for error here. */
+ e_attachment_load_finish (attachment, result, NULL);
+
+ status->done = TRUE;
+}
+
+static void
+attachment_save_finished (EAttachment *attachment,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GError *error = NULL;
+
+ struct {
+ GFile *file;
+ gboolean done;
+ } *status = user_data;
+
+ status->file = e_attachment_save_finish (attachment, result, &error);
+ status->done = TRUE;
+
+ /* XXX Error handling needs improvement. */
+ if (error != NULL) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
+}
+
+static gchar *
+get_uri_for_part (CamelMimePart *mime_part)
+{
+ EAttachment *attachment;
+ GFile *temp_directory;
+ gchar *template;
+ gchar *path;
+
+ struct {
+ GFile *file;
+ gboolean done;
+ } status;
+
+ /* XXX Error handling leaves much to be desired. */
+
+ template = g_strdup_printf (PACKAGE "-%s-XXXXXX", g_get_user_name ());
+ path = e_mkdtemp (template);
+ g_free (template);
+
+ if (path == NULL)
+ return NULL;
+
+ temp_directory = g_file_new_for_path (path);
+ g_free (path);
+
+ attachment = e_attachment_new ();
+ e_attachment_set_mime_part (attachment, mime_part);
+
+ status.done = FALSE;
+
+ e_attachment_load_async (
+ attachment, (GAsyncReadyCallback)
+ attachment_load_finished, &status);
+
+ /* Loading should be instantaneous since we already have
+ * the full content, but we still have to crank the main
+ * loop until the callback gets triggered. */
+ while (!status.done)
+ gtk_main_iteration ();
+
+ status.file = NULL;
+ status.done = FALSE;
+
+ e_attachment_save_async (
+ attachment, temp_directory, (GAsyncReadyCallback)
+ attachment_save_finished, &status);
+
+ /* We can't return until we have results, so crank
+ * the main loop until the callback gets triggered. */
+ while (!status.done)
+ gtk_main_iteration ();
+
+ if (status.file != NULL) {
+ path = g_file_get_path (status.file);
+ g_object_unref (status.file);
+ } else
+ path = NULL;
+
+ g_object_unref (attachment);
+ g_object_unref (temp_directory);
+
+ return path;
+}
+
static gboolean
update_item (struct _itip_puri *pitip, ItipViewResponse response)
{
@@ -1116,8 +1219,9 @@ update_item (struct _itip_puri *pitip, ItipViewResponse response)
if (part == (CamelMimePart *) msg || part == pitip->part)
continue;
- new_uri = em_utils_temp_save_part (NULL, part, FALSE);
- new_attachments = g_slist_append (new_attachments, new_uri);
+ new_uri = get_uri_for_part (part);
+ if (new_uri != NULL)
+ new_attachments = g_slist_append (new_attachments, new_uri);
}
g_slist_free (parts);
@@ -1125,8 +1229,9 @@ update_item (struct _itip_puri *pitip, ItipViewResponse response)
} else if (!g_ascii_strncasecmp (uri, "cid:", 4)) {
part = camel_mime_message_get_part_by_content_id (msg, uri + 4);
if (part) {
- new_uri = em_utils_temp_save_part (NULL, part, FALSE);
- new_attachments = g_slist_append (new_attachments, new_uri);
+ new_uri = get_uri_for_part (part);
+ if (new_uri != NULL)
+ new_attachments = g_slist_append (new_attachments, new_uri);
}
} else {