X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=369e4befbc44b76d8eafc94fdda4bbf60de599ea;hp=832ae8d3cae70a45438c1a55898150ab1b859a9c;hb=305b5f8ec558ffedb3b531618b7877cf8ee722b6;hpb=3e95c9a92e054d722d4651d6850b77a959cfc679 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 832ae8d..369e4be 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 @@ -53,6 +53,7 @@ #include "maemo/modest-osso-state-saving.h" #include "maemo/modest-maemo-utils.h" #include "maemo/modest-hildon-includes.h" +#include "maemo/modest-connection-specific-smtp-window.h" #endif /* MODEST_PLATFORM_MAEMO */ #include "widgets/modest-ui-constants.h" @@ -63,7 +64,6 @@ #include #include "widgets/modest-folder-view.h" #include "widgets/modest-global-settings-dialog.h" -#include "modest-connection-specific-smtp-window.h" #include "modest-account-mgr-helpers.h" #include "modest-mail-operation.h" #include "modest-text-utils.h" @@ -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); @@ -206,6 +215,7 @@ gboolean modest_ui_actions_run_account_setup_wizard (ModestWindow *win) { gboolean result = FALSE; +#ifdef MODEST_PLATFORM_MAEMO GtkWindow *dialog, *wizard; gint dialog_response; @@ -231,6 +241,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)); @@ -245,7 +256,7 @@ modest_ui_actions_run_account_setup_wizard (ModestWindow *win) /* Check whether an account was created: */ result = modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE); } - +#endif return result; } @@ -659,7 +670,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 */ @@ -697,6 +710,7 @@ modest_ui_actions_on_accounts (GtkAction *action, #endif /* MODEST_PLATFORM_MAEMO */ } +#ifdef MODEST_PLATFORM_MAEMO static void on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data) { @@ -705,7 +719,7 @@ on_smtp_servers_window_hide (GtkWindow* window, gpointer user_data) MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (window)); gtk_widget_destroy (GTK_WIDGET (window)); } - +#endif void @@ -819,10 +833,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 +862,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 +1020,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 +1065,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 +1203,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 +1230,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 +1264,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 +1281,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 +1514,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 +1546,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); } @@ -1638,6 +1667,60 @@ new_messages_arrived (ModestMailOperation *self, g_object_unref (source); } +typedef struct { + TnyAccount *account; + ModestWindow *win; + gchar *account_name; +} SendReceiveInfo; + +static void +do_send_receive_performer (gboolean canceled, + GError *err, + GtkWindow *parent_window, + TnyAccount *account, + gpointer user_data) +{ + ModestMailOperation *mail_op; + SendReceiveInfo *info; + + info = (SendReceiveInfo *) user_data; + + if (err || canceled) { + + goto clean; + } + + /* Set send/receive operation in progress */ + if (info->win && MODEST_IS_MAIN_WINDOW (info->win)) { + modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW (info->win)); + } + + mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (info->win), + modest_ui_actions_send_receive_error_handler, + NULL, NULL); + + if (info->win && MODEST_IS_MAIN_WINDOW (info->win)) + g_signal_connect (G_OBJECT(mail_op), "operation-finished", + G_CALLBACK (on_send_receive_finished), + info->win); + + /* Send & receive. */ + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); + modest_mail_operation_update_account (mail_op, info->account_name, (info->win) ? FALSE : TRUE, + new_messages_arrived, info->win); + g_object_unref (G_OBJECT (mail_op)); + + clean: + /* Frees */ + if (info->account_name) + g_free (info->account_name); + if (info->win) + g_object_unref (info->win); + if (info->account) + g_object_unref (info->account); + g_slice_free (SendReceiveInfo, info); +} + /* * This function performs the send & receive required actions. The * window is used to create the mail operation. Typically it should @@ -1649,8 +1732,8 @@ modest_ui_actions_do_send_receive (const gchar *account_name, ModestWindow *win) { gchar *acc_name = NULL; - ModestMailOperation *mail_op; - TnyAccount *store_account = NULL; + SendReceiveInfo *info; + ModestTnyAccountStore *acc_store; /* If no account name was provided then get the current account, and if there is no current account then pick the default one: */ @@ -1667,44 +1750,18 @@ modest_ui_actions_do_send_receive (const gchar *account_name, acc_name = g_strdup (account_name); } - /* Ensure that we have a connection available */ - store_account = - modest_tny_account_store_get_server_account (modest_runtime_get_account_store (), - acc_name, - TNY_ACCOUNT_TYPE_STORE); + acc_store = modest_runtime_get_account_store (); - if (!modest_platform_connect_and_wait (NULL, TNY_ACCOUNT (store_account))) { - g_object_unref (store_account); - return; - } - g_object_unref (store_account); - - /* Set send/receive operation in progress */ - if (win && MODEST_IS_MAIN_WINDOW (win)) - modest_main_window_notify_send_receive_initied (MODEST_MAIN_WINDOW(win)); - - mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT (win), - modest_ui_actions_send_receive_error_handler, - NULL, NULL); + /* Create the info for the connect and perform */ + info = g_slice_new (SendReceiveInfo); + info->account_name = acc_name; + info->win = (win) ? g_object_ref (win) : NULL; + info->account = modest_tny_account_store_get_server_account (acc_store, acc_name, + TNY_ACCOUNT_TYPE_STORE); - if (win && MODEST_IS_MAIN_WINDOW (win)) - g_signal_connect (G_OBJECT(mail_op), "operation-finished", - G_CALLBACK (on_send_receive_finished), - win); - - /* Send & receive. */ - /* TODO: The spec wants us to first do any pending deletions, before receiving. */ - /* Receive and then send. The operation is tagged initially as - a receive operation because the account update performs a - receive and then a send. The operation changes its type - internally, so the progress objects will receive the proper - progress information */ - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); - modest_mail_operation_update_account (mail_op, acc_name, new_messages_arrived, win); - g_object_unref (G_OBJECT (mail_op)); - - /* Free */ - g_free (acc_name); + /* Invoke the connect and perform */ + modest_platform_connect_and_perform ((win) ? GTK_WINDOW (win) : NULL, info->account, + do_send_receive_performer, info); } @@ -1799,64 +1856,55 @@ modest_ui_actions_do_send_receive_all (ModestWindow *win) account_names = NULL; } -static void -refresh_current_folder(ModestWindow *win) +/* + * Handler of the click on Send&Receive button in the main toolbar + */ +void +modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) { - /* Refresh currently selected folder. Note that if we only - want to retreive the headers, then the refresh only will - invoke a poke_status over all folders, i.e., only the - total/unread count will be updated */ + /* Check if accounts exist */ + gboolean accounts_exist; + + accounts_exist = + modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE); + + /* If not, allow the user to create an account before trying to send/receive. */ + if (!accounts_exist) + modest_ui_actions_on_accounts (NULL, win); + + /* Refresh the current folder. The if is always TRUE it's just an extra check */ if (MODEST_IS_MAIN_WINDOW (win)) { GtkWidget *header_view, *folder_view; TnyFolderStore *folder_store; - /* Get folder and header view */ folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW); if (!folder_view) return; - + folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); - - if (folder_store && TNY_IS_FOLDER (folder_store)) { + + /* No need to refresh the INBOX the send_receive will do it for us */ + if (folder_store && TNY_IS_FOLDER (folder_store) && + tny_folder_get_folder_type (TNY_FOLDER (folder_store)) != TNY_FOLDER_TYPE_INBOX) { header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW); - + /* We do not need to set the contents style because it hasn't changed. We also do not need to save the widget status. Just force - a refresh */ + a refresh */ modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), TNY_FOLDER (folder_store), folder_refreshed_cb, MODEST_MAIN_WINDOW (win)); } - + if (folder_store) g_object_unref (folder_store); - } -} - - -/* - * Handler of the click on Send&Receive button in the main toolbar - */ -void -modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) -{ - /* Check if accounts exist */ - gboolean accounts_exist = - modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), TRUE); - - /* If not, allow the user to create an account before trying to send/receive. */ - if (!accounts_exist) - modest_ui_actions_on_accounts (NULL, win); - - /* Refresh the current folder if we're viewing a window */ - if (win) - refresh_current_folder (win); + } /* Refresh the active account */ modest_ui_actions_do_send_receive (NULL, win); @@ -1943,7 +1991,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view, return; if (modest_header_view_count_selected_headers (header_view) > 1) { - hildon_banner_show_information (NULL, NULL, _("mcen_ib_select_one_message")); + modest_platform_information_banner (NULL, NULL, _("mcen_ib_select_one_message")); return; } @@ -1952,7 +2000,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); } @@ -2188,6 +2236,18 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op, gpointer user_data) { ModestMsgEditWindow *edit_window; + ModestMainWindow *win; + + /* FIXME. Make the header view sensitive again. This is a + * temporary hack. See modest_ui_actions_on_save_to_drafts() + * for details */ + win = MODEST_MAIN_WINDOW(modest_window_mgr_get_main_window( + modest_runtime_get_window_mgr(), FALSE)); + if (win != NULL) { + GtkWidget *hdrview = modest_main_window_get_child_widget( + win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW); + if (hdrview) gtk_widget_set_sensitive(hdrview, TRUE); + } edit_window = MODEST_MSG_EDIT_WINDOW (user_data); @@ -2206,7 +2266,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi MsgData *data; gchar *account_name, *from; ModestAccountMgr *account_mgr; - gchar *info_text = NULL; + char *info_text; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window)); @@ -2260,24 +2320,63 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi data->priority_flags, on_save_to_drafts_cb, edit_window); + info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts")); + modest_platform_information_banner (NULL, NULL, info_text); + /* Frees */ + g_free (info_text); g_free (from); g_free (account_name); g_object_unref (G_OBJECT (transport_account)); g_object_unref (G_OBJECT (mail_operation)); modest_msg_edit_window_free_msg_data (edit_window, data); - - info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts")); - modest_platform_information_banner (NULL, NULL, info_text); modest_msg_edit_window_reset_modified (edit_window); - g_free (info_text); + + /* ** FIXME ** + * If the drafts folder is selected then make the header view + * insensitive while the message is being saved to drafts + * (it'll be sensitive again in on_save_to_drafts_cb()). This + * is not very clean but it avoids letting the drafts folder + * in an inconsistent state: the user could edit the message + * being saved and undesirable things would happen. + * In the average case the user won't notice anything at + * all. In the worst case (the user is editing a really big + * file from Drafts) the header view will be insensitive + * during the saving process (10 or 20 seconds, depending on + * the message). Anyway this is just a quick workaround: once + * we find a better solution it should be removed + * See NB#65125 (commend #18) for details. + */ + ModestMainWindow *win = MODEST_MAIN_WINDOW(modest_window_mgr_get_main_window( + modest_runtime_get_window_mgr(), FALSE)); + if (win != NULL) { + ModestFolderView *view = MODEST_FOLDER_VIEW(modest_main_window_get_child_widget( + win, MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW)); + if (view != NULL) { + TnyFolder *folder = TNY_FOLDER(modest_folder_view_get_selected(view)); + if (folder) { + if (modest_tny_folder_is_local_folder(folder)) { + TnyFolderType folder_type; + folder_type = modest_tny_folder_get_local_or_mmc_folder_type(folder); + if (folder_type == TNY_FOLDER_TYPE_DRAFTS) { + GtkWidget *hdrview = modest_main_window_get_child_widget( + win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW); + if (hdrview) gtk_widget_set_sensitive(hdrview, FALSE); + } + } + } + if (folder != NULL) g_object_unref(folder); + } + } } /* For instance, when clicking the Send toolbar button when editing a message: */ void modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) { + TnyTransportAccount *transport_account = NULL; + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window)); if (!modest_msg_edit_window_check_names (edit_window, TRUE)) @@ -2304,10 +2403,16 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) } /* Get the currently-active transport account for this modest account: */ - TnyTransportAccount *transport_account = - TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection - (modest_runtime_get_account_store(), - account_name)); +/* TnyTransportAccount *transport_account = */ +/* TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection */ +/* (modest_runtime_get_account_store(), */ +/* account_name)); */ + if (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID) != 0) { + transport_account = TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account + (modest_runtime_get_account_store(), + account_name, TNY_ACCOUNT_TYPE_TRANSPORT)); + } + if (!transport_account) { /* Run account setup wizard */ if (!modest_ui_actions_run_account_setup_wizard(MODEST_WINDOW(edit_window))) @@ -2333,6 +2438,10 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) data->attachments, data->images, data->priority_flags); + + if (modest_mail_operation_get_status (mail_operation) == MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS) + modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent")); + /* Free data: */ g_free (from); @@ -2529,7 +2638,7 @@ modest_ui_actions_create_folder(GtkWidget *parent_window, if (proto_str && modest_protocol_info_get_transport_store_protocol (proto_str) == MODEST_PROTOCOL_STORE_POP) { finished = TRUE; - hildon_banner_show_information (NULL, NULL, _("mail_in_ui_folder_create_error")); + modest_platform_information_banner (NULL, NULL, _("mail_in_ui_folder_create_error")); } g_object_unref (account); @@ -2617,6 +2726,59 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op, modest_platform_information_banner (GTK_WIDGET (window), NULL, message); } +typedef struct { + TnyFolderStore *folder; + gchar *new_name; +} RenameFolderInfo; + +static void +on_rename_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, + TnyAccount *account, gpointer user_data) +{ + ModestMailOperation *mail_op = NULL; + GtkTreeSelection *sel = NULL; + GtkWidget *folder_view = NULL; + RenameFolderInfo *data = (RenameFolderInfo*)user_data; + + if (MODEST_IS_MAIN_WINDOW(parent_window)) { + + folder_view = modest_main_window_get_child_widget ( + MODEST_MAIN_WINDOW (parent_window), + MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW); + + mail_op = + modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window), + modest_ui_actions_rename_folder_error_handler, + parent_window, NULL); + + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + + /* Clear the headers view */ + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view)); + gtk_tree_selection_unselect_all (sel); + + /* Select *after* the changes */ + modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), + TNY_FOLDER(data->folder), TRUE); + + /* Actually rename the folder */ + modest_mail_operation_rename_folder (mail_op, + TNY_FOLDER (data->folder), + (const gchar *) (data->new_name)); + + /* TODO folder view filter refilter */ + /* + GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)); + if (GTK_IS_TREE_MODEL_FILTER (tree_model)) + gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (tree_model)); */ + } + + g_object_unref (mail_op); + g_free (data->new_name); + g_free (data); +} + void modest_ui_actions_on_rename_folder (GtkAction *action, ModestMainWindow *main_window) @@ -2648,7 +2810,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action, gint response; const gchar *current_name; TnyFolderStore *parent; - gboolean do_rename = TRUE; + gboolean do_rename = TRUE; current_name = tny_folder_get_name (TNY_FOLDER (folder)); parent = tny_folder_get_folder_store (TNY_FOLDER (folder)); @@ -2657,42 +2819,14 @@ modest_ui_actions_on_rename_folder (GtkAction *action, &folder_name); g_object_unref (parent); - if (response != GTK_RESPONSE_ACCEPT || strlen (folder_name) == 0) { - do_rename = FALSE; - } else if (modest_platform_is_network_folderstore(folder) && - !tny_device_is_online (modest_runtime_get_device())) { - TnyAccount *account = tny_folder_get_account(TNY_FOLDER(folder)); - do_rename = modest_platform_connect_and_wait(GTK_WINDOW(main_window), account); - g_object_unref(account); - } - - if (do_rename) { - ModestMailOperation *mail_op; - GtkTreeSelection *sel = NULL; - - mail_op = - modest_mail_operation_new_with_error_handling (G_OBJECT(main_window), - modest_ui_actions_rename_folder_error_handler, - main_window, NULL); - - modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - - /* Clear the headers view */ - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view)); - gtk_tree_selection_unselect_all (sel); - - /* Select *after* the changes */ - modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), - TNY_FOLDER(folder), TRUE); - - /* Actually rename the folder */ - modest_mail_operation_rename_folder (mail_op, - TNY_FOLDER (folder), - (const gchar *) folder_name); - - g_object_unref (mail_op); - g_free (folder_name); + if (response != GTK_RESPONSE_ACCEPT || strlen (folder_name) == 0) { + do_rename = FALSE; + } else { + RenameFolderInfo *rename_folder_data = g_new0 (RenameFolderInfo, 1); + rename_folder_data->folder = folder; + rename_folder_data->new_name = folder_name; + modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), + folder, on_rename_folder_cb, rename_folder_data); } } g_object_unref (folder); @@ -2744,7 +2878,7 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) if (response != GTK_RESPONSE_OK) { do_delete = FALSE; - } else if (modest_platform_is_network_folderstore(folder) && + } else if (modest_tny_folder_store_is_remote(folder) && !tny_device_is_online (modest_runtime_get_device())) { TnyAccount *account = tny_folder_get_account(TNY_FOLDER(folder)); do_delete = modest_platform_connect_and_wait(GTK_WINDOW(main_window), account); @@ -2803,7 +2937,7 @@ modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainW static void show_error (GtkWidget *parent_widget, const gchar* text) { - hildon_banner_show_information(parent_widget, NULL, text); + modest_platform_information_banner(parent_widget, NULL, text); #if 0 GtkDialog *dialog = GTK_DIALOG (hildon_note_new_information (parent_window, text)); */ @@ -3638,16 +3772,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 @@ -4073,10 +4204,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 @@ -4105,7 +4235,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; @@ -4168,8 +4300,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); @@ -4358,7 +4491,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, } else if (!TNY_IS_FOLDER (src_folder)) { g_warning ("%s: src_folder is not a TnyFolder.\n", __FUNCTION__); do_xfer = FALSE; - } else if (!online && modest_platform_is_network_folderstore(src_folder)) { + } else if (!online && modest_tny_folder_store_is_remote(src_folder)) { guint num_headers = tny_folder_get_all_count(TNY_FOLDER (src_folder)); TnyAccount *account = tny_folder_get_account (TNY_FOLDER (src_folder)); if (!connect_to_get_msg(MODEST_WINDOW (win), num_headers, account)) @@ -4411,7 +4544,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action, } else if (gtk_widget_is_focus (GTK_WIDGET(header_view))) { gboolean do_xfer = TRUE; /* Ask for confirmation if the source folder is remote and we're not connected */ - if (!online && modest_platform_is_network_folderstore(src_folder)) { + if (!online && modest_tny_folder_store_is_remote(src_folder)) { TnyList *headers = modest_header_view_get_selected_headers(header_view); if (!msgs_already_deleted_from_server(headers, src_folder)) { guint num_headers = tny_list_get_length(headers); @@ -4451,7 +4584,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action, g_object_unref (header); account = tny_folder_get_account (src_folder); - if (!modest_platform_is_network_folderstore(TNY_FOLDER_STORE(src_folder))) { + if (!modest_tny_folder_store_is_remote(TNY_FOLDER_STORE(src_folder))) { /* Transfer if the source folder is local */ do_xfer = TRUE; } else if (remote_folder_is_pop(TNY_FOLDER_STORE(src_folder))) { @@ -4641,28 +4774,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 @@ -4793,8 +4966,51 @@ static void on_send_receive_finished (ModestMailOperation *mail_op, gpointer user_data) { + GtkWidget *header_view, *folder_view; + TnyFolderStore *folder_store; + ModestMainWindow *main_win = MODEST_MAIN_WINDOW (user_data); + /* Set send/receive operation finished */ - modest_main_window_notify_send_receive_completed (MODEST_MAIN_WINDOW (user_data)); + modest_main_window_notify_send_receive_completed (main_win); + + /* Don't refresh the current folder if there were any errors */ + if (modest_mail_operation_get_status (mail_op) != + MODEST_MAIL_OPERATION_STATUS_SUCCESS) + return; + + /* Refresh the current folder if we're viewing a window. We do + this because the user won't be able to see the new mails in + the selected folder after a Send&Receive because it only + performs a poke_status, i.e, only the number of read/unread + messages is updated, but the new headers are not + downloaded */ + folder_view = modest_main_window_get_child_widget (main_win, + MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW); + if (!folder_view) + return; + + folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); + + /* Do not need to refresh INBOX again because the + update_account does it always automatically */ + if (folder_store && TNY_IS_FOLDER (folder_store) && + tny_folder_get_folder_type (TNY_FOLDER (folder_store)) != TNY_FOLDER_TYPE_INBOX) { + + header_view = modest_main_window_get_child_widget (main_win, + MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW); + + /* We do not need to set the contents style + because it hasn't changed. We also do not + need to save the widget status. Just force + a refresh */ + modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), + TNY_FOLDER (folder_store), + folder_refreshed_cb, + main_win); + } + + if (folder_store) + g_object_unref (folder_store); } @@ -4898,3 +5114,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); + } +}