X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=8c2d36f93ed621c32b48d2699df1fe161b440ac5;hp=5e25f1d684c4e0deb12cbcb8309b877517ab30ec;hb=011017bd14d1979454ec832ab22025441ae27687;hpb=8cb3226b82db6b00d453194e3ef7ee7bfa61aaff diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 5e25f1d..8c2d36f 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -41,7 +41,7 @@ #include #include "modest-error.h" #include "modest-ui-actions.h" - +#include "modest-protocol-info.h" #include "modest-tny-platform-factory.h" #include "modest-platform.h" #include @@ -126,12 +126,16 @@ static void do_headers_action (ModestWindow *win, static void open_msg_cb (ModestMailOperation *mail_op, TnyHeader *header, + gboolean canceled, TnyMsg *msg, + GError *err, gpointer user_data); static void reply_forward_cb (ModestMailOperation *mail_op, TnyHeader *header, + gboolean canceled, TnyMsg *msg, + GError *err, gpointer user_data); static void reply_forward (ReplyForwardAction action, ModestWindow *win); @@ -173,6 +177,11 @@ remote_folder_is_pop (const TnyFolderStore *folder) account = tny_folder_get_account(TNY_FOLDER(folder)); } + if (!account && !TNY_IS_ACCOUNT(account)) { + g_warning ("%s: could not get account", __FUNCTION__); + return FALSE; + } + proto = tny_account_get_proto(account); g_object_unref (account); @@ -231,6 +240,7 @@ modest_ui_actions_run_account_setup_wizard (ModestWindow *win) 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)); @@ -659,7 +669,9 @@ modest_ui_actions_on_accounts (GtkAction *action, /* This is currently only implemented for Maemo */ #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */ if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE)) { - modest_ui_actions_run_account_setup_wizard (win); + if (!modest_ui_actions_run_account_setup_wizard (win)) + g_debug ("%s: wizard was already running", __FUNCTION__); + return; } else { /* Show the list of accounts */ @@ -819,10 +831,10 @@ void modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) { /* if there are no accounts yet, just show the wizard */ - if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE)) { - if (!modest_ui_actions_run_account_setup_wizard (win)) return; - } - + if (!modest_account_mgr_has_accounts (modest_runtime_get_account_mgr(), TRUE)) + if (!modest_ui_actions_run_account_setup_wizard (win)) + return; + modest_ui_actions_compose_msg(win, NULL, NULL, NULL, NULL, NULL, NULL); } @@ -848,7 +860,12 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op, } static void -open_msg_cb (ModestMailOperation *mail_op, TnyHeader *header, TnyMsg *msg, gpointer user_data) +open_msg_cb (ModestMailOperation *mail_op, + TnyHeader *header, + gboolean canceled, + TnyMsg *msg, + GError *err, + gpointer user_data) { ModestWindowMgr *mgr = NULL; ModestWindow *parent_win = NULL; @@ -1001,37 +1018,25 @@ cleanup: g_object_unref (folder); } - -static void -open_msg_error_handler (ModestMailOperation *mail_op, - gpointer user_data) -{ - /* Show the message error */ - GObject *win = modest_mail_operation_get_source (mail_op); - - modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, - (gchar *) user_data); - if (win) - g_object_unref (win); -} - 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); + GObject *win = NULL; + const gchar *err_msg; + win = modest_mail_operation_get_source (mail_op); error = modest_mail_operation_get_error (mail_op); - if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) { + /* Select error message */ + if (error->code == MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT) + err_msg = _("emev_ni_ui_imap_msg_size_exceed_error"); + else + err_msg = (const gchar *) user_data; - modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, - error->message); - } else { - modest_platform_run_information_dialog ((win) ? GTK_WINDOW (win) : NULL, - _("mail_ni_ui_folder_get_msg_folder_error")); - } + /* Show error */ + modest_platform_run_information_dialog ((GtkWindow *) win, err_msg); if (win) g_object_unref (win); @@ -1058,20 +1063,81 @@ get_account_from_header_list (TnyList *headers) return account; } +static void +open_msgs_performer(gboolean canceled, + GError *err, + GtkWindow *parent_window, + TnyAccount *account, + gpointer user_data) +{ + ModestMailOperation *mail_op; + const gchar *proto_name; + gchar *error_msg; + ModestTransportStoreProtocol proto; + TnyList *not_opened_headers; + + not_opened_headers = TNY_LIST (user_data); + + /* Get the error message depending on the protocol */ + proto_name = tny_account_get_proto (account); + if (proto_name != NULL) { + proto = modest_protocol_info_get_transport_store_protocol (proto_name); + } else { + proto = MODEST_PROTOCOL_STORE_MAILDIR; + } + + /* Create the error messages */ + if (tny_list_get_length (not_opened_headers) == 1) { + if (proto == MODEST_PROTOCOL_STORE_POP) { + error_msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error")); + } else if (proto == MODEST_PROTOCOL_STORE_IMAP) { + TnyIterator *iter = tny_list_create_iterator (not_opened_headers); + TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); + error_msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"), + tny_header_get_subject (header)); + g_object_unref (header); + g_object_unref (iter); + } else { + error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error")); + } + } else { + error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error")); + } + + /* Create the mail operation */ + mail_op = + modest_mail_operation_new_with_error_handling ((GObject *) parent_window, + modest_ui_actions_get_msgs_full_error_handler, + error_msg, g_free); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + modest_mail_operation_get_msgs_full (mail_op, + not_opened_headers, + open_msg_cb, + NULL, + NULL); + + /* Frees */ + g_object_unref (mail_op); + g_object_unref (not_opened_headers); + g_object_unref (account); +} + /* * This function is used by both modest_ui_actions_on_open and * modest_ui_actions_on_header_activated. This way we always do the * same when trying to open messages. */ static void -_modest_ui_actions_open (TnyList *headers, ModestWindow *win) +open_msgs_from_headers (TnyList *headers, ModestWindow *win) { ModestWindowMgr *mgr = NULL; TnyIterator *iter = NULL, *iter_not_opened = NULL; - ModestMailOperation *mail_op = NULL; TnyList *not_opened_headers = NULL; TnyHeaderFlags flags = 0; TnyAccount *account; + gint uncached_msgs = 0; g_return_if_fail (headers != NULL); @@ -1135,26 +1201,24 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) * than later in a thread: */ if (tny_list_get_length (not_opened_headers) > 0) { - TnyIterator *iter; - gboolean found = FALSE; - - iter = tny_list_create_iterator (not_opened_headers); - while (!tny_iterator_is_done (iter) && !found) { - TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); - if (!(tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)) - found = TRUE; - else - tny_iterator_next (iter); - - g_object_unref (header); + uncached_msgs = header_list_count_uncached_msgs (not_opened_headers); + + if (uncached_msgs > 0) { + /* Allways download if we are online. */ + if (!tny_device_is_online (modest_runtime_get_device ())) { + gint response; + + /* If ask for user permission to download the messages */ + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (win), + ngettext("mcen_nc_get_msg", + "mcen_nc_get_msgs", + uncached_msgs)); + + /* End if the user does not want to continue */ + if (response == GTK_RESPONSE_CANCEL) + goto cleanup; + } } - g_object_unref (iter); - - /* Ask the user if there are any uncached messages */ - if (found && !connect_to_get_msg (win, - header_list_count_uncached_msgs (not_opened_headers), - account)) - goto cleanup; } /* Register the headers before actually creating the windows: */ @@ -1164,62 +1228,21 @@ _modest_ui_actions_open (TnyList *headers, ModestWindow *win) if (header) { modest_window_mgr_register_header (mgr, header, NULL); g_object_unref (header); - } + } tny_iterator_next (iter_not_opened); } g_object_unref (iter_not_opened); iter_not_opened = NULL; - /* Create the mail operation */ - if (tny_list_get_length (not_opened_headers) > 1) { - mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (win), - modest_ui_actions_get_msgs_full_error_handler, - NULL, NULL); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - - modest_mail_operation_get_msgs_full (mail_op, - not_opened_headers, - open_msg_cb, - NULL, - NULL); + /* Connect to the account and perform */ + if (uncached_msgs > 0) { + modest_platform_connect_and_perform ((GtkWindow *) win, g_object_ref (account), + open_msgs_performer, g_object_ref (not_opened_headers)); } else { - TnyIterator *iter = tny_list_create_iterator (not_opened_headers); - TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); - const gchar *proto_name; - gchar *error_msg; - ModestTransportStoreProtocol proto; - - /* Get the error message depending on the protocol */ - proto_name = tny_account_get_proto (account); - if (proto_name != NULL) { - proto = modest_protocol_info_get_transport_store_protocol (proto_name); - } else { - proto = MODEST_PROTOCOL_STORE_MAILDIR; - } - - if (proto == MODEST_PROTOCOL_STORE_POP) { - error_msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error")); - } else if (proto == MODEST_PROTOCOL_STORE_IMAP) { - error_msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"), - tny_header_get_subject (header)); - } else { - error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error")); - } - - /* Create and call the mail operation */ - mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (win), - open_msg_error_handler, - error_msg, - g_free); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - - modest_mail_operation_get_msg (mail_op, header, open_msg_cb, NULL); - - g_object_unref (header); - g_object_unref (iter); + /* Call directly the performer, do not need to connect */ + open_msgs_performer (FALSE, NULL, (GtkWindow *) win, g_object_ref (account), + g_object_ref (not_opened_headers)); } - g_object_unref (mail_op); - cleanup: /* Clean */ if (account) @@ -1239,7 +1262,7 @@ modest_ui_actions_on_open (GtkAction *action, ModestWindow *win) return; /* Open them */ - _modest_ui_actions_open (headers, win); + open_msgs_from_headers (headers, win); g_object_unref(headers); } @@ -1256,7 +1279,11 @@ free_reply_forward_helper (gpointer data) } static void -reply_forward_cb (ModestMailOperation *mail_op, TnyHeader *header, TnyMsg *msg, +reply_forward_cb (ModestMailOperation *mail_op, + TnyHeader *header, + gboolean canceled, + TnyMsg *msg, + GError *err, gpointer user_data) { TnyMsg *new_msg; @@ -1485,7 +1512,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) g_printerr ("modest: no message found\n"); return; } else { - reply_forward_cb (NULL, header, msg, rf_helper); + reply_forward_cb (NULL, header, FALSE, msg, NULL, rf_helper); } if (header) g_object_unref (header); @@ -1517,7 +1544,7 @@ reply_forward (ReplyForwardAction action, ModestWindow *win) } else { /* we put a ref here to prevent double unref as the reply * forward callback unrefs the header at its end */ - reply_forward_cb (NULL, header, NULL, rf_helper); + reply_forward_cb (NULL, header, FALSE, NULL, NULL, rf_helper); } @@ -1934,7 +1961,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view, /* tny_list_prepend (headers, G_OBJECT (header)); */ headers = modest_header_view_get_selected_headers (header_view); - _modest_ui_actions_open (headers, MODEST_WINDOW (main_window)); + open_msgs_from_headers (headers, MODEST_WINDOW (main_window)); g_object_unref (headers); } @@ -2771,7 +2798,13 @@ modest_ui_actions_on_delete_folder (GtkAction *action, { g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); - delete_folder (main_window, FALSE); + if (delete_folder (main_window, FALSE)) { + GtkWidget *folder_view; + + folder_view = modest_main_window_get_child_widget (main_window, + MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW); + modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view)); + } } void @@ -3621,16 +3654,13 @@ modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view, const gchar *display_name, GtkWindow *window) { - /* Do not change the application name if the widget has not - the focus. This callback could be called even if the folder - view has not the focus, because the handled signal could be - emitted when the folder view is redrawn */ - if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) { - if (display_name) - gtk_window_set_title (window, display_name); - else - gtk_window_set_title (window, " "); - } + /* This is usually used to change the title of the main window, which + * is the one that holds the folder view. Note that this change can + * happen even when the widget doesn't have the focus. */ + if (display_name) + gtk_window_set_title (window, display_name); + else + gtk_window_set_title (window, " "); } void @@ -4056,10 +4086,9 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, /* Show notification dialog */ win = modest_mail_operation_get_source (mail_op); - if (G_IS_OBJECT (win)) { - modest_platform_run_information_dialog (GTK_WINDOW (win), message); + modest_platform_run_information_dialog ((GtkWindow *) win, message); + if (win) g_object_unref (win); - } } void @@ -4088,7 +4117,9 @@ modest_ui_actions_send_receive_error_handler (ModestMailOperation *mail_op, static void open_msg_for_purge_cb (ModestMailOperation *mail_op, TnyHeader *header, + gboolean canceled, TnyMsg *msg, + GError *err, gpointer user_data) { TnyList *parts; @@ -4151,8 +4182,9 @@ open_msg_for_purge_cb (ModestMailOperation *mail_op, tny_msg_rewrite_cache (msg); } - } else { - modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged")); + /* } else { */ + /* This string no longer exists, refer to NB#75415 for more info */ + /* modest_platform_information_banner (NULL, NULL, _("mail_ib_attachment_already_purged")); */ } g_object_unref (iter); @@ -4624,28 +4656,68 @@ modest_ui_actions_on_help (GtkAction *action, g_warning ("%s: no help for window %p", __FUNCTION__, win); } +static void +retrieve_msg_contents_performer (gboolean canceled, + GError *err, + GtkWindow *parent_window, + TnyAccount *account, + gpointer user_data) +{ + ModestMailOperation *mail_op; + TnyList *headers = TNY_LIST (user_data); + + if (err || canceled) { + /* Show an error ? */ + goto out; + } + + /* Create mail operation */ + mail_op = modest_mail_operation_new_with_error_handling ((GObject *) parent_window, + modest_ui_actions_get_msgs_full_error_handler, + NULL, NULL); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); + modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL); + + /* Frees */ + g_object_unref (mail_op); + out: + g_object_unref (headers); + g_object_unref (account); +} + void modest_ui_actions_on_retrieve_msg_contents (GtkAction *action, ModestWindow *window) { - ModestMailOperation *mail_op; - TnyList *headers; + TnyList *headers = NULL; + TnyAccount *account = NULL; + TnyIterator *iter = NULL; + TnyHeader *header = NULL; + TnyFolder *folder = NULL; /* Get headers */ headers = get_selected_headers (window); if (!headers) return; - /* Create mail operation */ - mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (window), - modest_ui_actions_get_msgs_full_error_handler, - NULL, NULL); - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - modest_mail_operation_get_msgs_full (mail_op, headers, NULL, NULL, NULL); + /* Pick the account */ + iter = tny_list_create_iterator (headers); + header = TNY_HEADER (tny_iterator_get_current (iter)); + folder = tny_header_get_folder (header); + account = tny_folder_get_account (folder); + g_object_unref (folder); + g_object_unref (header); + g_object_unref (iter); + + /* Connect and perform the message retrieval */ + modest_platform_connect_and_perform ((GtkWindow *) window, + g_object_ref (account), + retrieve_msg_contents_performer, + g_object_ref (headers)); /* Frees */ + g_object_unref (account); g_object_unref (headers); - g_object_unref (mail_op); } void @@ -4924,3 +4996,37 @@ modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue, if (selected_folder != NULL) g_object_unref (selected_folder); } + +void +modest_ui_actions_on_account_connection_error (GtkWindow *parent_window, + TnyAccount *account) +{ + ModestTransportStoreProtocol proto; + const gchar *proto_name; + gchar *error_note = NULL; + + proto_name = tny_account_get_proto (account); + proto = modest_protocol_info_get_transport_store_protocol (proto_name); + + switch (proto) { + case MODEST_PROTOCOL_STORE_POP: + error_note = g_strdup_printf (_("emev_ni_ui_pop3_msg_connect_error"), + tny_account_get_hostname (account)); + break; + case MODEST_PROTOCOL_STORE_IMAP: + error_note = g_strdup_printf (_("emev_ni_ui_imap_connect_server_error"), + tny_account_get_hostname (account)); + break; + case MODEST_PROTOCOL_STORE_MAILDIR: + case MODEST_PROTOCOL_STORE_MBOX: + error_note = g_strdup (_("emev_nc_mailbox_notavailable")); + break; + default: + g_warning ("%s: This should not be reached", __FUNCTION__); + } + + if (error_note) { + modest_platform_run_information_dialog (parent_window, error_note); + g_free (error_note); + } +}