X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=9708e5c3353358e56f4a2ccae75355c9a71ced6c;hp=32a2320a8a8663e47d097ce8fbbb51ce8f2b1098;hb=7cf7d40552d4509091984e1d647a4983a3205fe4;hpb=57a4c4df814066e93daa552df7fd3216b59fad8e diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 32a2320..9708e5c 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -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); @@ -856,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; @@ -1009,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); @@ -1066,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); @@ -1143,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: */ @@ -1172,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) @@ -1247,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); } @@ -1264,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; @@ -1493,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); @@ -1525,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); } @@ -1942,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); } @@ -2178,7 +2197,18 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op, gpointer user_data) { ModestMsgEditWindow *edit_window; - char *info_text; + 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); @@ -2187,9 +2217,6 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op, return; modest_msg_edit_window_set_draft (edit_window, saved_draft); - info_text = g_strdup_printf (_("mail_va_saved_to_drafts"), _("mcen_me_folder_drafts")); - modest_platform_information_banner (NULL, NULL, info_text); - g_free (info_text); } void @@ -2200,6 +2227,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi MsgData *data; gchar *account_name, *from; ModestAccountMgr *account_mgr; + char *info_text; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window)); @@ -2253,7 +2281,11 @@ 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)); @@ -2261,6 +2293,43 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi modest_msg_edit_window_free_msg_data (edit_window, data); modest_msg_edit_window_reset_modified (edit_window); + + /* ** 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: */ @@ -3635,16 +3704,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 @@ -4101,7 +4167,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; @@ -4164,8 +4232,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); @@ -4637,28 +4706,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