[evolution-ews] Bug #655774 - Copy sent messages to Sent Items



commit a7bc53ad90a59aca69569b15eecae42d56a8321a
Author: Milan Crha <mcrha redhat com>
Date:   Thu Sep 6 11:09:28 2012 +0200

    Bug #655774 - Copy sent messages to Sent Items

 src/addressbook/e-book-backend-ews.c |    7 +++-
 src/calendar/e-cal-backend-ews.c     |    8 ++++-
 src/camel/camel-ews-folder.c         |   15 +++++---
 src/camel/camel-ews-provider.c       |    2 +-
 src/camel/camel-ews-transport.c      |    7 +++-
 src/server/e-ews-connection.c        |   67 ++++++++++++++++++----------------
 src/server/e-ews-connection.h        |    4 +-
 src/server/tests/test-cuditem.c      |    9 ++++-
 src/utils/ews-camel-common.c         |    7 ++--
 src/utils/ews-camel-common.h         |   16 ++++++---
 10 files changed, 89 insertions(+), 53 deletions(-)
---
diff --git a/src/addressbook/e-book-backend-ews.c b/src/addressbook/e-book-backend-ews.c
index 6f0cd2c..8f22803 100644
--- a/src/addressbook/e-book-backend-ews.c
+++ b/src/addressbook/e-book-backend-ews.c
@@ -970,6 +970,7 @@ e_book_backend_ews_create_contacts (EBookBackend *backend,
 	EContact *contact = NULL;
 	EBookBackendEws *ebews;
 	EwsCreateContact *create_contact;
+	EwsFolderId *fid;
 	EBookBackendEwsPrivate *priv;
 
 	if (vcards->next != NULL) {
@@ -1018,17 +1019,21 @@ e_book_backend_ews_create_contacts (EBookBackend *backend,
 	create_contact->opid = opid;
 	create_contact->contact = g_object_ref (contact);
 
+	fid = e_ews_folder_id_new (priv->folder_id, NULL, FALSE);
+
 	/* pass new contact component data to the exchange server and expect response in the callback */
 	e_ews_connection_create_items (
 		priv->cnc,
 		EWS_PRIORITY_MEDIUM, NULL,
 		NULL,
-		priv->folder_id,
+		fid,
 		convert_contact_to_xml,
 		contact,
 		cancellable,
 		ews_create_contact_cb,
 		create_contact);
+
+	e_ews_folder_id_free (fid);
 }
 
 typedef struct {
diff --git a/src/calendar/e-cal-backend-ews.c b/src/calendar/e-cal-backend-ews.c
index 30c2d87..f9815e6 100644
--- a/src/calendar/e-cal-backend-ews.c
+++ b/src/calendar/e-cal-backend-ews.c
@@ -1626,6 +1626,7 @@ e_cal_backend_ews_create_objects (ECalBackend *backend,
 {
 	EwsCreateData *create_data;
 	EwsConvertData *convert_data;
+	EwsFolderId *fid;
 	ECalBackendEws *cbews;
 	ECalBackendEwsPrivate *priv;
 	icalcomponent_kind kind;
@@ -1716,17 +1717,22 @@ e_cal_backend_ews_create_objects (ECalBackend *backend,
 		/*In case of appointment we have to set SendMeetingInvites to SendToNone */
 		send_meeting_invitations = "SendToNone";
 
+	fid = e_ews_folder_id_new (priv->folder_id, NULL, FALSE);
+
 	e_ews_connection_create_items (
 		priv->cnc,
 		EWS_PRIORITY_MEDIUM,
 		"SaveOnly",
 		send_meeting_invitations,
-		priv->folder_id,
+		fid,
 		convert_calcomp_to_xml,
 		convert_data,
 		cancellable,
 		ews_create_object_cb,
 		create_data);
+
+	e_ews_folder_id_free (fid);
+
 	return;
 
 exit:
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index 233050d..59934b0 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -1499,6 +1499,7 @@ ews_append_message_sync (CamelFolder *folder,
 	gchar *itemid, *changekey;
 	const gchar *folder_name;
 	gchar *folder_id;
+	EwsFolderId *fid;
 	CamelAddress *from;
 	CamelEwsStore *ews_store;
 	EEwsConnection *cnc;
@@ -1506,6 +1507,10 @@ ews_append_message_sync (CamelFolder *folder,
 
 	ews_store = (CamelEwsStore *) camel_folder_get_parent_store (folder);
 
+	if (!camel_ews_store_connected (ews_store, cancellable, error)) {
+		return FALSE;
+	}
+
 	folder_name = camel_folder_get_full_name (folder);
 	folder_id = camel_ews_store_summary_get_folder_id_from_name (
 		ews_store->summary,
@@ -1515,30 +1520,30 @@ ews_append_message_sync (CamelFolder *folder,
 
 	from = CAMEL_ADDRESS (camel_mime_message_get_from (message));
 
-	if (!camel_ews_store_connected (ews_store, cancellable, error)) {
-		return FALSE;
-	}
-
 	cnc = camel_ews_store_ref_connection (ews_store);
 
 	if (!cnc) {
+		g_free (folder_id);
 		g_set_error (
 			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 			_("Cant perform actions on the folder while in offline mode"));
 		return FALSE;
 	}
 
+	fid = e_ews_folder_id_new (folder_id, NULL, FALSE);
 	if (!camel_ews_utils_create_mime_message (
-		cnc, "SaveOnly", folder_id, message,
+		cnc, "SaveOnly", fid, message,
 		camel_message_info_flags (info),
 		from, &itemid, &changekey,
 		cancellable, &local_error)) {
 		camel_ews_store_maybe_disconnect (ews_store, local_error);
 		g_propagate_error (error, local_error);
+		e_ews_folder_id_free (fid);
 		g_free (folder_id);
 		g_object_unref (cnc);
 		return FALSE;
 	}
+	e_ews_folder_id_free (fid);
 	g_free (folder_id);
 
 	/* FIXME: Do we have to add it to the summary info ourselves?
diff --git a/src/camel/camel-ews-provider.c b/src/camel/camel-ews-provider.c
index 3fcaa68..8e131af 100644
--- a/src/camel/camel-ews-provider.c
+++ b/src/camel/camel-ews-provider.c
@@ -80,7 +80,7 @@ static CamelProvider ews_provider = {
 	"mail",
 
 	CAMEL_PROVIDER_IS_REMOTE | CAMEL_PROVIDER_IS_SOURCE |
-	CAMEL_PROVIDER_IS_STORAGE | CAMEL_PROVIDER_IS_EXTERNAL,
+	CAMEL_PROVIDER_IS_STORAGE | CAMEL_PROVIDER_IS_EXTERNAL | CAMEL_PROVIDER_DISABLE_SENT_FOLDER,
 
 	CAMEL_URL_ALLOW_USER | CAMEL_URL_ALLOW_AUTH | CAMEL_URL_HIDDEN_HOST,
 
diff --git a/src/camel/camel-ews-transport.c b/src/camel/camel-ews-transport.c
index 9acaa49..37321eb 100644
--- a/src/camel/camel-ews-transport.c
+++ b/src/camel/camel-ews-transport.c
@@ -90,6 +90,7 @@ ews_send_to_sync (CamelTransport *transport,
 	CamelSettings *settings;
 	CamelService *service;
 	EEwsConnection *cnc;
+	EwsFolderId *fid;
 	gchar *ews_email;
 	gchar *host_url;
 	gchar *user;
@@ -163,9 +164,13 @@ ews_send_to_sync (CamelTransport *transport,
 		goto exit;
 	}
 
+	fid = e_ews_folder_id_new ("sentitems", NULL, TRUE);
+
 	success = camel_ews_utils_create_mime_message (
-		cnc, "SendOnly", NULL, message, 0,
+		cnc, "SendAndSaveCopy", fid, message, 0,
 		from, NULL, NULL, cancellable, error);
+
+	e_ews_folder_id_free (fid);
 	g_object_unref (cnc);
 
 exit:
diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 6098725..487e971 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -3108,6 +3108,32 @@ e_ews_connection_sync_folder_items_sync (EEwsConnection *cnc,
 }
 
 static void
+ews_append_folder_id_to_msg (ESoapMessage *msg,
+                             const gchar *email,
+                             const EwsFolderId *fid)
+{
+	g_return_if_fail (msg != NULL);
+	g_return_if_fail (fid != NULL);
+
+	if (fid->is_distinguished_id)
+		e_soap_message_start_element (msg, "DistinguishedFolderId", NULL, NULL);
+	else
+		e_soap_message_start_element (msg, "FolderId", NULL, NULL);
+
+	e_soap_message_add_attribute (msg, "Id", fid->id, NULL, NULL);
+	if (fid->change_key)
+		e_soap_message_add_attribute (msg, "ChangeKey", fid->change_key, NULL, NULL);
+
+	if (fid->is_distinguished_id && email) {
+		e_soap_message_start_element (msg, "Mailbox", NULL, NULL);
+		e_ews_message_write_string_parameter (msg, "EmailAddress", NULL, email);
+		e_soap_message_end_element (msg);
+	}
+
+	e_soap_message_end_element (msg);
+}
+
+static void
 ews_append_folder_ids_to_msg (ESoapMessage *msg,
                               const gchar *email,
                               GSList *folder_ids)
@@ -3115,24 +3141,9 @@ ews_append_folder_ids_to_msg (ESoapMessage *msg,
 	GSList *l;
 
 	for (l = folder_ids; l != NULL; l = g_slist_next (l)) {
-		EwsFolderId *fid = (EwsFolderId *) l->data;
+		const EwsFolderId *fid = l->data;
 
-		if (fid->is_distinguished_id)
-			e_soap_message_start_element (msg, "DistinguishedFolderId", NULL, NULL);
-		else
-			e_soap_message_start_element (msg, "FolderId", NULL, NULL);
-
-		e_soap_message_add_attribute (msg, "Id", fid->id, NULL, NULL);
-		if (fid->change_key)
-			e_soap_message_add_attribute (msg, "ChangeKey", fid->change_key, NULL, NULL);
-
-		if (fid->is_distinguished_id && email) {
-			e_soap_message_start_element (msg, "Mailbox", NULL, NULL);
-			e_ews_message_write_string_parameter (msg, "EmailAddress", NULL, email);
-			e_soap_message_end_element (msg);
-		}
-
-		e_soap_message_end_element (msg);
+		ews_append_folder_id_to_msg (msg, email, fid);
 	}
 }
 
@@ -3987,7 +3998,7 @@ e_ews_connection_create_items (EEwsConnection *cnc,
                                gint pri,
                                const gchar *msg_disposition,
                                const gchar *send_invites,
-                               const gchar *folder_id,
+                               const EwsFolderId *fid,
                                EEwsRequestCreationCallback create_cb,
                                gpointer create_user_data,
                                GCancellable *cancellable,
@@ -4013,11 +4024,9 @@ e_ews_connection_create_items (EEwsConnection *cnc,
 			msg, "SendMeetingInvitations",
 			send_invites, NULL, NULL);
 
-	if (folder_id) {
+	if (fid) {
 		e_soap_message_start_element (msg, "SavedItemFolderId", "messages", NULL);
-		e_ews_message_write_string_parameter_with_attribute (
-			msg, "FolderId",
-			NULL, NULL, "Id", folder_id);
+		ews_append_folder_id_to_msg (msg, cnc->priv->email, fid);
 		e_soap_message_end_element (msg);
 	}
 
@@ -4090,7 +4099,7 @@ e_ews_connection_create_items_sync (EEwsConnection *cnc,
                                     gint pri,
                                     const gchar *msg_disposition,
                                     const gchar *send_invites,
-                                    const gchar *folder_id,
+                                    const EwsFolderId *fid,
                                     EEwsRequestCreationCallback create_cb,
                                     gpointer create_user_data,
                                     GSList **ids,
@@ -4107,7 +4116,7 @@ e_ews_connection_create_items_sync (EEwsConnection *cnc,
 
 	e_ews_connection_create_items (
 		cnc, pri, msg_disposition,
-		send_invites, folder_id,
+		send_invites, fid,
 		create_cb, create_user_data,
 		cancellable,
 		e_async_closure_callback, closure);
@@ -6908,7 +6917,6 @@ e_ews_connection_get_folder_permissions (EEwsConnection *cnc,
 	ESoapMessage *msg;
 	GSimpleAsyncResult *simple;
 	EwsAsyncData *async_data;
-	GSList *folder_ids;
 
 	g_return_if_fail (cnc != NULL);
 	g_return_if_fail (folder_id != NULL);
@@ -6924,11 +6932,9 @@ e_ews_connection_get_folder_permissions (EEwsConnection *cnc,
 	e_soap_message_end_element (msg); /* AdditionalProperties */
 	e_soap_message_end_element (msg); /* FolderShape */
 
-	folder_ids = g_slist_append (NULL, folder_id);
 	e_soap_message_start_element (msg, "FolderIds", "messages", NULL);
-	ews_append_folder_ids_to_msg (msg, cnc->priv->email, folder_ids);
+	ews_append_folder_id_to_msg (msg, cnc->priv->email, folder_id);
 	e_soap_message_end_element (msg);
-	g_slist_free (folder_ids);
 
 	e_ews_message_write_footer (msg);
 
@@ -7416,7 +7422,6 @@ e_ews_connection_get_folder_info (EEwsConnection *cnc,
 	ESoapMessage *msg;
 	GSimpleAsyncResult *simple;
 	EwsAsyncData *async_data;
-	GSList *folder_ids;
 
 	g_return_if_fail (cnc != NULL);
 	g_return_if_fail (folder_id != NULL);
@@ -7431,11 +7436,9 @@ e_ews_connection_get_folder_info (EEwsConnection *cnc,
 	e_soap_message_end_element (msg); /* AdditionalProperties */
 	e_soap_message_end_element (msg); /* FolderShape */
 
-	folder_ids = g_slist_append (NULL, (gpointer) folder_id);
 	e_soap_message_start_element (msg, "FolderIds", "messages", NULL);
-	ews_append_folder_ids_to_msg (msg, mail_id, folder_ids);
+	ews_append_folder_id_to_msg (msg, mail_id, folder_id);
 	e_soap_message_end_element (msg);
-	g_slist_free (folder_ids);
 
 	e_ews_message_write_footer (msg);
 
diff --git a/src/server/e-ews-connection.h b/src/server/e-ews-connection.h
index 8741b5b..cf273ad 100644
--- a/src/server/e-ews-connection.h
+++ b/src/server/e-ews-connection.h
@@ -418,7 +418,7 @@ void		e_ews_connection_create_items	(EEwsConnection *cnc,
 						 gint pri,
 						 const gchar *msg_disposition,
 						 const gchar *send_invites,
-						 const gchar *folder_id,
+						 const EwsFolderId *fid,
 						 EEwsRequestCreationCallback create_cb,
 						 gpointer create_user_data,
 						 GCancellable *cancellable,
@@ -434,7 +434,7 @@ gboolean	e_ews_connection_create_items_sync
 						 gint pri,
 						 const gchar *msg_disposition,
 						 const gchar *send_invites,
-						 const gchar *folder_id,
+						 const EwsFolderId *fid,
 						 EEwsRequestCreationCallback create_cb,
 						 gpointer create_user_data,
 						 GSList **ids,
diff --git a/src/server/tests/test-cuditem.c b/src/server/tests/test-cuditem.c
index 3c66d2f..6eec07f 100644
--- a/src/server/tests/test-cuditem.c
+++ b/src/server/tests/test-cuditem.c
@@ -107,6 +107,7 @@ op_test_create_item ()
 	const gchar *uri;
 	const gchar *folderid;
 	EEwsConnection *cnc;
+	EwsFolderId *fid;
 	GCancellable *cancellable;
 	CamelEwsSettings *settings;
 
@@ -127,13 +128,17 @@ op_test_create_item ()
 	g_object_unref (settings);
 
 	/* to check how to change to real data */
-	folderid = "AQASAG1hbmR5Lnd1QGludGVsLmNvbQAuAAADnUl3sZrICU6Xd1qXV+rpVwEAJvRPgQpR30KhJ7wqBr4YXgAAAY6W+gAAAA==";
+	fid = e_ews_folder_id_new (
+		"AQASAG1hbmR5Lnd1QGludGVsLmNvbQAuAAADnUl3sZrICU6Xd1qXV+rpVwEAJvRPgQpR30KhJ7wqBr4YXgAAAY6W+gAAAA==",
+		NULL, FALSE);
 
 	e_ews_connection_create_items (
 		cnc, EWS_PRIORITY_MEDIUM,
-		NULL, "SendToAllAndSaveCopy", folderid,
+		NULL, "SendToAllAndSaveCopy", fid,
 		op_test_create_item_get_soap_msg, NULL,
 		cancellable, create_item_ready_callback, NULL);
+
+	e_ews_folder_id_free (fid);
 }
 
 static gboolean
diff --git a/src/utils/ews-camel-common.c b/src/utils/ews-camel-common.c
index 64bd411..54edaba 100644
--- a/src/utils/ews-camel-common.c
+++ b/src/utils/ews-camel-common.c
@@ -113,7 +113,7 @@ create_mime_message_cb (ESoapMessage *msg,
 gboolean
 camel_ews_utils_create_mime_message (EEwsConnection *cnc,
                                      const gchar *disposition,
-                                     const gchar *save_folder,
+                                     const EwsFolderId *fid,
                                      CamelMimeMessage *message,
                                      gint32 message_camel_flags,
                                      CamelAddress *from,
@@ -135,7 +135,8 @@ camel_ews_utils_create_mime_message (EEwsConnection *cnc,
 	create_data->message_camel_flags = message_camel_flags;
 	create_data->from = from;
 
-	if (g_strcmp0 (disposition, "SendOnly") == 0) {
+	if (g_strcmp0 (disposition, "SendOnly") == 0 ||
+	    g_strcmp0 (disposition, "SendAndSaveCopy") == 0) {
 		struct _camel_header_raw *header;
 
 		for (header = CAMEL_MIME_PART (message)->headers; header; header = header->next) {
@@ -149,7 +150,7 @@ camel_ews_utils_create_mime_message (EEwsConnection *cnc,
 
 	res = e_ews_connection_create_items_sync (
 		cnc, EWS_PRIORITY_MEDIUM,
-		disposition, NULL, save_folder,
+		disposition, NULL, fid,
 		create_mime_message_cb, create_data,
 		&ids, cancellable, error);
 
diff --git a/src/utils/ews-camel-common.h b/src/utils/ews-camel-common.h
index f292aa6..30e594a 100644
--- a/src/utils/ews-camel-common.h
+++ b/src/utils/ews-camel-common.h
@@ -23,15 +23,21 @@
 #include <camel/camel.h>
 
 #include "server/e-ews-connection.h"
+#include "server/e-ews-folder.h"
 
 G_BEGIN_DECLS
 
 gboolean
-camel_ews_utils_create_mime_message (EEwsConnection *cnc, const gchar *disposition,
-				     const gchar *save_folder, CamelMimeMessage *message,
-				     gint32 message_camel_flags, CamelAddress *from,
-				     gchar **itemid, gchar **changekey,
-				     GCancellable *cancellable, GError **error);
+camel_ews_utils_create_mime_message (EEwsConnection *cnc,
+				     const gchar *disposition,
+				     const EwsFolderId *fid,
+				     CamelMimeMessage *message,
+				     gint32 message_camel_flags,
+				     CamelAddress *from,
+				     gchar **itemid,
+				     gchar **changekey,
+				     GCancellable *cancellable,
+				     GError **error);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]