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);
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);
* 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: */
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)
return;
/* Open them */
- _modest_ui_actions_open (headers, win);
+ open_msgs_from_headers (headers, win);
g_object_unref(headers);
}
/* 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);
}
{
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);
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: */