Adapt to new CamelSession background job API.

This commit is contained in:
Matthew Barnes
2011-04-23 11:36:27 -04:00
parent dd371855c4
commit 918c24dd69
2 changed files with 119 additions and 65 deletions

View File

@ -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 {
@ -394,6 +399,83 @@ mail_backend_folder_changed_cb (MailFolderCache *folder_cache,
(EEventTarget *) target);
}
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,
@ -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 *

View File

@ -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. */