aboutsummaryrefslogtreecommitdiffstats
path: root/composer/e-msg-composer.c
diff options
context:
space:
mode:
Diffstat (limited to 'composer/e-msg-composer.c')
-rw-r--r--composer/e-msg-composer.c135
1 files changed, 102 insertions, 33 deletions
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index 9f9aac9e19..5ef78d5daa 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -105,15 +105,19 @@ static void add_attachments_from_multipart (EMsgComposer *composer,
/* used by e_msg_composer_new_with_message () */
static void handle_multipart (EMsgComposer *composer,
CamelMultipart *multipart,
+ CamelOperation *operation,
gint depth);
static void handle_multipart_alternative (EMsgComposer *composer,
CamelMultipart *multipart,
+ CamelOperation *operation,
gint depth);
static void handle_multipart_encrypted (EMsgComposer *composer,
CamelMimePart *multipart,
+ CamelOperation *operation,
gint depth);
static void handle_multipart_signed (EMsgComposer *composer,
CamelMultipart *multipart,
+ CamelOperation *operation,
gint depth);
G_DEFINE_TYPE_WITH_CODE (
@@ -134,7 +138,10 @@ G_DEFINE_TYPE_WITH_CODE (
* Return Value: The part in displayable html format.
**/
static gchar *
-emcu_part_to_html (CamelMimePart *part, gssize *len, EMFormat *source)
+emcu_part_to_html (CamelMimePart *part,
+ gssize *len,
+ EMFormat *source,
+ CamelOperation *operation)
{
EMFormatQuote *emfq;
CamelStreamMem *mem;
@@ -157,7 +164,9 @@ emcu_part_to_html (CamelMimePart *part, gssize *len, EMFormat *source)
em_format_set_default_charset (
(EMFormat *) emfq, source->charset);
}
- em_format_part ((EMFormat *) emfq, (CamelStream *)mem, part);
+ em_format_part (
+ EM_FORMAT (emfq), CAMEL_STREAM (mem),
+ part, G_CANCELLABLE (operation));
g_object_unref (emfq);
camel_stream_write((CamelStream *) mem, "", 1, NULL);
@@ -614,6 +623,7 @@ build_message (EMsgComposer *composer,
CamelTransferEncoding plain_encoding;
const gchar *iconv_charset = NULL;
GPtrArray *recipients = NULL;
+ CamelOperation *operation;
CamelMultipart *body = NULL;
CamelContentType *type;
CamelMimeMessage *new;
@@ -646,6 +656,8 @@ build_message (EMsgComposer *composer,
return p->redirect;
}
+ operation = camel_operation_registered ();
+
new = camel_mime_message_new ();
build_message_headers (composer, new, FALSE);
for (i = 0; i < p->extra_hdr_names->len; i++) {
@@ -960,10 +972,17 @@ build_message (EMsgComposer *composer,
camel_gpg_context_set_always_trust (
CAMEL_GPG_CONTEXT (cipher),
account->pgp_always_trust);
+
+ camel_operation_start (
+ operation, _("Signing message"));
camel_cipher_sign (
- cipher, pgp_userid, account_hash_algo_to_camel_hash (
+ cipher, pgp_userid,
+ account_hash_algo_to_camel_hash (
account ? e_account_get_string (account, E_ACCOUNT_PGP_HASH_ALGORITHM) : NULL),
- part, npart, &local_error);
+ part, npart, G_CANCELLABLE (operation),
+ &local_error);
+ camel_operation_end (operation);
+
g_object_unref (cipher);
if (local_error != NULL) {
@@ -988,9 +1007,15 @@ build_message (EMsgComposer *composer,
camel_gpg_context_set_always_trust (
CAMEL_GPG_CONTEXT (cipher),
account->pgp_always_trust);
+
+ camel_operation_start (
+ operation, _("Encrypting mesage"));
camel_cipher_encrypt (
cipher, pgp_userid, recipients,
- part, npart, &local_error);
+ part, npart, G_CANCELLABLE (operation),
+ &local_error);
+ camel_operation_end (operation);
+
g_object_unref (cipher);
if (account && account->pgp_encrypt_to_self && pgp_userid)
@@ -1069,12 +1094,18 @@ build_message (EMsgComposer *composer,
TRUE, account->smime_encrypt_key);
}
- camel_cipher_sign (cipher, account->smime_sign_key,
+ camel_operation_start (
+ operation, _("Signing message"));
+ camel_cipher_sign (
+ cipher, account->smime_sign_key,
account_hash_algo_to_camel_hash (
(account != NULL) ?
e_account_get_string (account,
E_ACCOUNT_SMIME_HASH_ALGORITHM) : NULL),
- part, npart, &local_error);
+ part, npart, G_CANCELLABLE (operation),
+ &local_error);
+ camel_operation_end (operation);
+
g_object_unref (cipher);
if (local_error != NULL) {
@@ -1099,9 +1130,15 @@ build_message (EMsgComposer *composer,
(CamelSMIMEContext *) cipher, TRUE,
account->smime_encrypt_key);
+ camel_operation_start (
+ operation, _("Encrypting message"));
camel_cipher_encrypt (
cipher, NULL, recipients, part,
- (CamelMimePart *) new, &local_error);
+ (CamelMimePart *) new,
+ G_CANCELLABLE (operation),
+ &local_error);
+ camel_operation_end (operation);
+
g_object_unref (cipher);
if (local_error != NULL)
@@ -1145,6 +1182,9 @@ skip_content:
CAMEL_MEDIUM (new), "X-Evolution-Format",
html_content ? "text/html" : "text/plain");
+ if (operation != NULL)
+ g_object_unref (operation);
+
return new;
exception:
@@ -2443,6 +2483,7 @@ e_msg_composer_add_message_attachments (EMsgComposer *composer,
static void
handle_multipart_signed (EMsgComposer *composer,
CamelMultipart *multipart,
+ CamelOperation *operation,
gint depth)
{
CamelContentType *content_type;
@@ -2485,29 +2526,32 @@ handle_multipart_signed (EMsgComposer *composer,
if (CAMEL_IS_MULTIPART_SIGNED (content)) {
/* Handle the signed content and configure
* the composer to sign outgoing messages. */
- handle_multipart_signed (composer, multipart, depth);
+ handle_multipart_signed (
+ composer, multipart, operation, depth);
} else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
/* Decrypt the encrypted content and configure
* the composer to encrypt outgoing messages. */
- handle_multipart_encrypted (composer, mime_part, depth);
+ handle_multipart_encrypted (
+ composer, mime_part, operation, depth);
} else if (camel_content_type_is (content_type, "multipart", "alternative")) {
/* This contains the text/plain and text/html
* versions of the message body. */
handle_multipart_alternative (
- composer, multipart, depth);
+ composer, multipart, operation, depth);
} else {
/* There must be attachments... */
- handle_multipart (composer, multipart, depth);
+ handle_multipart (
+ composer, multipart, operation, depth);
}
} else if (camel_content_type_is (content_type, "text", "*")) {
gchar *html;
gssize length;
- html = emcu_part_to_html (mime_part, &length, NULL);
+ html = emcu_part_to_html (mime_part, &length, NULL, operation);
e_msg_composer_set_pending_body (composer, html, length);
} else {
e_msg_composer_attach (composer, mime_part);
@@ -2517,6 +2561,7 @@ handle_multipart_signed (EMsgComposer *composer,
static void
handle_multipart_encrypted (EMsgComposer *composer,
CamelMimePart *multipart,
+ CamelOperation *operation,
gint depth)
{
CamelContentType *content_type;
@@ -2544,7 +2589,11 @@ handle_multipart_encrypted (EMsgComposer *composer,
session = e_msg_composer_get_session (composer);
cipher = camel_gpg_context_new (session);
mime_part = camel_mime_part_new ();
- valid = camel_cipher_decrypt (cipher, multipart, mime_part, NULL);
+ camel_operation_start (operation, _("Decrypting message"));
+ valid = camel_cipher_decrypt (
+ cipher, multipart, mime_part,
+ G_CANCELLABLE (operation), NULL);
+ camel_operation_end (operation);
g_object_unref (cipher);
if (valid == NULL)
@@ -2568,29 +2617,31 @@ handle_multipart_encrypted (EMsgComposer *composer,
/* Handle the signed content and configure the
* composer to sign outgoing messages. */
handle_multipart_signed (
- composer, content_multipart, depth);
+ composer, content_multipart, operation, depth);
} else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
/* Decrypt the encrypted content and configure the
* composer to encrypt outgoing messages. */
- handle_multipart_encrypted (composer, mime_part, depth);
+ handle_multipart_encrypted (
+ composer, mime_part, operation, depth);
} else if (camel_content_type_is (content_type, "multipart", "alternative")) {
/* This contains the text/plain and text/html
* versions of the message body. */
handle_multipart_alternative (
- composer, content_multipart, depth);
+ composer, content_multipart, operation, depth);
} else {
/* There must be attachments... */
- handle_multipart (composer, content_multipart, depth);
+ handle_multipart (
+ composer, content_multipart, operation, depth);
}
} else if (camel_content_type_is (content_type, "text", "*")) {
gchar *html;
gssize length;
- html = emcu_part_to_html (mime_part, &length, NULL);
+ html = emcu_part_to_html (mime_part, &length, NULL, operation);
e_msg_composer_set_pending_body (composer, html, length);
} else {
e_msg_composer_attach (composer, mime_part);
@@ -2602,6 +2653,7 @@ handle_multipart_encrypted (EMsgComposer *composer,
static void
handle_multipart_alternative (EMsgComposer *composer,
CamelMultipart *multipart,
+ CamelOperation *operation,
gint depth)
{
/* Find the text/html part and set the composer body to it's contents */
@@ -2631,18 +2683,21 @@ handle_multipart_alternative (EMsgComposer *composer,
if (CAMEL_IS_MULTIPART_SIGNED (content)) {
/* Handle the signed content and configure
* the composer to sign outgoing messages. */
- handle_multipart_signed (composer, mp, depth + 1);
+ handle_multipart_signed (
+ composer, mp, operation, depth + 1);
} else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
/* Decrypt the encrypted content and configure
* the composer to encrypt outgoing messages. */
handle_multipart_encrypted (
- composer, mime_part, depth + 1);
+ composer, mime_part,
+ operation, depth + 1);
} else {
/* Depth doesn't matter so long as we
* don't pass 0. */
- handle_multipart (composer, mp, depth + 1);
+ handle_multipart (
+ composer, mp, operation, depth + 1);
}
} else if (camel_content_type_is (content_type, "text", "html")) {
@@ -2663,7 +2718,7 @@ handle_multipart_alternative (EMsgComposer *composer,
gchar *html;
gssize length;
- html = emcu_part_to_html (text_part, &length, NULL);
+ html = emcu_part_to_html (text_part, &length, NULL, operation);
e_msg_composer_set_pending_body (composer, html, length);
}
}
@@ -2671,6 +2726,7 @@ handle_multipart_alternative (EMsgComposer *composer,
static void
handle_multipart (EMsgComposer *composer,
CamelMultipart *multipart,
+ CamelOperation *operation,
gint depth)
{
gint i, nparts;
@@ -2698,22 +2754,25 @@ handle_multipart (EMsgComposer *composer,
if (CAMEL_IS_MULTIPART_SIGNED (content)) {
/* Handle the signed content and configure
* the composer to sign outgoing messages. */
- handle_multipart_signed (composer, mp, depth + 1);
+ handle_multipart_signed (
+ composer, mp, operation, depth + 1);
} else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
/* Decrypt the encrypted content and configure
* the composer to encrypt outgoing messages. */
handle_multipart_encrypted (
- composer, mime_part, depth + 1);
+ composer, mime_part,
+ operation, depth + 1);
} else if (camel_content_type_is (content_type, "multipart", "alternative")) {
handle_multipart_alternative (
- composer, mp, depth + 1);
+ composer, mp, operation, depth + 1);
} else {
/* Depth doesn't matter so long as we
* don't pass 0. */
- handle_multipart (composer, mp, depth + 1);
+ handle_multipart (
+ composer, mp, operation, depth + 1);
}
} else if (depth == 0 && i == 0) {
@@ -2722,7 +2781,8 @@ handle_multipart (EMsgComposer *composer,
/* Since the first part is not multipart/alternative,
* this must be the body. */
- html = emcu_part_to_html (mime_part, &length, NULL);
+ html = emcu_part_to_html (
+ mime_part, &length, NULL, operation);
e_msg_composer_set_pending_body (composer, html, length);
} else if (camel_mime_part_get_content_id (mime_part) ||
camel_mime_part_get_content_location (mime_part)) {
@@ -2785,6 +2845,7 @@ e_msg_composer_new_with_message (EShell *shell,
EDestination **Tov, **Ccv, **Bccv;
GHashTable *auto_cc, *auto_bcc;
CamelContentType *content_type;
+ CamelOperation *operation = NULL; /* FIXME Pass this in. */
struct _camel_header_raw *headers;
CamelDataWrapper *content;
EAccount *account = NULL;
@@ -3031,22 +3092,26 @@ e_msg_composer_new_with_message (EShell *shell,
if (CAMEL_IS_MULTIPART_SIGNED (content)) {
/* Handle the signed content and configure the
* composer to sign outgoing messages. */
- handle_multipart_signed (composer, multipart, 0);
+ handle_multipart_signed (
+ composer, multipart, operation, 0);
} else if (CAMEL_IS_MULTIPART_ENCRYPTED (content)) {
/* Decrypt the encrypted content and configure the
* composer to encrypt outgoing messages. */
handle_multipart_encrypted (
- composer, CAMEL_MIME_PART (message), 0);
+ composer, CAMEL_MIME_PART (message),
+ operation, 0);
} else if (camel_content_type_is (content_type, "multipart", "alternative")) {
/* This contains the text/plain and text/html
* versions of the message body. */
- handle_multipart_alternative (composer, multipart, 0);
+ handle_multipart_alternative (
+ composer, multipart, operation, 0);
} else {
/* There must be attachments... */
- handle_multipart (composer, multipart, 0);
+ handle_multipart (
+ composer, multipart, operation, 0);
}
} else {
gchar *html;
@@ -3059,7 +3124,8 @@ e_msg_composer_new_with_message (EShell *shell,
|| camel_content_type_is (content_type, "application", "pkcs7-mime")))
gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (ACTION (SMIME_ENCRYPT)), TRUE);
- html = emcu_part_to_html ((CamelMimePart *)message, &length, NULL);
+ html = emcu_part_to_html (
+ CAMEL_MIME_PART (message), &length, NULL, operation);
e_msg_composer_set_pending_body (composer, html, length);
}
@@ -3072,6 +3138,9 @@ e_msg_composer_new_with_message (EShell *shell,
set_signature_gui (composer);
+ if (operation != NULL)
+ g_object_unref (operation);
+
return composer;
}