implement, we hook into the mail progress reporting stuff by overriding

2003-09-21  Not Zed  <NotZed@Ximian.com>

        * mail-session.c (ms_thread_msg_new): implement, we hook into the
        mail progress reporting stuff by overriding the CamelOperation
        member with one from a dummy mail_msg.
        (ms_thread_msg_free): handle freeing.

        * mail-mt.c (mail_msg_free): mute the camel-operaiton when we free
        it so we no longer get updates.

svn path=/trunk/; revision=22649
This commit is contained in:
Not Zed
2003-09-22 18:53:26 +00:00
committed by Michael Zucci
parent 6abd6e01b3
commit d60e250a6e
3 changed files with 59 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2003-09-21 Not Zed <NotZed@Ximian.com>
* mail-session.c (ms_thread_msg_new): implement, we hook into the
mail progress reporting stuff by overriding the CamelOperation
member with one from a dummy mail_msg.
(ms_thread_msg_free): handle freeing.
* mail-mt.c (mail_msg_free): mute the camel-operaiton when we free
it so we no longer get updates.
2003-09-19 Jeffrey Stedfast <fejj@ximian.com>
* em-message-browser.c (emmb_set_message): Set the window title to

View File

@ -201,8 +201,10 @@ void mail_msg_free(void *msg)
MAIL_MT_UNLOCK(mail_msg_lock);
if (m->cancel)
if (m->cancel) {
camel_operation_mute(m->cancel);
camel_operation_unref(m->cancel);
}
camel_exception_clear(&m->ex);
/*g_free(m->priv->what);*/

View File

@ -77,11 +77,17 @@ typedef struct _MailSessionClass {
} MailSessionClass;
static CamelSessionClass *ms_parent_class;
static char *get_password(CamelSession *session, const char *prompt, gboolean reprompt, gboolean secret, CamelService *service, const char *item, CamelException *ex);
static void forget_password(CamelSession *session, CamelService *service, const char *item, CamelException *ex);
static gboolean alert_user(CamelSession *session, CamelSessionAlertType type, const char *prompt, gboolean cancel);
static CamelFilterDriver *get_filter_driver(CamelSession *session, const char *type, CamelException *ex);
static void ms_thread_status(CamelSession *session, CamelSessionThreadMsg *msg, const char *text, int pc);
static void *ms_thread_msg_new(CamelSession *session, CamelSessionThreadOps *ops, unsigned int size);
static void ms_thread_msg_free(CamelSession *session, CamelSessionThreadMsg *m);
static void
init (MailSession *session)
{
@ -106,6 +112,10 @@ class_init (MailSessionClass *mail_session_class)
camel_session_class->forget_password = forget_password;
camel_session_class->alert_user = alert_user;
camel_session_class->get_filter_driver = get_filter_driver;
camel_session_class->thread_msg_new = ms_thread_msg_new;
camel_session_class->thread_msg_free = ms_thread_msg_free;
camel_session_class->thread_status = ms_thread_status;
}
static CamelType
@ -114,6 +124,7 @@ mail_session_get_type (void)
static CamelType mail_session_type = CAMEL_INVALID_TYPE;
if (mail_session_type == CAMEL_INVALID_TYPE) {
ms_parent_class = (CamelSessionClass *)camel_session_get_type();
mail_session_type = camel_type_register (
camel_session_get_type (),
"MailSession",
@ -641,6 +652,41 @@ get_filter_driver (CamelSession *session, const char *type, CamelException *ex)
session, type, ex);
}
/* 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 */
static mail_msg_op_t ms_thread_ops_dummy = { NULL };
static void *ms_thread_msg_new(CamelSession *session, CamelSessionThreadOps *ops, unsigned int size)
{
CamelSessionThreadMsg *msg = ms_parent_class->thread_msg_new(session, ops, size);
/* 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) {
struct _mail_msg *m = mail_msg_new(&ms_thread_ops_dummy, NULL, sizeof(struct _mail_msg));
msg->data = m;
camel_operation_unref(msg->op);
msg->op = m->cancel;
camel_operation_ref(msg->op);
}
return msg;
}
static void ms_thread_msg_free(CamelSession *session, CamelSessionThreadMsg *m)
{
mail_msg_free(m->data);
ms_parent_class->thread_msg_free(session, m);
}
static void ms_thread_status(CamelSession *session, CamelSessionThreadMsg *msg, const char *text, int pc)
{
/* This should never be called since we bypass it in alloc! */
printf("Thread status '%s' %d%%\n", text, pc);
}
char *
mail_session_get_password (const char *url_string)
{