diff options
Diffstat (limited to 'mail')
-rw-r--r-- | mail/e-mail-backend.c | 66 | ||||
-rw-r--r-- | mail/e-mail-backend.h | 3 | ||||
-rw-r--r-- | mail/e-mail-reader.c | 6 | ||||
-rw-r--r-- | mail/e-mail-session.c | 103 | ||||
-rw-r--r-- | mail/e-mail-session.h | 3 | ||||
-rw-r--r-- | mail/e-mail-store.c | 44 | ||||
-rw-r--r-- | mail/e-mail-store.h | 3 | ||||
-rw-r--r-- | mail/em-folder-properties.c | 7 | ||||
-rw-r--r-- | mail/em-folder-tree-model.c | 26 | ||||
-rw-r--r-- | mail/em-folder-utils.c | 140 | ||||
-rw-r--r-- | mail/em-folder-utils.h | 7 | ||||
-rw-r--r-- | mail/em-utils.c | 56 | ||||
-rw-r--r-- | mail/em-utils.h | 6 | ||||
-rw-r--r-- | mail/mail-autofilter.c | 15 | ||||
-rw-r--r-- | mail/mail-autofilter.h | 5 | ||||
-rw-r--r-- | mail/mail-config.c | 32 | ||||
-rw-r--r-- | mail/mail-config.h | 7 | ||||
-rw-r--r-- | mail/mail-folder-cache.c | 21 | ||||
-rw-r--r-- | mail/mail-folder-cache.h | 5 | ||||
-rw-r--r-- | mail/mail-mt.c | 92 | ||||
-rw-r--r-- | mail/mail-mt.h | 1 | ||||
-rw-r--r-- | mail/mail-ops.c | 1 | ||||
-rw-r--r-- | mail/mail-send-recv.c | 10 | ||||
-rw-r--r-- | mail/mail-vfolder.c | 101 | ||||
-rw-r--r-- | mail/mail-vfolder.h | 6 |
25 files changed, 424 insertions, 342 deletions
diff --git a/mail/e-mail-backend.c b/mail/e-mail-backend.c index dd34737272..0ecae4856c 100644 --- a/mail/e-mail-backend.c +++ b/mail/e-mail-backend.c @@ -322,10 +322,7 @@ mail_backend_folder_deleted_cb (MailFolderCache *folder_cache, const gchar *uri, EMailBackend *backend) { - EMailSession *session; - - session = e_mail_backend_get_session (backend); - mail_filter_delete_uri (session, store, uri); + mail_filter_delete_uri (backend, store, uri); } static void @@ -335,10 +332,7 @@ mail_backend_folder_renamed_cb (MailFolderCache *folder_cache, const gchar *new_uri, EMailBackend *backend) { - EMailSession *session; - - session = e_mail_backend_get_session (backend); - mail_filter_rename_uri (session, store, old_uri, new_uri); + mail_filter_rename_uri (backend, store, old_uri, new_uri); } static void @@ -406,6 +400,8 @@ mail_backend_idle_cb (EMailBackend *backend) e_mail_store_init (session, data_dir); + vfolder_load_storage (backend); + return FALSE; } @@ -449,8 +445,8 @@ mail_backend_constructed (GObject *object) EMailBackendPrivate *priv; EShell *shell; EShellBackend *shell_backend; - MailFolderCache *folder_cache; EMFolderTreeModel *folder_tree_model; + MailFolderCache *folder_cache; priv = E_MAIL_BACKEND_GET_PRIVATE (object); @@ -463,6 +459,7 @@ mail_backend_constructed (GObject *object) camel_provider_init (); priv->session = e_mail_session_new (); + folder_cache = e_mail_session_get_folder_cache (priv->session); g_object_bind_property ( shell, "online", @@ -477,8 +474,6 @@ mail_backend_constructed (GObject *object) folder_tree_model = em_folder_tree_model_get_default (); em_folder_tree_model_set_session (folder_tree_model, priv->session); - folder_cache = mail_folder_cache_get_default (); - g_signal_connect ( shell, "prepare-for-offline", G_CALLBACK (mail_backend_prepare_for_offline_cb), @@ -513,7 +508,7 @@ mail_backend_constructed (GObject *object) folder_cache, "folder-changed", G_CALLBACK (mail_backend_folder_changed_cb), shell); - mail_config_init (CAMEL_SESSION (priv->session)); + mail_config_init (priv->session); mail_msg_init (); /* Defer initializing CamelStores until after the main loop @@ -591,3 +586,50 @@ e_mail_backend_empty_trash_policy_decision (EMailBackend *backend) return class->empty_trash_policy_decision (backend); } + +void +e_mail_backend_submit_alert (EMailBackend *backend, + const gchar *tag, + ...) +{ + EShell *shell; + EShellView *shell_view; + EShellBackend *shell_backend; + EShellContent *shell_content; + EShellWindow *shell_window = NULL; + EShellBackendClass *class; + GList *list, *iter; + va_list va; + + /* XXX This is meant to be a convenient but temporary hack. + * Instead, pass alerts directly to an EShellContent. + * Perhaps even take an EAlert** instead of a GError** + * in some low-level functions. */ + + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); + g_return_if_fail (tag != NULL); + + shell_backend = E_SHELL_BACKEND (backend); + shell = e_shell_backend_get_shell (shell_backend); + + /* Find the most recently used EShellWindow. */ + list = e_shell_get_watched_windows (shell); + for (iter = list; iter != NULL; iter = g_list_next (iter)) { + if (E_IS_SHELL_WINDOW (iter->data)) { + shell_window = E_SHELL_WINDOW (iter->data); + break; + } + } + + /* If we can't find an EShellWindow then... well, screw it. */ + if (shell_window == NULL) + return; + + class = E_SHELL_BACKEND_GET_CLASS (shell_backend); + shell_view = e_shell_window_get_shell_view (shell_window, class->name); + shell_content = e_shell_view_get_shell_content (shell_view); + + va_start (va, tag); + e_alert_submit_valist (GTK_WIDGET (shell_content), tag, va); + va_end (va); +} diff --git a/mail/e-mail-backend.h b/mail/e-mail-backend.h index 18fdf885ca..6d425197f3 100644 --- a/mail/e-mail-backend.h +++ b/mail/e-mail-backend.h @@ -75,6 +75,9 @@ gboolean e_mail_backend_delete_junk_policy_decision (EMailBackend *backend); gboolean e_mail_backend_empty_trash_policy_decision (EMailBackend *backend); +void e_mail_backend_submit_alert (EMailBackend *backend, + const gchar *tag, + ...) G_GNUC_NULL_TERMINATED; G_END_DECLS diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index 83dc3f569a..2b9c832315 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -1556,9 +1556,6 @@ action_search_folder_recipient_cb (GtkAction *action, if (curl->path != NULL && *curl->path != '\0') { CamelInternetAddress *inet_addr; - /* Ensure vfolder is running. */ - vfolder_load_storage (session); - inet_addr = camel_internet_address_new (); camel_address_decode (CAMEL_ADDRESS (inet_addr), curl->path); vfolder_gui_add_from_address ( @@ -1600,9 +1597,6 @@ action_search_folder_sender_cb (GtkAction *action, if (curl->path != NULL && *curl->path != '\0') { CamelInternetAddress *inet_addr; - /* Ensure vfolder is running. */ - vfolder_load_storage (session); - inet_addr = camel_internet_address_new (); camel_address_decode (CAMEL_ADDRESS (inet_addr), curl->path); vfolder_gui_add_from_address ( diff --git a/mail/e-mail-session.c b/mail/e-mail-session.c index 14213bf6e4..1d9b44f02a 100644 --- a/mail/e-mail-session.c +++ b/mail/e-mail-session.c @@ -57,7 +57,6 @@ #include "em-filter-rule.h" #include "em-utils.h" #include "mail-config.h" -#include "mail-folder-cache.h" #include "mail-mt.h" #include "mail-ops.h" #include "mail-send-recv.h" @@ -73,6 +72,8 @@ static guint session_gconf_proxy_id; typedef struct _AsyncContext AsyncContext; struct _EMailSessionPrivate { + MailFolderCache *folder_cache; + FILE *filter_logfile; GList *junk_plugins; }; @@ -86,6 +87,11 @@ struct _AsyncContext { CamelFolder *folder; }; +enum { + PROP_0, + PROP_FOLDER_CACHE +}; + static gchar *mail_data_dir; static gchar *mail_config_dir; @@ -187,31 +193,19 @@ user_message_exec (struct _user_message_msg *m) user_message_dialog, "allow_shrink", TRUE, "allow_grow", TRUE, NULL); - /* Use the number of dialog buttons as a heuristic for whether to - * emit a status bar message or present the dialog immediately, the - * thought being if there's more than one button then something is - * probably blocked until the user responds. */ - if (e_alert_dialog_count_buttons (user_message_dialog) > 1) { - if (m->ismain) { - gint response; - - response = gtk_dialog_run (user_message_dialog); - user_message_response ( - user_message_dialog, response, m); - } else { - g_signal_connect ( - user_message_dialog, "response", - G_CALLBACK (user_message_response), m); - gtk_widget_show (user_message_dialog); - } + /* XXX This is a case where we need to be able to construct + * custom EAlerts without a predefined XML definition. */ + if (m->ismain) { + gint response; + + response = gtk_dialog_run (user_message_dialog); + user_message_response ( + user_message_dialog, response, m); } else { g_signal_connect ( user_message_dialog, "response", - G_CALLBACK (user_message_response_free), m); - g_object_set_data ( - user_message_dialog, "response-handled", - GINT_TO_POINTER (TRUE)); - em_utils_show_error_silent (user_message_dialog); + G_CALLBACK (user_message_response), m); + gtk_widget_show (user_message_dialog); } } @@ -520,6 +514,40 @@ mail_session_check_junk_notify (GConfClient *gconf, } static void +mail_session_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_FOLDER_CACHE: + g_value_set_object ( + value, + e_mail_session_get_folder_cache ( + E_MAIL_SESSION (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +mail_session_dispose (GObject *object) +{ + EMailSessionPrivate *priv; + + priv = E_MAIL_SESSION_GET_PRIVATE (object); + + if (priv->folder_cache != NULL) { + g_object_unref (priv->folder_cache); + priv->folder_cache = NULL; + } + + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_mail_session_parent_class)->dispose (object); +} + +static void mail_session_finalize (GObject *object) { GConfClient *client; @@ -885,6 +913,8 @@ e_mail_session_class_init (EMailSessionClass *class) g_type_class_add_private (class, sizeof (EMailSessionPrivate)); object_class = G_OBJECT_CLASS (class); + object_class->get_property = mail_session_get_property; + object_class->dispose = mail_session_dispose; object_class->finalize = mail_session_finalize; session_class = CAMEL_SESSION_CLASS (class); @@ -897,6 +927,16 @@ e_mail_session_class_init (EMailSessionClass *class) session_class->thread_msg_free = mail_session_thread_msg_free; session_class->thread_status = mail_session_thread_status; session_class->forward_to = mail_session_forward_to; + + g_object_class_install_property ( + object_class, + PROP_FOLDER_CACHE, + g_param_spec_object ( + "folder-cache", + NULL, + NULL, + MAIL_TYPE_FOLDER_CACHE, + G_PARAM_READABLE)); } static void @@ -905,6 +945,7 @@ e_mail_session_init (EMailSession *session) GConfClient *client; session->priv = E_MAIL_SESSION_GET_PRIVATE (session); + session->priv->folder_cache = mail_folder_cache_new (); /* Initialize the EAccount setup. */ e_account_writable (NULL, E_ACCOUNT_SOURCE_SAVE_PASSWD); @@ -927,7 +968,7 @@ e_mail_session_init (EMailSession *session) session, NULL, NULL); CAMEL_SESSION (session)->junk_plugin = NULL; - mail_config_reload_junk_headers (CAMEL_SESSION (session)); + mail_config_reload_junk_headers (session); init_socks_proxy (CAMEL_SESSION (session)); @@ -940,6 +981,14 @@ e_mail_session_new (void) return g_object_new (E_TYPE_MAIL_SESSION, NULL); } +MailFolderCache * +e_mail_session_get_folder_cache (EMailSession *session) +{ + g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL); + + return session->priv->folder_cache; +} + static void mail_session_get_inbox_thread (GSimpleAsyncResult *simple, EMailSession *session, @@ -1236,10 +1285,10 @@ e_mail_session_uri_to_folder_sync (EMailSession *session, } if (folder != NULL) { - MailFolderCache *cache; + MailFolderCache *folder_cache; - cache = mail_folder_cache_get_default (); - mail_folder_cache_note_folder (cache, folder); + folder_cache = e_mail_session_get_folder_cache (session); + mail_folder_cache_note_folder (folder_cache, folder); } camel_url_free (url); diff --git a/mail/e-mail-session.h b/mail/e-mail-session.h index 71a5d73eb4..f9cab970cc 100644 --- a/mail/e-mail-session.h +++ b/mail/e-mail-session.h @@ -26,6 +26,7 @@ #define E_MAIL_SESSION_H #include <camel/camel.h> +#include <mail/mail-folder-cache.h> /* Standard GObject macros */ #define E_TYPE_MAIL_SESSION \ @@ -63,6 +64,8 @@ struct _EMailSessionClass { GType e_mail_session_get_type (void); EMailSession * e_mail_session_new (void); +MailFolderCache * + e_mail_session_get_folder_cache (EMailSession *session); CamelFolder * e_mail_session_get_inbox_sync (EMailSession *session, const gchar *service_uri, GCancellable *cancellable, diff --git a/mail/e-mail-store.c b/mail/e-mail-store.c index ef997d2fe2..b23e6f2121 100644 --- a/mail/e-mail-store.c +++ b/mail/e-mail-store.c @@ -35,7 +35,8 @@ typedef struct _StoreInfo StoreInfo; -typedef void (*AddStoreCallback) (CamelStore *store, +typedef void (*AddStoreCallback) (MailFolderCache *folder_cache, + CamelStore *store, CamelFolderInfo *info, StoreInfo *store_info); @@ -132,25 +133,25 @@ store_table_free (StoreInfo *store_info) } static gboolean -mail_store_note_store_cb (CamelStore *store, +mail_store_note_store_cb (MailFolderCache *folder_cache, + CamelStore *store, CamelFolderInfo *info, gpointer user_data) { StoreInfo *store_info = user_data; if (store_info->callback != NULL) - store_info->callback (store, info, store_info); + store_info->callback ( + folder_cache, store, info, store_info); if (!store_info->removed) { /* This keeps message counters up-to-date. */ if (store_info->vtrash != NULL) mail_folder_cache_note_folder ( - mail_folder_cache_get_default (), - store_info->vtrash); + folder_cache, store_info->vtrash); if (store_info->vjunk != NULL) mail_folder_cache_note_folder ( - mail_folder_cache_get_default (), - store_info->vjunk); + folder_cache, store_info->vjunk); } store_info_unref (store_info); @@ -165,11 +166,13 @@ mail_store_add (EMailSession *session, AddStoreCallback callback) { EMFolderTreeModel *default_model; + MailFolderCache *folder_cache; StoreInfo *store_info; g_return_if_fail (store_table != NULL); default_model = em_folder_tree_model_get_default (); + folder_cache = e_mail_session_get_folder_cache (session); store_info = store_info_new (store, display_name); store_info->callback = callback; @@ -180,14 +183,13 @@ mail_store_add (EMailSession *session, default_model, store, store_info->display_name); mail_folder_cache_note_store ( - mail_folder_cache_get_default (), - CAMEL_SESSION (session), store, NULL, - mail_store_note_store_cb, - store_info_ref (store_info)); + folder_cache, CAMEL_SESSION (session), store, NULL, + mail_store_note_store_cb, store_info_ref (store_info)); } static void -mail_store_add_local_done_cb (CamelStore *store, +mail_store_add_local_done_cb (MailFolderCache *folder_cache, + CamelStore *store, CamelFolderInfo *info, StoreInfo *store_info) { @@ -196,9 +198,9 @@ mail_store_add_local_done_cb (CamelStore *store, for (ii = 0; ii < E_MAIL_NUM_LOCAL_FOLDERS; ii++) { folder = e_mail_local_get_folder (ii); - if (folder != NULL) - mail_folder_cache_note_folder ( - mail_folder_cache_get_default (), folder); + if (folder == NULL) + continue; + mail_folder_cache_note_folder (folder_cache, folder); } } @@ -337,10 +339,13 @@ fail: } void -e_mail_store_remove (CamelStore *store) +e_mail_store_remove (EMailSession *session, + CamelStore *store) { + MailFolderCache *folder_cache; EMFolderTreeModel *default_model; + g_return_if_fail (E_IS_MAIL_SESSION (session)); g_return_if_fail (CAMEL_IS_STORE (store)); g_return_if_fail (store_table != NULL); @@ -355,8 +360,9 @@ e_mail_store_remove (CamelStore *store) g_object_ref (store); g_hash_table_remove (store_table, store); - mail_folder_cache_note_store_remove ( - mail_folder_cache_get_default (), store); + + folder_cache = e_mail_session_get_folder_cache (session); + mail_folder_cache_note_store_remove (folder_cache, store); default_model = em_folder_tree_model_get_default (); em_folder_tree_model_remove_store (default_model, store); @@ -389,7 +395,7 @@ e_mail_store_remove_by_uri (EMailSession *session, if (service == NULL) return; - e_mail_store_remove (CAMEL_STORE (service)); + e_mail_store_remove (session, CAMEL_STORE (service)); g_object_unref (service); } diff --git a/mail/e-mail-store.h b/mail/e-mail-store.h index 8def4b8e73..b120d14aef 100644 --- a/mail/e-mail-store.h +++ b/mail/e-mail-store.h @@ -36,7 +36,8 @@ void e_mail_store_add (EMailSession *session, CamelStore * e_mail_store_add_by_uri (EMailSession *session, const gchar *uri, const gchar *display_name); -void e_mail_store_remove (CamelStore *store); +void e_mail_store_remove (EMailSession *session, + CamelStore *store); void e_mail_store_remove_by_uri (EMailSession *session, const gchar *uri); void e_mail_store_foreach (GHFunc func, diff --git a/mail/em-folder-properties.c b/mail/em-folder-properties.c index 525a7ffefa..d802aeb885 100644 --- a/mail/em-folder-properties.c +++ b/mail/em-folder-properties.c @@ -349,13 +349,16 @@ em_folder_properties_show (EShellView *shell_view, const gchar *uri) { EShellBackend *shell_backend; + EMailBackend *backend; EMailSession *session; g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); g_return_if_fail (uri != NULL); shell_backend = e_shell_view_get_shell_backend (shell_view); - session = e_mail_backend_get_session (E_MAIL_BACKEND (shell_backend)); + + backend = E_MAIL_BACKEND (shell_backend); + session = e_mail_backend_get_session (backend); /* HACK: its the old behaviour, not very 'neat' but it works */ if (!strncmp (uri, "vfolder:", 8)) { @@ -367,7 +370,7 @@ em_folder_properties_show (EShellView *shell_view, || strcmp (url->fragment, CAMEL_UNMATCHED_NAME) != 0) { if (url) camel_url_free (url); - vfolder_edit_rule (uri); + vfolder_edit_rule (backend, uri); return; } if (url != NULL) diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c index 5b22bd0f9d..9da5711cf0 100644 --- a/mail/em-folder-tree-model.c +++ b/mail/em-folder-tree-model.c @@ -556,11 +556,6 @@ folder_tree_model_init (EMFolderTreeModel *model) model->priv->account_added_id = g_signal_connect ( model->priv->accounts, "account-added", G_CALLBACK (account_added_cb), model); - - g_signal_connect_swapped ( - mail_folder_cache_get_default (), - "folder-unread-updated", - G_CALLBACK (folder_tree_model_set_unread_count), model); } GType @@ -665,6 +660,20 @@ em_folder_tree_model_set_session (EMFolderTreeModel *model, model->priv->session = session; + /* FIXME Technically we should be disconnecting this signal + * when replacing an old session with a new session, + * but at present this function is only called once. */ + if (session != NULL) { + MailFolderCache *folder_cache; + + folder_cache = e_mail_session_get_folder_cache (session); + + 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"); } @@ -677,6 +686,8 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, { GtkTreeRowReference *uri_row, *path_row; GtkTreeStore *tree_store; + MailFolderCache *folder_cache; + EMailSession *session; guint unread; GtkTreePath *path; GtkTreeIter sub; @@ -696,6 +707,9 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, tree_store = GTK_TREE_STORE (model); + session = em_folder_tree_model_get_session (model); + folder_cache = e_mail_session_get_folder_cache (session); + if (!fully_loaded) load = (fi->child == NULL) && !(fi->flags & (CAMEL_FOLDER_NOCHILDREN | CAMEL_FOLDER_NOINFERIORS)); @@ -717,7 +731,7 @@ em_folder_tree_model_set_folder_info (EMFolderTreeModel *model, * be functionised. */ unread = fi->unread; if (mail_folder_cache_get_folder_from_uri ( - mail_folder_cache_get_default (), fi->uri, &folder) && folder) { + folder_cache, fi->uri, &folder) && folder) { is_drafts = em_utils_folder_is_drafts (folder, fi->uri); if (is_drafts || em_utils_folder_is_outbox (folder, fi->uri)) { diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c index e966f2b0cc..cae91af14f 100644 --- a/mail/em-folder-utils.c +++ b/mail/em-folder-utils.c @@ -281,10 +281,11 @@ struct _copy_folder_data { }; static void -emfu_copy_folder_selected (EMailSession *session, +emfu_copy_folder_selected (EMailBackend *backend, const gchar *uri, gpointer data) { + EMailSession *session; struct _copy_folder_data *cfd = data; CamelStore *fromstore = NULL, *tostore = NULL; CamelStore *local_store; @@ -298,36 +299,34 @@ emfu_copy_folder_selected (EMailSession *session, } local_store = e_mail_local_get_store (); + session = e_mail_backend_get_session (backend); fromstore = camel_session_get_store ( CAMEL_SESSION (session), cfd->fi->uri, &local_error); if (fromstore == NULL) { - e_alert_run_dialog_for_args ( - e_shell_get_active_window (NULL), - cfd->delete ? "mail:no-move-folder-notexist" : - "mail:no-copy-folder-notexist", + e_mail_backend_submit_alert ( + backend, cfd->delete ? + "mail:no-move-folder-notexist" : + "mail:no-copy-folder-notexist", cfd->fi->full_name, uri, local_error->message, NULL); goto fail; } if (cfd->delete && fromstore == local_store && emfu_is_special_local_folder (cfd->fi->full_name)) { - GtkWidget *w; - - w = e_alert_dialog_new_for_args ( - e_shell_get_active_window (NULL), "mail:no-rename-special-folder", + e_mail_backend_submit_alert ( + backend, "mail:no-rename-special-folder", cfd->fi->full_name, NULL); - em_utils_show_error_silent (w); goto fail; } tostore = camel_session_get_store ( CAMEL_SESSION (session), uri, &local_error); if (tostore == NULL) { - e_alert_run_dialog_for_args ( - e_shell_get_active_window (NULL), - cfd->delete ? "mail:no-move-folder-to-notexist" : - "mail:no-copy-folder-to-notexist", + e_mail_backend_submit_alert ( + backend, cfd->delete ? + "mail:no-move-folder-to-notexist" : + "mail:no-copy-folder-to-notexist", cfd->fi->full_name, uri, local_error->message, NULL); goto fail; @@ -341,7 +340,8 @@ emfu_copy_folder_selected (EMailSession *session, if (tobase == NULL) tobase = ""; - em_folder_utils_copy_folders (fromstore, cfd->fi->full_name, tostore, tobase, cfd->delete); + em_folder_utils_copy_folders ( + fromstore, cfd->fi->full_name, tostore, tobase, cfd->delete); camel_url_free (url); fail: @@ -389,18 +389,22 @@ emfu_copy_folder_exclude (EMFolderTree *tree, GtkTreeModel *model, GtkTreeIter * /* FIXME: these functions must be documented */ void em_folder_utils_copy_folder (GtkWindow *parent, - EMailSession *session, + EMailBackend *backend, CamelFolderInfo *folderinfo, gint delete) { GtkWidget *dialog; EMFolderTree *emft; + EMailSession *session; const gchar *label; const gchar *title; struct _copy_folder_data *cfd; + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); g_return_if_fail (folderinfo != NULL); + session = e_mail_backend_get_session (backend); + cfd = g_malloc (sizeof (*cfd)); cfd->fi = folderinfo; cfd->delete = delete; @@ -425,94 +429,113 @@ em_folder_utils_copy_folder (GtkWindow *parent, uri = em_folder_selector_get_selected_uri ( EM_FOLDER_SELECTOR (dialog)); - emfu_copy_folder_selected (session, uri, cfd); + emfu_copy_folder_selected (backend, uri, cfd); } gtk_widget_destroy (dialog); } +typedef struct { + EMailBackend *backend; + GtkWidget *dialog; +} DeleteFolderData; + static void -emfu_delete_done (CamelFolder *folder, gboolean removed, GError **error, gpointer data) +emfu_delete_done (CamelFolder *folder, + gboolean removed, + GError **error, + gpointer user_data) { - GtkWidget *dialog = data; + DeleteFolderData *data = user_data; if (error != NULL && *error != NULL) { - GtkWidget *w; - - w = e_alert_dialog_new_for_args ( - e_shell_get_active_window (NULL), + e_mail_backend_submit_alert ( + data->backend, "mail:no-delete-folder", camel_folder_get_full_name (folder), (*error)->message, NULL); - em_utils_show_error_silent (w); g_clear_error (error); } - if (dialog) - gtk_widget_destroy (dialog); -} - -static void -emfu_delete_response (GtkWidget *dialog, gint response, gpointer data) -{ - if (response == GTK_RESPONSE_OK) { - /* disable dialog until operation finishes */ - gtk_widget_set_sensitive (dialog, FALSE); - - mail_remove_folder (g_object_get_data ((GObject *) dialog, "folder"), emfu_delete_done, dialog); - } else { - gtk_widget_destroy (dialog); - } + g_object_unref (data->backend); + gtk_widget_destroy (data->dialog); + g_slice_free (DeleteFolderData, data); } /* FIXME: these functions must be documented */ void -em_folder_utils_delete_folder (CamelFolder *folder) +em_folder_utils_delete_folder (EMailBackend *backend, + CamelFolder *folder) { CamelStore *local_store; CamelStore *parent_store; + EMailSession *session; + MailFolderCache *folder_cache; GtkWindow *parent = e_shell_get_active_window (NULL); GtkWidget *dialog; const gchar *full_name; gint flags = 0; + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); + g_return_if_fail (CAMEL_IS_FOLDER (folder)); + full_name = camel_folder_get_full_name (folder); parent_store = camel_folder_get_parent_store (folder); local_store = e_mail_local_get_store (); + session = e_mail_backend_get_session (backend); + folder_cache = e_mail_session_get_folder_cache (session); if (parent_store == local_store && emfu_is_special_local_folder (full_name)) { - dialog = e_alert_dialog_new_for_args ( - parent, "mail:no-delete-special-folder", + e_mail_backend_submit_alert ( + backend, "mail:no-delete-special-folder", full_name, NULL); - em_utils_show_error_silent (dialog); return; } - if (mail_folder_cache_get_folder_info_flags (mail_folder_cache_get_default (), folder, &flags) && (flags & CAMEL_FOLDER_SYSTEM)) - { - e_alert_run_dialog_for_args ( - parent,"mail:no-delete-special-folder", + if (mail_folder_cache_get_folder_info_flags (folder_cache, folder, &flags) && (flags & CAMEL_FOLDER_SYSTEM)) { + e_mail_backend_submit_alert ( + backend, "mail:no-delete-special-folder", camel_folder_get_name (folder), NULL); return; } g_object_ref (folder); - if (mail_folder_cache_get_folder_info_flags (mail_folder_cache_get_default (), folder, &flags) && (flags & CAMEL_FOLDER_CHILDREN)) { - dialog = e_alert_dialog_new_for_args (parent, - (parent_store && CAMEL_IS_VEE_STORE(parent_store))?"mail:ask-delete-vfolder":"mail:ask-delete-folder", - full_name, NULL); + if (mail_folder_cache_get_folder_info_flags (folder_cache, folder, &flags) && (flags & CAMEL_FOLDER_CHILDREN)) { + if (parent_store && CAMEL_IS_VEE_STORE (parent_store)) + dialog = e_alert_dialog_new_for_args ( + parent, "mail:ask-delete-vfolder", + full_name, NULL); + else + dialog = e_alert_dialog_new_for_args ( + parent, "mail:ask-delete-folder", + full_name, NULL); } else { - dialog = e_alert_dialog_new_for_args (parent, - (parent_store && CAMEL_IS_VEE_STORE(parent_store))?"mail:ask-delete-vfolder-nochild":"mail:ask-delete-folder-nochild", - full_name, NULL); + if (parent_store && CAMEL_IS_VEE_STORE (parent_store)) + dialog = e_alert_dialog_new_for_args ( + parent, "mail:ask-delete-vfolder-nochild", + full_name, NULL); + else + dialog = e_alert_dialog_new_for_args ( + parent, "mail:ask-delete-folder-nochild", + full_name, NULL); } - g_object_set_data_full ((GObject *) dialog, "folder", folder, g_object_unref); - g_signal_connect (dialog, "response", G_CALLBACK (emfu_delete_response), NULL); - gtk_widget_show (dialog); + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { + DeleteFolderData *data; + + /* disable dialog until operation finishes */ + gtk_widget_set_sensitive (dialog, FALSE); + + data = g_slice_new0 (DeleteFolderData); + data->backend = g_object_ref (backend); + data->dialog = dialog; + + mail_remove_folder (folder, emfu_delete_done, data); + } else + gtk_widget_destroy (dialog); } struct _EMCreateFolder { @@ -681,9 +704,6 @@ emfu_popup_new_folder_response (EMFolderSelector *emfs, if (CAMEL_IS_VEE_STORE (store)) { EFilterRule *rule; - /* ensures vfolder is running */ - vfolder_load_storage (session); - rule = em_vfolder_rule_new (session); e_filter_rule_set_name (rule, path); vfolder_gui_add_rule (EM_VFOLDER_RULE (rule)); diff --git a/mail/em-folder-utils.h b/mail/em-folder-utils.h index a6a2a21da0..f67ef50531 100644 --- a/mail/em-folder-utils.h +++ b/mail/em-folder-utils.h @@ -26,7 +26,7 @@ #include <gtk/gtk.h> #include <camel/camel.h> -#include <mail/e-mail-session.h> +#include <mail/e-mail-backend.h> #include <mail/em-folder-tree.h> G_BEGIN_DECLS @@ -41,10 +41,11 @@ gint em_folder_utils_copy_folders (CamelStore *fromstore, * most rely on the wrong data. */ void em_folder_utils_copy_folder (GtkWindow *parent, - EMailSession *session, + EMailBackend *backend, CamelFolderInfo *folderinfo, gboolean delete); -void em_folder_utils_delete_folder (CamelFolder *folder); +void em_folder_utils_delete_folder (EMailBackend *backend, + CamelFolder *folder); void em_folder_utils_create_folder (CamelFolderInfo *folderinfo, EMFolderTree *emft, GtkWindow *parent); diff --git a/mail/em-utils.c b/mail/em-utils.c index 9f1f82ec50..dab327a20e 100644 --- a/mail/em-utils.c +++ b/mail/em-utils.c @@ -64,7 +64,6 @@ #include "e-util/e-mktemp.h" #include "e-util/e-account-utils.h" #include "e-util/e-dialog-utils.h" -#include "e-util/e-alert-activity.h" #include "e-util/e-alert-dialog.h" #include "shell/e-shell.h" #include "widgets/misc/e-attachment.h" @@ -265,7 +264,7 @@ static EMFilterSource em_filter_source_element_names[] = { /** * em_utils_edit_filters: * @parent: parent window - * @session: an #EMailSession + * @backend: an #EMailBAckend * * Opens or raises the filters editor dialog so that the user may edit * his/her filters. If @parent is non-NULL, then the dialog will be @@ -273,13 +272,14 @@ static EMFilterSource em_filter_source_element_names[] = { **/ void em_utils_edit_filters (GtkWidget *parent, - EMailSession *session) + EMailBackend *backend) { const gchar *config_dir; gchar *user, *system; EMFilterContext *fc; + EMailSession *session; - g_return_if_fail (E_IS_MAIL_SESSION (session)); + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); if (filter_editor) { gtk_window_present (GTK_WINDOW (filter_editor)); @@ -287,6 +287,7 @@ em_utils_edit_filters (GtkWidget *parent, } config_dir = mail_session_get_config_dir (); + session = e_mail_backend_get_session (backend); fc = em_filter_context_new (session); user = g_build_filename (config_dir, "filters.xml", NULL); @@ -296,8 +297,9 @@ em_utils_edit_filters (GtkWidget *parent, g_free (system); if (((ERuleContext *) fc)->error) { - GtkWidget *w = e_alert_dialog_new_for_args ((GtkWindow *)parent, "mail:filter-load-error", ((ERuleContext *)fc)->error, NULL); - em_utils_show_error_silent (w); + e_mail_backend_submit_alert ( + backend, "mail:filter-load-error", + ((ERuleContext *)fc)->error, NULL); return; } @@ -2025,48 +2027,6 @@ em_utils_clear_get_password_canceled_accounts_flag (void) } } -void -em_utils_show_error_silent (GtkWidget *widget) -{ - EShell *shell; - EShellBackend *shell_backend; - EActivity *activity; - - shell = e_shell_get_default (); - shell_backend = e_shell_get_backend_by_name ( - shell, shell_builtin_backend); - - activity = e_alert_activity_new_warning (widget); - e_shell_backend_add_activity (shell_backend, activity); - g_object_unref (activity); - - if (g_object_get_data (G_OBJECT (widget), "response-handled") == NULL) - g_signal_connect ( - widget, "response", - G_CALLBACK (gtk_widget_destroy), NULL); -} - -void -em_utils_show_info_silent (GtkWidget *widget) -{ - EShell *shell; - EShellBackend *shell_backend; - EActivity *activity; - - shell = e_shell_get_default (); - shell_backend = e_shell_get_backend_by_name ( - shell, shell_builtin_backend); - - activity = e_alert_activity_new_info (widget); - e_shell_backend_add_activity (shell_backend, activity); - g_object_unref (activity); - - if (g_object_get_data (G_OBJECT (widget), "response-handled") == NULL) - g_signal_connect ( - widget, "response", - G_CALLBACK (gtk_widget_destroy), NULL); -} - gchar * em_utils_url_unescape_amp (const gchar *url) { diff --git a/mail/em-utils.h b/mail/em-utils.h index 684d43c0e1..2229d26653 100644 --- a/mail/em-utils.h +++ b/mail/em-utils.h @@ -43,7 +43,7 @@ void em_utils_uids_free (GPtrArray *uids); gboolean em_utils_check_user_can_send_mail (void); -void em_utils_edit_filters (GtkWidget *parent, EMailSession *session); +void em_utils_edit_filters (GtkWidget *parent, EMailBackend *backend); void em_filename_make_safe (gchar *string); void em_utils_edit_vfolders (GtkWidget *parent); @@ -82,10 +82,6 @@ gchar *em_utils_folder_name_from_uri (const gchar *uri); gchar *em_uri_from_camel (const gchar *curi); gchar *em_uri_to_camel (const gchar *euri); -/* Run errors silently on the status bar */ -void em_utils_show_error_silent (GtkWidget *widget); -void em_utils_show_info_silent (GtkWidget *widget); - /* is this address in the addressbook? caches results */ gboolean em_utils_in_addressbook (CamelInternetAddress *addr, gboolean local_only); CamelMimePart *em_utils_contact_photo (CamelInternetAddress *addr, gboolean local); diff --git a/mail/mail-autofilter.c b/mail/mail-autofilter.c index 566369a3b5..aac7deb49a 100644 --- a/mail/mail-autofilter.c +++ b/mail/mail-autofilter.c @@ -385,12 +385,13 @@ filter_gui_add_from_message (EMailSession *session, } void -mail_filter_rename_uri (EMailSession *session, +mail_filter_rename_uri (EMailBackend *backend, CamelStore *store, const gchar *olduri, const gchar *newuri) { EMFilterContext *fc; + EMailSession *session; const gchar *config_dir; gchar *user, *system; GList *changed; @@ -399,6 +400,8 @@ mail_filter_rename_uri (EMailSession *session, eolduri = em_uri_from_camel (olduri); enewuri = em_uri_from_camel (newuri); + session = e_mail_backend_get_session (backend); + fc = em_filter_context_new (session); config_dir = mail_session_get_config_dir (); user = g_build_filename (config_dir, "filters.xml", NULL); @@ -422,11 +425,12 @@ mail_filter_rename_uri (EMailSession *session, } void -mail_filter_delete_uri (EMailSession *session, +mail_filter_delete_uri (EMailBackend *backend, CamelStore *store, const gchar *uri) { EMFilterContext *fc; + EMailSession *session; const gchar *config_dir; gchar *user, *system; GList *deleted; @@ -434,6 +438,8 @@ mail_filter_delete_uri (EMailSession *session, euri = em_uri_from_camel (uri); + session = e_mail_backend_get_session (backend); + fc = em_filter_context_new (session); config_dir = mail_session_get_config_dir (); user = g_build_filename (config_dir, "filters.xml", NULL); @@ -443,7 +449,6 @@ mail_filter_delete_uri (EMailSession *session, deleted = e_rule_context_delete_uri ((ERuleContext *) fc, euri, g_str_equal); if (deleted) { - GtkWidget *dialog; GString *s; guint s_count; gchar *info; @@ -477,8 +482,8 @@ mail_filter_delete_uri (EMailSession *session, "The following filter rules\n%s have been modified " "to account for the deleted folder\n\"%s\".", s_count), s->str, euri); - dialog = e_alert_dialog_new_for_args (e_shell_get_active_window (NULL), "mail:filter-updated", info, NULL); - em_utils_show_info_silent (dialog); + e_mail_backend_submit_alert ( + backend, "mail:filter-updated", info, NULL); g_string_free (s, TRUE); g_free (info); diff --git a/mail/mail-autofilter.h b/mail/mail-autofilter.h index 35e5c3aac1..7967023b20 100644 --- a/mail/mail-autofilter.h +++ b/mail/mail-autofilter.h @@ -27,6 +27,7 @@ #include <camel/camel.h> #include <filter/e-filter-rule.h> +#include <mail/e-mail-backend.h> #include <mail/em-filter-context.h> #include <mail/em-vfolder-context.h> @@ -57,11 +58,11 @@ void filter_gui_add_from_message (EMailSession *session, /* Also easiest place for these, we should really * share a global rule context for this stuff ... */ -void mail_filter_rename_uri (EMailSession *session, +void mail_filter_rename_uri (EMailBackend *backend, CamelStore *store, const gchar *olduri, const gchar *newuri); -void mail_filter_delete_uri (EMailSession *session, +void mail_filter_delete_uri (EMailBackend *backend, CamelStore *store, const gchar *uri); diff --git a/mail/mail-config.c b/mail/mail-config.c index fae6bda204..5bd85ac23d 100644 --- a/mail/mail-config.c +++ b/mail/mail-config.c @@ -38,7 +38,6 @@ #include <gconf/gconf-client.h> #include "e-mail-local.h" -#include "e-mail-session.h" #include "mail-config.h" #include "mail-folder-cache.h" #include "mail-tools.h" @@ -150,7 +149,7 @@ static void gconf_jh_headers_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry, - CamelSession *session) + EMailSession *session) { GSList *node; GPtrArray *name, *value; @@ -171,7 +170,8 @@ gconf_jh_headers_changed (GConfClient *client, g_strfreev (tok); } camel_session_set_junk_headers ( - session, (const gchar **) name->pdata, + CAMEL_SESSION (session), + (const gchar **) name->pdata, (const gchar **) value->pdata, name->len); g_ptr_array_foreach (name, (GFunc) g_free, NULL); @@ -184,12 +184,13 @@ static void gconf_jh_check_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry, - CamelSession *session) + EMailSession *session) { config->jh_check = gconf_client_get_bool ( config->gconf, "/apps/evolution/mail/junk/check_custom_header", NULL); if (!config->jh_check) { - camel_session_set_junk_headers (session, NULL, NULL, 0); + camel_session_set_junk_headers ( + CAMEL_SESSION (session), NULL, NULL, 0); } else { gconf_jh_headers_changed (NULL, 0, NULL, session); } @@ -539,9 +540,9 @@ mail_config_folder_to_cachename (CamelFolder *folder, const gchar *prefix) } void -mail_config_reload_junk_headers (CamelSession *session) +mail_config_reload_junk_headers (EMailSession *session) { - g_return_if_fail (CAMEL_IS_SESSION (session)); + g_return_if_fail (E_IS_MAIL_SESSION (session)); /* It automatically sets in the session */ if (config == NULL) @@ -582,12 +583,13 @@ folder_renamed_cb (MailFolderCache *cache, CamelStore *store, const gchar *oldur /* Config struct routines */ void -mail_config_init (CamelSession *session) +mail_config_init (EMailSession *session) { GConfClientNotifyFunc func; + MailFolderCache *folder_cache; const gchar *key; - g_return_if_fail (CAMEL_IS_SESSION (session)); + g_return_if_fail (E_IS_MAIL_SESSION (session)); if (config) return; @@ -708,8 +710,12 @@ mail_config_init (CamelSession *session) gconf_jh_check_changed (config->gconf, 0, NULL, session); - g_signal_connect (mail_folder_cache_get_default (), "folder-deleted", - (GCallback) folder_deleted_cb, NULL); - g_signal_connect (mail_folder_cache_get_default (), "folder-renamed", - (GCallback) folder_renamed_cb, NULL); + folder_cache = e_mail_session_get_folder_cache (session); + + g_signal_connect ( + folder_cache, "folder-deleted", + (GCallback) folder_deleted_cb, NULL); + g_signal_connect ( + folder_cache, "folder-renamed", + (GCallback) folder_renamed_cb, NULL); } diff --git a/mail/mail-config.h b/mail/mail-config.h index 7fbdaeeda9..8bd87c56b4 100644 --- a/mail/mail-config.h +++ b/mail/mail-config.h @@ -24,13 +24,14 @@ #define MAIL_CONFIG_H #include <gtk/gtk.h> -#include <camel/camel.h> #include <libedataserver/e-account.h> #include <libedataserver/e-account-list.h> #include <e-util/e-signature.h> #include <e-util/e-signature-list.h> +#include <mail/e-mail-session.h> + G_BEGIN_DECLS typedef enum { @@ -62,7 +63,7 @@ typedef enum { GType evolution_mail_config_get_type (void); /* Configuration */ -void mail_config_init (CamelSession *session); +void mail_config_init (EMailSession *session); void mail_config_write (void); GConfClient * mail_config_get_gconf_client (void); @@ -89,7 +90,7 @@ gchar * mail_config_folder_to_cachename (CamelFolder *folder, const gchar *prefix); gint mail_config_get_sync_timeout (void); -void mail_config_reload_junk_headers (CamelSession *session); +void mail_config_reload_junk_headers (EMailSession *session); gboolean mail_config_get_lookup_book (void); gboolean mail_config_get_lookup_book_local_only (void); diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c index 7ff29c3414..0cbcea511a 100644 --- a/mail/mail-folder-cache.c +++ b/mail/mail-folder-cache.c @@ -730,7 +730,7 @@ struct _update_data { gint id; /* id for cancellation */ guint cancel:1; /* also tells us we're cancelled */ - gboolean (*done)(CamelStore *store, CamelFolderInfo *info, gpointer data); + NoteDoneFunc done; gpointer data; MailFolderCache *cache; }; @@ -770,7 +770,7 @@ update_folders (CamelStore *store, CamelFolderInfo *fi, gpointer data) g_mutex_unlock (ud->cache->priv->stores_mutex); if (ud->done) - res = ud->done (store, fi, ud->data); + res = ud->done (ud->cache, store, fi, ud->data); g_free (ud); return res; @@ -1065,23 +1065,10 @@ mail_folder_cache_init (MailFolderCache *self) timeout, (GSourceFunc) ping_cb, self); } -static MailFolderCache *default_cache = NULL; -G_LOCK_DEFINE_STATIC (default_cache); - -/** - * mail_folder_cache_get_default: - * - * Get the default folder cache object - */ MailFolderCache * -mail_folder_cache_get_default (void) +mail_folder_cache_new (void) { - G_LOCK (default_cache); - if (!default_cache) - default_cache = g_object_new (MAIL_TYPE_FOLDER_CACHE, NULL); - G_UNLOCK (default_cache); - - return default_cache; + return g_object_new (MAIL_TYPE_FOLDER_CACHE, NULL); } /** diff --git a/mail/mail-folder-cache.h b/mail/mail-folder-cache.h index 170592390d..f89d2d9aed 100644 --- a/mail/mail-folder-cache.h +++ b/mail/mail-folder-cache.h @@ -59,7 +59,8 @@ typedef struct _MailFolderCachePrivate MailFolderCachePrivate; * The signature of a function to be registered as a callback for * mail_folder_cache_note_store() */ -typedef gboolean (*NoteDoneFunc) (CamelStore *store, +typedef gboolean (*NoteDoneFunc) (MailFolderCache *cache, + CamelStore *store, CamelFolderInfo *info, gpointer data); @@ -80,7 +81,7 @@ struct _MailFolderCacheClass { GType mail_folder_cache_get_type (void) G_GNUC_CONST; MailFolderCache * - mail_folder_cache_get_default (void); + mail_folder_cache_new (void); void mail_folder_cache_note_store (MailFolderCache *self, CamelSession *session, CamelStore *store, diff --git a/mail/mail-mt.c b/mail/mail-mt.c index 9cac82841d..907d57938a 100644 --- a/mail/mail-mt.c +++ b/mail/mail-mt.c @@ -27,9 +27,7 @@ #include <libedataserver/e-flag.h> -#include "shell/e-shell.h" -#include "e-util/e-alert-activity.h" -#include "e-util/e-alert-dialog.h" +#include <shell/e-shell-view.h> #include "mail-mt.h" @@ -43,8 +41,6 @@ const gchar *shell_builtin_backend = "mail"; /* background operation status stuff */ struct _MailMsgPrivate { EActivity *activity; - GtkWidget *error; - gboolean cancelable; }; static guint mail_msg_seq; /* sequence number of each message */ @@ -91,7 +87,6 @@ mail_msg_new (MailMsgInfo *info) msg->priv = g_slice_new0 (MailMsgPrivate); msg->priv->activity = e_activity_new (); - msg->priv->cancelable = TRUE; e_activity_set_percent (msg->priv->activity, 0.0); @@ -161,16 +156,6 @@ mail_msg_free (MailMsg *mail_msg) if (mail_msg->error != NULL) g_error_free (mail_msg->error); - if (mail_msg->priv->error != NULL) { - EActivity *activity; - GtkWidget *widget; - - widget = mail_msg->priv->error; - activity = e_alert_activity_new_warning (widget); - e_shell_backend_add_activity (shell_backend, activity); - g_object_unref (activity); - } - g_slice_free (MailMsgPrivate, mail_msg->priv); g_slice_free1 (mail_msg->info->size, mail_msg); @@ -224,28 +209,16 @@ mail_msg_unref (gpointer msg) g_idle_add ((GSourceFunc) mail_msg_free, mail_msg); } -/* hash table of ops->dialogue of active errors */ -static GHashTable *active_errors = NULL; - -static void -error_finalized (gpointer data, GObject *gone_gd) -{ - g_hash_table_remove (active_errors, data); -} - -static void -error_response (GtkWidget *dialog, gint button, gpointer data) -{ - gtk_widget_destroy (dialog); -} - void mail_msg_check_error (gpointer msg) { - GtkWindow *parent; + EShell *shell; + EShellView *shell_view; + EShellWindow *shell_window = NULL; + EShellContent *shell_content; MailMsg *m = msg; gchar *what; - GtkDialog *gd; + GList *list, *iter; #ifdef MALLOC_CHECK checkmem (m); @@ -258,40 +231,37 @@ mail_msg_check_error (gpointer msg) || g_error_matches (m->error, CAMEL_FOLDER_ERROR, CAMEL_FOLDER_ERROR_INVALID_UID)) return; - if (active_errors == NULL) - active_errors = g_hash_table_new (NULL, NULL); + shell = e_shell_get_default (); - /* check to see if we have dialogue already running for this operation */ - /* we key on the operation pointer, which is at least accurate enough - for the operation type, although it could be on a different object. */ - if (g_hash_table_lookup (active_errors, m->info)) { - g_message ( - "Error occurred while existing dialogue active:\n%s", - m->error->message); - return; + /* Find the most recently used EShellWindow. */ + list = e_shell_get_watched_windows (shell); + for (iter = list; iter != NULL; iter = g_list_next (iter)) { + if (E_IS_SHELL_WINDOW (iter->data)) { + shell_window = E_SHELL_WINDOW (iter->data); + break; + } } - parent = e_shell_get_active_window (NULL); + /* If we can't find an EShellWindow then... well, screw it. */ + if (shell_window == NULL) + return; + + shell_view = e_shell_window_get_shell_view ( + shell_window, shell_builtin_backend); + shell_content = e_shell_view_get_shell_content (shell_view); if (m->info->desc && (what = m->info->desc (m))) { - gd = (GtkDialog *) e_alert_dialog_new_for_args ( - parent, "mail:async-error", what, + e_alert_submit ( + GTK_WIDGET (shell_content), + "mail:async-error", what, m->error->message, NULL); g_free (what); } else - gd = (GtkDialog *) e_alert_dialog_new_for_args ( - parent, "mail:async-error-nodescribe", + e_alert_submit ( + GTK_WIDGET (shell_content), + "mail:async-error-nodescribe", m->error->message, NULL); - - g_hash_table_insert (active_errors, m->info, gd); - g_signal_connect(gd, "response", G_CALLBACK(error_response), m->info); - g_object_weak_ref (G_OBJECT (gd), error_finalized, m->info); - if (m->priv->cancelable) - m->priv->error = (GtkWidget *) gd; - else - gtk_widget_show ((GtkWidget *)gd); - } void @@ -379,14 +349,6 @@ mail_cancel_all (void) g_mutex_unlock (mail_msg_lock); } -void -mail_msg_set_cancelable (gpointer msg, gboolean status) -{ - MailMsg *mail_msg = msg; - - mail_msg->priv->cancelable = status; -} - static guint idle_source_id = 0; G_LOCK_DEFINE_STATIC (idle_source_id); static GAsyncQueue *main_loop_queue = NULL; diff --git a/mail/mail-mt.h b/mail/mail-mt.h index e925946f0a..122519162b 100644 --- a/mail/mail-mt.h +++ b/mail/mail-mt.h @@ -76,7 +76,6 @@ void mail_msg_slow_ordered_push (gpointer msg); GHook * mail_cancel_hook_add (GHookFunc func, gpointer data); void mail_cancel_hook_remove (GHook *hook); void mail_cancel_all (void); -void mail_msg_set_cancelable (gpointer msg, gboolean status); /* request a string/password */ gchar *mail_get_password (CamelService *service, const gchar *prompt, diff --git a/mail/mail-ops.c b/mail/mail-ops.c index d0db1c8ba8..97a72aade0 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -906,7 +906,6 @@ mail_send_queue (EMailSession *session, if (G_IS_CANCELLABLE (cancellable)) { m->cancellable = g_object_ref (cancellable); g_object_unref (m->base.cancellable); - mail_msg_set_cancelable (m, FALSE); m->base.cancellable = NULL; } m->status = status; diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c index c2584cf53a..e2c70861b6 100644 --- a/mail/mail-send-recv.c +++ b/mail/mail-send-recv.c @@ -961,7 +961,10 @@ static MailMsgInfo refresh_folders_info = { }; static gboolean -receive_update_got_folderinfo (CamelStore *store, CamelFolderInfo *info, gpointer data) +receive_update_got_folderinfo (MailFolderCache *folder_cache, + CamelStore *store, + CamelFolderInfo *info, + gpointer data) { if (info) { GPtrArray *folders = g_ptr_array_new (); @@ -989,11 +992,14 @@ receive_update_got_folderinfo (CamelStore *store, CamelFolderInfo *info, gpointe static void receive_update_got_store (gchar *uri, CamelStore *store, gpointer data) { + MailFolderCache *folder_cache; struct _send_info *info = data; + folder_cache = e_mail_session_get_folder_cache (info->session); + if (store) { mail_folder_cache_note_store ( - mail_folder_cache_get_default (), + folder_cache, CAMEL_SESSION (info->session), store, info->cancellable, receive_update_got_folderinfo, info); diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c index 0d8f127b2b..dbca145c0d 100644 --- a/mail/mail-vfolder.c +++ b/mail/mail-vfolder.c @@ -248,17 +248,19 @@ vfolder_adduri_exec (struct _adduri_msg *m) { GList *l; CamelFolder *folder = NULL; + MailFolderCache *folder_cache; if (vfolder_shutdown) return; d(printf("%s uri to vfolder: %s\n", m->remove?"Removing":"Adding", m->uri)); + folder_cache = e_mail_session_get_folder_cache (m->session); + /* we dont try lookup the cache if we are removing it, its no longer there */ if (!m->remove && - !mail_folder_cache_get_folder_from_uri (mail_folder_cache_get_default (), - m->uri, &folder)) { + !mail_folder_cache_get_folder_from_uri (folder_cache, m->uri, &folder)) { g_warning("Folder '%s' disappeared while I was adding/remove it to/from my vfolder", m->uri); return; } @@ -591,7 +593,7 @@ mail_vfolder_notify_uri_unavailable (EMailSession *session, /** * mail_vfolder_delete_uri: - * + * @backend: an #EMailBackend * @store: a #CamelStore containing the uri * @curi: an email uri that has been deleted * @@ -607,7 +609,9 @@ mail_vfolder_notify_uri_unavailable (EMailSession *session, * NOTE: This function must be called from the main thread. */ static void -mail_vfolder_delete_uri (CamelStore *store, const gchar *curi) +mail_vfolder_delete_uri (EMailBackend *backend, + CamelStore *store, + const gchar *curi) { EFilterRule *rule; const gchar *source; @@ -617,6 +621,10 @@ mail_vfolder_delete_uri (CamelStore *store, const gchar *curi) gchar *uri; GList *link; + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); + g_return_if_fail (CAMEL_IS_STORE (store)); + g_return_if_fail (curi != NULL); + if (uri_is_spethal (store, curi)) return; @@ -689,7 +697,6 @@ done: G_UNLOCK (vfolder); if (changed_count > 0) { - GtkWidget *dialog; const gchar *config_dir; gchar *user, *info; @@ -704,8 +711,8 @@ done: "The following Search Folders\n%s have been modified " "to account for the deleted folder\n\"%s\".", changed_count), changed->str, uri); - dialog = e_alert_dialog_new_for_args (e_shell_get_active_window (NULL), "mail:vfolder-updated", info, NULL); - em_utils_show_info_silent (dialog); + e_mail_backend_submit_alert ( + backend, "mail:vfolder-updated", info, NULL); g_free (info); config_dir = mail_session_get_config_dir (); @@ -803,17 +810,23 @@ mail_vfolder_get_sources_remote (void) static void context_rule_added (ERuleContext *ctx, EFilterRule *rule); static void -rule_add_sources (GList *l, GList **sources_folderp, GList **sources_urip) +rule_add_sources (EMailSession *session, + GList *l, + GList **sources_folderp, + GList **sources_urip) { GList *sources_folder = *sources_folderp; GList *sources_uri = *sources_urip; + MailFolderCache *folder_cache; CamelFolder *newfolder; + folder_cache = e_mail_session_get_folder_cache (session); + while (l) { gchar *curi = em_uri_to_camel (l->data); - if (mail_folder_cache_get_folder_from_uri - (mail_folder_cache_get_default (), curi, &newfolder)) { + if (mail_folder_cache_get_folder_from_uri ( + folder_cache, curi, &newfolder)) { if (newfolder) sources_folder = g_list_append (sources_folder, newfolder); else @@ -836,6 +849,7 @@ rule_changed (EFilterRule *rule, CamelFolder *folder) const gchar *full_name; full_name = camel_folder_get_full_name (folder); + session = em_vfolder_rule_get_session (EM_VFOLDER_RULE (rule)); /* if the folder has changed name, then add it, then remove the old manually */ if (strcmp (full_name, rule->name) != 0) { @@ -866,19 +880,24 @@ rule_changed (EFilterRule *rule, CamelFolder *folder) d(printf("Filter rule changed? for folder '%s'!!\n", folder->name)); /* find any (currently available) folders, and add them to the ones to open */ - rule_add_sources (((EMVFolderRule *)rule)->sources, &sources_folder, &sources_uri); + rule_add_sources ( + session, ((EMVFolderRule *)rule)->sources, + &sources_folder, &sources_uri); G_LOCK (vfolder); if (((EMVFolderRule *)rule)->with == EM_VFOLDER_RULE_WITH_LOCAL || ((EMVFolderRule *)rule)->with == EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE) - rule_add_sources (source_folders_local, &sources_folder, &sources_uri); + rule_add_sources ( + session, source_folders_local, + &sources_folder, &sources_uri); if (((EMVFolderRule *)rule)->with == EM_VFOLDER_RULE_WITH_REMOTE_ACTIVE || ((EMVFolderRule *)rule)->with == EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE) - rule_add_sources (source_folders_remote, &sources_folder, &sources_uri); + rule_add_sources ( + session, source_folders_remote, + &sources_folder, &sources_uri); G_UNLOCK (vfolder); query = g_string_new(""); e_filter_rule_build_code (rule, query); - session = em_vfolder_rule_get_session (EM_VFOLDER_RULE (rule)); vfolder_setup (session, folder, query->str, sources_uri, sources_folder); g_string_free (query, TRUE); @@ -1036,9 +1055,12 @@ folder_unavailable_cb (MailFolderCache *cache, } static void -folder_deleted_cb (MailFolderCache *cache, CamelStore *store, const gchar *uri, gpointer user_data) +folder_deleted_cb (MailFolderCache *cache, + CamelStore *store, + const gchar *uri, + EMailBackend *backend) { - mail_vfolder_delete_uri (store, uri); + mail_vfolder_delete_uri (backend, store, uri); } static void @@ -1048,7 +1070,7 @@ folder_renamed_cb (MailFolderCache *cache, CamelStore *store, const gchar *oldur } void -vfolder_load_storage (EMailSession *session) +vfolder_load_storage (EMailBackend *backend) { /* lock for loading storage, it is safe to call it more than once */ G_LOCK_DEFINE_STATIC (vfolder_hash); @@ -1057,9 +1079,13 @@ vfolder_load_storage (EMailSession *session) const gchar *config_dir; gchar *user, *storeuri; EFilterRule *rule; + MailFolderCache *folder_cache; + EMailSession *session; gchar *xmlfile; GConfClient *gconf; + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); + G_LOCK (vfolder_hash); if (vfolder_hash) { @@ -1074,6 +1100,7 @@ vfolder_load_storage (EMailSession *session) data_dir = mail_session_get_data_dir (); config_dir = mail_session_get_config_dir (); + session = e_mail_backend_get_session (backend); /* first, create the vfolder store, and set it up */ storeuri = g_strdup_printf("vfolder:%s/vfolder", data_dir); @@ -1086,7 +1113,7 @@ vfolder_load_storage (EMailSession *session) g_signal_connect ( vfolder_store, "folder-deleted", - G_CALLBACK (store_folder_deleted_cb), NULL); + G_CALLBACK (store_folder_deleted_cb), backend); g_signal_connect ( vfolder_store, "folder-renamed", @@ -1130,17 +1157,19 @@ vfolder_load_storage (EMailSession *session) if (!gconf_client_get_bool (gconf, "/apps/evolution/mail/display/enable_vfolders", NULL)) gconf_client_set_bool (gconf, "/apps/evolution/mail/display/enable_vfolders", TRUE, NULL); + folder_cache = e_mail_session_get_folder_cache (session); + g_signal_connect ( - mail_folder_cache_get_default (), "folder-available", + folder_cache, "folder-available", G_CALLBACK (folder_available_cb), session); g_signal_connect ( - mail_folder_cache_get_default (), "folder-unavailable", + folder_cache, "folder-unavailable", G_CALLBACK (folder_unavailable_cb), session); g_signal_connect ( - mail_folder_cache_get_default (), "folder-deleted", + folder_cache, "folder-deleted", G_CALLBACK (folder_deleted_cb), NULL); g_signal_connect ( - mail_folder_cache_get_default (), "folder-renamed", + folder_cache, "folder-renamed", G_CALLBACK (folder_renamed_cb), NULL); } @@ -1162,6 +1191,7 @@ vfolder_edit (EShellView *shell_view) { EShellBackend *shell_backend; EShellWindow *shell_window; + EMailBackend *backend; EMailSession *session; GtkWidget *dialog; const gchar *config_dir; @@ -1175,10 +1205,8 @@ vfolder_edit (EShellView *shell_view) config_dir = e_shell_backend_get_config_dir (shell_backend); filename = g_build_filename (config_dir, "vfolders.xml", NULL); - session = e_mail_backend_get_session (E_MAIL_BACKEND (shell_backend)); - - /* ensures vfolder is running */ - vfolder_load_storage (session); + backend = E_MAIL_BACKEND (shell_backend); + session = e_mail_backend_get_session (backend); dialog = em_vfolder_editor_new (context); gtk_window_set_title ( @@ -1218,7 +1246,8 @@ edit_rule_response (GtkWidget *w, gint button, gpointer data) } void -vfolder_edit_rule (const gchar *uri) +vfolder_edit_rule (EMailBackend *backend, + const gchar *uri) { GtkWidget *w; GtkDialog *gd; @@ -1226,6 +1255,9 @@ vfolder_edit_rule (const gchar *uri) EFilterRule *rule, *newrule; CamelURL *url; + g_return_if_fail (E_IS_MAIL_BACKEND (backend)); + g_return_if_fail (uri != NULL); + url = camel_url_new (uri, NULL); if (url && url->fragment && (rule = e_rule_context_find_rule ((ERuleContext *)context, url->fragment, NULL))) { @@ -1255,11 +1287,9 @@ vfolder_edit_rule (const gchar *uri) g_signal_connect(gd, "response", G_CALLBACK(edit_rule_response), NULL); gtk_widget_show ((GtkWidget *)gd); } else { - GtkWidget *w; - /* TODO: we should probably just create it ... */ - w = e_alert_dialog_new_for_args (e_shell_get_active_window (NULL), "mail:vfolder-notexist", uri, NULL); - em_utils_show_error_silent (w); + e_mail_backend_submit_alert ( + backend, "mail:vfolder-notexist", uri, NULL); } if (url) @@ -1341,9 +1371,6 @@ vfolder_gui_add_rule (EMVFolderRule *rule) session = em_vfolder_rule_get_session (rule); - /* this should be done before we call this function */ - vfolder_load_storage (session); - w = e_filter_rule_get_widget ((EFilterRule *)rule, (ERuleContext *)context); gd = (GtkDialog *)gtk_dialog_new_with_buttons ( @@ -1380,9 +1407,6 @@ vfolder_gui_add_from_message (EMailSession *session, g_return_if_fail (msg != NULL); - /* ensures vfolder is running */ - vfolder_load_storage (session); - rule = (EMVFolderRule*)em_vfolder_rule_from_message (context, msg, flags, source); vfolder_gui_add_rule (rule); } @@ -1397,9 +1421,6 @@ vfolder_gui_add_from_address (EMailSession *session, g_return_if_fail (addr != NULL); - /* ensures vfolder is running */ - vfolder_load_storage (session); - rule = (EMVFolderRule*)em_vfolder_rule_from_address (context, addr, flags, source); vfolder_gui_add_rule (rule); } diff --git a/mail/mail-vfolder.h b/mail/mail-vfolder.h index 187a68d294..19c4d524b4 100644 --- a/mail/mail-vfolder.h +++ b/mail/mail-vfolder.h @@ -26,13 +26,15 @@ #include <filter/e-filter-part.h> #include <filter/e-filter-rule.h> +#include <mail/e-mail-backend.h> #include <mail/em-vfolder-rule.h> #include <shell/e-shell-view.h> -void vfolder_load_storage (EMailSession *session); +void vfolder_load_storage (EMailBackend *backend); void vfolder_revert (void); void vfolder_edit (EShellView *shell_view); -void vfolder_edit_rule (const gchar *name); +void vfolder_edit_rule (EMailBackend *backend, + const gchar *name); EFilterPart * vfolder_create_part (const gchar *name); EFilterRule * vfolder_clone_rule (EFilterRule *in); void vfolder_gui_add_rule (EMVFolderRule *rule); |