* src/widgets/modest-header-view.c:
[modest] / src / maemo / modest-msg-view-window.c
index 7eb70ac..78bf0e5 100644 (file)
 #include <modest-tny-account.h>
 #include <modest-mime-part-view.h>
 #include <modest-isearch-view.h>
+#include <modest-tny-mime-part.h>
 #include <math.h>
 #include <errno.h>
 #include <glib/gstdio.h>
+#include <modest-debug.h>
 
 #define DEFAULT_FOLDER "MyDocs/.documents"
 
@@ -724,8 +726,8 @@ select_next_valid_row (GtkTreeModel *model,
 /* TODO: This should be in _init(), with the parameters as properties. */
 static void
 modest_msg_view_window_construct (ModestMsgViewWindow *self, 
-                           const gchar *modest_account_name,
-                           const gchar *msg_uid)
+                                 const gchar *modest_account_name,
+                                 const gchar *msg_uid)
 {
        GObject *obj = NULL;
        ModestMsgViewWindowPrivate *priv = NULL;
@@ -824,7 +826,6 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self,
        /* Init the clipboard actions dim status */
        modest_msg_view_grab_focus(MODEST_MSG_VIEW (priv->msg_view));
 
-       gtk_widget_show_all (GTK_WIDGET (obj));
        update_window_title (MODEST_MSG_VIEW_WINDOW (obj));
 
 
@@ -845,6 +846,10 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg,
        ModestWindow *main_window = NULL;
        ModestWindowMgr *mgr = NULL;
 
+       MODEST_DEBUG_BLOCK (
+              modest_tny_mime_part_to_string (TNY_MIME_PART (msg), 0);
+       );
+
        mgr = modest_runtime_get_window_mgr ();
        window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr));
        g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL);
@@ -942,6 +947,8 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg,
        update_window_title (window);
        modest_msg_view_window_update_priority (window);
 
+       gtk_widget_show_all (GTK_WIDGET (window));
+
 
        return MODEST_WINDOW(window);
 }
@@ -965,6 +972,8 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg,
        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));
+
        /* Check dimming rules */
        modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj));
        modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (obj));
@@ -1141,10 +1150,10 @@ void modest_msg_view_window_update_model_replaced(
        g_object_unref(priv->header_model);
        priv->header_model = NULL;
        if (priv->row_reference)
-               g_object_unref(priv->row_reference);
+               gtk_tree_row_reference_free (priv->row_reference);
        priv->row_reference = NULL;
        if (priv->next_row_reference)
-               g_object_unref(priv->next_row_reference);
+               gtk_tree_row_reference_free (priv->next_row_reference);
        priv->next_row_reference = NULL;
 
        modest_ui_actions_check_toolbar_dimming_rules(MODEST_WINDOW(window));
@@ -1593,6 +1602,42 @@ modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window)
        return is_first_selected;
 }
 
+typedef struct {
+       TnyHeader *header;
+       GtkTreeRowReference *row_reference;
+} MsgReaderInfo;
+
+static void
+message_reader_performer (gboolean canceled, 
+                         GError *err,
+                         GtkWindow *parent_window, 
+                         TnyAccount *account, 
+                         gpointer user_data)
+{
+       ModestMailOperation *mail_op = NULL;
+       MsgReaderInfo *info;
+
+       info = (MsgReaderInfo *) user_data;
+       if (canceled || err) {
+               goto frees;
+       }
+
+       /* New mail operation */
+       mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
+                                                                modest_ui_actions_get_msgs_full_error_handler, 
+                                                                NULL, NULL);
+                               
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
+       modest_mail_operation_get_msg (mail_op, info->header, view_msg_cb, info->row_reference);
+       g_object_unref (mail_op);
+
+ frees:
+       /* Frees. The row_reference will be freed by the view_msg_cb callback */
+       g_object_unref (info->header);
+       g_slice_free (MsgReaderInfo, info);
+}
+
+
 /**
  * Reads the message whose summary item is @header. It takes care of
  * several things, among others:
@@ -1611,10 +1656,12 @@ message_reader (ModestMsgViewWindow *window,
                TnyHeader *header,
                GtkTreeRowReference *row_reference)
 {
-       ModestMailOperation *mail_op = NULL;
        gboolean already_showing = FALSE;
        ModestWindow *msg_window = NULL;
        ModestWindowMgr *mgr;
+       TnyAccount *account;
+       TnyFolder *folder;
+       MsgReaderInfo *info;
 
        g_return_val_if_fail (row_reference != NULL, FALSE);
 
@@ -1633,7 +1680,6 @@ message_reader (ModestMsgViewWindow *window,
                /* Ask the user if he wants to download the message if
                   we're not online */
                if (!tny_device_is_online (modest_runtime_get_device())) {
-                       TnyFolder *folder = NULL;
                        GtkResponseType response;
 
                        response = modest_platform_run_confirmation_dialog (GTK_WINDOW (window),
@@ -1641,31 +1687,31 @@ message_reader (ModestMsgViewWindow *window,
                        if (response == GTK_RESPONSE_CANCEL)
                                return FALSE;
                
-                       /* Offer the connection dialog if necessary */
                        folder = tny_header_get_folder (header);
-                       if (folder) {
-                               if (!modest_platform_connect_and_wait_if_network_folderstore (NULL, 
-                                                                                             TNY_FOLDER_STORE (folder))) {
-                                       g_object_unref (folder);
-                                       return FALSE;
-                               }
-                               g_object_unref (folder);
-                       }
+                       info = g_slice_new (MsgReaderInfo);
+                       info->header = g_object_ref (header);
+                       info->row_reference = gtk_tree_row_reference_copy (row_reference);
+
+                       /* Offer the connection dialog if necessary */
+                       modest_platform_connect_if_remote_and_perform ((GtkWindow *) window, 
+                                                                      TRUE,
+                                                                      TNY_FOLDER_STORE (folder),
+                                                                      message_reader_performer, 
+                                                                      info);
+                       g_object_unref (folder);
+                       return TRUE;
                }
        }
-
-       /* New mail operation */
-       mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(window),
-                                                                modest_ui_actions_get_msgs_full_error_handler, 
-                                                                NULL, NULL);
-                               
-       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
-       modest_mail_operation_get_msg (mail_op, header, view_msg_cb, row_reference);
-       g_object_unref (mail_op);
-
-       /* Update dimming rules */
-       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
-       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
+       
+       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);
 
        return TRUE;
 }
@@ -1717,8 +1763,8 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
        /* Read the message & show it */
        if (!message_reader (window, priv, header, row_reference)) {
                retval = FALSE;
-               gtk_tree_row_reference_free (row_reference);
        }
+       gtk_tree_row_reference_free (row_reference);
 
        /* Free */
        g_object_unref (header);
@@ -1757,8 +1803,7 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
                                row_reference = gtk_tree_row_reference_new (priv->header_model, path);
                                /* Read the message & show it */
                                retval = message_reader (window, priv, header, row_reference);
-                               if (!retval)
-                                       gtk_tree_row_reference_free (row_reference);
+                               gtk_tree_row_reference_free (row_reference);
                        } else {
                                finished = FALSE;
                        }
@@ -1782,13 +1827,13 @@ view_msg_cb (ModestMailOperation *mail_op,
        ModestMsgViewWindowPrivate *priv = NULL;
        GtkTreeRowReference *row_reference = NULL;
 
+       row_reference = (GtkTreeRowReference *) user_data;
        if (canceled) {
-               g_object_unref (self);
+               gtk_tree_row_reference_free (row_reference);
                return;
        }
        
        /* If there was any error */
-       row_reference = (GtkTreeRowReference *) user_data;
        if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) {
                gtk_tree_row_reference_free (row_reference);                    
                return;
@@ -1808,7 +1853,6 @@ view_msg_cb (ModestMailOperation *mail_op,
                }
                priv->next_row_reference = gtk_tree_row_reference_copy (priv->row_reference);
                select_next_valid_row (priv->header_model, &(priv->next_row_reference), TRUE);
-               gtk_tree_row_reference_free (row_reference);
        }
 
        /* Mark header as read */
@@ -1833,8 +1877,9 @@ view_msg_cb (ModestMailOperation *mail_op,
        g_signal_emit (G_OBJECT (self), signals[MSG_CHANGED_SIGNAL], 
                       0, priv->header_model, priv->row_reference);
 
-       /* Free new references */
+       /* Frees */
        g_object_unref (self);
+       gtk_tree_row_reference_free (row_reference);            
 }
 
 TnyFolderType
@@ -1854,7 +1899,7 @@ modest_msg_view_window_get_folder_type (ModestMsgViewWindow *window)
 
                folder = tny_msg_get_folder (msg);
                if (folder) {
-                       folder_type = tny_folder_get_folder_type (folder);
+                       folder_type = modest_tny_folder_guess_folder_type (folder);
                        g_object_unref (folder);
                }
                g_object_unref (msg);
@@ -2201,6 +2246,14 @@ on_mail_operation_finished (ModestMailOperation *mail_op,
                if (observers_empty (self)) {
                        set_toolbar_mode (self, TOOLBAR_MODE_NORMAL);
                }
+
+               /* Update dimming rules. We have to do this right here
+                  and not in view_msg_cb because at that point the
+                  transfer mode is still enabled so the dimming rule
+                  won't let the user delete the message that has been
+                  readed for example */
+               modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
+               modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
        }
 }
 
@@ -2302,7 +2355,7 @@ modest_msg_view_window_view_attachment (ModestMsgViewWindow *window, TnyMimePart
                return;
        }
 
-       if (!TNY_IS_MSG (mime_part)) {
+       if (!modest_tny_mime_part_is_msg (mime_part)) {
                gchar *filepath = NULL;
                const gchar *att_filename = tny_mime_part_get_filename (mime_part);
                const gchar *content_type;
@@ -2391,7 +2444,7 @@ typedef struct
 {
        GList *pairs;
        GtkWidget *banner;
-       gboolean result;
+       GnomeVFSResult result;
 } SaveMimePartInfo;
 
 static void save_mime_part_info_free (SaveMimePartInfo *info, gboolean with_struct);
@@ -2424,16 +2477,16 @@ idle_save_mime_part_show_result (SaveMimePartInfo *info)
        if (info->pairs != NULL) {
                save_mime_part_to_file (info);
        } else {
-               gboolean result;
-               result = info->result;
-
                /* This is a GDK lock because we are an idle callback and
                 * hildon_banner_show_information is or does Gtk+ code */
 
                gdk_threads_enter (); /* CHECKED */
                save_mime_part_info_free (info, TRUE);
-               if (result) {
+               if (info->result == GNOME_VFS_OK) {
                        hildon_banner_show_information (NULL, NULL, _CS("sfil_ib_saved"));
+               } else if (info->result == GNOME_VFS_ERROR_NO_SPACE) {
+                       hildon_banner_show_information (NULL, NULL, dgettext("ke-recv", 
+                                                                            "cerm_device_memory_full"));
                } else {
                        hildon_banner_show_information (NULL, NULL, _("mail_ib_file_operation_failed"));
                }
@@ -2446,26 +2499,22 @@ idle_save_mime_part_show_result (SaveMimePartInfo *info)
 static gpointer
 save_mime_part_to_file (SaveMimePartInfo *info)
 {
-       GnomeVFSResult result;
        GnomeVFSHandle *handle;
        TnyStream *stream;
        SaveMimePartPair *pair = (SaveMimePartPair *) info->pairs->data;
-       gboolean decode_result = TRUE;
 
-       result = gnome_vfs_create (&handle, pair->filename, GNOME_VFS_OPEN_WRITE, FALSE, 0644);
-       if (result == GNOME_VFS_OK) {
+       info->result = gnome_vfs_create (&handle, pair->filename, GNOME_VFS_OPEN_WRITE, FALSE, 0644);
+       if (info->result == GNOME_VFS_OK) {
                stream = tny_vfs_stream_new (handle);
                if (tny_mime_part_decode_to_stream (pair->part, stream, NULL) < 0) {
-                       decode_result = FALSE;
+                       info->result = GNOME_VFS_ERROR_IO;
                }
                g_object_unref (G_OBJECT (stream));
                g_object_unref (pair->part);
                g_slice_free (SaveMimePartPair, pair);
                info->pairs = g_list_delete_link (info->pairs, info->pairs);
-               info->result = decode_result;
        } else {
                save_mime_part_info_free (info, FALSE);
-               info->result = FALSE;
        }
 
        g_idle_add ((GSourceFunc) idle_save_mime_part_show_result, info);
@@ -2516,7 +2565,6 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m
        GList *files_to_save = NULL;
        GtkWidget *save_dialog = NULL;
        gchar *folder = NULL;
-       gboolean canceled = FALSE;
        const gchar *filename = NULL;
        gchar *save_multiple_str = NULL;
 
@@ -2538,11 +2586,14 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m
                iter = tny_list_create_iterator (mime_parts);
                TnyMimePart *mime_part = (TnyMimePart *) tny_iterator_get_current (iter);
                g_object_unref (iter);
-               if (!TNY_IS_MSG (mime_part) && tny_mime_part_is_attachment (mime_part)) {
+               if (!modest_tny_mime_part_is_msg (mime_part) && 
+                   modest_tny_mime_part_is_attachment_for_modest (mime_part)) {
                        filename = tny_mime_part_get_filename (mime_part);
                } else {
+                       /* TODO: show any error? */
                        g_warning ("Tried to save a non-file attachment");
-                       canceled = TRUE;
+                       g_object_unref (mime_parts);
+                       return;
                }
                g_object_unref (mime_part);
        } else {
@@ -2566,6 +2617,7 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m
        /* if multiple, set multiple string */
        if (save_multiple_str) {
                g_object_set (G_OBJECT (save_dialog), "save-multiple", save_multiple_str, NULL);
+               gtk_window_set_title (GTK_WINDOW (save_dialog), _FM("sfil_ti_save_objects_files"));
        }
                
        /* show dialog */
@@ -2582,7 +2634,7 @@ modest_msg_view_window_save_attachments (ModestMsgViewWindow *window, TnyList *m
                        while (!tny_iterator_is_done (iter)) {
                                TnyMimePart *mime_part = (TnyMimePart *) tny_iterator_get_current (iter);
 
-                               if ((tny_mime_part_is_attachment (mime_part)) && 
+                               if ((modest_tny_mime_part_is_attachment_for_modest (mime_part)) && 
                                    (tny_mime_part_get_filename (mime_part) != NULL)) {
                                        SaveMimePartPair *pair;
                                        
@@ -2683,7 +2735,7 @@ modest_msg_view_window_remove_attachments (ModestMsgViewWindow *window, gboolean
                iter = tny_list_create_iterator (mime_parts);
                part = (TnyMimePart *) tny_iterator_get_current (iter);
                g_object_unref (iter);
-               if (TNY_IS_MSG (part)) {
+               if (modest_tny_mime_part_is_msg (part)) {
                        TnyHeader *header;
                        header = tny_msg_get_header (TNY_MSG (part));
                        filename = tny_header_get_subject (header);