[evolution-data-server/gnome-3-10] Bug 709561 - Pick up Windows Live mail from GOA
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-3-10] Bug 709561 - Pick up Windows Live mail from GOA
- Date: Tue, 8 Oct 2013 17:01:38 +0000 (UTC)
commit 496e2b2cc13c09d98095c39bb42bdc1bc917c3fe
Author: Matthew Barnes <mbarnes redhat com>
Date: Mon Oct 7 22:10:22 2013 -0400
Bug 709561 - Pick up Windows Live mail from GOA
This adds an "outlook-backend" module, similar to the "google-backend"
and "yahoo-backend" modules.
Outlook.com recently added IMAP support, and GNOME Online Accounts now
exports a "Mail" interface on its "Windows Live" accounts. This module
configures an E-D-S IMAP/SMTP account bound to the GOA account.
(cherry picked from commit 95e2de8921230cb677c1adf3e13eb08e9c58acdb)
configure.ac | 1 +
modules/Makefile.am | 1 +
.../module-gnome-online-accounts.c | 9 +-
modules/outlook-backend/Makefile.am | 29 ++
modules/outlook-backend/module-outlook-backend.c | 290 ++++++++++++++++++++
5 files changed, 327 insertions(+), 3 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 69878c4..797c023 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1722,6 +1722,7 @@ modules/Makefile
modules/cache-reaper/Makefile
modules/gnome-online-accounts/Makefile
modules/google-backend/Makefile
+modules/outlook-backend/Makefile
modules/owncloud-backend/Makefile
modules/ubuntu-online-accounts/Makefile
modules/ubuntu-online-accounts/calendar.service-type.in
diff --git a/modules/Makefile.am b/modules/Makefile.am
index 19d96b2..f3a719f 100644
--- a/modules/Makefile.am
+++ b/modules/Makefile.am
@@ -15,6 +15,7 @@ endif
SUBDIRS = \
cache-reaper \
google-backend \
+ outlook-backend \
owncloud-backend \
yahoo-backend \
$(TRUST_PROMPT_DIR) \
diff --git a/modules/gnome-online-accounts/module-gnome-online-accounts.c
b/modules/gnome-online-accounts/module-gnome-online-accounts.c
index 3058d2e..d5d1a26 100644
--- a/modules/gnome-online-accounts/module-gnome-online-accounts.c
+++ b/modules/gnome-online-accounts/module-gnome-online-accounts.c
@@ -100,12 +100,15 @@ gnome_online_accounts_get_backend_name (const gchar *goa_provider_type)
if (g_str_equal (goa_provider_type, "imap_smtp"))
eds_backend_name = "none";
- if (g_str_equal (goa_provider_type, "yahoo"))
- eds_backend_name = "yahoo";
-
if (g_str_equal (goa_provider_type, "owncloud"))
eds_backend_name = "owncloud";
+ if (g_str_equal (goa_provider_type, "windows_live"))
+ eds_backend_name = "outlook";
+
+ if (g_str_equal (goa_provider_type, "yahoo"))
+ eds_backend_name = "yahoo";
+
return eds_backend_name;
}
diff --git a/modules/outlook-backend/Makefile.am b/modules/outlook-backend/Makefile.am
new file mode 100644
index 0000000..21452d9
--- /dev/null
+++ b/modules/outlook-backend/Makefile.am
@@ -0,0 +1,29 @@
+NULL =
+
+module_LTLIBRARIES = module-outlook-backend.la
+
+module_outlook_backend_la_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_srcdir) \
+ -DG_LOG_DOMAIN=\"module-outlook-backend\" \
+ $(E_BACKEND_CFLAGS) \
+ $(E_DATA_SERVER_CFLAGS) \
+ $(NULL)
+
+module_outlook_backend_la_SOURCES = \
+ module-outlook-backend.c \
+ $(NULL)
+
+module_outlook_backend_la_LIBADD = \
+ $(top_builddir)/libebackend/libebackend-1.2.la \
+ $(top_builddir)/libedataserver/libedataserver-1.2.la \
+ $(top_builddir)/camel/libcamel-1.2.la \
+ $(E_BACKEND_LIBS) \
+ $(E_DATA_SERVER_LIBS) \
+ $(NULL)
+
+module_outlook_backend_la_LDFLAGS = \
+ -module -avoid-version $(NO_UNDEFINED) \
+ $(NULL)
+
+-include $(top_srcdir)/git.mk
diff --git a/modules/outlook-backend/module-outlook-backend.c
b/modules/outlook-backend/module-outlook-backend.c
new file mode 100644
index 0000000..9cb1156
--- /dev/null
+++ b/modules/outlook-backend/module-outlook-backend.c
@@ -0,0 +1,290 @@
+/*
+ * module-outlook-backend.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+/* XXX E-D-S currently only supports email access to Outlook.com accounts.
+ * This is not unlike the the built-in collection backend written for
+ * GOA's "IMAP/SMTP" accounts, but I wrote an "outlook" module anyway
+ * as a placeholder with hopes that Microsoft will eventually provide
+ * access to calendar+contacts via CalDAV/CardDAV or even EWS. */
+
+#include <config.h>
+#include <glib/gi18n-lib.h>
+
+#include <libebackend/libebackend.h>
+
+/* Standard GObject macros */
+#define E_TYPE_OUTLOOK_BACKEND \
+ (e_outlook_backend_get_type ())
+#define E_OUTLOOK_BACKEND(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_OUTLOOK_BACKEND, EOutlookBackend))
+
+/* Just for readability... */
+#define METHOD(x) (CAMEL_NETWORK_SECURITY_METHOD_##x)
+
+/* IMAP Configuration Details */
+#define OUTLOOK_IMAP_BACKEND_NAME "imapx"
+#define OUTLOOK_IMAP_HOST "imap-mail.outlook.com"
+#define OUTLOOK_IMAP_PORT 993
+#define OUTLOOK_IMAP_SECURITY_METHOD METHOD (SSL_ON_ALTERNATE_PORT)
+
+/* SMTP Configuration Details */
+#define OUTLOOK_SMTP_BACKEND_NAME "smtp"
+#define OUTLOOK_SMTP_HOST "smtp-mail.outlook.com"
+#define OUTLOOK_SMTP_PORT 587
+#define OUTLOOK_SMTP_SECURITY_METHOD METHOD (STARTTLS_ON_STANDARD_PORT)
+
+typedef struct _EOutlookBackend EOutlookBackend;
+typedef struct _EOutlookBackendClass EOutlookBackendClass;
+
+typedef struct _EOutlookBackendFactory EOutlookBackendFactory;
+typedef struct _EOutlookBackendFactoryClass EOutlookBackendFactoryClass;
+
+struct _EOutlookBackend {
+ ECollectionBackend parent;
+};
+
+struct _EOutlookBackendClass {
+ ECollectionBackendClass parent_class;
+};
+
+struct _EOutlookBackendFactory {
+ ECollectionBackendFactory parent;
+};
+
+struct _EOutlookBackendFactoryClass {
+ ECollectionBackendFactoryClass parent_class;
+};
+
+/* Module Entry Points */
+void e_module_load (GTypeModule *type_module);
+void e_module_unload (GTypeModule *type_module);
+
+/* Forward Declarations */
+GType e_outlook_backend_get_type (void);
+GType e_outlook_backend_factory_get_type (void);
+
+G_DEFINE_DYNAMIC_TYPE (
+ EOutlookBackend,
+ e_outlook_backend,
+ E_TYPE_COLLECTION_BACKEND)
+
+G_DEFINE_DYNAMIC_TYPE (
+ EOutlookBackendFactory,
+ e_outlook_backend_factory,
+ E_TYPE_COLLECTION_BACKEND_FACTORY)
+
+static void
+outlook_backend_child_added (ECollectionBackend *backend,
+ ESource *child_source)
+{
+ ESource *collection_source;
+ const gchar *extension_name;
+ gboolean is_mail = FALSE;
+
+ collection_source = e_backend_get_source (E_BACKEND (backend));
+
+ extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT;
+ is_mail |= e_source_has_extension (child_source, extension_name);
+
+ extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
+ is_mail |= e_source_has_extension (child_source, extension_name);
+
+ extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT;
+ is_mail |= e_source_has_extension (child_source, extension_name);
+
+ /* Synchronize mail-related user with the collection identity. */
+ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
+ if (is_mail && e_source_has_extension (child_source, extension_name)) {
+ ESourceAuthentication *auth_child_extension;
+ ESourceCollection *collection_extension;
+ const gchar *collection_identity;
+ const gchar *auth_child_user;
+
+ extension_name = E_SOURCE_EXTENSION_COLLECTION;
+ collection_extension = e_source_get_extension (
+ collection_source, extension_name);
+ collection_identity = e_source_collection_get_identity (
+ collection_extension);
+
+ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
+ auth_child_extension = e_source_get_extension (
+ child_source, extension_name);
+ auth_child_user = e_source_authentication_get_user (
+ auth_child_extension);
+
+ /* XXX Do not override an existing user name setting.
+ * The IMAP or (especially) SMTP configuration may
+ * have been modified to use a non-Outlook server. */
+ if (auth_child_user == NULL)
+ e_source_authentication_set_user (
+ auth_child_extension,
+ collection_identity);
+ }
+
+ /* Chain up to parent's child_added() method. */
+ E_COLLECTION_BACKEND_CLASS (e_outlook_backend_parent_class)->
+ child_added (backend, child_source);
+}
+
+static void
+e_outlook_backend_class_init (EOutlookBackendClass *class)
+{
+ ECollectionBackendClass *backend_class;
+
+ backend_class = E_COLLECTION_BACKEND_CLASS (class);
+ backend_class->child_added = outlook_backend_child_added;
+}
+
+static void
+e_outlook_backend_class_finalize (EOutlookBackendClass *class)
+{
+}
+
+static void
+e_outlook_backend_init (EOutlookBackend *backend)
+{
+}
+
+static void
+outlook_backend_prepare_mail_account_source (ESource *source)
+{
+ ESourceCamel *camel_extension;
+ ESourceExtension *extension;
+ CamelSettings *settings;
+ const gchar *backend_name;
+ const gchar *extension_name;
+
+ backend_name = OUTLOOK_IMAP_BACKEND_NAME;
+
+ extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT;
+ extension = e_source_get_extension (source, extension_name);
+
+ e_source_backend_set_backend_name (
+ E_SOURCE_BACKEND (extension), backend_name);
+
+ extension_name = e_source_camel_get_extension_name (backend_name);
+ camel_extension = e_source_get_extension (source, extension_name);
+ settings = e_source_camel_get_settings (camel_extension);
+
+ /* The "auth-mechanism" should be determined elsewhere. */
+
+ camel_network_settings_set_host (
+ CAMEL_NETWORK_SETTINGS (settings),
+ OUTLOOK_IMAP_HOST);
+
+ camel_network_settings_set_port (
+ CAMEL_NETWORK_SETTINGS (settings),
+ OUTLOOK_IMAP_PORT);
+
+ camel_network_settings_set_security_method (
+ CAMEL_NETWORK_SETTINGS (settings),
+ OUTLOOK_IMAP_SECURITY_METHOD);
+}
+
+static void
+outlook_backend_prepare_mail_transport_source (ESource *source)
+{
+ ESourceCamel *camel_extension;
+ ESourceExtension *extension;
+ CamelSettings *settings;
+ const gchar *backend_name;
+ const gchar *extension_name;
+
+ backend_name = OUTLOOK_SMTP_BACKEND_NAME;
+
+ extension_name = E_SOURCE_EXTENSION_MAIL_TRANSPORT;
+ extension = e_source_get_extension (source, extension_name);
+
+ e_source_backend_set_backend_name (
+ E_SOURCE_BACKEND (extension), backend_name);
+
+ extension_name = e_source_camel_get_extension_name (backend_name);
+ camel_extension = e_source_get_extension (source, extension_name);
+ settings = e_source_camel_get_settings (camel_extension);
+
+ /* The "auth-mechanism" should be determined elsewhere. */
+
+ camel_network_settings_set_host (
+ CAMEL_NETWORK_SETTINGS (settings),
+ OUTLOOK_SMTP_HOST);
+
+ camel_network_settings_set_port (
+ CAMEL_NETWORK_SETTINGS (settings),
+ OUTLOOK_SMTP_PORT);
+
+ camel_network_settings_set_security_method (
+ CAMEL_NETWORK_SETTINGS (settings),
+ OUTLOOK_SMTP_SECURITY_METHOD);
+}
+
+static void
+outlook_backend_factory_prepare_mail (ECollectionBackendFactory *factory,
+ ESource *mail_account_source,
+ ESource *mail_identity_source,
+ ESource *mail_transport_source)
+{
+ ECollectionBackendFactoryClass *parent_class;
+
+ /* Chain up to parent's prepare_mail() method. */
+ parent_class =
+ E_COLLECTION_BACKEND_FACTORY_CLASS (
+ e_outlook_backend_factory_parent_class);
+ parent_class->prepare_mail (
+ factory,
+ mail_account_source,
+ mail_identity_source,
+ mail_transport_source);
+
+ outlook_backend_prepare_mail_account_source (mail_account_source);
+ outlook_backend_prepare_mail_transport_source (mail_transport_source);
+}
+
+static void
+e_outlook_backend_factory_class_init (EOutlookBackendFactoryClass *class)
+{
+ ECollectionBackendFactoryClass *factory_class;
+
+ factory_class = E_COLLECTION_BACKEND_FACTORY_CLASS (class);
+ factory_class->factory_name = "outlook";
+ factory_class->backend_type = E_TYPE_OUTLOOK_BACKEND;
+ factory_class->prepare_mail = outlook_backend_factory_prepare_mail;
+}
+
+static void
+e_outlook_backend_factory_class_finalize (EOutlookBackendFactoryClass *class)
+{
+}
+
+static void
+e_outlook_backend_factory_init (EOutlookBackendFactory *factory)
+{
+}
+
+G_MODULE_EXPORT void
+e_module_load (GTypeModule *type_module)
+{
+ e_outlook_backend_register_type (type_module);
+ e_outlook_backend_factory_register_type (type_module);
+}
+
+G_MODULE_EXPORT void
+e_module_unload (GTypeModule *type_module)
+{
+}
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]