Fixes FWNULL 1/16 & 2/16
[modest] / src / modest-ui-actions.c
index e1dc2ff..8646f01 100644 (file)
@@ -35,6 +35,7 @@
 #include <glib/gprintf.h>
 #include <string.h>
 #include <modest-runtime.h>
+#include <modest-defs.h>
 #include <modest-tny-folder.h>
 #include <modest-tny-msg.h>
 #include <modest-tny-account.h>
@@ -54,6 +55,7 @@
 #include <hildon/hildon-gtk.h>
 #include <modest-header-window.h>
 #include <modest-folder-window.h>
+#include <modest-maemo-utils.h>
 #endif
 
 #ifdef MODEST_PLATFORM_MAEMO
@@ -239,14 +241,23 @@ modest_ui_actions_run_account_setup_wizard (ModestWindow *win)
 
                window_list = modest_window_mgr_get_window_list (mgr);
                if (window_list == NULL) {
+                       ModestWindow *old_win;
                        win = MODEST_WINDOW (modest_accounts_window_new ());
-                       modest_window_mgr_register_window (mgr, win, NULL);
-                       gtk_widget_show_all (GTK_WIDGET (win));
+                       if (modest_window_mgr_register_window (mgr, win, NULL)) {
+                               gtk_widget_show_all (GTK_WIDGET (win));
+                       } else {
+                               gtk_widget_destroy (GTK_WIDGET (win));
+                               win = NULL;
+                       }
 
+                       old_win = win;
                        win = MODEST_WINDOW (modest_folder_window_new (NULL));
-                       modest_window_mgr_register_window (mgr, win, NULL);
-
-                       gtk_widget_show_all (GTK_WIDGET (win));
+                       if (modest_window_mgr_register_window (mgr, win, NULL)) {
+                               gtk_widget_show_all (GTK_WIDGET (win));
+                       } else {
+                               gtk_widget_destroy (GTK_WIDGET (win));
+                               win = old_win;
+                       }
                } else {
                        g_list_free (window_list);
                }
@@ -1153,20 +1164,39 @@ cleanup:
 }
 
 static gboolean
-is_memory_full_error (GError *error)
+is_memory_full_error (GError *error, ModestMailOperation *mail_op)
 {
        gboolean enough_free_space = TRUE;
        GnomeVFSURI *cache_dir_uri;
-       const gchar *cache_dir;
+       const gchar *cache_dir = NULL;
        GnomeVFSFileSize free_space;
+       TnyAccountStore *acc_store;
+
+       acc_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ());
+
+       /* Cache dir is different in case we're using an external storage (like MMC account) */
+       if (mail_op) {
+               TnyAccount *account = modest_mail_operation_get_account (mail_op);
+               if (account) {
+                       if (modest_tny_account_is_memory_card_account (account)) {
+                               cache_dir = g_getenv (MODEST_MMC1_VOLUMEPATH_ENV);
+                       }
+                       g_object_unref (account);
+               }
+       }
+
+       /* Get the default local cache dir */
+       if (!cache_dir)
+               cache_dir = tny_account_store_get_cache_dir (acc_store);
 
-       cache_dir = tny_account_store_get_cache_dir (TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
        cache_dir_uri = gnome_vfs_uri_new (cache_dir);
-       if (gnome_vfs_get_volume_free_space (cache_dir_uri, &free_space) == GNOME_VFS_OK) {
-               if (free_space < MIN_FREE_SPACE)
-                       enough_free_space = FALSE;
+       if (cache_dir_uri) {
+               if (gnome_vfs_get_volume_free_space (cache_dir_uri, &free_space) == GNOME_VFS_OK) {
+                       if (free_space < MIN_FREE_SPACE)
+                               enough_free_space = FALSE;
+               }
+               gnome_vfs_uri_unref (cache_dir_uri);
        }
-       gnome_vfs_uri_unref (cache_dir_uri);
 
        if ((error->code == TNY_SYSTEM_ERROR_MEMORY ||
             /* When asking for a mail and no space left on device
@@ -1189,7 +1219,7 @@ check_memory_full_error (GtkWidget *parent_window, GError *err)
        if (err == NULL)
                return FALSE;
 
-       if (is_memory_full_error (err))
+       if (is_memory_full_error (err, NULL))
                modest_platform_information_banner (parent_window,
                                                    NULL, _KR("cerm_device_memory_full"));
        else if (err->code == TNY_SYSTEM_ERROR_MEMORY)
@@ -1219,7 +1249,7 @@ modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
        /* If the mail op has been cancelled then it's not an error:
           don't show any message */
        if (status != MODEST_MAIL_OPERATION_STATUS_CANCELED) {
-               if (is_memory_full_error ((GError *) error)) {
+               if (is_memory_full_error ((GError *) error, mail_op)) {
                        modest_platform_information_banner ((GtkWidget *) win,
                                                            NULL, _KR("cerm_device_memory_full"));
                } else if (error->code == TNY_SYSTEM_ERROR_MEMORY) {
@@ -1328,7 +1358,7 @@ open_msg_performer(gboolean canceled,
                    gpointer user_data)
 {
        ModestMailOperation *mail_op = NULL;
-       gchar *error_msg;
+       gchar *error_msg = NULL;
        ModestProtocolType proto;
        TnyConnectionStatus status;
        OpenMsgHelper *helper = NULL;
@@ -1425,7 +1455,7 @@ open_msg_performer(gboolean canceled,
        mail_op = 
                modest_mail_operation_new_with_error_handling ((GObject *) parent_window,
                                                               modest_ui_actions_disk_operations_error_handler,
-                                                              error_msg, g_free);
+                                                              g_strdup (error_msg), g_free);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                         mail_op);
 
@@ -1453,6 +1483,8 @@ open_msg_performer(gboolean canceled,
 
        /* Frees */
  clean:
+       if (error_msg)
+               g_free (error_msg);
        if (mail_op)
                g_object_unref (mail_op);
        g_object_unref (account);
@@ -2058,12 +2090,12 @@ modest_ui_actions_on_sort (GtkAction *action,
 
        if (!header_view) {
                modest_platform_information_banner (NULL, NULL, _CS("ckdg_ib_nothing_to_sort"));
-               
+
                return;
        }
 
        /* Show sorting dialog */
-       modest_utils_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);        
+       modest_utils_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
 }
 
 static void
@@ -3219,38 +3251,6 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
        modest_msg_edit_window_remove_attachments (window, NULL);
 }
 
-
-#ifndef MODEST_TOOLKIT_GTK
-typedef struct {
-       guint handler;
-       gchar *name;
-       GtkWindow *win;
-       TnyFolderStore *folder;
-} CreateFolderHelper;
-
-static gboolean
-show_create_folder_in_timeout (gpointer data)
-{
-       CreateFolderHelper *helper = (CreateFolderHelper *) data;
-
-       /* Remove the timeout ASAP, we can not wait until the dialog
-          is shown because it could take a lot of time and so the
-          timeout could be called twice or more times */
-       g_source_remove (helper->handler);
-
-       gdk_threads_enter ();
-       do_create_folder (helper->win, helper->folder, helper->name);
-       gdk_threads_leave ();
-
-       g_object_unref (helper->win);
-       g_object_unref (helper->folder);
-       g_free (helper->name);
-       g_slice_free (CreateFolderHelper, helper);
-
-       return FALSE;
-}
-#endif
-
 static void
 do_create_folder_cb (ModestMailOperation *mail_op,
                     TnyFolderStore *parent_folder, 
@@ -3259,8 +3259,10 @@ do_create_folder_cb (ModestMailOperation *mail_op,
 {
        gchar *suggested_name = (gchar *) user_data;
        GtkWindow *source_win = (GtkWindow *) modest_mail_operation_get_source (mail_op);
+       const GError *error;
 
-       if (modest_mail_operation_get_error (mail_op)) {
+       error = modest_mail_operation_get_error (mail_op);
+       if (error) {
 
                /* Show an error. If there was some problem writing to
                   disk, show it, otherwise show the generic folder
@@ -3272,24 +3274,10 @@ do_create_folder_cb (ModestMailOperation *mail_op,
                modest_ui_actions_disk_operations_error_handler (mail_op,
                                                                 _("mail_in_ui_folder_create_error"));
 
-               /* Try again. Do *NOT* show any error because the mail
-                  operations system will do it for us because we
-                  created the mail_op with new_with_error_handler */
-#ifndef MODEST_TOOLKIT_GTK
-               CreateFolderHelper *helper;
-               helper = g_slice_new0 (CreateFolderHelper);
-               helper->name = g_strdup (suggested_name);
-               helper->folder = g_object_ref (parent_folder);
-               helper->win = g_object_ref (source_win);
-
-               /* Ugly but neccesary stuff. The problem is that the
-                  dialog when is shown calls a function that destroys
-                  all the temporary windows, so the banner is
-                  destroyed */
-               helper->handler = g_timeout_add (2000, show_create_folder_in_timeout, helper);
-#else
-               do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
-#endif
+               if (!is_memory_full_error ((GError *) error, mail_op)) {
+                       /* Try again if there is no full memory condition */
+                       do_create_folder (source_win, parent_folder, (const gchar *) suggested_name);
+               }
        } else {
                /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
                 * FIXME: any other? */
@@ -3372,7 +3360,7 @@ do_create_folder (GtkWindow *parent_window,
                                                        &parent_folder);
 
        if (result == GTK_RESPONSE_ACCEPT && parent_folder) {
-               CreateFolderConnect *helper = (CreateFolderConnect *) g_slice_new0 (CreateFolderHelper);
+               CreateFolderConnect *helper = (CreateFolderConnect *) g_slice_new0 (CreateFolderConnect);
                helper->folder_name = g_strdup (folder_name);
                helper->parent = g_object_ref (parent_folder);
 
@@ -3406,8 +3394,10 @@ modest_ui_actions_create_folder(GtkWidget *parent_window,
        parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
 #endif
 
-       if (parent_folder)
+       if (parent_folder) {
                do_create_folder (GTK_WINDOW (parent_window), parent_folder, NULL);
+               g_object_unref (parent_folder);
+       }
 }
 
 void
@@ -3458,7 +3448,7 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
                   message is opened for example */
                message = _("emev_ni_internal_error");
        } else {
-               message = _CS("ckdg_ib_unable_to_remove");
+               message = _CS("ckdg_ib_unable_to_rename");
        }
 
        /* We don't set a parent for the dialog because the dialog
@@ -3490,7 +3480,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));       
+       gtk_widget_grab_focus (GTK_WIDGET (folder_view));
 }
 
 static void
@@ -3510,7 +3500,7 @@ on_rename_folder_performer (gboolean canceled,
                check_memory_full_error ((GtkWidget *) parent_window, err);
        } else {
 
-               mail_op = 
+               mail_op =
                        modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
                                        modest_ui_actions_rename_folder_error_handler,
                                        parent_window, NULL);
@@ -3523,13 +3513,17 @@ on_rename_folder_performer (gboolean canceled,
                        folder_view = modest_main_window_get_child_widget (
                                MODEST_MAIN_WINDOW (parent_window),
                                MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
-
-                       /* Clear the headers view */
-                       sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
-                       gtk_tree_selection_unselect_all (sel);
-               } else {
-                       folder_view = NULL;
+               } 
+#ifdef MODEST_TOOLKIT_HILDON2
+               else if (MODEST_IS_FOLDER_WINDOW (parent_window)) {
+                       ModestFolderWindow *folder_window = (ModestFolderWindow *) parent_window;
+                       folder_view = GTK_WIDGET (modest_folder_window_get_folder_view (folder_window));
                }
+#endif
+
+               /* Clear the folders view */
+               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
+               gtk_tree_selection_unselect_all (sel);
 
                /* Actually rename the folder */
                modest_mail_operation_rename_folder (mail_op,
@@ -3537,10 +3531,10 @@ on_rename_folder_performer (gboolean canceled,
                                                     (const gchar *) (data->new_name),
                                                     on_rename_folder_cb,
                                                     folder_view);
-               g_object_unref (data->folder);
                g_object_unref (mail_op);
        }
 
+       g_object_unref (data->folder);
        g_free (data->new_name);
        g_free (data);
 }
@@ -3778,11 +3772,19 @@ password_dialog_check_field (GtkEditable *editable,
        const gchar *value;
        gboolean any_value_empty = FALSE;
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       value = hildon_entry_get_text (HILDON_ENTRY (fields->username));
+#else
        value = gtk_entry_get_text (GTK_ENTRY (fields->username));
+#endif
        if ((value == NULL) || value[0] == '\0') {
                any_value_empty = TRUE;
        }
+#ifdef MODEST_TOOLKIT_HILDON2
+       value = hildon_entry_get_text (HILDON_ENTRY (fields->password));
+#else
        value = gtk_entry_get_text (GTK_ENTRY (fields->password));
+#endif
        if ((value == NULL) || value[0] == '\0') {
                any_value_empty = TRUE;
        }
@@ -3821,6 +3823,8 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                                             _HL("wdgt_bd_done"),
                                             GTK_RESPONSE_ACCEPT,
                                             NULL);
+       gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 
+                                       HILDON_MARGIN_DOUBLE);
 #else
        GtkWidget *dialog =
                gtk_dialog_new_with_buttons (_("mail_ti_password_protected"),
@@ -3857,19 +3861,27 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
        }
 
        gchar *txt = g_strdup_printf (_("mail_ia_password_info"), server_name);
-       gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
-                           FALSE, FALSE, 0);
+       GtkWidget *label = gtk_label_new (txt);
+       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
        g_free (txt);
        g_free (server_name);
+       gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), label,
+                           FALSE, FALSE, 0);
        server_name = NULL;
 
        /* username: */
        gchar *initial_username = modest_account_mgr_get_server_account_username (
                modest_runtime_get_account_mgr(), server_account_name);
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       GtkWidget *entry_username = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH);
+       if (initial_username)
+               hildon_entry_set_text (HILDON_ENTRY (entry_username), initial_username);
+#else
        GtkWidget *entry_username = gtk_entry_new ();
        if (initial_username)
                gtk_entry_set_text (GTK_ENTRY (entry_username), initial_username);
+#endif
        /* Dim this if a connection has ever succeeded with this username,
         * as per the UI spec: */
        /* const gboolean username_known =  */
@@ -3891,8 +3903,14 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
         * We use GTK_SIZE_GROUP_HORIZONTAL, so that the widths are the same. */
        GtkSizeGroup *sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       GtkWidget *caption = modest_maemo_utils_create_captioned (sizegroup, NULL, 
+                                                                 _("mail_fi_username"), FALSE,
+                                                                 entry_username);
+#else
        GtkWidget *caption = hildon_caption_new (sizegroup, 
                _("mail_fi_username"), entry_username, NULL, HILDON_CAPTION_MANDATORY);
+#endif
        gtk_widget_show (entry_username);
        gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption, 
                FALSE, FALSE, MODEST_MARGIN_HALF);
@@ -3903,7 +3921,11 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 #endif /* !MODEST_TOOLKIT_GTK */
 
        /* password: */
+#ifdef MODEST_TOOLKIT_HILDON2
+       GtkWidget *entry_password = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH);
+#else
        GtkWidget *entry_password = gtk_entry_new ();
+#endif
        gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
        /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
 
@@ -3912,8 +3934,14 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
        hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password),
                HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       caption = modest_maemo_utils_create_captioned (sizegroup, NULL,
+                                                      _("mail_fi_password"), FALSE,
+                                                      entry_password);
+#else
        caption = hildon_caption_new (sizegroup,
                _("mail_fi_password"), entry_password, NULL, HILDON_CAPTION_MANDATORY);
+#endif
        gtk_widget_show (entry_password);
        gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), caption,
                FALSE, FALSE, MODEST_MARGIN_HALF);
@@ -3948,7 +3976,11 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 
                if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
                        if (username) {
+#ifdef MODEST_TOOLKIT_HILDON2
+                               *username = g_strdup (hildon_entry_get_text (HILDON_ENTRY(entry_username)));
+#else
                                *username = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_username)));
+#endif
 
                                /* Note that an empty field becomes the "" string */
                                if (*username && strlen (*username) > 0) {
@@ -3974,7 +4006,11 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                        }
 
                        if (password) {
+#ifdef MODEST_TOOLKIT_HILDON2
+                               *password = g_strdup (hildon_entry_get_text (HILDON_ENTRY(entry_password)));
+#else
                                *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry_password)));
+#endif
 
                                /* We do not save the password in the configuration, 
                                 * because this function is only called for passwords that should 
@@ -4522,7 +4558,7 @@ modest_ui_actions_on_change_fullscreen (GtkAction *action,
  * Used by modest_ui_actions_on_details to call do_headers_action 
  */
 static void
-headers_action_show_details (TnyHeader *header, 
+headers_action_show_details (TnyHeader *header,
                             ModestWindow *window,
                             gpointer user_data)
 
@@ -4533,36 +4569,24 @@ headers_action_show_details (TnyHeader *header,
 /*
  * Show the header details in a ModestDetailsDialog widget
  */
-void     
-modest_ui_actions_on_details (GtkAction *action, 
+void
+modest_ui_actions_on_details (GtkAction *action,
                              ModestWindow *win)
 {
-       TnyList * headers_list;
-       TnyIterator *iter;
-       TnyHeader *header;              
-
        if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
                TnyMsg *msg;
+               TnyHeader *header;
 
                msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
                if (!msg)
                        return;
-               g_object_unref (msg);           
-
-               headers_list = get_selected_headers (win);
-               if (!headers_list)
-                       return;
 
-               iter = tny_list_create_iterator (headers_list);
-
-               header = TNY_HEADER (tny_iterator_get_current (iter));
+               header = tny_msg_get_header (msg);
                if (header) {
                        headers_action_show_details (header, win, NULL);
                        g_object_unref (header);
                }
-
-               g_object_unref (iter);
-               g_object_unref (headers_list);
+               g_object_unref (msg);
 
        } else if (MODEST_IS_MAIN_WINDOW (win)) {
                GtkWidget *folder_view, *header_view;
@@ -4856,41 +4880,58 @@ on_move_to_dialog_response (GtkDialog *dialog,
                            gint       response,
                            gpointer   user_data)
 {
-       GtkWidget *parent_win, *folder_view;
+       GtkWidget *parent_win;
        MoveToInfo *helper = NULL;
+       ModestFolderView *folder_view;
 
        helper = (MoveToInfo *) user_data;
 
        parent_win = (GtkWidget *) helper->win;
-       folder_view = GTK_WIDGET (g_object_get_data (G_OBJECT (dialog),
-                                                    MODEST_MOVE_TO_DIALOG_FOLDER_VIEW));
+       folder_view = MODEST_FOLDER_VIEW (g_object_get_data (G_OBJECT (dialog),
+                                                            MODEST_MOVE_TO_DIALOG_FOLDER_VIEW));
 
        switch (response) {
                TnyFolderStore *dst_folder;
 
        case MODEST_GTK_RESPONSE_NEW_FOLDER:
-               modest_ui_actions_create_folder (GTK_WIDGET (parent_win), folder_view);
+               modest_ui_actions_create_folder (GTK_WIDGET (dialog), GTK_WIDGET (folder_view));
                return;
        case GTK_RESPONSE_NONE:
        case GTK_RESPONSE_CANCEL:
        case GTK_RESPONSE_DELETE_EVENT:
                break;
        case GTK_RESPONSE_OK:
-               dst_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
-               /* Do window specific stuff */
+               dst_folder = modest_folder_view_get_selected (folder_view);
+
                if (MODEST_IS_MAIN_WINDOW (parent_win)) {
+                       /* Clean list to move used for filtering */
+                       modest_folder_view_set_list_to_move (folder_view, NULL);
+
                        modest_ui_actions_on_main_window_move_to (NULL,
-                                                                 folder_view,
+                                                                 GTK_WIDGET (folder_view),
                                                                  dst_folder,
                                                                  MODEST_MAIN_WINDOW (parent_win));
 #ifdef MODEST_TOOLKIT_HILDON2
                } else if (MODEST_IS_FOLDER_WINDOW (parent_win)) {
-                       modest_ui_actions_on_folder_window_move_to (folder_view,
+                       /* Clean list to move used for filtering */
+                       modest_folder_view_set_list_to_move (folder_view, NULL);
+
+                       modest_ui_actions_on_folder_window_move_to (GTK_WIDGET (folder_view),
                                                                    dst_folder,
                                                                    helper->list,
                                                                    GTK_WINDOW (parent_win));
 #endif
                } else {
+                       /* if the user selected a root folder
+                          (account) then do not perform any action */
+                       if (TNY_IS_ACCOUNT (dst_folder)) {
+                               g_signal_stop_emission_by_name (dialog, "response");
+                               return;
+                       }
+
+                       /* Clean list to move used for filtering */
+                       modest_folder_view_set_list_to_move (folder_view, NULL);
+
                        /* Moving from headers window in edit mode */
                        modest_ui_actions_on_window_move_to (NULL, helper->list,
                                                             dst_folder, 
@@ -4914,7 +4955,8 @@ on_move_to_dialog_response (GtkDialog *dialog,
 
 static GtkWidget*
 create_move_to_dialog (GtkWindow *win,
-                      GtkWidget *folder_view)
+                      GtkWidget *folder_view,
+                      TnyList *list_to_move)
 {
        GtkWidget *dialog, *tree_view = NULL;
 
@@ -4983,6 +5025,8 @@ create_move_to_dialog (GtkWindow *win,
 
        /* Hide special folders */
        modest_folder_view_show_non_move_folders (MODEST_FOLDER_VIEW (tree_view), FALSE);
+       if (list_to_move)
+               modest_folder_view_set_list_to_move (MODEST_FOLDER_VIEW (tree_view), list_to_move);
 #ifndef MODEST_TOOLKIT_HILDON2
        modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
 #endif
@@ -5410,7 +5454,7 @@ xfer_messages_error_handler (ModestMailOperation *mail_op,
        win = modest_mail_operation_get_source (mail_op);
        error = modest_mail_operation_get_error (mail_op);
 
-       if (error && is_memory_full_error ((GError *) error))
+       if (error && is_memory_full_error ((GError *) error, mail_op))
                modest_platform_information_banner ((GtkWidget *) win,
                                                    NULL, _KR("cerm_device_memory_full"));
        else
@@ -5844,7 +5888,7 @@ modest_ui_actions_on_edit_mode_move_to (ModestWindow *win)
        }
 
        /* Create and run the dialog */
-       dialog = create_move_to_dialog (GTK_WINDOW (win), NULL);
+       dialog = create_move_to_dialog (GTK_WINDOW (win), NULL, list_to_move);
        modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), 
                                     GTK_WINDOW (dialog), 
                                     (GtkWindow *) win);
@@ -6303,7 +6347,7 @@ on_send_receive_finished (ModestMailOperation  *mail_op,
 }
 
 
-void 
+void
 modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self, 
                                                TnyHeader *header, 
                                                TnyMsg *msg, 
@@ -6311,8 +6355,9 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
                                                gpointer user_data)
 {
        const gchar* server_name = NULL;
-       TnyTransportAccount *server_account;
+       TnyTransportAccount *transport;
        gchar *message = NULL;
+       ModestProtocol *protocol;
 
        /* Don't show anything if the user cancelled something or the
         * send receive request is not interactive. Authentication
@@ -6324,35 +6369,61 @@ modest_ui_actions_on_send_queue_error_happened (TnySendQueue *self,
                return;
 
 
-       /* Get the server name: */
-       server_account = 
-               TNY_TRANSPORT_ACCOUNT (tny_camel_send_queue_get_transport_account (TNY_CAMEL_SEND_QUEUE (self)));
-       if (server_account)
-               server_name = tny_account_get_hostname (TNY_ACCOUNT (server_account));          
-       else
-               g_return_if_reached ();
+       /* Get the server name. Note that we could be using a
+          connection specific transport account */
+       transport = (TnyTransportAccount *)
+               tny_camel_send_queue_get_transport_account (TNY_CAMEL_SEND_QUEUE (self));
+       if (transport) {
+               ModestTnyAccountStore *acc_store;
+               const gchar *acc_name;
+               TnyTransportAccount *conn_specific;
+
+               acc_store = modest_runtime_get_account_store();
+               acc_name = modest_tny_account_get_parent_modest_account_name_for_server_account (TNY_ACCOUNT (transport));
+               conn_specific = (TnyTransportAccount *)
+                       modest_tny_account_store_get_transport_account_for_open_connection (acc_store, acc_name);
+               if (conn_specific) {
+                       server_name = tny_account_get_hostname (TNY_ACCOUNT (conn_specific));
+                       g_object_unref (conn_specific);
+               } else {
+                       server_name = tny_account_get_hostname (TNY_ACCOUNT (transport));
+               }
+               g_object_unref (transport);
+       }
+
+       /* Get protocol */
+       protocol = modest_protocol_registry_get_protocol_by_name (modest_runtime_get_protocol_registry (),
+                                                                 MODEST_PROTOCOL_REGISTRY_TRANSPORT_STORE_PROTOCOLS,
+                                                                 tny_account_get_proto (TNY_ACCOUNT (transport)));
+       if (!protocol) {
+               g_warning ("%s: Account with no proto", __FUNCTION__);
+               return;
+       }
 
        /* Show the appropriate message text for the GError: */
        switch (err->code) {
        case TNY_SERVICE_ERROR_CONNECT:
-               message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
+               message = modest_protocol_get_translation (protocol,
+                                                          MODEST_PROTOCOL_TRANSLATION_ACCOUNT_CONNECTION_ERROR, 
+                                                          server_name);
                break;
        case TNY_SERVICE_ERROR_SEND:
                message = g_strdup (_CS("sfil_ib_unable_to_send"));
                break;
        case TNY_SERVICE_ERROR_UNAVAILABLE:
-               message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
+               message = modest_protocol_get_translation (protocol,
+                                                          MODEST_PROTOCOL_TRANSLATION_CONNECT_ERROR, 
+                                                          server_name);
                break;
        default:
                g_warning ("%s: unexpected ERROR %d",
                           __FUNCTION__, err->code);
                message = g_strdup (_CS("sfil_ib_unable_to_send"));
-               break;  
+               break;
        }
 
        modest_platform_run_information_dialog (NULL, message, FALSE);
        g_free (message);
-       g_object_unref (server_account);
 }
 
 void
@@ -6386,7 +6457,8 @@ modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue,
 #endif
 
        /* Get selected folder */
-       selected_folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
+       if (header_view)
+               selected_folder = modest_header_view_get_folder (MODEST_HEADER_VIEW (header_view));
        if (!selected_folder)
                return;
 
@@ -6489,6 +6561,9 @@ modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
                folder = TNY_FOLDER_STORE (tny_header_get_folder (header));
        }
 
+       if (!header || !folder)
+               goto frees;
+
        /* Get the account type */
        account = tny_folder_get_account (TNY_FOLDER (folder));
        proto = modest_tny_account_get_protocol_type (account);
@@ -6503,10 +6578,14 @@ modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
                msg = g_strdup_printf (_("mail_ni_ui_folder_get_msg_folder_error"));
        }
 
+ frees:
        /* Frees */
-       g_object_unref (account);
-       g_object_unref (folder);
-       g_object_unref (header);
+       if (account)
+               g_object_unref (account);
+       if (folder)
+               g_object_unref (folder);
+       if (header)
+               g_object_unref (header);
 
        return msg;
 }