* Fixes NB#86725, fixes NB#86266, show the error banner whenever folder creation...
[modest] / src / modest-ui-actions.c
index b36b855..074f866 100644 (file)
@@ -82,6 +82,8 @@
 
 #include <gtkhtml/gtkhtml.h>
 
+#define MIN_FREE_SPACE 5 * 1024 * 1024
+
 typedef struct _GetMsgAsyncHelper {    
        ModestWindow *window;
        ModestMailOperation *mail_op;
@@ -215,10 +217,17 @@ modest_ui_actions_run_account_setup_wizard (ModestWindow *win)
                win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr(),
                                                         TRUE);  /* create if not existent */
        
-       /* make sure the mainwindow is visible */
        gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
-       gtk_widget_show_all (GTK_WIDGET(win));
-       gtk_window_present (GTK_WINDOW(win));
+
+       /* make sure the mainwindow is visible. We need to present the
+          wizard again to give it the focus back. show_all are needed
+          in order to get the widgets properly drawn (MainWindow main
+          paned won't be in its right position and the dialog will be
+          missplaced */
+       gtk_widget_show_all (GTK_WIDGET (win));
+       gtk_widget_show_all (GTK_WIDGET (wizard));
+       gtk_window_present (GTK_WINDOW (win));
+       gtk_window_present (GTK_WINDOW (wizard));
        
        dialog_response = gtk_dialog_run (GTK_DIALOG (wizard));
        gtk_widget_destroy (GTK_WIDGET (wizard));
@@ -512,7 +521,6 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
 
                        /* Select next or previous row */
                        if (gtk_tree_row_reference_valid (next_row_reference)) {
-/*                             next_path = gtk_tree_row_reference_get_path (row_reference); */
                                gtk_tree_selection_select_path (sel, next_path);
                        }
                        else if (gtk_tree_row_reference_valid (prev_row_reference)) {                           
@@ -531,8 +539,10 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
                }
                
                /* Update toolbar dimming state */
-               if (main_window)
+               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));
+               }
 
                /* Free */
                g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
@@ -773,8 +783,6 @@ cleanup:
                g_object_unref (G_OBJECT(account));
        if (folder)
                g_object_unref (G_OBJECT(folder));
-       if (msg_win)
-               g_object_unref (G_OBJECT(msg_win));
        if (msg)
                g_object_unref (G_OBJECT(msg));
 }
@@ -986,7 +994,6 @@ open_msg_cb (ModestMailOperation *mail_op,
        if (win != NULL) {
                mgr = modest_runtime_get_window_mgr ();
                modest_window_mgr_register_window (mgr, win);
-               g_object_unref (win);
                gtk_widget_show_all (GTK_WIDGET(win));
        }
 
@@ -1005,15 +1012,51 @@ cleanup:
 static gboolean
 is_memory_full_error (GError *error)
 {
-       if (error->code == TNY_SYSTEM_ERROR_MEMORY ||
-           error->code == TNY_IO_ERROR_WRITE ||
-           error->code == TNY_IO_ERROR_READ) {
+       gboolean enough_free_space = TRUE;
+       GnomeVFSURI *cache_dir_uri;
+       const gchar *cache_dir;
+       GnomeVFSFileSize free_space;
+
+       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;
+       }
+       gnome_vfs_uri_unref (cache_dir_uri);
+
+       if ((error->code == TNY_SYSTEM_ERROR_MEMORY ||
+            error->code == TNY_IO_ERROR_WRITE ||
+            error->code == TNY_IO_ERROR_READ) && 
+           !enough_free_space) {
                return TRUE;
        } else {
                return FALSE;
        }
 }
 
+static gboolean
+check_memory_full_error (GtkWidget *parent_window, GError *err)
+{
+       if (err == NULL)
+               return FALSE;
+
+       if (is_memory_full_error (err))
+               modest_platform_information_banner (parent_window,
+                                                   NULL, dgettext("ke-recv",
+                                                                  "cerm_device_memory_full"));
+       else if (err->code == TNY_SYSTEM_ERROR_MEMORY)
+               /* If the account was created in memory full
+                  conditions then tinymail won't be able to
+                  connect so it'll return this error code */                           
+               modest_platform_information_banner (parent_window,
+                                                   NULL, _("emev_ui_imap_inbox_select_error"));
+       else
+               return FALSE;
+
+       return TRUE;
+}
+
 void
 modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
                                                 gpointer user_data)
@@ -1033,7 +1076,11 @@ modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op,
                        modest_platform_information_banner ((GtkWidget *) win,
                                                            NULL, dgettext("ke-recv",
                                                                           "cerm_device_memory_full"));
-               } else if (error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
+               } else if (error->code == TNY_SYSTEM_ERROR_MEMORY) {
+                       modest_platform_information_banner ((GtkWidget *) win,
+                                                           NULL, _("emev_ui_imap_inbox_select_error"));
+               } else if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                          error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
                        modest_platform_information_banner ((GtkWidget *) win,
                                                            NULL, dgettext ("hildon-common-strings", "sfil_ni_unable_to_open_file_not_found"));
                } else if (user_data) {
@@ -1150,11 +1197,8 @@ open_msgs_performer(gboolean canceled,
                open_msgs_helper_destroyer (helper);
 
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
+
                goto clean;
        }
 
@@ -1545,8 +1589,6 @@ reply_forward_cb (ModestMailOperation *mail_op,
        gtk_widget_show_all (GTK_WIDGET (msg_win));
 
 cleanup:
-       if (msg_win)
-               g_object_unref (msg_win);
        if (new_msg)
                g_object_unref (G_OBJECT (new_msg));
        if (account)
@@ -1926,11 +1968,8 @@ do_send_receive_performer (gboolean canceled,
 
        if (err || canceled) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
+
                if (info->mail_op) {
                        modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (),
                                                            info->mail_op);
@@ -2210,8 +2249,10 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
                        GtkWidget *folder_view = 
                                modest_main_window_get_child_widget (main_window,
                                                                     MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
-                       if (folder != NULL) 
+                       if (folder != NULL) {
                                modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view), folder, FALSE);
+                               g_object_unref (folder);
+                       }
                        gtk_widget_grab_focus (GTK_WIDGET (folder_view));
                        return;
                }
@@ -2836,7 +2877,8 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
 
        if (modest_mail_operation_get_error (mail_operation) != NULL) {
                const GError *error = modest_mail_operation_get_error (mail_operation);
-               if (error->code == MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED) {
+               if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+                   error->code == MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED) {
                        g_warning ("%s failed: %s\n", __FUNCTION__, (modest_mail_operation_get_error (mail_operation))->message);
                        modest_platform_information_banner (NULL, NULL, _CS("sfil_ni_not_enough_memory"));
                        had_error = TRUE;
@@ -3013,6 +3055,38 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
        modest_msg_edit_window_remove_attachments (window, NULL);
 }
 
+
+#ifdef MODEST_PLATFORM_MAEMO
+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, 
@@ -3037,7 +3111,21 @@ do_create_folder_cb (ModestMailOperation *mail_op,
                /* 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 */
+#ifdef MODEST_PLATFORM_MAEMO
+               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
        } else {
                /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog
                 * FIXME: any other? */         
@@ -3103,11 +3191,7 @@ create_folder_performer (gboolean canceled,
 
        if (canceled || err) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
                goto frees;
        }
 
@@ -3163,16 +3247,15 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op,
        if (!error)
                g_return_if_reached ();
 
-       switch (error->code) {
-       case MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS:
+       if (error->domain == MODEST_MAIL_OPERATION_ERROR &&
+           error->code == MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS) {
                message = _CS("ckdg_ib_folder_already_exists");
-               break;
-       case TNY_SERVICE_ERROR_STATE:
+       } else if (error->domain == TNY_ERROR_DOMAIN &&
+                  error->code == 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:
+       } else {
                message = _("emev_ib_ui_imap_unable_to_rename");
        }
 
@@ -3222,11 +3305,7 @@ on_rename_folder_performer (gboolean canceled,
 
        if (canceled || err) {
                /* In memory full conditions we could get this error here */
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
        } else if (MODEST_IS_MAIN_WINDOW(parent_window)) {
 
                folder_view = modest_main_window_get_child_widget (
@@ -4038,9 +4117,9 @@ modest_ui_actions_on_select_all (GtkAction *action,
                /* Set focuse on header view */
                gtk_widget_grab_focus (header_view);
 
-
                /* Enable window dimming management */
                modest_window_enable_dimming (MODEST_WINDOW(window));
+               modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (window));
                modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
        }
 
@@ -4538,9 +4617,6 @@ create_move_to_dialog (GtkWindow *win,
 {
        GtkWidget *dialog, *scroll;
        GtkWidget *new_button;
-#ifndef MODEST_PLATFORM_MAEMO
-       GtkWidget *folder_view_label;
-#endif
 
        dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
                                              GTK_WINDOW (win),
@@ -5110,15 +5186,8 @@ xfer_messages_performer  (gboolean canceled,
 
        helper = (XferMsgsHelper *) user_data;
 
-       if (canceled)
-               goto end;
-
-       if (err) {
-               if (is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               } else {
+       if (canceled || err) {
+               if (!check_memory_full_error ((GtkWidget *) parent_window, err)) {
                        /* Show the proper error message */
                        modest_ui_actions_on_account_connection_error (parent_window, account);
                }
@@ -5626,11 +5695,7 @@ retrieve_msg_contents_performer (gboolean canceled,
        TnyList *headers = TNY_LIST (user_data);
 
        if (err || canceled) {
-               if (err && is_memory_full_error (err)) {
-                       modest_platform_information_banner ((GtkWidget *) parent_window,
-                                                           NULL, dgettext("ke-recv",
-                                                                          "cerm_device_memory_full"));
-               }
+               check_memory_full_error ((GtkWidget *) parent_window, err);
                goto out;
        }