* Fixes NB#85964, do not crash when opening Drafts in memory full condition
[modest] / src / modest-ui-actions.c
index ecae79a..f460812 100644 (file)
@@ -102,6 +102,7 @@ typedef struct _ReplyForwardHelper {
        ReplyForwardAction action;
        gchar *account_name;
        GtkWidget *parent_window;
+       TnyHeader *header;
 } ReplyForwardHelper;
 
 typedef struct _MoveToHelper {
@@ -526,7 +527,7 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
                        if (prev_row_reference != NULL) 
                                gtk_tree_row_reference_free (prev_row_reference);
                        if (prev_path != NULL) 
-                               gtk_tree_path_free (prev_path);                         
+                               gtk_tree_path_free (prev_path);
                }
                
                /* Update toolbar dimming state */
@@ -648,7 +649,6 @@ modest_ui_actions_on_accounts (GtkAction *action,
        } else {
                /* Show the list of accounts */
                GtkWindow *account_win = GTK_WINDOW (modest_account_view_window_new ());
-               gtk_window_set_transient_for (account_win, GTK_WINDOW (win));
                
                /* The accounts dialog must be modal */
                modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), account_win);
@@ -656,18 +656,6 @@ modest_ui_actions_on_accounts (GtkAction *action,
        }
 }
 
-#ifdef MODEST_PLATFORM_MAEMO
-static void
-on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data)
-{
-       /* Save any changes. */
-       modest_connection_specific_smtp_window_save_server_accounts (
-                       MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (window));
-       gtk_widget_destroy (GTK_WIDGET (window));
-}
-#endif
-
-
 void
 modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
 {
@@ -683,14 +671,10 @@ modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
                MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (specific_window), 
                modest_runtime_get_account_mgr());
 
-       /* Show the window: */  
-       gtk_window_set_transient_for (GTK_WINDOW (specific_window), GTK_WINDOW (win));
-       gtk_window_set_modal (GTK_WINDOW (specific_window), TRUE);
+       /* Show the window: */
+       modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), 
+                                    GTK_WINDOW (specific_window));
        gtk_widget_show (specific_window);
-    
-       /* Save changes when the window is hidden: */
-       g_signal_connect (specific_window, "hide", 
-               G_CALLBACK (on_smtp_servers_window_hide), win);
 #endif /* MODEST_PLATFORM_MAEMO */
 }
 
@@ -718,7 +702,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        /* we check for low-mem; in that case, show a warning, and don't allow
         * composing a message with attachments
         */
-       if (attachments && modest_platform_check_memory_low (win))
+       if (attachments && modest_platform_check_memory_low (win, TRUE))
                goto cleanup;
 
        account_name = modest_account_mgr_get_default_account(mgr);
@@ -817,6 +801,18 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
        /* If there is no message or the operation was not successful */
        status = modest_mail_operation_get_status (mail_op);
        if (!msg || status != MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
+               const GError *error;
+
+               /* If it's a memory low issue, then show a banner */
+               error = modest_mail_operation_get_error (mail_op);
+               if (error && error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                   error->code == MODEST_MAIL_OPERATION_ERROR_LOW_MEMORY) {
+                       GObject *source = modest_mail_operation_get_source (mail_op);
+                       modest_platform_run_information_dialog (GTK_IS_WINDOW (source) ? GTK_WINDOW (source) : NULL,
+                                                               dgettext("ke-recv","memr_ib_operation_disabled"),
+                                                               TRUE);
+                       g_object_unref (source);
+               }
 
                /* Remove the header from the preregistered uids */
                modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),  
@@ -849,7 +845,8 @@ open_msg_banner_idle (gpointer userdata)
        gdk_threads_enter ();
        banner_info->idle_handler = 0;
        banner_info->banner = modest_platform_animation_banner (NULL, NULL, banner_info->message);
-       g_object_ref (banner_info->banner);
+       if (banner_info)
+               g_object_ref (banner_info->banner);
        
        gdk_threads_leave ();
 
@@ -905,13 +902,15 @@ open_msg_cb (ModestMailOperation *mail_op,
                        account = g_strdup(modest_tny_account_get_parent_modest_account_name_for_server_account(
                                                   TNY_ACCOUNT(traccount)));
                        send_queue = modest_runtime_get_send_queue(traccount, TRUE);
-                       msg_id = modest_tny_send_queue_get_msg_id (header);
-                       status = modest_tny_send_queue_get_msg_status(send_queue, msg_id);
-                       /* Only open messages in outbox with the editor if they are in Failed state */
-                       if (status == MODEST_TNY_SEND_QUEUE_FAILED) {
-                               open_in_editor = TRUE;
+                       if (TNY_IS_SEND_QUEUE (send_queue)) {
+                               msg_id = modest_tny_send_queue_get_msg_id (header);
+                               status = modest_tny_send_queue_get_msg_status(send_queue, msg_id);
+                               /* Only open messages in outbox with the editor if they are in Failed state */
+                               if (status == MODEST_TNY_SEND_QUEUE_FAILED) {
+                                       open_in_editor = TRUE;
+                               }
+                               g_free(msg_id);
                        }
-                       g_free(msg_id);
                        g_object_unref(traccount);
                } else {
                        g_warning("Cannot get transport account for message in outbox!!");
@@ -945,17 +944,19 @@ open_msg_cb (ModestMailOperation *mail_op,
                if (from_header) {
                        GSList *accounts = modest_account_mgr_account_names (mgr, TRUE);
                        GSList *node = NULL;
+
                        for (node = accounts; node != NULL; node = g_slist_next (node)) {
                                gchar *from = modest_account_mgr_get_from_string (mgr, node->data);
-                               
+                               
                                if (from && (strcmp (from_header, from) == 0)) {
                                        g_free (account);
                                        account = g_strdup (node->data);
                                        g_free (from);
                                        break;
-                               }
+                               }
                                g_free (from);
-                       }
+                       }
+
                        g_free (from_header);
                        g_slist_foreach (accounts, (GFunc) g_free, NULL);
                        g_slist_free (accounts);
@@ -1406,7 +1407,7 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
        /* we check for low-mem; in that case, show a warning, and don't allow
         * opening
         */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(win)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
                return;
 
        /* Get headers */
@@ -1420,6 +1421,26 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
        g_object_unref(headers);
 }
 
+static ReplyForwardHelper*
+create_reply_forward_helper (ReplyForwardAction action, 
+                            ModestWindow *win,
+                            guint reply_forward_type,
+                            TnyHeader *header)
+{
+       ReplyForwardHelper *rf_helper = NULL;
+       const gchar *active_acc = modest_window_get_active_account (win);
+
+       rf_helper = g_slice_new0 (ReplyForwardHelper);
+       rf_helper->reply_forward_type = reply_forward_type;
+       rf_helper->action = action;
+       rf_helper->parent_window = (MODEST_IS_WINDOW (win)) ? GTK_WIDGET (win) : NULL;
+       rf_helper->header = (header) ? g_object_ref (header) : NULL;
+       rf_helper->account_name = (active_acc) ? 
+               g_strdup (active_acc) :
+               modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
+
+       return rf_helper;
+}
 
 static void
 free_reply_forward_helper (gpointer data)
@@ -1428,6 +1449,8 @@ free_reply_forward_helper (gpointer data)
 
        helper = (ReplyForwardHelper *) data;
        g_free (helper->account_name);
+       if (helper->header)
+               g_object_unref (helper->header);
        g_slice_free (ReplyForwardHelper, helper);
 }
 
@@ -1439,7 +1462,7 @@ reply_forward_cb (ModestMailOperation *mail_op,
                  GError *err,
                  gpointer user_data)
 {
-       TnyMsg *new_msg;
+       TnyMsg *new_msg = NULL;
        ReplyForwardHelper *rf_helper;
        ModestWindow *msg_win = NULL;
        ModestEditType edit_type;
@@ -1452,11 +1475,9 @@ reply_forward_cb (ModestMailOperation *mail_op,
        /* If there was any error. The mail operation could be NULL,
           this means that we already have the message downloaded and
           that we didn't do a mail operation to retrieve it */
-       if (mail_op && !modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
-               return;
-                       
-       g_return_if_fail (user_data != NULL);
        rf_helper = (ReplyForwardHelper *) user_data;
+       if (mail_op && !modest_ui_actions_msg_retrieval_check (mail_op, header, msg))
+               goto cleanup;
 
        from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
                                                   rf_helper->account_name);
@@ -1492,10 +1513,11 @@ reply_forward_cb (ModestMailOperation *mail_op,
                return;
        }
 
+       g_free (from);
        g_free (signature);
 
        if (!new_msg) {
-               g_printerr ("modest: failed to create message\n");
+               g_warning ("%s: failed to create message\n", __FUNCTION__);
                goto cleanup;
        }
 
@@ -1503,7 +1525,7 @@ reply_forward_cb (ModestMailOperation *mail_op,
                                                                       rf_helper->account_name,
                                                                       TNY_ACCOUNT_TYPE_STORE);
        if (!account) {
-               g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
+               g_warning ("%s: failed to get tnyaccount for '%s'\n", __FUNCTION__, rf_helper->account_name);
                goto cleanup;
        }
 
@@ -1529,7 +1551,6 @@ cleanup:
                g_object_unref (G_OBJECT (new_msg));
        if (account)
                g_object_unref (G_OBJECT (account));
-/*     g_object_unref (msg); */
        free_reply_forward_helper (rf_helper);
 }
 
@@ -1586,25 +1607,48 @@ connect_to_get_msg (ModestWindow *win,
        return modest_platform_connect_and_wait((GtkWindow *) win, account);
 }
 
+static void
+reply_forward_performer (gboolean canceled, 
+                        GError *err,
+                        GtkWindow *parent_window, 
+                        TnyAccount *account, 
+                        gpointer user_data)
+{
+       ReplyForwardHelper *rf_helper = NULL;
+       ModestMailOperation *mail_op;
+
+       rf_helper = (ReplyForwardHelper *) user_data;
+
+       if (canceled || err) {
+               free_reply_forward_helper (rf_helper);
+               return;
+       }
+
+       /* Retrieve the message */
+       mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (parent_window),
+                                                                modest_ui_actions_disk_operations_error_handler,
+                                                                NULL, NULL);
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
+       modest_mail_operation_get_msg (mail_op, rf_helper->header, TRUE, reply_forward_cb, rf_helper);
+
+       /* Frees */
+       g_object_unref(mail_op);
+}
+
 /*
  * Common code for the reply and forward actions
  */
 static void
 reply_forward (ReplyForwardAction action, ModestWindow *win)
 {
-       ModestMailOperation *mail_op = NULL;
-       TnyList *header_list = NULL;
        ReplyForwardHelper *rf_helper = NULL;
        guint reply_forward_type;
-       gboolean continue_download = TRUE;
-       gboolean do_retrieve = TRUE;
        
        g_return_if_fail (MODEST_IS_WINDOW(win));
-
                        
        /* we check for low-mem; in that case, show a warning, and don't allow
         * reply/forward (because it could potentially require a lot of memory */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(win)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
                return;
 
 
@@ -1614,113 +1658,115 @@ reply_forward (ReplyForwardAction action, ModestWindow *win)
                        return;
        }
        
-       header_list = get_selected_headers (win);
-       if (!header_list)
-               return;
-
-       reply_forward_type = 
+       reply_forward_type =
                modest_conf_get_int (modest_runtime_get_conf (),
-                                    (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
+                                    (action == ACTION_FORWARD) ? 
+                                    MODEST_CONF_FORWARD_TYPE :
+                                    MODEST_CONF_REPLY_TYPE,
                                     NULL);
 
-       /* check if we need to download msg before asking about it */
-       do_retrieve = (action == ACTION_FORWARD) ||
-                       (reply_forward_type != MODEST_TNY_MSG_REPLY_TYPE_CITE);
-
-       if (do_retrieve){
-               gint num_of_unc_msgs;
-
-               /* check that the messages have been previously downloaded */
-               num_of_unc_msgs = header_list_count_uncached_msgs(header_list);
-               /* If there are any uncached message ask the user
-                * whether he/she wants to download them. */
-               if (num_of_unc_msgs) {
-                       TnyAccount *account = get_account_from_header_list (header_list);
-                       if (account) {
-                               continue_download = connect_to_get_msg (win, num_of_unc_msgs, account);
-                               g_object_unref (account);
-                       }
-               }
-       }
-
-       if (!continue_download) {
-               g_object_unref (header_list);
-               return;
-       }
-       
-       /* We assume that we can only select messages of the
-          same folder and that we reply all of them from the
-          same account. In fact the interface currently only
-          allows single selection */
-       
-       /* Fill helpers */
-       rf_helper = g_slice_new0 (ReplyForwardHelper);
-       rf_helper->reply_forward_type = reply_forward_type;
-       rf_helper->action = action;
-       rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
-       
-       if ((win != NULL) && (MODEST_IS_WINDOW (win)))
-               rf_helper->parent_window = GTK_WIDGET (win);
-       if (!rf_helper->account_name)
-               rf_helper->account_name =
-                       modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
-
-       if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
-               TnyMsg *msg;
-               TnyHeader *header;
+       if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
+               TnyMsg *msg = NULL;
+               TnyHeader *header = NULL;
                /* Get header and message. Do not free them here, the
                   reply_forward_cb must do it */
                msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
-               header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win));
-               if (!msg || !header) {
-                       if (msg)
-                               g_object_unref (msg);
-                       g_printerr ("modest: no message found\n");
-                       return;
-               } else {
+               header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW (win));
+
+               if (msg && header) {
+                       /* Create helper */
+                       rf_helper = create_reply_forward_helper (action, win, 
+                                                                reply_forward_type, header);
                        reply_forward_cb (NULL, header, FALSE, msg, NULL, rf_helper);
+               } else {
+                       g_warning("%s: no message or header found in viewer\n", __FUNCTION__);
                }
-               if (header)
+               
+               if (msg)
+                       g_object_unref (msg);
+               if (header)
                        g_object_unref (header);
        } else {
-               TnyHeader *header;
+               TnyHeader *header = NULL;
                TnyIterator *iter;
+               gboolean do_retrieve = TRUE;
+               TnyList *header_list = NULL;
+
+               header_list = get_selected_headers (win);
+               if (!header_list)
+                       return;
+               if (tny_list_get_length (header_list) == 0) {
+                       g_object_unref (header_list);
+                       return;
+               }
 
                /* Only reply/forward to one message */
                iter = tny_list_create_iterator (header_list);
                header = TNY_HEADER (tny_iterator_get_current (iter));
                g_object_unref (iter);
 
-               if (header) {
-                       /* Retrieve messages */
-                       if (do_retrieve) {
-                               mail_op = 
-                                       modest_mail_operation_new_with_error_handling (G_OBJECT(win),
-                                                                                      modest_ui_actions_disk_operations_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,
-                                                              reply_forward_cb,
-                                                              rf_helper);
-                               /* Clean */
-                               g_object_unref(mail_op);
-                       } else {
-                               /* we put a ref here to prevent double unref as the reply
-                                * forward callback unrefs the header at its end */
-                               reply_forward_cb (NULL, header, FALSE, NULL, NULL, rf_helper);
-                       }
+               /* Retrieve messages */
+               do_retrieve = (action == ACTION_FORWARD) ||
+                       (reply_forward_type != MODEST_TNY_MSG_REPLY_TYPE_CITE);
 
+               if (do_retrieve) {
+                       TnyAccount *account = NULL;
+                       TnyFolder *folder = NULL;
+                       gdouble download = TRUE;
+                       guint uncached_msgs = 0;
 
-                       g_object_unref (header);
+                       folder = tny_header_get_folder (header);
+                       if (!folder)
+                               goto do_retrieve_frees;
+                       account = tny_folder_get_account (folder);
+                       if (!account)
+                               goto do_retrieve_frees;
+
+                       uncached_msgs = header_list_count_uncached_msgs (header_list);
+
+                       if (uncached_msgs > 0) {
+                               /* Allways download if we are online. */
+                               if (!tny_device_is_online (modest_runtime_get_device ())) {
+                                       gint response;
+                                       
+                                       /* If ask for user permission to download the messages */
+                                       response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win),
+                                                                                           ngettext("mcen_nc_get_msg",
+                                                                                                    "mcen_nc_get_msgs",
+                                                                                                    uncached_msgs));
+                                       
+                                       /* End if the user does not want to continue */
+                                       if (response == GTK_RESPONSE_CANCEL)
+                                               download = FALSE;
+                               }
+                       }
+                       
+                       if (download) {
+                               /* Create helper */
+                               rf_helper = create_reply_forward_helper (action, win, 
+                                                                        reply_forward_type, header);
+                               if (uncached_msgs > 0) {
+                                       modest_platform_connect_and_perform (GTK_WINDOW (win), 
+                                                                            TRUE, account, 
+                                                                            reply_forward_performer, 
+                                                                            rf_helper);
+                               } else {
+                                       reply_forward_performer (FALSE, NULL, GTK_WINDOW (win), 
+                                                                account, rf_helper);
+                               }
+                       }
+               do_retrieve_frees:
+                       if (account)
+                               g_object_unref (account);
+                       if (folder)
+                               g_object_unref (folder);
+               } else {
+                       reply_forward_cb (NULL, header, FALSE, NULL, NULL, rf_helper);
                }
-
+               /* Frees */
+               g_object_unref (header_list);
+               g_object_unref (header);
        }
-
-       /* Free */
-       g_object_unref (header_list);
 }
 
 void
@@ -2204,7 +2250,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
        /* we check for low-mem; in that case, show a warning, and don't allow
         * activating headers
         */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(main_window)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(main_window), TRUE))
                return;
 
        modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
@@ -2259,10 +2305,22 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
 {
        ModestMainWindow *win = NULL;
        GtkWidget *header_view;
+       const GError *error;
 
        g_return_if_fail (TNY_IS_FOLDER (folder));
 
        win = MODEST_MAIN_WINDOW (user_data);
+
+       /* Check if the operation failed due to memory low conditions */
+       error = modest_mail_operation_get_error (mail_op);
+       if (error && error->domain == MODEST_MAIL_OPERATION_ERROR && 
+           error->code == MODEST_MAIL_OPERATION_ERROR_LOW_MEMORY) {
+               modest_platform_run_information_dialog (GTK_WINDOW (win),
+                                                       dgettext("ke-recv","memr_ib_operation_disabled"),
+                                                       TRUE);
+               return;
+       }
+
        header_view = 
                modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
 
@@ -2441,7 +2499,7 @@ modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart
        /* we check for low-mem; in that case, show a warning, and don't allow
         * viewing attachments
         */
-       if (modest_platform_check_memory_low (MODEST_WINDOW(win)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(win), TRUE))
                return;
 
        modest_msg_view_window_view_attachment (MODEST_MSG_VIEW_WINDOW (win), mime_part);
@@ -2525,7 +2583,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
         */
        if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
 
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window))) {
+               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE)) {
                        modest_msg_edit_window_free_msg_data (edit_window, data);
                        return FALSE;
                }
@@ -2695,7 +2753,7 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
         * this should still allow for sending anything critical... 
         */
        if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window))) {
+               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE)) {
                        modest_msg_edit_window_free_msg_data (edit_window, data);
                        return FALSE;
                }
@@ -2917,7 +2975,7 @@ modest_ui_actions_on_insert_image (GtkAction *action,
        g_return_if_fail (GTK_IS_ACTION (action));
 
 
-       if (modest_platform_check_memory_low (MODEST_WINDOW(window)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
                return;
 
        if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
@@ -2933,7 +2991,7 @@ modest_ui_actions_on_attach_file (GtkAction *action,
        g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
        g_return_if_fail (GTK_IS_ACTION (action));
 
-       if (modest_platform_check_memory_low (MODEST_WINDOW(window)))
+       if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
                return;
        
        modest_msg_edit_window_offer_attach_file (window);
@@ -3126,7 +3184,7 @@ on_rename_folder_cb (ModestMailOperation *mail_op,
 
        /* If the window was closed when renaming a folder this could
           happen */
-       if (MODEST_IS_FOLDER_VIEW (user_data))
+       if (!MODEST_IS_FOLDER_VIEW (user_data))
                return;
 
        folder_view = MODEST_FOLDER_VIEW (user_data);
@@ -3136,6 +3194,7 @@ on_rename_folder_cb (ModestMailOperation *mail_op,
        } else {
                modest_folder_view_select_first_inbox_or_local (folder_view);
        }
+       gtk_widget_grab_focus (GTK_WIDGET (folder_view));       
 }
 
 static void
@@ -3464,10 +3523,15 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
        /* Dim this if a connection has ever succeeded with this username,
         * as per the UI spec: */
-       const gboolean username_known = 
-               modest_account_mgr_get_server_account_username_has_succeeded(
-                       modest_runtime_get_account_mgr(), server_account_name);
-       gtk_widget_set_sensitive (entry_username, !username_known);
+       /* const gboolean username_known =  */
+       /*      modest_account_mgr_get_server_account_username_has_succeeded( */
+       /*              modest_runtime_get_account_mgr(), server_account_name); */
+       /* gtk_widget_set_sensitive (entry_username, !username_known); */
+
+       /* We drop the username sensitive code and disallow changing it here
+        * as tinymail does not support really changing the username in the callback
+        */
+       gtk_widget_set_sensitive (entry_username, FALSE);
 
 #ifdef MODEST_PLATFORM_MAEMO
        /* Auto-capitalization is the default, so let's turn it off: */
@@ -3772,8 +3836,10 @@ paste_as_attachment_free (gpointer data)
 {
        PasteAsAttachmentHelper *helper = (PasteAsAttachmentHelper *) data;
 
-       gtk_widget_destroy (helper->banner);
-       g_object_unref (helper->banner);
+       if (helper->banner) {
+               gtk_widget_destroy (helper->banner);
+               g_object_unref (helper->banner);
+       }
        g_free (helper);
 }
 
@@ -3827,7 +3893,6 @@ modest_ui_actions_on_paste (GtkAction *action,
                        mail_op = modest_mail_operation_new (G_OBJECT (window));
                        if (helper->banner != NULL) {
                                g_object_ref (G_OBJECT (helper->banner));
-                               gtk_window_set_modal (GTK_WINDOW (helper->banner), FALSE);
                                gtk_widget_show (GTK_WIDGET (helper->banner));
                        }
 
@@ -4624,6 +4689,21 @@ modest_ui_actions_msgs_move_to_confirmation (ModestWindow *win,
 }
 
 static void
+move_to_helper_destroyer (gpointer user_data)
+{
+       MoveToHelper *helper = (MoveToHelper *) user_data;
+
+       /* Close the "Pasting" information banner */
+       if (helper->banner) {
+               gtk_widget_destroy (GTK_WIDGET (helper->banner));
+               g_object_unref (helper->banner);
+       }
+       if (helper->reference != NULL)
+               gtk_tree_row_reference_free (helper->reference);
+       g_free (helper);
+}
+
+static void
 move_to_cb (ModestMailOperation *mail_op, 
            gpointer user_data)
 {
@@ -4661,13 +4741,8 @@ move_to_cb (ModestMailOperation *mail_op,
                }
                g_object_unref (object);
         }
-
-       /* Close the "Pasting" information banner */
-       gtk_widget_destroy (GTK_WIDGET(helper->banner));
-       g_object_unref (helper->banner);
-       if (helper->reference != NULL)
-               gtk_tree_row_reference_free (helper->reference);
-       g_free (helper);
+       /* Destroy the helper */
+       move_to_helper_destroyer (helper);
 }
 
 static void
@@ -4859,7 +4934,7 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
                                                                         modest_ui_actions_disk_operations_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, open_msg_for_purge_cb, win);
+               modest_mail_operation_get_msg (mail_op, header, FALSE, open_msg_for_purge_cb, win);
                
                g_object_unref (mail_op);
        }
@@ -4954,7 +5029,7 @@ xfer_messages_error_handler (ModestMailOperation *mail_op,
                             gpointer user_data)
 {
        ModestWindow *main_window = NULL;
-       
+
        /* Disable next automatic folder selection */
        main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
                                                         FALSE); /* don't create */
@@ -4966,6 +5041,7 @@ xfer_messages_error_handler (ModestMailOperation *mail_op,
                if (win)
                        g_object_unref (win);
        }
+       move_to_helper_destroyer (user_data);
 }
 
 /**
@@ -5033,7 +5109,6 @@ xfer_messages_performer  (gboolean canceled,
                                                           _CS("ckct_nw_pasting"));
        if (helper->banner != NULL)  {
                g_object_ref (helper->banner);
-               gtk_window_set_modal (GTK_WINDOW(helper->banner), FALSE);
                gtk_widget_show (GTK_WIDGET(helper->banner));
        }
 
@@ -5047,7 +5122,7 @@ xfer_messages_performer  (gboolean canceled,
        ModestMailOperation *mail_op = 
                modest_mail_operation_new_with_error_handling (G_OBJECT(win),
                                                               xfer_messages_error_handler,
-                                                              NULL, NULL);
+                                                              helper, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
                                         mail_op);
 
@@ -5091,7 +5166,6 @@ on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window,
                        _CS("ckct_nw_pasting"));
        if (helper->banner != NULL)  {
                g_object_ref (helper->banner);
-               gtk_window_set_modal (GTK_WINDOW(helper->banner), FALSE);
                gtk_widget_show (GTK_WIDGET(helper->banner));
        }
        /* Clean folder on header view before moving it */
@@ -5399,7 +5473,7 @@ modest_ui_actions_save_attachments (GtkAction *action,
 {
        if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
 
-               if (modest_platform_check_memory_low (MODEST_WINDOW(window)))
+               if (modest_platform_check_memory_low (MODEST_WINDOW(window), TRUE))
                        return;
 
                modest_msg_view_window_save_attachments (MODEST_MSG_VIEW_WINDOW (window), NULL);
@@ -5445,15 +5519,53 @@ modest_ui_actions_on_help (GtkAction *action,
 {
        const gchar *help_id;
 
-       g_return_if_fail (action);
        g_return_if_fail (win && GTK_IS_WINDOW(win));
        
        help_id = modest_window_mgr_get_help_id (modest_runtime_get_window_mgr(), win);
-       
-       if (help_id)
-               modest_platform_show_help (GTK_WINDOW (win), help_id);
+
+        if (help_id)
+                modest_platform_show_help (GTK_WINDOW (win), help_id);
+}
+
+void 
+modest_ui_actions_on_csm_help (GtkAction *action, 
+                              GtkWindow *win)
+{
+       const gchar* help_id = NULL;
+       GtkWidget *folder_view;
+       TnyFolderStore *folder_store;
+
+       g_return_if_fail (win && MODEST_IS_MAIN_WINDOW (win));
+
+       /* Get selected folder */
+       folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
+       folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
+
+       /* Switch help_id */
+       if (folder_store && TNY_IS_FOLDER (folder_store))
+               help_id = modest_tny_folder_get_help_id (TNY_FOLDER (folder_store));
+
+       if (folder_store)
+               g_object_unref (folder_store);
+
+        if (help_id)
+                modest_platform_show_help (GTK_WINDOW (win), help_id);
        else
-               g_warning ("%s: no help for window %p", __FUNCTION__, win);
+               modest_ui_actions_on_help (action, win);
+}
+
+static void     
+retrieve_contents_cb (ModestMailOperation *mail_op, 
+                     TnyHeader *header, 
+                     gboolean canceled,
+                     TnyMsg *msg,
+                     GError *err,
+                     gpointer user_data)
+{
+       /* We only need this callback to show an error in case of
+          memory low condition */
+       modest_ui_actions_msg_retrieval_check (mail_op, header, msg);
 }
 
 static void
@@ -5480,7 +5592,7 @@ retrieve_msg_contents_performer (gboolean canceled,
                                                                 modest_ui_actions_disk_operations_error_handler, 
                                                                 NULL, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
-       modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL);
+       modest_mail_operation_get_msgs_full (mail_op, headers, retrieve_contents_cb, NULL, NULL);
 
        /* Frees */
        g_object_unref (mail_op);
@@ -5640,7 +5752,7 @@ modest_ui_actions_on_search_messages (GtkAction *action, ModestWindow *window)
        /* we check for low-mem; in that case, show a warning, and don't allow
         * searching
         */
-       if (modest_platform_check_memory_low (window))
+       if (modest_platform_check_memory_low (window, TRUE))
                return;
        
        modest_platform_show_search_messages (GTK_WINDOW (window));
@@ -5655,7 +5767,7 @@ modest_ui_actions_on_open_addressbook (GtkAction *action, ModestWindow *win)
        /* we check for low-mem; in that case, show a warning, and don't allow
         * for the addressbook
         */
-       if (modest_platform_check_memory_low (win))
+       if (modest_platform_check_memory_low (win, TRUE))
                return;