X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=c4ed79a3ae8d126f7bfff24b9d87c512583e2517;hb=3f10d9312b2c4060f85e1e2d43ef000c0a35ae01;hp=27db767e60cecc3b6004a641410cb541208e8029;hpb=13a6f218747f48162aa1b4b15c281b6edd1992c4;p=modest diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 27db767..c4ed79a 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -521,7 +521,6 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win) if (response == GTK_RESPONSE_OK) { - ModestWindow *main_window = NULL; ModestWindowMgr *mgr = NULL; GtkTreeModel *model = NULL; GtkTreeSelection *sel = NULL; @@ -552,7 +551,7 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win) } /* Disable window dimming management */ - modest_window_disable_dimming (MODEST_WINDOW(win)); + modest_window_disable_dimming (win); /* Remove each header. If it's a view window header_view == NULL */ mail_op = modest_mail_operation_new ((GObject *) win); @@ -565,18 +564,14 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win) if (sel != NULL) { gtk_tree_selection_unselect_all (sel); } - modest_window_enable_dimming (MODEST_WINDOW(win)); + modest_window_enable_dimming (win); if (MODEST_IS_MSG_VIEW_WINDOW (win)) { modest_ui_actions_refresh_message_window_after_delete (MODEST_MSG_VIEW_WINDOW (win)); /* Get main window */ mgr = modest_runtime_get_window_mgr (); - main_window = modest_window_mgr_get_main_window (mgr, FALSE); /* don't create */ } else if (MODEST_IS_MAIN_WINDOW (win)) { - /* Move cursor to next row */ - main_window = win; - /* Select next or previous row */ if (gtk_tree_row_reference_valid (next_row_reference)) { gtk_tree_selection_select_path (sel, next_path); @@ -597,10 +592,8 @@ modest_ui_actions_on_edit_mode_delete_message (ModestWindow *win) } /* Update toolbar dimming state */ - if (main_window) { - modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window)); - modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window)); - } + modest_ui_actions_check_menu_dimming_rules (win); + modest_ui_actions_check_toolbar_dimming_rules (win); /* Free */ g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL); @@ -863,7 +856,7 @@ modest_ui_actions_compose_msg(ModestWindow *win, if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) { modest_platform_run_information_dialog ( GTK_WINDOW(win), - _FM("sfil_ib_opening_not_allowed"), + _("mail_ib_error_attachment_size"), TRUE); return; } @@ -1001,18 +994,27 @@ modest_ui_actions_msg_retrieval_check (ModestMailOperation *mail_op, error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE)) { gchar *subject, *msg, *format = NULL; TnyAccount *account; - subject = tny_header_dup_subject (header); + + subject = (header) ? tny_header_dup_subject (header) : NULL; if (!subject) subject = g_strdup (_("mail_va_no_subject")); account = modest_mail_operation_get_account (mail_op); if (account) { - ModestProtocol *protocol; - ModestProtocolType proto; - proto = modest_tny_account_get_protocol_type (account); - protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (), proto); - if (protocol) - format = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject); + ModestProtocolType proto = modest_tny_account_get_protocol_type (account); + ModestProtocol *protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (), proto); + + if (protocol) { + if (tny_account_get_connection_status (account) == + TNY_CONNECTION_STATUS_CONNECTED) { + format = modest_protocol_get_translation (protocol, + MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, + subject); + } else { + format = g_strdup_printf (_("mail_ib_backend_server_invalid"), + tny_account_get_hostname (account)); + } + } g_object_unref (account); } @@ -1045,6 +1047,7 @@ typedef struct { typedef struct { GtkTreeModel *model; TnyHeader *header; + ModestWindow *caller_window; OpenMsgBannerInfo *banner_info; GtkTreeRowReference *rowref; } OpenMsgHelper; @@ -1349,10 +1352,22 @@ get_account_from_header (TnyHeader *header) } static void +caller_win_destroyed (OpenMsgHelper *helper, GObject *object) +{ + if (helper->caller_window) + helper->caller_window = NULL; +} + +static void open_msg_helper_destroyer (gpointer user_data) { OpenMsgHelper *helper = (OpenMsgHelper *) user_data; + if (helper->caller_window) { + g_object_weak_unref ((GObject *) helper->caller_window, (GWeakNotify) caller_win_destroyed, helper); + helper->caller_window = NULL; + } + if (helper->banner_info) { g_free (helper->banner_info->message); if (helper->banner_info->idle_handler > 0) { @@ -1392,7 +1407,7 @@ open_msg_performer(gboolean canceled, helper = (OpenMsgHelper *) user_data; status = tny_account_get_connection_status (account); - if (err || canceled) { + if (err || canceled || helper->caller_window == NULL) { modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), helper->header); /* Free the helper */ open_msg_helper_destroyer (helper); @@ -1591,6 +1606,8 @@ open_msg_from_header (TnyHeader *header, GtkTreeRowReference *rowref, ModestWind (the user could switch between folders) */ helper = g_slice_new (OpenMsgHelper); helper->model = g_object_ref (gtk_tree_view_get_model (GTK_TREE_VIEW (header_view))); + helper->caller_window = win; + g_object_weak_ref ((GObject *) helper->caller_window, (GWeakNotify) caller_win_destroyed, helper); helper->header = g_object_ref (header); helper->rowref = gtk_tree_row_reference_copy (rowref); helper->banner_info = NULL; @@ -1744,20 +1761,27 @@ reply_forward_cb (ModestMailOperation *mail_op, /* Create reply mail */ switch (rf_helper->action) { + /* Use the msg_header to ensure that we have all the + information. The summary can lack some data */ + TnyHeader *msg_header; case ACTION_REPLY: + msg_header = tny_msg_get_header (msg); new_msg = - modest_tny_msg_create_reply_msg (msg, header, from, + modest_tny_msg_create_reply_msg (msg, msg_header, from, (use_signature) ? signature : NULL, rf_helper->reply_forward_type, MODEST_TNY_MSG_REPLY_MODE_SENDER); + g_object_unref (msg_header); break; case ACTION_REPLY_TO_ALL: + msg_header = tny_msg_get_header (msg); new_msg = - modest_tny_msg_create_reply_msg (msg, header, from, + modest_tny_msg_create_reply_msg (msg, msg_header, from, (use_signature) ? signature : NULL, rf_helper->reply_forward_type, MODEST_TNY_MSG_REPLY_MODE_ALL); edit_type = MODEST_EDIT_TYPE_REPLY; + g_object_unref (msg_header); break; case ACTION_FORWARD: new_msg = @@ -2163,7 +2187,12 @@ new_messages_arrived (ModestMailOperation *self, flags = tny_header_get_flags (header); if (!(flags & TNY_HEADER_FLAG_SEEN)) { - tny_list_append (actually_new_list, G_OBJECT (header)); + /* Messages are ordered from most + recent to oldest. But we want to + show notifications starting from + the oldest message. That's why we + reverse the list */ + tny_list_prepend (actually_new_list, G_OBJECT (header)); } g_object_unref (header); } @@ -2297,7 +2326,7 @@ modest_ui_actions_do_send_receive (const gchar *account_name, if (!acc_name) acc_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); if (!acc_name) { - g_printerr ("modest: cannot get default account\n"); + modest_platform_information_banner (NULL, NULL, _("emev_ni_internal_error")); return; } } else { @@ -2307,6 +2336,12 @@ modest_ui_actions_do_send_receive (const gchar *account_name, acc_store = modest_runtime_get_account_store (); account = modest_tny_account_store_get_server_account (acc_store, acc_name, TNY_ACCOUNT_TYPE_STORE); + if (!account) { + g_free (acc_name); + modest_platform_information_banner (NULL, NULL, _("emev_ni_internal_error")); + return; + } + /* Do not automatically refresh accounts that are flagged as NO_AUTO_UPDATE. This could be useful for accounts that handle their own update times */ @@ -2929,7 +2964,7 @@ enough_space_for_message (ModestMsgEditWindow *edit_window, if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) { modest_platform_run_information_dialog ( GTK_WINDOW(edit_window), - _FM("sfil_ib_opening_not_allowed"), + _("mail_ib_error_attachment_size"), TRUE); return FALSE; } @@ -3364,7 +3399,7 @@ do_create_folder_cb (ModestMailOperation *mail_op, error = modest_mail_operation_get_error (mail_op); if (error) { - gboolean disk_full; + gboolean disk_full = FALSE; TnyAccount *account; /* Show an error. If there was some problem writing to disk, show it, otherwise show the generic folder @@ -4794,6 +4829,16 @@ modest_ui_actions_on_details (GtkAction *action, } void +modest_ui_actions_on_limit_error (GtkAction *action, + ModestWindow *win) +{ + g_return_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win)); + + modest_platform_information_banner ((GtkWidget *) win, NULL, _CS("ckdg_ib_maximum_characters_reached")); + +} + +void modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle, ModestMsgEditWindow *window) { @@ -5366,7 +5411,7 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, { GObject *win = NULL; const GError *error; - TnyAccount *account; + TnyAccount *account = NULL; #ifndef MODEST_TOOLKIT_HILDON2 ModestWindow *main_window = NULL; @@ -5391,7 +5436,11 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, #endif win = modest_mail_operation_get_source (mail_op); error = modest_mail_operation_get_error (mail_op); - account = modest_mail_operation_get_account (mail_op); + + if (TNY_IS_FOLDER (user_data)) + account = modest_tny_folder_get_account (TNY_FOLDER (user_data)); + else if (TNY_IS_ACCOUNT (user_data)) + account = g_object_ref (user_data); /* If it's not a disk full error then show a generic error */ if (!modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), @@ -5696,7 +5745,7 @@ xfer_messages_performer (gboolean canceled, /* tinymail will return NULL for local folders it seems */ dst_forbids_message_add = modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (), modest_tny_account_get_protocol_type (dst_account), - MODEST_PROTOCOL_REGISTRY_STORE_FORBID_MESSAGE_ADD); + MODEST_PROTOCOL_REGISTRY_STORE_FORBID_INCOMING_XFERS); g_object_unref (dst_account); if (dst_forbids_message_add) { @@ -5804,15 +5853,10 @@ on_move_folder_cb (gboolean canceled, mail_op = modest_mail_operation_new_with_error_handling (G_OBJECT(parent_window), - modest_ui_actions_move_folder_error_handler, - info->src_folder, NULL); + modest_ui_actions_move_folder_error_handler, + g_object_ref (info->dst_folder), g_object_unref); modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), - mail_op); - - /* Select *after* the changes */ - /* TODO: this function hangs UI after transfer */ - /* modest_folder_view_select_folder (MODEST_FOLDER_VIEW(folder_view), */ - /* TNY_FOLDER (src_folder), TRUE); */ + mail_op); if (MODEST_IS_MAIN_WINDOW (parent_window)) { modest_folder_view_select_folder (MODEST_FOLDER_VIEW(info->folder_view), @@ -6843,8 +6887,15 @@ modest_ui_actions_on_delete_account (GtkWindow *parent_window, g_free (default_account_name); removed = modest_account_mgr_remove_account (account_mgr, account_name); - if (!removed) + if (removed) { + /* Close all email notifications, we cannot + distinguish if the notification belongs to + this account or not, so for safety reasons + we remove them all */ + modest_platform_remove_new_mail_notifications (FALSE); + } else { g_warning ("%s: modest_account_mgr_remove_account() failed.\n", __FUNCTION__); + } } return removed; } @@ -6896,3 +6947,89 @@ modest_ui_actions_on_reload_message (const gchar *msg_id) modest_msg_view_window_reload (MODEST_MSG_VIEW_WINDOW (window)); } + +/** Check whether any connections are active, and cancel them if + * the user wishes. + * Returns TRUE is there was no problem, + * or if an operation was cancelled so we can continue. + * Returns FALSE if the user chose to cancel his request instead. + */ + +gboolean +modest_ui_actions_check_for_active_account (ModestWindow *self, + const gchar* account_name) +{ + ModestTnySendQueue *send_queue; + ModestTnyAccountStore *acc_store; + ModestMailOperationQueue* queue; + TnyConnectionStatus store_conn_status; + TnyAccount *store_account = NULL, *transport_account = NULL; + gboolean retval = TRUE, sending = FALSE; + + acc_store = modest_runtime_get_account_store (); + queue = modest_runtime_get_mail_operation_queue (); + + store_account = + modest_tny_account_store_get_server_account (acc_store, + account_name, + TNY_ACCOUNT_TYPE_STORE); + + /* This could happen if the account was deleted before the + call to this function */ + if (!store_account) + return FALSE; + + transport_account = + modest_tny_account_store_get_server_account (acc_store, + account_name, + TNY_ACCOUNT_TYPE_TRANSPORT); + + /* This could happen if the account was deleted before the + call to this function */ + if (!transport_account) { + g_object_unref (store_account); + return FALSE; + } + + /* If the transport account was not used yet, then the send + queue could not exist (it's created on demand) */ + send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT (transport_account), FALSE); + if (TNY_IS_SEND_QUEUE (send_queue)) + sending = modest_tny_send_queue_sending_in_progress (send_queue); + + store_conn_status = tny_account_get_connection_status (store_account); + if (store_conn_status == TNY_CONNECTION_STATUS_CONNECTED || sending) { + gint response; + + response = modest_platform_run_confirmation_dialog (GTK_WINDOW (self), + _("emev_nc_disconnect_account")); + if (response == GTK_RESPONSE_OK) { + retval = TRUE; + } else { + retval = FALSE; + } + } + + if (retval) { + + /* FIXME: We should only cancel those of this account */ + modest_mail_operation_queue_cancel_all (queue); + + /* Also disconnect the account */ + if ((tny_account_get_connection_status (store_account) != TNY_CONNECTION_STATUS_DISCONNECTED) && + (tny_account_get_connection_status (store_account) != TNY_CONNECTION_STATUS_DISCONNECTED_BROKEN)) { + tny_camel_account_set_online (TNY_CAMEL_ACCOUNT (store_account), + FALSE, NULL, NULL); + } + if (sending) { + tny_camel_account_set_online (TNY_CAMEL_ACCOUNT (transport_account), + FALSE, NULL, NULL); + } + } + + /* Frees */ + g_object_unref (store_account); + g_object_unref (transport_account); + + return retval; +}