X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fhildon2%2Fmodest-msg-view-window.c;h=01d71570fee022d6beb9f4461bad0ccf2edd392f;hp=c6c39931c4df4c643a6f355ad7d4b9363ea7a10d;hb=3a69262f88128f4dd3c78bbe62abc90f13491ded;hpb=987916446f991f8bcbdc1a2b3694240f6ac1d760 diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index c6c3993..01d7157 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -117,6 +117,7 @@ struct _ModestMsgViewWindowPrivate { GtkWidget *remove_attachment_banner; gchar *msg_uid; + TnyMimePart *other_body; GSList *sighandlers; }; @@ -448,6 +449,7 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) priv->purge_timeout = 0; priv->remove_attachment_banner = NULL; priv->msg_uid = NULL; + priv->other_body = NULL; priv->sighandlers = NULL; @@ -524,22 +526,8 @@ init_window (ModestMsgViewWindow *obj) priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ())); modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE); main_vbox = gtk_vbox_new (FALSE, 6); -#ifdef MODEST_TOOLKIT_HILDON2 priv->main_scroll = hildon_pannable_area_new (); gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view); -#else -#ifdef MODEST_USE_MOZEMBED - priv->main_scroll = priv->msg_view; - gtk_widget_set_size_request (priv->msg_view, -1, 1600); -#else - priv->main_scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view); -#endif - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->main_scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->main_scroll), GTK_SHADOW_NONE); - modest_maemo_set_thumbable_scrollbar (GTK_SCROLLED_WINDOW(priv->main_scroll), TRUE); - -#endif gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_scroll, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER(obj), main_vbox); @@ -624,6 +612,11 @@ modest_msg_view_window_finalize (GObject *obj) call this function before */ modest_msg_view_window_disconnect_signals (MODEST_WINDOW (obj)); + if (priv->other_body != NULL) { + g_object_unref (priv->other_body); + priv->other_body = NULL; + } + if (priv->header_model != NULL) { g_object_unref (priv->header_model); priv->header_model = NULL; @@ -851,7 +844,6 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, ModestMsgViewWindowPrivate *priv = NULL; TnyFolder *header_folder = NULL; ModestHeaderView *header_view = NULL; - ModestWindow *main_window = NULL; ModestWindowMgr *mgr = NULL; MODEST_DEBUG_BLOCK ( @@ -866,28 +858,14 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (window); - /* Remember the message list's TreeModel so we can detect changes + /* Remember the message list's TreeModel so we can detect changes * and change the list selection when necessary: */ - - main_window = modest_window_mgr_get_main_window(mgr, FALSE); /* don't create */ - if (main_window) { - header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget( - MODEST_MAIN_WINDOW(main_window), - MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW)); - } - - if (header_view != NULL){ - header_folder = modest_header_view_get_folder(header_view); - /* This could happen if the header folder was - unseleted before opening this msg window (for - example if the user selects an account in the - folder view of the main window */ - if (header_folder) { - priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX); - priv->header_folder_id = tny_folder_get_id(header_folder); - g_assert(priv->header_folder_id != NULL); - g_object_unref(header_folder); - } + header_folder = modest_header_view_get_folder (header_view); + if (header_folder) { + priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == + TNY_FOLDER_TYPE_OUTBOX); + priv->header_folder_id = tny_folder_get_id (header_folder); + g_object_unref(header_folder); } /* Setup row references and connect signals */ @@ -939,11 +917,11 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, } ModestWindow * -modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, - const gchar *modest_account_name, +modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, + const gchar *modest_account_name, const gchar *mailbox, - const gchar *msg_uid, - GtkTreeRowReference *row_reference) + const gchar *msg_uid, + GtkTreeRowReference *row_reference) { ModestMsgViewWindow *window = NULL; ModestMsgViewWindowPrivate *priv = NULL; @@ -970,9 +948,9 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, example if the user selects an account in the folder view of the main window */ if (header_folder) { - priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX); + priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == + TNY_FOLDER_TYPE_OUTBOX); priv->header_folder_id = tny_folder_get_id(header_folder); - g_assert(priv->header_folder_id != NULL); g_object_unref(header_folder); } } @@ -1010,7 +988,7 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, if (header_view != NULL){ modest_header_view_add_observer(header_view, - MODEST_HEADER_VIEW_OBSERVER(window)); + MODEST_HEADER_VIEW_OBSERVER(window)); } tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), NULL); @@ -1022,6 +1000,7 @@ modest_msg_view_window_new_from_header_view (ModestHeaderView *header_view, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); message_reader (window, priv, header, row_reference); + g_object_unref (header); } gtk_tree_path_free (path); @@ -1068,11 +1047,23 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, return MODEST_WINDOW(window); } +gboolean +modest_msg_view_window_is_other_body (ModestMsgViewWindow *self) +{ + ModestMsgViewWindowPrivate *priv = NULL; + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE); + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + + return (priv->other_body != NULL); +} + ModestWindow * -modest_msg_view_window_new_for_attachment (TnyMsg *msg, - const gchar *modest_account_name, - const gchar *mailbox, - const gchar *msg_uid) +modest_msg_view_window_new_with_other_body (TnyMsg *msg, + TnyMimePart *other_body, + const gchar *modest_account_name, + const gchar *mailbox, + const gchar *msg_uid) { GObject *obj = NULL; ModestMsgViewWindowPrivate *priv; @@ -1085,7 +1076,12 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg, modest_msg_view_window_construct (MODEST_MSG_VIEW_WINDOW (obj), modest_account_name, mailbox, msg_uid); - tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); + if (other_body) { + priv->other_body = g_object_ref (other_body); + modest_msg_view_set_msg_with_other_body (MODEST_MSG_VIEW (priv->msg_view), msg, other_body); + } else { + tny_msg_view_set_msg (TNY_MSG_VIEW (priv->msg_view), msg); + } update_window_title (MODEST_MSG_VIEW_WINDOW (obj)); /* gtk_widget_show_all (GTK_WIDGET (obj)); */ @@ -1098,6 +1094,15 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg, return MODEST_WINDOW(obj); } +ModestWindow * +modest_msg_view_window_new_for_attachment (TnyMsg *msg, + const gchar *modest_account_name, + const gchar *mailbox, + const gchar *msg_uid) +{ + return modest_msg_view_window_new_with_other_body (msg, NULL, modest_account_name, mailbox, msg_uid); +} + static void modest_msg_view_window_on_row_changed (GtkTreeModel *header_model, GtkTreePath *arg1, @@ -1871,14 +1876,14 @@ message_reader (ModestMsgViewWindow *window, g_return_val_if_fail (row_reference != NULL, FALSE); + /* We set the header from model while we're loading */ + tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header); + gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating")); + mgr = modest_runtime_get_window_mgr (); /* Msg download completed */ if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) { - /* We set the header from model while we're loading */ - tny_header_view_set_header (TNY_HEADER_VIEW (priv->msg_view), header); - gtk_window_set_title (GTK_WINDOW (window), _CS("ckdg_pb_updating")); - /* Ask the user if he wants to download the message if we're not online */ if (!tny_device_is_online (modest_runtime_get_device())) { @@ -1906,13 +1911,13 @@ message_reader (ModestMsgViewWindow *window, return TRUE; } } - + folder = tny_header_get_folder (header); account = tny_folder_get_account (folder); info = g_slice_new (MsgReaderInfo); info->header = g_object_ref (header); info->row_reference = gtk_tree_row_reference_copy (row_reference); - + message_reader_performer (FALSE, NULL, (GtkWindow *) window, account, info); g_object_unref (account); g_object_unref (folder); @@ -2435,6 +2440,11 @@ modest_msg_view_window_get_attachments (ModestMsgViewWindow *win) return selected_attachments; } +typedef struct { + ModestMsgViewWindow *self; + gchar *file_path; +} DecodeAsyncHelper; + static void on_decode_to_stream_async_handler (TnyMimePart *mime_part, gboolean cancelled, @@ -2442,7 +2452,11 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part, GError *err, gpointer user_data) { - gchar *filepath = (gchar *) user_data; + DecodeAsyncHelper *helper = (DecodeAsyncHelper *) user_data; + + /* It could happen that the window was closed */ + if (GTK_WIDGET_VISIBLE (helper->self)) + set_progress_hint (helper->self, FALSE); if (cancelled || err) { if (err) { @@ -2454,14 +2468,16 @@ on_decode_to_stream_async_handler (TnyMimePart *mime_part, } /* make the file read-only */ - g_chmod(filepath, 0444); + g_chmod(helper->file_path, 0444); /* Activate the file */ - modest_platform_activate_file (filepath, tny_mime_part_get_content_type (mime_part)); + modest_platform_activate_file (helper->file_path, tny_mime_part_get_content_type (mime_part)); free: /* Frees */ - g_free (filepath); + g_object_unref (helper->self); + g_free (helper->file_path); + g_slice_free (DecodeAsyncHelper, helper); } void @@ -2482,7 +2498,7 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, attachments = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view)); attachment_index = modest_list_index (attachments, (GObject *) mime_part); g_object_unref (attachments); - + if (msg_uid && attachment_index >= 0) { attachment_uid = g_strdup_printf ("%s/%d", msg_uid, attachment_index); } @@ -2513,7 +2529,7 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, if (tny_mime_part_is_purged (mime_part)) goto frees; - if (!modest_tny_mime_part_is_msg (mime_part)) { + if (!modest_tny_mime_part_is_msg (mime_part) && tny_mime_part_get_filename (mime_part)) { gchar *filepath = NULL; const gchar *att_filename = tny_mime_part_get_filename (mime_part); gboolean show_error_banner = FALSE; @@ -2522,10 +2538,19 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, &filepath); if (temp_stream != NULL) { - tny_mime_part_decode_to_stream_async (mime_part, TNY_STREAM (temp_stream), - on_decode_to_stream_async_handler, + DecodeAsyncHelper *helper; + + /* Activate progress hint */ + set_progress_hint (window, TRUE); + + helper = g_slice_new0 (DecodeAsyncHelper); + 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, - g_strdup (filepath)); + 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 */ @@ -2545,6 +2570,42 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, g_free (filepath); if (show_error_banner) modest_platform_information_banner (NULL, NULL, _("mail_ib_file_operation_failed")); + } else if (!modest_tny_mime_part_is_msg (mime_part)) { + ModestWindowMgr *mgr; + ModestWindow *msg_win = NULL; + TnyMsg *current_msg; + gboolean found; + TnyHeader *header; + + current_msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (window)); + mgr = modest_runtime_get_window_mgr (); + header = tny_msg_get_header (TNY_MSG (current_msg)); + found = modest_window_mgr_find_registered_message_uid (mgr, + attachment_uid, + &msg_win); + + if (found) { + g_warning ("window for this body is already being created"); + } else { + + /* it's not found, so create a new window for it */ + modest_window_mgr_register_header (mgr, header, attachment_uid); /* register the uid before building the window */ + gchar *account = g_strdup (modest_window_get_active_account (MODEST_WINDOW (window))); + const gchar *mailbox = modest_window_get_active_mailbox (MODEST_WINDOW (window)); + if (!account) + account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr ()); + + msg_win = modest_msg_view_window_new_with_other_body (TNY_MSG (current_msg), TNY_MIME_PART (mime_part), + account, mailbox, attachment_uid); + + modest_window_set_zoom (MODEST_WINDOW (msg_win), + modest_window_get_zoom (MODEST_WINDOW (window))); + if (modest_window_mgr_register_window (mgr, msg_win, MODEST_WINDOW (window))) + gtk_widget_show_all (GTK_WIDGET (msg_win)); + else + gtk_widget_destroy (GTK_WIDGET (msg_win)); + } + g_object_unref (current_msg); } else { /* message attachment */ TnyHeader *header = NULL; @@ -2697,12 +2758,23 @@ save_mime_parts_to_file_with_checks (SaveMimePartInfo *info) } if (replaced_files) { GtkWidget *confirm_overwrite_dialog; - const gchar *message = (replaced_files == 1) ? - _FM("docm_nc_replace_file") : _FM("docm_nc_replace_multiple"); - confirm_overwrite_dialog = hildon_note_new_confirmation (NULL, message); - if (gtk_dialog_run (GTK_DIALOG (confirm_overwrite_dialog)) != GTK_RESPONSE_OK) { - is_ok = FALSE; + + if (replaced_files == 1) { + SaveMimePartPair *pair = files->data; + const gchar *basename = strrchr (pair->filename, G_DIR_SEPARATOR) + 1; + + gchar *message = g_strdup_printf ("%s\n%s", + _FM("docm_nc_replace_file"), + (basename) ? basename : ""); + confirm_overwrite_dialog = hildon_note_new_confirmation (NULL, message); + g_free (message); + } else { + confirm_overwrite_dialog = hildon_note_new_confirmation (NULL, + _FM("docm_nc_replace_multiple")); } + if (gtk_dialog_run (GTK_DIALOG (confirm_overwrite_dialog)) != GTK_RESPONSE_OK) + is_ok = FALSE; + gtk_widget_destroy (confirm_overwrite_dialog); } @@ -2908,7 +2980,7 @@ void modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean get_all) { ModestMsgViewWindowPrivate *priv; - TnyList *mime_parts = NULL; + TnyList *mime_parts = NULL, *tmp; gchar *confirmation_message; gint response; gint n_attachments; @@ -2922,17 +2994,20 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean * because we don't have selection */ mime_parts = modest_msg_view_get_attachments (MODEST_MSG_VIEW (priv->msg_view)); - - /* Remove already purged messages from mime parts list */ - iter = tny_list_create_iterator (mime_parts); + + /* Remove already purged messages from mime parts list. We use + a copy of the list to remove items in the original one */ + tmp = tny_list_copy (mime_parts); + iter = tny_list_create_iterator (tmp); while (!tny_iterator_is_done (iter)) { TnyMimePart *part = TNY_MIME_PART (tny_iterator_get_current (iter)); - tny_iterator_next (iter); - if (tny_mime_part_is_purged (part)) { + if (tny_mime_part_is_purged (part)) tny_list_remove (mime_parts, (GObject *) part); - } + g_object_unref (part); + tny_iterator_next (iter); } + g_object_unref (tmp); g_object_unref (iter); if (!modest_maemo_utils_select_attachments (GTK_WINDOW (window), mime_parts, TRUE) || @@ -2977,7 +3052,7 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean } priv->purge_timeout = g_timeout_add (2000, show_remove_attachment_information, window); - + iter = tny_list_create_iterator (mime_parts); while (!tny_iterator_is_done (iter)) { TnyMimePart *part; @@ -3007,8 +3082,6 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean g_object_unref (priv->remove_attachment_banner); priv->remove_attachment_banner = NULL; } - - } @@ -3029,7 +3102,15 @@ update_window_title (ModestMsgViewWindow *window) msg = tny_msg_view_get_msg (TNY_MSG_VIEW (priv->msg_view)); - if (msg != NULL) { + if (priv->other_body) { + gchar *description; + + description = modest_tny_mime_part_get_header_value (priv->other_body, "Content-Description"); + if (description) { + g_strstrip (description); + subject = description; + } + } else if (msg != NULL) { header = tny_msg_get_header (msg); subject = tny_header_dup_subject (header); g_object_unref (header); @@ -3236,6 +3317,13 @@ setup_menu (ModestMsgViewWindow *self) modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_me_viewer_addtocontacts"), NULL, APP_MENU_CALLBACK (modest_ui_actions_add_to_contacts), MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_add_to_contacts)); + + modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mail_bd_external_images"), NULL, + APP_MENU_CALLBACK (modest_ui_actions_on_fetch_images), + MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_fetch_images)); + modest_hildon2_window_add_to_menu (MODEST_HILDON2_WINDOW (self), _("mcen_ti_message_properties"), NULL, + APP_MENU_CALLBACK (modest_ui_actions_on_details), + MODEST_DIMMING_CALLBACK (modest_ui_dimming_rules_on_details)); } void @@ -3319,3 +3407,41 @@ _modest_msg_view_window_map_event (GtkWidget *widget, return FALSE; } + +void +modest_msg_view_window_fetch_images (ModestMsgViewWindow *self) +{ + ModestMsgViewWindowPrivate *priv; + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + + modest_msg_view_request_fetch_images (MODEST_MSG_VIEW (priv->msg_view)); +} + +gboolean +modest_msg_view_window_has_blocked_external_images (ModestMsgViewWindow *self) +{ + ModestMsgViewWindowPrivate *priv; + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (self); + + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (self), FALSE); + + return modest_msg_view_has_blocked_external_images (MODEST_MSG_VIEW (priv->msg_view)); +} + +void +modest_msg_view_window_reload (ModestMsgViewWindow *self) +{ + ModestMsgViewWindowPrivate *priv; + TnyHeader *header; + + 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, priv->row_reference)) { + g_warning ("Shouldn't happen, trying to reload a message failed"); + } + + g_object_unref (header); +}