* Fixes NB#85621, properly drag&drop multiple messages
[modest] / src / modest-ui-actions.c
index bf822fb..7712173 100644 (file)
@@ -733,7 +733,7 @@ modest_ui_actions_compose_msg(ModestWindow *win,
                body = use_signature ? g_strconcat("\n", signature, NULL) : g_strdup("");
        }
 
-       msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, body, NULL, NULL);
+       msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, body, NULL, NULL, NULL);
        if (!msg) {
                g_printerr ("modest: failed to create new msg\n");
                goto cleanup;
@@ -805,7 +805,8 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
 
                /* If it's a memory low issue, then show a banner */
                error = modest_mail_operation_get_error (mail_op);
-               if (error && error->code == MODEST_MAIL_OPERATION_ERROR_LOW_MEMORY) {
+               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"),
@@ -901,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!!");
@@ -1356,7 +1359,7 @@ open_msgs_from_headers (TnyList *headers, ModestWindow *win)
                        }
                }
        }
-       
+
        /* Register the headers before actually creating the windows: */
        iter_not_opened = tny_list_create_iterator (not_opened_headers);
        while (!tny_iterator_is_done (iter_not_opened)) {
@@ -2255,8 +2258,6 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
        if (!GTK_WIDGET_IS_SENSITIVE (open_widget))
                return;
 
-/*     headers = tny_simple_list_new (); */
-/*     tny_list_prepend (headers, G_OBJECT (header)); */
        headers = modest_header_view_get_selected_headers (header_view);
 
        open_msgs_from_headers (headers, MODEST_WINDOW (main_window));
@@ -2310,7 +2311,8 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
 
        /* Check if the operation failed due to memory low conditions */
        error = modest_mail_operation_get_error (mail_op);
-       if (error && error->code == MODEST_MAIL_OPERATION_ERROR_LOW_MEMORY) {
+       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);
@@ -3157,6 +3159,11 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
        case MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS:
                message = _CS("ckdg_ib_folder_already_exists");
                break;
+       case TNY_SERVICE_ERROR_STATE:
+               /* This means that the folder is already in use (a
+                  message is opened for example */
+               message = _("emev_ni_internal_error");
+               break;
        default:
                message = _("emev_ib_ui_imap_unable_to_rename");
        }
@@ -4685,6 +4692,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)
 {
@@ -4722,15 +4744,8 @@ move_to_cb (ModestMailOperation *mail_op,
                }
                g_object_unref (object);
         }
-
-       /* 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);
+       /* Destroy the helper */
+       move_to_helper_destroyer (helper);
 }
 
 static void
@@ -5017,7 +5032,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 */
@@ -5029,8 +5044,14 @@ xfer_messages_error_handler (ModestMailOperation *mail_op,
                if (win)
                        g_object_unref (win);
        }
+       move_to_helper_destroyer (user_data);
 }
 
+typedef struct {
+       TnyFolderStore *dst_folder;
+       TnyList *headers;
+} XferMsgsHelper;
+
 /**
  * Utility function that transfer messages from both the main window
  * and the msg view window when using the "Move to" dialog
@@ -5042,12 +5063,15 @@ xfer_messages_performer  (gboolean canceled,
                          TnyAccount *account, 
                          gpointer user_data)
 {
-       TnyFolderStore *dst_folder = TNY_FOLDER_STORE (user_data);
        ModestWindow *win = MODEST_WINDOW (parent_window);
-       TnyList *headers = NULL;
        TnyAccount *dst_account = NULL;
        const gchar *proto_str = NULL;
        gboolean dst_is_pop = FALSE;
+       XferMsgsHelper *helper;
+       MoveToHelper *movehelper;
+       ModestMailOperation *mail_op;
+
+       helper = (XferMsgsHelper *) user_data;
 
        if (canceled)
                goto end;
@@ -5064,7 +5088,7 @@ xfer_messages_performer  (gboolean canceled,
                goto end;
        }
 
-       dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
+       dst_account = tny_folder_get_account (TNY_FOLDER (helper->dst_folder));
        proto_str = tny_account_get_proto (dst_account);
 
        /* tinymail will return NULL for local folders it seems */
@@ -5074,56 +5098,49 @@ xfer_messages_performer  (gboolean canceled,
 
        g_object_unref (dst_account);
 
-       /* Get selected headers */
-       headers = get_selected_headers (MODEST_WINDOW (win));
-       if (!headers) {
-               g_warning ("%s: no headers selected", __FUNCTION__);
-               goto end;
-       }
-
        if (dst_is_pop) {
                modest_platform_information_banner (GTK_WIDGET (win),
                                                    NULL,
                                                    ngettext("mail_in_ui_folder_move_target_error",
                                                             "mail_in_ui_folder_move_targets_error",
-                                                            tny_list_get_length (headers)));
-               g_object_unref (headers);
+                                                            tny_list_get_length (helper->headers)));
                goto end;
        }
 
-       MoveToHelper *helper = g_new0 (MoveToHelper, 1);
-       helper->banner = modest_platform_animation_banner (GTK_WIDGET (win), NULL,
-                                                          _CS("ckct_nw_pasting"));
-       if (helper->banner != NULL)  {
-               g_object_ref (helper->banner);
-               gtk_widget_show (GTK_WIDGET(helper->banner));
+       movehelper = g_new0 (MoveToHelper, 1);
+       movehelper->banner = modest_platform_animation_banner (GTK_WIDGET (win), NULL,
+                                                              _CS("ckct_nw_pasting"));
+       if (movehelper->banner != NULL)  {
+               g_object_ref (movehelper->banner);
+               gtk_widget_show (GTK_WIDGET (movehelper->banner));
        }
 
        if (MODEST_IS_MAIN_WINDOW (win)) {
                GtkWidget *header_view = 
                        modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
                                                             MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
-               helper->reference = get_next_after_selected_headers (MODEST_HEADER_VIEW (header_view));
+               movehelper->reference = get_next_after_selected_headers (MODEST_HEADER_VIEW (header_view));
        }
 
-       ModestMailOperation *mail_op = 
-               modest_mail_operation_new_with_error_handling (G_OBJECT(win),
-                                                              xfer_messages_error_handler,
-                                                              NULL, NULL);
+       /* Perform the mail operation */
+       mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(win),
+                                                                xfer_messages_error_handler,
+                                                                movehelper, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
                                         mail_op);
 
        modest_mail_operation_xfer_msgs (mail_op, 
-                                        headers,
-                                        TNY_FOLDER (dst_folder),
+                                        helper->headers,
+                                        TNY_FOLDER (helper->dst_folder),
                                         TRUE,
                                         msgs_move_to_cb,
-                                        helper);
+                                        movehelper);
 
        g_object_unref (G_OBJECT (mail_op));
-       g_object_unref (headers);
  end:
-       g_object_unref (dst_folder);
+       g_object_unref (helper->dst_folder);
+       g_object_unref (helper->headers);
+       g_slice_free (XferMsgsHelper, helper);
 }
 
 typedef struct {
@@ -5285,6 +5302,7 @@ modest_ui_actions_transfer_messages_helper (GtkWindow *win,
 {
        gboolean need_connection = TRUE;
        gboolean do_xfer = TRUE;
+       XferMsgsHelper *helper;
        
        modest_ui_actions_xfer_messages_check (win, TNY_FOLDER_STORE (src_folder), 
                                               headers, TNY_FOLDER (dst_folder),
@@ -5295,11 +5313,16 @@ modest_ui_actions_transfer_messages_helper (GtkWindow *win,
        if (!do_xfer)
                return;
 
+       /* Create the helper */
+       helper = g_slice_new (XferMsgsHelper);
+       helper->dst_folder = g_object_ref (dst_folder);
+       helper->headers = g_object_ref (headers);
+
        if (need_connection) {
                DoubleConnectionInfo *connect_info = g_slice_new (DoubleConnectionInfo);
                connect_info->callback = xfer_messages_performer;
                connect_info->dst_account = tny_folder_get_account (TNY_FOLDER (dst_folder));
-               connect_info->data = g_object_ref (dst_folder);
+               connect_info->data = helper;
                
                modest_platform_double_connect_and_perform(GTK_WINDOW (win), TRUE,
                                                           TNY_FOLDER_STORE (src_folder), 
@@ -5307,7 +5330,7 @@ modest_ui_actions_transfer_messages_helper (GtkWindow *win,
        } else {
                TnyAccount *src_account = get_account_from_folder_store (TNY_FOLDER_STORE (src_folder));
                xfer_messages_performer (FALSE, NULL, GTK_WINDOW (win),
-                                        src_account, g_object_ref (dst_folder));
+                                        src_account, helper);
                g_object_unref (src_account);
        }
 }