* Fixes NB#90942, fixes a crash when moving a deleted message
[modest] / src / modest-ui-actions.c
index d1486e0..1f42f68 100644 (file)
@@ -447,6 +447,8 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
                if (header) {
                        gchar *subject;
                        subject = tny_header_dup_subject (header);
+                       if (!subject)
+                               subject = g_strdup (_("mail_va_no_subject"));
                        desc = g_strdup_printf ("%s", subject); 
                        g_free (subject);
                        g_object_unref (header);
@@ -528,11 +530,11 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
                        }
 
                        /* Free */
-                       if (next_row_reference != NULL) 
+                       if (gtk_tree_row_reference_valid (next_row_reference)) 
                                gtk_tree_row_reference_free (next_row_reference);
                        if (next_path != NULL) 
                                gtk_tree_path_free (next_path);                         
-                       if (prev_row_reference != NULL) 
+                       if (gtk_tree_row_reference_valid (prev_row_reference)) 
                                gtk_tree_row_reference_free (prev_row_reference);
                        if (prev_path != NULL) 
                                gtk_tree_path_free (prev_path);
@@ -760,7 +762,10 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        allowed_size = MODEST_MAX_ATTACHMENT_SIZE;
        msg_win = modest_msg_edit_window_new (msg, account_name, FALSE);
 
-       modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win, NULL);
+       if (!modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win, NULL)) {
+               gtk_widget_destroy (GTK_WIDGET (msg_win));
+               goto cleanup;
+       }
        modest_msg_edit_window_set_modified (MODEST_MSG_EDIT_WINDOW (msg_win), set_as_modified);
        gtk_widget_show_all (GTK_WIDGET (msg_win));
 
@@ -827,6 +832,19 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op,
                        g_object_unref (source);
                }
 
+               if (error && ((error->code == TNY_SERVICE_ERROR_NO_SUCH_MESSAGE) ||
+                             error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE)) {
+                       gchar *subject, *msg;
+                       subject = tny_header_dup_subject (header);
+                       if (!subject)
+                               subject = g_strdup (_("mail_va_no_subject"));;
+                       msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"),
+                                              subject);
+                       modest_platform_run_information_dialog (NULL, msg, FALSE);
+                       g_free (msg);
+                       g_free (subject);
+               }
+
                /* Remove the header from the preregistered uids */
                modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),  
                                                     header);
@@ -981,7 +999,10 @@ open_msg_cb (ModestMailOperation *mail_op,
        /* Register and show new window */
        if (win != NULL) {
                mgr = modest_runtime_get_window_mgr ();
-               modest_window_mgr_register_window (mgr, win, NULL);
+               if (!modest_window_mgr_register_window (mgr, win, NULL)) {
+                       gtk_widget_destroy (GTK_WIDGET (win));
+                       goto cleanup;
+               }
                gtk_widget_show_all (GTK_WIDGET(win));
        }
 
@@ -1215,7 +1236,8 @@ open_msgs_performer(gboolean canceled,
 
                protocol = modest_protocol_registry_get_protocol_by_type (protocol_registry, proto);
                error_msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
-               g_free (subject);
+               if (subject)
+                       g_free (subject);
                g_object_unref (header);
                g_object_unref (iter);
                
@@ -2664,7 +2686,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
        gchar *account_name, *from;
        ModestAccountMgr *account_mgr;
        gboolean had_error = FALSE;
-       ModestMainWindow *win;
+       ModestMainWindow *win = NULL;
 
        g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
        
@@ -2726,6 +2748,14 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                                              on_save_to_drafts_cb,
                                              g_object_ref(edit_window));
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       /* In hildon2 we always show the information banner on saving to drafts.
+        * It will be a system information banner in this case.
+        */
+       gchar *text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts"));
+       modest_platform_information_banner (NULL, NULL, text);
+       g_free (text);
+#else
        /* Use the main window as the parent of the banner, if the
           main window does not exist it won't be shown, if the parent
           window exists then it's properly shown. We don't use the
@@ -2738,6 +2768,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                modest_platform_information_banner (GTK_WIDGET (win), NULL, text);
                g_free (text);
        }
+#endif
        modest_msg_edit_window_set_modified (edit_window, FALSE);
 
        /* Frees */
@@ -4249,38 +4280,7 @@ headers_action_show_details (TnyHeader *header,
                             gpointer user_data)
 
 {
-       GtkWidget *dialog;
-       
-       /* Create dialog */
-       dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
-
-       /* Run dialog */
-       modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (dialog), (GtkWindow *) window);
-       gtk_widget_show_all (dialog);
-
-       g_signal_connect_swapped (dialog, "response", 
-                                 G_CALLBACK (gtk_widget_destroy),
-                                 dialog);
-}
-
-/*
- * Show the folder details in a ModestDetailsDialog widget
- */
-static void
-show_folder_details (TnyFolder *folder, 
-                    GtkWindow *window)
-{
-       GtkWidget *dialog;
-       
-       /* Create dialog */
-       dialog = modest_details_dialog_new_with_folder (window, folder);
-
-       /* Run dialog */
-       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-       gtk_widget_show_all (dialog);
-       gtk_dialog_run (GTK_DIALOG (dialog));
-
-       gtk_widget_destroy (dialog);
+       modest_platform_run_header_details_dialog (GTK_WINDOW (window), header);
 }
 
 /*
@@ -4334,7 +4334,8 @@ modest_ui_actions_on_details (GtkAction *action,
                        /* This function should not be called for account items, 
                         * because we dim the menu item for them. */
                        if (TNY_IS_FOLDER (folder_store)) {
-                               show_folder_details (TNY_FOLDER (folder_store), GTK_WINDOW (win));
+                               modest_platform_run_folder_details_dialog (GTK_WINDOW (win), 
+                                                                          TNY_FOLDER (folder_store));
                        }
 
                        g_object_unref (folder_store);
@@ -4510,7 +4511,10 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
                                                                                         MODEST_PROTOCOL_REGISTRY_STORE_HAS_FOLDERS));
                }
                g_object_unref (local_account);
-               g_object_unref (mmc_account);
+
+               /* It could not exist */
+               if (mmc_account)
+                       g_object_unref (mmc_account);
        }
 
        /* Check the target folder rules */
@@ -4816,8 +4820,10 @@ move_to_helper_destroyer (gpointer user_data)
                gtk_widget_destroy (GTK_WIDGET (helper->banner));
                g_object_unref (helper->banner);
        }
-       if (helper->reference != NULL)
+       if (gtk_tree_row_reference_valid (helper->reference)) {
                gtk_tree_row_reference_free (helper->reference);
+               helper->reference = NULL;
+       }
        g_free (helper);
 }
 
@@ -4841,7 +4847,8 @@ move_to_cb (ModestMailOperation *mail_op,
                                /* No more messages to view, so close this window */
                                modest_ui_actions_on_close_window (NULL, MODEST_WINDOW(self));
                        }
-               } else if (MODEST_IS_MAIN_WINDOW (object) && helper->reference != NULL) {
+               } else if (MODEST_IS_MAIN_WINDOW (object) && 
+                          gtk_tree_row_reference_valid (helper->reference)) {
                        GtkWidget *header_view;
                        GtkTreePath *path;
                        GtkTreeSelection *sel;
@@ -6124,7 +6131,8 @@ modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
 
        subject = tny_header_dup_subject (header);
        msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
-       g_free (subject);
+       if (subject)
+               g_free (subject);
        if (msg == NULL) {
                msg = g_strdup_printf (_("mail_ni_ui_folder_get_msg_folder_error"));
        }