diff options
Diffstat (limited to 'mail')
38 files changed, 761 insertions, 503 deletions
diff --git a/mail/Makefile.am b/mail/Makefile.am index 97a2fe39a4..1ddbec649c 100644 --- a/mail/Makefile.am +++ b/mail/Makefile.am @@ -25,16 +25,17 @@ libevolution_mail_la_CPPFLAGS = \ -I$(top_srcdir)/shell \ -I$(top_srcdir)/smime/lib \ -I$(top_srcdir)/smime/gui \ + $(EVOLUTION_DATA_SERVER_CFLAGS) \ $(GNOME_PLATFORM_CFLAGS) \ - $(EVOLUTION_MAIL_CFLAGS) \ $(CERT_UI_CFLAGS) \ $(CANBERRA_CFLAGS) \ $(CLUTTER_CFLAGS) \ + $(GTKHTML_CFLAGS) \ -DEVOLUTION_DATADIR=\""$(datadir)"\" \ -DEVOLUTION_PRIVDATADIR=\""$(privdatadir)"\" \ -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \ -DEVOLUTION_ICONDIR=\""$(icondir)"\" \ - -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \ + -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \ -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \ -DEVOLUTION_BUTTONSDIR=\""$(buttonsdir)"\" \ -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ @@ -209,14 +210,13 @@ libevolution_mail_la_LIBADD = \ $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \ $(top_builddir)/em-format/libemformat.la \ $(top_builddir)/filter/libfilter.la \ - $(EVOLUTION_MAIL_LIBS) \ + $(EVOLUTION_DATA_SERVER_LIBS) \ + $(GNOME_PLATFORM_LIBS) \ $(CERT_UI_LIBS) \ $(CANBERRA_LIBS) \ $(CLUTTER_LIBS) \ $(GTKHTML_LIBS) \ - $(E_WIDGETS_LIBS) \ - $(SMIME_LIBS) \ - $(GNOME_PLATFORM_LIBS) + $(SMIME_LIBS) libevolution_mail_la_LDFLAGS = $(NO_UNDEFINED) diff --git a/mail/e-mail-backend.c b/mail/e-mail-backend.c index ff37b7a93a..56f2dc67b3 100644 --- a/mail/e-mail-backend.c +++ b/mail/e-mail-backend.c @@ -171,7 +171,7 @@ mail_backend_prepare_for_offline_cb (EShell *shell, } e_mail_store_foreach ( - session, (GFunc) mail_store_prepare_for_offline_cb, activity); + backend, (GFunc) mail_store_prepare_for_offline_cb, activity); } /* Helper for mail_backend_prepare_for_online_cb() */ @@ -197,7 +197,7 @@ mail_backend_prepare_for_online_cb (EShell *shell, camel_session_set_online (CAMEL_SESSION (session), TRUE); e_mail_store_foreach ( - session, (GFunc) mail_store_prepare_for_online_cb, activity); + backend, (GFunc) mail_store_prepare_for_online_cb, activity); } /* Helper for mail_backend_prepare_for_quit_cb() */ @@ -298,13 +298,13 @@ mail_backend_prepare_for_quit_cb (EShell *shell, if (delete_junk) e_mail_store_foreach ( - session, (GFunc) mail_backend_delete_junk, backend); + backend, (GFunc) mail_backend_delete_junk, backend); sync_data.activity = activity; sync_data.empty_trash = empty_trash; e_mail_store_foreach ( - session, (GFunc) mail_backend_final_sync, &sync_data); + backend, (GFunc) mail_backend_final_sync, &sync_data); /* Now we poll until all activities are actually cancelled or finished. * Reffing the activity delays quitting; the reference count @@ -572,14 +572,15 @@ mail_backend_folder_changed_cb (MailFolderCache *folder_cache, folder_type = (flags & CAMEL_FOLDER_TYPE_MASK); target->is_inbox = (folder_type == CAMEL_FOLDER_TYPE_INBOX); - model = em_folder_tree_model_get_default (mail_backend); + model = em_folder_tree_model_get_default (); target->display_name = em_folder_tree_model_get_folder_name ( model, store, folder_name); if (target->new > 0) e_shell_event (e_shell_backend_get_shell (E_SHELL_BACKEND (mail_backend)), "mail-icon", (gpointer) "mail-unread"); - /** @Event: folder.changed + /** + * @Event: folder.changed * @Title: Folder changed * @Target: EMEventTargetFolder * @@ -773,8 +774,12 @@ mail_backend_constructed (GObject *object) e_account_combo_box_set_session (CAMEL_SESSION (priv->session)); /* FIXME EMailBackend should own the default EMFolderTreeModel. */ - folder_tree_model = em_folder_tree_model_get_default (E_MAIL_BACKEND (shell_backend)); - em_folder_tree_model_set_session (folder_tree_model, priv->session); + folder_tree_model = em_folder_tree_model_get_default (); + + /* FIXME This is creating a circular reference. Perhaps the + * should only hold a weak pointer to EMailBackend? */ + em_folder_tree_model_set_backend ( + folder_tree_model, E_MAIL_BACKEND (object)); g_signal_connect ( shell, "prepare-for-offline", diff --git a/mail/e-mail-folder-utils.c b/mail/e-mail-folder-utils.c index 7c84957f6a..77a9708e5f 100644 --- a/mail/e-mail-folder-utils.c +++ b/mail/e-mail-folder-utils.c @@ -1630,3 +1630,51 @@ e_mail_folder_uri_from_folder (CamelFolder *folder) return e_mail_folder_uri_build (store, folder_name); } + +/** + * e_mail_folder_uri_to_markup: + * @session: a #CamelSession + * @folder_uri: a folder URI + * @error: return location for a #GError, or %NULL + * + * Converts @folder_uri to a markup string suitable for displaying to users. + * The string consists of the #CamelStore display name (in bold), followed + * by the folder path. If the URI is malformed or no corresponding store + * exists, the function sets @error and returns %NULL. Free the returned + * string with g_free(). + * + * Returns: a newly-allocated markup string, or %NULL + **/ +gchar * +e_mail_folder_uri_to_markup (CamelSession *session, + const gchar *folder_uri, + GError **error) +{ + CamelStore *store = NULL; + const gchar *display_name; + gchar *folder_name = NULL; + gchar *markup; + gboolean success; + + g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL); + g_return_val_if_fail (folder_uri != NULL, NULL); + + success = e_mail_folder_uri_parse ( + session, folder_uri, &store, &folder_name, error); + + if (!success) + return NULL; + + g_return_val_if_fail (CAMEL_IS_STORE (store), NULL); + g_return_val_if_fail (folder_name != NULL, NULL); + + display_name = camel_service_get_display_name (CAMEL_SERVICE (store)); + + markup = g_markup_printf_escaped ( + "<b>%s</b> : %s", display_name, folder_name); + + g_object_unref (store); + g_free (folder_name); + + return markup; +} diff --git a/mail/e-mail-folder-utils.h b/mail/e-mail-folder-utils.h index c82d806d7a..9e8dd0f050 100644 --- a/mail/e-mail-folder-utils.h +++ b/mail/e-mail-folder-utils.h @@ -155,6 +155,9 @@ gboolean e_mail_folder_uri_equal (CamelSession *session, const gchar *folder_uri_a, const gchar *folder_uri_b); gchar * e_mail_folder_uri_from_folder (CamelFolder *folder); +gchar * e_mail_folder_uri_to_markup (CamelSession *session, + const gchar *folder_uri, + GError **error); G_END_DECLS diff --git a/mail/e-mail-junk-filter.h b/mail/e-mail-junk-filter.h index 34d95e56c7..74a7840c2d 100644 --- a/mail/e-mail-junk-filter.h +++ b/mail/e-mail-junk-filter.h @@ -20,7 +20,7 @@ #define E_MAIL_JUNK_FILTER_H #include <gtk/gtk.h> -#include <e-util/e-extension.h> +#include <libebackend/e-extension.h> /* Standard GObject macros */ #define E_TYPE_MAIL_JUNK_FILTER \ diff --git a/mail/e-mail-migrate.c b/mail/e-mail-migrate.c index 07b2a8bb2c..10afa58e04 100644 --- a/mail/e-mail-migrate.c +++ b/mail/e-mail-migrate.c @@ -701,7 +701,6 @@ migrate_to_db (EShellBackend *shell_backend) EMMigrateSession *session; EAccountList *accounts; EMailBackend *mail_backend; - EMailSession *mail_session; EIterator *iter; gint i = 0, len; CamelStore *store = NULL; @@ -713,11 +712,10 @@ migrate_to_db (EShellBackend *shell_backend) return; mail_backend = E_MAIL_BACKEND (shell_backend); - mail_session = e_mail_backend_get_session (mail_backend); data_dir = e_shell_backend_get_data_dir (shell_backend); /* Initialize the mail stores early so we can add a new one. */ - e_mail_store_init (mail_session, data_dir); + e_mail_store_init (mail_backend, data_dir); iter = e_list_get_iterator ((EList *) accounts); len = e_list_length ((EList *) accounts); @@ -772,7 +770,7 @@ migrate_to_db (EShellBackend *shell_backend) && strncmp (service->url, "mbox:", 5) != 0) { store = e_mail_store_add_by_account ( - mail_session, account); + mail_backend, account); info = camel_store_get_folder_info_sync ( store, NULL, @@ -1020,7 +1018,6 @@ create_mbox_account (EShellBackend *shell_backend, EMMigrateSession *session) { EMailBackend *mail_backend; - EMailSession *mail_session; CamelStore *store; CamelURL *url; EAccountList *accounts; @@ -1029,11 +1026,10 @@ create_mbox_account (EShellBackend *shell_backend, gchar *name, *id, *temp, *uri, *folder_uri; mail_backend = E_MAIL_BACKEND (shell_backend); - mail_session = e_mail_backend_get_session (mail_backend); data_dir = e_shell_backend_get_data_dir (shell_backend); /* Initialize the mail stores early so we can add a new one. */ - e_mail_store_init (mail_session, data_dir); + e_mail_store_init (mail_backend, data_dir); account = e_account_new (); account->enabled = TRUE; @@ -1067,7 +1063,7 @@ create_mbox_account (EShellBackend *shell_backend, } e_account_list_add (accounts, account); - store = e_mail_store_add_by_account (mail_session, account); + store = e_mail_store_add_by_account (mail_backend, account); folder_uri = e_mail_folder_uri_build (store, "Sent"); e_account_set_string ( diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c index 4cc9465c7d..725a0c6d7c 100644 --- a/mail/e-mail-reader-utils.c +++ b/mail/e-mail-reader-utils.c @@ -287,7 +287,6 @@ e_mail_reader_mark_as_read (EMailReader *reader, const gchar *uid) { EMailBackend *backend; - EMailSession *session; EMFormatHTML *formatter; CamelFolder *folder; guint32 mask, set; @@ -300,15 +299,13 @@ e_mail_reader_mark_as_read (EMailReader *reader, backend = e_mail_reader_get_backend (reader); formatter = e_mail_reader_get_formatter (reader); - session = e_mail_backend_get_session (backend); - flags = camel_folder_get_message_flags (folder, uid); if (!(flags & CAMEL_MESSAGE_SEEN)) { CamelMimeMessage *message; message = EM_FORMAT (formatter)->message; - em_utils_handle_receipt (session, folder, uid, message); + em_utils_handle_receipt (backend, folder, uid, message); } mask = CAMEL_MESSAGE_SEEN; diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index a8e3899ace..76502314ab 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -300,7 +300,7 @@ action_mail_copy_cb (GtkAction *action, window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); - model = em_folder_tree_model_get_default (backend); + model = em_folder_tree_model_get_default (); dialog = em_folder_selector_new ( window, backend, model, @@ -479,8 +479,8 @@ action_mail_flag_for_followup_cb (GtkAction *action, em_utils_flag_for_followup (reader, folder, uids); } -static void -check_close_browser_reader (EMailReader *reader) +static gboolean +get_close_browser_reader (EMailReader *reader) { GConfClient *client; const gchar *key; @@ -489,7 +489,7 @@ check_close_browser_reader (EMailReader *reader) /* only allow closing of a mail browser and nothing else */ if (!E_IS_MAIL_BROWSER (reader)) - return; + return FALSE; client = gconf_client_get_default (); @@ -529,11 +529,16 @@ check_close_browser_reader (EMailReader *reader) } g_free (value); + g_object_unref (client); - if (close_it) - gtk_widget_destroy (GTK_WIDGET (reader)); + return close_it; +} - g_object_unref (client); +static void +check_close_browser_reader (EMailReader *reader) +{ + if (get_close_browser_reader (reader)) + gtk_widget_destroy (GTK_WIDGET (reader)); } static void @@ -543,11 +548,13 @@ action_mail_forward_cb (GtkAction *action, CamelFolder *folder; GtkWindow *window; GPtrArray *uids; + gboolean close_reader; folder = e_mail_reader_get_folder (reader); window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); g_return_if_fail (uids != NULL); + close_reader = get_close_browser_reader (reader); /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ @@ -556,11 +563,10 @@ action_mail_forward_cb (GtkAction *action, if (em_utils_ask_open_many (window, uids->len)) em_utils_forward_messages ( reader, folder, uids, - e_mail_reader_get_forward_style (reader)); + e_mail_reader_get_forward_style (reader), + close_reader ? GTK_WIDGET (reader) : NULL); g_ptr_array_unref (uids); - - check_close_browser_reader (reader); } static void @@ -570,11 +576,13 @@ action_mail_forward_attached_cb (GtkAction *action, CamelFolder *folder; GtkWindow *window; GPtrArray *uids; + gboolean close_reader; folder = e_mail_reader_get_folder (reader); window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); g_return_if_fail (uids != NULL); + close_reader = get_close_browser_reader (reader); /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ @@ -583,11 +591,10 @@ action_mail_forward_attached_cb (GtkAction *action, if (em_utils_ask_open_many (window, uids->len)) em_utils_forward_messages ( reader, folder, uids, - E_MAIL_FORWARD_STYLE_ATTACHED); + E_MAIL_FORWARD_STYLE_ATTACHED, + close_reader ? GTK_WIDGET (reader) : NULL); g_ptr_array_unref (uids); - - check_close_browser_reader (reader); } static void @@ -597,11 +604,13 @@ action_mail_forward_inline_cb (GtkAction *action, CamelFolder *folder; GtkWindow *window; GPtrArray *uids; + gboolean close_reader; folder = e_mail_reader_get_folder (reader); window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); g_return_if_fail (uids != NULL); + close_reader = get_close_browser_reader (reader); /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ @@ -610,11 +619,10 @@ action_mail_forward_inline_cb (GtkAction *action, if (em_utils_ask_open_many (window, uids->len)) em_utils_forward_messages ( reader, folder, uids, - E_MAIL_FORWARD_STYLE_INLINE); + E_MAIL_FORWARD_STYLE_INLINE, + close_reader ? GTK_WIDGET (reader) : NULL); g_ptr_array_unref (uids); - - check_close_browser_reader (reader); } static void @@ -624,11 +632,16 @@ action_mail_forward_quoted_cb (GtkAction *action, CamelFolder *folder; GtkWindow *window; GPtrArray *uids; +<<<<<<< HEAD +======= + gboolean close_reader; +>>>>>>> master folder = e_mail_reader_get_folder (reader); window = e_mail_reader_get_window (reader); uids = e_mail_reader_get_selected_uids (reader); g_return_if_fail (uids != NULL); + close_reader = get_close_browser_reader (reader); /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ @@ -637,11 +650,16 @@ action_mail_forward_quoted_cb (GtkAction *action, if (em_utils_ask_open_many (window, uids->len)) em_utils_forward_messages ( reader, folder, uids, +<<<<<<< HEAD E_MAIL_FORWARD_STYLE_QUOTED); g_ptr_array_unref (uids); +======= + E_MAIL_FORWARD_STYLE_QUOTED, + close_reader ? GTK_WIDGET (reader) : NULL); +>>>>>>> master - check_close_browser_reader (reader); + g_ptr_array_unref (uids); } static void @@ -732,7 +750,11 @@ action_mail_mark_unread_cb (GtkAction *action, /* Notify the tree model that the user has marked messages as * unread so it doesn't mistake the event as new mail arriving. */ +<<<<<<< HEAD model = em_folder_tree_model_get_default (e_mail_reader_get_backend (reader)); +======= + model = em_folder_tree_model_get_default (); +>>>>>>> master folder = e_mail_reader_get_folder (reader); em_folder_tree_model_user_marked_unread (model, folder, n_marked); } @@ -752,10 +774,17 @@ action_mail_message_edit_cb (GtkAction *action, /* XXX Either e_mail_reader_get_selected_uids() * or MessageList should do this itself. */ g_ptr_array_set_free_func (uids, (GDestroyNotify) g_free); +<<<<<<< HEAD + + replace = em_utils_folder_is_drafts (folder); + em_utils_edit_messages (reader, folder, uids, replace); + +======= replace = em_utils_folder_is_drafts (folder); em_utils_edit_messages (reader, folder, uids, replace); +>>>>>>> master g_ptr_array_unref (uids); } @@ -806,7 +835,11 @@ action_mail_move_cb (GtkAction *action, uids = e_mail_reader_get_selected_uids (reader); window = e_mail_reader_get_window (reader); +<<<<<<< HEAD model = em_folder_tree_model_get_default (backend); +======= + model = em_folder_tree_model_get_default (); +>>>>>>> master dialog = em_folder_selector_new ( window, backend, model, @@ -1126,11 +1159,19 @@ action_mail_reply_all_check (CamelFolder *folder, gint recip_count = 0; EMailReplyType type = E_MAIL_REPLY_TO_ALL; GError *error = NULL; +<<<<<<< HEAD + + alert_sink = e_activity_get_alert_sink (closure->activity); + + message = camel_folder_get_message_finish (folder, result, &error); + +======= alert_sink = e_activity_get_alert_sink (closure->activity); message = camel_folder_get_message_finish (folder, result, &error); +>>>>>>> master if (e_activity_handle_cancellation (closure->activity, error)) { g_warn_if_fail (message == NULL); mail_reader_closure_free (closure); @@ -1311,6 +1352,17 @@ action_mail_reply_sender_check (CamelFolder *folder, GError *error = NULL; alert_sink = e_activity_get_alert_sink (closure->activity); +<<<<<<< HEAD + + message = camel_folder_get_message_finish (folder, result, &error); + + if (e_activity_handle_cancellation (closure->activity, error)) { + g_warn_if_fail (message == NULL); + mail_reader_closure_free (closure); + g_error_free (error); + return; + +======= message = camel_folder_get_message_finish (folder, result, &error); @@ -1320,6 +1372,7 @@ action_mail_reply_sender_check (CamelFolder *folder, g_error_free (error); return; +>>>>>>> master } else if (error != NULL) { g_warn_if_fail (message == NULL); e_alert_submit ( diff --git a/mail/e-mail-session-utils.c b/mail/e-mail-session-utils.c index 55221249c4..217e7e2e8e 100644 --- a/mail/e-mail-session-utils.c +++ b/mail/e-mail-session-utils.c @@ -695,14 +695,14 @@ e_mail_session_send_to (EMailSession *session, sent_folder_uri = g_strdup (account->sent_folder_uri); } - string = camel_header_raw_find (&xev, "X-Evolution-Transport", NULL); - if (transport_uid == NULL && string != NULL) - transport_uid = g_strstrip (g_strdup (string)); - string = camel_header_raw_find (&xev, "X-Evolution-Fcc", NULL); if (sent_folder_uri == NULL && string != NULL) sent_folder_uri = g_strstrip (g_strdup (string)); + string = camel_header_raw_find (&xev, "X-Evolution-Transport", NULL); + if (transport_uid == NULL && string != NULL) + transport_uid = g_strstrip (g_strdup (string)); + post_to_uris = g_ptr_array_new (); for (header = xev; header != NULL; header = header->next) { gchar *folder_uri; diff --git a/mail/e-mail-session.c b/mail/e-mail-session.c index 7ed8720e75..109e49826d 100644 --- a/mail/e-mail-session.c +++ b/mail/e-mail-session.c @@ -44,8 +44,10 @@ #include <canberra-gtk.h> #endif -#include <libedataserverui/e-passwords.h> #include <libedataserver/e-flag.h> +#include <libedataserver/e-proxy.h> +#include <libebackend/e-extensible.h> +#include <libedataserverui/e-passwords.h> #include "e-util/e-util.h" #include "e-util/e-account-utils.h" @@ -73,7 +75,6 @@ ((obj), E_TYPE_MAIL_SESSION, EMailSessionPrivate)) static guint session_check_junk_notify_id; -static guint session_gconf_proxy_id; typedef struct _AsyncContext AsyncContext; @@ -82,6 +83,7 @@ struct _EMailSessionPrivate { FILE *filter_logfile; GHashTable *junk_filters; + EProxy *proxy; }; struct _AsyncContext { @@ -398,10 +400,17 @@ static guint preparing_flush = 0; static gboolean forward_to_flush_outbox_cb (EMailSession *session) { + EShell *shell; + EShellBackend *shell_backend; + g_return_val_if_fail (preparing_flush != 0, FALSE); + shell = e_shell_get_default (); + shell_backend = e_shell_get_backend_by_name (shell, "mail"); + g_return_val_if_fail (E_IS_MAIL_BACKEND (shell_backend), FALSE); + preparing_flush = 0; - mail_send (session); + mail_send (E_MAIL_BACKEND (shell_backend)); return FALSE; } @@ -433,73 +442,6 @@ ms_forward_to_cb (CamelFolder *folder, g_object_unref (client); } -/* Support for SOCKS proxy ***************************************************/ - -static GSettings *proxy_settings = NULL, *proxy_socks_settings = NULL; - -static void -set_socks_proxy_from_gsettings (CamelSession *session) -{ - gchar *mode, *host; - gint port; - - g_return_if_fail (proxy_settings != NULL); - g_return_if_fail (proxy_socks_settings != NULL); - - mode = g_settings_get_string (proxy_settings, "mode"); - if (g_strcmp0 (mode, "manual") == 0) { - host = g_settings_get_string (proxy_socks_settings, "host"); - port = g_settings_get_int (proxy_socks_settings, "port"); - camel_session_set_socks_proxy (session, host, port); - g_free (host); - } - g_free (mode); -} - -static void -proxy_gsettings_changed_cb (GSettings *settings, - const gchar *key, - CamelSession *session) -{ - set_socks_proxy_from_gsettings (session); -} - -static void -set_socks_proxy_gsettings_watch (CamelSession *session) -{ - g_return_if_fail (proxy_settings != NULL); - g_return_if_fail (proxy_socks_settings != NULL); - - g_signal_connect ( - proxy_settings, "changed::mode", - G_CALLBACK (proxy_gsettings_changed_cb), session); - - g_signal_connect ( - proxy_socks_settings, "changed", - G_CALLBACK (proxy_gsettings_changed_cb), session); -} - -static void -init_socks_proxy (CamelSession *session) -{ - g_return_if_fail (CAMEL_IS_SESSION (session)); - - if (!proxy_settings) { - proxy_settings = g_settings_new ("org.gnome.system.proxy"); - proxy_socks_settings = g_settings_get_child (proxy_settings, "socks"); - g_object_weak_ref (G_OBJECT (proxy_settings), (GWeakNotify) g_nullify_pointer, &proxy_settings); - g_object_weak_ref (G_OBJECT (proxy_socks_settings), (GWeakNotify) g_nullify_pointer, &proxy_socks_settings); - } else { - g_object_ref (proxy_settings); - g_object_ref (proxy_socks_settings); - } - - set_socks_proxy_gsettings_watch (session); - set_socks_proxy_from_gsettings (session); -} - -/*****************************************************************************/ - static void async_context_free (AsyncContext *context) { @@ -521,7 +463,7 @@ mail_session_make_key (CamelService *service, if (service != NULL) key = camel_url_to_string ( camel_service_get_camel_url (service), - CAMEL_URL_HIDE_PASSWORD | CAMEL_URL_HIDE_PARAMS); + CAMEL_URL_HIDE_PARAMS); else key = g_strdup (item); @@ -677,6 +619,7 @@ mail_session_finalize (GObject *object) priv = E_MAIL_SESSION_GET_PRIVATE (object); g_hash_table_destroy (priv->junk_filters); + g_object_unref (priv->proxy); client = gconf_client_get_default (); @@ -685,11 +628,6 @@ mail_session_finalize (GObject *object) session_check_junk_notify_id = 0; } - if (session_gconf_proxy_id != 0) { - gconf_client_notify_remove (client, session_gconf_proxy_id); - session_gconf_proxy_id = 0; - } - g_object_unref (client); g_free (mail_data_dir); @@ -1134,6 +1072,42 @@ mail_session_forward_to (CamelSession *session, } static void +mail_session_get_socks_proxy (CamelSession *session, + const gchar *for_host, + gchar **host_ret, + gint *port_ret) +{ + EMailSession *mail_session; + gchar *uri; + + g_return_if_fail (session != NULL); + g_return_if_fail (for_host != NULL); + g_return_if_fail (host_ret != NULL); + g_return_if_fail (port_ret != NULL); + + mail_session = E_MAIL_SESSION (session); + g_return_if_fail (mail_session != NULL); + g_return_if_fail (mail_session->priv != NULL); + + *host_ret = NULL; + *port_ret = 0; + + uri = g_strconcat ("socks://", for_host, NULL); + + if (e_proxy_require_proxy_for_uri (mail_session->priv->proxy, uri)) { + SoupURI *suri; + + suri = e_proxy_peek_uri_for (mail_session->priv->proxy, uri); + if (suri) { + *host_ret = g_strdup (suri->host); + *port_ret = suri->port; + } + } + + g_free (uri); +} + +static void e_mail_session_class_init (EMailSessionClass *class) { GObjectClass *object_class; @@ -1157,6 +1131,7 @@ e_mail_session_class_init (EMailSessionClass *class) session_class->get_filter_driver = mail_session_get_filter_driver; session_class->lookup_addressbook = mail_session_lookup_addressbook; session_class->forward_to = mail_session_forward_to; + session_class->get_socks_proxy = mail_session_get_socks_proxy; g_object_class_install_property ( object_class, @@ -1193,6 +1168,7 @@ e_mail_session_init (EMailSession *session) session->priv->folder_cache = mail_folder_cache_new (); session->priv->junk_filters = g_hash_table_new ( (GHashFunc) g_str_hash, (GEqualFunc) g_str_equal); + session->priv->proxy = e_proxy_new (); /* Initialize the EAccount setup. */ e_account_writable (NULL, E_ACCOUNT_SOURCE_SAVE_PASSWD); @@ -1212,7 +1188,7 @@ e_mail_session_init (EMailSession *session) mail_config_reload_junk_headers (session); - init_socks_proxy (CAMEL_SESSION (session)); + e_proxy_setup_proxy (session->priv->proxy); g_object_unref (client); } diff --git a/mail/e-mail-sidebar.c b/mail/e-mail-sidebar.c index 6a971ea51f..35048f8293 100644 --- a/mail/e-mail-sidebar.c +++ b/mail/e-mail-sidebar.c @@ -471,7 +471,7 @@ e_mail_sidebar_new (EMailBackend *backend, g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); g_return_val_if_fail (E_IS_ALERT_SINK (alert_sink), NULL); - model = em_folder_tree_model_get_default (backend); + model = em_folder_tree_model_get_default (); return g_object_new ( E_TYPE_MAIL_SIDEBAR, diff --git a/mail/e-mail-store.c b/mail/e-mail-store.c index 7b7774399d..f93856a8f4 100644 --- a/mail/e-mail-store.c +++ b/mail/e-mail-store.c @@ -182,10 +182,11 @@ special_mail_store_is_enabled (CamelStore *store) } static void -mail_store_add (EMailSession *session, +mail_store_add (EMailBackend *backend, CamelStore *store, AddStoreCallback callback) { + EMailSession *session; EMFolderTreeModel *default_model; MailFolderCache *folder_cache; StoreInfo *store_info; @@ -194,7 +195,8 @@ mail_store_add (EMailSession *session, g_return_if_fail (store != NULL); g_return_if_fail (CAMEL_IS_STORE (store)); - default_model = em_folder_tree_model_get_default (NULL); + session = e_mail_backend_get_session (backend); + default_model = em_folder_tree_model_get_default (); folder_cache = e_mail_session_get_folder_cache (session); store_info = store_info_new (store); @@ -228,23 +230,26 @@ mail_store_add_local_done_cb (MailFolderCache *folder_cache, } static void -mail_store_load_accounts (EMailSession *session, +mail_store_load_accounts (EMailBackend *backend, const gchar *data_dir) { CamelStore *local_store; + EMailSession *session; EAccountList *account_list; EIterator *iter; - /* Set up the local store. */ + session = e_mail_backend_get_session (backend); + + /* Add the local store. */ e_mail_local_init (session, data_dir); local_store = e_mail_local_get_store (); mail_store_add ( - session, local_store, (AddStoreCallback) + backend, local_store, (AddStoreCallback) mail_store_add_local_done_cb); - /* Set up remote stores. */ + /* Add mail accounts.. */ account_list = e_get_account_list (); @@ -257,19 +262,19 @@ mail_store_load_accounts (EMailSession *session, if (!account->enabled) continue; - e_mail_store_add_by_account (session, account); + e_mail_store_add_by_account (backend, account); } g_object_unref (iter); } void -e_mail_store_init (EMailSession *session, +e_mail_store_init (EMailBackend *backend, const gchar *data_dir) { static gboolean initialized = FALSE; - g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); /* This function is idempotent because mail * migration code may need to call it early. */ @@ -283,34 +288,37 @@ e_mail_store_init (EMailSession *session, (GDestroyNotify) NULL, (GDestroyNotify) store_table_free); - mail_store_load_accounts (session, data_dir); + mail_store_load_accounts (backend, data_dir); initialized = TRUE; } void -e_mail_store_add (EMailSession *session, +e_mail_store_add (EMailBackend *backend, CamelStore *store) { - g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); g_return_if_fail (CAMEL_IS_STORE (store)); - mail_store_add (session, store, NULL); + mail_store_add (backend, store, NULL); } CamelStore * -e_mail_store_add_by_account (EMailSession *session, +e_mail_store_add_by_account (EMailBackend *backend, EAccount *account) { + EMailSession *session; CamelService *service = NULL; CamelProvider *provider; CamelURL *url; - gboolean skip, transport_only; + gboolean skip = FALSE, transport_only; GError *error = NULL; - g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL); + g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); g_return_val_if_fail (E_IS_ACCOUNT (account), NULL); + session = e_mail_backend_get_session (backend); + /* check whether it's transport-only accounts */ transport_only = !account->source || !account->source->url || !*account->source->url; if (transport_only) @@ -376,7 +384,7 @@ handle_transport: } if (!skip && (provider->flags & CAMEL_PROVIDER_IS_STORAGE)) - e_mail_store_add (session, CAMEL_STORE (service)); + e_mail_store_add (backend, CAMEL_STORE (service)); return CAMEL_STORE (service); @@ -392,16 +400,19 @@ fail: } void -e_mail_store_remove (EMailSession *session, +e_mail_store_remove (EMailBackend *backend, CamelStore *store) { + EMailSession *session; MailFolderCache *folder_cache; EMFolderTreeModel *default_model; - g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); g_return_if_fail (CAMEL_IS_STORE (store)); g_return_if_fail (store_table != NULL); + session = e_mail_backend_get_session (backend); + /* Because the store table holds a reference to each store used * as a key in it, none of them will ever be gc'ed, meaning any * call to camel_session_get_{service,store} with the same URL @@ -426,43 +437,48 @@ e_mail_store_remove (EMailSession *session, } void -e_mail_store_remove_by_account (EMailSession *session, +e_mail_store_remove_by_account (EMailBackend *backend, EAccount *account) { + EMailSession *session; CamelService *service; CamelProvider *provider; + const gchar *uid; - g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); g_return_if_fail (E_IS_ACCOUNT (account)); - provider = camel_provider_get (account->source->url, NULL); - if (provider == NULL) - return; + uid = account->uid; + session = e_mail_backend_get_session (backend); - if (!(provider->flags & CAMEL_PROVIDER_IS_STORAGE)) - return; + service = camel_session_get_service (CAMEL_SESSION (session), uid); + g_return_if_fail (CAMEL_IS_STORE (service)); - service = camel_session_get_service ( - CAMEL_SESSION (session), account->uid); + provider = camel_service_get_provider (service); + g_return_if_fail (provider != NULL); - g_return_if_fail (CAMEL_IS_STORE (service)); + if (!(provider->flags & CAMEL_PROVIDER_IS_STORAGE)) + return; - e_mail_store_remove (session, CAMEL_STORE (service)); + e_mail_store_remove (backend, CAMEL_STORE (service)); } void -e_mail_store_foreach (EMailSession *session, +e_mail_store_foreach (EMailBackend *backend, GFunc func, gpointer user_data) { + EMailSession *session; GList *list, *link; /* XXX This is a silly convenience function. * Could probably just get rid of it. */ - g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); g_return_if_fail (func != NULL); + session = e_mail_backend_get_session (backend); + list = camel_session_list_services (CAMEL_SESSION (session)); for (link = list; link != NULL; link = g_list_next (link)) { diff --git a/mail/e-mail-store.h b/mail/e-mail-store.h index 5dca416e09..2c676d4fc4 100644 --- a/mail/e-mail-store.h +++ b/mail/e-mail-store.h @@ -23,22 +23,22 @@ #define E_MAIL_STORE_H #include <camel/camel.h> -#include <mail/e-mail-session.h> +#include <mail/e-mail-backend.h> #include <libedataserver/e-account.h> G_BEGIN_DECLS -void e_mail_store_init (EMailSession *session, +void e_mail_store_init (EMailBackend *backend, const gchar *data_dir); -void e_mail_store_add (EMailSession *session, +void e_mail_store_add (EMailBackend *backend, CamelStore *store); -CamelStore * e_mail_store_add_by_account (EMailSession *session, +CamelStore * e_mail_store_add_by_account (EMailBackend *backend, EAccount *account); -void e_mail_store_remove (EMailSession *session, +void e_mail_store_remove (EMailBackend *backend, CamelStore *store); -void e_mail_store_remove_by_account (EMailSession *session, +void e_mail_store_remove_by_account (EMailBackend *backend, EAccount *account); -void e_mail_store_foreach (EMailSession *session, +void e_mail_store_foreach (EMailBackend *backend, GFunc func, gpointer user_data); diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index b9589d51c3..8ec881b1f0 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -4045,7 +4045,7 @@ forget_password_if_needed (EAccount *original_account, if (!url) return; - url_str = camel_url_to_string (url, CAMEL_URL_HIDE_PASSWORD | CAMEL_URL_HIDE_PARAMS); + url_str = camel_url_to_string (url, CAMEL_URL_HIDE_PARAMS); if (url_str) e_passwords_forget_password (NULL, url_str); @@ -4108,11 +4108,9 @@ emae_commit (EConfig *ec, && emae->priv->source.provider && (emae->priv->source.provider->flags & CAMEL_PROVIDER_IS_STORAGE)) { EMailBackend *backend; - EMailSession *session; backend = em_account_editor_get_backend (emae); - session = e_mail_backend_get_session (backend); - e_mail_store_add_by_account (session, account); + e_mail_store_add_by_account (backend, account); } } diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c index e42559ab3b..837cc31f62 100644 --- a/mail/em-composer-utils.c +++ b/mail/em-composer-utils.c @@ -85,6 +85,7 @@ struct _AsyncContext { gchar *folder_uri; gchar *message_uid; gboolean replace; + GtkWidget *destroy_when_done; }; struct _ForwardData { @@ -112,6 +113,9 @@ async_context_free (AsyncContext *context) if (context->ptr_array != NULL) g_ptr_array_unref (context->ptr_array); + if (context->destroy_when_done != NULL) + gtk_widget_destroy (context->destroy_when_done); + g_free (context->folder_uri); g_free (context->message_uid); @@ -1680,6 +1684,7 @@ forward_got_messages_cb (CamelFolder *folder, if (e_activity_handle_cancellation (context->activity, error)) { g_warn_if_fail (hash_table == NULL); + context->destroy_when_done = NULL; async_context_free (context); g_error_free (error); return; @@ -1690,6 +1695,7 @@ forward_got_messages_cb (CamelFolder *folder, alert_sink, "mail:get-multiple-messages", error->message, NULL); + context->destroy_when_done = NULL; async_context_free (context); g_error_free (error); return; @@ -1721,6 +1727,7 @@ forward_got_messages_cb (CamelFolder *folder, * @folder: folder containing messages to forward * @uids: uids of messages to forward * @style: the forward style to use + * @destroy_when_done: a #GtkWidget to destroy with gtk_widget_destroy() when done; can be NULL * * Forwards a group of messages in the given style. * @@ -1742,7 +1749,8 @@ void em_utils_forward_messages (EMailReader *reader, CamelFolder *folder, GPtrArray *uids, - EMailForwardStyle style) + EMailForwardStyle style, + GtkWidget *destroy_when_done) { EActivity *activity; AsyncContext *context; @@ -1760,6 +1768,7 @@ em_utils_forward_messages (EMailReader *reader, context->reader = g_object_ref (reader); context->ptr_array = g_ptr_array_ref (uids); context->style = style; + context->destroy_when_done = destroy_when_done; switch (style) { case E_MAIL_FORWARD_STYLE_ATTACHED: @@ -1837,7 +1846,7 @@ em_utils_redirect_message (EShell *shell, /* Message disposition notifications, rfc 2298 */ void -em_utils_handle_receipt (EMailSession *session, +em_utils_handle_receipt (EMailBackend *backend, CamelFolder *folder, const gchar *message_uid, CamelMimeMessage *message) @@ -1846,7 +1855,7 @@ em_utils_handle_receipt (EMailSession *session, const gchar *addr; CamelMessageInfo *info; - g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); g_return_if_fail (CAMEL_IS_FOLDER (folder)); g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); @@ -1902,23 +1911,23 @@ em_utils_handle_receipt (EMailSession *session, return; } - em_utils_send_receipt (session, folder, message); + em_utils_send_receipt (backend, folder, message); } static void em_utils_receipt_done (CamelFolder *folder, GAsyncResult *result, - EMailSession *session) + EMailBackend *backend) { /* FIXME Poor error handling. */ if (!e_mail_folder_append_message_finish (folder, result, NULL, NULL)) return; - mail_send (session); + mail_send (backend); } void -em_utils_send_receipt (EMailSession *session, +em_utils_send_receipt (EMailBackend *backend, CamelFolder *folder, CamelMimeMessage *message) { @@ -2093,7 +2102,7 @@ em_utils_send_receipt (EMailSession *session, /* FIXME Pass a GCancellable. */ e_mail_folder_append_message ( out_folder, receipt, info, G_PRIORITY_DEFAULT, NULL, - (GAsyncReadyCallback) em_utils_receipt_done, session); + (GAsyncReadyCallback) em_utils_receipt_done, backend); camel_message_info_free (info); } @@ -2476,18 +2485,24 @@ concat_unique_addrs (CamelInternetAddress *dest, } } -static void -get_reply_all (CamelMimeMessage *message, - CamelInternetAddress *to, - CamelInternetAddress *cc, - CamelNNTPAddress *postto) +void +em_utils_get_reply_all (CamelMimeMessage *message, + CamelInternetAddress *to, + CamelInternetAddress *cc, + CamelNNTPAddress *postto) { - CamelInternetAddress *reply_to, *to_addrs, *cc_addrs; + CamelInternetAddress *reply_to; + CamelInternetAddress *to_addrs; + CamelInternetAddress *cc_addrs; CamelMedium *medium; const gchar *name, *addr; const gchar *posthdr = NULL; GHashTable *rcpt_hash; + g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message)); + g_return_if_fail (CAMEL_IS_INTERNET_ADDRESS (to)); + g_return_if_fail (CAMEL_IS_INTERNET_ADDRESS (cc)); + medium = CAMEL_MEDIUM (message); /* check whether there is a 'Newsgroups: ' header in there */ @@ -2503,8 +2518,10 @@ get_reply_all (CamelMimeMessage *message, rcpt_hash = em_utils_generate_account_hash (); reply_to = get_reply_to (message); - to_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO); - cc_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC); + to_addrs = camel_mime_message_get_recipients ( + message, CAMEL_RECIPIENT_TYPE_TO); + cc_addrs = camel_mime_message_get_recipients ( + message, CAMEL_RECIPIENT_TYPE_CC); if (reply_to != NULL) { gint ii = 0; @@ -2547,15 +2564,6 @@ get_reply_all (CamelMimeMessage *message, g_hash_table_destroy (rcpt_hash); } -void -em_utils_get_reply_all (CamelMimeMessage *message, - CamelInternetAddress *to, - CamelInternetAddress *cc, - CamelNNTPAddress *postto) -{ - get_reply_all (message, to, cc, postto); -} - enum { ATTRIB_UNKNOWN, ATTRIB_CUSTOM, @@ -2938,7 +2946,7 @@ em_utils_reply_to_message (EShell *shell, if (folder) postto = camel_nntp_address_new (); - get_reply_all (message, to, cc, postto); + em_utils_get_reply_all (message, to, cc, postto); break; } @@ -2989,7 +2997,7 @@ post_header_clicked_cb (EComposerPostHeader *header, shell_backend = e_shell_get_backend_by_name (shell, "mail"); /* FIXME Limit the folder tree to the NNTP account? */ - model = em_folder_tree_model_get_default (E_MAIL_BACKEND (shell_backend)); + model = em_folder_tree_model_get_default (); dialog = em_folder_selector_new ( GTK_WINDOW (composer), diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h index e651186afc..bd6eb7cffd 100644 --- a/mail/em-composer-utils.h +++ b/mail/em-composer-utils.h @@ -25,9 +25,9 @@ #define EM_COMPOSER_UTILS_H #include <em-format/em-format.h> +#include <mail/e-mail-backend.h> #include <mail/e-mail-enums.h> #include <mail/e-mail-reader.h> -#include <mail/e-mail-session.h> #include <composer/e-msg-composer.h> G_BEGIN_DECLS @@ -54,14 +54,15 @@ EMsgComposer * em_utils_forward_message (EShell *shell, void em_utils_forward_messages (EMailReader *reader, CamelFolder *folder, GPtrArray *uids, - EMailForwardStyle style); + EMailForwardStyle style, + GtkWidget *destroy_when_done); void em_utils_redirect_message (EShell *shell, CamelMimeMessage *message); -void em_utils_handle_receipt (EMailSession *session, +void em_utils_handle_receipt (EMailBackend *backend, CamelFolder *folder, const gchar *message_uid, CamelMimeMessage *message); -void em_utils_send_receipt (EMailSession *session, +void em_utils_send_receipt (EMailBackend *backend, CamelFolder *folder, CamelMimeMessage *message); gchar * em_utils_construct_composer_text diff --git a/mail/em-folder-selection-button.c b/mail/em-folder-selection-button.c index 26a3c9c2b0..9aa198fa8e 100644 --- a/mail/em-folder-selection-button.c +++ b/mail/em-folder-selection-button.c @@ -268,17 +268,13 @@ folder_selection_button_clicked (GtkButton *button) parent = gtk_widget_is_toplevel (parent) ? parent : NULL; if (priv->store != NULL) { - EMailSession *session; - - session = e_mail_backend_get_session (priv->backend); - - model = em_folder_tree_model_new (priv->backend); - em_folder_tree_model_set_session (model, session); + model = em_folder_tree_model_new (); + em_folder_tree_model_set_backend (model, priv->backend); em_folder_tree_model_add_store (model, priv->store); } if (model == NULL) - model = g_object_ref (em_folder_tree_model_get_default (priv->backend)); + model = g_object_ref (em_folder_tree_model_get_default ()); dialog = em_folder_selector_new ( parent, priv->backend, model, diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c index 2116faf854..cc674cd792 100644 --- a/mail/em-folder-tree-model.c +++ b/mail/em-folder-tree-model.c @@ -34,11 +34,11 @@ #include <errno.h> #include <sys/stat.h> +#include <glib/gi18n.h> + #include "e-util/e-util.h" #include "e-util/e-account-utils.h" -#include <glib/gi18n.h> - #include "mail-tools.h" #include "mail-mt.h" #include "mail-ops.h" @@ -68,7 +68,6 @@ struct _EMFolderTreeModelPrivate { GtkTreeSelection *selection; /* weak reference */ EAccountList *accounts; - EMailSession *session; EMailBackend *backend; /* CamelStore -> EMFolderTreeStoreInfo */ @@ -85,7 +84,6 @@ struct _EMFolderTreeModelPrivate { enum { PROP_0, PROP_SELECTION, - PROP_SESSION, PROP_BACKEND }; @@ -124,9 +122,10 @@ static gint folder_tree_model_sort (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, - gpointer user_data) + gpointer unused) { - EShell *shell = user_data; + EMFolderTreeModel *folder_tree_model; + EMailBackend *backend; gchar *aname, *bname; CamelStore *store; gboolean is_store; @@ -134,6 +133,10 @@ folder_tree_model_sort (GtkTreeModel *model, guint asortorder, bsortorder; gint rv = -2; + folder_tree_model = EM_FOLDER_TREE_MODEL (model); + backend = em_folder_tree_model_get_backend (folder_tree_model); + g_return_val_if_fail (backend != NULL, -1); + gtk_tree_model_get ( model, a, COL_BOOL_IS_STORE, &is_store, @@ -151,7 +154,16 @@ folder_tree_model_sort (GtkTreeModel *model, -1); if (is_store) { - if (e_shell_settings_get_boolean (e_shell_get_shell_settings (shell), "mail-sort-accounts-alpha")) { + EShell *shell; + EShellBackend *shell_backend; + EShellSettings *shell_settings; + + shell_backend = E_SHELL_BACKEND (backend); + shell = e_shell_backend_get_shell (shell_backend); + shell_settings = e_shell_get_shell_settings (shell); + + if (e_shell_settings_get_boolean ( + shell_settings, "mail-sort-accounts-alpha")) { const gchar *on_this_computer = _("On This Computer"); const gchar *search_folders = _("Search Folders"); @@ -226,10 +238,12 @@ account_changed_cb (EAccountList *accounts, EAccount *account, EMFolderTreeModel *model) { + EMailBackend *backend; EMailSession *session; CamelService *service; - session = em_folder_tree_model_get_session (model); + backend = em_folder_tree_model_get_backend (model); + session = e_mail_backend_get_session (backend); service = camel_session_get_service ( CAMEL_SESSION (session), account->uid); @@ -251,10 +265,12 @@ account_removed_cb (EAccountList *accounts, EAccount *account, EMFolderTreeModel *model) { + EMailBackend *backend; EMailSession *session; CamelService *service; - session = em_folder_tree_model_get_session (model); + backend = em_folder_tree_model_get_backend (model); + session = e_mail_backend_get_session (backend); service = camel_session_get_service ( CAMEL_SESSION (session), account->uid); @@ -271,17 +287,17 @@ account_added_cb (EAccountList *accounts, EAccount *account, EMFolderTreeModel *model) { - EMailSession *session; + EMailBackend *backend; + + backend = em_folder_tree_model_get_backend (model); - session = em_folder_tree_model_get_session (model); - e_mail_store_add_by_account (session, account); + e_mail_store_add_by_account (backend, account); } static void folder_tree_model_sort_changed (EMFolderTreeModel *tree_model) { GtkTreeModel *model; - EShellBackend *shell_backend; g_return_if_fail (tree_model != NULL); g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (tree_model)); @@ -290,12 +306,10 @@ folder_tree_model_sort_changed (EMFolderTreeModel *tree_model) if (!model) return; - shell_backend = E_SHELL_BACKEND (em_folder_tree_model_get_backend (tree_model)); - /* this invokes also sort on a GtkTreeStore */ gtk_tree_sortable_set_default_sort_func ( GTK_TREE_SORTABLE (model), - folder_tree_model_sort, e_shell_backend_get_shell (shell_backend), NULL); + folder_tree_model_sort, NULL, NULL); } static void @@ -339,14 +353,19 @@ account_sort_order_changed_cb (EMFolderTreeModel *folder_tree_model) } static void -add_remove_special_folder (EMFolderTreeModel *model, const gchar *account_uid, gboolean add) +add_remove_special_folder (EMFolderTreeModel *model, + const gchar *account_uid, + gboolean add) { + EMailBackend *backend; EMailSession *session; CamelService *service; - session = em_folder_tree_model_get_session (model); + backend = em_folder_tree_model_get_backend (model); + session = e_mail_backend_get_session (backend); - service = camel_session_get_service (CAMEL_SESSION (session), account_uid); + service = camel_session_get_service ( + CAMEL_SESSION (session), account_uid); if (!CAMEL_IS_STORE (service)) return; @@ -358,7 +377,9 @@ add_remove_special_folder (EMFolderTreeModel *model, const gchar *account_uid, g } static void -enable_local_folders_changed_cb (EMFolderTreeModel *model, GParamSpec *spec, EShellSettings *shell_settings) +enable_local_folders_changed_cb (EMFolderTreeModel *model, + GParamSpec *spec, + EShellSettings *shell_settings) { g_return_if_fail (model != NULL); g_return_if_fail (shell_settings != NULL); @@ -368,7 +389,9 @@ enable_local_folders_changed_cb (EMFolderTreeModel *model, GParamSpec *spec, ESh } static void -enable_search_folders_changed_cb (EMFolderTreeModel *model, GParamSpec *spec, EShellSettings *shell_settings) +enable_search_folders_changed_cb (EMFolderTreeModel *model, + GParamSpec *spec, + EShellSettings *shell_settings) { g_return_if_fail (model != NULL); g_return_if_fail (shell_settings != NULL); @@ -398,8 +421,8 @@ folder_tree_model_set_property (GObject *object, g_value_get_object (value)); return; - case PROP_SESSION: - em_folder_tree_model_set_session ( + case PROP_BACKEND: + em_folder_tree_model_set_backend ( EM_FOLDER_TREE_MODEL (object), g_value_get_object (value)); return; @@ -427,10 +450,10 @@ folder_tree_model_get_property (GObject *object, EM_FOLDER_TREE_MODEL (object))); return; - case PROP_SESSION: + case PROP_BACKEND: g_value_set_object ( value, - em_folder_tree_model_get_session ( + em_folder_tree_model_get_backend ( EM_FOLDER_TREE_MODEL (object))); return; case PROP_BACKEND: @@ -515,9 +538,26 @@ folder_tree_model_dispose (GObject *object) priv->selection = NULL; } - if (priv->session != NULL) { - g_object_unref (priv->session); - priv->session = NULL; + if (priv->backend != NULL) { + EShell *shell; + EShellBackend *shell_backend; + EShellSettings *shell_settings; + + shell_backend = E_SHELL_BACKEND (priv->backend); + shell = e_shell_backend_get_shell (shell_backend); + shell_settings = e_shell_get_shell_settings (shell); + + g_signal_handlers_disconnect_by_func ( + priv->backend, account_sort_order_changed_cb, object); + g_signal_handlers_disconnect_by_func ( + shell_settings, account_sort_order_changed_cb, object); + g_signal_handlers_disconnect_by_func ( + shell_settings, enable_local_folders_changed_cb, object); + g_signal_handlers_disconnect_by_func ( + shell_settings, enable_search_folders_changed_cb, object); + + g_object_unref (priv->backend); + priv->backend = NULL; } if (priv->backend) { @@ -564,6 +604,54 @@ folder_tree_model_finalize (GObject *object) } static void +folder_tree_model_constructed (GObject *object) +{ + EMFolderTreeModelPrivate *priv; + + GType col_types[] = { + G_TYPE_STRING, /* display name */ + G_TYPE_POINTER, /* store object */ + G_TYPE_STRING, /* full name */ + G_TYPE_STRING, /* icon name */ + G_TYPE_STRING, /* uri */ + G_TYPE_UINT, /* unread count */ + G_TYPE_UINT, /* flags */ + G_TYPE_BOOLEAN, /* is a store node */ + G_TYPE_BOOLEAN, /* is a folder node */ + G_TYPE_BOOLEAN, /* has not-yet-loaded subfolders */ + G_TYPE_UINT, /* last known unread count */ + G_TYPE_BOOLEAN, /* folder is a draft folder */ + G_TYPE_UINT /* user's sortorder */ + }; + + priv = EM_FOLDER_TREE_MODEL_GET_PRIVATE (object); + + gtk_tree_store_set_column_types ( + GTK_TREE_STORE (object), NUM_COLUMNS, col_types); + gtk_tree_sortable_set_default_sort_func ( + GTK_TREE_SORTABLE (object), + folder_tree_model_sort, NULL, NULL); + gtk_tree_sortable_set_sort_column_id ( + GTK_TREE_SORTABLE (object), + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, + GTK_SORT_ASCENDING); + + priv->accounts = e_get_account_list (); + priv->account_changed_id = g_signal_connect ( + priv->accounts, "account-changed", + G_CALLBACK (account_changed_cb), object); + priv->account_removed_id = g_signal_connect ( + priv->accounts, "account-removed", + G_CALLBACK (account_removed_cb), object); + priv->account_added_id = g_signal_connect ( + priv->accounts, "account-added", + G_CALLBACK (account_added_cb), object); + + /* Chain up to parent's constructed() method. */ + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void em_folder_tree_model_class_init (EMFolderTreeModelClass *class) { GObjectClass *object_class; @@ -577,25 +665,26 @@ em_folder_tree_model_class_init (EMFolderTreeModelClass *class) object_class->constructed = folder_tree_model_constructed; object_class->dispose = folder_tree_model_dispose; object_class->finalize = folder_tree_model_finalize; + object_class->constructed = folder_tree_model_constructed; g_object_class_install_property ( object_class, - PROP_SELECTION, + PROP_BACKEND, g_param_spec_object ( - "selection", - "Selection", + "backend", NULL, - GTK_TYPE_TREE_SELECTION, + NULL, + E_TYPE_MAIL_BACKEND, G_PARAM_READWRITE)); g_object_class_install_property ( object_class, - PROP_SESSION, + PROP_SELECTION, g_param_spec_object ( - "session", - NULL, + "selection", + "Selection", NULL, - E_TYPE_MAIL_SESSION, + GTK_TYPE_TREE_SELECTION, G_PARAM_READWRITE)); g_object_class_install_property ( @@ -766,45 +855,68 @@ em_folder_tree_model_set_selection (EMFolderTreeModel *model, g_object_notify (G_OBJECT (model), "selection"); } -EMailSession * -em_folder_tree_model_get_session (EMFolderTreeModel *model) +EMailBackend * +em_folder_tree_model_get_backend (EMFolderTreeModel *model) { g_return_val_if_fail (EM_IS_FOLDER_TREE_MODEL (model), NULL); - return model->priv->session; + return model->priv->backend; } void -em_folder_tree_model_set_session (EMFolderTreeModel *model, - EMailSession *session) +em_folder_tree_model_set_backend (EMFolderTreeModel *model, + EMailBackend *backend) { g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model)); - if (session != NULL) { - g_return_if_fail (E_IS_MAIL_SESSION (session)); - g_object_ref (session); + if (backend != NULL) { + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); + g_object_ref (backend); } - if (model->priv->session != NULL) - g_object_unref (model->priv->session); + if (model->priv->backend != NULL) + g_object_unref (model->priv->backend); - model->priv->session = session; + model->priv->backend = backend; /* FIXME Technically we should be disconnecting this signal - * when replacing an old session with a new session, + * when replacing an old backend with a new backend, * but at present this function is only called once. */ - if (session != NULL) { + if (backend != NULL) { MailFolderCache *folder_cache; + EMailSession *session; + EShell *shell; + EShellBackend *shell_backend; + EShellSettings *shell_settings; + + shell_backend = E_SHELL_BACKEND (backend); + shell = e_shell_backend_get_shell (shell_backend); + shell_settings = e_shell_get_shell_settings (shell); + session = e_mail_backend_get_session (backend); folder_cache = e_mail_session_get_folder_cache (session); g_signal_connect_swapped ( + backend, "account-sort-order-changed", + G_CALLBACK (account_sort_order_changed_cb), model); + + g_signal_connect_swapped ( + shell_settings, "notify::mail-sort-accounts-alpha", + G_CALLBACK (account_sort_order_changed_cb), model); + g_signal_connect_swapped ( + shell_settings, "notify::mail-enable-local-folders", + G_CALLBACK (enable_local_folders_changed_cb), model); + g_signal_connect_swapped ( + shell_settings, "notify::mail-enable-search-folders", + G_CALLBACK (enable_search_folders_changed_cb), model); + + g_signal_connect_swapped ( folder_cache, "folder-unread-updated", G_CALLBACK (folder_tree_model_set_unread_count), model); } - g_object_notify (G_OBJECT (model), "session"); + g_object_notify (G_OBJECT (model), "backend"); } EMailBackend * @@ -844,6 +956,7 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, GtkTreeRowReference *uri_row, *path_row; GtkTreeStore *tree_store; MailFolderCache *folder_cache; + EMailBackend *backend; EMailSession *session; EAccount *account; guint unread; @@ -868,7 +981,8 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, tree_store = GTK_TREE_STORE (model); - session = em_folder_tree_model_get_session (model); + backend = em_folder_tree_model_get_backend (model); + session = e_mail_backend_get_session (backend); folder_cache = e_mail_session_get_folder_cache (session); uid = camel_service_get_uid (CAMEL_SERVICE (si->store)); diff --git a/mail/em-folder-tree-model.h b/mail/em-folder-tree-model.h index 3765cfea11..0188753942 100644 --- a/mail/em-folder-tree-model.h +++ b/mail/em-folder-tree-model.h @@ -120,11 +120,6 @@ GtkTreeSelection * void em_folder_tree_model_set_selection (EMFolderTreeModel *model, GtkTreeSelection *selection); -EMailSession * em_folder_tree_model_get_session - (EMFolderTreeModel *model); -void em_folder_tree_model_set_session - (EMFolderTreeModel *model, - EMailSession *session); EMailBackend * em_folder_tree_model_get_backend (EMFolderTreeModel *model); void em_folder_tree_model_set_backend diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index 6212f8a8ca..1d831cc4e4 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -1770,7 +1770,7 @@ em_folder_tree_new (EMailBackend *backend, g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); g_return_val_if_fail (E_IS_ALERT_SINK (alert_sink), NULL); - model = em_folder_tree_model_get_default (backend); + model = em_folder_tree_model_get_default (); return em_folder_tree_new_with_model (backend, alert_sink, model); } @@ -1780,17 +1780,15 @@ em_folder_tree_new_with_model (EMailBackend *backend, EAlertSink *alert_sink, EMFolderTreeModel *model) { - EMailSession *session; const gchar *data_dir; g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); g_return_val_if_fail (E_IS_ALERT_SINK (alert_sink), NULL); g_return_val_if_fail (EM_IS_FOLDER_TREE_MODEL (model), NULL); - session = e_mail_backend_get_session (backend); data_dir = e_shell_backend_get_data_dir (E_SHELL_BACKEND (backend)); - e_mail_store_init (session, data_dir); + e_mail_store_init (backend, data_dir); return g_object_new ( EM_TYPE_FOLDER_TREE, diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c index 54586ad763..e72b8014ad 100644 --- a/mail/em-folder-utils.c +++ b/mail/em-folder-utils.c @@ -487,7 +487,7 @@ em_folder_utils_copy_folder (GtkWindow *parent, label = delete ? _("_Move") : _("C_opy"); title = delete ? _("Move Folder To") : _("Copy Folder To"); - model = em_folder_tree_model_get_default (backend); + model = em_folder_tree_model_get_default (); dialog = em_folder_selector_new ( parent, backend, model, @@ -565,10 +565,10 @@ em_folder_utils_create_folder (GtkWindow *parent, shell = e_shell_backend_get_shell (E_SHELL_BACKEND (backend)); shell_settings = e_shell_get_shell_settings (shell); - model = em_folder_tree_model_new (backend); - session = e_mail_backend_get_session (backend); - em_folder_tree_model_set_session (model, session); + model = em_folder_tree_model_new (); + em_folder_tree_model_set_backend (model, backend); + session = e_mail_backend_get_session (backend); list = camel_session_list_services (CAMEL_SESSION (session)); for (link = list; link != NULL; link = g_list_next (link)) { diff --git a/mail/em-format-html.c b/mail/em-format-html.c index a1be319390..f3209b8b89 100644 --- a/mail/em-format-html.c +++ b/mail/em-format-html.c @@ -40,13 +40,14 @@ #undef interface #endif -#include <libedataserver/e-data-server-util.h> /* for e_utf8_strftime, what about e_time_format_time? */ +#include <libebackend/e-extensible.h> #include <libedataserver/e-time-utils.h> +#include <libedataserver/e-data-server-util.h> /* for e_utf8_strftime, what about e_time_format_time? */ + #include "e-util/e-datetime-format.h" #include "e-util/e-icon-factory.h" #include "e-util/e-util-private.h" #include "e-util/e-util.h" -#include "e-util/e-extensible.h" #include "misc/e-web-view.h" #include <shell/e-shell.h> @@ -1511,6 +1512,43 @@ emfh_getpuri (struct _EMFormatHTMLJob *job, } static void +emfh_configure_stream_for_proxy (CamelHttpStream *stream, + const gchar *uri) +{ + EProxy *proxy; + SoupURI *proxy_uri; + gchar *basic; + gchar *basic64; + const gchar *user = ""; + const gchar *password = ""; + + proxy = em_utils_get_proxy (); + + if (!e_proxy_require_proxy_for_uri (proxy, uri)) + return; + + proxy_uri = e_proxy_peek_uri_for (proxy, uri); + + if (proxy_uri == NULL) + return; + + if (proxy_uri->user != NULL) + user = proxy_uri->user; + + if (proxy_uri->password != NULL) + password = proxy_uri->password; + + if (*user == '\0' && *password == '\0') + return; + + basic = g_strdup_printf ("%s:%s", user, password); + basic64 = g_base64_encode ((guchar *) basic, strlen (basic)); + camel_http_stream_set_proxy_authpass (stream, basic64); + g_free (basic64); + g_free (basic); +} + +static void emfh_gethttp (struct _EMFormatHTMLJob *job, GCancellable *cancellable) { @@ -1533,7 +1571,6 @@ emfh_gethttp (struct _EMFormatHTMLJob *job, if (instream == NULL) { EMailImageLoadingPolicy policy; - gchar *proxy; policy = em_format_html_get_image_loading_policy (job->format); @@ -1552,12 +1589,9 @@ emfh_gethttp (struct _EMFormatHTMLJob *job, } instream = camel_http_stream_new (CAMEL_HTTP_METHOD_GET, ((EMFormat *) job->format)->session, url); - camel_http_stream_set_user_agent((CamelHttpStream *)instream, "CamelHttpStream/1.0 Evolution/" VERSION); - proxy = em_utils_get_proxy_uri (job->u.uri); - if (proxy) { - camel_http_stream_set_proxy ((CamelHttpStream *) instream, proxy); - g_free (proxy); - } + camel_http_stream_set_user_agent((CamelHttpStream *) instream, "CamelHttpStream/1.0 Evolution/" VERSION); + emfh_configure_stream_for_proxy ((CamelHttpStream *) instream, job->u.uri); + camel_operation_push_message ( cancellable, _("Retrieving '%s'"), job->u.uri); tmp_stream = (CamelHttpStream *) instream; diff --git a/mail/em-subscription-editor.c b/mail/em-subscription-editor.c index 2dca93b51a..09b74bcb3c 100644 --- a/mail/em-subscription-editor.c +++ b/mail/em-subscription-editor.c @@ -51,7 +51,7 @@ typedef struct _AsyncContext AsyncContext; typedef struct _StoreData StoreData; struct _EMSubscriptionEditorPrivate { - CamelSession *session; + EMailBackend *backend; CamelStore *initial_store; GtkWidget *combo_box; /* not referenced */ @@ -95,7 +95,7 @@ struct _StoreData { enum { PROP_0, - PROP_SESSION, + PROP_BACKEND, PROP_STORE }; @@ -932,13 +932,13 @@ subscription_editor_set_store (EMSubscriptionEditor *editor, } static void -subscription_editor_set_session (EMSubscriptionEditor *editor, - CamelSession *session) +subscription_editor_set_backend (EMSubscriptionEditor *editor, + EMailBackend *backend) { - g_return_if_fail (CAMEL_IS_SESSION (session)); - g_return_if_fail (editor->priv->session == NULL); + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); + g_return_if_fail (editor->priv->backend == NULL); - editor->priv->session = g_object_ref (session); + editor->priv->backend = g_object_ref (backend); } static void @@ -948,8 +948,8 @@ subscription_editor_set_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_SESSION: - subscription_editor_set_session ( + case PROP_BACKEND: + subscription_editor_set_backend ( EM_SUBSCRIPTION_EDITOR (object), g_value_get_object (value)); return; @@ -971,10 +971,10 @@ subscription_editor_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { - case PROP_SESSION: + case PROP_BACKEND: g_value_set_object ( value, - em_subscription_editor_get_session ( + em_subscription_editor_get_backend ( EM_SUBSCRIPTION_EDITOR (object))); return; @@ -996,9 +996,9 @@ subscription_editor_dispose (GObject *object) priv = EM_SUBSCRIPTION_EDITOR_GET_PRIVATE (object); - if (priv->session != NULL) { - g_object_unref (priv->session); - priv->session = NULL; + if (priv->backend != NULL) { + g_object_unref (priv->backend); + priv->backend = NULL; } if (priv->initial_store != NULL) { @@ -1044,14 +1044,17 @@ subscription_editor_constructed (GObject *object) if (editor->priv->initial_store == NULL) { EAccount *account; CamelService *service; - CamelSession *session; - const gchar *uid; + EMailBackend *backend; + EMailSession *session; account = e_get_default_account (); - uid = account->uid; - session = em_subscription_editor_get_session (editor); - service = camel_session_get_service (session, uid); + backend = em_subscription_editor_get_backend (editor); + session = e_mail_backend_get_session (backend); + + service = camel_session_get_service ( + CAMEL_SESSION (session), + account->uid); if (CAMEL_IS_SUBSCRIBABLE (service)) editor->priv->initial_store = g_object_ref (service); @@ -1077,7 +1080,7 @@ subscription_editor_realize (GtkWidget *widget) /* Find stores to display, and watch for the initial store. */ - model = em_folder_tree_model_get_default (NULL); + model = em_folder_tree_model_get_default (); list = em_folder_tree_model_list_stores (model); for (link = list; link != NULL; link = g_list_next (link)) { @@ -1122,12 +1125,12 @@ em_subscription_editor_class_init (EMSubscriptionEditorClass *class) g_object_class_install_property ( object_class, - PROP_SESSION, + PROP_BACKEND, g_param_spec_object ( - "session", + "backend", NULL, NULL, - CAMEL_TYPE_SESSION, + E_TYPE_MAIL_BACKEND, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -1343,26 +1346,26 @@ em_subscription_editor_init (EMSubscriptionEditor *editor) GtkWidget * em_subscription_editor_new (GtkWindow *parent, - CamelSession *session, + EMailBackend *backend, CamelStore *initial_store) { g_return_val_if_fail (GTK_IS_WINDOW (parent), NULL); - g_return_val_if_fail (CAMEL_IS_SESSION (session), NULL); + g_return_val_if_fail (E_IS_MAIL_BACKEND (backend), NULL); return g_object_new ( EM_TYPE_SUBSCRIPTION_EDITOR, - "session", session, + "backend", backend, "store", initial_store, "transient-for", parent, NULL); } -CamelSession * -em_subscription_editor_get_session (EMSubscriptionEditor *editor) +EMailBackend * +em_subscription_editor_get_backend (EMSubscriptionEditor *editor) { g_return_val_if_fail (EM_IS_SUBSCRIPTION_EDITOR (editor), NULL); - return editor->priv->session; + return editor->priv->backend; } CamelStore * diff --git a/mail/em-subscription-editor.h b/mail/em-subscription-editor.h index d75347760b..1b297f44ed 100644 --- a/mail/em-subscription-editor.h +++ b/mail/em-subscription-editor.h @@ -21,6 +21,7 @@ #include <gtk/gtk.h> #include <camel/camel.h> +#include <mail/e-mail-backend.h> /* Standard GObject macros */ #define EM_TYPE_SUBSCRIPTION_EDITOR \ @@ -58,9 +59,11 @@ struct _EMSubscriptionEditorClass { GType em_subscription_editor_get_type (void); GtkWidget * em_subscription_editor_new (GtkWindow *parent, - CamelSession *session, + EMailBackend *backend, CamelStore *initial_store); -CamelSession * em_subscription_editor_get_session +EMailBackend * em_subscription_editor_get_backend + (EMSubscriptionEditor *editor); +CamelStore * em_subscription_editor_get_store (EMSubscriptionEditor *editor); CamelStore * em_subscription_editor_get_store (EMSubscriptionEditor *editor); diff --git a/mail/em-utils.c b/mail/em-utils.c index 5ff93887a2..67978884d0 100644 --- a/mail/em-utils.c +++ b/mail/em-utils.c @@ -1194,69 +1194,6 @@ em_utils_folder_is_outbox (CamelFolder *folder) static EProxy *emu_proxy = NULL; static GStaticMutex emu_proxy_lock = G_STATIC_MUTEX_INIT; -/* encode to string this way, because soup_uri_to_string doesn't include passwords */ -static gchar * -suri_to_string (SoupURI *suri) -{ - GString *uri; - gchar *tmp; - - if (!suri) - return NULL; - - uri = g_string_sized_new (20); - - if (suri->scheme) - g_string_append_printf (uri, "%s:", suri->scheme); - if (suri->host) { - g_string_append (uri, "//"); - if (suri->user) { - tmp = soup_uri_encode (suri->user, ":/;#@?\\"); - g_string_append (uri, tmp); - g_free (tmp); - } - - if (suri->password) { - g_string_append_c (uri, ':'); - tmp = soup_uri_encode (suri->password, ":/;#@?\\"); - g_string_append (uri, tmp); - g_free (tmp); - } - - if (suri->user || suri->password) - g_string_append_c (uri, '@'); - - if (strchr (suri->host, ':')) { - g_string_append_c (uri, '['); - g_string_append (uri, suri->host); - g_string_append_c (uri, ']'); - } else { - tmp = soup_uri_encode (suri->host, ":/"); - g_string_append (uri, tmp); - g_free (tmp); - } - - if (suri->port && !soup_uri_uses_default_port (suri)) - g_string_append_printf (uri, ":%d", suri->port); - if (!suri->path && (suri->query || suri->fragment)) - g_string_append_c (uri, '/'); - } - - if (suri->path && *suri->path) - g_string_append (uri, suri->path); - - if (suri->query) { - g_string_append_c (uri, '?'); - g_string_append (uri, suri->query); - } - if (suri->fragment) { - g_string_append_c (uri, '#'); - g_string_append (uri, suri->fragment); - } - - return g_string_free (uri, FALSE); -} - static gpointer emu_proxy_setup (gpointer data) { @@ -1269,30 +1206,18 @@ emu_proxy_setup (gpointer data) return NULL; } -/** - * em_utils_get_proxy_uri: - * - * Get the system proxy uri for 'pUri'. - * - * Return value: Must be freed when finished with. - **/ -gchar * -em_utils_get_proxy_uri (const gchar *pUri) +EProxy * +em_utils_get_proxy (void) { - gchar *uri = NULL; - g_static_mutex_lock (&emu_proxy_lock); if (!emu_proxy) { mail_call_main (MAIL_CALL_p_p, (MailMainFunc) emu_proxy_setup, NULL); } - if (e_proxy_require_proxy_for_uri (emu_proxy, pUri)) - uri = suri_to_string (e_proxy_peek_uri_for (emu_proxy, pUri)); - g_static_mutex_unlock (&emu_proxy_lock); - return uri; + return emu_proxy; } /** @@ -2391,7 +2316,8 @@ free_account_sort_order_cache (void) } static void -fill_accounts_sort_order_cache (EMailBackend *backend, gboolean force_reload) +fill_accounts_sort_order_cache (EMailBackend *backend, + gboolean force_reload) { GSList *account_uids; @@ -2455,7 +2381,8 @@ emu_get_sort_order_key_file (EMailBackend *backend) } void -em_utils_save_accounts_sort_order (EMailBackend *backend, const GSList *account_uids) +em_utils_save_accounts_sort_order (EMailBackend *backend, + const GSList *account_uids) { gchar *filename; GKeyFile *key_file; @@ -2520,7 +2447,8 @@ em_utils_load_accounts_sort_order (EMailBackend *backend) } guint -em_utils_get_account_sort_order (EMailBackend *backend, const gchar *account_uid) +em_utils_get_account_sort_order (EMailBackend *backend, + const gchar *account_uid) { guint res; diff --git a/mail/em-utils.h b/mail/em-utils.h index e6ebe8ca4b..b07b74b186 100644 --- a/mail/em-utils.h +++ b/mail/em-utils.h @@ -26,6 +26,7 @@ #include <gtk/gtk.h> #include <sys/types.h> #include <camel/camel.h> +#include <libedataserver/e-proxy.h> #include <mail/e-mail-reader.h> #include <mail/e-mail-session.h> @@ -66,7 +67,7 @@ gboolean em_utils_folder_is_templates (CamelFolder *folder); gboolean em_utils_folder_is_sent (CamelFolder *folder); gboolean em_utils_folder_is_outbox (CamelFolder *folder); -gchar *em_utils_get_proxy_uri (const gchar *uri); +EProxy * em_utils_get_proxy (void); /* FIXME: should this have an override charset? */ gchar *em_utils_message_to_html (CamelMimeMessage *msg, const gchar *credits, guint32 flags, struct _EMFormat *source, const gchar *append, guint32 *validity_found); diff --git a/mail/em-vfolder-rule.c b/mail/em-vfolder-rule.c index fbb711738f..04c009bc00 100644 --- a/mail/em-vfolder-rule.c +++ b/mail/em-vfolder-rule.c @@ -32,6 +32,7 @@ #include "em-vfolder-context.h" #include "em-vfolder-rule.h" +#include "mail/e-mail-folder-utils.h" #include "mail/e-mail-store.h" #include "mail/em-utils.h" #include "mail/em-folder-tree.h" @@ -532,63 +533,38 @@ select_source_with_changed (GtkWidget *widget, data->vr->with = with; } -/* attempt to make a 'nice' folder name out of the raw uri */ -static gchar * -format_source (const gchar *uri) -{ - CamelURL *url; - GString *out; - gchar *res; - - /* This should really probably base it on the account name? */ - url = camel_url_new (uri, NULL); - - /* bad uri */ - if (url == NULL) - return g_strdup (uri); - - out = g_string_new (url->protocol); - g_string_append_c (out, ':'); - if (url->user && url->host) { - g_string_append_printf(out, "%s@%s", url->user, url->host); - if (url->port) - g_string_append_printf(out, ":%d", url->port); - } - if (url->fragment) - g_string_append (out, url->fragment); - else if (url->path) - g_string_append (out, url->path); - - res = out->str; - g_string_free (out, FALSE); - - return res; -} - static void vfr_folder_response (EMFolderSelector *selector, gint button, struct _source_data *data) { + EMailBackend *backend; + EMailSession *session; const gchar *uri; + backend = em_folder_selector_get_backend (selector); + session = e_mail_backend_get_session (backend); + uri = em_folder_selector_get_selected_uri (selector); if (button == GTK_RESPONSE_OK && uri != NULL) { - gchar *urinice; GtkTreeSelection *selection; GtkTreeIter iter; + gchar *markup; g_queue_push_tail (&data->vr->sources, g_strdup (uri)); + markup = e_mail_folder_uri_to_markup ( + CAMEL_SESSION (session), uri, NULL); + gtk_list_store_append (data->model, &iter); - urinice = format_source (uri); - gtk_list_store_set (data->model, &iter, 0, urinice, 1, uri, -1); - g_free (urinice); + gtk_list_store_set (data->model, &iter, 0, markup, 1, uri, -1); selection = gtk_tree_view_get_selection (data->list); gtk_tree_selection_select_iter (selection, &iter); data->current = uri; + g_free (markup); + set_sensitive (data); } @@ -610,7 +586,7 @@ source_add (GtkWidget *widget, backend = em_vfolder_rule_get_backend (data->vr); - model = em_folder_tree_model_get_default (backend); + model = em_folder_tree_model_get_default (); dialog = em_folder_selector_new ( parent, backend, model, @@ -687,6 +663,8 @@ get_widget (EFilterRule *fr, ERuleContext *rc) { EMVFolderRule *vr =(EMVFolderRule *) fr; + EMailBackend *backend; + EMailSession *session; GtkWidget *widget, *frame; struct _source_data *data; GtkRadioButton *rb; @@ -721,13 +699,19 @@ get_widget (EFilterRule *fr, object = gtk_builder_get_object (builder, "source_model"); data->model = GTK_LIST_STORE (object); + backend = em_vfolder_context_get_backend (EM_VFOLDER_CONTEXT (rc)); + session = e_mail_backend_get_session (backend); + source = NULL; while ((source = em_vfolder_rule_next_source (vr, source))) { - gchar *nice = format_source (source); + gchar *markup; + + markup = e_mail_folder_uri_to_markup ( + CAMEL_SESSION (session), source, NULL); gtk_list_store_append (data->model, &iter); - gtk_list_store_set (data->model, &iter, 0, nice, 1, source, -1); - g_free (nice); + gtk_list_store_set (data->model, &iter, 0, markup, 1, source, -1); + g_free (markup); } g_signal_connect (data->list, "cursor-changed", G_CALLBACK(select_source), data); diff --git a/mail/importers/Makefile.am b/mail/importers/Makefile.am index 0c1864928b..fa1a400f03 100644 --- a/mail/importers/Makefile.am +++ b/mail/importers/Makefile.am @@ -6,11 +6,11 @@ libevolution_mail_importers_la_CPPFLAGS = \ -I$(srcdir)/.. \ -I$(top_srcdir) \ -I$(top_srcdir)/widgets \ - $(GNOME_PLATFORM_CFLAGS) \ - $(EVOLUTION_MAIL_CFLAGS) \ -DG_LOG_DOMAIN=\"evolution-mail-importer\" \ -DEVOLUTION_PRIVDATADIR=\""$(privdatadir)"\" \ - $(IMPORTERS_CFLAGS) + $(EVOLUTION_DATA_SERVER_CFLAGS) \ + $(GNOME_PLATFORM_CFLAGS) \ + $(GTKHTML_CFLAGS) libevolution_mail_importers_la_SOURCES = \ mail-importer.c \ @@ -28,8 +28,8 @@ libevolution_mail_importers_la_LIBADD = \ $(top_builddir)/mail/libevolution-mail.la \ $(top_builddir)/shell/libeshell.la \ $(top_builddir)/widgets/misc/libemiscwidgets.la \ + $(EVOLUTION_DATA_SERVER_LIBS) \ $(GNOME_PLATFORM_LIBS) \ - $(EVOLUTION_MAIL_LIBS) \ - $(IMPORTERS_LIBS) + $(GTKHTML_LIBS) -include $(top_srcdir)/git.mk diff --git a/mail/mail-config.ui b/mail/mail-config.ui index 5d934aafa2..8c788b69ad 100644 --- a/mail/mail-config.ui +++ b/mail/mail-config.ui @@ -409,6 +409,11 @@ for display purposes only. </property> <property name="step_increment">1</property> <property name="page_increment">10</property> </object> + <object class="GtkAdjustment" id="adjustment6"> + <property name="upper">65535</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> <object class="GtkNotebook" id="composer_toplevel"> <property name="visible">True</property> <property name="can_focus">True</property> @@ -1505,6 +1510,22 @@ for display purposes only. </property> </packing> </child> <child> + <object class="GtkLabel" id="lblSocksHost"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">SOC_KS Proxy:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">txtSocksHost</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> <object class="GtkLabel" id="lblIgnoreHosts"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -1547,6 +1568,20 @@ for display purposes only. </property> </packing> </child> <child> + <object class="GtkEntry" id="txtSocksHost"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options"></property> + </packing> + </child> + <child> <object class="GtkLabel" id="lblHttpPort"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -1577,6 +1612,22 @@ for display purposes only. </property> </packing> </child> <child> + <object class="GtkLabel" id="lblSocksPort"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Port:</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> <object class="GtkSpinButton" id="spnHttpPort"> <property name="visible">True</property> <property name="can_focus">True</property> @@ -1607,6 +1658,22 @@ for display purposes only. </property> </packing> </child> <child> + <object class="GtkSpinButton" id="spnSocksPort"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + <property name="adjustment">adjustment6</property> + <property name="climb_rate">1</property> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options"></property> + </packing> + </child> + <child> <object class="GtkEntry" id="txtIgnoreHosts"> <property name="visible">True</property> <property name="can_focus">True</property> @@ -4265,6 +4332,7 @@ For example: "Work" or "Personal"</property> <property name="receives_default">False</property> <property name="use_action_appearance">False</property> <property name="use_underline">True</property> + <property name="active">True</property> <property name="draw_indicator">True</property> </object> <packing> diff --git a/mail/mail-dialogs.ui b/mail/mail-dialogs.ui index ff74671741..58a9f8c2aa 100644 --- a/mail/mail-dialogs.ui +++ b/mail/mail-dialogs.ui @@ -125,7 +125,7 @@ <child> <object class="GtkCellRendererText" id="source_renderer"/> <attributes> - <attribute name="text">0</attribute> + <attribute name="markup">0</attribute> </attributes> </child> </object> diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c index 0e1ac98413..30bbce6579 100644 --- a/mail/mail-folder-cache.c +++ b/mail/mail-folder-cache.c @@ -39,8 +39,8 @@ #include <glib/gstdio.h> #include <libedataserver/e-data-server-util.h> -#include "e-util/e-marshal.h" -#include "e-util/e-util.h" +#include <e-util/e-marshal.h> +#include <e-util/e-util.h> #include "mail-mt.h" #include "mail-folder-cache.h" diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 2c4b3067df..57885172a9 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -215,7 +215,7 @@ fetch_mail_exec (struct _fetch_mail_msg *m, CamelFolder *folder = NULL; CamelURL *url; const gchar *uid; - gboolean is_local_delivery; + gboolean is_local_delivery = FALSE; gint i; fm->destination = e_mail_local_get_folder ( @@ -452,7 +452,7 @@ static const gchar *resent_recipients[] = { struct _send_queue_msg { MailMsg base; - EMailSession *session; + EMailBackend *backend; CamelFolder *queue; CamelTransport *transport; @@ -483,6 +483,7 @@ mail_send_message (struct _send_queue_msg *m, GError **error) { EAccount *account = NULL; + EMailSession *session; const CamelInternetAddress *iaddr; CamelAddress *from, *recipients; CamelMessageInfo *info = NULL; @@ -504,11 +505,13 @@ mail_send_message (struct _send_queue_msg *m, camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer", x_mailer); - err = g_string_new(""); + err = g_string_new (""); xev = mail_tool_remove_xevolution_headers (message); - tmp = camel_header_raw_find(&xev, "X-Evolution-Account", NULL); - if (tmp) { + session = e_mail_backend_get_session (m->backend); + + tmp = camel_header_raw_find (&xev, "X-Evolution-Account", NULL); + if (tmp != NULL) { gchar *name; name = g_strstrip (g_strdup (tmp)); @@ -522,7 +525,7 @@ mail_send_message (struct _send_queue_msg *m, transport_uid = g_strconcat ( account->uid, "-transport", NULL); service = camel_session_get_service ( - CAMEL_SESSION (m->session), + CAMEL_SESSION (session), transport_uid); g_free (transport_uid); @@ -607,7 +610,7 @@ mail_send_message (struct _send_queue_msg *m, uri = g_strstrip (g_strdup (header->value)); /* FIXME Not passing a GCancellable or GError here. */ folder = e_mail_session_uri_to_folder_sync ( - m->session, uri, 0, NULL, NULL); + session, uri, 0, NULL, NULL); if (folder) { /* FIXME Not passing a GCancellable or GError here. */ camel_folder_append_message_sync ( @@ -647,7 +650,7 @@ mail_send_message (struct _send_queue_msg *m, if (sent_folder_uri) { folder = e_mail_session_uri_to_folder_sync ( - m->session, sent_folder_uri, 0, + session, sent_folder_uri, 0, cancellable, &local_error); if (folder == NULL) { g_string_append_printf ( @@ -714,7 +717,7 @@ mail_send_message (struct _send_queue_msg *m, if (local_error == NULL) { /* Mark the draft message for deletion, if present. */ e_mail_session_handle_draft_headers_sync ( - m->session, message, cancellable, &local_error); + session, message, cancellable, &local_error); if (local_error != NULL) { g_warning ("%s: Failed to handle draft headers: %s", G_STRFUNC, local_error->message); g_clear_error (&local_error); @@ -724,7 +727,7 @@ mail_send_message (struct _send_queue_msg *m, * Source message refers to the message being forwarded * or replied to. */ e_mail_session_handle_source_headers_sync ( - m->session, message, cancellable, &local_error); + session, message, cancellable, &local_error); if (local_error != NULL) { g_warning ("%s: Failed to handle source headers: %s", G_STRFUNC, local_error->message); g_clear_error (&local_error); @@ -766,8 +769,6 @@ exit: camel_header_raw_clear (&xev); g_string_free (err, TRUE); g_object_unref (message); - - return; } /* ** SEND MAIL QUEUE ***************************************************** */ @@ -930,8 +931,8 @@ send_queue_desc (struct _send_queue_msg *m) static void send_queue_free (struct _send_queue_msg *m) { - if (m->session != NULL) - g_object_unref (m->session); + if (m->backend != NULL) + g_object_unref (m->backend); if (m->driver != NULL) g_object_unref (m->driver); if (m->transport != NULL) @@ -950,7 +951,7 @@ static MailMsgInfo send_queue_info = { /* same interface as fetch_mail, just 'cause i'm lazy today * (and we need to run it from the same spot?) */ void -mail_send_queue (EMailSession *session, +mail_send_queue (EMailBackend *backend, CamelFolder *queue, CamelTransport *transport, const gchar *type, @@ -962,10 +963,15 @@ mail_send_queue (EMailSession *session, void (*done)(gpointer data), gpointer data) { + EMailSession *session; struct _send_queue_msg *m; + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); + + session = e_mail_backend_get_session (backend); + m = mail_msg_new (&send_queue_info); - m->session = g_object_ref (session); + m->backend = g_object_ref (backend); m->queue = g_object_ref (queue); m->transport = g_object_ref (transport); if (G_IS_CANCELLABLE (cancellable)) diff --git a/mail/mail-ops.h b/mail/mail-ops.h index 32784be245..4ec64ccf22 100644 --- a/mail/mail-ops.h +++ b/mail/mail-ops.h @@ -63,7 +63,7 @@ void mail_xfer_folder (const gchar *src_uri, const gchar *dest_uri, gboolean rem gpointer data); /* yeah so this is messy, but it does a lot, maybe i can consolidate all user_data's to be the one */ -void mail_send_queue (EMailSession *session, +void mail_send_queue (EMailBackend *backend, CamelFolder *queue, CamelTransport *transport, const gchar *type, diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c index 5fda76d103..33ac977e35 100644 --- a/mail/mail-send-recv.c +++ b/mail/mail-send-recv.c @@ -107,7 +107,7 @@ typedef enum { struct _send_info { send_info_t type; /* 0 = fetch, 1 = send */ - EMailSession *session; + EMailBackend *backend; GCancellable *cancellable; gchar *service_uid; gboolean keep_on_server; @@ -151,8 +151,8 @@ free_folder_info (struct _folder_info *info) static void free_send_info (struct _send_info *info) { - if (info->session) - g_object_unref (info->session); + if (info->backend) + g_object_unref (info->backend); if (info->cancellable) g_object_unref (info->cancellable); g_free (info->service_uid); @@ -425,7 +425,7 @@ get_receive_type (CamelURL *url) static struct _send_data * build_dialog (GtkWindow *parent, - EMailSession *session, + EMailBackend *backend, EAccountList *accounts, CamelFolder *outbox, EAccount *outgoing_account, @@ -552,7 +552,7 @@ build_dialog (GtkWindow *parent, info = g_malloc0 (sizeof (*info)); info->type = type; - info->session = g_object_ref (session); + info->backend = g_object_ref (backend); d(printf("adding source %s\n", source->url)); @@ -802,21 +802,24 @@ receive_done (gpointer data) /* if we've been called to run again - run again */ if (info->type == SEND_SEND && info->state == SEND_ACTIVE && info->again) { + EMailSession *session; CamelFolder *local_outbox; CamelService *service; + session = e_mail_backend_get_session (info->backend); + local_outbox = e_mail_local_get_folder ( E_MAIL_LOCAL_FOLDER_OUTBOX); service = camel_session_get_service ( - CAMEL_SESSION (info->session), + CAMEL_SESSION (session), info->service_uid); g_return_if_fail (CAMEL_IS_TRANSPORT (service)); info->again = 0; mail_send_queue ( - info->session, + info->backend, local_outbox, CAMEL_TRANSPORT (service), E_FILTER_SOURCE_OUTGOING, @@ -875,19 +878,24 @@ receive_get_folder (CamelFilterDriver *d, { struct _send_info *info = data; CamelFolder *folder; + EMailSession *session; struct _folder_info *oldinfo; gpointer oldkey, oldinfoptr; g_mutex_lock (info->data->lock); oldinfo = g_hash_table_lookup (info->data->folders, uri); g_mutex_unlock (info->data->lock); + if (oldinfo) { g_object_ref (oldinfo->folder); return oldinfo->folder; } + + session = e_mail_backend_get_session (info->backend); + /* FIXME Not passing a GCancellable here. */ folder = e_mail_session_uri_to_folder_sync ( - info->session, uri, 0, NULL, error); + session, uri, 0, NULL, error); if (!folder) return NULL; @@ -965,6 +973,7 @@ refresh_folders_exec (struct _refresh_folders_msg *m, GError **error) { CamelFolder *folder; + EMailSession *session; gint i; GError *local_error = NULL; gulong handler_id = 0; @@ -978,9 +987,11 @@ refresh_folders_exec (struct _refresh_folders_msg *m, camel_operation_push_message (m->info->cancellable, _("Updating...")); + session = e_mail_backend_get_session (m->info->backend); + for (i = 0; i < m->folders->len; i++) { folder = e_mail_session_uri_to_folder_sync ( - m->info->session, + session, m->folders->pdata[i], 0, cancellable, &local_error); if (folder) { @@ -1068,14 +1079,16 @@ static void receive_update_got_store (CamelStore *store, struct _send_info *info) { + EMailSession *session; MailFolderCache *folder_cache; - folder_cache = e_mail_session_get_folder_cache (info->session); + session = e_mail_backend_get_session (info->backend); + folder_cache = e_mail_session_get_folder_cache (session); if (store) { mail_folder_cache_note_store ( folder_cache, - CAMEL_SESSION (info->session), + CAMEL_SESSION (session), store, info->cancellable, receive_update_got_folderinfo, info); } else { @@ -1085,11 +1098,12 @@ receive_update_got_store (CamelStore *store, static GtkWidget * send_receive (GtkWindow *parent, - EMailSession *session, + EMailBackend *backend, gboolean allow_send) { CamelFolder *local_outbox; struct _send_data *data; + EMailSession *session; EAccountList *accounts; EAccount *account; GList *scan; @@ -1101,6 +1115,8 @@ send_receive (GtkWindow *parent, return send_recv_dialog; } + session = e_mail_backend_get_session (backend); + if (!camel_session_get_online (CAMEL_SESSION (session))) return send_recv_dialog; @@ -1112,7 +1128,7 @@ send_receive (GtkWindow *parent, local_outbox = e_mail_local_get_folder (E_MAIL_LOCAL_FOLDER_OUTBOX); data = build_dialog ( - parent, session, accounts, + parent, backend, accounts, local_outbox, account, allow_send); for (scan = data->infos; scan != NULL; scan = scan->next) { @@ -1139,7 +1155,7 @@ send_receive (GtkWindow *parent, case SEND_SEND: /* todo, store the folder in info? */ mail_send_queue ( - session, local_outbox, + backend, local_outbox, CAMEL_TRANSPORT (service), E_FILTER_SOURCE_OUTGOING, info->cancellable, @@ -1161,21 +1177,21 @@ send_receive (GtkWindow *parent, GtkWidget * mail_send_receive (GtkWindow *parent, - EMailSession *session) + EMailBackend *backend) { - return send_receive (parent, session, TRUE); + return send_receive (parent, backend, TRUE); } GtkWidget * mail_receive (GtkWindow *parent, - EMailSession *session) + EMailBackend *backend) { - return send_receive (parent, session, FALSE); + return send_receive (parent, backend, FALSE); } struct _auto_data { EAccount *account; - EMailSession *session; + EMailBackend *backend; gint period; /* in seconds */ gint timeout_id; }; @@ -1185,10 +1201,13 @@ static GHashTable *auto_active; static gboolean auto_timeout (gpointer data) { + EMailSession *session; struct _auto_data *info = data; - if (camel_session_get_online (CAMEL_SESSION (info->session))) - mail_receive_account (info->session, info->account); + session = e_mail_backend_get_session (info->backend); + + if (camel_session_get_online (CAMEL_SESSION (session))) + mail_receive_account (info->backend, info->account); return TRUE; } @@ -1211,8 +1230,8 @@ auto_account_removed (EAccountList *eal, static void auto_account_finalized (struct _auto_data *info) { - if (info->session != NULL) - g_object_unref (info->session); + if (info->backend != NULL) + g_object_unref (info->backend); if (info->timeout_id) g_source_remove (info->timeout_id); g_free (info); @@ -1243,13 +1262,13 @@ auto_account_commit (struct _auto_data *info) static void auto_account_added (EAccountList *eal, EAccount *ea, - EMailSession *session) + EMailBackend *backend) { struct _auto_data *info; info = g_malloc0 (sizeof (*info)); info->account = ea; - info->session = g_object_ref (session); + info->backend = g_object_ref (backend); g_object_set_data_full ( G_OBJECT (ea), "mail-autoreceive", info, (GDestroyNotify) auto_account_finalized); @@ -1314,7 +1333,6 @@ mail_autoreceive_init (EMailBackend *backend) { EShellBackend *shell_backend; EShellSettings *shell_settings; - EMailSession *session; EAccountList *accounts; EIterator *iter; EShell *shell; @@ -1327,11 +1345,9 @@ mail_autoreceive_init (EMailBackend *backend) accounts = e_get_account_list (); auto_active = g_hash_table_new (g_str_hash, g_str_equal); - session = e_mail_backend_get_session (backend); - g_signal_connect ( accounts, "account-added", - G_CALLBACK (auto_account_added), session); + G_CALLBACK (auto_account_added), backend); g_signal_connect ( accounts, "account-removed", G_CALLBACK (auto_account_removed), NULL); @@ -1344,7 +1360,7 @@ mail_autoreceive_init (EMailBackend *backend) e_iterator_next (iter)) auto_account_added ( accounts, (EAccount *) - e_iterator_get (iter), session); + e_iterator_get (iter), backend); shell_backend = E_SHELL_BACKEND (backend); shell = e_shell_backend_get_shell (shell_backend); @@ -1356,7 +1372,7 @@ mail_autoreceive_init (EMailBackend *backend) /* also flush outbox on start */ if (e_shell_get_online (shell)) - mail_send (session); + mail_send (backend); } g_signal_connect ( @@ -1367,11 +1383,12 @@ mail_autoreceive_init (EMailBackend *backend) /* We setup the download info's in a hashtable, if we later * need to build the gui, we insert them in to add them. */ void -mail_receive_account (EMailSession *session, +mail_receive_account (EMailBackend *backend, EAccount *account) { struct _send_info *info; struct _send_data *data; + EMailSession *session; CamelFolder *local_outbox; CamelService *service; CamelURL *url; @@ -1394,7 +1411,7 @@ mail_receive_account (EMailSession *session, info = g_malloc0 (sizeof (*info)); info->type = type; - info->session = g_object_ref (session); + info->backend = g_object_ref (backend); info->progress_bar = NULL; info->status_label = NULL; info->service_uid = g_strdup (account->uid); @@ -1413,6 +1430,8 @@ mail_receive_account (EMailSession *session, g_hash_table_insert (data->active, account->uid, info); + session = e_mail_backend_get_session (backend); + service = camel_session_get_service ( CAMEL_SESSION (session), account->uid); @@ -1434,7 +1453,7 @@ mail_receive_account (EMailSession *session, local_outbox = e_mail_local_get_folder ( E_MAIL_LOCAL_FOLDER_OUTBOX); mail_send_queue ( - info->session, + info->backend, local_outbox, CAMEL_TRANSPORT (service), E_FILTER_SOURCE_OUTGOING, @@ -1452,10 +1471,11 @@ mail_receive_account (EMailSession *session, } void -mail_send (EMailSession *session) +mail_send (EMailBackend *backend) { CamelFolder *local_outbox; CamelService *service; + EMailSession *session; EAccount *account; CamelURL *url; struct _send_info *info; @@ -1490,7 +1510,7 @@ mail_send (EMailSession *session) info = g_malloc0 (sizeof (*info)); info->type = SEND_SEND; - info->session = g_object_ref (session); + info->backend = g_object_ref (backend); info->progress_bar = NULL; info->status_label = NULL; info->service_uid = g_strdup (transport_uid); @@ -1508,6 +1528,8 @@ mail_send (EMailSession *session) /* todo, store the folder in info? */ local_outbox = e_mail_local_get_folder (E_MAIL_LOCAL_FOLDER_OUTBOX); + session = e_mail_backend_get_session (backend); + service = camel_session_get_service ( CAMEL_SESSION (session), transport_uid); @@ -1516,7 +1538,7 @@ mail_send (EMailSession *session) g_return_if_fail (CAMEL_IS_TRANSPORT (service)); mail_send_queue ( - session, local_outbox, + backend, local_outbox, CAMEL_TRANSPORT (service), E_FILTER_SOURCE_OUTGOING, info->cancellable, diff --git a/mail/mail-send-recv.h b/mail/mail-send-recv.h index 5da6599712..f702b74d7a 100644 --- a/mail/mail-send-recv.h +++ b/mail/mail-send-recv.h @@ -32,16 +32,16 @@ G_BEGIN_DECLS /* send/receive all uri's */ GtkWidget * mail_send_receive (GtkWindow *parent, - EMailSession *session); + EMailBackend *backend); GtkWidget * mail_receive (GtkWindow *parent, - EMailSession *session); + EMailBackend *backend); /* receive a single account */ -void mail_receive_account (EMailSession *session, +void mail_receive_account (EMailBackend *backend, EAccount *account); -void mail_send (EMailSession *session); +void mail_send (EMailBackend *backend); /* setup auto receive stuff */ void mail_autoreceive_init (EMailBackend *backend); diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c index 78d0863e0c..c1e451d04c 100644 --- a/mail/mail-vfolder.c +++ b/mail/mail-vfolder.c @@ -1161,7 +1161,7 @@ vfolder_load_storage (EMailBackend *backend) G_CALLBACK (context_rule_removed), context); /* load store to mail component */ - e_mail_store_add (session, vfolder_store); + e_mail_store_add (backend, vfolder_store); /* and setup the rules we have */ rule = NULL; diff --git a/mail/mail.error.xml b/mail/mail.error.xml index f32b4ce688..006cc559a4 100644 --- a/mail/mail.error.xml +++ b/mail/mail.error.xml @@ -540,5 +540,10 @@ An mbox account will be created to preserve the old mbox folders. You can delete <_secondary>The reported error was "{0}".</_secondary> </error> + <error id="blacklisted-file" type="warning"> + <_primary>Hidden file is attached.</_primary> + <_secondary xml:space="preserve">The attachment named {0} is a hidden file and may contain sensitive data. Please review it before sending.</_secondary> + </error> + </error-list> diff --git a/mail/message-list.c b/mail/message-list.c index cd44b9506a..603fc71d89 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -3332,7 +3332,7 @@ build_tree (MessageList *ml, #endif if (!saveuid && ml->cursor_uid && g_hash_table_lookup (ml->uid_nodemap, ml->cursor_uid)) { /* this makes sure a visible node is selected, like when - collapsing all nodes and a children had been selected + * collapsing all nodes and a children had been selected */ saveuid = g_strdup (ml->cursor_uid); } @@ -4125,7 +4125,7 @@ on_click (ETree *tree, CamelMessageInfo *info; gboolean folder_is_trash; const gchar *uid; - gint flag; + gint flag = 0; guint32 flags; if (col == COL_MESSAGE_STATUS) |