/*
* module-outlook-backend.c
*
* This library 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.
*
* This library 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 this library. If not, see .
*
*/
/* XXX E-D-S currently only supports email access to Outlook.com accounts.
* This is not unlike 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 "evolution-data-server-config.h"
#include
#include
/* 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;
/* Chain up to parent's child_added() method. */
E_COLLECTION_BACKEND_CLASS (e_outlook_backend_parent_class)->
child_added (backend, child_source);
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);
}
}
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)
{
}