[evolution-ews/gnome-3-6] Bug #687874 - Be able to select Sent folder again



commit e0580963d6e5b47f59e871057e369ac5f641a617
Author: Milan Crha <mcrha redhat com>
Date:   Tue Nov 27 19:27:21 2012 +0100

    Bug #687874 - Be able to select Sent folder again
    
    This partly reverts patch for bug #655774, and does the things differently,
    by setting server side Sent Items and Drafts as default folders for these,
    the first time the account connects to the server.

 src/camel/Makefile.am           |    2 +
 src/camel/camel-ews-provider.c  |    2 +-
 src/camel/camel-ews-store.c     |  123 ++++++++++++++++++++++++++++++++++++++-
 src/camel/camel-ews-transport.c |    6 +--
 src/server/camel-ews-settings.c |   71 ++++++++++++++++++++++
 src/server/camel-ews-settings.h |    5 ++
 6 files changed, 201 insertions(+), 8 deletions(-)
---
diff --git a/src/camel/Makefile.am b/src/camel/Makefile.am
index d842fa0..d9a6616 100644
--- a/src/camel/Makefile.am
+++ b/src/camel/Makefile.am
@@ -12,6 +12,7 @@ libcamelews_la_CPPFLAGS = \
 	$(LIBEDATASERVER_CFLAGS) \
 	$(LIBECAL_CFLAGS) \
 	$(EVOLUTION_PLUGIN_CFLAGS) \
+	$(LIBEMAIL_ENGINE_CFLAGS) \
 	$(GNOME_INCLUDEDIR) \
 	$(SOUP_CFLAGS) \
 	$(LIBEBACKEND_CFLAGS) \
@@ -46,6 +47,7 @@ libcamelews_la_LIBADD = \
 	$(top_builddir)/src/utils/libewsutils.la  \
 	$(CAMEL_LIBS) \
 	$(EVOLUTION_PLUGIN_LIBS) \
+	$(LIBEMAIL_ENGINE_LIBS) \
 	$(LIBEDATASERVER_LIBS) \
 	$(LIBEBACKEND_LIBS) \
 	$(LIBECAL_LIBS) \
diff --git a/src/camel/camel-ews-provider.c b/src/camel/camel-ews-provider.c
index 8e131af..3fcaa68 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_DISABLE_SENT_FOLDER,
+	CAMEL_PROVIDER_IS_STORAGE | CAMEL_PROVIDER_IS_EXTERNAL,
 
 	CAMEL_URL_ALLOW_USER | CAMEL_URL_ALLOW_AUTH | CAMEL_URL_HIDDEN_HOST,
 
diff --git a/src/camel/camel-ews-store.c b/src/camel/camel-ews-store.c
index 9d01c92..655b100 100644
--- a/src/camel/camel-ews-store.c
+++ b/src/camel/camel-ews-store.c
@@ -36,6 +36,8 @@
 #include <glib/gi18n-lib.h>
 #include <glib/gstdio.h>
 
+#include <libemail-engine/e-mail-folder-utils.h>
+
 #include "server/camel-ews-settings.h"
 #include "server/e-ews-item-change.h"
 #include "server/e-ews-message.h"
@@ -491,6 +493,116 @@ ews_store_set_flags (CamelEwsStore *ews_store,
 	}
 }
 
+static void
+ews_store_update_source_extension_folder (CamelEwsStore *ews_store,
+					  const gchar *folder_id,
+					  gpointer extension,
+					  const gchar *extension_property)
+{
+	gchar *fullname;
+
+	g_return_if_fail (CAMEL_IS_EWS_STORE (ews_store));
+	g_return_if_fail (extension != NULL);
+	g_return_if_fail (extension_property != NULL);
+
+	if (!folder_id)
+		return;
+
+	fullname = camel_ews_store_summary_get_folder_full_name (ews_store->summary, folder_id, NULL);
+	if (fullname) {
+		gchar *folder_uri;
+
+		folder_uri = e_mail_folder_uri_build (CAMEL_STORE (ews_store), fullname);
+		g_object_set (extension, extension_property, folder_uri, NULL);
+		g_free (folder_uri);
+		g_free (fullname);
+	}
+}
+
+static void
+ews_store_maybe_update_sent_and_drafts (CamelEwsStore *ews_store,
+					/* const */ GSList *ews_folders)
+{
+	ESourceRegistry *registry;
+	ESource *sibling, *source = NULL;
+
+	g_return_if_fail (CAMEL_IS_EWS_STORE (ews_store));
+
+	registry = e_source_registry_new_sync (NULL, NULL);
+	g_return_if_fail (registry != NULL);
+
+	sibling = e_source_registry_ref_source (registry, camel_service_get_uid (CAMEL_SERVICE (ews_store)));
+	if (sibling) {
+		GList *sources, *siter;
+
+		sources = e_source_registry_list_sources (registry, E_SOURCE_EXTENSION_MAIL_SUBMISSION);
+		for (siter = sources; siter; siter = siter->next) {
+			source = siter->data;
+
+			if (!source || g_strcmp0 (e_source_get_parent (source), e_source_get_parent (sibling)) != 0 ||
+			    !e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION) ||
+			    !e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_COMPOSITION))
+				source = NULL;
+			else
+				break;
+		}
+
+		if (source &&
+		    e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION) &&
+		    e_source_has_extension (source, E_SOURCE_EXTENSION_MAIL_COMPOSITION)) {
+			ESourceMailSubmission *subm_extension;
+			ESourceMailComposition *coms_extension;
+			gboolean changed = FALSE;
+
+			subm_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION);
+			coms_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_COMPOSITION);
+
+			if (e_source_mail_submission_get_sent_folder (subm_extension) &&
+			    g_ascii_strcasecmp (e_source_mail_submission_get_sent_folder (subm_extension), "folder://local/Sent") == 0) {
+				gchar *folder_id;
+
+				folder_id = camel_ews_store_summary_get_folder_id_from_folder_type (ews_store->summary, CAMEL_FOLDER_TYPE_SENT);
+				if (folder_id) {
+					changed = TRUE;
+					ews_store_update_source_extension_folder (ews_store, folder_id, subm_extension, "sent-folder");
+					g_free (folder_id);
+				}
+			}
+
+			if (e_source_mail_composition_get_drafts_folder (coms_extension) &&
+			    g_ascii_strcasecmp (e_source_mail_composition_get_drafts_folder (coms_extension), "folder://local/Drafts") == 0) {
+				if (g_slist_length (ews_folders) == G_N_ELEMENTS (system_folder)) {
+					gint ii;
+					for (ii = 0; ii < G_N_ELEMENTS (system_folder); ii++) {
+						if (g_str_equal ("drafts", system_folder[ii].dist_folder_id)) {
+							break;
+						}
+					}
+
+					if (ii < G_N_ELEMENTS (system_folder)) {
+						EEwsFolder *drafts = g_slist_nth (ews_folders, ii)->data;
+						const EwsFolderId *fid = drafts ? e_ews_folder_get_id (drafts) : NULL;
+
+						if (fid && fid->id) {
+							changed = TRUE;
+							ews_store_update_source_extension_folder (ews_store, fid->id, coms_extension, "drafts-folder");
+						}
+					}
+				}
+			}
+
+			if (changed) {
+				e_source_write_sync (source, NULL, NULL);
+			}
+		}
+
+		g_list_free_full (sources, g_object_unref);
+		g_object_unref (sibling);
+	}
+
+	g_object_unref (registry);
+}
+
 static CamelAuthenticationResult
 ews_authenticate_sync (CamelService *service,
                        const gchar *mechanism,
@@ -512,7 +624,6 @@ ews_authenticate_sync (CamelService *service,
 	gchar *hosturl;
 	gchar *sync_state = NULL;
 	GError *local_error = NULL, *folder_err = NULL;
-	gint n = 0;
 
 	ews_store = CAMEL_EWS_STORE (service);
 
@@ -583,7 +694,9 @@ ews_authenticate_sync (CamelService *service,
 	}
 
 	/*get folders using distinguished id by GetFolder operation and set system flags to folders, only for first time*/
-	if (initial_setup && local_error == NULL) {
+	if (!local_error && (initial_setup || !camel_ews_settings_get_folders_initialized (ews_settings))) {
+		gint n = 0;
+
 		while (n < G_N_ELEMENTS (system_folder)) {
 			EwsFolderId *fid = NULL;
 
@@ -610,6 +723,12 @@ ews_authenticate_sync (CamelService *service,
 		} else
 			d (printf ("folders for respective distinguished ids don't exist"));
 
+		if (!camel_ews_settings_get_folders_initialized (ews_settings)) {
+			ews_store_maybe_update_sent_and_drafts (ews_store, folders);
+			if (!folder_err)
+				camel_ews_settings_set_folders_initialized (ews_settings, TRUE);
+		}
+
 		g_slist_foreach (folders, (GFunc) g_object_unref, NULL);
 		g_slist_foreach (folder_ids, (GFunc) e_ews_folder_id_free, NULL);
 		g_slist_free (folders);
diff --git a/src/camel/camel-ews-transport.c b/src/camel/camel-ews-transport.c
index 37321eb..b234225 100644
--- a/src/camel/camel-ews-transport.c
+++ b/src/camel/camel-ews-transport.c
@@ -90,7 +90,6 @@ ews_send_to_sync (CamelTransport *transport,
 	CamelSettings *settings;
 	CamelService *service;
 	EEwsConnection *cnc;
-	EwsFolderId *fid;
 	gchar *ews_email;
 	gchar *host_url;
 	gchar *user;
@@ -164,13 +163,10 @@ 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, "SendAndSaveCopy", fid, message, 0,
+		cnc, "SendOnly", NULL, message, 0,
 		from, NULL, NULL, cancellable, error);
 
-	e_ews_folder_id_free (fid);
 	g_object_unref (cnc);
 
 exit:
diff --git a/src/server/camel-ews-settings.c b/src/server/camel-ews-settings.c
index caadc14..cf0a8bc 100644
--- a/src/server/camel-ews-settings.c
+++ b/src/server/camel-ews-settings.c
@@ -30,6 +30,7 @@ struct _CamelEwsSettingsPrivate {
 	gboolean filter_junk;
 	gboolean filter_junk_inbox;
 	gboolean oab_offline;
+	gboolean folders_initialized;
 	gchar *email;
 	gchar *gal_uid;
 	gchar *hosturl;
@@ -45,6 +46,7 @@ enum {
 	PROP_EMAIL,
 	PROP_FILTER_JUNK,
 	PROP_FILTER_JUNK_INBOX,
+	PROP_FOLDERS_INITIALIZED,
 	PROP_GAL_UID,
 	PROP_HOST,
 	PROP_HOSTURL,
@@ -101,6 +103,12 @@ ews_settings_set_property (GObject *object,
 				g_value_get_boolean (value));
 			return;
 
+		case PROP_FOLDERS_INITIALIZED:
+			camel_ews_settings_set_folders_initialized (
+				CAMEL_EWS_SETTINGS (object),
+				g_value_get_boolean (value));
+			return;
+
 		case PROP_GAL_UID:
 			camel_ews_settings_set_gal_uid (
 				CAMEL_EWS_SETTINGS (object),
@@ -207,6 +215,13 @@ ews_settings_get_property (GObject *object,
 				CAMEL_EWS_SETTINGS (object)));
 			return;
 
+		case PROP_FOLDERS_INITIALIZED:
+			g_value_set_boolean (
+				value,
+				camel_ews_settings_get_folders_initialized (
+				CAMEL_EWS_SETTINGS (object)));
+			return;
+
 		case PROP_GAL_UID:
 			g_value_take_string (
 				value,
@@ -368,6 +383,18 @@ camel_ews_settings_class_init (CamelEwsSettingsClass *class)
 
 	g_object_class_install_property (
 		object_class,
+		PROP_FOLDERS_INITIALIZED,
+		g_param_spec_boolean (
+			"folders-initialized",
+			"Folders Initialized",
+			"Whether Sent Items and Drafts folders are initialized",
+			FALSE,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT |
+			G_PARAM_STATIC_STRINGS));
+
+	g_object_class_install_property (
+		object_class,
 		PROP_GAL_UID,
 		g_param_spec_string (
 			"gal-uid",
@@ -511,6 +538,50 @@ camel_ews_settings_set_check_all (CamelEwsSettings *settings,
 	g_object_notify (G_OBJECT (settings), "check-all");
 }
 
+/**
+ * camel_ews_settings_get_folders_initialized:
+ * @settings: a #CamelEwsSettings
+ *
+ * Returns whether folders had been initialized.
+ * This is used to know whether it's required to setup Drafts
+ * and Sent Items folders as folders for that purpose in Evolution.
+ *
+ * Returns: whether folders had been initialized
+ *
+ * Since: 3.6
+ **/
+gboolean
+camel_ews_settings_get_folders_initialized (CamelEwsSettings *settings)
+{
+	g_return_val_if_fail (CAMEL_IS_EWS_SETTINGS (settings), FALSE);
+
+	return settings->priv->folders_initialized;
+}
+
+/**
+ * camel_ews_settings_set_folders_initialized:
+ * @settings: a #CamelEwsSettings
+ * @folders_initialized: whether folders had been initialized
+ *
+ * Sets whether to folders had been initialized. This is for Drafts
+ * and Sent Items folders only.
+ *
+ * Since: 3.6
+ **/
+void
+camel_ews_settings_set_folders_initialized (CamelEwsSettings *settings,
+					    gboolean folders_initialized)
+{
+	g_return_if_fail (CAMEL_IS_EWS_SETTINGS (settings));
+
+	if ((settings->priv->folders_initialized ? 1 : 0) == (folders_initialized ? 1 : 0))
+		return;
+
+	settings->priv->folders_initialized = folders_initialized;
+
+	g_object_notify (G_OBJECT (settings), "folders-initialized");
+}
+
 const gchar *
 camel_ews_settings_get_email (CamelEwsSettings *settings)
 {
diff --git a/src/server/camel-ews-settings.h b/src/server/camel-ews-settings.h
index 5fe4bbd..6661f83 100644
--- a/src/server/camel-ews-settings.h
+++ b/src/server/camel-ews-settings.h
@@ -102,6 +102,11 @@ void		camel_ews_settings_set_oal_selected
 guint		camel_ews_settings_get_timeout	(CamelEwsSettings *settings);
 void		camel_ews_settings_set_timeout	(CamelEwsSettings *settings,
 						 guint timeout);
+gboolean	camel_ews_settings_get_folders_initialized
+						(CamelEwsSettings *settings);
+void		camel_ews_settings_set_folders_initialized
+						(CamelEwsSettings *settings,
+						 gboolean folders_initialized);
 G_END_DECLS
 
 #endif /* CAMEL_EWS_SETTINGS_H */



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