* Changes in the autotools stuff affecting a lot of platform dependent
[modest] / src / modest-ui-actions.c
index 3aedf73..2239f56 100644 (file)
@@ -41,7 +41,6 @@
 #include <modest-address-book.h>
 #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 "modest-debug.h"
 
 #ifdef MODEST_PLATFORM_MAEMO
 #include "maemo/modest-osso-state-saving.h"
+#endif /* MODEST_PLATFORM_MAEMO */
+#ifndef MODEST_TOOLKIT_GTK
 #include "maemo/modest-hildon-includes.h"
 #include "maemo/modest-connection-specific-smtp-window.h"
-#endif /* MODEST_PLATFORM_MAEMO */
+#endif /* !MODEST_TOOLKIT_GTK */
 #include <modest-utils.h>
 
 #include "widgets/modest-ui-constants.h"
@@ -157,7 +158,7 @@ static gboolean connect_to_get_msg (ModestWindow *win,
                                    gint num_of_uncached_msgs,
                                    TnyAccount *account);
 
-static gboolean remote_folder_is_pop (TnyFolderStore *folder);
+static gboolean remote_folder_has_leave_on_server (TnyFolderStore *folder);
 
 static void     do_create_folder (GtkWindow *window, 
                                  TnyFolderStore *parent_folder, 
@@ -171,18 +172,19 @@ static TnyAccount *get_account_from_folder_store (TnyFolderStore *folder_store);
  * This function checks whether a TnyFolderStore is a pop account
  */
 static gboolean
-remote_folder_is_pop (TnyFolderStore *folder)
+remote_folder_has_leave_on_server (TnyFolderStore *folder)
 {
-        const gchar *proto = NULL;
-        TnyAccount *account = NULL;
+        TnyAccount *account;
+       gboolean result;
 
         g_return_val_if_fail (TNY_IS_FOLDER_STORE (folder), FALSE);
        
        account = get_account_from_folder_store (folder);
-        proto = tny_account_get_proto (account);
+       result = (modest_protocol_registry_protocol_type_has_leave_on_server (modest_runtime_get_protocol_registry (),
+                                                                             modest_tny_account_get_protocol_type (account)));
         g_object_unref (account);
 
-        return (modest_protocol_info_get_transport_store_protocol (proto) == MODEST_PROTOCOL_STORE_POP);
+       return result;
 }
 
 /* FIXME: this should be merged with the similar code in modest-account-view-window */
@@ -673,7 +675,7 @@ modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
         * because it requires an API (libconic) to detect different connection 
         * possiblities.
         */
-#ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
+#ifndef MODEST_TOOLKIT_GTK /* Defined in config.h */
        
        /* Create the window if necessary: */
        GtkWidget *specific_window = GTK_WIDGET (modest_connection_specific_smtp_window_new ());
@@ -685,7 +687,7 @@ modest_ui_actions_on_smtp_servers (GtkAction *action, ModestWindow *win)
        modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), 
                                     GTK_WINDOW (specific_window));
        gtk_widget_show (specific_window);
-#endif /* MODEST_PLATFORM_MAEMO */
+#endif /* !MODEST_TOOLKIT_GTK */
 }
 
 void
@@ -738,9 +740,9 @@ modest_ui_actions_compose_msg(ModestWindow *win,
 
        signature = modest_account_mgr_get_signature (mgr, account_name, &use_signature);
        if (body_str != NULL) {
-               body = use_signature ? g_strconcat(body_str, "\n", signature, NULL) : g_strdup(body_str);
+               body = use_signature ? g_strconcat(body_str, "\n--\n", signature, NULL) : g_strdup(body_str);
        } else {
-               body = use_signature ? g_strconcat("\n", signature, NULL) : g_strdup("");
+               body = use_signature ? g_strconcat("\n--\n", signature, NULL) : g_strdup("");
        }
 
        msg = modest_tny_msg_new (to_str, from_str, cc_str, bcc_str, subject_str, body, NULL, NULL, NULL);
@@ -754,11 +756,15 @@ modest_ui_actions_compose_msg(ModestWindow *win,
        total_size = 0;
        allowed_size = MODEST_MAX_ATTACHMENT_SIZE;
        msg_win = modest_msg_edit_window_new (msg, account_name, FALSE);
+
+       modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win);
+       modest_msg_edit_window_set_modified (MODEST_MSG_EDIT_WINDOW (msg_win), set_as_modified);
+       gtk_widget_show_all (GTK_WIDGET (msg_win));
+
        while (attachments) {
                total_size +=
-                       modest_msg_edit_window_attach_file_one(
-                               (ModestMsgEditWindow *)msg_win,
-                               attachments->data, allowed_size);
+                       modest_msg_edit_window_attach_file_one((ModestMsgEditWindow *)msg_win,
+                                                              attachments->data, allowed_size);
 
                if (total_size > allowed_size) {
                        g_warning ("%s: total size: %u",
@@ -769,10 +775,6 @@ modest_ui_actions_compose_msg(ModestWindow *win,
 
                attachments = g_slist_next(attachments);
        }
-       modest_window_mgr_register_window (modest_runtime_get_window_mgr(), msg_win);
-       modest_msg_edit_window_set_modified (MODEST_MSG_EDIT_WINDOW (msg_win), set_as_modified);
-
-       gtk_widget_show_all (GTK_WIDGET (msg_win));
 
 cleanup:
        g_free (from_str);
@@ -935,45 +937,28 @@ open_msg_cb (ModestMailOperation *mail_op,
        
        if (open_in_editor) {
                ModestAccountMgr *mgr = modest_runtime_get_account_mgr ();
-               gchar *from_header = NULL;
+               gchar *from_header = NULL, *acc_name;
 
                from_header = tny_header_dup_from (header);
 
                /* we cannot edit without a valid account... */
                if (!modest_account_mgr_has_accounts(mgr, TRUE)) {
                        if (!modest_ui_actions_run_account_setup_wizard(parent_win)) {
-                               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (), 
+                               modest_window_mgr_unregister_header (modest_runtime_get_window_mgr (),
                                                                     header);
                                g_free (from_header);
                                goto cleanup;
                        }
                }
-               
-               if (from_header) {
-                       GSList *accounts = modest_account_mgr_account_names (mgr, TRUE);
-                       GSList *node = NULL;
-
-                       for (node = accounts; node != NULL; node = g_slist_next (node)) {
-                               gchar *from = modest_account_mgr_get_from_string (mgr, node->data);
-                               
-                               if (from && (strcmp (from_header, from) == 0)) {
-                                       g_free (account);
-                                       account = g_strdup (node->data);
-                                       g_free (from);
-                                       break;
-                               }
-                               g_free (from);
-                       }
 
-                       g_free (from_header);
-                       g_slist_foreach (accounts, (GFunc) g_free, NULL);
-                       g_slist_free (accounts);
+               acc_name = modest_utils_get_account_name_from_recipient (from_header);
+               g_free (from_header);
+               if (acc_name) {
+                       g_free (account);
+                       account = acc_name;
                }
 
                win = modest_msg_edit_window_new (msg, account, TRUE);
-
-
-
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
                
@@ -1182,9 +1167,8 @@ open_msgs_performer(gboolean canceled,
                    gpointer user_data)
 {
        ModestMailOperation *mail_op = NULL;
-       const gchar *proto_name;
        gchar *error_msg;
-       ModestTransportStoreProtocol proto;
+       ModestProtocolType proto;
        TnyList *not_opened_headers;
        TnyConnectionStatus status;
        gboolean show_open_draft = FALSE;
@@ -1208,27 +1192,37 @@ open_msgs_performer(gboolean canceled,
        }
 
        /* 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;
+       proto = modest_tny_account_get_protocol_type (account);
+       if (proto == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
+               proto = MODEST_PROTOCOLS_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));
-                       gchar *subject = tny_header_dup_subject (header);
-                       error_msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"),
-                                                    subject);
-                       g_free (subject);
-                       g_object_unref (header);
-                       g_object_unref (iter);
-               } else {
+               ModestProtocol *protocol;
+               ModestProtocolRegistry *protocol_registry;
+               TnyIterator *iter;
+               TnyHeader *header;
+               gchar *subject;
+
+               protocol_registry = modest_runtime_get_protocol_registry ();
+               iter = tny_list_create_iterator (not_opened_headers);
+               header = TNY_HEADER (tny_iterator_get_current (iter));
+               subject = tny_header_dup_subject (header);
+
+               protocol = modest_protocol_registry_get_protocol_by_type (protocol_registry, proto);
+               error_msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
+               g_free (subject);
+               g_object_unref (header);
+               g_object_unref (iter);
+               
+               if (error_msg == NULL) {
+                       error_msg = g_strdup (_("mail_ni_ui_folder_get_msg_folder_error"));
+               }
+
+               if (modest_protocol_registry_protocol_type_has_tag (protocol_registry,
+                                                                   proto,
+                                                                   MODEST_PROTOCOL_REGISTRY_LOCAL_STORE_PROTOCOLS)) { 
                        TnyHeader *header;
                        TnyFolder *folder;
                        TnyIterator *iter;
@@ -1242,7 +1236,6 @@ open_msgs_performer(gboolean canceled,
                        g_object_unref (folder);
                        g_object_unref (header);
                        g_object_unref (iter);
-                       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"));
@@ -2419,7 +2412,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                if (TNY_IS_FOLDER (folder_store) && selected) {
                        TnyAccount *account;
                        const gchar *account_name = NULL;
-                       gboolean refresh;
 
                        /* Update the active account */
                        account = modest_tny_folder_get_account (TNY_FOLDER (folder_store));
@@ -2437,8 +2429,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                        modest_main_window_set_contents_style (main_window, 
                                                               MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
 
-                       refresh = !modest_account_mgr_account_is_busy (modest_runtime_get_account_mgr (), account_name);
-
                        /* Set folder on header view. This function
                           will call tny_folder_refresh_async so we
                           pass a callback that will be called when
@@ -2446,7 +2436,7 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                           empty view if there are no messages */
                        modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
                                                       TNY_FOLDER (folder_store),
-                                                      refresh,
+                                                      TRUE,
                                                       folder_refreshed_cb,
                                                       main_window);
                        
@@ -2464,7 +2454,7 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
                           already being done by the sort
                           dialog. Remove it when the GNOME version
                           has the same behaviour */
-#ifdef MODEST_PLATFORM_GNOME
+#ifdef MODEST_TOOLKIT_GTK
                        if (modest_main_window_get_contents_style (main_window) ==
                            MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS)
                                modest_widget_memory_save (conf, G_OBJECT (header_view), 
@@ -2597,37 +2587,31 @@ on_save_to_drafts_cb (ModestMailOperation *mail_op,
        g_object_unref(edit_window);
 }
 
-gboolean
-modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
+static gboolean
+enough_space_for_message (ModestMsgEditWindow *edit_window,
+                         MsgData *data)
 {
-       TnyTransportAccount *transport_account;
-       ModestMailOperation *mail_operation;
-       MsgData *data;
-       gchar *account_name, *from;
-       ModestAccountMgr *account_mgr;
-/*     char *info_text; */
-       gboolean had_error = FALSE;
+       TnyAccountStore *acc_store;
        guint64 available_disk, expected_size;
        gint parts_count;
        guint64 parts_size;
-       ModestMainWindow *win;
-
-       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
-       
-       data = modest_msg_edit_window_get_msg_data (edit_window);
 
        /* Check size */
-       available_disk = modest_folder_available_space (NULL);
+       acc_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store());
+       available_disk = modest_utils_get_available_space (NULL);
        modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
        expected_size = modest_tny_msg_estimate_size (data->plain_body,
-                                                data->html_body,
-                                                parts_count,
-                                                parts_size);
+                                                     data->html_body,
+                                                     parts_count,
+                                                     parts_size);
 
-       if ((available_disk != -1) && expected_size > available_disk) {
-               modest_msg_edit_window_free_msg_data (edit_window, data);
+       /* Double check: memory full condition or message too big */
+       if (available_disk < MIN_FREE_SPACE || 
+           expected_size > available_disk) {
 
-               modest_platform_information_banner (NULL, NULL, dgettext("ke-recv", "cerm_device_memory_full"));
+               modest_platform_information_banner (NULL, NULL, 
+                                                   dgettext("ke-recv", 
+                                                            "cerm_device_memory_full"));
                return FALSE;
        }
 
@@ -2637,13 +2621,9 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
         * MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h) this
         * should still allow for sending anything critical...
         */
-       if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE)) {
-                       modest_msg_edit_window_free_msg_data (edit_window, data);
-                       return FALSE;
-               }
-       }
+       if ((expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) &&
+           modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE))
+               return FALSE;
 
        /*
         * djcb: we also make sure that the attachments are smaller than the max size
@@ -2656,6 +2636,29 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
                        GTK_WINDOW(edit_window),
                        dgettext("ke-recv","memr_ib_operation_disabled"),
                        TRUE);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean
+modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edit_window)
+{
+       TnyTransportAccount *transport_account;
+       ModestMailOperation *mail_operation;
+       MsgData *data;
+       gchar *account_name, *from;
+       ModestAccountMgr *account_mgr;
+       gboolean had_error = FALSE;
+       ModestMainWindow *win;
+
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), FALSE);
+       
+       data = modest_msg_edit_window_get_msg_data (edit_window);
+
+       /* Check size */
+       if (!enough_space_for_message (edit_window, data)) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
                return FALSE;
        }
@@ -2678,7 +2681,7 @@ modest_ui_actions_on_save_to_drafts (GtkWidget *widget, ModestMsgEditWindow *edi
 
        transport_account =
                TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_server_account
-                                     (modest_runtime_get_account_store(),
+                                     (modest_runtime_get_account_store (),
                                       account_name,
                                       TNY_ACCOUNT_TYPE_TRANSPORT));
        if (!transport_account) {
@@ -2776,62 +2779,27 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
 {
        TnyTransportAccount *transport_account = NULL;
        gboolean had_error = FALSE;
-       guint64 available_disk, expected_size;
-       gint parts_count;
-       guint64 parts_size;
+       MsgData *data;
+       ModestAccountMgr *account_mgr;
+       gchar *account_name;
+       gchar *from;
+       ModestMailOperation *mail_operation;
 
        g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window), TRUE);
 
        if (!modest_msg_edit_window_check_names (edit_window, TRUE))
                return TRUE;
        
-       MsgData *data = modest_msg_edit_window_get_msg_data (edit_window);
+       data = modest_msg_edit_window_get_msg_data (edit_window);
 
        /* Check size */
-       available_disk = modest_folder_available_space (NULL);
-       modest_msg_edit_window_get_parts_size (edit_window, &parts_count, &parts_size);
-       expected_size = modest_tny_msg_estimate_size (data->plain_body,
-                                                data->html_body,
-                                                parts_count,
-                                                parts_size);
-
-       if ((available_disk != -1) && expected_size > available_disk) {
+       if (!enough_space_for_message (edit_window, data)) {
                modest_msg_edit_window_free_msg_data (edit_window, data);
-
-               modest_platform_information_banner (NULL, NULL, dgettext("ke-recv", "cerm_device_memory_full"));
                return FALSE;
        }
 
-       
-       /*
-        * djcb: if we're in low-memory state, we only allow for sending messages
-        * smaller than MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE (see modest-defs.h)
-        * this should still allow for sending anything critical... 
-        */
-       if (expected_size > MODEST_MAX_LOW_MEMORY_MESSAGE_SIZE) {
-               if (modest_platform_check_memory_low (MODEST_WINDOW(edit_window), TRUE)) {
-                       modest_msg_edit_window_free_msg_data (edit_window, data);
-                       return FALSE;
-               }
-       }
-
-       /*
-        * djcb: we also make sure that the attachments are smaller than the max size
-        * this is for the case where we'd try to forward a message with attachments 
-        * bigger than our max allowed size, or sending an message from drafts which
-        * somehow got past our checks when attaching.
-        */
-       if (expected_size > MODEST_MAX_ATTACHMENT_SIZE) {
-               modest_platform_run_information_dialog (
-                       GTK_WINDOW(edit_window),
-                       dgettext("ke-recv","memr_ib_operation_disabled"),
-                       TRUE);
-               modest_msg_edit_window_free_msg_data (edit_window, data);
-               return FALSE;
-       }
-
-       ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
-       gchar *account_name = g_strdup (data->account_name);
+       account_mgr = modest_runtime_get_account_mgr();
+       account_name = g_strdup (data->account_name);
        if (!account_name)
                account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
 
@@ -2848,9 +2816,10 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
        
        /* Get the currently-active transport account for this modest account: */
        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));
+               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) {
@@ -2860,17 +2829,17 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
                        return TRUE;
        }
        
-       gchar *from = modest_account_mgr_get_from_string (account_mgr, account_name);
 
        /* Create the mail operation */
-       ModestMailOperation *mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler, NULL, NULL);
+       from = modest_account_mgr_get_from_string (account_mgr, account_name);
+       mail_operation = modest_mail_operation_new_with_error_handling (NULL, modest_ui_actions_disk_operations_error_handler, NULL, NULL);
        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
 
        modest_mail_operation_send_new_mail (mail_operation,
                                             transport_account,
                                             data->draft_msg,
                                             from,
-                                            data->to, 
+                                            data->to,
                                             data->cc, 
                                             data->bcc,
                                             data->subject, 
@@ -3065,7 +3034,7 @@ modest_ui_actions_on_remove_attachments (GtkAction *action,
 }
 
 
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
 typedef struct {
        guint handler;
        gchar *name;
@@ -3120,7 +3089,7 @@ do_create_folder_cb (ModestMailOperation *mail_op,
                /* Try again. Do *NOT* show any error because the mail
                   operations system will do it for us because we
                   created the mail_op with new_with_error_handler */
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
                CreateFolderHelper *helper;
                helper = g_slice_new0 (CreateFolderHelper);
                helper->name = g_strdup (suggested_name);
@@ -3331,7 +3300,7 @@ on_rename_folder_performer (gboolean canceled,
 
                /* Clear the headers view */
                sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view));
-               gtk_tree_selection_unselect_all (sel);
+               gtk_tree_selection_unselect_all (sel);
 
                /* Actually rename the folder */
                modest_mail_operation_rename_folder (mail_op,
@@ -3339,6 +3308,7 @@ on_rename_folder_performer (gboolean canceled,
                                                     (const gchar *) (data->new_name),
                                                     on_rename_folder_cb,
                                                     folder_view);
+               g_object_unref (data->folder);
                g_object_unref (mail_op);
        }
 
@@ -3390,7 +3360,7 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
                        do_rename = FALSE;
                } else {
                        RenameFolderInfo *rename_folder_data = g_new0 (RenameFolderInfo, 1);
-                       rename_folder_data->folder = folder;
+                       rename_folder_data->folder = g_object_ref (folder);
                        rename_folder_data->new_name = folder_name;
                        modest_platform_connect_if_remote_and_perform (GTK_WINDOW(main_window), TRUE,
                                        folder, on_rename_folder_performer, rename_folder_data);
@@ -3570,7 +3540,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
        if (remember)
                *remember = TRUE;
                
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        /* Maemo uses a different (awkward) button order,
         * It should probably just use gtk_alternative_dialog_button_order ().
         */
@@ -3591,7 +3561,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
                                              GTK_STOCK_OK,
                                              GTK_RESPONSE_ACCEPT,
                                              NULL);
-#endif /* MODEST_PLATFORM_MAEMO */
+#endif /* !MODEST_TOOLKIT_GTK */
 
        modest_window_mgr_set_modal (modest_runtime_get_window_mgr(), GTK_WINDOW (dialog));
        
@@ -3632,7 +3602,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
         */
        gtk_widget_set_sensitive (entry_username, FALSE);
 
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        /* Auto-capitalization is the default, so let's turn it off: */
        hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_username), HILDON_GTK_INPUT_MODE_FULL);
        
@@ -3650,14 +3620,14 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 #else 
        gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_username,
                            TRUE, FALSE, 0);
-#endif /* MODEST_PLATFORM_MAEMO */     
+#endif /* !MODEST_TOOLKIT_GTK */       
                            
        /* password: */
        GtkWidget *entry_password = gtk_entry_new ();
        gtk_entry_set_visibility (GTK_ENTRY(entry_password), FALSE);
        /* gtk_entry_set_invisible_char (GTK_ENTRY(entry_password), "*"); */
        
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        /* Auto-capitalization is the default, so let's turn it off: */
        hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry_password), 
                HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
@@ -3672,7 +3642,7 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
 #else 
        gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry_password,
                            TRUE, FALSE, 0);
-#endif /* MODEST_PLATFORM_MAEMO */     
+#endif /* !MODEST_TOOLKIT_GTK */       
 
        if (initial_username != NULL)
                gtk_widget_grab_focus (GTK_WIDGET (entry_password));
@@ -3834,9 +3804,16 @@ modest_ui_actions_on_copy (GtkAction *action,
                gtk_clipboard_set_can_store (clipboard, NULL, 0);
                gtk_clipboard_store (clipboard);
        } else if (GTK_IS_HTML (focused_widget)) {
-               gtk_html_copy (GTK_HTML (focused_widget));
-               gtk_clipboard_set_can_store (clipboard, NULL, 0);
-               gtk_clipboard_store (clipboard);
+               const gchar *sel;
+               int len = -1;
+               sel = gtk_html_get_selection_html (GTK_HTML (focused_widget), &len);
+               if ((sel == NULL) || (sel[0] == '\0')) {
+                       copied = FALSE;
+               } else {
+                       gtk_html_copy (GTK_HTML (focused_widget));
+                       gtk_clipboard_set_can_store (clipboard, NULL, 0);
+                       gtk_clipboard_store (clipboard);
+               }
        } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
                GtkTextBuffer *buffer;
                buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
@@ -4261,11 +4238,12 @@ headers_action_show_details (TnyHeader *header,
        dialog = modest_details_dialog_new_with_header (GTK_WINDOW (window), header);
 
        /* Run dialog */
-       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+       modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (dialog));
        gtk_widget_show_all (dialog);
-       gtk_dialog_run (GTK_DIALOG (dialog));
 
-       gtk_widget_destroy (dialog);
+       g_signal_connect_swapped (dialog, "response", 
+                                 G_CALLBACK (gtk_widget_destroy),
+                                 dialog);
 }
 
 /*
@@ -4489,7 +4467,7 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
                return;
 
        children = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area));
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        ok_button = GTK_WIDGET (children->next->next->data);
        new_button = GTK_WIDGET (children->next->data);
 #else
@@ -4510,15 +4488,17 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
 
                if ((gpointer) local_account != (gpointer) folder_store &&
                    (gpointer) mmc_account != (gpointer) folder_store) {
-                       const char *proto_name = tny_account_get_proto (TNY_ACCOUNT (folder_store));
-                       ModestTransportStoreProtocol proto = MODEST_PROTOCOL_STORE_MAILDIR;
-                       if (proto_name != NULL) {
-                               proto = modest_protocol_info_get_transport_store_protocol (proto_name);
+                       ModestProtocolType proto;
+                       proto = modest_tny_account_get_protocol_type (TNY_ACCOUNT (folder_store));
+                       if (proto == MODEST_PROTOCOL_REGISTRY_TYPE_INVALID) {
+                               proto = MODEST_PROTOCOLS_STORE_MAILDIR;
                        }
                        is_local_account = FALSE;
                        /* New button should be dimmed on remote
                           POP account root */
-                       new_sensitive = (proto != MODEST_PROTOCOL_STORE_POP);
+                       new_sensitive = (modest_protocol_registry_protocol_type_has_tag (modest_runtime_get_protocol_registry (),
+                                                                                        proto,
+                                                                                        MODEST_PROTOCOL_REGISTRY_STORE_HAS_FOLDERS));
                }
                g_object_unref (local_account);
                g_object_unref (mmc_account);
@@ -4632,7 +4612,7 @@ create_move_to_dialog (GtkWindow *win,
                                              GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
                                              NULL);
 
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        gtk_dialog_add_button (GTK_DIALOG (dialog), _("mcen_bd_dialog_ok"), GTK_RESPONSE_ACCEPT);
        /* We do this manually so GTK+ does not associate a response ID for
         * the button. */
@@ -4657,7 +4637,7 @@ create_move_to_dialog (GtkWindow *win,
                                         GTK_POLICY_AUTOMATIC,
                                         GTK_POLICY_AUTOMATIC);
 
-#ifndef MODEST_PLATFORM_MAEMO
+#ifdef MODEST_TOOLKIT_GTK
        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_IN);
 #endif
 
@@ -4740,7 +4720,7 @@ create_move_to_dialog (GtkWindow *win,
                            scroll, TRUE, TRUE, 0);
 
        gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
-#ifdef MODEST_PLATFORM_MAEMO
+#ifndef MODEST_TOOLKIT_GTK
        gtk_window_set_default_size (GTK_WINDOW (dialog), 300, 300);
 #else
        gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 400);
@@ -5127,7 +5107,7 @@ modest_ui_actions_xfer_messages_check (GtkWindow *parent_window,
                /* The transfer is possible and the user wants to */
                *do_xfer = TRUE;
 
-               if (remote_folder_is_pop (src_folder) && delete_originals) {
+               if (remote_folder_has_leave_on_server (src_folder) && delete_originals) {
                        const gchar *account_name;
                        gboolean leave_on_server;
                        
@@ -5187,8 +5167,7 @@ xfer_messages_performer  (gboolean canceled,
 {
        ModestWindow *win = MODEST_WINDOW (parent_window);
        TnyAccount *dst_account = NULL;
-       const gchar *proto_str = NULL;
-       gboolean dst_is_pop = FALSE;
+       gboolean dst_forbids_message_add = FALSE;
        XferMsgsHelper *helper;
        MoveToHelper *movehelper;
        ModestMailOperation *mail_op;
@@ -5204,16 +5183,14 @@ xfer_messages_performer  (gboolean canceled,
        }
 
        dst_account = tny_folder_get_account (TNY_FOLDER (helper->dst_folder));
-       proto_str = tny_account_get_proto (dst_account);
 
        /* tinymail will return NULL for local folders it seems */
-       dst_is_pop = proto_str &&
-               (modest_protocol_info_get_transport_store_protocol (proto_str) == 
-                MODEST_PROTOCOL_STORE_POP);
-
+       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);
        g_object_unref (dst_account);
 
-       if (dst_is_pop) {
+       if (dst_forbids_message_add) {
                modest_platform_information_banner (GTK_WIDGET (win),
                                                    NULL,
                                                    ngettext("mail_in_ui_folder_move_target_error",
@@ -5418,6 +5395,10 @@ modest_ui_actions_transfer_messages_helper (GtkWindow *win,
        gboolean need_connection = TRUE;
        gboolean do_xfer = TRUE;
        XferMsgsHelper *helper;
+
+       g_return_if_fail (TNY_IS_FOLDER (src_folder));
+       g_return_if_fail (TNY_IS_FOLDER (dst_folder));
+       g_return_if_fail (TNY_IS_LIST (headers));
        
        modest_ui_actions_xfer_messages_check (win, TNY_FOLDER_STORE (src_folder), 
                                               headers, TNY_FOLDER (dst_folder),
@@ -5476,6 +5457,7 @@ modest_ui_actions_on_msg_view_window_move_to (GtkAction *action,
                                                    TNY_FOLDER (dst_folder));
 
        /* Frees */
+       g_object_unref (src_folder);
        g_object_unref (header);
        g_object_unref (headers);
 }
@@ -5510,7 +5492,7 @@ modest_ui_actions_on_move_to (GtkAction *action,
        /* Create and run the dialog */
        dialog = create_move_to_dialog (GTK_WINDOW (win), folder_view, &tree_view);
        modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (tree_view));
-       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+       modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (dialog));
        result = gtk_dialog_run (GTK_DIALOG(dialog));
        g_object_ref (tree_view);
        gtk_widget_destroy (dialog);
@@ -6056,6 +6038,8 @@ modest_ui_actions_on_send_queue_status_changed (ModestTnySendQueue *send_queue,
        /* Rerun dimming rules, because the message could become deletable for example */
        modest_window_check_dimming_rules_group (MODEST_WINDOW (main_window), 
                                                 MODEST_DIMMING_RULES_TOOLBAR);
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (main_window), 
+                                                MODEST_DIMMING_RULES_MENU);
        
        /* Free */
  frees:
@@ -6067,31 +6051,18 @@ void
 modest_ui_actions_on_account_connection_error (GtkWindow *parent_window,
                                               TnyAccount *account)
 {
-       ModestTransportStoreProtocol proto;
-       const gchar *proto_name;
+       ModestProtocolType protocol_type;
+       ModestProtocol *protocol;
        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__);
-       }
+       protocol_type = modest_tny_account_get_protocol_type (account);
+       protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
+                                                                 protocol_type);
 
-       if (error_note) {
+       error_note = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_ACCOUNT_CONNECTION_ERROR, tny_account_get_hostname (account));
+       if (error_note == NULL) {
+               g_warning ("%s: This should not be reached", __FUNCTION__);
+       } else {
                modest_platform_run_information_dialog (parent_window, error_note, FALSE);
                g_free (error_note);
        }
@@ -6101,9 +6072,11 @@ gchar *
 modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
 {
        gchar *msg = NULL;
+       gchar *subject;
        TnyFolderStore *folder = NULL;
        TnyAccount *account = NULL;
-       ModestTransportStoreProtocol proto;
+       ModestProtocolType proto;
+       ModestProtocol *protocol;
        TnyHeader *header = NULL;
 
        if (MODEST_IS_MAIN_WINDOW (win)) {
@@ -6130,16 +6103,14 @@ modest_ui_actions_get_msg_already_deleted_error_msg (ModestWindow *win)
 
        /* Get the account type */
        account = tny_folder_get_account (TNY_FOLDER (folder));
-       proto = modest_protocol_info_get_transport_store_protocol (tny_account_get_proto (account));
-       if (proto == MODEST_PROTOCOL_STORE_POP) {
-               msg = g_strdup (_("emev_ni_ui_pop3_msg_recv_error"));
-       } else if (proto == MODEST_PROTOCOL_STORE_IMAP) {
-               gchar *subject;
-               subject = tny_header_dup_subject (header);
-               msg = g_strdup_printf (_("emev_ni_ui_imap_message_not_available_in_server"), 
-                                      subject);
-               g_free (subject);
-       } else {
+       proto = modest_tny_account_get_protocol_type (account);
+       protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
+                                                                 proto);
+
+       subject = tny_header_dup_subject (header);
+       msg = modest_protocol_get_translation (protocol, MODEST_PROTOCOL_TRANSLATION_MSG_NOT_AVAILABLE, subject);
+       g_free (subject);
+       if (msg == NULL) {
                msg = g_strdup_printf (_("mail_ni_ui_folder_get_msg_folder_error"));
        }