X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fhildon2%2Fmodest-msg-view-window.c;h=bed6ebfd11cee9ec89ed433e14f60fd1467cb703;hb=1e159b0f5c758af83a636751d4ba7b1b25a2c81b;hp=11b49c31d19bb5012f3a74f5e04113ca3b0f7efb;hpb=0199f9f75efb17b1f33c3f07883485de27f12287;p=modest diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index 11b49c3..bed6ebf 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -505,6 +505,10 @@ init_window (ModestMsgViewWindow *obj) modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE); main_vbox = gtk_vbox_new (FALSE, 6); priv->main_scroll = hildon_pannable_area_new (); + g_object_set (G_OBJECT (priv->main_scroll), + "mov-mode", HILDON_MOVEMENT_MODE_BOTH, + "hovershoot-max", 0, + NULL); gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view); gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_scroll, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER(obj), main_vbox); @@ -1946,7 +1950,7 @@ message_reader (ModestMsgViewWindow *window, GtkTreeRowReference *row_reference) { ModestWindowMgr *mgr; - TnyAccount *account; + TnyAccount *account = NULL; MsgReaderInfo *info; /* We set the header from model while we're loading */ @@ -2000,7 +2004,8 @@ message_reader (ModestMsgViewWindow *window, TNY_FOLDER_STORE (folder), message_reader_performer, info); - g_object_unref (folder); + if (folder) + g_object_unref (folder); return TRUE; } } @@ -2008,7 +2013,9 @@ message_reader (ModestMsgViewWindow *window, if (header) { folder = tny_header_get_folder (header); } - account = tny_folder_get_account (folder); + if (folder) + account = tny_folder_get_account (folder); + info = g_slice_new (MsgReaderInfo); info->msg_uid = g_strdup (msg_uid); if (folder) @@ -2025,14 +2032,15 @@ message_reader (ModestMsgViewWindow *window, info->row_reference = NULL; message_reader_performer (FALSE, NULL, (GtkWindow *) window, account, info); - g_object_unref (account); + if (account) + g_object_unref (account); if (folder) g_object_unref (folder); return TRUE; } -gboolean +gboolean modest_msg_view_window_select_next_message (ModestMsgViewWindow *window) { ModestMsgViewWindowPrivate *priv; @@ -2659,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); @@ -2668,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 */ @@ -2778,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); @@ -2799,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); } @@ -2842,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) && @@ -2882,11 +2940,14 @@ save_mime_parts_to_file_with_checks (GtkWindow *parent, for (iter = files; (iter != NULL) && (replaced_files < 2); iter = g_list_next(iter)) { SaveMimePartPair *pair = iter->data; - if (modest_utils_file_exists (pair->filename)) { + gchar *unescaped = g_uri_unescape_string (pair->filename, NULL); + + if (modest_utils_file_exists (unescaped)) { replaced_files++; if (replaced_files == 1) to_replace = iter; } + g_free (unescaped); } if (replaced_files) { gint response; @@ -2919,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, @@ -2928,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; @@ -2995,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); @@ -3002,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)); } @@ -3068,7 +3138,8 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, GTK_FILE_CHOOSER_ACTION_SAVE); /* Get last used folder */ - conf_folder = modest_conf_get_string (modest_runtime_get_conf (), MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH, NULL); + conf_folder = modest_conf_get_string (modest_runtime_get_conf (), + MODEST_CONF_LATEST_SAVE_ATTACHMENT_PATH, NULL); /* File chooser stops working if we select "file:///" as current folder */ if (conf_folder && g_ascii_strcasecmp (root_folder, conf_folder) != 0) { @@ -3080,8 +3151,12 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (save_dialog), conf_folder); } else { gchar *docs_folder; - /* Set the default folder to images folder */ - docs_folder = g_build_filename (g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL); + /* Set the default folder to documents folder */ + docs_folder = (gchar *) g_strdup(g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS)); + if (!docs_folder) { + /* fallback */ + docs_folder = g_build_filename (g_getenv (MYDOCS_ENV), DOCS_FOLDER, NULL); + } gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (save_dialog), docs_folder); g_free (docs_folder); } @@ -3104,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); } @@ -3597,18 +3676,30 @@ void modest_msg_view_window_reload (ModestMsgViewWindow *self) { ModestMsgViewWindowPrivate *priv; - TnyHeader *header; + const gchar *msg_uid; + TnyHeader *header = NULL; + TnyFolder *folder = NULL; g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self)); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); - header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (self)); - if (!message_reader (self, priv, header, NULL, NULL, priv->row_reference)) { - g_warning ("Shouldn't happen, trying to reload a message failed"); - } + header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (self)); + if (!header) + return; + folder = tny_header_get_folder (header); g_object_unref (header); + + if (!folder) + return; + + msg_uid = modest_msg_view_window_get_message_uid (self); + if (msg_uid) + if (!message_reader (self, priv, NULL, msg_uid, folder, priv->row_reference)) + g_warning ("Shouldn't happen, trying to reload a message failed"); + + g_object_unref (folder); } static void