&filepath);
if (temp_stream != NULL) {
+ ModestAccountMgr *mgr;
DecodeAsyncHelper *helper;
+ gboolean decode_in_provider;
+ ModestProtocol *protocol;
+ const gchar *account;
/* Activate progress hint */
set_progress_hint (window, TRUE);
helper->self = g_object_ref (window);
helper->file_path = g_strdup (filepath);
- tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream),
- on_decode_to_stream_async_handler,
- NULL,
- helper);
+ decode_in_provider = FALSE;
+ mgr = modest_runtime_get_account_mgr ();
+ account = modest_window_get_active_account (MODEST_WINDOW (window));
+ if (modest_account_mgr_account_is_multimailbox (mgr, account, &protocol)) {
+ if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+ decode_in_provider =
+ modest_account_protocol_decode_part_to_stream_async (
+ MODEST_ACCOUNT_PROTOCOL (protocol),
+ mime_part,
+ NULL,
+ TNY_STREAM (temp_stream),
+ on_decode_to_stream_async_handler,
+ NULL,
+ helper);
+ }
+ }
+
+ if (!decode_in_provider)
+ tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream),
+ on_decode_to_stream_async_handler,
+ NULL,
+ helper);
g_object_unref (temp_stream);
/* NOTE: files in the temporary area will be automatically
* cleaned after some time if they are no longer in use */
GList *pairs;
GnomeVFSResult result;
gchar *uri;
+ ModestMsgViewWindow *window;
} SaveMimePartInfo;
static void save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct);
g_list_free (info->pairs);
info->pairs = NULL;
g_free (info->uri);
+ g_object_unref (info->window);
+ info->window = NULL;
if (with_struct) {
g_slice_free (SaveMimePartInfo, info);
}
info->result = gnome_vfs_create (&handle, pair->filename, GNOME_VFS_OPEN_WRITE, FALSE, 0644);
if (info->result == GNOME_VFS_OK) {
GError *error = NULL;
+ gboolean decode_in_provider;
+ gssize written;
+ ModestAccountMgr *mgr;
+ const gchar *account;
+ ModestProtocol *protocol = NULL;
+
stream = tny_vfs_stream_new (handle);
- if (tny_mime_part_decode_to_stream (pair->part, stream, &error) < 0) {
+
+ decode_in_provider = FALSE;
+ mgr = modest_runtime_get_account_mgr ();
+ account = modest_window_get_active_account (MODEST_WINDOW (info->window));
+ if (modest_account_mgr_account_is_multimailbox (mgr, account, &protocol)) {
+ if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+ decode_in_provider =
+ modest_account_protocol_decode_part_to_stream (
+ MODEST_ACCOUNT_PROTOCOL (protocol),
+ pair->part,
+ pair->filename,
+ stream,
+ &written,
+ &error);
+ }
+ }
+ if (!decode_in_provider)
+ written = tny_mime_part_decode_to_stream (pair->part, stream, &error);
+
+ if (written < 0) {
g_warning ("modest: could not save attachment %s: %d (%s)\n", pair->filename, error?error->code:-1, error?error->message:"Unknown error");
if ((error->domain == TNY_ERROR_DOMAIN) &&
}
+typedef struct _SaveAttachmentsInfo {
+ TnyList *attachments_list;
+ ModestMsgViewWindow *window;
+} SaveAttachmentsInfo;
+
static void
save_attachments_response (GtkDialog *dialog,
gint arg1,
gchar *chooser_uri;
GList *files_to_save = NULL;
gchar *current_folder;
+ SaveAttachmentsInfo *sa_info = (SaveAttachmentsInfo *) user_data;
- mime_parts = TNY_LIST (user_data);
+ mime_parts = TNY_LIST (sa_info->attachments_list);
if (arg1 != GTK_RESPONSE_OK)
goto end;
info->pairs = files_to_save;
info->result = TRUE;
info->uri = g_strdup (chooser_uri);
+ info->window = g_object_ref (sa_info->window);
save_mime_parts_to_file_with_checks ((GtkWindow *) dialog, info);
}
g_free (chooser_uri);
end:
/* Free and close the dialog */
g_object_unref (mime_parts);
+ g_object_unref (sa_info->window);
+ g_slice_free (SaveAttachmentsInfo, sa_info);
gtk_widget_destroy (GTK_WIDGET (dialog));
}
/* We must run this asynchronously, because the hildon dialog
performs a gtk_dialog_run by itself which leads to gdk
deadlocks */
+ SaveAttachmentsInfo *sa_info;
+ sa_info = g_slice_new (SaveAttachmentsInfo);
+ sa_info->attachments_list = mime_parts;
+ sa_info->window = g_object_ref (window);
g_signal_connect (save_dialog, "response",
- G_CALLBACK (save_attachments_response), mime_parts);
+ G_CALLBACK (save_attachments_response), sa_info);
gtk_widget_show_all (save_dialog);
}
gpointer userdata);
static void modest_account_protocol_cancel_check_support_default (ModestAccountProtocol *self);
static void modest_account_protocol_wizard_finished_default (ModestAccountProtocol *self);
+static gboolean modest_account_protocol_decode_part_to_stream_default (ModestAccountProtocol *protocol,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ gssize *written,
+ GError **error);
+static gboolean modest_account_protocol_decode_part_to_stream_async_default (ModestAccountProtocol *protocol,
+ TnyMimePart *self,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ TnyMimePartCallback callback,
+ TnyStatusCallback status_callback,
+ gpointer user_data);
static gboolean modest_account_protocol_is_supported_default (ModestAccountProtocol *self);
static gchar *modest_account_protocol_get_from_default (ModestAccountProtocol *self,
const gchar *account_id,
modest_account_protocol_cancel_check_support_default;
account_class->wizard_finished =
modest_account_protocol_wizard_finished_default;
+ account_class->decode_part_to_stream =
+ modest_account_protocol_decode_part_to_stream_default;
+ account_class->decode_part_to_stream_async =
+ modest_account_protocol_decode_part_to_stream_async_default;
account_class->get_from =
modest_account_protocol_get_from_default;
account_class->get_from_list =
MODEST_ACCOUNT_PROTOCOL_GET_CLASS (self)->wizard_finished (self);
}
+static gboolean
+modest_account_protocol_decode_part_to_stream_default (ModestAccountProtocol *self,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ gssize *written,
+ GError **error)
+{
+ /* By default account protocols do not handle themselves the transfer */
+ return FALSE;
+}
+
+gboolean
+modest_account_protocol_decode_part_to_stream (ModestAccountProtocol *self,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ gssize *written,
+ GError **error)
+{
+ return MODEST_ACCOUNT_PROTOCOL_GET_CLASS (self)->decode_part_to_stream (self,
+ part,
+ stream_uri,
+ stream,
+ written,
+ error);
+}
+
+static gboolean
+modest_account_protocol_decode_part_to_stream_async_default (ModestAccountProtocol *self,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ TnyMimePartCallback callback,
+ TnyStatusCallback status_callback,
+ gpointer user_data)
+{
+ /* By default account protocols do not handle themselves the transfer */
+ return FALSE;
+}
+
+gboolean
+modest_account_protocol_decode_part_to_stream_async (ModestAccountProtocol *self,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ TnyMimePartCallback callback,
+ TnyStatusCallback status_callback,
+ gpointer user_data)
+{
+ return MODEST_ACCOUNT_PROTOCOL_GET_CLASS (self)->decode_part_to_stream_async (self,
+ part,
+ stream_uri,
+ stream,
+ callback,
+ status_callback,
+ user_data);
+}
+
gchar *
modest_account_protocol_get_from (ModestAccountProtocol *self,
const gchar *account_id,
gpointer userdata);
void (*cancel_check_support) (ModestAccountProtocol *self);
void (*wizard_finished) (ModestAccountProtocol *self);
+ gboolean (*decode_part_to_stream) (ModestAccountProtocol *protocol,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ gssize *written,
+ GError **error);
+ gboolean (*decode_part_to_stream_async) (ModestAccountProtocol *protocol,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ TnyMimePartCallback callback,
+ TnyStatusCallback status_callback,
+ gpointer user_data);
/* Padding for future expansions */
- void (*_reserved6) (void);
- void (*_reserved7) (void);
void (*_reserved8) (void);
void (*_reserved9) (void);
void (*_reserved10) (void);
ModestAccountProtocolSaveRemoteDraftCallback callback,
gpointer userdata);
+/**
+ * modest_account_protocol_decode_part_to_stream:
+ * @self: a #ModestAccountProtocol
+ * @part: a #TnyMimePart
+ * @stream_uri: a string
+ * @stream: a #TnyStream
+ * @written: a #gssize pointer, with the number of bytes written
+ * @error: a #GError
+ *
+ * This virtual method delegates on the account protocol to decode @part
+ * into @stream. It just allows the provider to decode it as it needs
+ * (i.e. when the original message has a fake attachment, and provider
+ * can return the real attachment).
+ *
+ * The @stream_uri parameter tells the uri of the resource @stream is
+ * wrapping (if known).
+ *
+ * Returns: %TRUE if @protocol does the decode operation, %FALSE if modest
+ * should do it.
+ */
+gboolean
+modest_account_protocol_decode_part_to_stream (ModestAccountProtocol *protocol,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ gssize *written,
+ GError **error);
+
+/**
+ * modest_account_protocol_decode_part_to_stream_async:
+ * @self: a #ModestAccountProtocol
+ * @part: a #TnyMimePart
+ * @stream_uri: a string
+ * @stream: a #TnyStream
+ *
+ * This virtual method delegates on the account protocol to decode @part
+ * into @stream, but asynchronously.
+ *
+ * The @stream_uri parameter tells the uri of the resource @stream is
+ * wrapping (if known).
+ *
+ * Returns: %TRUE if @protocol does the decode operation (then we shouldn't expect
+ * callback to happen from this call, %FALSE if modest should do it.
+ */
+gboolean modest_account_protocol_decode_part_to_stream_async (ModestAccountProtocol *self,
+ TnyMimePart *part,
+ const gchar *stream_uri,
+ TnyStream *stream,
+ TnyMimePartCallback callback,
+ TnyStatusCallback status_callback,
+ gpointer user_data);
+
G_END_DECLS