[evolution-ews] Bug #654528 - Cann't forward event as iCalendar



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]