X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=77994616d791a9c925204e2e68bfee7310bce67a;hp=617dca5a523c716e256e537e8e418d8c7b47af1d;hb=21b666ae007ad3d154fb0a081a43404529f57896;hpb=2f51f213469dc0679fd33c205a6f6aa0c20481a9 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 617dca5..7799461 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -105,11 +105,9 @@ typedef struct _ReplyForwardHelper { */ typedef void (*HeadersFunc) (TnyHeader *header, ModestWindow *win, gpointer user_data); -static void -do_headers_action (ModestWindow *win, - HeadersFunc func, - gpointer user_data); - +static void do_headers_action (ModestWindow *win, + HeadersFunc func, + gpointer user_data); static void open_msg_cb (ModestMailOperation *mail_op, TnyHeader *header, @@ -353,10 +351,10 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) widget = modest_main_window_get_child_widget (main_window, MODEST_WIDGET_TYPE_HEADER_VIEW); modest_header_view_refilter (MODEST_HEADER_VIEW (widget)); - } - /* Update toolbar dimming state */ - modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (win)); + /* Update toolbar dimming state */ + modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window)); + } } /* free */ @@ -610,6 +608,27 @@ cleanup: g_object_unref (G_OBJECT(folder)); } +gboolean +modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op, + TnyHeader *header, + TnyMsg *msg) +{ + ModestMailOperationStatus status; + + /* If there is no message or the operation was not successful */ + status = modest_mail_operation_get_status (mail_op); + if (!msg || status != MODEST_MAIL_OPERATION_STATUS_SUCCESS) { + + /* Remove the header from the preregistered uids */ + modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), + header); + + return FALSE; + } + + return TRUE; +} + static void open_msg_cb (ModestMailOperation *mail_op, TnyHeader *header, @@ -623,9 +642,14 @@ open_msg_cb (ModestMailOperation *mail_op, gchar *account = NULL; TnyFolder *folder; - /* TODO: Show an error? (review the specs) */ - if (!msg) + /* Do nothing if there was any problem with the mail + operation. The error will be shown by the error_handler of + the mail operation */ + if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) { + printf ("DEBUG: %s: modest_ui_actions_msg_retrieval_check() failed.\n", + __FUNCTION__); return; + } parent_win = (ModestWindow *) modest_mail_operation_get_source (mail_op); folder = tny_header_get_folder (header); @@ -710,24 +734,27 @@ cleanup: g_object_unref (folder); } -/* - * This function is the error handler of the - * modest_mail_operation_get_msgs_full operation - */ -static void +void modest_ui_actions_get_msgs_full_error_handler (ModestMailOperation *mail_op, gpointer user_data) { const GError *error; + GObject *win = modest_mail_operation_get_source (mail_op); error = modest_mail_operation_get_error (mail_op); + printf ("DEBUG: %s: Error: code=%d, text=%s\n", __FUNCTION__, error->code, error->message); + if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) { - GObject *win = modest_mail_operation_get_source (mail_op); modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, error->message); - g_object_unref (win); + } else { + modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, + _("mail_ni_ui_folder_get_msg_folder_error")); } + + if (win) + g_object_unref (win); } /* @@ -776,9 +803,6 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) g_warning ("debug: header %p already registered, waiting for window", header); } else { - /* register the header before actually creating the window */ - modest_window_mgr_register_header (mgr, header); - if (!(flags & TNY_HEADER_FLAG_CACHED)) tny_list_append (not_opened_headers, G_OBJECT (header)); /* Check if msg has already been retreived */ @@ -788,6 +812,47 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) g_object_unref (header); tny_iterator_next (iter); } + g_object_unref (iter); + iter = NULL; + + /* If some messages would have to be downloaded, ask the user to + * make a connection. It's generally easier to do this here (in the mainloop) + * than later in a thread: + */ + if (tny_list_get_length (not_opened_cached_headers) > 0) { + gboolean connected = modest_platform_connect_and_wait (GTK_WINDOW (win)); + + /* Don't go further if a connection would be necessary but none is available: */ + if (!connected) { + g_object_unref (not_opened_headers); + g_object_unref (not_opened_cached_headers); + return; + } + } + + /* Register the headers before actually creating the windows: */ + TnyIterator *iter_not_opened = tny_list_create_iterator (not_opened_headers); + while (!tny_iterator_is_done (iter_not_opened)) { + TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter_not_opened)); + modest_window_mgr_register_header (mgr, header); + g_object_unref (header); + + tny_iterator_next (iter_not_opened); + } + g_object_unref (iter_not_opened); + iter_not_opened = NULL; + + TnyIterator *iter_cached = tny_list_create_iterator (not_opened_cached_headers); + while (!tny_iterator_is_done (iter_cached)) { + TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter_cached)); + modest_window_mgr_register_header (mgr, header); + g_object_unref (header); + + tny_iterator_next (iter_cached); + } + g_object_unref (iter_cached); + iter_cached = NULL; + /* Open each uncached message */ if (tny_list_get_length (not_opened_headers) > 0) { @@ -887,6 +952,10 @@ reply_forward_cb (ModestMailOperation *mail_op, TnyAccount *account = NULL; ModestWindowMgr *mgr = NULL; gchar *signature = NULL; + + /* If there was any error */ + if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) + return; g_return_if_fail (user_data != NULL); rf_helper = (ReplyForwardHelper *) user_data; @@ -1674,6 +1743,10 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) if (!modest_msg_edit_window_check_names (edit_window)) return; + /* Offer the connection dialog, if necessary: */ + if (!modest_platform_connect_and_wait (GTK_WINDOW (edit_window))) + return; + /* FIXME: Code added just for testing. The final version will use the send queue provided by tinymail and some classifier */ @@ -2403,6 +2476,18 @@ modest_ui_actions_on_undo (GtkAction *action, } } +void +modest_ui_actions_on_redo (GtkAction *action, + ModestWindow *window) +{ + if (MODEST_IS_MSG_EDIT_WINDOW (window)) { + modest_msg_edit_window_redo (MODEST_MSG_EDIT_WINDOW (window)); + } + else { + g_return_if_reached (); + } +} + static void paste_msgs_cb (const GObject *object, gpointer user_data) @@ -3046,7 +3131,9 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op, gint pending_purges = 0; gboolean some_purged = FALSE; ModestWindow *win = MODEST_WINDOW (user_data); - if (!msg) + + /* If there was any error */ + if (!modest_ui_actions_msg_retrieval_check (mail_op, header, msg)) return; /* Once the message has been retrieved for purging, we check if @@ -3180,6 +3267,17 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, /* Get the folder view */ folder_view = modest_main_window_get_child_widget (win, MODEST_WIDGET_TYPE_FOLDER_VIEW); + + TnyFolderStore *src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + + /* Offer the connection dialog if necessary, if the source folder is in a networked account: */ + if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), src_folder)) { + if (src_folder) { + g_object_unref (src_folder); + } + + return; + } /* Get header view */ header_view = modest_main_window_get_child_widget (win, @@ -3202,39 +3300,32 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, goto end; /* Offer the connection dialog if necessary: */ - if (modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), folder_store)) { + if (!modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), folder_store)) { goto end; } /* Get folder or messages to transfer */ if (gtk_widget_is_focus (folder_view)) { - TnyFolderStore *src_folder; - src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); - - /* Offer the connection dialog if necessary: */ - if (modest_platform_connect_and_wait_if_network_folderstore (GTK_WINDOW (win), src_folder)) { - - /* Clean folder on header view before moving it */ - modest_header_view_clear (MODEST_HEADER_VIEW (header_view)); - - if (TNY_IS_FOLDER (src_folder)) { - mail_op = - modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, - G_OBJECT(win), - modest_ui_actions_move_folder_error_handler, - NULL); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); + + /* Clean folder on header view before moving it */ + modest_header_view_clear (MODEST_HEADER_VIEW (header_view)); - modest_mail_operation_xfer_folder (mail_op, - TNY_FOLDER (src_folder), - folder_store, - TRUE, NULL, NULL); - /* Unref mail operation */ - g_object_unref (G_OBJECT (mail_op)); - } + if (TNY_IS_FOLDER (src_folder)) { + mail_op = + modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_RECEIVE, + G_OBJECT(win), + modest_ui_actions_move_folder_error_handler, + NULL); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - /* Frees */ - g_object_unref (G_OBJECT (src_folder)); + modest_mail_operation_xfer_folder (mail_op, + TNY_FOLDER (src_folder), + folder_store, + TRUE, NULL, NULL); + /* Unref mail operation */ + g_object_unref (G_OBJECT (mail_op)); + } else { + g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__); } } else { if (gtk_widget_is_focus (header_view)) { @@ -3273,7 +3364,10 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, } end: - if (folder_store != NULL) + if (src_folder) + g_object_unref (src_folder); + + if (folder_store) g_object_unref (folder_store); gtk_widget_destroy (dialog);