[evolution-ews/gnome-3-6] Bug #687874 - Be able to select Sent folder again
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews/gnome-3-6] Bug #687874 - Be able to select Sent folder again
- Date: Tue, 27 Nov 2012 18:28:57 +0000 (UTC)
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]