[evolution-ews] Bug 746395 - Let the provider store sent messages on its own
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews] Bug 746395 - Let the provider store sent messages on its own
- Date: Wed, 1 Apr 2015 15:37:07 +0000 (UTC)
commit 4c6ef878003bc2c7f6e25c0a1e7556cb9952265c
Author: Milan Crha <mcrha redhat com>
Date: Wed Apr 1 17:36:53 2015 +0200
Bug 746395 - Let the provider store sent messages on its own
src/camel/camel-ews-transport.c | 97 ++++++++++++++++++++++++++++++++++++++-
1 files changed, 96 insertions(+), 1 deletions(-)
---
diff --git a/src/camel/camel-ews-transport.c b/src/camel/camel-ews-transport.c
index 7acc19c..e37b2f2 100644
--- a/src/camel/camel-ews-transport.c
+++ b/src/camel/camel-ews-transport.c
@@ -30,6 +30,8 @@
#include <glib/gi18n-lib.h>
+#include <libemail-engine/libemail-engine.h>
+
#include "server/camel-ews-settings.h"
#include "utils/ews-camel-common.h"
@@ -43,6 +45,91 @@
G_DEFINE_TYPE (CamelEwsTransport, camel_ews_transport, CAMEL_TYPE_TRANSPORT)
static gboolean
+ews_transport_sent_folder_is_server_side (CamelService *service,
+ EwsFolderId **folder_id,
+ GCancellable *cancellable)
+{
+ CamelSession *session;
+ ESourceRegistry *registry;
+ ESource *sibling, *source = NULL;
+ gboolean is_server_side = FALSE;
+
+ g_return_val_if_fail (CAMEL_IS_EWS_TRANSPORT (service), FALSE);
+ g_return_val_if_fail (folder_id != NULL, FALSE);
+
+ session = camel_service_ref_session (service);
+ if (session && E_IS_MAIL_SESSION (session))
+ registry = g_object_ref (e_mail_session_get_registry (E_MAIL_SESSION (session)));
+ else
+ registry = e_source_registry_new_sync (cancellable, NULL);
+
+ if (!registry) {
+ g_clear_object (&session);
+ return FALSE;
+ }
+
+ sibling = e_source_registry_ref_source (registry, camel_service_get_uid (service));
+ 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;
+ CamelStore *store = NULL;
+ gchar *folder_name = NULL;
+
+ subm_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_MAIL_SUBMISSION);
+
+ if (e_source_mail_submission_get_sent_folder (subm_extension) &&
+ e_mail_folder_uri_parse (session,
+ e_source_mail_submission_get_sent_folder (subm_extension),
+ &store, &folder_name, NULL) & CAMEL_IS_EWS_STORE (store)) {
+ CamelEwsStore *ews_store = CAMEL_EWS_STORE (store);
+ gchar *folder_id_str;
+
+ folder_id_str = camel_ews_store_summary_get_folder_id_from_name (
+ ews_store->summary, folder_name);
+ if (folder_id_str) {
+ gchar *change_key;
+
+ change_key = camel_ews_store_summary_get_change_key
(ews_store->summary, folder_name, NULL);
+ *folder_id = e_ews_folder_id_new (folder_id_str, change_key, FALSE);
+ g_free (change_key);
+
+ is_server_side = *folder_id != NULL;
+ }
+
+ g_free (folder_id_str);
+ }
+
+ g_clear_object (&store);
+ g_free (folder_name);
+ }
+
+ g_list_free_full (sources, g_object_unref);
+ g_object_unref (sibling);
+ }
+
+ g_object_unref (registry);
+ g_clear_object (&session);
+
+ return is_server_side;
+}
+
+static gboolean
ews_transport_connect_sync (CamelService *service,
GCancellable *cancellable,
GError **error)
@@ -81,6 +168,7 @@ ews_send_to_sync (CamelTransport *transport,
CamelMimeMessage *message,
CamelAddress *from,
CamelAddress *recipients,
+ gboolean *out_sent_message_saved,
GCancellable *cancellable,
GError **error)
{
@@ -90,6 +178,7 @@ ews_send_to_sync (CamelTransport *transport,
CamelSettings *settings;
CamelService *service;
EEwsConnection *cnc;
+ EwsFolderId *folder_id = NULL;
gchar *ews_email;
gchar *host_url;
gchar *user;
@@ -163,11 +252,17 @@ ews_send_to_sync (CamelTransport *transport,
goto exit;
}
+ if (ews_transport_sent_folder_is_server_side (service, &folder_id, cancellable)) {
+ if (out_sent_message_saved)
+ *out_sent_message_saved = TRUE;
+ }
+
success = camel_ews_utils_create_mime_message (
- cnc, "SendOnly", NULL, message, NULL,
+ cnc, folder_id ? "SendAndSaveCopy" : "SendOnly", folder_id, message, NULL,
from, recipients, NULL, NULL, cancellable, error);
g_object_unref (cnc);
+ e_ews_folder_id_free (folder_id);
exit:
g_free (ews_email);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]