From: Jose Dapena Paz Date: Wed, 2 Sep 2009 15:02:12 +0000 (+0200) Subject: Merge part-to-stream-in-plugins branch work also into master. X-Git-Tag: 3.90.1~71 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=1e159b0f5c758af83a636751d4ba7b1b25a2c81b Merge part-to-stream-in-plugins branch work also into --- diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index f81ce01..bed6ebf 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -2667,7 +2667,11 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, &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); @@ -2676,10 +2680,28 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, 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 */ @@ -2786,6 +2808,7 @@ typedef struct GList *pairs; GnomeVFSResult result; gchar *uri; + ModestMsgViewWindow *window; } SaveMimePartInfo; static void save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct); @@ -2807,6 +2830,8 @@ 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); } @@ -2850,8 +2875,33 @@ save_mime_part_to_file (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) && @@ -2930,6 +2980,11 @@ save_mime_parts_to_file_with_checks (GtkWindow *parent, } +typedef struct _SaveAttachmentsInfo { + TnyList *attachments_list; + ModestMsgViewWindow *window; +} SaveAttachmentsInfo; + static void save_attachments_response (GtkDialog *dialog, gint arg1, @@ -2939,8 +2994,9 @@ save_attachments_response (GtkDialog *dialog, 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; @@ -3006,6 +3062,7 @@ save_attachments_response (GtkDialog *dialog, 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); @@ -3013,6 +3070,8 @@ save_attachments_response (GtkDialog *dialog, 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)); } @@ -3120,8 +3179,12 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, /* 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); } diff --git a/src/modest-account-protocol.c b/src/modest-account-protocol.c index c527d43..afeaaba 100644 --- a/src/modest-account-protocol.c +++ b/src/modest-account-protocol.c @@ -91,6 +91,19 @@ static void modest_account_protocol_check_support_default (ModestAccountProtocol 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, @@ -211,6 +224,10 @@ modest_account_protocol_class_init (ModestAccountProtocolClass *klass) 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 = @@ -687,6 +704,65 @@ modest_account_protocol_wizard_finished (ModestAccountProtocol *self) 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, diff --git a/src/modest-account-protocol.h b/src/modest-account-protocol.h index e021753..f773f61 100644 --- a/src/modest-account-protocol.h +++ b/src/modest-account-protocol.h @@ -100,10 +100,21 @@ struct _ModestAccountProtocolClass { 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); @@ -482,6 +493,58 @@ void modest_account_protocol_save_remote_draft (ModestAccountProtocol *self, 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