[evolution-ews] Bug #654528 - Cann't forward event as iCalendar
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews] Bug #654528 - Cann't forward event as iCalendar
- Date: Fri, 16 Aug 2013 12:04:34 +0000 (UTC)
commit 6f36ce6b48384249deda782626e9385e5c74e50e
Author: Milan Crha <mcrha redhat com>
Date: Fri Aug 16 14:04:10 2013 +0200
Bug #654528 - Cann't forward event as iCalendar
src/calendar/e-cal-backend-ews.c | 2 +-
src/camel/camel-ews-folder.c | 2 +-
src/camel/camel-ews-transport.c | 2 +-
src/utils/ews-camel-common.c | 87 ++++++++++++++++++++++++++++++++++++++
src/utils/ews-camel-common.h | 1 +
5 files changed, 91 insertions(+), 3 deletions(-)
---
diff --git a/src/calendar/e-cal-backend-ews.c b/src/calendar/e-cal-backend-ews.c
index d81e30a..fe17ed6 100644
--- a/src/calendar/e-cal-backend-ews.c
+++ b/src/calendar/e-cal-backend-ews.c
@@ -2972,7 +2972,7 @@ ewscal_send_cancellation_email (ECalBackend *backend,
camel_medium_set_content ((CamelMedium *) message, (CamelDataWrapper *) multi);
g_object_unref (multi);
- camel_ews_utils_create_mime_message (cnc, "SendOnly", NULL, message, 0, from, NULL, NULL, NULL,
&error);
+ camel_ews_utils_create_mime_message (cnc, "SendOnly", NULL, message, 0, from, NULL, NULL, NULL, NULL,
&error);
if (error) {
g_warning ("Failed to send cancellation email: %s", error->message);
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index 55a09a6..16c47c0 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -1624,7 +1624,7 @@ ews_append_message_sync (CamelFolder *folder,
if (!camel_ews_utils_create_mime_message (
cnc, "SaveOnly", fid, message,
camel_message_info_flags (info),
- from, &itemid, &changekey,
+ from, NULL, &itemid, &changekey,
cancellable, &local_error)) {
camel_ews_store_maybe_disconnect (ews_store, local_error);
g_propagate_error (error, local_error);
diff --git a/src/camel/camel-ews-transport.c b/src/camel/camel-ews-transport.c
index b234225..948960f 100644
--- a/src/camel/camel-ews-transport.c
+++ b/src/camel/camel-ews-transport.c
@@ -165,7 +165,7 @@ ews_send_to_sync (CamelTransport *transport,
success = camel_ews_utils_create_mime_message (
cnc, "SendOnly", NULL, message, 0,
- from, NULL, NULL, cancellable, error);
+ from, recipients, NULL, NULL, cancellable, error);
g_object_unref (cnc);
diff --git a/src/utils/ews-camel-common.c b/src/utils/ews-camel-common.c
index 343929c..9dd6d8e 100644
--- a/src/utils/ews-camel-common.c
+++ b/src/utils/ews-camel-common.c
@@ -33,8 +33,75 @@ struct _create_mime_msg_data {
CamelMimeMessage *message;
gint32 message_camel_flags;
CamelAddress *from;
+ CamelAddress *recipients;
};
+static void
+filter_recipients (CamelMimeMessage *message,
+ CamelAddress *recipients,
+ GHashTable *recip_to,
+ GHashTable *recip_cc,
+ GHashTable *recip_bcc)
+{
+ CamelInternetAddress *addresses, *mime_cc, *mime_bcc;
+ gint ii, len;
+
+ g_return_if_fail (message != NULL);
+ g_return_if_fail (recipients != NULL);
+ g_return_if_fail (CAMEL_IS_INTERNET_ADDRESS (recipients));
+ g_return_if_fail (recip_to != NULL);
+ g_return_if_fail (recip_cc != NULL);
+ g_return_if_fail (recip_bcc != NULL);
+
+ mime_cc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC);
+ mime_bcc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC);
+
+ addresses = CAMEL_INTERNET_ADDRESS (recipients);
+ len = camel_address_length (recipients);
+ for (ii = 0; ii < len; ii++) {
+ const gchar *name = NULL, *email = NULL;
+
+ if (!camel_internet_address_get (addresses, ii, &name, &email) ||
+ !email)
+ continue;
+
+ if (mime_bcc && camel_internet_address_find_address (mime_bcc, email, NULL) != -1) {
+ g_hash_table_insert (recip_bcc, (gpointer) email, GINT_TO_POINTER (1));
+ } else if (mime_cc && camel_internet_address_find_address (mime_cc, email, NULL) != -1) {
+ g_hash_table_insert (recip_cc, (gpointer) email, GINT_TO_POINTER (1));
+ } else {
+ g_hash_table_insert (recip_to, (gpointer) email, GINT_TO_POINTER (1));
+ }
+ }
+}
+
+static void
+write_recipients (ESoapMessage *msg,
+ const gchar *elem_name,
+ GHashTable *recips)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+
+ g_return_if_fail (msg != NULL);
+ g_return_if_fail (elem_name != NULL);
+ g_return_if_fail (recips != NULL);
+
+ if (!g_hash_table_size (recips))
+ return;
+
+ e_soap_message_start_element (msg, elem_name, NULL, NULL);
+
+ g_hash_table_iter_init (&iter, recips);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ e_soap_message_start_element (msg, "Mailbox", NULL, NULL);
+ e_ews_message_write_string_parameter_with_attribute (msg, "EmailAddress", NULL, key, NULL,
NULL);
+ e_soap_message_end_element (msg); /* Mailbox */
+ }
+
+ e_soap_message_end_element (msg); /* elem_name */
+}
+
/* MAPI flags gleaned from windows header files */
#define MAPI_MSGFLAG_READ 0x01
#define MAPI_MSGFLAG_UNSENT 0x08
@@ -142,6 +209,24 @@ create_mime_message_cb (ESoapMessage *msg,
e_soap_message_end_element (msg); /* ExtendedProperty */
}
+ if (create_data->recipients) {
+ GHashTable *recip_to, *recip_cc, *recip_bcc;
+
+ recip_to = g_hash_table_new (camel_strcase_hash, camel_strcase_equal);
+ recip_cc = g_hash_table_new (camel_strcase_hash, camel_strcase_equal);
+ recip_bcc = g_hash_table_new (camel_strcase_hash, camel_strcase_equal);
+
+ filter_recipients (create_data->message, create_data->recipients, recip_to, recip_cc,
recip_bcc);
+
+ write_recipients (msg, "ToRecipients", recip_to);
+ write_recipients (msg, "CcRecipients", recip_cc);
+ write_recipients (msg, "BccRecipients", recip_bcc);
+
+ g_hash_table_destroy (recip_to);
+ g_hash_table_destroy (recip_cc);
+ g_hash_table_destroy (recip_bcc);
+ }
+
e_ews_message_write_string_parameter_with_attribute (
msg,
"IsRead",
@@ -162,6 +247,7 @@ camel_ews_utils_create_mime_message (EEwsConnection *cnc,
CamelMimeMessage *message,
gint32 message_camel_flags,
CamelAddress *from,
+ CamelAddress *recipients,
gchar **itemid,
gchar **changekey,
GCancellable *cancellable,
@@ -179,6 +265,7 @@ camel_ews_utils_create_mime_message (EEwsConnection *cnc,
create_data->message = message;
create_data->message_camel_flags = message_camel_flags;
create_data->from = from;
+ create_data->recipients = recipients;
if (g_strcmp0 (disposition, "SendOnly") == 0 ||
g_strcmp0 (disposition, "SendAndSaveCopy") == 0) {
diff --git a/src/utils/ews-camel-common.h b/src/utils/ews-camel-common.h
index 30e594a..cbb357e 100644
--- a/src/utils/ews-camel-common.h
+++ b/src/utils/ews-camel-common.h
@@ -34,6 +34,7 @@ camel_ews_utils_create_mime_message (EEwsConnection *cnc,
CamelMimeMessage *message,
gint32 message_camel_flags,
CamelAddress *from,
+ CamelAddress *recipients,
gchar **itemid,
gchar **changekey,
GCancellable *cancellable,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]