From 2dc2990d215dae20c8ebdb93f10338730b8f514e Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Fri, 12 Mar 2004 16:51:50 +0000 Subject: Removed. No longer in use (hasn't been since before 1.2). 2004-03-12 Jeffrey Stedfast * mail-ops.c (mail_send_mail): Removed. No longer in use (hasn't been since before 1.2). (send_queue_send): Before enetring the main send loop, create a temporary uid array containing ONLY the messages we will send (ie. not any that have been marked deleted) so that we can more accurately report the number of messages total that we are sending. Also continue sending even if we encounter an exeption in mail_send_message() (unless, of course, it is a user-cancel). Merge any exceptions we get into the master exception variable and ALWAYS sync/expunge the queue folder. svn path=/trunk/; revision=25043 --- mail/mail-ops.c | 181 +++++++++++++++++++++----------------------------------- 1 file changed, 67 insertions(+), 114 deletions(-) (limited to 'mail/mail-ops.c') diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 112b59f8ca..99a7367378 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -585,90 +585,6 @@ mail_send_message (CamelMimeMessage *message, const char *destination, g_string_free (err, TRUE); } -/* ********************************************************************** */ - -struct _send_mail_msg { - struct _mail_msg msg; - - CamelFilterDriver *driver; - char *destination; - CamelMimeMessage *message; - - void (*done)(char *uri, CamelMimeMessage *message, gboolean sent, void *data); - void *data; -}; - -static char * -send_mail_desc (struct _mail_msg *mm, int done) -{ - struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - const char *subject; - - subject = camel_mime_message_get_subject (m->message); - - if (subject) - return g_strdup_printf (_("Sending \"%s\""), subject); - else - return g_strdup (_("Sending message")); -} - -static void -send_mail_send (struct _mail_msg *mm) -{ - struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - - mail_send_message (m->message, m->destination, m->driver, &mm->ex); -} - -static void -send_mail_sent (struct _mail_msg *mm) -{ - struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - - if (m->done) - m->done (m->destination, m->message, !camel_exception_is_set (&mm->ex), m->data); -} - -static void -send_mail_free (struct _mail_msg *mm) -{ - struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - - camel_object_unref (m->driver); - camel_object_unref (m->message); - g_free (m->destination); -} - -static struct _mail_msg_op send_mail_op = { - send_mail_desc, - send_mail_send, - send_mail_sent, - send_mail_free, -}; - -int -mail_send_mail (const char *uri, CamelMimeMessage *message, - void (*done) (char *uri, CamelMimeMessage *message, gboolean sent, void *data), - void *data) -{ - struct _send_mail_msg *m; - int id; - - m = mail_msg_new (&send_mail_op, NULL, sizeof (*m)); - m->destination = g_strdup (uri); - m->message = message; - camel_object_ref (message); - m->data = data; - m->done = done; - - id = m->msg.seq; - - m->driver = camel_session_get_filter_driver (session, FILTER_SOURCE_OUTGOING, NULL); - - e_thread_put (mail_thread_new, (EMsg *)m); - return id; -} - /* ** SEND MAIL QUEUE ***************************************************** */ struct _send_queue_msg { @@ -708,58 +624,95 @@ send_queue_send(struct _mail_msg *mm) { struct _send_queue_msg *m = (struct _send_queue_msg *)mm; CamelFolder *sent_folder = mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_SENT); - GPtrArray *uids; - int i; + GPtrArray *uids, *send_uids = NULL; + CamelException ex; + int i, j; d(printf("sending queue\n")); - uids = camel_folder_get_uids (m->queue); - if (uids == NULL || uids->len == 0) + if (!(uids = camel_folder_get_uids (m->queue))) return; - - if (m->cancel) - camel_operation_register (m->cancel); - - for (i = 0; i < uids->len; i++) { - CamelMimeMessage *message; + + send_uids = g_ptr_array_sized_new (uids->len); + for (i = 0, j = 0; i < uids->len; i++) { CamelMessageInfo *info; - int pc = (100 * i) / uids->len; - - report_status (m, CAMEL_FILTER_STATUS_START, pc, _("Sending message %d of %d"), i+1, uids->len); info = camel_folder_get_message_info (m->queue, uids->pdata[i]); if (info && info->flags & CAMEL_MESSAGE_DELETED) continue; - message = camel_folder_get_message (m->queue, uids->pdata[i], &mm->ex); - if (camel_exception_is_set (&mm->ex)) - break; + send_uids->pdata[j++] = uids->pdata[i]; + } + + send_uids->len = j; + if (send_uids->len == 0) { + /* nothing to send */ + camel_folder_free_uids (m->queue, uids); + g_ptr_array_free (send_uids, TRUE); + return; + } + + if (m->cancel) + camel_operation_register (m->cancel); + + camel_exception_init (&ex); + + for (i = 0, j = 0; i < send_uids->len; i++) { + int pc = (100 * i) / send_uids->len; + CamelMimeMessage *message; - mail_send_message (message, m->destination, m->driver, &mm->ex); + report_status (m, CAMEL_FILTER_STATUS_START, pc, _("Sending message %d of %d"), i+1, send_uids->len); - if (camel_exception_is_set (&mm->ex)) - break; + if (!(message = camel_folder_get_message (m->queue, send_uids->pdata[i], &ex))) { + /* I guess ignore errors where we can't get the message (should never happen anyway)? */ + camel_exception_clear (&ex); + continue; + } - camel_folder_set_message_flags (m->queue, uids->pdata[i], CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_DELETED); + mail_send_message (message, m->destination, m->driver, &ex); + if (!camel_exception_is_set (&ex)) { + camel_folder_set_message_flags (m->queue, send_uids->pdata[i], CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_DELETED); + } else if (ex.id != CAMEL_EXCEPTION_USER_CANCEL) { + /* merge exceptions into one */ + if (camel_exception_is_set (&mm->ex)) + camel_exception_setv (&mm->ex, CAMEL_EXCEPTION_SYSTEM, "%s\n\n%s", mm->ex.desc, ex.desc); + else + camel_exception_xfer (&mm->ex, &ex); + camel_exception_clear (&ex); + + /* keep track of the number of failures */ + j++; + } else { + /* transfer the USER_CANCEL exeption to the async op exception and then break */ + camel_exception_xfer (&mm->ex, &ex); + break; + } } - - if (camel_exception_is_set (&mm->ex)) - report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Failed on message %d of %d"), i+1, uids->len); + + j += (send_uids->len - i); + + if (j > 0) + report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Failed to send %d of %d messages"), j, send_uids->len); + else if (mm->ex.id == CAMEL_EXCEPTION_USER_CANCEL) + report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Cancelled.")); else report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Complete.")); - + if (m->driver) { camel_object_unref (m->driver); m->driver = NULL; } - + camel_folder_free_uids (m->queue, uids); - - if (!camel_exception_is_set (&mm->ex)) - camel_folder_expunge (m->queue, &mm->ex); + g_ptr_array_free (send_uids, TRUE); - if (sent_folder) - camel_folder_sync (sent_folder, FALSE, NULL); + camel_folder_sync (m->queue, TRUE, &ex); + camel_exception_clear (&ex); + + if (sent_folder) { + camel_folder_sync (sent_folder, FALSE, &ex); + camel_exception_clear (&ex); + } if (m->cancel) camel_operation_unregister (m->cancel); -- cgit v1.2.3