aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2011-04-23 23:36:27 +0800
committerMatthew Barnes <mbarnes@redhat.com>2011-04-24 00:37:04 +0800
commit918c24dd696eba9d0c0b896da92beeaae0769fcf (patch)
tree80dc6eb992ac3ad79f5f07bea1fb4fbcf107b171
parentdd371855c4b4e6eeb49ee0628fd5a695cabcd339 (diff)
downloadgsoc2013-evolution-918c24dd696eba9d0c0b896da92beeaae0769fcf.tar
gsoc2013-evolution-918c24dd696eba9d0c0b896da92beeaae0769fcf.tar.gz
gsoc2013-evolution-918c24dd696eba9d0c0b896da92beeaae0769fcf.tar.bz2
gsoc2013-evolution-918c24dd696eba9d0c0b896da92beeaae0769fcf.tar.lz
gsoc2013-evolution-918c24dd696eba9d0c0b896da92beeaae0769fcf.tar.xz
gsoc2013-evolution-918c24dd696eba9d0c0b896da92beeaae0769fcf.tar.zst
gsoc2013-evolution-918c24dd696eba9d0c0b896da92beeaae0769fcf.zip
Adapt to new CamelSession background job API.
-rw-r--r--mail/e-mail-backend.c117
-rw-r--r--mail/e-mail-session.c67
2 files changed, 119 insertions, 65 deletions
diff --git a/mail/e-mail-backend.c b/mail/e-mail-backend.c
index b1eec7e008..7665a64f8b 100644
--- a/mail/e-mail-backend.c
+++ b/mail/e-mail-backend.c
@@ -49,10 +49,15 @@
#include "mail/mail-ops.h"
#include "mail/mail-vfolder.h"
+#define E_MAIL_BACKEND_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_MAIL_BACKEND, EMailBackendPrivate))
+
#define QUIT_POLL_INTERVAL 1 /* seconds */
struct _EMailBackendPrivate {
EMailSession *session;
+ GHashTable *jobs;
};
enum {
@@ -395,6 +400,83 @@ mail_backend_folder_changed_cb (MailFolderCache *folder_cache,
}
static void
+mail_backend_job_started_cb (CamelSession *session,
+ GCancellable *cancellable,
+ EShellBackend *shell_backend)
+{
+ EMailBackendPrivate *priv;
+ EActivity *activity;
+
+ priv = E_MAIL_BACKEND_GET_PRIVATE (shell_backend);
+
+ activity = e_activity_new ();
+ e_activity_set_cancellable (activity, cancellable);
+ e_shell_backend_add_activity (shell_backend, activity);
+
+ /* The hash table takes ownership of the activity. */
+ g_hash_table_insert (priv->jobs, cancellable, activity);
+}
+
+static void
+mail_backend_job_finished_cb (CamelSession *session,
+ GCancellable *cancellable,
+ const GError *error,
+ EShellBackend *shell_backend)
+{
+ EMailBackendPrivate *priv;
+ EShellBackendClass *class;
+ EActivity *activity;
+ const gchar *description;
+
+ priv = E_MAIL_BACKEND_GET_PRIVATE (shell_backend);
+ class = E_SHELL_BACKEND_GET_CLASS (shell_backend);
+
+ activity = g_hash_table_lookup (priv->jobs, cancellable);
+ description = e_activity_get_text (activity);
+
+ if (error != NULL) {
+ EShell *shell;
+ GList *list, *iter;
+
+ shell = e_shell_backend_get_shell (shell_backend);
+ list = e_shell_get_watched_windows (shell);
+
+ /* Submit the error to an appropriate EAlertSink. */
+ for (iter = list; iter != NULL; iter = g_list_next (iter)) {
+ EShellView *shell_view;
+ EShellContent *shell_content;
+
+ if (!E_IS_SHELL_WINDOW (iter->data))
+ continue;
+
+ shell_view = e_shell_window_peek_shell_view (
+ E_SHELL_WINDOW (iter->data), class->name);
+
+ if (!E_IS_SHELL_VIEW (shell_view))
+ continue;
+
+ shell_content =
+ e_shell_view_get_shell_content (shell_view);
+
+ if (description != NULL && *description != '\0')
+ e_alert_submit (
+ E_ALERT_SINK (shell_content),
+ "mail:async-error", description,
+ error->message, NULL);
+ else
+ e_alert_submit (
+ E_ALERT_SINK (shell_content),
+ "mail:async-error-nodescribe",
+ error->message, NULL);
+
+ break;
+ }
+ }
+
+ g_hash_table_remove (priv->jobs, cancellable);
+}
+
+static void
mail_backend_get_property (GObject *object,
guint property_id,
GValue *value,
@@ -417,13 +499,19 @@ mail_backend_dispose (GObject *object)
{
EMailBackendPrivate *priv;
- priv = E_MAIL_BACKEND (object)->priv;
+ priv = E_MAIL_BACKEND_GET_PRIVATE (object);
if (priv->session != NULL) {
+ g_signal_handlers_disconnect_matched (
+ priv->session, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, object);
g_object_unref (priv->session);
priv->session = NULL;
}
+ /* There should be no unfinished jobs left. */
+ g_warn_if_fail (g_hash_table_size (priv->jobs) == 0);
+
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (e_mail_backend_parent_class)->dispose (object);
}
@@ -431,6 +519,12 @@ mail_backend_dispose (GObject *object)
static void
mail_backend_finalize (GObject *object)
{
+ EMailBackendPrivate *priv;
+
+ priv = E_MAIL_BACKEND_GET_PRIVATE (object);
+
+ g_hash_table_destroy (priv->jobs);
+
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (e_mail_backend_parent_class)->finalize (object);
@@ -446,7 +540,7 @@ mail_backend_constructed (GObject *object)
EMFolderTreeModel *folder_tree_model;
MailFolderCache *folder_cache;
- priv = E_MAIL_BACKEND (object)->priv;
+ priv = E_MAIL_BACKEND_GET_PRIVATE (object);
shell_backend = E_SHELL_BACKEND (object);
shell = e_shell_backend_get_shell (shell_backend);
@@ -464,6 +558,16 @@ mail_backend_constructed (GObject *object)
priv->session, "online",
G_BINDING_SYNC_CREATE);
+ g_signal_connect (
+ priv->session, "job-started",
+ G_CALLBACK (mail_backend_job_started_cb),
+ shell_backend);
+
+ g_signal_connect (
+ priv->session, "job-finished",
+ G_CALLBACK (mail_backend_job_finished_cb),
+ shell_backend);
+
/* FIXME This is an evil hack that needs to die.
* Give EAccountComboBox a CamelSession property. */
e_account_combo_box_set_session (CAMEL_SESSION (priv->session));
@@ -546,8 +650,13 @@ e_mail_backend_class_init (EMailBackendClass *class)
static void
e_mail_backend_init (EMailBackend *backend)
{
- backend->priv = G_TYPE_INSTANCE_GET_PRIVATE (
- backend, E_TYPE_MAIL_BACKEND, EMailBackendPrivate);
+ backend->priv = E_MAIL_BACKEND_GET_PRIVATE (backend);
+
+ backend->priv->jobs = g_hash_table_new_full (
+ (GHashFunc) g_direct_hash,
+ (GEqualFunc) g_direct_equal,
+ (GDestroyNotify) NULL,
+ (GDestroyNotify) g_object_unref);
}
EMailSession *
diff --git a/mail/e-mail-session.c b/mail/e-mail-session.c
index f85c4ecb8a..83e191ff65 100644
--- a/mail/e-mail-session.c
+++ b/mail/e-mail-session.c
@@ -64,6 +64,10 @@
#include "mail-send-recv.h"
#include "mail-tools.h"
+#define E_MAIL_SESSION_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_MAIL_SESSION, EMailSessionPrivate))
+
static guint session_check_junk_notify_id;
static guint session_gconf_proxy_id;
@@ -553,7 +557,7 @@ mail_session_dispose (GObject *object)
{
EMailSessionPrivate *priv;
- priv = E_MAIL_SESSION (object)->priv;
+ priv = E_MAIL_SESSION_GET_PRIVATE (object);
if (priv->folder_cache != NULL) {
g_object_unref (priv->folder_cache);
@@ -796,61 +800,6 @@ mail_session_lookup_addressbook (CamelSession *session,
return ret;
}
-static gpointer
-mail_session_thread_msg_new (CamelSession *session,
- CamelSessionThreadOps *ops,
- guint size)
-{
- CamelSessionThreadMsg *msg;
- CamelSessionClass *session_class;
-
- /* TODO This is very temporary, until we have a better way to do
- * the progress reporting, we just borrow a dummy mail-mt
- * thread message and hook it onto out camel thread message. */
-
- /* Chain up to parent's thread_msg_new() method. */
- session_class = CAMEL_SESSION_CLASS (e_mail_session_parent_class);
- msg = session_class->thread_msg_new (session, ops, size);
-
-#if 0
- /* We create a dummy mail_msg, and then copy its cancellation
- * port over to ours, so we get cancellation and progress in
- * common with hte existing mail code, for free. */
- if (msg) {
- MailMsg *m = mail_msg_new (&ms_thread_info_dummy);
-
- msg->data = m;
- e_activity_set_cancellable (
- m->activity, msg->cancellable);
- }
-#endif
-
- return msg;
-}
-
-static void
-mail_session_thread_msg_free (CamelSession *session,
- CamelSessionThreadMsg *msg)
-{
- CamelSessionClass *session_class;
-
-#if 0
- mail_msg_unref (msg->data);
-#endif
-
- /* Chain up to parent's thread_msg_free() method. */
- session_class = CAMEL_SESSION_CLASS (e_mail_session_parent_class);
- session_class->thread_msg_free (session, msg);
-}
-
-static void
-mail_session_thread_status (CamelSession *session,
- CamelSessionThreadMsg *msg,
- const gchar *text,
- gint pc)
-{
-}
-
static gboolean
mail_session_forward_to (CamelSession *session,
CamelFolder *folder,
@@ -984,9 +933,6 @@ e_mail_session_class_init (EMailSessionClass *class)
session_class->alert_user = mail_session_alert_user;
session_class->get_filter_driver = mail_session_get_filter_driver;
session_class->lookup_addressbook = mail_session_lookup_addressbook;
- session_class->thread_msg_new = mail_session_thread_msg_new;
- 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 (
@@ -1005,8 +951,7 @@ e_mail_session_init (EMailSession *session)
{
GConfClient *client;
- session->priv = G_TYPE_INSTANCE_GET_PRIVATE (
- session, E_TYPE_MAIL_SESSION, EMailSessionPrivate);
+ session->priv = E_MAIL_SESSION_GET_PRIVATE (session);
session->priv->folder_cache = mail_folder_cache_new ();
/* Initialize the EAccount setup. */