Fixes NB#137624, crash when creating a new folder in offline mode
[modest] / src / modest-ui-actions.c
index df873dd..8e4185b 100644 (file)
@@ -521,7 +521,6 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
 
 
        if (response == GTK_RESPONSE_OK) {
-               ModestWindow *main_window = NULL;
                ModestWindowMgr *mgr = NULL;
                GtkTreeModel *model = NULL;
                GtkTreeSelection *sel = NULL;
@@ -552,7 +551,7 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
                }
 
                /* Disable window dimming management */
-               modest_window_disable_dimming (MODEST_WINDOW(win));
+               modest_window_disable_dimming (win);
 
                /* Remove each header. If it's a view window header_view == NULL */
                mail_op = modest_mail_operation_new ((GObject *) win);
@@ -565,18 +564,14 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
                if (sel != NULL) {
                        gtk_tree_selection_unselect_all (sel);
                }
-               modest_window_enable_dimming (MODEST_WINDOW(win));
+               modest_window_enable_dimming (win);
 
                if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
                        modest_ui_actions_refresh_message_window_after_delete (MODEST_MSG_VIEW_WINDOW (win));
 
                        /* Get main window */
                        mgr = modest_runtime_get_window_mgr ();
-                       main_window = modest_window_mgr_get_main_window (mgr, FALSE); /* don't create */
                } else if (MODEST_IS_MAIN_WINDOW (win)) {
-                       /* Move cursor to next row */
-                       main_window = win;
-
                        /* Select next or previous row */
                        if (gtk_tree_row_reference_valid (next_row_reference)) {
                                gtk_tree_selection_select_path (sel, next_path);
@@ -597,10 +592,8 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win)
                }
 
                /* Update toolbar dimming state */
-               if (main_window) {
-                       modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
-                       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
-               }
+               modest_ui_actions_check_menu_dimming_rules (win);
+               modest_ui_actions_check_toolbar_dimming_rules (win);
 
                /* Free */
                g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
@@ -707,12 +700,8 @@ modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
        clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
        selection = gtk_clipboard_wait_for_text (clipboard);
 
-       /* Question: why is the clipboard being used here?
-        * It doesn't really make a lot of sense. */
-
-       if (selection)
-       {
-               modest_address_book_add_address (selection);
+       if (selection) {
+               modest_address_book_add_address (selection, (GtkWindow *) win);
                g_free (selection);
        }
 }
@@ -863,7 +852,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
                modest_platform_run_information_dialog (
                        GTK_WINDOW(win),
-                       _FM("sfil_ib_opening_not_allowed"),
+                       _("mail_ib_error_attachment_size"),
                        TRUE);
                return;
        }
@@ -905,9 +894,12 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        signature = modest_account_mgr_get_signature_from_recipient (mgr, recipient, &use_signature);
        g_free (recipient);
        if (body_str != NULL) {
-               body = use_signature ? g_strconcat(body_str, "\n--\n", signature, NULL) : g_strdup(body_str);
+               body = use_signature ? g_strconcat(body_str, "\n",
+                                                  MODEST_TEXT_UTILS_SIGNATURE_MARKER,
+                                                  "\n", signature, NULL) : g_strdup(body_str);
        } else {
-               body = use_signature ? g_strconcat("\n--\n", signature, NULL) : g_strdup("");
+               body = use_signature ? g_strconcat("\n", MODEST_TEXT_UTILS_SIGNATURE_MARKER,
+                                                  "\n", signature, NULL) : g_strdup("");
        }
 
        msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, NULL, NULL, body, NULL, NULL, NULL);
@@ -998,18 +990,27 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
                              error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE)) {
                        gchar *subject, *msg, *format = NULL;
                        TnyAccount *account;
-                       subject = tny_header_dup_subject (header);
+
+                       subject = (header) ? tny_header_dup_subject (header) : NULL;
                        if (!subject)
                                subject = g_strdup (_("mail_va_no_subject"));
 
                        account = modest_mail_operation_get_account (mail_op);
                        if (account) {
-                               ModestProtocol *protocol;
-                               ModestProtocolType proto;
-                               proto = modest_tny_account_get_protocol_type (account);
-                               protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (), proto);
-                               if (protocol)
-                                 format = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
+                               ModestProtocolType proto = modest_tny_account_get_protocol_type (account);
+                               ModestProtocol *protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (), proto);
+
+                               if (protocol) {
+                                       if (tny_account_get_connection_status (account) ==
+                                           TNY_CONNECTION_STATUS_CONNECTED) {
+                                               format = modest_protocol_get_translation (protocol,
+                                                                                         MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE,
+                                                                                         subject);
+                                       } else {
+                                               format = g_strdup_printf (_("mail_ib_backend_server_invalid"),
+                                                                         tny_account_get_hostname (account));
+                                       }
+                               }
                                g_object_unref (account);
                        }
 
@@ -1042,6 +1043,7 @@ typedef struct {
 typedef struct {
        GtkTreeModel *model;
        TnyHeader *header;
+       ModestWindow *caller_window;
        OpenMsgBannerInfo *banner_info;
        GtkTreeRowReference *rowref;
 } OpenMsgHelper;
@@ -1346,10 +1348,22 @@ get_account_from_header (TnyHeader *header)
 }
 
 static void
+caller_win_destroyed (OpenMsgHelper *helper, GObject *object)
+{
+       if (helper->caller_window)
+               helper->caller_window = NULL;
+}
+
+static void
 open_msg_helper_destroyer (gpointer user_data)
 {
        OpenMsgHelper *helper = (OpenMsgHelper *) user_data;
 
+       if (helper->caller_window) {
+               g_object_weak_unref ((GObject *) helper->caller_window, (GWeakNotify) caller_win_destroyed, helper);
+               helper->caller_window = NULL;
+       }
+
        if (helper->banner_info) {
                g_free (helper->banner_info->message);
                if (helper->banner_info->idle_handler > 0) {
@@ -1389,7 +1403,7 @@ open_msg_performer(gboolean canceled,
        helper = (OpenMsgHelper *) user_data;
 
        status = tny_account_get_connection_status (account);
-       if (err || canceled) {
+       if (err || canceled || helper->caller_window == NULL) {
                modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), helper->header);
                /* Free the helper */
                open_msg_helper_destroyer (helper);
@@ -1530,7 +1544,7 @@ open_msg_from_header (TnyHeader *header, GtkTreeRowReference *rowref, ModestWind
        OpenMsgHelper *helper;
        ModestWindow *window;
 
-       g_return_if_fail (header != NULL && rowref != NULL);
+       g_return_if_fail (header != NULL && rowref != NULL && gtk_tree_row_reference_valid (rowref));
 
        mgr = modest_runtime_get_window_mgr ();
 
@@ -1588,6 +1602,8 @@ open_msg_from_header (TnyHeader *header, GtkTreeRowReference *rowref, ModestWind
           (the user could switch between folders) */
        helper = g_slice_new (OpenMsgHelper);
        helper->model = g_object_ref (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)));
+       helper->caller_window = win;
+       g_object_weak_ref ((GObject *) helper->caller_window, (GWeakNotify) caller_win_destroyed, helper);
        helper->header = g_object_ref (header);
        helper->rowref = gtk_tree_row_reference_copy (rowref);
        helper->banner_info = NULL;
@@ -1741,20 +1757,27 @@ reply_forward_cb (ModestMailOperation *mail_op,
 
        /* Create reply mail */
        switch (rf_helper->action) {
+               /* Use the msg_header to ensure that we have all the
+                  information. The summary can lack some data */
+               TnyHeader *msg_header;
        case ACTION_REPLY:
+               msg_header = tny_msg_get_header (msg);
                new_msg =
-                       modest_tny_msg_create_reply_msg (msg, header, from,
+                       modest_tny_msg_create_reply_msg (msg, msg_header, from,
                                                         (use_signature) ? signature : NULL,
                                                         rf_helper->reply_forward_type,
                                                         MODEST_TNY_MSG_REPLY_MODE_SENDER);
+               g_object_unref (msg_header);
                break;
        case ACTION_REPLY_TO_ALL:
+               msg_header = tny_msg_get_header (msg);
                new_msg =
-                       modest_tny_msg_create_reply_msg (msg, header, from,
+                       modest_tny_msg_create_reply_msg (msg, msg_header, from,
                                                         (use_signature) ? signature : NULL,
                                                         rf_helper->reply_forward_type,
                                                         MODEST_TNY_MSG_REPLY_MODE_ALL);
                edit_type = MODEST_EDIT_TYPE_REPLY;
+               g_object_unref (msg_header);
                break;
        case ACTION_FORWARD:
                new_msg =
@@ -1905,7 +1928,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win)
        ReplyForwardHelper *rf_helper = NULL;
        guint reply_forward_type;
 
-       g_return_if_fail (MODEST_IS_WINDOW(win));
+       g_return_if_fail (win && 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 */
@@ -2025,7 +2048,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win)
                        if (folder)
                                g_object_unref (folder);
                } else {
-                       reply_forward_cb (NULL, header, FALSE, NULL, NULL, rf_helper);
+                       reply_forward_cb (NULL, header, FALSE, NULL, NULL, NULL);
                }
                /* Frees */
                g_object_unref (header_list);
@@ -2128,18 +2151,50 @@ modest_ui_actions_on_sort (GtkAction *action,
        modest_utils_run_sort_dialog (GTK_WINDOW (window), MODEST_SORT_HEADERS);
 }
 
+static gboolean
+idle_refresh_folder (gpointer source)
+{
+       ModestHeaderView *header_view = NULL;
+
+       /* If the window still exists */
+       if (!GTK_IS_WIDGET (source) ||
+           !GTK_WIDGET_VISIBLE (source))
+               return FALSE;
+
+       /* Refresh the current view */
+#ifdef MODEST_TOOLKIT_HILDON2
+       if (MODEST_IS_HEADER_WINDOW (source))
+               header_view = modest_header_window_get_header_view ((ModestHeaderWindow *) source);
+#else
+       if (MODEST_IS_MAIN_WINDOW (source))
+               header_view = modest_main_window_get_child_widget ((ModestMainWindow *) source,
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
+#endif
+       if (header_view) {
+               TnyFolder *folder = modest_header_view_get_folder (header_view);
+               if (folder) {
+                       /* We must clear first, because otherwise set_folder will ignore
+                          the change as the folders are the same */
+                       modest_header_view_clear (header_view);
+                       modest_header_view_set_folder (header_view, folder, TRUE,
+                                                      (ModestWindow *) source, NULL, NULL);
+                       g_object_unref (folder);
+               }
+       }
+
+       return FALSE;
+}
+
 static void
-new_messages_arrived (ModestMailOperation *self,
-                     TnyList *new_headers,
-                     gpointer user_data)
+update_account_cb (ModestMailOperation *self,
+                  TnyList *new_headers,
+                  gpointer user_data)
 {
        GObject *source;
        gboolean show_visual_notifications;
 
        source = modest_mail_operation_get_source (self);
        show_visual_notifications = (source) ? FALSE : TRUE;
-       if (source)
-               g_object_unref (source);
 
        /* Notify new messages have been downloaded. If the
           send&receive was invoked by the user then do not show any
@@ -2160,7 +2215,12 @@ new_messages_arrived (ModestMailOperation *self,
                        flags = tny_header_get_flags (header);
 
                        if (!(flags & TNY_HEADER_FLAG_SEEN)) {
-                               tny_list_append (actually_new_list, G_OBJECT (header));
+                               /* Messages are ordered from most
+                                  recent to oldest. But we want to
+                                  show notifications starting from
+                                  the oldest message. That's why we
+                                  reverse the list */
+                               tny_list_prepend (actually_new_list, G_OBJECT (header));
                        }
                        g_object_unref (header);
                }
@@ -2182,29 +2242,16 @@ new_messages_arrived (ModestMailOperation *self,
                g_object_unref (actually_new_list);
        }
 
-}
-
-gboolean
-retrieve_all_messages_cb (GObject *source,
-                         guint num_msgs,
-                         guint retrieve_limit)
-{
-       GtkWindow *window;
-       gchar *msg;
-       gint response;
-
-       window = GTK_WINDOW (source);
-       msg = g_strdup_printf (_("mail_nc_msg_count_limit_exceeded"),
-                              num_msgs, retrieve_limit);
-
-       /* Ask the user if they want to retrieve all the messages */
-       response =
-               modest_platform_run_confirmation_dialog_with_buttons (window, msg,
-                                                                     _("mcen_bd_get_all"),
-                                                                     _("mcen_bd_newest_only"));
-       /* Free and return */
-       g_free (msg);
-       return (response == GTK_RESPONSE_ACCEPT) ? TRUE : FALSE;
+       if (source) {
+               /* Refresh the current folder in an idle. We do this
+                  in order to avoid refresh cancelations if the
+                  currently viewed folder is the inbox */
+               g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
+                                idle_refresh_folder,
+                                g_object_ref (source),
+                                g_object_unref);
+               g_object_unref (source);
+       }
 }
 
 typedef struct {
@@ -2252,8 +2299,7 @@ do_send_receive_performer (gboolean canceled,
 
        /* Send & receive. */
        modest_mail_operation_update_account (info->mail_op, info->account_name, info->poke_status, info->interactive,
-                                             (info->win) ? retrieve_all_messages_cb : NULL,
-                                             new_messages_arrived, info->win);
+                                             update_account_cb, info->win);
 
  clean:
        /* Frees */
@@ -2294,7 +2340,7 @@ modest_ui_actions_do_send_receive (const gchar *account_name,
                if (!acc_name)
                        acc_name  = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
                if (!acc_name) {
-                       g_printerr ("modest: cannot get default account\n");
+                       modest_platform_information_banner (NULL, NULL, _("emev_ni_internal_error"));
                        return;
                }
        } else {
@@ -2304,6 +2350,12 @@ modest_ui_actions_do_send_receive (const gchar *account_name,
        acc_store = modest_runtime_get_account_store ();
        account = modest_tny_account_store_get_server_account (acc_store, acc_name, TNY_ACCOUNT_TYPE_STORE);
 
+       if (!account) {
+               g_free (acc_name);
+               modest_platform_information_banner (NULL, NULL, _("emev_ni_internal_error"));
+               return;
+       }
+
        /* Do not automatically refresh accounts that are flagged as
           NO_AUTO_UPDATE. This could be useful for accounts that
           handle their own update times */
@@ -2926,7 +2978,7 @@ enough_space_for_message (ModestMsgEditWindow *edit_window,
        if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
                modest_platform_run_information_dialog (
                        GTK_WINDOW(edit_window),
-                       _FM("sfil_ib_opening_not_allowed"),
+                       _("mail_ib_error_attachment_size"),
                        TRUE);
                return FALSE;
        }
@@ -3361,7 +3413,7 @@ do_create_folder_cb (ModestMailOperation *mail_op,
 
        error = modest_mail_operation_get_error (mail_op);
        if (error) {
-               gboolean disk_full;
+               gboolean disk_full = FALSE;
                TnyAccount *account;
                /* Show an error. If there was some problem writing to
                   disk, show it, otherwise show the generic folder
@@ -3430,18 +3482,14 @@ do_create_folder_performer (gboolean canceled,
        ModestMailOperation *mail_op;
 
        if (canceled || err) {
-               TnyAccount *account = modest_mail_operation_get_account (mail_op);
                /* In disk full conditions we could get this error here */
                modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(),
                                                                (GtkWidget *) parent_window, err,
-                                                               account,
-                                                               _("mail_in_ui_folder_create_error_memory"));
-               if (account)
-                       g_object_unref (account);
+                                                               NULL, _("mail_in_ui_folder_create_error_memory"));
 
                /* This happens if we have selected the outbox folder
                   as the parent */
-               if (err->code == TNY_SERVICE_ERROR_UNKNOWN &&
+               if (err && err->code == TNY_SERVICE_ERROR_UNKNOWN &&
                    TNY_IS_MERGE_FOLDER (helper->parent)) {
                        /* Show an error and retry */
                        modest_platform_information_banner ((GtkWidget *) parent_window,
@@ -3816,8 +3864,8 @@ on_delete_folder_cb (gboolean canceled,
 
        modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view));
 
-       g_object_unref (G_OBJECT (mail_op));
-       g_object_unref (G_OBJECT (info->folder));
+       g_object_unref (mail_op);
+       g_object_unref (info->folder);
        g_free (info);
 }
 
@@ -3867,22 +3915,23 @@ delete_folder (ModestWindow *window, gboolean move_to_trash)
        g_free (message);
 
        if (response == GTK_RESPONSE_OK) {
-               DeleteFolderInfo *info;
+               TnyAccount *account = NULL;
+               DeleteFolderInfo *info = NULL;
                info = g_new0(DeleteFolderInfo, 1);
-               info->folder = folder;
+               info->folder = g_object_ref (folder);
                info->move_to_trash = move_to_trash;
-               g_object_ref (G_OBJECT (info->folder));
-               TnyAccount *account = tny_folder_get_account (TNY_FOLDER (folder));
+
+               account = tny_folder_get_account (TNY_FOLDER (folder));
                modest_platform_connect_if_remote_and_perform (GTK_WINDOW (window),
                                                               TRUE,
                                                               TNY_FOLDER_STORE (account),
                                                               on_delete_folder_cb, info);
                g_object_unref (account);
+               g_object_unref (folder);
                return TRUE;
        } else {
                return FALSE;
        }
-       g_object_unref (G_OBJECT (folder));
 }
 
 void
@@ -4795,6 +4844,16 @@ modest_ui_actions_on_details (GtkAction *action,
 }
 
 void
+modest_ui_actions_on_limit_error (GtkAction *action,
+                                 ModestWindow *win)
+{
+       g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win));
+
+       modest_platform_information_banner ((GtkWidget *) win, NULL, _CS("ckdg_ib_maximum_characters_reached"));
+
+}
+
+void
 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
                                     ModestMsgEditWindow *window)
 {
@@ -5051,7 +5110,6 @@ on_move_to_dialog_response (GtkDialog *dialog,
        parent_win = (GtkWidget *) helper->win;
        folder_view = MODEST_FOLDER_VIEW (g_object_get_data (G_OBJECT (dialog),
                                                             MODEST_MOVE_TO_DIALOG_FOLDER_VIEW));
-
        switch (response) {
                TnyFolderStore *dst_folder;
                TnyFolderStore *selected;
@@ -5169,8 +5227,8 @@ create_move_to_dialog (GtkWindow *win,
 
                modest_folder_view_set_style (MODEST_FOLDER_VIEW (tree_view),
                                              MODEST_FOLDER_VIEW_STYLE_SHOW_ALL);
-               modest_folder_view_update_model (MODEST_FOLDER_VIEW (tree_view),
-                                                TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()));
+               /* modest_folder_view_update_model (MODEST_FOLDER_VIEW (tree_view), */
+               /*                               TNY_ACCOUNT_STORE (modest_runtime_get_account_store ())); */
 
                active_account_name = modest_window_get_active_account (MODEST_WINDOW (win));
                mgr = modest_runtime_get_account_mgr ();
@@ -5367,7 +5425,7 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
 {
        GObject *win = NULL;
        const GError *error;
-       TnyAccount *account;
+       TnyAccount *account = NULL;
 
 #ifndef MODEST_TOOLKIT_HILDON2
        ModestWindow *main_window = NULL;
@@ -5392,7 +5450,11 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
 #endif
        win = modest_mail_operation_get_source (mail_op);
        error = modest_mail_operation_get_error (mail_op);
-       account = modest_mail_operation_get_account (mail_op);
+
+       if (TNY_IS_FOLDER (user_data))
+               account = modest_tny_folder_get_account (TNY_FOLDER (user_data));
+       else if (TNY_IS_ACCOUNT (user_data))
+               account = g_object_ref (user_data);
 
        /* If it's not a disk full error then show a generic error */
        if (!modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(),
@@ -5639,20 +5701,20 @@ xfer_messages_error_handler (ModestMailOperation *mail_op,
 
        win = modest_mail_operation_get_source (mail_op);
        error = modest_mail_operation_get_error (mail_op);
-       account = modest_mail_operation_get_account (mail_op);
 
-       if (error && modest_tny_account_store_is_disk_full_error (modest_runtime_get_account_store(),
-                                                                 (GError *) error, account)) {
-               gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), "");
-               modest_platform_information_banner ((GtkWidget *) win, NULL, msg);
-               g_free (msg);
-       } else {
+       /* We cannot get the account from the mail op as that is the
+          source account and for checking memory full conditions we
+          need the destination one */
+       account = TNY_ACCOUNT (user_data);
+
+       if (error &&
+           !modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(),
+                                                            (GtkWidget *) win, (GError*) error,
+                                                            account, _KR("cerm_memory_card_full"))) {
                modest_platform_run_information_dialog ((GtkWindow *) win,
                                                        _("mail_in_ui_folder_move_target_error"),
                                                        FALSE);
        }
-       if (account)
-               g_object_unref (account);
        if (win)
                g_object_unref (win);
 }
@@ -5697,8 +5759,7 @@ xfer_messages_performer  (gboolean canceled,
        /* tinymail will return NULL for local folders it seems */
        dst_forbids_message_add = modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
                                                                                  modest_tny_account_get_protocol_type (dst_account),
-                                                                                 MODEST_PROTOCOL_REGISTRY_STORE_FORBID_MESSAGE_ADD);
-       g_object_unref (dst_account);
+                                                                                 MODEST_PROTOCOL_REGISTRY_STORE_FORBID_INCOMING_XFERS);
 
        if (dst_forbids_message_add) {
                modest_platform_information_banner (GTK_WIDGET (win),
@@ -5730,7 +5791,8 @@ xfer_messages_performer  (gboolean canceled,
        /* Perform the mail operation */
        mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(win),
                                                                 xfer_messages_error_handler,
-                                                                movehelper, NULL);
+                                                                g_object_ref (dst_account),
+                                                                g_object_unref);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                         mail_op);
 
@@ -5743,6 +5805,8 @@ xfer_messages_performer  (gboolean canceled,
 
        g_object_unref (G_OBJECT (mail_op));
  end:
+       if (dst_account)
+               g_object_unref (dst_account);
        g_object_unref (helper->dst_folder);
        g_object_unref (helper->headers);
        g_slice_free (XferMsgsHelper, helper);
@@ -5805,15 +5869,10 @@ on_move_folder_cb (gboolean canceled,
 
        mail_op =
                modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window),
-                               modest_ui_actions_move_folder_error_handler,
-                               info->src_folder, NULL);
+                                                              modest_ui_actions_move_folder_error_handler,
+                                                              g_object_ref (info->dst_folder), g_object_unref);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
-                       mail_op);
-
-       /* Select *after* the changes */
-       /* TODO: this function hangs UI after transfer */
-       /*                      modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), */
-       /*                                                        TNY_FOLDER (src_folder), TRUE); */
+                                        mail_op);
 
        if (MODEST_IS_MAIN_WINDOW (parent_window)) {
                modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view),
@@ -6844,8 +6903,15 @@ modest_ui_actions_on_delete_account (GtkWindow *parent_window,
                g_free (default_account_name);
 
                removed = modest_account_mgr_remove_account (account_mgr, account_name);
-               if (!removed)
+               if (removed) {
+                       /* Close all email notifications, we cannot
+                          distinguish if the notification belongs to
+                          this account or not, so for safety reasons
+                          we remove them all */
+                       modest_platform_remove_new_mail_notifications (FALSE);
+               } else {
                        g_warning ("%s: modest_account_mgr_remove_account() failed.\n", __FUNCTION__);
+               }
        }
        return removed;
 }
@@ -6897,3 +6963,89 @@ modest_ui_actions_on_reload_message (const gchar *msg_id)
 
        modest_msg_view_window_reload (MODEST_MSG_VIEW_WINDOW (window));
 }
+
+/** Check whether any connections are active, and cancel them if 
+ * the user wishes.
+ * Returns TRUE is there was no problem, 
+ * or if an operation was cancelled so we can continue.
+ * Returns FALSE if the user chose to cancel his request instead.
+ */
+
+gboolean
+modest_ui_actions_check_for_active_account (ModestWindow *self,
+                                           const gchar* account_name)
+{
+       ModestTnySendQueue *send_queue;
+       ModestTnyAccountStore *acc_store;
+       ModestMailOperationQueue* queue;
+       TnyConnectionStatus store_conn_status;
+       TnyAccount *store_account = NULL, *transport_account = NULL;
+       gboolean retval = TRUE, sending = FALSE;
+
+       acc_store = modest_runtime_get_account_store ();
+       queue = modest_runtime_get_mail_operation_queue ();
+
+       store_account = 
+               modest_tny_account_store_get_server_account (acc_store,
+                                                            account_name,
+                                                            TNY_ACCOUNT_TYPE_STORE);
+
+       /* This could happen if the account was deleted before the
+          call to this function */
+       if (!store_account)
+               return FALSE;
+
+       transport_account = 
+               modest_tny_account_store_get_server_account (acc_store,
+                                                            account_name,
+                                                            TNY_ACCOUNT_TYPE_TRANSPORT);
+
+       /* This could happen if the account was deleted before the
+          call to this function */
+       if (!transport_account) {
+               g_object_unref (store_account);
+               return FALSE;
+       }
+
+       /* If the transport account was not used yet, then the send
+          queue could not exist (it's created on demand) */
+       send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT (transport_account), FALSE);
+       if (TNY_IS_SEND_QUEUE (send_queue))
+               sending = modest_tny_send_queue_sending_in_progress (send_queue);
+
+       store_conn_status = tny_account_get_connection_status (store_account);
+       if (store_conn_status == TNY_CONNECTION_STATUS_CONNECTED || sending) {
+               gint response;
+
+               response = modest_platform_run_confirmation_dialog (GTK_WINDOW (self), 
+                                                               _("emev_nc_disconnect_account"));
+               if (response == GTK_RESPONSE_OK) {
+                       retval = TRUE;
+               } else {
+                       retval = FALSE;
+               }
+       }
+
+       if (retval) {
+
+               /* FIXME: We should only cancel those of this account */
+               modest_mail_operation_queue_cancel_all (queue);
+
+               /* Also disconnect the account */
+               if ((tny_account_get_connection_status (store_account) != TNY_CONNECTION_STATUS_DISCONNECTED) &&
+                   (tny_account_get_connection_status (store_account) != TNY_CONNECTION_STATUS_DISCONNECTED_BROKEN)) {
+                       tny_camel_account_set_online (TNY_CAMEL_ACCOUNT (store_account),
+                                                     FALSE, NULL, NULL);
+               }
+               if (sending) {
+                       tny_camel_account_set_online (TNY_CAMEL_ACCOUNT (transport_account),
+                                                     FALSE, NULL, NULL);
+               }
+       }
+               
+       /* Frees */
+       g_object_unref (store_account);
+       g_object_unref (transport_account);
+       
+       return retval;
+}